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")