Multiplayer improvements and reupload score on error
- In multiplayer you will play at the bottom if you joined second - Add a dialog to song select that score has not been saved - Uploads the score when logged in again - Translate error messages from the server
This commit is contained in:
@@ -2,9 +2,19 @@ class Scoresheet{
|
||||
constructor(controller, results, multiplayer, touchEnabled){
|
||||
this.controller = controller
|
||||
this.resultsObj = results
|
||||
this.results = {}
|
||||
this.player = [multiplayer ? (p2.player === 1 ? 0 : 1) : 0]
|
||||
var player0 = this.player[0]
|
||||
this.results = []
|
||||
this.results[player0] = {}
|
||||
this.rules = []
|
||||
this.rules[player0] = this.controller.game.rules
|
||||
if(multiplayer){
|
||||
this.player.push(p2.player === 2 ? 0 : 1)
|
||||
this.results[this.player[1]] = p2.results
|
||||
this.rules[this.player[1]] = this.controller.syncWith.game.rules
|
||||
}
|
||||
for(var i in results){
|
||||
this.results[i] = results[i].toString()
|
||||
this.results[player0][i] = results[i] === null ? null : results[i].toString()
|
||||
}
|
||||
this.multiplayer = multiplayer
|
||||
this.touchEnabled = touchEnabled
|
||||
@@ -248,7 +258,7 @@ class Scoresheet{
|
||||
var frameTop = winH / 2 - 720 / 2
|
||||
var frameLeft = winW / 2 - 1280 / 2
|
||||
|
||||
var players = this.multiplayer && p2.results ? 2 : 1
|
||||
var players = this.multiplayer ? 2 : 1
|
||||
var p2Offset = 298
|
||||
|
||||
var bgOffset = 0
|
||||
@@ -331,28 +341,21 @@ class Scoresheet{
|
||||
}
|
||||
|
||||
var rules = this.controller.game.rules
|
||||
var gaugePercent = rules.gaugePercent(this.results.gauge)
|
||||
var gaugeClear = [rules.gaugeClear]
|
||||
if(players === 2){
|
||||
gaugeClear.push(this.controller.syncWith.game.rules.gaugeClear)
|
||||
}
|
||||
var failedOffset = gaugePercent >= gaugeClear[0] ? 0 : -2000
|
||||
if(players === 2){
|
||||
var gauge2 = this.controller.syncWith.game.rules.gaugePercent(p2.results.gauge)
|
||||
if(gauge2 > gaugePercent && failedOffset !== 0 && gauge2 >= gaugeClear[1]){
|
||||
var failedOffset = rules.clearReached(this.results[this.player[0]].gauge) ? 0 : -2000
|
||||
if(players === 2 && failedOffset !== 0){
|
||||
var p2results = this.results[this.player[1]]
|
||||
if(p2results && this.controller.syncWith.game.rules.clearReached(p2results.gauge)){
|
||||
failedOffset = 0
|
||||
}
|
||||
}
|
||||
if(elapsed >= 3100 + failedOffset){
|
||||
for(var p = 0; p < players; p++){
|
||||
ctx.save()
|
||||
var results = this.results
|
||||
if(p === 1){
|
||||
results = p2.results
|
||||
var results = this.results[p]
|
||||
if(!results){
|
||||
continue
|
||||
}
|
||||
var playerRules = p === 0 ? rules : this.controller.syncWith.game.rules
|
||||
var resultGauge = playerRules.gaugePercent(results.gauge)
|
||||
var clear = resultGauge >= gaugeClear[p]
|
||||
var clear = this.rules[p].clearReached(results.gauge)
|
||||
if(p === 1 || !this.multiplayer && clear){
|
||||
ctx.translate(0, 290)
|
||||
}
|
||||
@@ -415,7 +418,7 @@ class Scoresheet{
|
||||
|
||||
this.draw.layeredText({
|
||||
ctx: ctx,
|
||||
text: this.results.title,
|
||||
text: this.results[this.player[0]].title,
|
||||
fontSize: 40,
|
||||
fontFamily: this.font,
|
||||
x: 1257,
|
||||
@@ -431,9 +434,11 @@ class Scoresheet{
|
||||
|
||||
ctx.save()
|
||||
for(var p = 0; p < players; p++){
|
||||
var results = this.results
|
||||
var results = this.results[p]
|
||||
if(!results){
|
||||
continue
|
||||
}
|
||||
if(p === 1){
|
||||
results = p2.results
|
||||
ctx.translate(0, p2Offset)
|
||||
}
|
||||
|
||||
@@ -455,10 +460,11 @@ class Scoresheet{
|
||||
ctx.fillText(text, 395, 308)
|
||||
ctx.miterLimit = 10
|
||||
|
||||
if(p === 0){
|
||||
var name = account.loggedIn ? account.displayName : strings.defaultName
|
||||
var defaultName = p === 0 ? strings.defaultName : strings.default2PName
|
||||
if(p === this.player[0]){
|
||||
var name = account.loggedIn ? account.displayName : defaultName
|
||||
}else{
|
||||
var name = results.name
|
||||
var name = results.name || defaultName
|
||||
}
|
||||
this.nameplateCache.get({
|
||||
ctx: ctx,
|
||||
@@ -466,7 +472,7 @@ class Scoresheet{
|
||||
y: 92,
|
||||
w: 273,
|
||||
h: 66,
|
||||
id: p.toString() + "p",
|
||||
id: p.toString() + "p" + name,
|
||||
}, ctx => {
|
||||
this.draw.nameplate({
|
||||
ctx: ctx,
|
||||
@@ -609,7 +615,7 @@ class Scoresheet{
|
||||
if(this.tetsuoHanaClass){
|
||||
this.tetsuoHana.classList.remove(this.tetsuoHanaClass)
|
||||
}
|
||||
this.tetsuoHanaClass = rules.clearReached(this.results.gauge) ? "dance" : "failed"
|
||||
this.tetsuoHanaClass = this.rules[this.player[0]].clearReached(this.results[this.player[0]].gauge) ? "dance" : "failed"
|
||||
this.tetsuoHana.classList.add(this.tetsuoHanaClass)
|
||||
}
|
||||
}
|
||||
@@ -623,32 +629,32 @@ class Scoresheet{
|
||||
ctx.translate(frameLeft, frameTop)
|
||||
|
||||
for(var p = 0; p < players; p++){
|
||||
var results = this.results
|
||||
var results = this.results[p]
|
||||
if(!results){
|
||||
continue
|
||||
}
|
||||
if(p === 1){
|
||||
results = p2.results
|
||||
ctx.translate(0, p2Offset)
|
||||
}
|
||||
var gaugePercent = rules.gaugePercent(results.gauge)
|
||||
var w = 712
|
||||
this.draw.gauge({
|
||||
ctx: ctx,
|
||||
x: 558 + w,
|
||||
y: p === 1 ? 124 : 116,
|
||||
clear: gaugeClear[p],
|
||||
percentage: gaugePercent,
|
||||
clear: this.rules[p].gaugeClear,
|
||||
percentage: this.rules[p].gaugePercent(results.gauge),
|
||||
font: this.font,
|
||||
scale: w / 788,
|
||||
scoresheet: true,
|
||||
blue: p === 1,
|
||||
multiplayer: p === 1
|
||||
})
|
||||
var playerRules = p === 0 ? rules : this.controller.syncWith.game.rules
|
||||
this.draw.soul({
|
||||
ctx: ctx,
|
||||
x: 1215,
|
||||
y: 144,
|
||||
scale: 36 / 42,
|
||||
cleared: playerRules.clearReached(results.gauge)
|
||||
cleared: this.rules[p].clearReached(results.gauge)
|
||||
})
|
||||
}
|
||||
})
|
||||
@@ -661,13 +667,12 @@ class Scoresheet{
|
||||
var noCrownResultWait = -2000;
|
||||
|
||||
for(var p = 0; p < players; p++){
|
||||
var results = this.results
|
||||
if(p === 1){
|
||||
results = p2.results
|
||||
var results = this.results[p]
|
||||
if(!results){
|
||||
continue
|
||||
}
|
||||
var crownType = null
|
||||
var playerRules = p === 0 ? rules : this.controller.syncWith.game.rules
|
||||
if(playerRules.clearReached(results.gauge)){
|
||||
if(this.rules[p].clearReached(results.gauge)){
|
||||
crownType = results.bad === "0" ? "gold" : "silver"
|
||||
}
|
||||
if(crownType !== null){
|
||||
@@ -730,7 +735,10 @@ class Scoresheet{
|
||||
var times = {}
|
||||
var lastTime = 0
|
||||
for(var p = 0; p < players; p++){
|
||||
var results = p === 0 ? this.results : p2.results
|
||||
var results = this.results[p]
|
||||
if(!results){
|
||||
continue
|
||||
}
|
||||
var currentTime = 3100 + noCrownResultWait + results.points.length * 30 * this.frame
|
||||
if(currentTime > lastTime){
|
||||
lastTime = currentTime
|
||||
@@ -739,7 +747,10 @@ class Scoresheet{
|
||||
for(var i in printNumbers){
|
||||
var largestTime = 0
|
||||
for(var p = 0; p < players; p++){
|
||||
var results = p === 0 ? this.results : p2.results
|
||||
var results = this.results[p]
|
||||
if(!results){
|
||||
continue
|
||||
}
|
||||
times[printNumbers[i]] = lastTime + 500
|
||||
var currentTime = lastTime + 500 + results[printNumbers[i]].length * 30 * this.frame
|
||||
if(currentTime > largestTime){
|
||||
@@ -755,9 +766,11 @@ class Scoresheet{
|
||||
}
|
||||
|
||||
for(var p = 0; p < players; p++){
|
||||
var results = this.results
|
||||
var results = this.results[p]
|
||||
if(!results){
|
||||
continue
|
||||
}
|
||||
if(p === 1){
|
||||
results = p2.results
|
||||
ctx.translate(0, p2Offset)
|
||||
}
|
||||
ctx.save()
|
||||
@@ -851,7 +864,7 @@ class Scoresheet{
|
||||
|
||||
if(elapsed >= 1000){
|
||||
this.clean()
|
||||
this.controller.songSelection(true)
|
||||
this.controller.songSelection(true, this.scoreSaveFailed)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -918,10 +931,14 @@ class Scoresheet{
|
||||
delete this.resultsObj.title
|
||||
delete this.resultsObj.difficulty
|
||||
delete this.resultsObj.gauge
|
||||
scoreStorage.add(hash, difficulty, this.resultsObj, true, title)
|
||||
scoreStorage.add(hash, difficulty, this.resultsObj, true, title).catch(() => {
|
||||
this.scoreSaveFailed = true
|
||||
})
|
||||
}else if(oldScore && (crown === "gold" && oldScore.crown !== "gold" || crown && !oldScore.crown)){
|
||||
oldScore.crown = crown
|
||||
scoreStorage.add(hash, difficulty, oldScore, true, title)
|
||||
scoreStorage.add(hash, difficulty, oldScore, true, title).catch(() => {
|
||||
this.scoreSaveFailed = true
|
||||
})
|
||||
}
|
||||
}
|
||||
this.scoreSaved = true
|
||||
@@ -936,7 +953,7 @@ class Scoresheet{
|
||||
snd.buffer.loadSettings()
|
||||
this.redrawRunning = false
|
||||
pageEvents.remove(this.canvas, ["mousedown", "touchstart"])
|
||||
if(this.multiplayer !== 2 && this.touchEnabled){
|
||||
if(this.touchEnabled){
|
||||
pageEvents.remove(document.getElementById("touch-full-btn"), "touchend")
|
||||
}
|
||||
if(this.session){
|
||||
@@ -948,5 +965,7 @@ class Scoresheet{
|
||||
delete this.ctx
|
||||
delete this.canvas
|
||||
delete this.fadeScreen
|
||||
delete this.results
|
||||
delete this.rules
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user