diff --git a/public/index.html b/public/index.html index 7444d09..f39f3e2 100644 --- a/public/index.html +++ b/public/index.html @@ -46,6 +46,7 @@ +
diff --git a/public/src/js/controller.js b/public/src/js/controller.js index 9ac7fce..a8af97e 100644 --- a/public/src/js/controller.js +++ b/public/src/js/controller.js @@ -13,6 +13,8 @@ function Controller(selectedSong, songData, autoPlayEnabled){ var _mainLoop; var _pauseMenu = false; + this.autoPlayEnabled = autoPlayEnabled + this.run = function(){ _this.loadUIEvents(); @@ -23,11 +25,11 @@ function Controller(selectedSong, songData, autoPlayEnabled){ this.loadUIEvents = function(){ $("#song-selection-butt").click(function(){ - assets.sounds["don"].play(); + assets.sounds["don"].playAsset(); _this.songSelection(); }); $("#restart-butt").click(function(){ - assets.sounds["don"].play(); + assets.sounds["don"].playAsset(); _this.restartSong(); }); $("#continue-butt").click(function(){ @@ -48,7 +50,7 @@ function Controller(selectedSong, songData, autoPlayEnabled){ else if(ms>=0 && !started){ //when music shall starts setTimeout(function(){ assets.sounds["main-music"].volume = 0.7; - assets.sounds["main-music"].play(); + assets.sounds["main-music"].playAsset(); }, _songData.generalInfo.audioWait); started=true; } @@ -84,7 +86,7 @@ function Controller(selectedSong, songData, autoPlayEnabled){ if (score.fail == 0) { vp = 'fullcombo'; setTimeout(function(){ - assets.sounds['fullcombo'].play(); + assets.sounds['fullcombo'].playAsset(); }, 1350); } else if (score.hp >= 50) { vp = 'clear'; @@ -92,7 +94,7 @@ function Controller(selectedSong, songData, autoPlayEnabled){ vp = 'fail'; } - assets.sounds['game' + vp].play(); + assets.sounds['game' + vp].playAsset(); setTimeout(function(){ var scoresheet = new Scoresheet(_this, _this.getGlobalScore()); @@ -170,6 +172,10 @@ function Controller(selectedSong, songData, autoPlayEnabled){ return _keyboard.setKey(keyCode, down); } + this.getBindings = function(){ + return _keyboard.getBindings(); + } + this.getSongData = function(){ return _game.getSongData(); } @@ -215,12 +221,7 @@ function Controller(selectedSong, songData, autoPlayEnabled){ } this.autoPlay = function(circle){ - if(autoPlayEnabled){ - if(circle && circle.getStatus() == 450){ - _mekadon.play(circle) - } - return true - } + _mekadon.play(circle) } } \ No newline at end of file diff --git a/public/src/js/game.js b/public/src/js/game.js index 10f1e5c..9b36758 100644 --- a/public/src/js/game.js +++ b/public/src/js/game.js @@ -117,48 +117,36 @@ function Game(controller, selectedSong, songData){ var circle = circles[_currentCircle]; if(circle){ - - if(controller.autoPlay(circle)){ - return + if(controller.autoPlayEnabled){ + return controller.autoPlay(circle) } - - if(controller.getKeys()[86]){ - if(!circle.getPlayed() && !controller.isWaitingForKeyup(86, "score") && circle.getStatus()!=-1){ - var score = _this.checkScore(circle); - circle.played(score); - _this.updateCurrentCircle(); - controller.waitForKeyup(86, "score"); - } + var keys = controller.getKeys() + var kbd = controller.getBindings() + if(keys[kbd["don_l"]]){ + _this.checkKey(kbd["don_l"], circle) } - if(controller.getKeys()[66]){ - if(!circle.getPlayed() && !controller.isWaitingForKeyup(66, "score") && circle.getStatus()!=-1){ - var score = _this.checkScore(circle); - circle.played(score); - _this.updateCurrentCircle(); - controller.waitForKeyup(66, "score"); - } + if(keys[kbd["don_r"]]){ + _this.checkKey(kbd["don_r"], circle) } - if(controller.getKeys()[67]){ - if(!circle.getPlayed() && !controller.isWaitingForKeyup(67, "score") && circle.getStatus()!=-1){ - var score = _this.checkScore(circle); - circle.played(score); - _this.updateCurrentCircle(); - controller.waitForKeyup(67, "score"); - } + if(keys[kbd["ka_l"]]){ + _this.checkKey(kbd["ka_l"], circle) } - if(controller.getKeys()[78]){ - if(!circle.getPlayed() && !controller.isWaitingForKeyup(78, "score") && circle.getStatus()!=-1){ - var score = _this.checkScore(circle); - circle.played(score); - _this.updateCurrentCircle(); - controller.waitForKeyup(78, "score"); - } + if(keys[kbd["ka_r"]]){ + _this.checkKey(kbd["ka_r"], circle) } - } } + this.checkKey = function(keyCode, circle){ + if(!circle.getPlayed() && !controller.isWaitingForKeyup(keyCode, "score") && circle.getStatus()!=-1){ + var score = _this.checkScore(circle); + circle.played(score); + _this.updateCurrentCircle(); + controller.waitForKeyup(keyCode, "score"); + } + } + this.checkScore = function(circle){ if( @@ -230,7 +218,7 @@ function Game(controller, selectedSong, songData){ _mainMusicPlaying=false; } else{ - assets.sounds["main-music"].play(); + assets.sounds["main-music"].playAsset(); _mainMusicPlaying=true; } } @@ -253,14 +241,14 @@ function Game(controller, selectedSong, songData){ this.togglePause = function(){ if(!_paused){ - assets.sounds["pause"].play(); + assets.sounds["pause"].playAsset(); _paused=true; _latestDate = new Date(); _this.toggleMainMusic(); } else{ - assets.sounds["cancel"].play(); + assets.sounds["cancel"].playAsset(); _paused=false; var currentDate = new Date(); _ellapsedTimeSincePause = _ellapsedTimeSincePause + Math.abs(currentDate.getTime() - _latestDate.getTime()); diff --git a/public/src/js/gamepad.js b/public/src/js/gamepad.js new file mode 100644 index 0000000..2db4f6a --- /dev/null +++ b/public/src/js/gamepad.js @@ -0,0 +1,86 @@ +class Gamepad{ + constructor(keyboard){ + var kbd=keyboard.getBindings() + this.gameBtn = {} + this.gameBtn[kbd["don_l"]] = ["u", "d", "l", "r"] + this.gameBtn[kbd["don_r"]] = ["a", "b", "x", "y"] + this.gameBtn[kbd["ka_l"]] = ["lb", "lt"] + this.gameBtn[kbd["ka_r"]] = ["rb", "rt"] + this.menuBtn = {} + this.menuBtn[kbd["pause"]] = ["start"] + this.b = { + "a": "0", + "b": "1", + "x": "2", + "y": "3", + "lb": "4", + "rb": "5", + "lt": "6", + "rt": "7", + "back": "8", + "start": "9", + "ls": "10", + "rs": "11", + "u": "12", + "d": "13", + "l": "14", + "r": "15", + "guide": "16" + } + this.btn = {} + this.keyboard = keyboard + } + play(menuPlay){ + if("getGamepads" in navigator){ + var gamepads = navigator.getGamepads() + }else{ + return + } + var bindings = menuPlay ? this.menuBtn : this.gameBtn + for(var i = 0; i < gamepads.length; i++){ + if(gamepads[i]){ + var buttons = gamepads[i].buttons + this.toRelease = {} + for(var i in bindings){ + this.toRelease[i] = bindings[i].length + } + for(var btnName in buttons){ + buttonSearch: { + for(var bind in bindings){ + for(var name in bindings[bind]){ + if(btnName == this.b[bindings[bind][name]]){ + this.checkButton(buttons, btnName, bind) + break buttonSearch + } + } + } + } + } + } + } + } + checkButton(buttons, btnName, keyCode){ + var button = buttons[btnName] + var pressed = !this.btn[btnName] && button.pressed + var released = this.btn[btnName] && !button.pressed + if(pressed){ + this.btn[btnName] = true + }else if(released){ + delete this.btn[btnName] + } + if(pressed){ + if(this.keyboard.getKeys()[keyCode]){ + this.keyboard.setKey(keyCode, false) + } + this.keyboard.setKey(keyCode, true) + }else if(!button.pressed && this.keyboard.getKeys()[keyCode]){ + if(released){ + this.toRelease[keyCode+"released"] = true + } + this.toRelease[keyCode]-- + if(this.toRelease[keyCode] == 0 && this.toRelease[keyCode+"released"]){ + this.keyboard.setKey(keyCode, false) + } + } + } +} diff --git a/public/src/js/keyboard.js b/public/src/js/keyboard.js index a846934..1088f2b 100644 --- a/public/src/js/keyboard.js +++ b/public/src/js/keyboard.js @@ -1,11 +1,25 @@ function Keyboard(controller){ + var _kbd = { + "don_l": 86, // V + "don_r": 66, // B + "ka_l": 67, // C + "ka_r": 78, // N + "pause": 81, // Q + "back": 8 // Backspace + } var _this = this; var _keys = {}; var _waitKeyupScore = {}; var _waitKeyupSound = {}; var _waitKeyupMenu = {}; + this.getBindings = function(){ + return _kbd + } + + var _gamepad = new Gamepad(this) + $(document).keydown(function(e){ if (e.which === 8 && !$(e.target).is("input, textarea")) @@ -24,12 +38,12 @@ function Keyboard(controller){ }); this.buttonEnabled = function(keyCode){ - if(controller.autoPlay()){ + if(controller.autoPlayEnabled){ switch(keyCode){ - case 86: - case 66: - case 67: - case 78: + case _kbd["don_l"]: + case _kbd["don_r"]: + case _kbd["ka_l"]: + case _kbd["ka_r"]: return false } } @@ -37,45 +51,37 @@ function Keyboard(controller){ } this.checkGameKeys = function(){ - - if(_keys[86] && !_this.isWaitingForKeyup(86, "sound")){ - // V, play 'don' sound - controller.playSound('note_don'); - _this.waitForKeyup(86, "sound"); + if(!controller.autoPlayEnabled){ + _gamepad.play() } - if(_keys[66] && !_this.isWaitingForKeyup(66, "sound")){ - // B, play 'don' sound - controller.playSound('note_don'); - _this.waitForKeyup(66, "sound"); - } - - if(_keys[67] && !_this.isWaitingForKeyup(67, "sound")){ - // C, play 'ka' sound - controller.playSound('note_ka'); - _this.waitForKeyup(67, "sound"); - } - if(_keys[78] && !_this.isWaitingForKeyup(78, "sound")){ - // N, play 'ka' sound - controller.playSound('note_ka'); - _this.waitForKeyup(78, "sound"); - } - + _this.checkKeySound(_kbd["don_l"], "note_don") + _this.checkKeySound(_kbd["don_r"], "note_don") + _this.checkKeySound(_kbd["ka_l"], "note_ka") + _this.checkKeySound(_kbd["ka_r"], "note_ka") } this.checkMenuKeys = function(){ - - if(_keys[8] && !_this.isWaitingForKeyup(8, "menu")){ - // Backspace, go back to song selection - _this.waitForKeyup(8, "menu"); + _gamepad.play(1) + _this.checkKey(_kbd["back"], "menu", function(){ controller.pauseSound("main-music", true); controller.songSelection(); - } - if(_keys[81] && !_this.isWaitingForKeyup(81, "menu")){ - // Q, pause the game - _this.waitForKeyup(81, "menu"); + }) + _this.checkKey(_kbd["pause"], "menu", function(){ controller.togglePauseMenu(); + }) + } + + this.checkKey = function(keyCode, keyup, callback){ + if(_keys[keyCode] && !_this.isWaitingForKeyup(keyCode, keyup)){ + _this.waitForKeyup(keyCode, keyup); + callback() } - + } + + this.checkKeySound = function(keyCode, sound){ + _this.checkKey(keyCode, "sound", function(){ + controller.playSound(sound); + }) } this.getKeys = function(){ diff --git a/public/src/js/loader.js b/public/src/js/loader.js index a7c9ae1..3d633ae 100644 --- a/public/src/js/loader.js +++ b/public/src/js/loader.js @@ -24,16 +24,21 @@ function Loader(){ assets.audio.forEach(function(name){ var id = name.substr(0, name.length-4); - var audio = new Audio(); - audio.src = '/assets/audio/'+name; - audio.muted = true; - audio.load(); - audio.onloadeddata = function(){ - assets.sounds[id] = new Audio(); - assets.sounds[id].src = audio.src; - assets.sounds[id].load(); + assets.sounds[id] = new Audio(); + assets.sounds[id].muted = true; + assets.sounds[id].playAsset = function(){ + try{ + assets.sounds[id].muted = false; + assets.sounds[id].play() + }catch(e){ + console.warn(e) + } + } + assets.sounds[id].onloadeddata = function(){ _this.assetLoaded(); }; + assets.sounds[id].src = '/assets/audio/'+name; + assets.sounds[id].load(); }); $.ajax({ diff --git a/public/src/js/loadsong.js b/public/src/js/loadsong.js index af9dc0b..a7b91a5 100644 --- a/public/src/js/loadsong.js +++ b/public/src/js/loadsong.js @@ -13,10 +13,11 @@ function loadSong(selectedSong, autoPlayEnabled){ assets.sounds["bgm_songsel"].pause(); assets.sounds["bgm_songsel"].currentTime = 0; - assets.sounds["start"].play(); + assets.sounds["start"].playAsset(); $("#assets").append("
");
var audio = new Audio();
+ audio.muted = true;
audio.src = '/songs/'+_selectedSong.folder+'/main.mp3';
audio.load();
@@ -25,6 +26,15 @@ function loadSong(selectedSong, autoPlayEnabled){
_this.checkIfEverythingLoaded();
});
+ audio.playAsset = function(){
+ try{
+ audio.muted = false;
+ audio.play()
+ }catch(e){
+ console.warn(e)
+ }
+ }
+
audio.onloadeddata = function(){
_musicLoaded=true;
assets.sounds["main-music"]=audio;
diff --git a/public/src/js/mekadon.js b/public/src/js/mekadon.js
index 475e180..b365de0 100644
--- a/public/src/js/mekadon.js
+++ b/public/src/js/mekadon.js
@@ -6,24 +6,27 @@ class Mekadon{
this.keys = {}
}
play(circle){
- if(circle.getType() == "don"){
- this.setKey(this.lr ? 86 : 66)
- this.lr = !this.lr
- }else if(circle.getType() == "daiDon"){
- this.setKey(86)
- this.setKey(66)
- this.lr = false
- }else if(circle.getType() == "ka"){
- this.setKey(this.lr ? 67 : 78)
- this.lr = !this.lr
- }else if(circle.getType() == "daiKa"){
- this.setKey(67)
- this.setKey(78)
- this.lr = false
+ if(circle.getStatus() == 450){
+ var kbd = this.controller.getBindings()
+ if(circle.getType() == "don"){
+ this.setKey(this.lr ? kbd["don_l"] : kbd["don_r"])
+ this.lr = !this.lr
+ }else if(circle.getType() == "daiDon"){
+ this.setKey(kbd["don_l"])
+ this.setKey(kbd["don_r"])
+ this.lr = false
+ }else if(circle.getType() == "ka"){
+ this.setKey(this.lr ? kbd["ka_l"] : kbd["ka_r"])
+ this.lr = !this.lr
+ }else if(circle.getType() == "daiKa"){
+ this.setKey(kbd["ka_l"])
+ this.setKey(kbd["ka_r"])
+ this.lr = false
+ }
+ var score = this.game.checkScore(circle);
+ circle.played(score);
+ this.game.updateCurrentCircle();
}
- var score = this.game.checkScore(circle);
- circle.played(score);
- this.game.updateCurrentCircle();
}
setKey(keyCode){
var self = this
diff --git a/public/src/js/scoresheet.js b/public/src/js/scoresheet.js
index e03abb8..d5a9eb7 100644
--- a/public/src/js/scoresheet.js
+++ b/public/src/js/scoresheet.js
@@ -81,13 +81,13 @@ function Scoresheet(controller, score){
_this.setResults();
$("#song-select").click(function(){
- assets.sounds["don"].play();
+ assets.sounds["don"].playAsset();
bgm.pause();
controller.songSelection();
});
$("#replay").click(function(){
- assets.sounds["don"].play();
+ assets.sounds["don"].playAsset();
bgm.pause();
controller.restartSong();
});
@@ -96,7 +96,7 @@ function Scoresheet(controller, score){
}
- assets.sounds["results"].play();
+ assets.sounds["results"].playAsset();
bgm = new BufferedLoop(
{url: '/assets/audio/bgm_result.ogg', duration: 0.847},
diff --git a/public/src/js/songselect.js b/public/src/js/songselect.js
index e46972b..b7951ec 100644
--- a/public/src/js/songselect.js
+++ b/public/src/js/songselect.js
@@ -51,7 +51,7 @@ function SongSelect(){
_this.endPreview();
assets.sounds["diffsel"].pause();
assets.sounds["diffsel"].currentTime = 0;
- assets.sounds["don"].play();
+ assets.sounds["don"].playAsset();
clearInterval(menuLoop);
var difficultyElement = (e.target.className=="stars" || e.target.className=="diffname") ? e.target.parentElement : e.target;
@@ -79,14 +79,14 @@ function SongSelect(){
if ($(".opened").length && $(".opened").attr('id') == $(this).attr('id')) {
_this.endPreview();
bgm.play();
- assets.sounds["cancel"].play();
+ assets.sounds["cancel"].playAsset();
$(".difficulty").hide();
$(".opened").removeClass("opened", 300);
assets.sounds["diffsel"].pause();
assets.sounds["diffsel"].currentTime = 0;
setTimeout(function(){
- assets.sounds["song-select"].play();
+ assets.sounds["song-select"].playAsset();
}, 300);
$('.songsel-title').fadeOut(200, function(){
@@ -100,11 +100,11 @@ function SongSelect(){
if(!$('.opened').length) {
_this.startPreview($(this).data('song-id'), $(this).data('preview'));
- assets.sounds["don"].play();
+ assets.sounds["don"].playAsset();
assets.sounds["song-select"].pause();
assets.sounds["song-select"].currentTime = 0;
setTimeout(function(){
- assets.sounds["diffsel"].play();
+ assets.sounds["diffsel"].playAsset();
}, 300);
$('.songsel-title').fadeOut(200, function(){
@@ -114,7 +114,7 @@ function SongSelect(){
} else {
_preview.pause();
_this.startPreview($(this).data('song-id'), $(this).data('preview'), false);
- assets.sounds["ka"].play();
+ assets.sounds["ka"].playAsset();
}
};
@@ -136,7 +136,7 @@ function SongSelect(){
bgm.play();
setTimeout(function(){
- assets.sounds["song-select"].play();
+ assets.sounds["song-select"].playAsset();
}, 200);
for(var i=0; i
");
var audio = new Audio();
+ audio.muted = true;
audio.src = '/songs/'+_selectedSong.folder+'/main.mp3';
audio.load();
@@ -25,6 +26,15 @@ function loadSong(selectedSong, autoPlayEnabled){
_this.checkIfEverythingLoaded();
});
+ audio.playAsset = function(){
+ try{
+ audio.muted = false;
+ audio.play()
+ }catch(e){
+ console.warn(e)
+ }
+ }
+
audio.onloadeddata = function(){
_musicLoaded=true;
assets.sounds["main-music"]=audio;
diff --git a/public/src/js/mekadon.js b/public/src/js/mekadon.js
index 475e180..b365de0 100644
--- a/public/src/js/mekadon.js
+++ b/public/src/js/mekadon.js
@@ -6,24 +6,27 @@ class Mekadon{
this.keys = {}
}
play(circle){
- if(circle.getType() == "don"){
- this.setKey(this.lr ? 86 : 66)
- this.lr = !this.lr
- }else if(circle.getType() == "daiDon"){
- this.setKey(86)
- this.setKey(66)
- this.lr = false
- }else if(circle.getType() == "ka"){
- this.setKey(this.lr ? 67 : 78)
- this.lr = !this.lr
- }else if(circle.getType() == "daiKa"){
- this.setKey(67)
- this.setKey(78)
- this.lr = false
+ if(circle.getStatus() == 450){
+ var kbd = this.controller.getBindings()
+ if(circle.getType() == "don"){
+ this.setKey(this.lr ? kbd["don_l"] : kbd["don_r"])
+ this.lr = !this.lr
+ }else if(circle.getType() == "daiDon"){
+ this.setKey(kbd["don_l"])
+ this.setKey(kbd["don_r"])
+ this.lr = false
+ }else if(circle.getType() == "ka"){
+ this.setKey(this.lr ? kbd["ka_l"] : kbd["ka_r"])
+ this.lr = !this.lr
+ }else if(circle.getType() == "daiKa"){
+ this.setKey(kbd["ka_l"])
+ this.setKey(kbd["ka_r"])
+ this.lr = false
+ }
+ var score = this.game.checkScore(circle);
+ circle.played(score);
+ this.game.updateCurrentCircle();
}
- var score = this.game.checkScore(circle);
- circle.played(score);
- this.game.updateCurrentCircle();
}
setKey(keyCode){
var self = this
diff --git a/public/src/js/scoresheet.js b/public/src/js/scoresheet.js
index e03abb8..d5a9eb7 100644
--- a/public/src/js/scoresheet.js
+++ b/public/src/js/scoresheet.js
@@ -81,13 +81,13 @@ function Scoresheet(controller, score){
_this.setResults();
$("#song-select").click(function(){
- assets.sounds["don"].play();
+ assets.sounds["don"].playAsset();
bgm.pause();
controller.songSelection();
});
$("#replay").click(function(){
- assets.sounds["don"].play();
+ assets.sounds["don"].playAsset();
bgm.pause();
controller.restartSong();
});
@@ -96,7 +96,7 @@ function Scoresheet(controller, score){
}
- assets.sounds["results"].play();
+ assets.sounds["results"].playAsset();
bgm = new BufferedLoop(
{url: '/assets/audio/bgm_result.ogg', duration: 0.847},
diff --git a/public/src/js/songselect.js b/public/src/js/songselect.js
index e46972b..b7951ec 100644
--- a/public/src/js/songselect.js
+++ b/public/src/js/songselect.js
@@ -51,7 +51,7 @@ function SongSelect(){
_this.endPreview();
assets.sounds["diffsel"].pause();
assets.sounds["diffsel"].currentTime = 0;
- assets.sounds["don"].play();
+ assets.sounds["don"].playAsset();
clearInterval(menuLoop);
var difficultyElement = (e.target.className=="stars" || e.target.className=="diffname") ? e.target.parentElement : e.target;
@@ -79,14 +79,14 @@ function SongSelect(){
if ($(".opened").length && $(".opened").attr('id') == $(this).attr('id')) {
_this.endPreview();
bgm.play();
- assets.sounds["cancel"].play();
+ assets.sounds["cancel"].playAsset();
$(".difficulty").hide();
$(".opened").removeClass("opened", 300);
assets.sounds["diffsel"].pause();
assets.sounds["diffsel"].currentTime = 0;
setTimeout(function(){
- assets.sounds["song-select"].play();
+ assets.sounds["song-select"].playAsset();
}, 300);
$('.songsel-title').fadeOut(200, function(){
@@ -100,11 +100,11 @@ function SongSelect(){
if(!$('.opened').length) {
_this.startPreview($(this).data('song-id'), $(this).data('preview'));
- assets.sounds["don"].play();
+ assets.sounds["don"].playAsset();
assets.sounds["song-select"].pause();
assets.sounds["song-select"].currentTime = 0;
setTimeout(function(){
- assets.sounds["diffsel"].play();
+ assets.sounds["diffsel"].playAsset();
}, 300);
$('.songsel-title').fadeOut(200, function(){
@@ -114,7 +114,7 @@ function SongSelect(){
} else {
_preview.pause();
_this.startPreview($(this).data('song-id'), $(this).data('preview'), false);
- assets.sounds["ka"].play();
+ assets.sounds["ka"].playAsset();
}
};
@@ -136,7 +136,7 @@ function SongSelect(){
bgm.play();
setTimeout(function(){
- assets.sounds["song-select"].play();
+ assets.sounds["song-select"].playAsset();
}, 200);
for(var i=0; i