SongSelect: Add ura difficulty

This commit is contained in:
LoveEevee 2018-10-12 21:04:28 +03:00
parent 6ccdc18ec6
commit f80565f25b
17 changed files with 141 additions and 70 deletions

View File

@ -10,7 +10,7 @@ Still in developement. Works best with Chrome.
Create a SQLite databse named `taiko.db` with the following schema: Create a SQLite databse named `taiko.db` with the following schema:
CREATE TABLE "songs" ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `title` TEXT NOT NULL, `title_en` TEXT, `easy` INTEGER, `normal` INTEGER, `hard` INTEGER, `oni` INTEGER, `enabled` INTEGER NOT NULL, `category` INTEGER, `type` TEXT , `offset` REAL NOT NULL ) CREATE TABLE "songs" ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `title` TEXT NOT NULL, `title_en` TEXT, `easy` INTEGER, `normal` INTEGER, `hard` INTEGER, `oni` INTEGER, `ura` INTEGER, `enabled` INTEGER NOT NULL, `category` INTEGER, `type` TEXT , `offset` REAL NOT NULL )
CREATE TABLE "categories" ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `title` TEXT NOT NULL, `title_en` TEXT NOT NULL ) CREATE TABLE "categories" ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `title` TEXT NOT NULL, `title_en` TEXT NOT NULL )
When inserting song rows, leave any difficulty columns as NULL if you don't intend to add notecharts for them. When inserting song rows, leave any difficulty columns as NULL if you don't intend to add notecharts for them.

19
app.py
View File

@ -105,33 +105,34 @@ def route_api_songs():
categories[cat[0]] = {'title': cat[1], 'title_en': cat[2]} categories[cat[0]] = {'title': cat[1], 'title_en': cat[2]}
songs_out = [] songs_out = []
for song in songs: for song in songs:
type = song[9] id = song[0]
type = song[10]
if type == "tja": if type == "tja":
if os.path.isfile('public/songs/%s/main.tja' % song[0]): if os.path.isfile('public/songs/%s/main.tja' % id):
preview = get_tja_preview('public/songs/%s/main.tja' % song[0]) preview = get_tja_preview('public/songs/%s/main.tja' % id)
else: else:
preview = 0 preview = 0
else: else:
osus = [osu for osu in os.listdir('public/songs/%s' % song[0]) if osu in ['easy.osu', 'normal.osu', 'hard.osu', 'oni.osu']] osus = [osu for osu in os.listdir('public/songs/%s' % id) if osu in ['easy.osu', 'normal.osu', 'hard.osu', 'oni.osu']]
if osus: if osus:
osud = parse_osu('public/songs/%s/%s' % (song[0], osus[0])) osud = parse_osu('public/songs/%s/%s' % (id, osus[0]))
preview = int(get_osu_key(osud, 'General', 'PreviewTime', 0)) preview = int(get_osu_key(osud, 'General', 'PreviewTime', 0))
else: else:
preview = 0 preview = 0
category_out = categories[song[8]] if song[8] in categories else def_category category_out = categories[song[9]] if song[9] in categories else def_category
songs_out.append({ songs_out.append({
'id': song[0], 'id': id,
'title': song[1], 'title': song[1],
'title_en': song[2], 'title_en': song[2],
'stars': [ 'stars': [
song[3], song[4], song[5], song[6] song[3], song[4], song[5], song[6], song[7]
], ],
'preview': preview, 'preview': preview,
'category': category_out['title'], 'category': category_out['title'],
'category_en': category_out['title_en'], 'category_en': category_out['title_en'],
'type': type, 'type': type,
'offset': song[10] 'offset': song[11]
}) })
return jsonify(songs_out) return jsonify(songs_out)

View File

@ -61,6 +61,7 @@
height: 50%; height: 50%;
text-align: center; text-align: center;
margin: auto; margin: auto;
overflow: hidden;
} }
#touch-drum-img{ #touch-drum-img{
width: 100%; width: 100%;

