diff --git a/www/js/interface.js b/www/js/interface.js index 759d930..13ae0dc 100644 --- a/www/js/interface.js +++ b/www/js/interface.js @@ -216,7 +216,7 @@ const INTERFACE = { if(INTERFACE_DATA.select !== null) { // Play selection. - if(INTERFACE_DATA.hover.source == 0 && INTERFACE_DATA.player == (GAME_DATA.turn & 1)) { + if(INTERFACE_DATA.hover.source == 0 && (INTERFACE_DATA.mode == INTERFACE.Mode.Local || INTERFACE_DATA.player == (GAME_DATA.turn & 1))) { let tile_state = INTERFACE_DATA.board_state[INTERFACE_DATA.hover.tile][1]; result = +(tile_state == INTERFACE.TileStatus.Valid || tile_state == INTERFACE.TileStatus.Threat); } @@ -477,8 +477,6 @@ const INTERFACE = { ctx.font = Math.ceil(gui_scale / 2) + "px sans-serif"; let player_identity = GAME.Const.Player.Dawn; - let player_color = INTERFACE.Color.Dawn; - let opponent_color = INTERFACE.Color.Dusk; if(INTERFACE_DATA.player == 1 || (INTERFACE_DATA.player == 2 && INTERFACE_DATA.rotate == 1)) { player_identity = GAME.Const.Player.Dusk; @@ -929,9 +927,7 @@ const INTERFACE = { GAME.init(); let player = 2; - if(mode == INTERFACE.Mode.Local) { player = 0; } - let history = [ ]; let dawn = null; let dusk = null; @@ -955,7 +951,7 @@ const INTERFACE = { resign:false, resign_warn:false, - history: history, + history: [ ], history_begin: [ ], replay_turn: 0, @@ -1015,12 +1011,15 @@ const INTERFACE = { }, reset() { - GAME.init(); - INTERFACE_DATA.history = INTERFACE_DATA.history_begin; - INTERFACE_DATA.player = 0; - INTERFACE_DATA.rotate = 0; INTERFACE_DATA.auto_mode = null; - INTERFACE.draw(); + + GAME.init(); + INTERFACE_DATA.history = [ ]; + for(let i = 0; i < INTERFACE_DATA.history_begin.length; ++i) { + INTERFACE_DATA.history.push(INTERFACE_DATA.history_begin[i]); + } + + INTERFACE.replay_jump(INTERFACE_DATA.history.length, false); }, message(code, data) { @@ -1078,32 +1077,50 @@ const INTERFACE = { }, process(play) { - // Send message to server for online game. - switch(INTERFACE_DATA.mode) { - // Apply action and change turn for local game. - case INTERFACE.Mode.Local: { - INTERFACE.history_push(play, true); + let valid = true; - INTERFACE_DATA.player = +(!INTERFACE_DATA.player); - INTERFACE_DATA.rotate = +(!INTERFACE_DATA.rotate); - - INTERFACE.draw(); - - if(INTERFACE_DATA.auto_mode !== null && INTERFACE_DATA.auto_mode == (GAME_DATA.turn & 1)) { - setTimeout(INTERFACE.auto_play, 1000); - } + switch(play.source) { + case 0: { + let piece_id = GAME_DATA.board.tiles[play.from].piece; + let piece = GAME_DATA.board.pieces[piece_id]; + valid = piece.player == (GAME_DATA.turn & 1); } break; - // Send action to server for validation. - case INTERFACE.Mode.Player: { - let move_data = play.source | (play.from << 1) | (play.to << 7); - MESSAGE_COMPOSE([ - PACK.u16(OpCode.GamePlay), - PACK.u16(0), - PACK.u16(GAME_DATA.turn), - PACK.u16(move_data), - ]); + case 1: { + let player = play.from / 7; + valid = player == (GAME_DATA.turn & 1); } break; + + case 2: { + valid = INTERFACE_DATA.mode == INTERFACE.Mode.Player; + } break; + } + + if(valid) { + // Send message to server for online game. + switch(INTERFACE_DATA.mode) { + // Apply action and change turn for local game. + case INTERFACE.Mode.Local: { + INTERFACE.history_push(play, true); + + INTERFACE.draw(); + + if(INTERFACE_DATA.auto_mode !== null && INTERFACE_DATA.auto_mode == (GAME_DATA.turn & 1)) { + setTimeout(INTERFACE.auto_play, 1000); + } + } break; + + // Send action to server for validation. + case INTERFACE.Mode.Player: { + let move_data = play.source | (play.from << 1) | (play.to << 7); + MESSAGE_COMPOSE([ + PACK.u16(OpCode.GamePlay), + PACK.u16(0), + PACK.u16(GAME_DATA.turn), + PACK.u16(move_data), + ]); + } break; + } } }, @@ -1162,7 +1179,7 @@ const INTERFACE = { turn = +turn; if(turn >= 0 && turn <= INTERFACE_DATA.history.length) { - if(turn < INTERFACE_DATA.replay_turn) { + if(turn <= INTERFACE_DATA.replay_turn) { INTERFACE_DATA.replay_turn = 0; GAME.init(); } diff --git a/www/js/scene.js b/www/js/scene.js index 167bb2e..8adabd9 100644 --- a/www/js/scene.js +++ b/www/js/scene.js @@ -658,10 +658,9 @@ const SCENES = { INTERFACE.init(null, INTERFACE.Mode.Local); if(data !== null) { for(let i = 0; i < data.turn; ++i) { - INTERFACE.process(data.history[i]); INTERFACE_DATA.history_begin.push(data.history[i]); } - INTERFACE.draw(); + INTERFACE.reset(); } history.pushState(null, "Dzura - Practice", "/practice/");