diff --git a/public/src/js/assets.js b/public/src/js/assets.js index 24d4232..efe9dc9 100644 --- a/public/src/js/assets.js +++ b/public/src/js/assets.js @@ -2,6 +2,7 @@ var assets = { "js": [ "lib/md5.min.js", "lib/fuzzysort.js", + "cookie.js", "loadsong.js", "parseosu.js", "titlescreen.js", diff --git a/public/src/js/cookie.js b/public/src/js/cookie.js new file mode 100644 index 0000000..26f186e --- /dev/null +++ b/public/src/js/cookie.js @@ -0,0 +1,41 @@ +var cookie = { + get: function(name){ + var pairs = document.cookie ? document.cookie.split("; ") : [] + for(var i = 0; i < pairs.length; i++){ + var idx = pairs[i].indexOf("=") + var key = idx > -1 ? pairs[i].slice(0, idx) : pairs[i] + if(key === name){ + var val = idx > -1 ? pairs[i].slice(idx + 1) : "" + try{ + return decodeURIComponent(val) + }catch(e){ + return val + } + } + } + return null + }, + set: function(name, value, maxAge){ + var v = typeof value === "string" ? value : String(value) + document.cookie = name + "=" + encodeURIComponent(v) + ";path=/" + (maxAge ? ";max-age=" + maxAge : "") + }, + getJSON: function(name){ + var v = this.get(name) + if(!v){ + return {} + } + try{ + return JSON.parse(v) + }catch(e){ + return {} + } + }, + updateJSON: function(name, updater, maxAge){ + var obj = this.getJSON(name) + var next = updater && updater(obj) || obj + try{ + this.set(name, JSON.stringify(next), maxAge) + }catch(e){} + return next + } +} diff --git a/public/src/js/scoresheet.js b/public/src/js/scoresheet.js index a220be9..d89c687 100644 --- a/public/src/js/scoresheet.js +++ b/public/src/js/scoresheet.js @@ -940,7 +940,7 @@ class Scoresheet{ delete this.resultsObj.title delete this.resultsObj.difficulty delete this.resultsObj.gauge - scoreStorage.add(hash, difficulty, this.resultsObj, true, title).catch(() => { + scoreStorage.add(hash, difficulty, this.resultsObj, true, title).catch(() => { this.showWarning = {name: "scoreSaveFailed"} }) }else if(oldScore && (crown === "gold" && oldScore.crown !== "gold" || crown && !oldScore.crown)){ @@ -949,6 +949,21 @@ class Scoresheet{ this.showWarning = {name: "scoreSaveFailed"} }) } + var key = "taiko_best_records" + var obj = cookie.getJSON(key) + if(!(hash in obj)){ + obj[hash] = {} + } + var prev = obj[hash][difficulty] + var total = this.resultsObj.good + this.resultsObj.ok + this.resultsObj.bad + var acc = total > 0 ? Math.round(((this.resultsObj.good + this.resultsObj.ok) / total) * 1000) / 10 : 0 + var combo = this.resultsObj.maxCombo || 0 + var points = this.resultsObj.points || 0 + var update = !prev || points > prev.score || (points === prev.score && (acc > prev.accuracy || combo > prev.combo)) + if(update){ + obj[hash][difficulty] = {score: points, accuracy: acc, combo: combo, updatedAt: Date.now()} + try{ cookie.set(key, JSON.stringify(obj), 31536000) }catch(e){} + } } this.scoreSaved = true } diff --git a/public/src/js/songselect.js b/public/src/js/songselect.js index ce17460..ebdbd80 100644 --- a/public/src/js/songselect.js +++ b/public/src/js/songselect.js @@ -1989,6 +1989,37 @@ class SongSelect{ }) } } + var recAll = cookie.getJSON("taiko_best_records") + var bySong = recAll[currentSong.hash] || null + var diffName = currentUra ? "ura" : this.difficultyId[i] + var rec = bySong && bySong[diffName] || null + var elapsedMS2 = Math.max(this.state.screenMS, this.state.moveMS, this.state.mouseMoveMS) + var cycle = Math.floor(((ms - elapsedMS2) % 6000) / 2000) + var label = "" + if(rec){ + if(cycle === 0){ + label = (strings.bestAccuracy || "良率") + " " + (Math.round(rec.accuracy * 10) / 10) + "%" + }else if(cycle === 1){ + label = (strings.bestCombo || "连打数") + " " + rec.combo + }else{ + label = (strings.bestScore || "总分") + " " + rec.score + } + }else{ + label = (strings.none || "无") + } + this.draw.verticalText({ + ctx: ctx, + text: label, + x: _x, + y: songSel ? _y + 220 : _y + 265, + width: songSel ? 44 : 56, + height: songSel ? 120 : 135, + fill: currentUra ? "#fff" : "#000", + outline: currentUra ? "#003C52" : false, + outlineSize: currentUra ? this.songAsset.letterBorder : 0, + fontSize: songSel ? 22 : 24, + fontFamily: this.font + }) } var currentDiff = this.selectedDiff - this.diffOptions.length if(this.selectedDiff === 4 + this.diffOptions.length){ diff --git a/public/src/js/strings.js b/public/src/js/strings.js index 6f0729e..17d4fab 100644 --- a/public/src/js/strings.js +++ b/public/src/js/strings.js @@ -67,6 +67,27 @@ var translations = { tw: "選擇難度", ko: "난이도 선택" }, + bestAccuracy: { + ja: "良率", + en: "Accuracy", + cn: "良率", + tw: "良率", + ko: "정확도" + }, + bestCombo: { + ja: "連打数", + en: "Max Combo", + cn: "连打数", + tw: "連打數", + ko: "최대 콤보" + }, + bestScore: { + ja: "総得点", + en: "Score", + cn: "总分", + tw: "總分", + ko: "총점" + }, back: { ja: "もどる", en: "Back",