Commit 13ca5e36 authored by Bui's avatar Bui Committed by GitHub

Merge pull request #136 from bui/parsetja-add-branches

ParseTja: Add branches
parents 440436b3 92510c30
......@@ -44,7 +44,8 @@
box-sizing: border-box;
}
#debug .input-slider{
#debug .input-slider,
#debug .select{
display: flex;
width: 100%;
height: 30px;
......@@ -59,7 +60,8 @@
padding: 2px 4px;
text-align: center;
}
#debug .input-slider>span{
#debug .input-slider>span,
#debug .select>span{
display: block;
width: 10%;
height: 100%;
......@@ -70,10 +72,19 @@
line-height: 2em;
cursor: pointer;
}
#debug .input-slider>span:hover{
#debug .input-slider>span:hover,
#debug .select>span:hover{
opacity: 1;
background: #333;
}
#debug .select select{
width: 90%;
height: 100%;
box-sizing: border-box;
font-size: 18px;
font-family: sans-serif;
padding: 2px 4px;
}
#debug label{
display: block;
......@@ -111,6 +122,7 @@
margin-left: 3px;
}
#debug .autoplay-label{
#debug .autoplay-label,
#debug .branch-hide{
display: none;
}
......@@ -268,6 +268,9 @@
easeOut(pos){
return Math.sin(Math.PI / 2 * pos)
}
easeOutBack(pos){
return Math.sin(Math.PI / 1.74 * pos) * 1.03
}
easeInOut(pos){
return (Math.cos(Math.PI * pos) - 1) / -2
}
......@@ -572,7 +575,7 @@
}
if(symbol.ura){
ctx.font = (30 * mul) + "px Meiryo, sans-serif"
ctx.textBaseline = "center"
ctx.textBaseline = "middle"
ctx.beginPath()
ctx.arc(currentX, currentY + (17 * mul), (18 * mul), 0, Math.PI * 2)
if(action === "stroke"){
......@@ -581,7 +584,7 @@
}else if(action === "fill"){
ctx.strokeStyle = config.fill
ctx.lineWidth = 2.5 * mul
ctx.fillText(symbol.text, currentX, currentY)
ctx.fillText(symbol.text, currentX, currentY + (17 * mul))
}
ctx.stroke()
}else{
......@@ -788,7 +791,7 @@
}
if(symbol.ura){
ctx.font = (30 * mul) + "px Meiryo, sans-serif"
ctx.textBaseline = "center"
ctx.textBaseline = "middle"
ctx.beginPath()
ctx.arc(currentX, currentY + (17 * mul), (18 * mul), 0, Math.PI * 2)
if(action === "strokeText"){
......@@ -797,7 +800,7 @@
}else if(action === "fillText"){
ctx.strokeStyle = layer.fill
ctx.lineWidth = 2.5 * mul
ctx.fillText(symbol.text, currentX, currentY)
ctx.fillText(symbol.text, currentX, currentY + (17 * mul))
}
ctx.stroke()
}else{
......@@ -1167,6 +1170,7 @@
var firstTop = config.multiplayer ? 0 : 30
var secondTop = config.multiplayer ? 0 : 8
config.percentage = Math.max(0, Math.min(1, config.percentage))
var cleared = config.percentage - 1 / 50 >= config.clear
var gaugeW = 14 * 50
......
class Circle{
constructor(config){
// id, ms, type, text, speed, endTime, requiredHits
this.id = config.id
this.ms = config.start
this.originalMS = this.ms
......@@ -23,38 +22,13 @@ class Circle{
this.gogoChecked = false
this.beatMS = config.beatMS
this.fixedPos = config.fixedPos
}
getMS(){
return this.ms
}
getEndTime(){
return this.endTime
}
getType(){
return this.type
}
getLastFrame(){
return this.lastFrame
this.branch = config.branch
this.section = config.section
}
animate(ms){
this.animating = true
this.animT = ms
}
isAnimated(){
return this.animating
}
getAnimT(){
return this.animT
}
getPlayed(){
return this.isPlayed
}
isAnimationFinished(){
return this.animationEnded
}
endAnimation(){
this.animationEnded = true
}
played(score, big){
this.score = score
this.isPlayed = score <= 0 ? score - 1 : (big ? 2 : 1)
......@@ -65,16 +39,4 @@ class Circle{
this.timesKa++
}
}
getScore(){
return this.score
}
getID(){
return this.id
}
getText(){
return this.text
}
getSpeed(){
return this.speed
}
}
\ No newline at end of file
......@@ -8,15 +8,19 @@ class Debug{
this.debugDiv.innerHTML = assets.pages["debug"]
document.body.appendChild(this.debugDiv)
this.titleDiv = this.debugDiv.getElementsByClassName("title")[0]
this.minimiseDiv = this.debugDiv.getElementsByClassName("minimise")[0]
this.offsetDiv = this.debugDiv.getElementsByClassName("offset")[0]
this.measureNumDiv = this.debugDiv.getElementsByClassName("measure-num")[0]
this.restartCheckbox = this.debugDiv.getElementsByClassName("change-restart")[0]
this.autoplayLabel = this.debugDiv.getElementsByClassName("autoplay-label")[0]
this.autoplayCheckbox = this.debugDiv.getElementsByClassName("autoplay")[0]
this.restartBtn = this.debugDiv.getElementsByClassName("restart-btn")[0]
this.exitBtn = this.debugDiv.getElementsByClassName("exit-btn")[0]
this.titleDiv = this.byClass("title")
this.minimiseDiv = this.byClass("minimise")
this.offsetDiv = this.byClass("offset")
this.measureNumDiv = this.byClass("measure-num")
this.branchHideDiv = this.byClass("branch-hide")
this.branchSelectDiv = this.byClass("branch-select")
this.branchSelect = this.branchSelectDiv.getElementsByTagName("select")[0]
this.branchResetBtn = this.branchSelectDiv.getElementsByClassName("reset")[0]
this.restartCheckbox = this.byClass("change-restart")
this.autoplayLabel = this.byClass("autoplay-label")
this.autoplayCheckbox = this.byClass("autoplay")
this.restartBtn = this.byClass("restart-btn")
this.exitBtn = this.byClass("exit-btn")
this.moving = false
pageEvents.add(window, ["mousedown", "mouseup", "blur"], this.stopMove.bind(this))
......@@ -26,6 +30,8 @@ class Debug{
pageEvents.add(this.restartBtn, "click", this.restartSong.bind(this))
pageEvents.add(this.exitBtn, "click", this.clean.bind(this))
pageEvents.add(this.autoplayCheckbox, "change", this.toggleAutoplay.bind(this))
pageEvents.add(this.branchSelect, "change", this.branchChange.bind(this))
pageEvents.add(this.branchResetBtn, "click", this.branchReset.bind(this))
this.offsetSlider = new InputSlider(this.offsetDiv, -60, 60, 3)
this.offsetSlider.onchange(this.offsetChange.bind(this))
......@@ -39,6 +45,9 @@ class Debug{
this.updateStatus()
pageEvents.send("debug")
}
byClass(name){
return this.debugDiv.getElementsByClassName(name)[0]
}
startMove(event){
if(event.which === 1){
event.stopPropagation()
......@@ -88,20 +97,28 @@ class Debug{
}
updateStatus(){
if(debugObj.controller && !this.controller){
this.controller = debugObj.controller
this.restartBtn.style.display = "block"
this.autoplayLabel.style.display = "block"
if(this.controller.parsedSongData.branches){
this.branchHideDiv.style.display = "block"
}
this.controller = debugObj.controller
var selectedSong = this.controller.selectedSong
this.defaultOffset = selectedSong.offset || 0
if(this.songFolder === selectedSong.folder){
this.offsetChange(this.offsetSlider.get(), true)
this.branchChange(null, true)
}else{
this.songFolder = selectedSong.folder
this.offsetSlider.set(this.defaultOffset)
this.branchReset(null, true)
}
var measures = this.controller.parsedSongData.measures
var measures = this.controller.parsedSongData.measures.filter((measure, i, array) => {
return i === 0 || Math.abs(measure.ms - array[i - 1].ms) > 0.01
})
this.measureNumSlider.setMinMax(0, measures.length - 1)
if(this.measureNum && measures.length > this.measureNum){
var measureMS = measures[this.measureNum].ms
......@@ -128,6 +145,7 @@ class Debug{
if(this.controller && !debugObj.controller){
this.restartBtn.style.display = ""
this.autoplayLabel.style.display = ""
this.branchHideDiv.style.display = ""
this.controller = null
}
}
......@@ -142,6 +160,11 @@ class Debug{
songData.measures.forEach(measure => {
measure.ms = measure.originalMS + offset
})
if(songData.branches){
songData.branches.forEach(branch => {
branch.ms = branch.originalMS + offset
})
}
if(this.restartCheckbox.checked && !noRestart){
this.restartSong()
}
......@@ -171,21 +194,46 @@ class Debug{
}
}
}
branchChange(event, noRestart){
if(this.controller){
var game = this.controller.game
var name = this.branchSelect.value
game.branch = name === "auto" ? false : name
game.branchSet = name === "auto"
var selectedOption = this.branchSelect.selectedOptions[0]
this.branchSelect.style.background = selectedOption.style.background
if(this.restartCheckbox.checked && !noRestart){
this.restartSong()
}
}
}
branchReset(event, noRestart){
this.branchSelect.value = "auto"
this.branchChange(null, noRestart)
}
clean(){
this.offsetSlider.clean()
this.measureNumSlider.clean()
pageEvents.remove(window, ["mousedown", "mouseup", "blur"])
pageEvents.mouseRemove(this)
pageEvents.remove(this.titleDiv, "mousedown")
pageEvents.remove(this.title, "mousedown")
pageEvents.remove(this.minimiseDiv, "click")
pageEvents.remove(this.restartBtn, "click")
pageEvents.remove(this.exitBtn, "click")
pageEvents.remove(this.autoplayCheckbox, "change")
pageEvents.remove(this.branchSelect, "change")
pageEvents.remove(this.branchResetBtn, "click")
delete this.titleDiv
delete this.minimiseDiv
delete this.offsetDiv
delete this.measureNumDiv
delete this.branchHideDiv
delete this.branchSelectDiv
delete this.branchSelect
delete this.branchResetBtn
delete this.restartCheckbox
delete this.autoplayLabel
delete this.autoplayCheckbox
......
This diff is collapsed.
......@@ -199,7 +199,7 @@
songObj.subtitle = songObj.subtitle_en = subtitle
songObj.preview = meta.demostart ? Math.floor(meta.demostart * 1000) : 0
if(meta.level){
songObj.stars[this.courseTypes[diff]] = meta.level
songObj.stars[this.courseTypes[diff]] = meta.level + (meta.branch ? " B" : "")
}
if(meta.wave){
songObj.music = this.otherFiles[dir + meta.wave.toLowerCase()]
......
......@@ -199,8 +199,8 @@ class Keyboard{
if(
sound === "don"
&& circle
&& !circle.getPlayed()
&& circle.getType() === "balloon"
&& !circle.isPlayed
&& circle.type === "balloon"
&& circle.requiredHits - circle.timesHit <= 1
){
this.controller.playSound("se_balloon")
......
......@@ -106,7 +106,9 @@ pageEvents.keyAdd(debugObj, "all", "down", event => {
}else if(debugObj.state === "minimised"){
debugObj.debug.restore()
}else{
try{
debugObj.debug = new Debug()
}catch(e){}
}
}
if(event.keyCode === 82 && debugObj.debug && debugObj.controller){
......
......@@ -6,12 +6,15 @@ class Mekadon{
this.lastHit = -Infinity
}
play(circle){
var type = circle.getType()
if((type === "balloon" || type === "drumroll" || type === "daiDrumroll") && this.getMS() > circle.getEndTime()){
var type = circle.type
if((type === "balloon" || type === "drumroll" || type === "daiDrumroll") && this.getMS() > circle.endTime){
if(circle.section && circle.timesHit === 0){
this.game.resetSection()
}
circle.played(-1, false)
this.game.updateCurrentCircle()
}
type = circle.getType()
type = circle.type
if(type === "balloon"){
this.playDrumrollAt(circle, 0, 30)
}else if(type === "drumroll" || type === "daiDrumroll"){
......@@ -21,7 +24,7 @@ class Mekadon{
}
}
playAt(circle, ms, score, dai, reverse){
var currentMs = circle.getMS() - this.getMS()
var currentMs = circle.ms - this.getMS()
if(ms > currentMs - 10){
return this.playNow(circle, score, dai, reverse)
}
......@@ -36,18 +39,19 @@ class Mekadon{
}
}
miss(circle){
var currentMs = circle.getMS() - this.getMS()
var currentMs = circle.ms - this.getMS()
if(0 >= currentMs - 10){
this.controller.displayScore(0, true)
this.game.updateCurrentCircle()
this.game.updateCombo(0)
this.game.updateGlobalScore(0, 1, circle.gogoTime)
this.game.sectionNotes.push(0)
return true
}
}
playNow(circle, score, dai, reverse){
var kbd = this.controller.getBindings()
var type = circle.getType()
var type = circle.type
var keyDai = false
var playDai = !dai || dai === 2
var drumrollNotes = type === "balloon" || type === "drumroll" || type === "daiDrumroll"
......@@ -55,7 +59,7 @@ class Mekadon{
if(drumrollNotes){
var ms = this.getMS()
}else{
var ms = circle.getMS()
var ms = circle.ms
}
if(reverse){
......@@ -95,6 +99,10 @@ class Mekadon{
this.game.updateGlobalScore(score, keyDai ? 2 : 1, circle.gogoTime)
this.game.updateCurrentCircle()
circle.played(score, keyDai)
if(circle.section){
this.game.resetSection()
}
this.game.sectionNotes.push(score === 450 ? 1 : (score === 230 ? 0.5 : 0))
}
this.lastHit = ms
return true
......
......@@ -109,6 +109,7 @@ class P2Connection{
this.dai = 2
this.kaAmount = 0
this.results = false
this.branch = "normal"
break
case "gameend":
this.otherConnected = false
......@@ -141,6 +142,10 @@ class P2Connection{
this.kaAmount = response.value.kaAmount
}
break
case "branch":
this.branch = response.value
this.branchSet = false
break
case "session":
this.clearMessage("users")
this.otherConnected = true
......@@ -161,10 +166,10 @@ class P2Connection{
}
play(circle, mekadon){
if(this.otherConnected || this.notes.length > 0){
var type = circle.getType()
var type = circle.type
var drumrollNotes = type === "balloon" || type === "drumroll" || type === "daiDrumroll"
if(drumrollNotes && mekadon.getMS() > circle.getEndTime()){
if(drumrollNotes && mekadon.getMS() > circle.endTime){
circle.played(-1, false)
mekadon.game.updateCurrentCircle()
}
......@@ -177,7 +182,7 @@ class P2Connection{
var note = this.notes[0]
if(note.score >= 0){
var dai = 1
if(circle.getType() === "daiDon" || circle.getType() === "daiKa"){
if(circle.type === "daiDon" || circle.type === "daiKa"){
dai = this.dai
}
if(mekadon.playAt(circle, note.ms, note.score, dai, note.reverse)){
......
......@@ -59,8 +59,10 @@
if(!(courseName in courses)){
courses[courseName] = {}
}
if(name !== "branch"){
courses[courseName][name] = currentCourse[name]
}
}
courses[courseName].start = lineNum + 1
courses[courseName].end = this.data.length
}
......@@ -70,6 +72,8 @@
hasSong = true
courses[courseName].end = lineNum
}
}else if(name.startsWith("branchstart") && inSong){
courses[courseName].branch = true
}
}else if(!inSong){
......@@ -128,9 +132,13 @@
var balloons = meta.balloon || []
var lastDrumroll = false
var branch = false
var branchType
var branchPreference = "m"
var branchObj = {}
var currentBranch = false
var branchSettings = {}
var branchFirstMeasure = false
var sectionBegin = true
var currentMeasure = []
var firstNote = true
......@@ -138,7 +146,6 @@
var circleID = 0
var pushMeasure = () => {
if(barLine){
var note = currentMeasure[0]
if(note){
var speed = note.bpm * note.scroll / 60
......@@ -148,9 +155,12 @@
this.measures.push({
ms: ms,
originalMS: ms,
speed: speed
speed: speed,
visible: barLine,
branch: currentBranch,
branchFirst: branchFirstMeasure
})
}
branchFirstMeasure = false
if(currentMeasure.length){
for(var i = 0; i < currentMeasure.length; i++){
var note = currentMeasure[i]
......@@ -182,7 +192,9 @@
gogoTime: note.gogo,
endTime: note.endTime,
requiredHits: note.requiredHits,
beatMS: 60000 / note.bpm
beatMS: 60000 / note.bpm,
branch: currentBranch,
section: note.section
})
if(lastDrumroll === note){
lastDrumroll = circleObj
......@@ -204,7 +216,6 @@
var line = line.slice(1).toLowerCase()
var [name, value] = this.split(line, " ")
if(!branch || branch && branchType === branchPreference){
switch(name){
case "gogostart":
gogo = true
......@@ -213,14 +224,14 @@
gogo = false
break
case "bpmchange":
bpm = parseFloat(value)
bpm = parseFloat(value) || bpm
break
case "scroll":
scroll = parseFloat(value)
scroll = parseFloat(value) || scroll
break
case "measure":
var [numerator, denominator] = value.split("/")
measure = numerator / denominator * 4
measure = numerator / denominator * 4 || measure
break
case "delay":
ms += (parseFloat(value) || 0) * 1000
......@@ -231,32 +242,87 @@
case "barlineoff":
barLine = false
break
}
}
switch(name){
case "branchstart":
branch = true
branchType = ""
currentBranch = false
branchFirstMeasure = true
branchSettings = {
ms: ms,
gogo: gogo,
bpm: bpm,
scroll: scroll,
sectionBegin: sectionBegin
}
value = value.split(",")
var forkType = value[0].toLowerCase()
if(forkType === "r" || parseFloat(value[2]) <= 100){
branchPreference = "m"
}else if(parseFloat(value[1]) <= 100){
branchPreference = "e"
if(!this.branches){
this.branches = []
}
var req = {
advanced: parseFloat(value[1]) || 0,
master: parseFloat(value[2]) || 0
}
if(req.advanced > 0){
var active = req.master > 0 ? "normal" : "master"
}else{
branchPreference = "n"
var active = req.master > 0 ? "advanced" : "master"
}
branchObj = {
ms: ms,
originalMS: ms,
active: active,
type: value[0].trim().toLowerCase() === "r" ? "drumroll" : "accuracy",
requirement: req
}
this.branches.push(branchObj)
if(this.measures.length === 1 && branchObj.type === "drumroll"){
for(var i = circles.length; i--;){
var circle = circles[i]
if(circle.endTime && circle.type === "drumroll" || circle.type === "daiDrumroll" || circle.type === "balloon"){
this.measures.push({
ms: circle.endTime,
originalMS: circle.endTime,
speed: circle.bpm * circle.scroll / 60,
visible: false,
branch: circle.branch
})
break
}
}
}
if(this.measures.length !== 0){
this.measures[this.measures.length - 1].nextBranch = branchObj
}
break
case "branchend":
case "section":
branch = false
currentBranch = false
break
case "section":
sectionBegin = true
if(branch && !currentBranch){
branchSettings.sectionBegin = true
}
break
case "n": case "e": case "m":
branchType = name
if(!branch){
break
}
ms = branchSettings.ms
gogo = branchSettings.gogo
bpm = branchSettings.bpm
scroll = branchSettings.scroll
sectionBegin = branchSettings.sectionBegin
branchFirstMeasure = true
var branchName = name === "m" ? "master" : (name === "e" ? "advanced" : "normal")
currentBranch = {
name: branchName,
active: branchName === branchObj.active
}
branchObj[branchName] = currentBranch
break
}
}else if(!branch || branch && branchType === branchPreference){
}else{
var string = line.split("")
......@@ -278,8 +344,10 @@
txt: type.txt,
gogo: gogo,
bpm: bpm,
scroll: scroll
scroll: scroll,
section: sectionBegin
}
sectionBegin = false
if(lastDrumroll){
circleObj.endDrumroll = lastDrumroll
lastDrumroll = false
......@@ -293,15 +361,19 @@
txt: type.txt,
gogo: gogo,
bpm: bpm,
scroll: scroll
scroll: scroll,
section: sectionBegin
}
sectionBegin = false
if(lastDrumroll){
if(symbol === "9"){
currentMeasure.push({
endDrumroll: lastDrumroll,
bpm: bpm,
scroll: scroll
scroll: scroll,
section: sectionBegin
})
sectionBegin = false
lastDrumroll = false
}else{
currentMeasure.push({
......@@ -327,8 +399,10 @@
currentMeasure.push({
endDrumroll: lastDrumroll,
bpm: bpm,
scroll: scroll
scroll: scroll,
section: sectionBegin
})
sectionBegin = false
lastDrumroll = false
}else{
currentMeasure.push({
......@@ -359,6 +433,11 @@
lastDrumroll.originalEndTime = ms
}
if(this.branches){
circles.sort((a, b) => a.ms > b.ms ? 1 : -1)
this.measures.sort((a, b) => a.ms > b.ms ? 1 : -1)
circles.forEach((circle, i) => circle.id = i + 1)
}
return circles
}
}
......@@ -351,7 +351,7 @@ class SongSelect{
down: code == 40
// Down
}
if(key.cancel && event){
if(event && (code == 27 || code == 8)){
event.preventDefault()
}
if(this.state.screen === "song"){
......@@ -1322,7 +1322,26 @@ class SongSelect{
outlineSize: currentUra ? this.songAsset.letterBorder : 0
})
})
var songStars = currentUra ? currentSong.stars[4] : currentSong.stars[i]
var songStarsArray = (currentUra ? currentSong.stars[4] : currentSong.stars[i]).toString().split(" ")
var songStars = songStarsArray[0]
var songBranch = songStarsArray[1] === "B"
var elapsedMS = this.state.screenMS > this.state.moveMS || !songSel ? this.state.screenMS : this.state.moveMS
var fade = ((ms - elapsedMS) % 2000) / 2000
if(songBranch && fade > 0.25 && fade < 0.75){
this.draw.verticalText({
ctx: ctx,
text: strings.songBranch,
x: _x,
y: _y + (songSel ? 110 : 185),
width: songSel ? 44 : 56,
height: songSel ? 160 : 170,
fill: songSel && !currentUra ? "#c85200" : "#fff",
fontSize: songSel ? 25 : 27,
fontFamily: songSel ? "Meiryo, Microsoft YaHei, sans-serif" : this.font,
outline: songSel ? false : "#f22666",
outlineSize: songSel ? 0 : this.songAsset.letterBorder
})
}else{
for(var j = 0; j < 10; j++){
if(songSel){
var yPos = _y + 113 + j * 17
......@@ -1345,6 +1364,7 @@ class SongSelect{
})
}
}
}
var currentDiff = this.selectedDiff - this.diffOptions.length
if(this.selectedDiff === 4 + this.diffOptions.length){
currentDiff = 3
......
......@@ -86,7 +86,7 @@ class SoundGain{
this.volume = amount
}
setCrossfade(amount){
this.setVolume(Math.pow(Math.sin(Math.PI / 2 * amount), 1 / 4))
this.setVolume(Math.sqrt(Math.sin(Math.PI / 2 * amount)))
}
fadeIn(duration, time, absolute){
this.fadeVolume(0, this.volume * this.volume, duration, time, absolute)
......
......@@ -34,6 +34,7 @@
this.normal = "ふつう"
this.hard = "むずかしい"
this.oni = "おに"
this.songBranch = "譜面分岐あり"
this.sessionStart = "オンラインセッションを開始する!"
this.sessionEnd = "オンラインセッションを終了する"
this.loading = "ロード中..."
......@@ -53,6 +54,11 @@
this.good = ""
this.ok = ""
this.bad = "不可"
this.branch = {
"normal": "普通譜面",
"advanced": "玄人譜面",
"master": "達人譜面"
}
this.pauseOptions = [
"演奏をつづける",
"はじめからやりなおす",
......@@ -135,6 +141,7 @@ function StringsEn(){
this.normal = "Normal"
this.hard = "Hard"
this.oni = "Extreme"
this.songBranch = "Diverge Notes"
this.sessionStart = "Begin an Online Session!"
this.sessionEnd = "End Online Session"
this.loading = "Loading..."
......@@ -154,6 +161,11 @@ function StringsEn(){
this.good = "GOOD"
this.ok = "OK"
this.bad = "BAD"
this.branch = {
"normal": "Normal",
"advanced": "Professional",
"master": "Master"
}
this.pauseOptions = [
"Continue",
"Retry",
......@@ -236,6 +248,7 @@ function StringsCn(){
this.normal = "普通"
this.hard = "困难"
this.oni = "魔王"
this.songBranch = "有谱面分歧"
this.sessionStart = "开始在线会话!"
this.sessionEnd = "结束在线会话"
this.loading = "加载中..."
......@@ -255,6 +268,11 @@ function StringsCn(){
this.good = ""
this.ok = ""
this.bad = "不可"
this.branch = {
"normal": "一般谱面",
"advanced": "进阶谱面",
"master": "达人谱面"
}
this.pauseOptions = [
"继续演奏",
"从头开始",
......@@ -337,6 +355,7 @@ function StringsTw(){
this.normal = "普通"
this.hard = "困難"
this.oni = "魔王"
this.songBranch = "有譜面分歧"
this.sessionStart = "開始多人模式!"
this.sessionEnd = "結束多人模式"
this.loading = "讀取中..."
......@@ -356,6 +375,11 @@ function StringsTw(){
this.good = ""
this.ok = ""
this.bad = "不可"
this.branch = {
"normal": "一般譜面",
"advanced": "進階譜面",
"master": "達人譜面"
}
this.pauseOptions = [
"繼續演奏",
"從頭開始",
......@@ -438,6 +462,7 @@ function StringsKo(){
this.normal = "보통"
this.hard = "어려움"
this.oni = "귀신"
this.songBranch = "악보 분기 있습니다"
this.sessionStart = "온라인 세션 시작!"
this.sessionEnd = "온라인 세션 끝내기"
this.loading = "로딩 중..."
......@@ -457,6 +482,11 @@ function StringsKo(){
this.good = "얼쑤"
this.ok = "좋다"
this.bad = "에구"
this.branch = {
"normal": "보통 악보",
"advanced": "현인 악보",
"master": "달인 악보"
}
this.pauseOptions = [
"연주 계속하기",
"처음부터 다시",
......
......@@ -18,7 +18,11 @@ class Titlescreen{
this.setLang(allStrings[this.lang], true)
if(songId){
this.goNext()
if(localStorage.getItem("tutorial") === "true"){
new SongSelect(false, false, this.touched, this.songId)
}else{
new Tutorial(false, this.songId)
}
}else{
this.addLangs()
......
This diff is collapsed.
......@@ -9,6 +9,17 @@
<div class="measure-num input-slider">
<span class="reset">x</span><input type="text" value="" readonly><span class="minus">-</span><span class="plus">+</span>
</div>
<div class="branch-hide">
<div>Branch:</div>
<div class="branch-select select">
<span class="reset">x</span><select>
<option value="auto" selected style="background:#fff">Auto</option>
<option value="normal" style="background:#ccc">Normal</option>
<option value="advanced" style="background:#bdf">Professional</option>
<option value="master" style="background:#ebf">Master</option>
</select>
</div>
</div>
<label><input class="change-restart" type="checkbox">Restart on change</label>
<label class="autoplay-label"><input class="autoplay" type="checkbox">Auto play</label>
<div class="bottom-btns">
......
......@@ -185,6 +185,7 @@ async def connection(ws, path):
if "other_user" in user and "ws" in user["other_user"]:
if type == "note"\
or type == "drumroll"\
or type == "branch"\
or type == "gameresults":
await user["other_user"]["ws"].send(msgobj(type, value))
elif type == "songsel" and user["session"]:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment