Fix player/rotate pool handling; change castle alt to cone shape.

This commit is contained in:
yukirij 2024-09-05 09:49:57 -07:00
parent d78722ca51
commit d328f93e4d
2 changed files with 68 additions and 47 deletions

View File

@ -627,39 +627,75 @@ GAME.Game = class {
} break; } break;
case GAME.Const.PieceId.Castle: { case GAME.Const.PieceId.Castle: {
let mask_back = 1 << 3;
if(piece.player == GAME.Const.Player.Dusk) {
mask_back = BITWISE.rotate_blocks6(mask_back);
}
let mask_column = mask_back | BITWISE.rotate_blocks6(mask_back);
let direction = GAME.Const.get_direction(BITWISE.ffs(mask_back)); // Check all tiles if not blocking.
let move_hex = hex.copy(); if(block_directions == 0) {
move_hex.add(direction); for(let i = 0; i < GAME_DATA.board.tiles.length; ++i) {
let tile_hex = HEX.tile_to_hex(i);
let status = (block_directions == 0 || (mask_back & block_directions) != 0); let valid = 0;
if(piece.player == 0) {
// Check if backward tile meets placement rules. if(tile_hex.x >= hex.x) {
for(let i = 0; i < 9; ++i) { valid = tile_hex.y <= hex.y;
move_hex.add(direction); } else {
valid = tile_hex.y <= hex.y - (hex.x - tile_hex.x);
if(HEX.is_valid_board(move_hex)) { }
let tile_id = HEX.hex_to_tile(move_hex); } else {
let tile_data = this.board.tiles[tile_id]; if(tile_hex.x >= hex.x) {
let target_id = tile_data.piece; valid = tile_hex.y >= hex.y + (tile_hex.x - hex.x);
} else {
let valid = status && this.placable_tile(piece, tile_id); valid = tile_hex.y >= hex.y;
if(target_id !== null) {
if((mask_column & block_directions) != 0) {
status = false;
} }
} }
if(valid) { if(valid && this.placable_tile(piece, i)) {
tiles.push(new GAME.MovementTile(tile_id, true, false, 0, 0)); tiles.push(new GAME.MovementTile(i, true, false, 0, 0));
} }
} else { break; } }
}
// Check tiles in blocking directions if blocking.
else {
let directions = block_directions;
for(let mask = BITWISE.lsb(directions); directions > 0; mask = BITWISE.lsb(directions)) {
let direction_id = BITWISE.ffs(mask);
let direction = GAME.Const.get_direction(direction_id);
let move_hex = hex.copy();
for(let dist = 1; dist <= 9; ++dist) {
move_hex.add(direction);
if(HEX.is_valid_board(move_hex)) {
let tile_id = HEX.hex_to_tile(move_hex);
let tile_data = this.board.tiles[tile_id];
let target_id = tile_data.piece;
let tile_hex = HEX.tile_to_hex(i);
let valid = 0;
if(piece.player == 0) {
if(tile_hex.x >= hex.x) {
valid = tile_hex.y <= hex.y;
} else {
valid = tile_hex.y <= hex.y - (hex.x - tile_hex.x);
}
} else {
if(tile_hex.x >= hex.x) {
valid = tile_hex.y >= hex.y + (tile_hex.x - hex.x);
} else {
valid = tile_hex.y >= hex.y;
}
}
if(target_id !== null) { break; }
if(valid && this.placable_tile(piece, tile_id)) {
tiles.push(new GAME.MovementTile(tile_id, true, false, 0, 0));
}
} else { break; }
}
directions &= ~mask;
}
} }
} break; } break;
} }

View File

@ -290,24 +290,7 @@ const INTERFACE = {
release() { release() {
if(INTERFACE_DATA.hover !== null && !INTERFACE.Ui.match_select(INTERFACE_DATA.hover, INTERFACE_DATA.select)) { if(INTERFACE_DATA.hover !== null && !INTERFACE.Ui.match_select(INTERFACE_DATA.hover, INTERFACE_DATA.select)) {
let is_valid = false; this.click();
if(INTERFACE_DATA.select !== null && INTERFACE_DATA.hover.source == 0 && INTERFACE_DATA.player == (GAME_DATA.turn & 1)) {
let tile_state = INTERFACE_DATA.board_state[INTERFACE_DATA.hover.tile][1];
is_valid = (tile_state == INTERFACE.TileStatus.Valid || tile_state == INTERFACE.TileStatus.Threat);
}
// Handle player action.
if(is_valid) {
let play = new GAME.Play(
INTERFACE_DATA.select.source,
INTERFACE_DATA.select.tile,
INTERFACE_DATA.hover.tile,
INTERFACE_DATA.alt_mode
);
INTERFACE.process(play);
INTERFACE_DATA.select = null;
INTERFACE_DATA.alt_mode = false;
}
} }
}, },
@ -1087,8 +1070,10 @@ const INTERFACE = {
} break; } break;
case 1: { case 1: {
let player = play.from / 7; let player = Math.floor(play.from / 7) ^ (INTERFACE_DATA.player & 1);
if(INTERFACE_DATA.player == 2) { player ^= INTERFACE_DATA.rotate; }
valid = player == (GAME_DATA.turn & 1); valid = player == (GAME_DATA.turn & 1);
play.from %= 7;
} break; } break;
case 2: { case 2: {