Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ export default [
...tseslint.configs.recommendedTypeChecked,
{ rules: {
"semi": ["warn", "never"],
"indent": ["warn", 4],
"object-shorthand": ["error", "never"],
"constructor-super": "error",
"getter-return": "error",
"no-const-assign": "error",
Expand Down
36 changes: 30 additions & 6 deletions src/game/bammi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,16 @@ export class BammiBoardState {
}
}

type ExplosionTurnEvent = {
exploding_area: Area
adjacent_areas: Area[]
}

type TurnResult = {
explosions: ExplosionTurnEvent[]
victory: boolean
}

export class BammiGame {
public board_state: BammiBoardState
private _turn_order: PlayerIndex[]
Expand All @@ -120,21 +130,26 @@ export class BammiGame {
return this._turn_order[this._turn_index]
}

public submit_move(column: number, row: number, player: PlayerIndex): void {
public submit_move(column: number, row: number, player: PlayerIndex): TurnResult {
const return_value: TurnResult = {
explosions: [],
victory: false
}

if (this.board_state.get_win_state() !== undefined) {
console.log("We already have a winner, you can't play any more")
return
return return_value
}

const area = this.board_state.get_area(column, row)
if (!area) {
console.error("Area at column", column, "and row", row, "has no area to be found!")
return
return return_value
}

if (area.owning_player !== 0 && area.owning_player !== player) {
console.warn("Player", player, "cannot add to area at column", column, "and row", row)
return
return return_value
}

// Increment player pointer
Expand All @@ -150,7 +165,13 @@ export class BammiGame {
if (top_area.slice_count >= top_area.pie_size) {
// Explosion
top_area.slice_count = 0
areas_to_add_to.push(...this.board_state.get_adjacent_areas(top_area))
const adjacent_areas = this.board_state.get_adjacent_areas(top_area)
areas_to_add_to.push(...adjacent_areas)

return_value.explosions.push({
exploding_area: top_area,
adjacent_areas: adjacent_areas
})
}

top_area.slice_count++
Expand All @@ -159,9 +180,12 @@ export class BammiGame {

if (winner !== undefined) {
console.log("We have a winner! Player with index", winner)
return
return_value.victory = true
return return_value
}
}

return return_value
}
}

17 changes: 14 additions & 3 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,14 @@ function main(): void {
cells.length = 0

const current_player = get_player_info(bammi_game.get_active_player())
console.log("current player", current_player)

turn_indicator.classList.forEach((class_name) => {
if (class_name.match('player-')) {
turn_indicator.classList.replace(class_name, current_player.class)
}
})
turn_indicator.innerText = `${current_player.flavour}'s turn`

turn_indicator.innerText = `${current_player.color}'s turn.\nTurn all pies into ${current_player.flavour} pies!`

const state = bammi_game.board_state

Expand All @@ -68,7 +68,18 @@ function main(): void {
}

cell_element.onclick = (): void => {
bammi_game.submit_move(cell.column, cell.row, bammi_game.get_active_player())
const active_player = bammi_game.get_active_player()
const result = bammi_game.submit_move(cell.column, cell.row, active_player)

for (let index = 0; index < result.explosions.length; index++) {
const explosion = result.explosions[index]
console.log("Explosion at area", explosion.exploding_area, "spreading into", explosion.adjacent_areas.length, "adjacent areas")
}

if (result.victory) {
console.log("Game over, the winner is", get_player_info(active_player).flavour)
}

update_board()
}
const top_adjacent = new Position(cell.column, cell.row - 1)
Expand Down