View File

@ -13,6 +13,7 @@ body{
height: 100%; height: 100%;
background: #fe7839; background: #fe7839;
user-select: none; user-select: none;
touch-action: none;
} }
#screen{ #screen{
width: 100%; width: 100%;

View File

@ -508,7 +508,7 @@
ctx.save() ctx.save()
ctx.lineWidth = config.border ctx.lineWidth = config.border
ctx.strokeStyle = "#000" ctx.strokeStyle = "#000"
var icon = this.diffIconPath[config.diff] var icon = this.diffIconPath[config.diff === 4 ? 3 : config.diff]
ctx.translate(config.x - icon[0].w * scale / 2, config.y - icon[0].h * scale / 2) ctx.translate(config.x - icon[0].w * scale / 2, config.y - icon[0].h * scale / 2)
ctx.scale(scale, scale) ctx.scale(scale, scale)
for(var i = 1; i < icon.length; i++){ for(var i = 1; i < icon.length; i++){
@ -518,7 +518,11 @@
} }
if(!config.noFill){ if(!config.noFill){
for(var i = 1; i < icon.length; i++){ for(var i = 1; i < icon.length; i++){
ctx.fillStyle = icon[i].fill if(config.diff === 4 && icon[i].fill === "#db1885"){
ctx.fillStyle = "#7135db"
}else{
ctx.fillStyle = icon[i].fill
}
ctx.fill(icon[i].d) ctx.fill(icon[i].d)
} }
} }

View File

