taiko-web/public/src/js/controller.js

221 lines
5.0 KiB
JavaScript
Raw Normal View History

2018-09-12 19:10:00 +02:00
class Controller{
2018-10-05 19:03:59 +02:00
constructor(selectedSong, songData, autoPlayEnabled, multiplayer, touchEnabled){
2018-09-12 19:10:00 +02:00
this.selectedSong = selectedSong
this.songData = songData
this.autoPlayEnabled = autoPlayEnabled
this.multiplayer = multiplayer
2018-10-05 19:03:59 +02:00
this.touchEnabled = touchEnabled
2018-10-03 11:48:18 +02:00
this.snd = this.multiplayer ? "_p" + this.multiplayer : ""
2018-09-12 19:10:00 +02:00
2018-10-27 23:42:28 +02:00
var backgroundURL = gameConfig.songs_baseurl + this.selectedSong.folder + "/bg.png"
2018-10-11 00:13:24 +02:00
if(selectedSong.type === "tja"){
this.parsedSongData = new ParseTja(songData, selectedSong.difficulty, selectedSong.offset)
}else{
this.parsedSongData = new ParseOsu(songData, selectedSong.offset)
}
this.offset = this.parsedSongData.soundOffset
2018-09-12 19:10:00 +02:00
assets.songs.forEach(song => {
if(song.id == this.selectedSong.folder){
this.mainAsset = song.sound
}
})
2015-07-17 10:22:46 +02:00
2018-09-12 19:10:00 +02:00
this.game = new Game(this, this.selectedSong, this.parsedSongData)
this.view = new View(this, backgroundURL, this.selectedSong.title, this.selectedSong.difficulty)
this.mekadon = new Mekadon(this, this.game)
this.keyboard = new Keyboard(this)
this.playedSounds = {}
2018-09-12 19:10:00 +02:00
}
run(syncWith){
this.game.run()
this.view.run()
if(syncWith){
syncWith.run()
syncWith.game.elapsedTime = this.game.elapsedTime
syncWith.game.startDate = this.game.startDate
2018-09-12 19:10:00 +02:00
this.syncWith = syncWith
}
2018-11-13 05:36:15 +01:00
this.startMainLoop()
if(!this.multiplayer){
2018-10-14 20:08:05 +02:00
debugObj.controller = this
if(debugObj.debug){
debugObj.debug.updateStatus()
}
}
2018-09-12 19:10:00 +02:00
}
startMainLoop(){
this.mainLoopStarted = false
this.mainLoopRunning = true
this.mainLoop()
}
2018-09-15 16:34:53 +02:00
stopMainLoop(){
this.mainLoopRunning = false
this.mainAsset.stop()
}
2018-09-12 19:10:00 +02:00
mainLoop(){
if(this.mainLoopRunning){
2018-09-18 00:37:59 +02:00
if(this.multiplayer !== 2){
2018-09-12 19:10:00 +02:00
requestAnimationFrame(() => {
if(this.syncWith){
2018-10-03 11:48:18 +02:00
this.syncWith.game.elapsedTime = this.game.elapsedTime
this.syncWith.game.startDate = this.game.startDate
2018-09-12 19:10:00 +02:00
}
this.mainLoop()
if(this.syncWith){
this.syncWith.mainLoop()
}
2018-10-25 16:18:41 +02:00
if(this.scoresheet){
if(this.view.ctx){
this.view.ctx.save()
this.view.ctx.setTransform(1, 0, 0, 1, 0, 0)
}
this.scoresheet.redraw()
if(this.view.ctx){
this.view.ctx.restore()
}
}
2018-09-12 19:10:00 +02:00
})
}
2018-10-03 11:48:18 +02:00
var ms = this.game.elapsedTime
2018-09-21 22:31:35 +02:00
2018-09-12 19:10:00 +02:00
if(!this.game.isPaused()){
2018-09-21 22:31:35 +02:00
this.keyboard.checkGameKeys()
2018-09-12 19:10:00 +02:00
if(ms >= 0 && !this.mainLoopStarted){
this.mainLoopStarted = true
}
if(ms < 0){
this.game.updateTime()
}
if(this.mainLoopStarted){
this.game.update()
2018-09-18 00:37:59 +02:00
if(!this.mainLoopRunning){
return
}
2018-09-12 19:10:00 +02:00
this.game.playMainMusic()
}
}
2018-11-12 11:32:02 +01:00
this.view.refresh()
2018-09-12 19:10:00 +02:00
this.keyboard.checkMenuKeys()
}
}
2018-09-18 00:37:59 +02:00
gameEnded(){
2018-09-12 19:10:00 +02:00
var score = this.getGlobalScore()
var vp
2018-10-25 16:18:41 +02:00
if(Math.round(score.gauge / 2) - 1 >= 25){
if(score.bad === 0){
vp = "fullcombo"
this.playSoundMeka("fullcombo", 1.350)
}else{
vp = "clear"
}
2018-09-15 16:34:53 +02:00
}else{
2018-09-12 19:10:00 +02:00
vp = "fail"
}
2018-10-03 11:48:18 +02:00
this.playSound("game" + vp)
2018-09-18 00:37:59 +02:00
}
displayResults(){
if(this.multiplayer !== 2){
this.scoresheet = new Scoresheet(this, this.getGlobalScore(), this.multiplayer, this.touchEnabled)
2018-09-18 00:37:59 +02:00
}
2018-09-12 19:10:00 +02:00
}
2018-10-25 16:18:41 +02:00
displayScore(score, notPlayed, bigNote){
this.view.displayScore(score, notPlayed, bigNote)
2018-09-12 19:10:00 +02:00
}
2018-10-01 09:33:43 +02:00
songSelection(fadeIn){
2018-10-01 12:02:28 +02:00
if(!fadeIn){
this.clean()
}
new SongSelect(false, fadeIn, this.touchEnabled)
2018-09-12 19:10:00 +02:00
}
restartSong(){
2018-09-18 00:37:59 +02:00
this.clean()
if(this.multiplayer){
new loadSong(this.selectedSong, false, true, this.touchEnabled)
2018-09-18 00:37:59 +02:00
}else{
loader.changePage("game")
var taikoGame = new Controller(this.selectedSong, this.songData, this.autoPlayEnabled, false, this.touchEnabled)
2018-09-18 00:37:59 +02:00
taikoGame.run()
}
2018-09-12 19:10:00 +02:00
}
2018-10-03 11:48:18 +02:00
playSound(id, time){
var ms = (+new Date) + (time || 0) * 1000
if(!(id in this.playedSounds) || ms > this.playedSounds[id] + 30){
assets.sounds[id + this.snd].play(time)
this.playedSounds[id] = ms
}
2018-10-03 11:48:18 +02:00
}
2018-09-12 19:10:00 +02:00
playSoundMeka(soundID, time){
var meka = ""
if(this.autoPlayEnabled && !this.multiplayer){
meka = "-meka"
}
2018-10-03 11:48:18 +02:00
this.playSound(soundID + meka, time)
2018-09-12 19:10:00 +02:00
}
togglePause(){
if(this.syncWith){
this.syncWith.game.togglePause()
}
this.game.togglePause()
}
getKeys(){
return this.keyboard.getKeys()
}
2018-09-21 22:31:35 +02:00
setKey(keyCode, down, ms){
return this.keyboard.setKey(keyCode, down, ms)
2018-09-12 19:10:00 +02:00
}
getBindings(){
return this.keyboard.getBindings()
}
getElapsedTime(){
2018-10-03 11:48:18 +02:00
return this.game.elapsedTime
2018-09-12 19:10:00 +02:00
}
getCircles(){
return this.game.getCircles()
}
getCurrentCircle(){
return this.game.getCurrentCircle()
}
isWaiting(key, type){
return this.keyboard.isWaiting(key, type)
2018-09-12 19:10:00 +02:00
}
waitForKeyup(key, type){
this.keyboard.waitForKeyup(key, type)
}
getKeyTime(){
return this.keyboard.getKeyTime()
}
getCombo(){
return this.game.getCombo()
}
getGlobalScore(){
return this.game.getGlobalScore()
}
autoPlay(circle){
if(this.multiplayer){
p2.play(circle, this.mekadon)
}else{
this.mekadon.play(circle)
}
}
2018-09-18 00:37:59 +02:00
clean(){
2018-10-05 19:03:59 +02:00
if(this.syncWith){
this.syncWith.clean()
}
2018-09-18 00:37:59 +02:00
this.stopMainLoop()
this.keyboard.clean()
this.view.clean()
if(!this.multiplayer){
2018-10-14 20:08:05 +02:00
debugObj.controller = null
if(debugObj.debug){
debugObj.debug.updateStatus()
}
}
2018-09-18 00:37:59 +02:00
}
2018-09-12 19:10:00 +02:00
}