2018-10-15 02:08:05 +08:00
|
|
|
class Debug{
|
|
|
|
constructor(){
|
2018-10-15 06:00:40 +08:00
|
|
|
if(!assets.pages["debug"]){
|
|
|
|
return
|
|
|
|
}
|
2018-10-15 02:08:05 +08:00
|
|
|
this.debugDiv = document.createElement("div")
|
|
|
|
this.debugDiv.id = "debug"
|
|
|
|
this.debugDiv.innerHTML = assets.pages["debug"]
|
|
|
|
document.body.appendChild(this.debugDiv)
|
|
|
|
|
2019-02-18 00:26:46 +08:00
|
|
|
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]
|
2019-03-16 05:34:48 +08:00
|
|
|
this.volumeDiv = this.byClass("music-volume")
|
2019-02-18 00:26:46 +08:00
|
|
|
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")
|
2018-10-15 02:08:05 +08:00
|
|
|
|
|
|
|
this.moving = false
|
|
|
|
pageEvents.add(window, ["mousedown", "mouseup", "blur"], this.stopMove.bind(this))
|
2019-02-03 20:04:25 +08:00
|
|
|
pageEvents.mouseAdd(this, this.onMove.bind(this))
|
2018-10-15 02:08:05 +08:00
|
|
|
pageEvents.add(this.titleDiv, "mousedown", this.startMove.bind(this))
|
|
|
|
pageEvents.add(this.minimiseDiv, "click", this.minimise.bind(this))
|
2018-10-15 06:00:40 +08:00
|
|
|
pageEvents.add(this.restartBtn, "click", this.restartSong.bind(this))
|
|
|
|
pageEvents.add(this.exitBtn, "click", this.clean.bind(this))
|
2018-10-15 07:18:01 +08:00
|
|
|
pageEvents.add(this.autoplayCheckbox, "change", this.toggleAutoplay.bind(this))
|
2019-02-18 00:26:46 +08:00
|
|
|
pageEvents.add(this.branchSelect, "change", this.branchChange.bind(this))
|
|
|
|
pageEvents.add(this.branchResetBtn, "click", this.branchReset.bind(this))
|
2018-10-15 02:08:05 +08:00
|
|
|
|
2018-10-15 04:14:58 +08:00
|
|
|
this.offsetSlider = new InputSlider(this.offsetDiv, -60, 60, 3)
|
2018-10-15 02:08:05 +08:00
|
|
|
this.offsetSlider.onchange(this.offsetChange.bind(this))
|
|
|
|
|
2018-10-15 04:14:58 +08:00
|
|
|
this.measureNumSlider = new InputSlider(this.measureNumDiv, 0, 1000, 0)
|
|
|
|
this.measureNumSlider.onchange(this.measureNumChange.bind(this))
|
|
|
|
this.measureNumSlider.set(0)
|
|
|
|
|
2019-03-16 05:34:48 +08:00
|
|
|
this.volumeSlider = new InputSlider(this.volumeDiv, 0, 3, 2)
|
|
|
|
this.volumeSlider.onchange(this.volumeChange.bind(this))
|
|
|
|
this.volumeSlider.set(1)
|
|
|
|
|
2018-10-15 02:08:05 +08:00
|
|
|
this.moveTo(100, 100)
|
|
|
|
this.restore()
|
|
|
|
this.updateStatus()
|
Custom scripting, #song=, translations
- A song can be linked directly by adding "#song=<id>" to the url, replace `<id>` with the id in the database, after loading it jumps immediately jumps to the difficulty selection
- Added tutorial translations
- Fixed song preview not playing
- Use text fallback for the logo when there are no vectors
- Increased combo cache by 1 pixel
- A custom javascript file can be loaded from config.json by defining "custom_js" value
- Added lots of events to help writing custom js files: `version-link, title-screen, language-change, song-select, song-select-move, song-select-difficulty, song-select-back, about, about-link, tutorial, import-songs, import-songs-default, session, session-start, session-end, debug, load-song, load-song-player2, load-song-unfocused, load-song-cancel, load-song-error, game-start, key-events, p2-game-end, p2-disconnected, p2-abandoned, pause, unpause, pause-restart, pause-song-select, game-lag, scoresheet, scoresheet-player2`
- Event syntax example:
```js
addEventListener("game-start", event => {
console.log("game-start", event.detail)
})
```
2019-02-14 17:32:45 +08:00
|
|
|
pageEvents.send("debug")
|
2018-10-15 02:08:05 +08:00
|
|
|
}
|
2019-02-18 00:26:46 +08:00
|
|
|
byClass(name){
|
|
|
|
return this.debugDiv.getElementsByClassName(name)[0]
|
|
|
|
}
|
2018-10-15 02:08:05 +08:00
|
|
|
startMove(event){
|
|
|
|
if(event.which === 1){
|
|
|
|
event.stopPropagation()
|
|
|
|
this.moving = {
|
|
|
|
x: event.offsetX,
|
|
|
|
y: event.offsetY
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
onMove(event){
|
|
|
|
if(this.moving){
|
|
|
|
var x = event.clientX - this.moving.x
|
|
|
|
var y = event.clientY - this.moving.y
|
|
|
|
this.moveTo(x, y)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
stopMove(event){
|
|
|
|
var x = event.clientX - this.moving.x
|
|
|
|
var y = event.clientY - this.moving.y
|
|
|
|
var w = this.debugDiv.offsetWidth
|
|
|
|
var h = this.debugDiv.offsetHeight
|
|
|
|
if(x + w > innerWidth){
|
|
|
|
x = innerWidth - w
|
|
|
|
}
|
|
|
|
if(y + h > lastHeight){
|
|
|
|
y = lastHeight - h
|
|
|
|
}
|
|
|
|
if(x < 0){
|
|
|
|
x = 0
|
|
|
|
}
|
|
|
|
if(y < 0){
|
|
|
|
y = 0
|
|
|
|
}
|
|
|
|
this.moveTo(x, y)
|
|
|
|
this.moving = false
|
|
|
|
}
|
|
|
|
moveTo(x, y){
|
|
|
|
this.debugDiv.style.transform = "translate(" + x + "px, " + y + "px)"
|
|
|
|
}
|
|
|
|
restore(){
|
|
|
|
debugObj.state = "open"
|
|
|
|
this.debugDiv.style.display = ""
|
|
|
|
}
|
|
|
|
minimise(){
|
|
|
|
debugObj.state = "minimised"
|
|
|
|
this.debugDiv.style.display = "none"
|
|
|
|
}
|
|
|
|
updateStatus(){
|
|
|
|
if(debugObj.controller && !this.controller){
|
2019-02-18 00:26:46 +08:00
|
|
|
this.controller = debugObj.controller
|
|
|
|
|
2018-10-15 06:00:40 +08:00
|
|
|
this.restartBtn.style.display = "block"
|
2018-10-15 07:18:01 +08:00
|
|
|
this.autoplayLabel.style.display = "block"
|
2019-02-18 00:26:46 +08:00
|
|
|
if(this.controller.parsedSongData.branches){
|
|
|
|
this.branchHideDiv.style.display = "block"
|
|
|
|
}
|
2018-10-15 06:00:40 +08:00
|
|
|
|
2018-10-15 02:08:05 +08:00
|
|
|
var selectedSong = this.controller.selectedSong
|
2018-10-15 06:00:40 +08:00
|
|
|
this.defaultOffset = selectedSong.offset || 0
|
2018-10-15 02:08:05 +08:00
|
|
|
if(this.songFolder === selectedSong.folder){
|
2018-10-15 04:14:58 +08:00
|
|
|
this.offsetChange(this.offsetSlider.get(), true)
|
2019-02-18 00:26:46 +08:00
|
|
|
this.branchChange(null, true)
|
2019-03-16 05:34:48 +08:00
|
|
|
this.volumeChange(this.volumeSlider.get(), true)
|
2018-10-15 02:08:05 +08:00
|
|
|
}else{
|
|
|
|
this.songFolder = selectedSong.folder
|
|
|
|
this.offsetSlider.set(this.defaultOffset)
|
2019-02-18 00:26:46 +08:00
|
|
|
this.branchReset(null, true)
|
2019-03-16 05:34:48 +08:00
|
|
|
this.volumeSlider.set(this.controller.volume)
|
2018-10-15 02:08:05 +08:00
|
|
|
}
|
2018-10-15 04:14:58 +08:00
|
|
|
|
2019-02-21 04:48:21 +08:00
|
|
|
var measures = this.controller.parsedSongData.measures.filter((measure, i, array) => {
|
|
|
|
return i === 0 || Math.abs(measure.ms - array[i - 1].ms) > 0.01
|
|
|
|
})
|
2018-10-15 04:14:58 +08:00
|
|
|
this.measureNumSlider.setMinMax(0, measures.length - 1)
|
|
|
|
if(this.measureNum && measures.length > this.measureNum){
|
|
|
|
var measureMS = measures[this.measureNum].ms
|
|
|
|
var game = this.controller.game
|
|
|
|
game.started = true
|
2018-12-13 17:18:52 +08:00
|
|
|
var timestamp = Date.now()
|
2018-10-15 04:14:58 +08:00
|
|
|
var currentDate = timestamp - measureMS
|
|
|
|
game.startDate = currentDate
|
|
|
|
game.sndTime = timestamp - snd.buffer.getTime() * 1000
|
|
|
|
var circles = game.songData.circles
|
|
|
|
for(var i in circles){
|
2018-10-15 06:00:40 +08:00
|
|
|
game.currentCircle = i
|
2018-10-15 07:18:01 +08:00
|
|
|
if(circles[i].endTime >= measureMS){
|
2018-10-15 04:14:58 +08:00
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
2018-10-25 22:18:41 +08:00
|
|
|
if(game.mainMusicPlaying){
|
|
|
|
game.mainMusicPlaying = false
|
|
|
|
game.mainAsset.stop()
|
|
|
|
}
|
2018-10-15 04:14:58 +08:00
|
|
|
}
|
2018-10-15 07:18:01 +08:00
|
|
|
this.autoplayCheckbox.checked = this.controller.autoPlayEnabled
|
2018-10-15 02:08:05 +08:00
|
|
|
}
|
|
|
|
if(this.controller && !debugObj.controller){
|
2018-10-15 06:00:40 +08:00
|
|
|
this.restartBtn.style.display = ""
|
2018-10-15 07:18:01 +08:00
|
|
|
this.autoplayLabel.style.display = ""
|
2019-02-18 00:26:46 +08:00
|
|
|
this.branchHideDiv.style.display = ""
|
2018-10-15 02:08:05 +08:00
|
|
|
this.controller = null
|
|
|
|
}
|
|
|
|
}
|
2018-10-15 04:14:58 +08:00
|
|
|
offsetChange(value, noRestart){
|
2018-10-15 02:08:05 +08:00
|
|
|
if(this.controller){
|
|
|
|
var offset = (this.defaultOffset - value) * 1000
|
|
|
|
var songData = this.controller.parsedSongData
|
|
|
|
songData.circles.forEach(circle => {
|
|
|
|
circle.ms = circle.originalMS + offset
|
|
|
|
circle.endTime = circle.originalEndTime + offset
|
|
|
|
})
|
|
|
|
songData.measures.forEach(measure => {
|
|
|
|
measure.ms = measure.originalMS + offset
|
|
|
|
})
|
2019-02-18 00:26:46 +08:00
|
|
|
if(songData.branches){
|
|
|
|
songData.branches.forEach(branch => {
|
|
|
|
branch.ms = branch.originalMS + offset
|
|
|
|
})
|
|
|
|
}
|
2018-10-15 06:00:40 +08:00
|
|
|
if(this.restartCheckbox.checked && !noRestart){
|
|
|
|
this.restartSong()
|
2018-10-15 04:14:58 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
measureNumChange(value){
|
|
|
|
this.measureNum = value
|
2018-10-15 06:00:40 +08:00
|
|
|
if(this.restartCheckbox.checked){
|
|
|
|
this.restartSong()
|
|
|
|
}
|
|
|
|
}
|
2019-03-16 05:34:48 +08:00
|
|
|
volumeChange(value, noRestart){
|
|
|
|
if(this.controller){
|
|
|
|
snd.musicGain.setVolumeMul(value)
|
|
|
|
}
|
|
|
|
if(this.restartCheckbox.checked && !noRestart){
|
|
|
|
this.restartSong()
|
|
|
|
}
|
|
|
|
}
|
2018-10-15 06:00:40 +08:00
|
|
|
restartSong(){
|
|
|
|
if(this.controller){
|
2018-10-15 04:14:58 +08:00
|
|
|
this.controller.restartSong()
|
2018-10-15 02:08:05 +08:00
|
|
|
}
|
|
|
|
}
|
2018-10-15 07:18:01 +08:00
|
|
|
toggleAutoplay(){
|
|
|
|
if(this.controller){
|
|
|
|
this.controller.autoPlayEnabled = this.autoplayCheckbox.checked
|
|
|
|
if(!this.controller.autoPlayEnabled){
|
|
|
|
var keyboard = debugObj.controller.keyboard
|
|
|
|
var kbd = keyboard.getBindings()
|
|
|
|
keyboard.setKey(kbd.don_l, false)
|
|
|
|
keyboard.setKey(kbd.don_r, false)
|
|
|
|
keyboard.setKey(kbd.ka_l, false)
|
|
|
|
keyboard.setKey(kbd.ka_r, false)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-02-18 00:26:46 +08:00
|
|
|
branchChange(event, noRestart){
|
|
|
|
if(this.controller){
|
|
|
|
var game = this.controller.game
|
|
|
|
var name = this.branchSelect.value
|
|
|
|
game.branch = name === "auto" ? false : name
|
2019-02-21 04:48:21 +08:00
|
|
|
game.branchSet = name === "auto"
|
|
|
|
var selectedOption = this.branchSelect.selectedOptions[0]
|
|
|
|
this.branchSelect.style.background = selectedOption.style.background
|
2019-02-18 00:26:46 +08:00
|
|
|
if(this.restartCheckbox.checked && !noRestart){
|
|
|
|
this.restartSong()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
branchReset(event, noRestart){
|
|
|
|
this.branchSelect.value = "auto"
|
|
|
|
this.branchChange(null, noRestart)
|
|
|
|
}
|
2018-10-15 02:08:05 +08:00
|
|
|
clean(){
|
|
|
|
this.offsetSlider.clean()
|
2019-02-18 00:26:46 +08:00
|
|
|
this.measureNumSlider.clean()
|
2018-10-15 02:08:05 +08:00
|
|
|
|
2019-02-03 20:04:25 +08:00
|
|
|
pageEvents.remove(window, ["mousedown", "mouseup", "blur"])
|
|
|
|
pageEvents.mouseRemove(this)
|
2019-02-18 00:26:46 +08:00
|
|
|
pageEvents.remove(this.titleDiv, "mousedown")
|
2018-10-15 02:08:05 +08:00
|
|
|
pageEvents.remove(this.title, "mousedown")
|
2018-10-15 07:18:01 +08:00
|
|
|
pageEvents.remove(this.minimiseDiv, "click")
|
|
|
|
pageEvents.remove(this.restartBtn, "click")
|
|
|
|
pageEvents.remove(this.exitBtn, "click")
|
|
|
|
pageEvents.remove(this.autoplayCheckbox, "change")
|
2019-02-18 00:26:46 +08:00
|
|
|
pageEvents.remove(this.branchSelect, "change")
|
|
|
|
pageEvents.remove(this.branchResetBtn, "click")
|
2018-10-15 02:08:05 +08:00
|
|
|
|
|
|
|
delete this.titleDiv
|
|
|
|
delete this.minimiseDiv
|
2018-10-15 07:18:01 +08:00
|
|
|
delete this.offsetDiv
|
|
|
|
delete this.measureNumDiv
|
2019-02-18 00:26:46 +08:00
|
|
|
delete this.branchHideDiv
|
|
|
|
delete this.branchSelectDiv
|
|
|
|
delete this.branchSelect
|
|
|
|
delete this.branchResetBtn
|
2019-03-16 05:34:48 +08:00
|
|
|
delete this.volumeDiv
|
2018-10-15 07:18:01 +08:00
|
|
|
delete this.restartCheckbox
|
|
|
|
delete this.autoplayLabel
|
|
|
|
delete this.autoplayCheckbox
|
|
|
|
delete this.restartBtn
|
|
|
|
delete this.exitBtn
|
2018-10-15 02:08:05 +08:00
|
|
|
delete this.controller
|
|
|
|
|
|
|
|
debugObj.state = "closed"
|
|
|
|
debugObj.debug = null
|
|
|
|
document.body.removeChild(this.debugDiv)
|
2018-10-15 04:14:58 +08:00
|
|
|
|
|
|
|
delete this.debugDiv
|
2018-10-15 02:08:05 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
class InputSlider{
|
2018-10-15 04:14:58 +08:00
|
|
|
constructor(sliderDiv, min, max, fixedPoint){
|
|
|
|
this.fixedPoint = fixedPoint
|
|
|
|
this.mul = Math.pow(10, fixedPoint)
|
|
|
|
this.min = min * this.mul
|
|
|
|
this.max = max * this.mul
|
|
|
|
|
2018-10-15 02:08:05 +08:00
|
|
|
this.input = sliderDiv.getElementsByTagName("input")[0]
|
|
|
|
this.reset = sliderDiv.getElementsByClassName("reset")[0]
|
|
|
|
this.plus = sliderDiv.getElementsByClassName("plus")[0]
|
|
|
|
this.minus = sliderDiv.getElementsByClassName("minus")[0]
|
|
|
|
this.value = null
|
|
|
|
this.defaultValue = null
|
|
|
|
this.callbacks = []
|
|
|
|
|
|
|
|
pageEvents.add(this.plus, "click", this.add.bind(this))
|
|
|
|
pageEvents.add(this.minus, "click", this.subtract.bind(this))
|
|
|
|
pageEvents.add(this.reset, "click", this.resetValue.bind(this))
|
|
|
|
pageEvents.add(this.input, "change", this.manualSet.bind(this))
|
2018-10-15 04:14:58 +08:00
|
|
|
pageEvents.add(this.input, "keydown", this.captureKeys.bind(this))
|
2018-10-15 02:08:05 +08:00
|
|
|
}
|
|
|
|
update(noCallback, force){
|
|
|
|
var oldValue = this.input.value
|
|
|
|
if(this.value === null){
|
|
|
|
this.input.value = ""
|
|
|
|
this.input.readOnly = true
|
|
|
|
}else{
|
2018-10-15 04:14:58 +08:00
|
|
|
if(this.value > this.max){
|
|
|
|
this.value = this.max
|
2018-10-15 02:08:05 +08:00
|
|
|
}
|
2018-10-15 04:14:58 +08:00
|
|
|
if(this.value < this.min){
|
|
|
|
this.value = this.min
|
2018-10-15 02:08:05 +08:00
|
|
|
}
|
2018-10-15 04:14:58 +08:00
|
|
|
this.input.value = this.get().toFixed(this.fixedPoint)
|
2018-10-15 02:08:05 +08:00
|
|
|
this.input.readOnly = false
|
|
|
|
}
|
|
|
|
if(force || !noCallback && oldValue !== this.input.value){
|
|
|
|
this.callbacks.forEach(callback => {
|
2018-10-15 04:14:58 +08:00
|
|
|
callback(this.get())
|
2018-10-15 02:08:05 +08:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
set(number){
|
2018-10-15 04:14:58 +08:00
|
|
|
this.value = Math.floor(number * this.mul)
|
2018-10-15 02:08:05 +08:00
|
|
|
this.defaultValue = this.value
|
|
|
|
this.update(true)
|
|
|
|
}
|
2018-10-15 04:14:58 +08:00
|
|
|
setMinMax(min, max){
|
|
|
|
this.min = min
|
|
|
|
this.max = max
|
|
|
|
this.update()
|
|
|
|
}
|
2018-10-15 02:08:05 +08:00
|
|
|
get(){
|
|
|
|
if(this.value === null){
|
|
|
|
return null
|
|
|
|
}else{
|
2018-10-15 04:14:58 +08:00
|
|
|
return Math.floor(this.value) / this.mul
|
2018-10-15 02:08:05 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
add(event){
|
|
|
|
if(this.value !== null){
|
|
|
|
var newValue = this.value + this.eventNumber(event)
|
2018-10-15 04:14:58 +08:00
|
|
|
if(newValue <= this.max){
|
2018-10-15 02:08:05 +08:00
|
|
|
this.value = newValue
|
|
|
|
this.update()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
subtract(event){
|
|
|
|
if(this.value !== null){
|
|
|
|
var newValue = this.value - this.eventNumber(event)
|
2018-10-15 04:14:58 +08:00
|
|
|
if(newValue >= this.min){
|
2018-10-15 02:08:05 +08:00
|
|
|
this.value = newValue
|
|
|
|
this.update()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
eventNumber(event){
|
|
|
|
return (event.ctrlKey ? 10 : 1) * (event.shiftKey ? 10 : 1) * (event.altKey ? 10 : 1) * 1
|
|
|
|
}
|
|
|
|
resetValue(){
|
|
|
|
this.value = this.defaultValue
|
|
|
|
this.update()
|
|
|
|
}
|
|
|
|
onchange(callback){
|
|
|
|
this.callbacks.push(callback)
|
|
|
|
}
|
|
|
|
manualSet(){
|
2018-10-15 04:14:58 +08:00
|
|
|
var number = parseFloat(this.input.value) * this.mul
|
|
|
|
if(Number.isFinite(number) && this.min <= number && number <= this.max){
|
|
|
|
this.value = number
|
2018-10-15 02:08:05 +08:00
|
|
|
}
|
|
|
|
this.update(false, true)
|
|
|
|
}
|
2018-10-15 04:14:58 +08:00
|
|
|
captureKeys(event){
|
|
|
|
event.stopPropagation()
|
|
|
|
}
|
2018-10-15 02:08:05 +08:00
|
|
|
clean(){
|
|
|
|
pageEvents.remove(this.plus, "click")
|
|
|
|
pageEvents.remove(this.minus, "click")
|
|
|
|
pageEvents.remove(this.reset, "click")
|
2018-10-15 04:14:58 +08:00
|
|
|
pageEvents.remove(this.input, ["change", "keydown"])
|
2018-10-15 02:08:05 +08:00
|
|
|
|
|
|
|
delete this.input
|
|
|
|
delete this.reset
|
|
|
|
delete this.plus
|
|
|
|
delete this.minus
|
|
|
|
}
|
|
|
|
}
|