2026-04-15 10:45:43 -05:00
|
|
|
class_name Controls extends Control
|
2026-04-13 11:34:00 -05:00
|
|
|
|
2026-04-20 13:03:39 -05:00
|
|
|
const DRAFT_BUILDING_SCENE = preload("uid://87u3upovcueb")
|
|
|
|
|
|
2026-04-13 11:34:00 -05:00
|
|
|
var rem_tween: Tween
|
2026-04-20 13:03:39 -05:00
|
|
|
var hand_tween: Tween
|
2026-04-15 10:45:43 -05:00
|
|
|
var es_tween: Tween
|
2026-04-13 11:34:00 -05:00
|
|
|
|
2026-04-20 13:03:39 -05:00
|
|
|
var draft_building: Building
|
|
|
|
|
|
2026-04-15 10:45:43 -05:00
|
|
|
@onready var turn_label: Label = %TurnLabel
|
2026-04-20 13:03:39 -05:00
|
|
|
@onready var player_display: PlayerDisplay = %PlayerDisplay
|
2026-04-15 10:45:43 -05:00
|
|
|
|
|
|
|
|
@onready var submit_button: Button = %Submit
|
2026-04-20 13:03:39 -05:00
|
|
|
@onready var pass_button: Button = %Pass
|
|
|
|
|
@onready var undo_button: Button = %Undo
|
2026-04-13 11:34:00 -05:00
|
|
|
@onready var pause_button: Button = %Pause
|
2026-04-15 10:45:43 -05:00
|
|
|
@onready var play_button: Button = %Play
|
2026-04-20 13:03:39 -05:00
|
|
|
@onready var rem_button: Button = %RealEstateMarket
|
2026-04-13 11:34:00 -05:00
|
|
|
@onready var start_walls: Button = %StartWalls
|
|
|
|
|
@onready var stop_walls: Button = %StopWalls
|
2026-04-20 13:03:39 -05:00
|
|
|
@onready var cancel_placement_button: Button = %CancelPlacement
|
|
|
|
|
|
|
|
|
|
@onready var blueprints_container: Container = %BlueprintsContainer
|
|
|
|
|
@onready var draft_container: Container = %DraftContainer
|
|
|
|
|
@onready var hand: Hand = %Hand
|
2026-04-13 11:34:00 -05:00
|
|
|
|
2026-04-15 10:45:43 -05:00
|
|
|
@onready var fast_1: Button = %FastForward1
|
|
|
|
|
@onready var fast_2: Button = %FastForward2
|
|
|
|
|
@onready var fast_4: Button = %FastForward4
|
|
|
|
|
@onready var fast_10: Button = %FastForward10
|
|
|
|
|
|
2026-04-20 13:03:39 -05:00
|
|
|
@onready var draft_cost_container: Container = %DraftCost
|
|
|
|
|
@onready var draft_cost_spinner: SpinBox = %BuildingDraftCost
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func give_hand(buildings: Array[Building]) -> void:
|
|
|
|
|
hand.give_buildings(buildings)
|
|
|
|
|
print_debug("this sucks!")
|
|
|
|
|
await get_tree().process_frame
|
|
|
|
|
await get_tree().process_frame
|
|
|
|
|
_show_hand()
|
|
|
|
|
|
2026-04-15 10:45:43 -05:00
|
|
|
|
|
|
|
|
func reset_turn() -> void:
|
|
|
|
|
get_tree().call_group("Pausable", "pause")
|
|
|
|
|
submit_button.show()
|
|
|
|
|
pause_button.hide()
|
2026-04-13 11:34:00 -05:00
|
|
|
play_button.hide()
|
2026-04-15 10:45:43 -05:00
|
|
|
|
|
|
|
|
|
2026-04-20 13:03:39 -05:00
|
|
|
func set_info() -> void:
|
|
|
|
|
turn_label.text = (
|
|
|
|
|
"%d.%d"
|
|
|
|
|
% [Globals.board_game.current_board_state.day, Globals.board_game.current_board_state.turn]
|
|
|
|
|
)
|
|
|
|
|
player_display.set_players(Globals.board_game.current_board_state.players)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func check_controls_enabled() -> void:
|
|
|
|
|
if Globals.board_game.current_board_state.current_player.id == Globals.game.this_player.id:
|
|
|
|
|
if Globals.board_game.current_board_state.state != BoardState.State.PLAY:
|
|
|
|
|
pass_button.hide()
|
|
|
|
|
submit_button.show()
|
|
|
|
|
rem_button.disabled = true
|
|
|
|
|
submit_button.disabled = Globals.board_game.pending_board_state == null
|
|
|
|
|
else:
|
|
|
|
|
if Globals.board_game.pending_board_state != null:
|
|
|
|
|
pass_button.hide()
|
|
|
|
|
submit_button.show()
|
|
|
|
|
submit_button.disabled = false
|
|
|
|
|
undo_button.disabled = false
|
|
|
|
|
rem_button.disabled = true
|
|
|
|
|
else:
|
|
|
|
|
pass_button.show()
|
|
|
|
|
submit_button.hide()
|
|
|
|
|
submit_button.disabled = true
|
|
|
|
|
pass_button.disabled = false
|
|
|
|
|
undo_button.disabled = true
|
|
|
|
|
rem_button.disabled = false
|
|
|
|
|
else:
|
|
|
|
|
pass_button.show()
|
|
|
|
|
submit_button.hide()
|
|
|
|
|
rem_button.disabled = true
|
|
|
|
|
pass_button.disabled = true
|
|
|
|
|
undo_button.disabled = true
|
|
|
|
|
submit_button.disabled = true
|
2026-04-15 10:45:43 -05:00
|
|
|
|
|
|
|
|
|
2026-04-20 13:03:39 -05:00
|
|
|
func end_day() -> void:
|
|
|
|
|
undo_button.hide()
|
|
|
|
|
play_button.hide()
|
|
|
|
|
pause_button.show()
|
|
|
|
|
pass_button.hide()
|
|
|
|
|
submit_button.hide()
|
|
|
|
|
rem_button.disabled = true
|
2026-04-15 10:45:43 -05:00
|
|
|
|
|
|
|
|
|
2026-04-20 13:03:39 -05:00
|
|
|
func _on_pass_pressed():
|
|
|
|
|
Globals.board_game.handle_pass()
|
2026-04-15 10:45:43 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_submit_pressed():
|
2026-04-20 13:03:39 -05:00
|
|
|
Globals.board_game.handle_board_state_confirmed()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_undo_pressed():
|
|
|
|
|
print("TODO: Handle undo!")
|
2026-04-13 11:34:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_pause_pressed():
|
2026-04-15 10:45:43 -05:00
|
|
|
get_tree().call_group("Pausable", "pause")
|
2026-04-13 11:34:00 -05:00
|
|
|
play_button.show()
|
|
|
|
|
pause_button.hide()
|
|
|
|
|
|
|
|
|
|
|
2026-04-15 10:45:43 -05:00
|
|
|
func _on_play_pressed():
|
|
|
|
|
get_tree().call_group("Pausable", "unpause")
|
|
|
|
|
play_button.hide()
|
|
|
|
|
pause_button.show()
|
|
|
|
|
|
|
|
|
|
|
2026-04-13 11:34:00 -05:00
|
|
|
func _on_blueprints_pressed():
|
|
|
|
|
_show_real_estate_market()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func handle_tile_selected(tile: Tile):
|
|
|
|
|
_hide_real_estate_market()
|
2026-04-20 13:03:39 -05:00
|
|
|
Globals.board_game.select_tile(tile)
|
2026-04-15 10:45:43 -05:00
|
|
|
|
2026-04-13 11:34:00 -05:00
|
|
|
|
|
|
|
|
func handle_building_selected(building: Building) -> void:
|
|
|
|
|
_hide_real_estate_market()
|
2026-04-20 13:03:39 -05:00
|
|
|
var db = building.get_parent().get_parent()
|
|
|
|
|
if db is DraftBuilding:
|
|
|
|
|
Globals.board_game.select_building(building, db.get_index())
|
|
|
|
|
else:
|
|
|
|
|
Globals.board_game.select_building(building)
|
2026-04-15 10:45:43 -05:00
|
|
|
|
2026-04-13 11:34:00 -05:00
|
|
|
|
|
|
|
|
func _on_walls_pressed():
|
2026-04-20 13:03:39 -05:00
|
|
|
Globals.board_game.place_walls()
|
2026-04-13 11:34:00 -05:00
|
|
|
if start_walls.visible:
|
|
|
|
|
start_walls.hide()
|
|
|
|
|
stop_walls.show()
|
|
|
|
|
else:
|
|
|
|
|
start_walls.show()
|
|
|
|
|
stop_walls.hide()
|
|
|
|
|
_hide_real_estate_market()
|
|
|
|
|
|
2026-04-15 10:45:43 -05:00
|
|
|
|
2026-04-13 11:34:00 -05:00
|
|
|
func _hide_real_estate_market() -> void:
|
|
|
|
|
if is_instance_valid(rem_tween):
|
|
|
|
|
rem_tween.kill()
|
|
|
|
|
rem_tween = create_tween()
|
2026-04-15 10:45:43 -05:00
|
|
|
rem_tween.set_ignore_time_scale(true)
|
2026-04-13 11:34:00 -05:00
|
|
|
rem_tween.set_trans(Tween.TRANS_BACK)
|
2026-04-20 13:03:39 -05:00
|
|
|
rem_tween.tween_property(blueprints_container, "offset_bottom", 0, 0.5)
|
2026-04-15 10:45:43 -05:00
|
|
|
|
2026-04-13 11:34:00 -05:00
|
|
|
|
|
|
|
|
func _show_real_estate_market() -> void:
|
|
|
|
|
if is_instance_valid(rem_tween):
|
|
|
|
|
rem_tween.kill()
|
|
|
|
|
rem_tween = create_tween()
|
2026-04-15 10:45:43 -05:00
|
|
|
rem_tween.set_ignore_time_scale(true)
|
2026-04-13 11:34:00 -05:00
|
|
|
rem_tween.set_trans(Tween.TRANS_BACK)
|
2026-04-20 13:03:39 -05:00
|
|
|
rem_tween.tween_property(
|
|
|
|
|
blueprints_container, "offset_bottom", blueprints_container.size.y, 0.5
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _hide_hand() -> void:
|
|
|
|
|
if is_instance_valid(hand_tween):
|
|
|
|
|
hand_tween.kill()
|
|
|
|
|
hand_tween = create_tween()
|
|
|
|
|
hand_tween.set_ignore_time_scale(true)
|
|
|
|
|
hand_tween.set_trans(Tween.TRANS_BACK)
|
|
|
|
|
hand_tween.tween_property(hand, "offset_top", 0, 0.5)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _show_hand() -> void:
|
|
|
|
|
if is_instance_valid(hand_tween):
|
|
|
|
|
hand_tween.kill()
|
|
|
|
|
hand_tween = create_tween()
|
|
|
|
|
hand_tween.set_ignore_time_scale(true)
|
|
|
|
|
hand_tween.set_trans(Tween.TRANS_BACK)
|
|
|
|
|
hand_tween.tween_property(hand, "offset_top", -hand.size.y, 0.5)
|
2026-04-15 10:45:43 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
func _speed_up_engine(speed: float) -> void:
|
|
|
|
|
if is_instance_valid(es_tween):
|
|
|
|
|
es_tween.kill()
|
|
|
|
|
es_tween = create_tween()
|
|
|
|
|
es_tween.set_ignore_time_scale(true)
|
|
|
|
|
es_tween.tween_property(Engine, "time_scale", speed, 0.5)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_fast_forward_1_pressed():
|
|
|
|
|
_speed_up_engine(2)
|
|
|
|
|
fast_1.hide()
|
|
|
|
|
fast_2.show()
|
|
|
|
|
fast_4.hide()
|
|
|
|
|
fast_10.hide()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_fast_forward_2_pressed():
|
|
|
|
|
_speed_up_engine(4)
|
|
|
|
|
fast_1.hide()
|
|
|
|
|
fast_2.hide()
|
|
|
|
|
fast_4.show()
|
|
|
|
|
fast_10.hide()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_fast_forward_4_pressed():
|
|
|
|
|
_speed_up_engine(10)
|
|
|
|
|
fast_1.hide()
|
|
|
|
|
fast_2.hide()
|
|
|
|
|
fast_4.hide()
|
|
|
|
|
fast_10.show()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_fast_forward_10_pressed():
|
|
|
|
|
_speed_up_engine(1)
|
|
|
|
|
fast_1.show()
|
|
|
|
|
fast_2.hide()
|
|
|
|
|
fast_4.hide()
|
|
|
|
|
fast_10.hide()
|
2026-04-20 13:03:39 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_cancel_placement_pressed():
|
|
|
|
|
_hide_real_estate_market()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_hand_building_selected(building: Building) -> void:
|
|
|
|
|
for selector in hand.buildings_container.get_children():
|
|
|
|
|
if selector.get_child(0) != building:
|
|
|
|
|
selector.hide()
|
|
|
|
|
draft_building = building
|
|
|
|
|
draft_cost_container.show()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@rpc("any_peer", "call_local", "reliable")
|
|
|
|
|
func add_to_draft(building_data: Dictionary) -> void:
|
|
|
|
|
Globals.board_game.add_building_to_draft.rpc()
|
|
|
|
|
var db: DraftBuilding = DRAFT_BUILDING_SCENE.instantiate()
|
|
|
|
|
draft_container.add_child(db)
|
|
|
|
|
draft_building = Building.deserialize(building_data)
|
|
|
|
|
db.set_building(draft_building)
|
|
|
|
|
db.building_selector.select_building.connect(handle_building_selected)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@rpc("any_peer", "call_local", "reliable")
|
|
|
|
|
func remove_from_draft(draft_building_index: int) -> void:
|
|
|
|
|
draft_container.get_child(draft_building_index).queue_free()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_set_draft_cost_pressed():
|
|
|
|
|
_hide_hand()
|
|
|
|
|
draft_cost_container.hide()
|
|
|
|
|
draft_building.cost = roundi(draft_cost_spinner.value)
|
|
|
|
|
add_to_draft.rpc(draft_building.serialize())
|