From 38f1384f27451c9e8e6434a32bf67177965a044f Mon Sep 17 00:00:00 2001 From: LoveEevee Date: Sun, 15 Mar 2020 18:00:23 +0300 Subject: [PATCH] ParseSong: Separate events from notes --- public/src/js/debug.js | 4 ++-- public/src/js/game.js | 21 ++++----------------- public/src/js/parseosu.js | 19 ++++++++++++++++--- public/src/js/parsetja.js | 15 ++++++++++++--- public/src/js/view.js | 20 ++++++++++++-------- 5 files changed, 46 insertions(+), 33 deletions(-) diff --git a/public/src/js/debug.js b/public/src/js/debug.js index 271d66a..ffaa253 100644 --- a/public/src/js/debug.js +++ b/public/src/js/debug.js @@ -147,8 +147,8 @@ class Debug{ 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 + if(this.measureNum > 0 && measures.length >= this.measureNum){ + var measureMS = measures[this.measureNum - 1].ms var game = this.controller.game game.started = true var timestamp = Date.now() diff --git a/public/src/js/game.js b/public/src/js/game.js index e03e1f5..58664b4 100644 --- a/public/src/js/game.js +++ b/public/src/js/game.js @@ -5,6 +5,7 @@ class Game{ this.songData = songData this.elapsedTime = 0 this.currentCircle = -1 + this.currentEvent = 0 this.updateCurrentCircle() this.combo = 0 this.rules = new GameRules(this) @@ -47,13 +48,7 @@ class Game{ } initTiming(){ // Date when the chrono is started (before the game begins) - var firstCircle - for(var i = 0; i < this.songData.circles.length; i++){ - firstCircle = this.songData.circles[i] - if(firstCircle.type !== "event"){ - break - } - } + var firstCircle = this.songData.circles[0] if(this.controller.calibrationMode){ var offsetTime = 0 }else{ @@ -238,9 +233,6 @@ class Game{ } } skipNote(circle){ - if(circle.type === "event"){ - return - } if(circle.section){ this.resetSection() } @@ -258,9 +250,6 @@ class Game{ checkPlays(){ var circles = this.songData.circles var circle = circles[this.currentCircle] - if(circle && circle.type === "event"){ - this.updateCurrentCircle() - } if(this.controller.autoPlayEnabled){ while(circle && this.controller.autoPlay(circle)){ @@ -469,9 +458,7 @@ class Game{ } getLastCircle(circles){ for(var i = circles.length; i--;){ - if(circles[i].type !== "event"){ - return circles[i] - } + return circles[i] } } whenLastCirclePlayed(){ @@ -623,7 +610,7 @@ class Game{ var circles = this.songData.circles do{ var circle = circles[++this.currentCircle] - }while(circle && (circle.branch && !circle.branch.active || circle.type === "event")) + }while(circle && (circle.branch && !circle.branch.active)) } getCurrentCircle(){ return this.currentCircle diff --git a/public/src/js/parseosu.js b/public/src/js/parseosu.js index 0ef70eb..f836cdf 100644 --- a/public/src/js/parseosu.js +++ b/public/src/js/parseosu.js @@ -48,6 +48,7 @@ class ParseOsu{ lastBeatInterval: 0, bpm: 0 } + this.events = [] this.generalInfo = this.parseGeneralInfo() this.metadata = this.parseMetadata() this.editor = this.parseEditor() @@ -244,6 +245,18 @@ class ParseOsu{ var circles = [] var circleID = 0 var indexes = this.getStartEndIndexes("HitObjects") + var lastBeatMS = this.beatInfo.beatInterval + var lastGogo = false + + var pushCircle = circle => { + circles.push(circle) + if(lastBeatMS !== circle.beatMS || lastGogo !== circle.gogoTime){ + lastBeatMS = circle.beatMS + lastGogo = circle.gogoTime + this.events.push(circle) + } + } + for(var i = indexes.start; i <= indexes.end; i++){ circleID++ var values = this.data[i].split(",") @@ -277,7 +290,7 @@ class ParseOsu{ var endTime = parseInt(values[this.osu.ENDTIME]) var hitMultiplier = this.difficultyRange(this.difficulty.overallDifficulty, 3, 5, 7.5) * 1.65 var requiredHits = Math.floor(Math.max(1, (endTime - start) / 1000 * hitMultiplier)) - circles.push(new Circle({ + pushCircle(new Circle({ id: circleID, start: start + this.offset, type: "balloon", @@ -304,7 +317,7 @@ class ParseOsu{ type = "drumroll" txt = strings.note.drumroll } - circles.push(new Circle({ + pushCircle(new Circle({ id: circleID, start: start + this.offset, type: type, @@ -339,7 +352,7 @@ class ParseOsu{ emptyValue = true } if(!emptyValue){ - circles.push(new Circle({ + pushCircle(new Circle({ id: circleID, start: start + this.offset, type: type, diff --git a/public/src/js/parsetja.js b/public/src/js/parsetja.js index 515266d..6c51ef1 100644 --- a/public/src/js/parsetja.js +++ b/public/src/js/parsetja.js @@ -43,6 +43,7 @@ this.metadata = this.parseMetadata() this.measures = [] this.beatInfo = {} + this.events = [] if(!metaOnly){ this.circles = this.parseCircles() } @@ -248,7 +249,12 @@ lastDrumroll = circleObj } - circles.push(circleObj) + if(note.event){ + this.events.push(circleObj) + } + if(note.type !== "event"){ + circles.push(circleObj) + } } else if (!(currentMeasure.length >= 24 && (!currentMeasure[i + 1] || currentMeasure[i + 1].type)) && !(currentMeasure.length >= 48 && (!currentMeasure[i + 2] || currentMeasure[i + 2].type || !currentMeasure[i + 3] || currentMeasure[i + 3].type))) { if (note_chain.length > 1 && currentMeasure.length >= 8) { @@ -266,9 +272,12 @@ } } var insertNote = circleObj => { - lastBpm = bpm - lastGogo = gogo if(circleObj){ + if(bpm !== lastBpm || gogo !== lastGogo){ + circleObj.event = true + lastBpm = bpm + lastGogo = gogo + } currentMeasure.push(circleObj) } } diff --git a/public/src/js/view.js b/public/src/js/view.js index 12e48b0..ba7ece8 100644 --- a/public/src/js/view.js +++ b/public/src/js/view.js @@ -1584,17 +1584,21 @@ // Start animation to gauge circle.animate(ms) } - if(ms - this.controller.audioLatency >= circle.ms && !circle.beatMSCopied && (!circle.branch || circle.branch.active)){ - if(this.beatInterval !== circle.beatMS){ - this.changeBeatInterval(circle.beatMS) + } + var game = this.controller.game + for(var i = 0; i < game.songData.events.length; i++){ + var event = game.songData.events[i] + if(ms - this.controller.audioLatency >= event.ms && !event.beatMSCopied && (!event.branch || event.branch.active)){ + if(this.beatInterval !== event.beatMS){ + this.changeBeatInterval(event.beatMS) } - circle.beatMSCopied = true + event.beatMSCopied = true } - if(ms - this.controller.audioLatency >= circle.ms && !circle.gogoChecked && (!circle.branch || circle.branch.active)){ - if(this.gogoTime != circle.gogoTime){ - this.toggleGogoTime(circle) + if(ms - this.controller.audioLatency >= event.ms && !event.gogoChecked && (!event.branch || event.branch.active)){ + if(this.gogoTime != event.gogoTime){ + this.toggleGogoTime(event) } - circle.gogoChecked = true + event.gogoChecked = true } } }