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;
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));
let move_hex = hex.copy();
move_hex.add(direction);
let status = (block_directions == 0 || (mask_back & block_directions) != 0);
// Check if backward tile meets placement rules.
for(let i = 0; i < 9; ++i) {
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 valid = status && this.placable_tile(piece, tile_id);
if(target_id !== null) {
if((mask_column & block_directions) != 0) {
status = false;
// Check all tiles if not blocking.
if(block_directions == 0) {
for(let i = 0; i < GAME_DATA.board.tiles.length; ++i) {
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(valid) {
tiles.push(new GAME.MovementTile(tile_id, true, false, 0, 0));
if(valid && this.placable_tile(piece, i)) {
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;
}

View File

@ -290,24 +290,7 @@ const INTERFACE = {
release() {
if(INTERFACE_DATA.hover !== null && !INTERFACE.Ui.match_select(INTERFACE_DATA.hover, INTERFACE_DATA.select)) {
let is_valid = false;
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;
}
this.click();
}
},
@ -1087,8 +1070,10 @@ const INTERFACE = {
} break;
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);
play.from %= 7;
} break;
case 2: {