@ -43,14 +43,12 @@ class Controller{
this.continueBtn = document.getElementById("continue-butt") this.continueBtn = document.getElementById("continue-butt")
this.restartBtn = document.getElementById("restart-butt") this.restartBtn = document.getElementById("restart-butt")
this.songSelBtn = document.getElementById("song-selection-butt") this.songSelBtn = document.getElementById("song-selection-butt")
pageEvents.add(this.continueBtn, "click", () => { pageEvents.add(this.continueBtn, ["click", "touchend"], this.togglePauseMenu.bind(this))
this.togglePauseMenu() pageEvents.add(this.restartBtn, ["click", "touchend"], () => {
})
pageEvents.add(this.restartBtn, "click", () => {
assets.sounds["don"].play() assets.sounds["don"].play()
this.restartSong() this.restartSong()
}) })
pageEvents.add(this.songSelBtn, "click", () => { pageEvents.add(this.songSelBtn, ["click", "touchend"], () => {
assets.sounds["don"].play() assets.sounds["don"].play()
this.songSelection() this.songSelection()
}) })
@ -63,9 +61,6 @@ class Controller{
stopMainLoop(){ stopMainLoop(){
this.mainLoopRunning = false this.mainLoopRunning = false
this.mainAsset.stop() this.mainAsset.stop()
if(this.syncWith){
this.syncWith.stopMainLoop()
}
} }
mainLoop(){ mainLoop(){
if(this.mainLoopRunning){ if(this.mainLoopRunning){
@ -212,11 +207,11 @@ class Controller{
this.keyboard.clean() this.keyboard.clean()
this.view.clean() this.view.clean()
pageEvents.remove(this.continueBtn, "click") pageEvents.remove(this.continueBtn, ["click", "touchend"])
delete this.continueBtn delete this.continueBtn
pageEvents.remove(this.restartBtn, "click") pageEvents.remove(this.restartBtn, ["click", "touchend"])
delete this.restartBtn delete this.restartBtn
pageEvents.remove(this.songSelBtn, "click") pageEvents.remove(this.songSelBtn, ["click", "touchend"])
delete this.songSelBtn delete this.songSelBtn
} }
} }

View File

@ -12,6 +12,7 @@ class GameRules{
break break
case "hard": case "hard":
case "oni": case "oni":
case "ura":
this.good = 3 / 2 * frame this.good = 3 / 2 * frame
this.ok = 9 / 2 * frame this.ok = 9 / 2 * frame
this.bad = 13 / 2 * frame this.bad = 13 / 2 * frame

View File

@ -6,6 +6,10 @@ class Loader{
this.canvasTest = new CanvasTest() this.canvasTest = new CanvasTest()
p2 = new P2Connection() p2 = new P2Connection()
this.ajax("src/views/loader.html").then(this.run.bind(this)) this.ajax("src/views/loader.html").then(this.run.bind(this))
pageEvents.add(root, ["touchstart", "touchmove", "touchend"], event => {
event.preventDefault()
})
} }
run(page){ run(page){
this.promises = [] this.promises = []
@ -152,5 +156,6 @@ class Loader{
delete this.loaderPercentage delete this.loaderPercentage
delete this.loaderProgress delete this.loaderProgress
delete this.promises delete this.promises
pageEvents.remove(root, "touchstart")
} }
} }

View File

@ -1,5 +1,4 @@
function toggleFullscreen(){ function toggleFullscreen(){
var root = document.documentElement
if("requestFullscreen" in root){ if("requestFullscreen" in root){
if(document.fullscreenElement){ if(document.fullscreenElement){
document.exitFullscreen() document.exitFullscreen()
@ -20,6 +19,8 @@ function toggleFullscreen(){
} }
} }
} }
var root = document.documentElement
var fullScreenSupported = "requestFullscreen" in root || "webkitRequestFullscreen" in root || "mozRequestFullScreen" in root
var pageEvents = new PageEvents() var pageEvents = new PageEvents()
var snd = {} var snd = {}

View File

@ -8,6 +8,10 @@ class PageEvents{
this.add(window, "mousemove", this.mouseEvent.bind(this)) this.add(window, "mousemove", this.mouseEvent.bind(this))
} }
add(target, type, callback){ add(target, type, callback){
if(Array.isArray(type)){
type.forEach(type => this.add(target, type, callback))
return
}
this.remove(target, type) this.remove(target, type)
var addedEvent = this.allEvents.get(target) var addedEvent = this.allEvents.get(target)
if(!addedEvent){ if(!addedEvent){
@ -18,6 +22,10 @@ class PageEvents{
return target.addEventListener(type, callback) return target.addEventListener(type, callback)
} }
remove(target, type){ remove(target, type){
if(Array.isArray(type)){
type.forEach(type => this.remove(target, type))
return
}
var addedEvent = this.allEvents.get(target) var addedEvent = this.allEvents.get(target)
if(addedEvent){ if(addedEvent){
var callback = addedEvent.get(type) var callback = addedEvent.get(type)

View File

@ -22,7 +22,14 @@
{name: false, txt: false}, {name: false, txt: false},
{name: "balloon", txt: "ふうせん"} {name: "balloon", txt: "ふうせん"}
] ]
this.courseTypes = ["easy", "normal", "hard", "oni"] this.courseTypes = {
"0": "easy",
"1": "normal",
"2": "hard",
"3": "oni",
"4": "ura",
"edit": "ura"
}
this.metadata = this.parseMetadata() this.metadata = this.parseMetadata()
this.measures = [] this.measures = []
@ -67,10 +74,11 @@
value = value.trim() value = value.trim()
if(name === "course"){ if(name === "course"){
value = value.toLowerCase()
if(value in this.courseTypes){ if(value in this.courseTypes){
courseName = this.courseTypes[value] courseName = this.courseTypes[value]
}else{ }else{
courseName = value.toLowerCase() courseName = value
} }
}else if(name === "balloon"){ }else if(name === "balloon"){
value = value ? value.split(",").map(digit => parseInt(digit)) : [] value = value ? value.split(",").map(digit => parseInt(digit)) : []

View File

@ -89,8 +89,7 @@ class Scoresheet{
this.winH = null this.winH = null
pageEvents.keyAdd(this, "all", "down", this.keyDown.bind(this)) pageEvents.keyAdd(this, "all", "down", this.keyDown.bind(this))
pageEvents.add(this.canvas, "mousedown", this.mouseDown.bind(this)) pageEvents.add(this.canvas, ["mousedown", "touchstart"], this.mouseDown.bind(this))
pageEvents.add(this.canvas, "touchstart", this.mouseDown.bind(this))
} }
redraw(){ redraw(){
@ -291,7 +290,8 @@ class Scoresheet{
} }
var imgScale = 1.35 var imgScale = 1.35
ctx.drawImage(assets.image["muzu_" + results.difficulty], var diffImage = results.difficulty === "ura" ? "oni" : results.difficulty
ctx.drawImage(assets.image["muzu_" + diffImage],
276, 150, imgScale * 176, imgScale * 120 276, 150, imgScale * 176, imgScale * 120
) )
@ -670,8 +670,7 @@ class Scoresheet{
snd.musicGain.fadeIn() snd.musicGain.fadeIn()
this.redrawRunning = false this.redrawRunning = false
pageEvents.keyRemove(this, "all") pageEvents.keyRemove(this, "all")
pageEvents.remove(this.canvas, "mousedown") pageEvents.remove(this.canvas, ["mousedown", "touchstart"])
pageEvents.remove(this.canvas, "touchstart")
delete this.ctx delete this.ctx
delete this.canvas delete this.canvas
} }

View File

@ -149,7 +149,7 @@ class SongSelect{
this.difficultyCache = new CanvasCache() this.difficultyCache = new CanvasCache()
this.difficulty = ["かんたん", "ふつう", "むずかしい", "おに"] this.difficulty = ["かんたん", "ふつう", "むずかしい", "おに"]
this.difficultyId = ["easy", "normal", "hard", "oni"] this.difficultyId = ["easy", "normal", "hard", "oni", "ura"]
this.selectedSong = 0 this.selectedSong = 0
this.selectedDiff = 0 this.selectedDiff = 0
@ -181,6 +181,7 @@ class SongSelect{
screenMS: this.getMS(), screenMS: this.getMS(),
move: 0, move: 0,
moveMS: 0, moveMS: 0,
ura: 0,
moveHover: null, moveHover: null,
locked: true, locked: true,
hasPointer: false hasPointer: false
@ -210,12 +211,11 @@ class SongSelect{
this.redraw() this.redraw()
pageEvents.keyAdd(this, "all", "down", this.keyDown.bind(this)) pageEvents.keyAdd(this, "all", "down", this.keyDown.bind(this))
pageEvents.add(this.canvas, "mousemove", this.mouseMove.bind(this)) pageEvents.add(this.canvas, "mousemove", this.mouseMove.bind(this))
pageEvents.add(this.canvas, "mousedown", this.mouseDown.bind(this)) pageEvents.add(this.canvas, ["mousedown", "touchstart"], this.mouseDown.bind(this))
pageEvents.add(this.canvas, "touchstart", this.mouseDown.bind(this)) if(touchEnabled && fullScreenSupported){
if(touchEnabled){
this.touchFullBtn = document.getElementById("touch-full-btn") this.touchFullBtn = document.getElementById("touch-full-btn")
this.touchFullBtn.style.display = "block" this.touchFullBtn.style.display = "block"
pageEvents.add(this.touchFullBtn, "click", toggleFullscreen) pageEvents.add(this.touchFullBtn, "touchend", toggleFullscreen)
} }
} }
@ -306,6 +306,12 @@ class SongSelect{
|| mouse.y < 40 || mouse.y > 540 || mouse.y < 40 || mouse.y > 540
){ ){
this.toSongSelect() this.toSongSelect()
}else if(moveBy === 5){
this.state.ura = !this.state.ura
assets.sounds["ka"].play()
if(this.selectedDiff === 5 && !this.state.ura){
this.state.move = -1
}
}else if(moveBy !== null){ }else if(moveBy !== null){
this.toLoadSong(moveBy - 1, shift, ctrl, touch) this.toLoadSong(moveBy - 1, shift, ctrl, touch)
} }
@ -370,10 +376,10 @@ class SongSelect{
if(this.state.locked === 0){ if(this.state.locked === 0){
if(100 < x && x < 160 && 120 < y && y < 420){ if(100 < x && x < 160 && 120 < y && y < 420){
return 0 return 0
}else if(434 < x && x < 810 && 95 < y && y < 524){ }else if(422 < x && x < 922 && 95 < y && y < 524){
var moveBy = Math.floor((x - 434) / ((810 - 434) / 4)) + 1 var moveBy = Math.floor((x - 422) / ((922 - 422) / 5)) + 1
var currentSong = this.songs[this.selectedSong] var currentSong = this.songs[this.selectedSong]
if(currentSong.stars[moveBy - 1]){ if(this.state.ura && moveBy === 4 || currentSong.stars[moveBy - 1]){
return moveBy return moveBy
} }
} }
@ -425,6 +431,7 @@ class SongSelect{
this.state.screenMS = this.getMS() this.state.screenMS = this.getMS()
this.state.locked = true this.state.locked = true
this.state.moveHover = null this.state.moveHover = null
this.state.ura = 0
assets.sounds["don"].play() assets.sounds["don"].play()
assets.sounds["song-select"].stop() assets.sounds["song-select"].stop()
@ -468,6 +475,10 @@ class SongSelect{
localStorage["selectedSong"] = this.selectedSong localStorage["selectedSong"] = this.selectedSong
localStorage["selectedDiff"] = difficulty + 1 localStorage["selectedDiff"] = difficulty + 1
if(difficulty === 3 && this.state.ura){
difficulty = 4
}
new loadSong({ new loadSong({
"title": selectedSong.title, "title": selectedSong.title,
"folder": selectedSong.id, "folder": selectedSong.id,
@ -698,9 +709,28 @@ class SongSelect{
this.state.locked = 0 this.state.locked = 0
} }
if(this.state.move){ if(this.state.move){
var hasUra = currentSong.stars[4]
var previousSelection = this.selectedDiff
do{ do{
this.selectedDiff = this.mod(5, this.selectedDiff + this.state.move) if(hasUra && this.state.move > 0){
}while(this.selectedDiff !== 0 && !currentSong.stars[this.selectedDiff - 1]) this.selectedDiff += this.state.move
if(this.selectedDiff > 5){
this.state.ura = !this.state.ura
if(this.state.ura){
this.selectedDiff = previousSelection === 4 ? 5 : previousSelection
break
}else{
this.state.move = -1
}
}
}else{
this.selectedDiff = this.mod(6, this.selectedDiff + this.state.move)
}
}while(
this.selectedDiff !== 0 && !currentSong.stars[this.selectedDiff - 1]
|| this.selectedDiff === 4 && this.state.ura
|| this.selectedDiff === 5 && !this.state.ura
)
this.state.move = 0 this.state.move = 0
}else if(!currentSong.stars[this.selectedDiff - 1]){ }else if(!currentSong.stars[this.selectedDiff - 1]){
this.selectedDiff = 0 this.selectedDiff = 0
@ -904,7 +934,8 @@ class SongSelect{
} }
} }
for(var i = 0; currentSong.stars && i < 4; i++){ for(var i = 0; currentSong.stars && i < 4; i++){
if(currentSong.stars[i]){ var currentUra = !songSel && i === 3 && this.state.ura
if(currentSong.stars[i] || currentUra){
if(songSel){ if(songSel){
var _x = x + 33 + i * 60 var _x = x + 33 + i * 60
var _y = y + 120 var _y = y + 120
@ -943,7 +974,7 @@ class SongSelect{
ctx.strokeRect(_x - 28, _y + 19, 56, 351) ctx.strokeRect(_x - 28, _y + 19, 56, 351)
this.draw.diffIcon({ this.draw.diffIcon({
ctx: ctx, ctx: ctx,
diff: i, diff: currentUra ? 4 : i,
x: _x, x: _x,
y: _y - 12, y: _y - 12,
scale: 1.4, scale: 1.4,
@ -971,13 +1002,14 @@ class SongSelect{
fontFamily: this.font fontFamily: this.font
}) })
}) })
var songStars = currentUra ? currentSong.stars[4] : currentSong.stars[i]
for(var j = 0; j < 10; j++){ for(var j = 0; j < 10; j++){
if(songSel){ if(songSel){
var yPos = _y + 113 + j * 17 var yPos = _y + 113 + j * 17
}else{ }else{
var yPos = _y + 178 + j * 19.5 var yPos = _y + 178 + j * 19.5
} }
if(10 - j > currentSong.stars[i]){ if(10 - j > songStars){
ctx.fillStyle = songSel ? "#e97526" : "#e7e7e7" ctx.fillStyle = songSel ? "#e97526" : "#e7e7e7"
ctx.beginPath() ctx.beginPath()
ctx.arc(_x, yPos, songSel ? 4.5 : 5, 0, Math.PI * 2) ctx.arc(_x, yPos, songSel ? 4.5 : 5, 0, Math.PI * 2)
@ -992,6 +1024,10 @@ class SongSelect{
}) })
} }
} }
var currentDiff = this.selectedDiff - 1
if(this.selectedDiff === 5){
currentDiff = 3
}
if(i === currentSong.p2Cursor){ if(i === currentSong.p2Cursor){
this.draw.diffCursor({ this.draw.diffCursor({
ctx: ctx, ctx: ctx,
@ -999,13 +1035,12 @@ class SongSelect{
x: _x, x: _x,
y: _y - (songSel ? 45 : 65), y: _y - (songSel ? 45 : 65),
two: true, two: true,
side: songSel ? false : (currentSong.p2Cursor === this.selectedDiff - 1), side: songSel ? false : (currentSong.p2Cursor === currentDiff),
scale: songSel ? 0.7 : 1 scale: songSel ? 0.7 : 1
}) })
} }
if(!songSel){ if(!songSel){
var highlight = 0 var highlight = 0
var currentDiff = this.selectedDiff - 1
if(this.state.moveHover - 1 === i){ if(this.state.moveHover - 1 === i){
highlight = 2 highlight = 2
}else if(currentDiff === i){ }else if(currentDiff === i){
@ -1035,6 +1070,17 @@ class SongSelect{
} }
} }
} }
if(!songSel && currentSong.stars[4]){
var _x = x + 402 + 4 * 100
var _y = y + 258
ctx.fillStyle = "#e0be28"
ctx.beginPath()
ctx.moveTo(_x - 35, _y - 25)
ctx.lineTo(_x - 10, _y)
ctx.lineTo(_x - 35, _y + 25)
ctx.fill()
}
ctx.globalAlpha = 1 - Math.max(0, opened - 0.5) * 2 ctx.globalAlpha = 1 - Math.max(0, opened - 0.5) * 2
ctx.fillStyle = selectedSkin.background ctx.fillStyle = selectedSkin.background
ctx.fillRect(x, y, w, h) ctx.fillRect(x, y, w, h)
@ -1066,8 +1112,6 @@ class SongSelect{
fontFamily: this.font fontFamily: this.font
}) })
}) })
//ctx.fillStyle="#f00"
//ctx.fillRect(textX,textY,textW,textH)
} }
}) })
@ -1212,6 +1256,9 @@ class SongSelect{
var id = idDiff.id |0 var id = idDiff.id |0
var diff = idDiff.diff var diff = idDiff.diff
var diffId = this.difficultyId.indexOf(diff) var diffId = this.difficultyId.indexOf(diff)
if(diffId > 3){
diffId = 3
}
if(diffId >= 0){ if(diffId >= 0){
var currentSong = this.songs.find(song => song.id === id) var currentSong = this.songs.find(song => song.id === id)
currentSong.p2Cursor = diffId currentSong.p2Cursor = diffId
@ -1255,10 +1302,8 @@ class SongSelect{
this.redrawRunning = false this.redrawRunning = false
this.endPreview() this.endPreview()
pageEvents.keyRemove(this, "all") pageEvents.keyRemove(this, "all")
pageEvents.remove(this.canvas, "mousemove") pageEvents.remove(this.canvas, ["mousemove", "mousedown", "touchstart"])
pageEvents.remove(this.canvas, "mousedown") if(this.touchEnabled && fullScreenSupported){
pageEvents.remove(this.canvas, "touchstart")
if(this.touchEnabled){
pageEvents.remove(this.touchFullBtn, "click") pageEvents.remove(this.touchFullBtn, "click")
delete this.touchFullBtn delete this.touchFullBtn
} }

View File

@ -2,11 +2,7 @@
constructor(){ constructor(){
var AudioContext = window.AudioContext || window.webkitAudioContext var AudioContext = window.AudioContext || window.webkitAudioContext
this.context = new AudioContext() this.context = new AudioContext()
pageEvents.once(window, "click").then(() => { pageEvents.add(window, ["click", "touchend"], this.pageClicked.bind(this))
if(this.context.state === "suspended"){
this.context.resume()
}
})
} }
load(url, gain){ load(url, gain){
return loader.ajax(url, request => { return loader.ajax(url, request => {
@ -48,6 +44,11 @@
source.connect(sound.gain.gainNode || this.context.destination) source.connect(sound.gain.gainNode || this.context.destination)
return source return source
} }
pageClicked(){
if(this.context.state === "suspended"){
this.context.resume()
}
}
} }
class SoundGain{ class SoundGain{
constructor(soundBuffer, channel){ constructor(soundBuffer, channel){

View File

@ -3,8 +3,7 @@ class Titlescreen{
loader.changePage("titlescreen") loader.changePage("titlescreen")
this.titleScreen = document.getElementById("title-screen") this.titleScreen = document.getElementById("title-screen")
pageEvents.keyAdd(this, "all", "down", this.keyDown.bind(this)) pageEvents.keyAdd(this, "all", "down", this.keyDown.bind(this))
pageEvents.add(this.titleScreen, "mousedown", this.onPressed.bind(this)) pageEvents.add(this.titleScreen, ["mousedown", "touchstart"], this.onPressed.bind(this))
pageEvents.once(this.titleScreen, "touchstart").then(this.onPressed.bind(this))
assets.sounds["title"].play() assets.sounds["title"].play()
this.gamepad = new Gamepad({ this.gamepad = new Gamepad({
"13": ["a", "b", "x", "y", "start", "ls", "rs"] "13": ["a", "b", "x", "y", "start", "ls", "rs"]
@ -48,8 +47,7 @@ class Titlescreen{
this.gamepad.clean() this.gamepad.clean()
assets.sounds["title"].stop() assets.sounds["title"].stop()
pageEvents.keyRemove(this, "all") pageEvents.keyRemove(this, "all")
pageEvents.remove(this.titleScreen, "mousedown") pageEvents.remove(this.titleScreen, ["mousedown", "touchstart"])
pageEvents.remove(this.titleScreen, "touchstart")
delete this.titleScreen delete this.titleScreen
} }
} }

View File

@ -5,8 +5,7 @@ class Tutorial{
assets.sounds["bgm_setsume"].playLoop(0.1, false, 0, 1.054, 16.054) assets.sounds["bgm_setsume"].playLoop(0.1, false, 0, 1.054, 16.054)
this.endButton = document.getElementById("tutorial-end-button") this.endButton = document.getElementById("tutorial-end-button")
pageEvents.once(this.endButton, "mousedown").then(this.onEnd.bind(this)) pageEvents.once(this.endButton, ["mousedown", "touchstart"]).then(this.onEnd.bind(this))
pageEvents.once(this.endButton, "touchstart").then(this.onEnd.bind(this))
pageEvents.keyOnce(this, 13, "down").then(this.onEnd.bind(this)) pageEvents.keyOnce(this, 13, "down").then(this.onEnd.bind(this))
this.gamepad = new Gamepad({ this.gamepad = new Gamepad({
@ -29,7 +28,7 @@ class Tutorial{
clean(){ clean(){
this.gamepad.clean() this.gamepad.clean()
assets.sounds["bgm_setsume"].stop() assets.sounds["bgm_setsume"].stop()
pageEvents.remove(this.endButton, "click") pageEvents.remove(this.endButton, ["mousedown", "touchstart"])
pageEvents.keyRemove(this, 13) pageEvents.keyRemove(this, 13)
delete this.endButton delete this.endButton
} }

View File

@ -64,10 +64,13 @@ class View{
pageEvents.add(this.canvas.canvas, "touchstart", this.ontouch.bind(this)) pageEvents.add(this.canvas.canvas, "touchstart", this.ontouch.bind(this))
this.touchFullBtn = document.getElementById("touch-full-btn") this.touchFullBtn = document.getElementById("touch-full-btn")
pageEvents.add(this.touchFullBtn, "click", toggleFullscreen) pageEvents.add(this.touchFullBtn, "touchend", toggleFullscreen)
if(!fullScreenSupported){
this.touchFullBtn.style.display = "none"
}
this.touchPauseBtn = document.getElementById("touch-pause-btn") this.touchPauseBtn = document.getElementById("touch-pause-btn")
pageEvents.add(this.touchPauseBtn, "click", () => { pageEvents.add(this.touchPauseBtn, "touchend", () => {
this.controller.togglePauseMenu() this.controller.togglePauseMenu()
}) })
} }
@ -667,7 +670,8 @@ class View{
} }
} }
drawDifficulty(){ drawDifficulty(){
this.ctx.drawImage(assets.image["muzu_" + this.songDifficulty], var diffImage = this.songDifficulty === "ura" ? "oni" : this.songDifficulty
this.ctx.drawImage(assets.image["muzu_" + diffImage],
this.diffX, this.diffY, this.diffX, this.diffY,
this.diffW, this.diffH this.diffW, this.diffH
) )
@ -946,15 +950,15 @@ class View{
} }
clean(){ clean(){
pageEvents.mouseRemove(this) pageEvents.mouseRemove(this)
if(this.controller.multiplayer === 2){ if(this.controller.multiplayer === 2 && this.canvas){
this.canvas.canvas.parentNode.removeChild(this.canvas.canvas) this.canvas.canvas.parentNode.removeChild(this.canvas.canvas)
}else{ }else{
this.cursor.parentNode.removeChild(this.cursor) this.cursor.parentNode.removeChild(this.cursor)
} }
if(this.touchEnabled){ if(this.touchEnabled){
pageEvents.remove(this.canvas.canvas, "touchstart") pageEvents.remove(this.canvas.canvas, "touchstart")
pageEvents.remove(this.touchFullBtn, "click") pageEvents.remove(this.touchFullBtn, "touchend")
pageEvents.remove(this.touchPauseBtn, "click") pageEvents.remove(this.touchPauseBtn, "touchend")
this.gameDiv.classList.remove("touch-visible") this.gameDiv.classList.remove("touch-visible")
document.getElementById("version").classList.remove("version-hide") document.getElementById("version").classList.remove("version-hide")
delete this.touchDrumDiv delete this.touchDrumDiv