clockwork-city/scenes/board_game.gd

164 lines
4.9 KiB
GDScript3
Raw Normal View History

class_name BoardGame extends Node
const HOME_SCENE = preload("uid://bto4vblqk2inb")
#const DOWN_SPAWN_SCENE = preload("uid://d4ltd1geg7s2p")
const BANK_SCENE = preload("uid://c06fsqdixer1c")
const BAR_SCENE = preload("uid://cfk268flnsbhb")
const CAFE_SCENE = preload("uid://bgtw051fiveeo")
const FORK_SCENE = preload("uid://cphy0vtj14ob0")
const GUN_SHOP_SCENE = preload("uid://c1kyedmrep0tu")
const HOSPITAL_SCENE = preload("uid://bytldu3y1jak3")
const OFFICE_SCENE = preload("uid://mixrqf035krk")
const SHOP_SCENE = preload("uid://dbn63mv0peqf")
const BASE_DECK = [
BANK_SCENE,
BAR_SCENE,
CAFE_SCENE,
FORK_SCENE,
GUN_SHOP_SCENE,
HOSPITAL_SCENE,
OFFICE_SCENE,
SHOP_SCENE
]
var citizen_count: int = 0:
set(value):
#print(value)
citizen_count = value
if citizen_count == 0:
handle_citizens_finished()
var buildings_added_to_draft: int = 0
var homes_placed: int = 0
var spawn_placement_actions: int = 0
var draft_index_to_be_deleted: int = -1
var current_board_state: BoardState:
set(value):
current_board_state = value
controls.check_controls_enabled()
controls.set_info()
var pending_board_state: BoardState:
set(value):
pending_board_state = value
controls.check_controls_enabled()
var deck: Array[Building] = []
@onready var board: Board = %Board
@onready var controls: Controls = %Controls
@onready var game_over: Control = %GameOver
func _init() -> void:
Globals.board_game = self
@rpc("any_peer", "call_local", "reliable")
func setup_building_deck() -> void:
for i in range(current_board_state.players.size()):
for scene in BASE_DECK:
deck.append(scene.instantiate())
@rpc("any_peer", "call_local", "reliable")
func set_board_state(board_state: Dictionary) -> void:
current_board_state = BoardState.deserialize(board_state)
board.reset()
board.set_board_state(current_board_state)
if current_board_state.state == BoardState.State.INITIAL_SETUP:
if Globals.game.this_player.id == current_board_state.current_player.id:
board.set_active_building(HOME_SCENE.instantiate())
elif current_board_state.state == BoardState.State.DRAFT:
start_day()
if current_board_state.players_passed == Globals.game.players.size():
end_day()
@rpc("any_peer", "call_local", "reliable")
func add_building_to_draft() -> void:
buildings_added_to_draft += 1
if buildings_added_to_draft >= Globals.game.players.size():
current_board_state.state = BoardState.State.PLAY
controls.check_controls_enabled()
func select_tile(tile: Tile) -> void:
board.set_active_tile(tile.duplicate())
func select_building(building: Building, delete_index: int = -1) -> void:
board.set_active_building(building.duplicate())
draft_index_to_be_deleted = delete_index
func start_day() -> void:
current_board_state.day += 1
current_board_state.turn = 1
seed(Globals.game.sum_player_ids())
deck.shuffle()
var turn_index := current_board_state.get_this_player_index()
controls.give_hand(deck.slice(0 + (3 * turn_index), 3 + (3 * turn_index)))
controls.set_info()
func end_day() -> void:
controls.end_day()
get_tree().call_group("Pausable", "unpause")
func handle_board_state_changed() -> void:
pending_board_state = BoardState.new()
pending_board_state.day = current_board_state.day
pending_board_state.turn = current_board_state.turn + 1
if pending_board_state.turn == 0:
pending_board_state.state = BoardState.State.DRAFT
else:
pending_board_state.state = current_board_state.state
pending_board_state.players = current_board_state.players
pending_board_state.players.push_back(pending_board_state.players.pop_front())
pending_board_state.current_player = current_board_state.players[0]
pending_board_state.tiles = board.tiles.values()
for building in board.buildings.values():
if !pending_board_state.buildings.has(building):
pending_board_state.buildings.append(building)
controls.check_controls_enabled()
func handle_board_state_confirmed() -> void:
current_board_state.players_passed = 0
set_board_state.rpc(pending_board_state.serialize())
pending_board_state = null
if draft_index_to_be_deleted != -1:
controls.remove_from_draft.rpc(draft_index_to_be_deleted)
draft_index_to_be_deleted = -1
func handle_pass() -> void:
current_board_state.players_passed += 1
current_board_state.turn += 1
current_board_state.players.push_back(current_board_state.players.pop_front())
current_board_state.current_player = current_board_state.players[0]
set_board_state.rpc(current_board_state.serialize())
func handle_citizens_finished() -> void:
for child in board.board_state.get_children():
if child.get_groups().has("PostTurnActions"):
child.handle_post_turn_actions()
controls.reset_turn()
var winning_player_idx = current_board_state.players.find_custom(
func(p: Player) -> bool: return p.money >= 100
)
if winning_player_idx != -1:
game_over.set_winning_player(current_board_state.players[winning_player_idx])
else:
start_day()
func queue_spawn_placement(_num_placements: int) -> void:
print("Handle queueing spawn placements")