diff --git a/prefabs/board.gd b/prefabs/board.gd index 3771717..9e06050 100644 --- a/prefabs/board.gd +++ b/prefabs/board.gd @@ -9,6 +9,7 @@ const UP_SPAWN = preload("uid://6ywvgci44ttv") const RIGHT_SPAWN = preload("uid://c1y3s7daosghf") const DOWN_SPAWN = preload("uid://d4ltd1geg7s2p") const LEFT_SPAWN = preload("uid://noi2ko4hceus") +const SOUP_KITCHEN_SCENE = preload("uid://dmfnipmjntenc") var tiles: Dictionary[Vector2i, Tile] = {} var buildings: Dictionary[Vector2i, Building] = {} @@ -45,21 +46,21 @@ func _input(event: InputEvent) -> void: elif active_building != null: place_active_building() _handle_building_rotation(event) - #_handle_spawn_rotation(event) + _handle_spawn_rotation(event) func set_active_tile(tile: Tile) -> void: active_tile = tile board_state.add_child(active_tile) active_tile.modulate = Color(1, 1, 1, 0.5) + active_tile.player = Globals.board_game.current_board_state.current_player active_tile.is_placing = true func set_active_building(building: Building) -> void: active_building = building board_state.add_child(active_building) - if active_building is Home: - active_building.player = Globals.board_game.current_board_state.current_player + active_building.player = Globals.board_game.current_board_state.current_player active_building.modulate = Color(1, 1, 1, 0.5) active_building.is_placing = true @@ -70,17 +71,36 @@ func place_active_tile() -> void: tiles.erase(current_map_coord) if !tiles.has(current_map_coord) and !buildings.has(current_map_coord): Globals.board_game.current_board_state.players[0].money -= active_tile.cost + if Globals.board_game.current_board_state.state != BoardState.State.INITIAL_SETUP: + Globals.board_game.current_board_state.players[0].build_actions_taken += 1 active_tile.modulate = Color(1, 1, 1, 1) active_tile.coords = current_map_coord tiles[current_map_coord] = active_tile active_tile = null board_state_changed.emit() + elif ( + tiles.has(current_map_coord) + and tiles[current_map_coord].day_placed < Globals.board_game.current_board_state.day + ): + var tile = tiles[current_map_coord] + if Globals.board_game.current_board_state.players[0].money >= tile.cost * 2: + var tile_player_index = Globals.board_game.current_board_state.get_player_index( + tile.player + ) + Globals.board_game.current_board_state.players[tile_player_index].money += tile.cost * 2 + Globals.board_game.current_board_state.players[0].money -= tile.cost * 2 + Globals.board_game.current_board_state.players[0].money -= active_tile.cost + tiles[current_map_coord].queue_free() + active_tile.modulate = Color(1, 1, 1, 1) + active_tile.coords = current_map_coord + tiles[current_map_coord] = active_tile + active_tile = null + board_state_changed.emit() func place_active_building() -> void: active_building.starting_coord = current_map_coord - if active_building is Home: - active_building.player = Globals.board_game.current_board_state.current_player + active_building.player = Globals.board_game.current_board_state.current_player for coord in active_building.get_tile_coords(): if tiles.has(coord) and !(tiles[coord] is Ground): return @@ -90,17 +110,45 @@ func place_active_building() -> void: if buildings.has(surr_coord): return Globals.board_game.current_board_state.players[0].money -= active_building.cost + if Globals.board_game.current_board_state.state != BoardState.State.INITIAL_SETUP: + Globals.board_game.current_board_state.players[0].build_actions_taken += 1 active_building.modulate = Color(1, 1, 1, 1) for coord in active_building.get_tile_coords(): buildings[coord] = active_building tiles[coord].queue_free() tiles.erase(coord) - active_building = null + if active_building is Spawn: + Globals.board_game.current_board_state.spawn_placements -= 1 board_state_changed.emit() + active_building = null + + +func remove_home(player: Player) -> void: + for coord in buildings.keys(): + var building = buildings[coord] + if building is Home and building.player.id == player.id: + remove_building(coord, building) + + +func remove_hq(player: Player) -> void: + for coord in buildings.keys(): + var building = buildings[coord] + if building is HQ and building.player.id == player.id: + remove_building(coord, building) + + +func remove_building(coord: Vector2i, building: Building) -> void: + buildings.erase(coord) + building.free() + var ground: Ground = GROUND.instantiate() + board_state.add_child(ground) + ground.position = tile_map.map_to_local(coord) + ground.coords = coord + tiles[coord] = ground func _handle_building_rotation(event: InputEvent) -> void: - if active_building == null: + if active_building == null or active_building is Spawn: return if event.is_action_pressed("rotate_tile_up"): active_building.rotation_degrees += 90 @@ -110,9 +158,40 @@ func _handle_building_rotation(event: InputEvent) -> void: active_building.tile_rotation = get_previous_direction(active_building.tile_rotation) +func _handle_spawn_rotation(event: InputEvent) -> void: + if active_building == null or active_building is not Spawn: + return + if event.is_action_pressed("rotate_tile_up"): + var curr_position = active_building.position + active_building.queue_free() + match active_building.direction: + Direction.UP: + set_active_building(RIGHT_SPAWN.instantiate()) + Direction.RIGHT: + set_active_building(DOWN_SPAWN.instantiate()) + Direction.DOWN: + set_active_building(LEFT_SPAWN.instantiate()) + Direction.LEFT: + set_active_building(UP_SPAWN.instantiate()) + active_building.position = curr_position + elif event.is_action_pressed("rotate_tile_down"): + var curr_position = active_building.position + active_building.queue_free() + match active_building.direction: + Direction.UP: + set_active_building(LEFT_SPAWN.instantiate()) + Direction.RIGHT: + set_active_building(UP_SPAWN.instantiate()) + Direction.DOWN: + set_active_building(RIGHT_SPAWN.instantiate()) + Direction.LEFT: + set_active_building(DOWN_SPAWN.instantiate()) + active_building.position = curr_position + + func reset() -> void: for child in board_state.get_children(): - child.queue_free() + child.free() func set_board_state(bs: BoardState) -> void: @@ -129,8 +208,6 @@ func set_board_state(bs: BoardState) -> void: func initialize() -> void: - var max_x: int = 0 - var max_y: int = 0 for i in range(Globals.game.players.size()): var random_spawn = Vector2i(randi_range(0, 9), randi_range(0, 9)) for x in range(10): @@ -142,8 +219,6 @@ func initialize() -> void: coord.y += 10 if i == 3: coord += Vector2i(10, 10) - max_x = coord.x - max_y = coord.y if x == random_spawn.x and y == random_spawn.y: var possible_spawns = [UP_SPAWN, RIGHT_SPAWN, DOWN_SPAWN, LEFT_SPAWN] if random_spawn.x == 9: @@ -154,23 +229,54 @@ func initialize() -> void: possible_spawns.erase(DOWN_SPAWN) elif random_spawn.y == 0: possible_spawns.erase(UP_SPAWN) - var spawn: Tile = possible_spawns.pick_random().instantiate() + var spawn: Building = possible_spawns.pick_random().instantiate() board_state.add_child(spawn) - spawn.coords = coord + spawn.starting_coord = coord spawn.position = tile_map.map_to_local(coord) - tiles[coord] = spawn + buildings[coord] = spawn else: var ground: Tile = GROUND.instantiate() board_state.add_child(ground) ground.coords = coord ground.position = tile_map.map_to_local(coord) tiles[coord] = ground - var extra_spawn_coord := Vector2i(randi_range(1, max_x - 1), randi_range(1, max_y - 1)) + var extra_spawn_coord := get_random_available_tile_coord() var extra_spawn = [UP_SPAWN, RIGHT_SPAWN, DOWN_SPAWN, LEFT_SPAWN].pick_random().instantiate() board_state.add_child(extra_spawn) - extra_spawn.coords = extra_spawn_coord + extra_spawn.starting_coord = extra_spawn_coord extra_spawn.position = tile_map.map_to_local(extra_spawn_coord) - tiles[extra_spawn_coord] = extra_spawn + tiles[extra_spawn_coord].queue_free() + tiles.erase(extra_spawn_coord) + buildings[extra_spawn_coord] = extra_spawn + + var soup_kitchen_coords := get_random_available_tile_coord() + var soup_kitchen: SoupKitchen = SOUP_KITCHEN_SCENE.instantiate() + board_state.add_child(soup_kitchen) + soup_kitchen.starting_coord = soup_kitchen_coords + for skc in soup_kitchen.get_tile_coords(): + buildings[skc] = soup_kitchen + tiles[skc].free() + tiles.erase(skc) + soup_kitchen.position = tile_map.map_to_local(soup_kitchen_coords) + + +func get_random_available_tile_coord() -> Vector2i: + return tiles.keys().filter(is_cross_shape_available).pick_random() + + +func is_cross_shape_available(coord: Vector2i) -> bool: + return ( + tiles[coord] is Ground + and !buildings.has(coord) + and tiles.get(Vector2i(coord.x + 1, coord.y)) is Ground + and !buildings.has(Vector2i(coord.x + 1, coord.y)) + and tiles.get(Vector2i(coord.x - 1, coord.y)) is Ground + and !buildings.has(Vector2i(coord.x - 1, coord.y)) + and tiles.get(Vector2i(coord.x, coord.y + 1)) is Ground + and !buildings.has(Vector2i(coord.x, coord.y + 1)) + and tiles.get(Vector2i(coord.x, coord.y - 1)) is Ground + and !buildings.has(Vector2i(coord.x, coord.y - 1)) + ) static func get_next_direction(direction: Direction, count: int = 1) -> Direction: @@ -217,17 +323,3 @@ static func get_direction_vector(direction: Direction) -> Vector2i: return Vector2i.LEFT _: return Vector2i.ZERO - -#func generate() -> void: -#for child in get_children(): -#child.queue_free() -#for x in range(width): -#for y in range(height): -#var tile: Control -#if x == 1 and y == 1: -#tile = spawn_scene.instantiate() -#else: -#tile = ground_scene.instantiate() -#add_child(tile) -#tile.position = get_coordinate(x, y) -#tile.owner = self diff --git a/prefabs/citizen.gd b/prefabs/citizen.gd index 98e19c4..8966c11 100644 --- a/prefabs/citizen.gd +++ b/prefabs/citizen.gd @@ -41,6 +41,7 @@ var _statuses: Array[Status] = [] func _ready() -> void: Globals.board_game.citizen_count += 1 + money = Globals.board_game.current_board_state.citizens_starting_money func pause() -> void: @@ -155,6 +156,13 @@ func check_for_turn(tile: Tile) -> void: direction = tile.direction +func check_for_adjacent_building() -> void: + for adj in [Vector2i.UP, Vector2i.RIGHT, Vector2i.DOWN, Vector2i.LEFT]: + var building = Globals.board_game.board.buildings.get(current_tile_coords + adj) + if building is SoupKitchen: + building.activate(self) + + func check_for_building() -> void: if Globals.board_game.board.buildings.has( current_tile_coords + Board.get_direction_vector(direction) @@ -187,12 +195,14 @@ func handle_tile_area_exited(_area: Area2D): buildings_visited[building] += 1 building.activate(self) direction_queue = building.get_direction_queue(self) - direction = direction_queue.pop_front() + if !direction_queue.is_empty(): + direction = direction_queue.pop_front() elif Globals.board_game.board.tiles.has(current_tile_coords): var tile = Globals.board_game.board.tiles[current_tile_coords] if !tiles_visited.has(tile): tiles_visited.set(tile, 0) tiles_visited[tile as Tile] += 1 + check_for_adjacent_building() check_for_building() check_for_turn(tile) if ( diff --git a/prefabs/tiles/buildings/bank.gd b/prefabs/tiles/buildings/bank.gd index 71c2428..ff18a6e 100644 --- a/prefabs/tiles/buildings/bank.gd +++ b/prefabs/tiles/buildings/bank.gd @@ -65,5 +65,10 @@ func handle_post_turn_actions() -> void: money *= 2 +func _ready() -> void: + _set_money_label() + + func _set_money_label() -> void: - money_label.text = "$%d" % money + if is_node_ready(): + money_label.text = "$%d" % money diff --git a/prefabs/tiles/buildings/bank.tscn b/prefabs/tiles/buildings/bank.tscn index 94b8405..baef63d 100644 --- a/prefabs/tiles/buildings/bank.tscn +++ b/prefabs/tiles/buildings/bank.tscn @@ -3,6 +3,9 @@ [ext_resource type="Script" uid="uid://dqivl44ibmsl6" path="res://prefabs/tiles/buildings/bank.gd" id="1_q4p5y"] [ext_resource type="Texture2D" uid="uid://t8n660a0vqvm" path="res://assets/Pixelart arrow icon pack 1.0.png" id="2_68e07"] +[sub_resource type="Gradient" id="Gradient_q4p5y"] +colors = PackedColorArray(0, 1, 0, 1, 1, 0, 0, 1) + [sub_resource type="LabelSettings" id="LabelSettings_vwg8v"] outline_size = 4 outline_color = Color(0, 0, 0, 1) @@ -58,6 +61,35 @@ offset_bottom = -55.0 mouse_filter = 2 color = Color(0, 1, 0, 1) +[node name="Edge1" type="Line2D" parent="." unique_id=339174361] +position = Vector2(55, -165) +points = PackedVector2Array(0, 0, 0, 220) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge2" type="Line2D" parent="." unique_id=13095279] +position = Vector2(-55, -55) +points = PackedVector2Array(0, 0, 220, 0) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Path1" type="Line2D" parent="." unique_id=1853389348] +points = PackedVector2Array(-10, -155, -10, 45, 10, 45, 10, -155) +width = 2.0 +gradient = SubResource("Gradient_q4p5y") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path2" type="Line2D" parent="." unique_id=1557159962] +position = Vector2(110, 0) +points = PackedVector2Array(-10, -155, -10, 45, 10, 45, 10, -155) +width = 2.0 +gradient = SubResource("Gradient_q4p5y") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + [node name="Label" type="Label" parent="." unique_id=29286194] custom_minimum_size = Vector2(220, 110) offset_left = -55.0 @@ -157,8 +189,3 @@ offset_top = -205.0 offset_right = 165.0 offset_bottom = 55.0 mouse_filter = 2 - -[connection signal="area_entered" from="Square1" to="." method="_on_building_area_entered"] -[connection signal="area_entered" from="Square2" to="." method="_on_building_area_entered"] -[connection signal="area_entered" from="Square3" to="." method="_on_building_area_entered"] -[connection signal="area_entered" from="Square4" to="." method="_on_building_area_entered"] diff --git a/prefabs/tiles/buildings/bar.tscn b/prefabs/tiles/buildings/bar.tscn index 2ea06f0..4c15d42 100644 --- a/prefabs/tiles/buildings/bar.tscn +++ b/prefabs/tiles/buildings/bar.tscn @@ -3,6 +3,9 @@ [ext_resource type="Script" uid="uid://ptm2cd3y5f14" path="res://prefabs/tiles/buildings/bar.gd" id="1_cy06p"] [ext_resource type="Texture2D" uid="uid://t8n660a0vqvm" path="res://assets/Pixelart arrow icon pack 1.0.png" id="2_iv3ev"] +[sub_resource type="Gradient" id="Gradient_cy06p"] +colors = PackedColorArray(0, 1, 0, 1, 1, 0, 0, 1) + [sub_resource type="LabelSettings" id="LabelSettings_vwg8v"] outline_size = 4 outline_color = Color(0, 0, 0, 1) @@ -40,6 +43,28 @@ offset_bottom = -55.0 mouse_filter = 2 color = Color(0.735357, 0, 1, 1) +[node name="Edge1" type="Line2D" parent="." unique_id=1476024039] +position = Vector2(-55, -55) +points = PackedVector2Array(0, 0, 110, 0) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Path1" type="Line2D" parent="." unique_id=69409061] +points = PackedVector2Array(-10, 45, -10, -155) +width = 2.0 +gradient = SubResource("Gradient_cy06p") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path2" type="Line2D" parent="." unique_id=143275132] +points = PackedVector2Array(10, -155, 10, 45) +width = 2.0 +gradient = SubResource("Gradient_cy06p") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + [node name="Label" type="Label" parent="." unique_id=29286194] custom_minimum_size = Vector2(110, 220) offset_left = -55.0 diff --git a/prefabs/tiles/buildings/building.gd b/prefabs/tiles/buildings/building.gd index df7e661..111299d 100644 --- a/prefabs/tiles/buildings/building.gd +++ b/prefabs/tiles/buildings/building.gd @@ -1,6 +1,8 @@ class_name Building extends Node2D @export var cost: int = 0 +@export var player: Player: + set = _set_player var is_placing: bool = false: set(value): @@ -39,6 +41,10 @@ func get_rotation_count() -> int: return rotation_count +func _set_player(new_player: Player) -> void: + player = new_player + + func serialize() -> Dictionary: var result = {} result["scene_file_path"] = scene_file_path @@ -48,6 +54,10 @@ func serialize() -> Dictionary: result["player"] = null if get("player") != null: result["player"] = get("player").serialize() + if get("money") != null: + result["money"] = get("money") + if get("required_money") != null: + result["required_money"] = get("required_money") return result @@ -58,4 +68,8 @@ static func deserialize(data: Dictionary) -> Building: building.cost = data["cost"] if data["player"] != null: building.player = Player.deserialize(data["player"]) + if data.get("money") != null: + building.money = data["money"] + if data.get("required_money") != null: + building.required_money = data["required_money"] return building diff --git a/prefabs/tiles/buildings/cafe.tscn b/prefabs/tiles/buildings/cafe.tscn index 7f2b23f..b5b8cfd 100644 --- a/prefabs/tiles/buildings/cafe.tscn +++ b/prefabs/tiles/buildings/cafe.tscn @@ -3,6 +3,9 @@ [ext_resource type="Script" uid="uid://2m1djjoa3vji" path="res://prefabs/tiles/buildings/cafe.gd" id="1_rc38y"] [ext_resource type="Texture2D" uid="uid://t8n660a0vqvm" path="res://assets/Pixelart arrow icon pack 1.0.png" id="2_721qv"] +[sub_resource type="Gradient" id="Gradient_rc38y"] +colors = PackedColorArray(0, 1, 0, 1, 1, 0, 0, 1) + [sub_resource type="LabelSettings" id="LabelSettings_vwg8v"] outline_size = 4 outline_color = Color(0, 0, 0, 1) @@ -58,6 +61,37 @@ offset_bottom = -55.0 mouse_filter = 2 color = Color(1, 0.41822335, 0, 1) +[node name="Edge1" type="Line2D" parent="." unique_id=1571287153] +points = PackedVector2Array(55, -55, 55, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge2" type="Line2D" parent="." unique_id=1717512039] +points = PackedVector2Array(55, -55, 165, -55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge3" type="Line2D" parent="." unique_id=1513651550] +points = PackedVector2Array(165, -165, 165, -55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Path1" type="Line2D" parent="." unique_id=1015237330] +points = PackedVector2Array(-35, -10, 100, -10, 100, -120, 255, -120) +width = 2.0 +gradient = SubResource("Gradient_rc38y") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path2" type="Line2D" parent="." unique_id=529957110] +points = PackedVector2Array(255, -100, 120, -100, 120, 10, -35, 10) +width = 2.0 +gradient = SubResource("Gradient_rc38y") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + [node name="Label" type="Label" parent="." unique_id=29286194] custom_minimum_size = Vector2(110, 220) offset_left = 55.0 diff --git a/prefabs/tiles/buildings/church.gd b/prefabs/tiles/buildings/church.gd new file mode 100644 index 0000000..f321337 --- /dev/null +++ b/prefabs/tiles/buildings/church.gd @@ -0,0 +1,92 @@ +extends Building + + +func can_citizen_enter(coord: Vector2i, direction: Board.Direction) -> bool: + var down_adjustment := Board.get_next_direction(Board.Direction.DOWN, get_rotation_count()) + var left_adjustment := Board.get_next_direction(Board.Direction.LEFT, get_rotation_count()) + var right_adjustment := Board.get_next_direction(Board.Direction.RIGHT, get_rotation_count()) + var correct_heading := Board.get_next_direction(Board.Direction.UP, get_rotation_count()) + + var entrance_1 := starting_coord + Board.get_direction_vector(down_adjustment) + var entrance_2 := ( + starting_coord + + Board.get_direction_vector(left_adjustment) + + Board.get_direction_vector(down_adjustment) + ) + var entrance_3 := ( + starting_coord + + Board.get_direction_vector(left_adjustment) + + Board.get_direction_vector(left_adjustment) + + Board.get_direction_vector(down_adjustment) + ) + var entrance_4 := ( + starting_coord + + Board.get_direction_vector(right_adjustment) + + Board.get_direction_vector(down_adjustment) + ) + var entrance_5 := ( + starting_coord + + Board.get_direction_vector(right_adjustment) + + Board.get_direction_vector(right_adjustment) + + Board.get_direction_vector(down_adjustment) + ) + + return ( + ( + coord == entrance_1 + or coord == entrance_2 + or coord == entrance_3 + or coord == entrance_4 + or coord == entrance_5 + ) + and direction == correct_heading + ) + + +func get_tile_coords() -> Array[Vector2i]: + var result: Array[Vector2i] = [] + result.push_back(starting_coord) + result.push_back( + starting_coord + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + ) + result.push_back( + starting_coord + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) * 2 + ) + result.push_back( + starting_coord + Vector2i(Vector2.LEFT.rotated(deg_to_rad(90 * get_rotation_count()))) + ) + result.push_back( + starting_coord + Vector2i(Vector2.LEFT.rotated(deg_to_rad(90 * get_rotation_count()))) * 2 + ) + return result + + +func get_direction_queue(citizen: Citizen) -> Array[Board.Direction]: + var result: Array[Board.Direction] = [] + match citizen.current_tile_coords - starting_coord: + Vector2i(-2, 0): + result.append(Board.Direction.RIGHT) + result.append(Board.Direction.RIGHT) + Vector2i(-1, 0): + result.append(Board.Direction.RIGHT) + Vector2i(2, 0): + result.append(Board.Direction.LEFT) + result.append(Board.Direction.LEFT) + Vector2i(1, 0): + result.append(Board.Direction.LEFT) + Vector2i(0, -2): + result.append(Board.Direction.DOWN) + result.append(Board.Direction.DOWN) + Vector2i(0, -1): + result.append(Board.Direction.DOWN) + Vector2i(0, 2): + result.append(Board.Direction.UP) + result.append(Board.Direction.UP) + Vector2i(0, 1): + result.append(Board.Direction.UP) + result.append(Board.get_next_direction(Board.Direction.UP, get_rotation_count())) + return result + + +func activate(_citizen: Citizen) -> void: + pass diff --git a/prefabs/tiles/buildings/church.gd.uid b/prefabs/tiles/buildings/church.gd.uid new file mode 100644 index 0000000..96f1465 --- /dev/null +++ b/prefabs/tiles/buildings/church.gd.uid @@ -0,0 +1 @@ +uid://evjo56hrv60t diff --git a/prefabs/tiles/buildings/church.tscn b/prefabs/tiles/buildings/church.tscn new file mode 100644 index 0000000..9a59c54 --- /dev/null +++ b/prefabs/tiles/buildings/church.tscn @@ -0,0 +1,250 @@ +[gd_scene format=3 uid="uid://brn0nbkela0m4"] + +[ext_resource type="Script" uid="uid://evjo56hrv60t" path="res://prefabs/tiles/buildings/church.gd" id="1_8f6g1"] +[ext_resource type="Texture2D" uid="uid://t8n660a0vqvm" path="res://assets/Pixelart arrow icon pack 1.0.png" id="2_rjttq"] + +[sub_resource type="Gradient" id="Gradient_8f6g1"] +colors = PackedColorArray(0, 1, 0, 1, 1, 0, 0, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_vwg8v"] +outline_size = 4 +outline_color = Color(0, 0, 0, 1) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_vwg8v"] +size = Vector2(109, 109) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fupku"] +atlas = ExtResource("2_rjttq") +region = Rect2(0, 16, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wwwaf"] +atlas = ExtResource("2_rjttq") +region = Rect2(16, 16, 16, 16) + +[node name="Church" type="Node2D" unique_id=746270571] +process_mode = 3 +script = ExtResource("1_8f6g1") + +[node name="ColorRect" type="ColorRect" parent="." unique_id=889061850] +custom_minimum_size = Vector2(110, 110) +offset_left = -55.0 +offset_top = -55.0 +offset_right = 55.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(0.3070573, 0.15230635, 4.813075e-08, 1) + +[node name="ColorRect2" type="ColorRect" parent="." unique_id=76291108] +custom_minimum_size = Vector2(110, 110) +offset_left = -165.0 +offset_top = -55.0 +offset_right = -55.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(0.3070573, 0.15230635, 4.813075e-08, 1) + +[node name="ColorRect3" type="ColorRect" parent="." unique_id=786140755] +custom_minimum_size = Vector2(110, 110) +offset_left = -275.0 +offset_top = -55.0 +offset_right = -165.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(0.3070573, 0.15230635, 4.813075e-08, 1) + +[node name="ColorRect4" type="ColorRect" parent="." unique_id=557224551] +custom_minimum_size = Vector2(110, 110) +offset_left = 55.0 +offset_top = -55.0 +offset_right = 165.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(0.3070573, 0.15230635, 4.813075e-08, 1) + +[node name="ColorRect5" type="ColorRect" parent="." unique_id=1896618491] +custom_minimum_size = Vector2(110, 110) +offset_left = 165.0 +offset_top = -55.0 +offset_right = 275.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(0.3070573, 0.15230635, 4.813075e-08, 1) + +[node name="Edge1" type="Line2D" parent="." unique_id=1622669833] +points = PackedVector2Array(-55, -55, -55, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge2" type="Line2D" parent="." unique_id=634160434] +points = PackedVector2Array(-165, -55, -165, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge3" type="Line2D" parent="." unique_id=1462778911] +points = PackedVector2Array(55, -55, 55, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge4" type="Line2D" parent="." unique_id=305038753] +points = PackedVector2Array(165, -55, 165, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Path1" type="Line2D" parent="." unique_id=1746998022] +points = PackedVector2Array(-220, 35, -220, 0, 0, 0, 0, -35) +width = 2.0 +gradient = SubResource("Gradient_8f6g1") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path2" type="Line2D" parent="." unique_id=1220526561] +points = PackedVector2Array(-110, 35, -110, 0, 0, 0, 0, -35) +width = 2.0 +gradient = SubResource("Gradient_8f6g1") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path3" type="Line2D" parent="." unique_id=1172147913] +points = PackedVector2Array(0, 35, 0, 0, 0, 0, 0, -35) +width = 2.0 +gradient = SubResource("Gradient_8f6g1") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path5" type="Line2D" parent="." unique_id=1243414944] +points = PackedVector2Array(220, 35, 220, 0, 0, 0, 0, -35) +width = 2.0 +gradient = SubResource("Gradient_8f6g1") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path4" type="Line2D" parent="." unique_id=288012436] +points = PackedVector2Array(110, 35, 110, 0, 0, 0, 0, -35) +width = 2.0 +gradient = SubResource("Gradient_8f6g1") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Label" type="Label" parent="." unique_id=29286194] +custom_minimum_size = Vector2(110, 110) +offset_left = -55.0 +offset_top = -55.0 +offset_right = 55.0 +offset_bottom = 55.0 +text = "CHURCH" +label_settings = SubResource("LabelSettings_vwg8v") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Square1" type="Area2D" parent="." unique_id=333775731] +process_mode = 3 +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Square1" unique_id=1122204523] +process_mode = 3 +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square2" type="Area2D" parent="." unique_id=871528471] +process_mode = 3 +position = Vector2(-110, 0) +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Square2" unique_id=1328243658] +process_mode = 3 +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square3" type="Area2D" parent="." unique_id=1642876812] +process_mode = 3 +position = Vector2(-220, 0) +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Square3" unique_id=1392094497] +process_mode = 3 +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square4" type="Area2D" parent="." unique_id=2108585971] +process_mode = 3 +position = Vector2(110, 0) +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Square4" unique_id=11446925] +process_mode = 3 +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square5" type="Area2D" parent="." unique_id=304733612] +process_mode = 3 +position = Vector2(220, 0) +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Square5" unique_id=676150133] +process_mode = 3 +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Sprite2D2" type="Sprite2D" parent="." unique_id=1969702659] +texture_filter = 1 +position = Vector2(0, -75) +rotation = 3.1415927 +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_fupku") +flip_v = true + +[node name="Sprite2D3" type="Sprite2D" parent="." unique_id=1370361419] +texture_filter = 1 +position = Vector2(0, 75) +rotation = 3.1415927 +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_wwwaf") +flip_v = true + +[node name="Sprite2D4" type="Sprite2D" parent="." unique_id=412091220] +texture_filter = 1 +position = Vector2(110, 75) +rotation = 3.1415927 +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_wwwaf") +flip_v = true + +[node name="Sprite2D5" type="Sprite2D" parent="." unique_id=644104858] +texture_filter = 1 +position = Vector2(220, 75) +rotation = 3.1415927 +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_wwwaf") +flip_v = true + +[node name="Sprite2D6" type="Sprite2D" parent="." unique_id=1305702192] +texture_filter = 1 +position = Vector2(-110, 75) +rotation = 3.1415927 +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_wwwaf") +flip_v = true + +[node name="Sprite2D7" type="Sprite2D" parent="." unique_id=981017878] +texture_filter = 1 +position = Vector2(-220, 75) +rotation = 3.1415927 +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_wwwaf") +flip_v = true + +[node name="Size" type="Control" parent="." unique_id=1036213581] +unique_name_in_owner = true +layout_mode = 3 +anchors_preset = 0 +offset_left = -275.0 +offset_top = -90.0 +offset_right = 275.0 +offset_bottom = 90.0 +mouse_filter = 2 + +[connection signal="area_entered" from="Square1" to="." method="_on_building_area_entered"] +[connection signal="area_entered" from="Square2" to="." method="_on_building_area_entered"] +[connection signal="area_entered" from="Square3" to="." method="_on_building_area_entered"] +[connection signal="area_entered" from="Square4" to="." method="_on_building_area_entered"] +[connection signal="area_entered" from="Square5" to="." method="_on_building_area_entered"] diff --git a/prefabs/tiles/buildings/city_hall.gd b/prefabs/tiles/buildings/city_hall.gd new file mode 100644 index 0000000..aeb2f99 --- /dev/null +++ b/prefabs/tiles/buildings/city_hall.gd @@ -0,0 +1,91 @@ +extends Building + +var money: int = 0: + set(value): + money = value + _set_money_label() + +@onready var money_label: Label = %MoneyLabel + + +func can_citizen_enter(coord: Vector2i, direction: Board.Direction) -> bool: + var up_adjustment := Board.get_next_direction(Board.Direction.UP, get_rotation_count()) + var right_adjustment := Board.get_next_direction(Board.Direction.RIGHT, get_rotation_count()) + var heading_1 := Board.get_next_direction(Board.Direction.DOWN, get_rotation_count()) + var heading_2 := Board.get_next_direction(Board.Direction.LEFT, get_rotation_count()) + var heading_3 := Board.get_next_direction(Board.Direction.RIGHT, get_rotation_count()) + + var entrance_1 := starting_coord + Board.get_direction_vector(up_adjustment) + var entrance_2 := ( + starting_coord + + Board.get_direction_vector(right_adjustment) + + Board.get_direction_vector(up_adjustment) + ) + return ( + (coord == entrance_1 and direction == heading_1) + or (coord == entrance_2 and direction == heading_1) + or (coord == entrance_1 and direction == heading_2) + or (coord == entrance_2 and direction == heading_3) + ) + + +func get_tile_coords() -> Array[Vector2i]: + var result: Array[Vector2i] = [] + result.push_back(starting_coord) + result.push_back( + starting_coord + Vector2i(Vector2.LEFT.rotated(deg_to_rad(90 * get_rotation_count()))) + ) + result.push_back( + ( + starting_coord + + Vector2i(Vector2.LEFT.rotated(deg_to_rad(90 * get_rotation_count()))) + + Vector2i(Vector2.UP.rotated(deg_to_rad(90 * get_rotation_count()))) + ) + ) + result.push_back( + starting_coord + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + ) + result.push_back( + ( + starting_coord + + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + ) + ) + result.push_back( + ( + starting_coord + + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + + Vector2i(Vector2.UP.rotated(deg_to_rad(90 * get_rotation_count()))) + ) + ) + return result + + +func get_direction_queue(_citizen: Citizen) -> Array[Board.Direction]: + return [Board.Direction.NONE] + + +func activate(citizen: Citizen) -> void: + if citizen.get_status_count(Citizen.Status.ARMED) > 0: + citizen.money += money + citizen.play_money_animation() + citizen.remove_status(Citizen.Status.ARMED) + money = 0 + elif citizen.money > 0: + money += citizen.money + + +func handle_post_turn_actions() -> void: + Globals.board_game.current_board_state.citizens_starting_money += floori(money / 20.0) + money = money % 20 + + +func _ready() -> void: + _set_money_label() + + +func _set_money_label() -> void: + if is_node_ready(): + money_label.text = "$%d / $20" % money diff --git a/prefabs/tiles/buildings/city_hall.gd.uid b/prefabs/tiles/buildings/city_hall.gd.uid new file mode 100644 index 0000000..40a792f --- /dev/null +++ b/prefabs/tiles/buildings/city_hall.gd.uid @@ -0,0 +1 @@ +uid://o6nqgcvqrcvu diff --git a/prefabs/tiles/buildings/city_hall.tscn b/prefabs/tiles/buildings/city_hall.tscn new file mode 100644 index 0000000..1294f49 --- /dev/null +++ b/prefabs/tiles/buildings/city_hall.tscn @@ -0,0 +1,267 @@ +[gd_scene format=3 uid="uid://dtnejoimqiu0o"] + +[ext_resource type="Script" uid="uid://o6nqgcvqrcvu" path="res://prefabs/tiles/buildings/city_hall.gd" id="1_fjery"] +[ext_resource type="Texture2D" uid="uid://t8n660a0vqvm" path="res://assets/Pixelart arrow icon pack 1.0.png" id="2_ffriu"] + +[sub_resource type="Gradient" id="Gradient_q4p5y"] +colors = PackedColorArray(0, 1, 0, 1, 1, 0, 0, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_vwg8v"] +outline_size = 4 +outline_color = Color(0, 0, 0, 1) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_vwg8v"] +size = Vector2(109, 109) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wwwaf"] +atlas = ExtResource("2_ffriu") +region = Rect2(16, 16, 16, 16) + +[node name="CityHall" type="Node2D" unique_id=746270571 groups=["PostTurnActions"]] +process_mode = 3 +script = ExtResource("1_fjery") + +[node name="ColorRect" type="ColorRect" parent="." unique_id=889061850] +custom_minimum_size = Vector2(110, 110) +offset_left = -55.0 +offset_top = -55.0 +offset_right = 55.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(0.76862746, 0.76862746, 0.76862746, 1) + +[node name="ColorRect2" type="ColorRect" parent="." unique_id=2077475895] +custom_minimum_size = Vector2(110, 110) +offset_left = 165.0 +offset_top = -165.0 +offset_right = 275.0 +offset_bottom = -55.0 +mouse_filter = 2 +color = Color(0.76862746, 0.76862746, 0.76862746, 1) + +[node name="ColorRect3" type="ColorRect" parent="." unique_id=1401405224] +custom_minimum_size = Vector2(110, 110) +offset_left = 55.0 +offset_top = -55.0 +offset_right = 165.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(0.76862746, 0.76862746, 0.76862746, 1) + +[node name="ColorRect5" type="ColorRect" parent="." unique_id=1828290008] +custom_minimum_size = Vector2(110, 110) +offset_left = -165.0 +offset_top = -55.0 +offset_right = -55.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(0.76862746, 0.76862746, 0.76862746, 1) + +[node name="ColorRect6" type="ColorRect" parent="." unique_id=1870057015] +custom_minimum_size = Vector2(110, 110) +offset_left = 165.0 +offset_top = -55.0 +offset_right = 275.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(0.76862746, 0.76862746, 0.76862746, 1) + +[node name="ColorRect4" type="ColorRect" parent="." unique_id=255418342] +custom_minimum_size = Vector2(110, 110) +offset_left = -165.0 +offset_top = -165.0 +offset_right = -55.0 +offset_bottom = -55.0 +mouse_filter = 2 +color = Color(0.76862746, 0.76862746, 0.76862746, 1) + +[node name="Edge1" type="Line2D" parent="." unique_id=339174361] +position = Vector2(55, -55) +points = PackedVector2Array(0, 0, 0, 110) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge4" type="Line2D" parent="." unique_id=1932588550] +position = Vector2(165, -55) +points = PackedVector2Array(0, 0, 0, 110) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge3" type="Line2D" parent="." unique_id=834803169] +position = Vector2(-55, -55) +points = PackedVector2Array(0, 0, 0, 110) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge2" type="Line2D" parent="." unique_id=13095279] +position = Vector2(-165, -55) +points = PackedVector2Array(0, 0, 110, 0) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge5" type="Line2D" parent="." unique_id=1862206542] +position = Vector2(165, -55) +points = PackedVector2Array(0, 0, 110, 0) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Path1" type="Line2D" parent="." unique_id=1853389348] +points = PackedVector2Array(0, -45, 0, 0) +width = 2.0 +gradient = SubResource("Gradient_q4p5y") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path3" type="Line2D" parent="." unique_id=1156504221] +points = PackedVector2Array(110, -45, 110, 0) +width = 2.0 +gradient = SubResource("Gradient_q4p5y") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path2" type="Line2D" parent="." unique_id=1557159962] +visible = false +points = PackedVector2Array(-60, -110, -110, -110, -110, 0, 0, 0) +width = 2.0 +gradient = SubResource("Gradient_q4p5y") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path5" type="Line2D" parent="." unique_id=133940427] +points = PackedVector2Array(-60, -110, -110, -110) +width = 2.0 +gradient = SubResource("Gradient_q4p5y") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path4" type="Line2D" parent="." unique_id=2009894608] +visible = false +points = PackedVector2Array(170, -110, 220, -110, 220, 0, 110, 0) +width = 2.0 +gradient = SubResource("Gradient_q4p5y") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path6" type="Line2D" parent="." unique_id=566619967] +points = PackedVector2Array(170, -110, 220, -110) +width = 2.0 +gradient = SubResource("Gradient_q4p5y") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Label" type="Label" parent="." unique_id=29286194] +custom_minimum_size = Vector2(220, 110) +offset_left = -165.0 +offset_top = -55.0 +offset_right = 55.0 +offset_bottom = 55.0 +text = "CITY HALL" +label_settings = SubResource("LabelSettings_vwg8v") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="MoneyLabel" type="Label" parent="." unique_id=1651554831] +unique_name_in_owner = true +custom_minimum_size = Vector2(220, 110) +offset_left = 55.0 +offset_top = -55.0 +offset_right = 275.0 +offset_bottom = 55.0 +text = "$0 / $20" +label_settings = SubResource("LabelSettings_vwg8v") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Square1" type="Area2D" parent="." unique_id=333775731] +process_mode = 3 +position = Vector2(-110, -110) +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Square1" unique_id=1122204523] +process_mode = 3 +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square2" type="Area2D" parent="." unique_id=1695837302] +process_mode = 3 +position = Vector2(-110, 0) +monitoring = false + +[node name="CollisionShape2D2" type="CollisionShape2D" parent="Square2" unique_id=451761201] +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square3" type="Area2D" parent="." unique_id=1667620998] +process_mode = 3 +monitoring = false + +[node name="CollisionShape2D3" type="CollisionShape2D" parent="Square3" unique_id=636207289] +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square4" type="Area2D" parent="." unique_id=2144774838] +process_mode = 3 +position = Vector2(110, 0) +monitoring = false + +[node name="CollisionShape2D4" type="CollisionShape2D" parent="Square4" unique_id=847000506] +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square5" type="Area2D" parent="." unique_id=487050690] +process_mode = 3 +position = Vector2(220, 0) +monitoring = false + +[node name="CollisionShape2D3" type="CollisionShape2D" parent="Square5" unique_id=443838422] +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square6" type="Area2D" parent="." unique_id=166209419] +process_mode = 3 +position = Vector2(220, -110) +monitoring = false + +[node name="CollisionShape2D4" type="CollisionShape2D" parent="Square6" unique_id=1139295646] +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Sprite2D" type="Sprite2D" parent="." unique_id=1585332168] +texture_filter = 1 +position = Vector2(0, -75) +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_wwwaf") +flip_v = true + +[node name="Sprite2D3" type="Sprite2D" parent="." unique_id=1370361419] +texture_filter = 1 +position = Vector2(110, -75) +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_wwwaf") +flip_v = true + +[node name="Sprite2D2" type="Sprite2D" parent="." unique_id=642202825] +texture_filter = 1 +position = Vector2(-35, -110) +rotation = 1.5707964 +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_wwwaf") +flip_v = true + +[node name="Sprite2D4" type="Sprite2D" parent="." unique_id=1304871355] +texture_filter = 1 +position = Vector2(145, -110) +rotation = -1.5707964 +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_wwwaf") +flip_v = true + +[node name="Size" type="Control" parent="." unique_id=1957708982] +unique_name_in_owner = true +layout_mode = 3 +anchors_preset = 0 +offset_left = -165.0 +offset_top = -165.0 +offset_right = 275.0 +offset_bottom = 55.0 +mouse_filter = 2 diff --git a/prefabs/tiles/buildings/demolitions.gd b/prefabs/tiles/buildings/demolitions.gd new file mode 100644 index 0000000..86491b8 --- /dev/null +++ b/prefabs/tiles/buildings/demolitions.gd @@ -0,0 +1,105 @@ +extends Building + +var money: int = 0: + set(value): + money = value + _set_money_label() + +var required_money: int = 25 + +@onready var money_label: Label = %MoneyLabel + + +func can_citizen_enter(coord: Vector2i, direction: Board.Direction) -> bool: + var down_adjustment := Board.get_next_direction(Board.Direction.DOWN, get_rotation_count()) + var left_adjustment := Board.get_next_direction(Board.Direction.LEFT, get_rotation_count()) + var right_adjustment := Board.get_next_direction(Board.Direction.RIGHT, get_rotation_count()) + var heading_1 := Board.get_next_direction(Board.Direction.RIGHT, get_rotation_count()) + var heading_2 := Board.get_next_direction(Board.Direction.UP, get_rotation_count()) + + var entrance_1 := starting_coord + Board.get_direction_vector(left_adjustment) + var entrance_2 := ( + starting_coord + + Board.get_direction_vector(right_adjustment) + + Board.get_direction_vector(down_adjustment) + + Board.get_direction_vector(down_adjustment) + ) + return ( + (coord == entrance_1 and direction == heading_1) + or (coord == entrance_2 and direction == heading_2) + ) + + +func get_tile_coords() -> Array[Vector2i]: + var result: Array[Vector2i] = [] + result.push_back(starting_coord) + result.push_back( + starting_coord + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + ) + result.push_back( + ( + starting_coord + + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + + Vector2i(Vector2.DOWN.rotated(deg_to_rad(90 * get_rotation_count()))) + ) + ) + result.push_back( + ( + starting_coord + + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + ) + ) + result.push_back( + ( + starting_coord + + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + + Vector2i(Vector2.RIGHT.rotated(deg_to_rad(90 * get_rotation_count()))) + + Vector2i(Vector2.UP.rotated(deg_to_rad(90 * get_rotation_count()))) + ) + ) + return result + + +func get_direction_queue(citizen: Citizen) -> Array[Board.Direction]: + if (citizen.current_tile_coords - starting_coord) == Vector2i.ZERO: + return [ + Board.get_next_direction(Board.Direction.RIGHT, get_rotation_count()), + Board.get_next_direction(Board.Direction.RIGHT, get_rotation_count()), + Board.get_next_direction(Board.Direction.UP, get_rotation_count()), + Board.get_next_direction(Board.Direction.UP, get_rotation_count()) + ] + return [ + Board.get_next_direction(Board.Direction.UP, get_rotation_count()), + Board.get_next_direction(Board.Direction.RIGHT, get_rotation_count()), + Board.get_next_direction(Board.Direction.UP, get_rotation_count()), + Board.get_next_direction(Board.Direction.UP, get_rotation_count()) + ] + + +func activate(citizen: Citizen) -> void: + if citizen.get_status_count(Citizen.Status.ARMED) > 0: + citizen.money += money + citizen.play_money_animation() + citizen.remove_status(Citizen.Status.ARMED) + money = 0 + elif citizen.money > 0: + money += citizen.money + citizen.money = 0 + #citizen.play_money_animation() + + +func handle_post_turn_actions() -> void: + var buildings_to_destroy := floori(money / (required_money as float)) + if buildings_to_destroy > 0: + money = money % required_money + required_money *= 2 + + +func _ready() -> void: + _set_money_label() + + +func _set_money_label() -> void: + if is_node_ready(): + money_label.text = "$%d / $%d" % [money, required_money] diff --git a/prefabs/tiles/buildings/demolitions.gd.uid b/prefabs/tiles/buildings/demolitions.gd.uid new file mode 100644 index 0000000..3f718ef --- /dev/null +++ b/prefabs/tiles/buildings/demolitions.gd.uid @@ -0,0 +1 @@ +uid://vqn4mgyjkijm diff --git a/prefabs/tiles/buildings/demolitions.tscn b/prefabs/tiles/buildings/demolitions.tscn new file mode 100644 index 0000000..a40bd73 --- /dev/null +++ b/prefabs/tiles/buildings/demolitions.tscn @@ -0,0 +1,211 @@ +[gd_scene format=3 uid="uid://dvmglvbersupv"] + +[ext_resource type="Script" uid="uid://vqn4mgyjkijm" path="res://prefabs/tiles/buildings/demolitions.gd" id="1_veblj"] +[ext_resource type="Texture2D" uid="uid://t8n660a0vqvm" path="res://assets/Pixelart arrow icon pack 1.0.png" id="2_gnrqc"] + +[sub_resource type="Gradient" id="Gradient_rc38y"] +colors = PackedColorArray(0, 1, 0, 1, 1, 0, 0, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_vwg8v"] +outline_size = 4 +outline_color = Color(0, 0, 0, 1) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_vwg8v"] +size = Vector2(109, 109) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wwwaf"] +atlas = ExtResource("2_gnrqc") +region = Rect2(16, 16, 16, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fupku"] +atlas = ExtResource("2_gnrqc") +region = Rect2(0, 16, 16, 16) + +[node name="Demolitions" type="Node2D" unique_id=746270571] +process_mode = 3 +script = ExtResource("1_veblj") + +[node name="ColorRect" type="ColorRect" parent="." unique_id=889061850] +custom_minimum_size = Vector2(110, 110) +offset_left = -55.0 +offset_top = -55.0 +offset_right = 55.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(1, 0.32086813, 0.41687015, 1) + +[node name="ColorRect2" type="ColorRect" parent="." unique_id=2077475895] +custom_minimum_size = Vector2(110, 110) +offset_left = 55.0 +offset_top = 55.0 +offset_right = 165.0 +offset_bottom = 165.0 +mouse_filter = 2 +color = Color(1, 0.32086813, 0.41687015, 1) + +[node name="ColorRect3" type="ColorRect" parent="." unique_id=1401405224] +custom_minimum_size = Vector2(110, 110) +offset_left = 55.0 +offset_top = -55.0 +offset_right = 165.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(1, 0.32086813, 0.41687015, 1) + +[node name="ColorRect4" type="ColorRect" parent="." unique_id=255418342] +custom_minimum_size = Vector2(110, 110) +offset_left = 165.0 +offset_top = -165.0 +offset_right = 275.0 +offset_bottom = -55.0 +mouse_filter = 2 +color = Color(1, 0.32086813, 0.41687015, 1) + +[node name="ColorRect5" type="ColorRect" parent="." unique_id=835614422] +custom_minimum_size = Vector2(110, 110) +offset_left = 165.0 +offset_top = -55.0 +offset_right = 275.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(1, 0.32086813, 0.41687015, 1) + +[node name="Edge1" type="Line2D" parent="." unique_id=1571287153] +points = PackedVector2Array(55, -55, 55, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge2" type="Line2D" parent="." unique_id=1717512039] +points = PackedVector2Array(55, 55, 165, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge4" type="Line2D" parent="." unique_id=1861531130] +points = PackedVector2Array(165, -55, 275, -55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge3" type="Line2D" parent="." unique_id=1513651550] +points = PackedVector2Array(165, -55, 165, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Path1" type="Line2D" parent="." unique_id=1015237330] +points = PackedVector2Array(-45, 0, 220, 0, 220, -155) +width = 2.0 +gradient = SubResource("Gradient_rc38y") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path2" type="Line2D" parent="." unique_id=1737173036] +points = PackedVector2Array(110, 155, 110, 0, 220, 0, 220, -155) +width = 2.0 +gradient = SubResource("Gradient_rc38y") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Label" type="Label" parent="." unique_id=29286194] +custom_minimum_size = Vector2(220, 110) +offset_left = -55.0 +offset_top = -55.0 +offset_right = 165.0 +offset_bottom = 55.0 +text = "DEMOLITIONS" +label_settings = SubResource("LabelSettings_vwg8v") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="MoneyLabel" type="Label" parent="." unique_id=1384875448] +unique_name_in_owner = true +custom_minimum_size = Vector2(220, 110) +offset_left = 165.0 +offset_top = 55.0 +offset_right = 385.0 +offset_bottom = 165.0 +rotation = -1.5707964 +text = "$0 / $25" +label_settings = SubResource("LabelSettings_vwg8v") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Square1" type="Area2D" parent="." unique_id=333775731] +process_mode = 3 +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Square1" unique_id=1122204523] +process_mode = 3 +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square2" type="Area2D" parent="." unique_id=1384097423] +process_mode = 3 +position = Vector2(110, 0) +monitoring = false + +[node name="CollisionShape2D2" type="CollisionShape2D" parent="Square2" unique_id=686018821] +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square3" type="Area2D" parent="." unique_id=837457110] +process_mode = 3 +position = Vector2(110, 110) +monitoring = false + +[node name="CollisionShape2D3" type="CollisionShape2D" parent="Square3" unique_id=1976346563] +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square4" type="Area2D" parent="." unique_id=1074092983] +process_mode = 3 +position = Vector2(220, 0) +monitoring = false + +[node name="CollisionShape2D4" type="CollisionShape2D" parent="Square4" unique_id=442777190] +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square5" type="Area2D" parent="." unique_id=1891937507] +process_mode = 3 +position = Vector2(220, -110) +monitoring = false + +[node name="CollisionShape2D4" type="CollisionShape2D" parent="Square5" unique_id=1224759052] +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Sprite2D" type="Sprite2D" parent="." unique_id=1585332168] +texture_filter = 1 +position = Vector2(-80, 0) +rotation = -1.5707964 +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_wwwaf") +flip_v = true + +[node name="Sprite2D2" type="Sprite2D" parent="." unique_id=1969702659] +texture_filter = 1 +position = Vector2(220, -185) +rotation = 3.1415927 +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_fupku") +flip_v = true + +[node name="Sprite2D3" type="Sprite2D" parent="." unique_id=1607154314] +texture_filter = 1 +position = Vector2(110, 185) +rotation = 3.1415927 +scale = Vector2(2, 2) +texture = SubResource("AtlasTexture_wwwaf") +flip_v = true + +[node name="Size" type="Control" parent="." unique_id=705793849] +unique_name_in_owner = true +layout_mode = 3 +anchors_preset = 0 +offset_left = -95.0 +offset_top = -205.0 +offset_right = 275.0 +offset_bottom = 200.0 +mouse_filter = 2 + +[connection signal="area_entered" from="Square1" to="." method="_on_building_area_entered"] +[connection signal="area_entered" from="Square2" to="." method="_on_building_area_entered"] +[connection signal="area_entered" from="Square3" to="." method="_on_building_area_entered"] +[connection signal="area_entered" from="Square4" to="." method="_on_building_area_entered"] +[connection signal="area_entered" from="Square5" to="." method="_on_building_area_entered"] diff --git a/prefabs/tiles/buildings/gun_shop.tscn b/prefabs/tiles/buildings/gun_shop.tscn index 4e6bffe..0886f65 100644 --- a/prefabs/tiles/buildings/gun_shop.tscn +++ b/prefabs/tiles/buildings/gun_shop.tscn @@ -3,6 +3,9 @@ [ext_resource type="Script" uid="uid://bnyy0ojlolrjj" path="res://prefabs/tiles/buildings/gun_shop.gd" id="1_llmep"] [ext_resource type="Texture2D" uid="uid://t8n660a0vqvm" path="res://assets/Pixelart arrow icon pack 1.0.png" id="2_qam00"] +[sub_resource type="Gradient" id="Gradient_llmep"] +colors = PackedColorArray(0, 1, 0, 1, 1, 0, 0, 1) + [sub_resource type="LabelSettings" id="LabelSettings_vwg8v"] outline_size = 4 outline_color = Color(0, 0, 0, 1) @@ -76,6 +79,52 @@ offset_bottom = -165.0 mouse_filter = 2 color = Color(1, 0, 0, 1) +[node name="Edge1" type="Line2D" parent="." unique_id=449391407] +points = PackedVector2Array(-55, -55, 55, -55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge2" type="Line2D" parent="." unique_id=1445681514] +points = PackedVector2Array(-55, -165, 55, -165) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge6" type="Line2D" parent="." unique_id=972653058] +points = PackedVector2Array(55, -165, 165, -165) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge3" type="Line2D" parent="." unique_id=660094100] +points = PackedVector2Array(55, -55, 55, -165) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge4" type="Line2D" parent="." unique_id=809290006] +points = PackedVector2Array(55, -165, 55, -275) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge5" type="Line2D" parent="." unique_id=1293100381] +points = PackedVector2Array(165, -165, 165, -275) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Path1" type="Line2D" parent="." unique_id=11871023] +points = PackedVector2Array(-10, 45, -10, -120, 100, -120, 100, -230, 265, -230) +width = 2.0 +gradient = SubResource("Gradient_llmep") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path2" type="Line2D" parent="." unique_id=971383413] +points = PackedVector2Array(265, -210, 120, -210, 120, -100, 10, -100, 10, 45) +width = 2.0 +gradient = SubResource("Gradient_llmep") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + [node name="Label" type="Label" parent="." unique_id=29286194] custom_minimum_size = Vector2(220, 220) offset_left = -55.0 diff --git a/prefabs/tiles/buildings/home.gd b/prefabs/tiles/buildings/home.gd index d702537..1a6ceee 100644 --- a/prefabs/tiles/buildings/home.gd +++ b/prefabs/tiles/buildings/home.gd @@ -1,10 +1,5 @@ class_name Home extends Building -var player: Player: - set(value): - player = value - _set_border_color() - @onready var border: PanelContainer = %Border @@ -14,6 +9,7 @@ func _ready() -> void: func activate(citizen: Citizen) -> void: player.money += citizen.money + Globals.board_game.update_player_money(player, player.money) func can_citizen_enter(_coord: Vector2i, _direction: Board.Direction) -> bool: @@ -28,6 +24,11 @@ func get_tile_coords() -> Array[Vector2i]: return [starting_coord] +func _set_player(new_player: Player) -> void: + super(new_player) + _set_border_color() + + func _set_border_color() -> void: if !is_node_ready() or player == null: return diff --git a/prefabs/tiles/buildings/hospital.tscn b/prefabs/tiles/buildings/hospital.tscn index 961de3f..d6368ad 100644 --- a/prefabs/tiles/buildings/hospital.tscn +++ b/prefabs/tiles/buildings/hospital.tscn @@ -3,6 +3,9 @@ [ext_resource type="Script" uid="uid://covp0ql04uour" path="res://prefabs/tiles/buildings/hospital.gd" id="1_sjpox"] [ext_resource type="Texture2D" uid="uid://t8n660a0vqvm" path="res://assets/Pixelart arrow icon pack 1.0.png" id="2_kp5oa"] +[sub_resource type="Gradient" id="Gradient_sjpox"] +colors = PackedColorArray(0, 1, 0, 1, 1, 0, 0, 1) + [sub_resource type="LabelSettings" id="LabelSettings_vwg8v"] outline_size = 4 outline_color = Color(0, 0, 0, 1) @@ -76,6 +79,52 @@ offset_bottom = 55.0 mouse_filter = 2 color = Color(0, 1, 1, 1) +[node name="Edge1" type="Line2D" parent="." unique_id=432626063] +points = PackedVector2Array(55, -55, 55, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge4" type="Line2D" parent="." unique_id=657614006] +points = PackedVector2Array(55, -55, 165, -55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge5" type="Line2D" parent="." unique_id=622851887] +points = PackedVector2Array(165, -55, 275, -55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge2" type="Line2D" parent="." unique_id=1457217309] +points = PackedVector2Array(165, -55, 165, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge6" type="Line2D" parent="." unique_id=808573455] +points = PackedVector2Array(165, -165, 165, -55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge3" type="Line2D" parent="." unique_id=1549839878] +points = PackedVector2Array(275, -55, 275, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Path1" type="Line2D" parent="." unique_id=390139329] +points = PackedVector2Array(110, -155, 110, 0, -45, 0) +width = 2.0 +gradient = SubResource("Gradient_sjpox") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path2" type="Line2D" parent="." unique_id=586585998] +points = PackedVector2Array(220, -155, 220, 0, 375, 0) +width = 2.0 +gradient = SubResource("Gradient_sjpox") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + [node name="Label" type="Label" parent="." unique_id=29286194] custom_minimum_size = Vector2(110, 110) offset_left = 55.0 diff --git a/prefabs/tiles/buildings/hq.gd b/prefabs/tiles/buildings/hq.gd new file mode 100644 index 0000000..1a4ec97 --- /dev/null +++ b/prefabs/tiles/buildings/hq.gd @@ -0,0 +1,36 @@ +class_name HQ extends Building + +@onready var border: PanelContainer = %Border + + +func _ready() -> void: + _set_border_color() + + +func activate(_citizen: Citizen) -> void: + player.votes += 1 + Globals.board_game.update_player_votes(player, player.votes) + + +func can_citizen_enter(_coord: Vector2i, _direction: Board.Direction) -> bool: + return true + + +func get_direction_queue(_citizen: Citizen) -> Array[Board.Direction]: + return [Board.Direction.NONE] + + +func get_tile_coords() -> Array[Vector2i]: + return [starting_coord] + + +func _set_player(new_player: Player) -> void: + super(new_player) + _set_border_color() + + +func _set_border_color() -> void: + if !is_node_ready() or player == null: + return + var style_box: StyleBoxFlat = border.get_theme_stylebox("panel") + style_box.border_color = player.color diff --git a/prefabs/tiles/buildings/hq.gd.uid b/prefabs/tiles/buildings/hq.gd.uid new file mode 100644 index 0000000..7a66b60 --- /dev/null +++ b/prefabs/tiles/buildings/hq.gd.uid @@ -0,0 +1 @@ +uid://csds0yc7qiqbk diff --git a/prefabs/tiles/buildings/hq.tscn b/prefabs/tiles/buildings/hq.tscn new file mode 100644 index 0000000..7b2497e --- /dev/null +++ b/prefabs/tiles/buildings/hq.tscn @@ -0,0 +1,108 @@ +[gd_scene format=3 uid="uid://wdgig5aclnpx"] + +[ext_resource type="Script" uid="uid://csds0yc7qiqbk" path="res://prefabs/tiles/buildings/hq.gd" id="1_4lnov"] +[ext_resource type="Texture2D" uid="uid://1fs47aytjsp6" path="res://assets/2d_city/2dcitywithoutoutline/house1/1house0001.png" id="2_a4yr4"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_6ic3m"] +resource_local_to_scene = true +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 +content_margin_bottom = 10.0 +bg_color = Color(0.6, 0.6, 0.6, 0) +border_width_left = 5 +border_width_top = 5 +border_width_right = 5 +border_width_bottom = 5 +border_color = Color(1, 1, 1, 0) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2y6xd"] +atlas = ExtResource("2_a4yr4") +region = Rect2(799, 82, 374, 364) + +[sub_resource type="LabelSettings" id="LabelSettings_26feb"] +font_size = 24 +outline_size = 4 +outline_color = Color(0, 0, 0, 1) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_ja20k"] +size = Vector2(109, 109) + +[node name="HQ" type="Node2D" unique_id=1701297833] +script = ExtResource("1_4lnov") + +[node name="Border" type="PanelContainer" parent="." unique_id=1535918688] +unique_name_in_owner = true +custom_minimum_size = Vector2(100, 100) +offset_left = -50.0 +offset_top = -50.0 +offset_right = 50.0 +offset_bottom = 50.0 +mouse_filter = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_6ic3m") + +[node name="Icon" type="TextureRect" parent="Border" unique_id=1316631070] +texture_filter = 1 +layout_mode = 2 +mouse_filter = 2 +texture = SubResource("AtlasTexture_2y6xd") +expand_mode = 5 + +[node name="Label" type="Label" parent="Border/Icon" unique_id=134308374] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -42.5 +offset_top = -17.0 +offset_right = 42.5 +offset_bottom = 17.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 4 +text = "HQ" +label_settings = SubResource("LabelSettings_26feb") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Amount" type="Label" parent="Border/Icon" unique_id=1728513182] +visible = false +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -42.5 +offset_top = -17.0 +offset_right = 42.5 +offset_bottom = 17.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 4 +text = "SPAWN" +label_settings = SubResource("LabelSettings_26feb") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="BuildingArea" type="Area2D" parent="." unique_id=812662804] +unique_name_in_owner = true +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="BuildingArea" unique_id=660262437] +shape = SubResource("RectangleShape2D_ja20k") + +[node name="Size" type="Control" parent="." unique_id=1792197698] +unique_name_in_owner = true +layout_mode = 3 +anchors_preset = 0 +offset_left = -55.0 +offset_top = -55.0 +offset_right = 55.0 +offset_bottom = 55.0 +mouse_filter = 2 + +[connection signal="tree_entered" from="." to="." method="_on_tree_entered"] +[connection signal="area_entered" from="BuildingArea" to="." method="_on_building_area_entered"] diff --git a/prefabs/tiles/buildings/office.gd b/prefabs/tiles/buildings/office.gd index ffa663b..78093b2 100644 --- a/prefabs/tiles/buildings/office.gd +++ b/prefabs/tiles/buildings/office.gd @@ -40,6 +40,6 @@ func get_direction_queue(_citizen: Citizen) -> Array[Board.Direction]: func activate(citizen: Citizen) -> void: - citizen.money += 1 * (citizen.get_status_count(Citizen.Status.CAFFEINATED) + 1) + citizen.money += 2 ** citizen.get_status_count(Citizen.Status.CAFFEINATED) + 1 citizen.remove_all_statuses(Citizen.Status.CAFFEINATED) citizen.play_money_animation() diff --git a/prefabs/tiles/buildings/office.tscn b/prefabs/tiles/buildings/office.tscn index ecc558a..223d87e 100644 --- a/prefabs/tiles/buildings/office.tscn +++ b/prefabs/tiles/buildings/office.tscn @@ -3,6 +3,9 @@ [ext_resource type="Texture2D" uid="uid://t8n660a0vqvm" path="res://assets/Pixelart arrow icon pack 1.0.png" id="1_fupku"] [ext_resource type="Script" uid="uid://bgw6vkq71d14n" path="res://prefabs/tiles/buildings/office.gd" id="1_wwwaf"] +[sub_resource type="Gradient" id="Gradient_wwwaf"] +colors = PackedColorArray(0, 1, 0, 1, 1, 0, 0, 1) + [sub_resource type="LabelSettings" id="LabelSettings_vwg8v"] outline_size = 4 outline_color = Color(0, 0, 0, 1) @@ -58,6 +61,29 @@ offset_bottom = 55.0 mouse_filter = 2 color = Color(0, 0, 1, 1) +[node name="Edge1" type="Line2D" parent="." unique_id=1683209880] +points = PackedVector2Array(55, -55, 55, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge3" type="Line2D" parent="." unique_id=1674138530] +points = PackedVector2Array(55, -55, 165, -55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge2" type="Line2D" parent="." unique_id=1448230976] +points = PackedVector2Array(165, -55, 165, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Path1" type="Line2D" parent="." unique_id=251146500] +points = PackedVector2Array(0, -45, 0, 0, 100, 0, 100, -110, 120, -110, 120, 0, 220, 0, 220, -45) +width = 2.0 +gradient = SubResource("Gradient_wwwaf") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + [node name="Label" type="Label" parent="." unique_id=29286194] custom_minimum_size = Vector2(110, 110) offset_left = 55.0 diff --git a/prefabs/tiles/buildings/shop.gd b/prefabs/tiles/buildings/shop.gd index 2de2c53..ae804c7 100644 --- a/prefabs/tiles/buildings/shop.gd +++ b/prefabs/tiles/buildings/shop.gd @@ -74,5 +74,10 @@ func handle_post_turn_actions() -> void: money = money % 15 +func _ready() -> void: + _set_money_label() + + func _set_money_label() -> void: - money_label.text = "$%d / $15" % money + if is_node_ready(): + money_label.text = "$%d / $15" % money diff --git a/prefabs/tiles/buildings/shop.tscn b/prefabs/tiles/buildings/shop.tscn index 17b3e46..beb4d09 100644 --- a/prefabs/tiles/buildings/shop.tscn +++ b/prefabs/tiles/buildings/shop.tscn @@ -3,6 +3,9 @@ [ext_resource type="Script" uid="uid://jp4x1q01no6l" path="res://prefabs/tiles/buildings/shop.gd" id="1_cugdd"] [ext_resource type="Texture2D" uid="uid://t8n660a0vqvm" path="res://assets/Pixelart arrow icon pack 1.0.png" id="2_6buuw"] +[sub_resource type="Gradient" id="Gradient_cugdd"] +colors = PackedColorArray(0, 1, 0, 1, 1, 0, 0, 1) + [sub_resource type="LabelSettings" id="LabelSettings_vwg8v"] outline_size = 4 outline_color = Color(0, 0, 0, 1) @@ -49,6 +52,32 @@ offset_bottom = -55.0 mouse_filter = 2 color = Color(1, 1, 0, 1) +[node name="Edge1" type="Line2D" parent="." unique_id=1892520188] +points = PackedVector2Array(-55, -55, 55, -55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge2" type="Line2D" parent="." unique_id=385177492] +points = PackedVector2Array(55, -165, 55, -55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Path1" type="Line2D" parent="." unique_id=1796228130] +points = PackedVector2Array(-10, 45, -10, -120, 155, -120) +width = 2.0 +gradient = SubResource("Gradient_cugdd") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + +[node name="Path2" type="Line2D" parent="." unique_id=8496436] +points = PackedVector2Array(155, -100, 10, -100, 10, 45) +width = 2.0 +gradient = SubResource("Gradient_cugdd") +joint_mode = 2 +begin_cap_mode = 2 +end_cap_mode = 2 + [node name="Label" type="Label" parent="." unique_id=29286194] custom_minimum_size = Vector2(110, 55) offset_left = -55.0 diff --git a/prefabs/tiles/buildings/soup_kitchen.gd b/prefabs/tiles/buildings/soup_kitchen.gd new file mode 100644 index 0000000..8882eca --- /dev/null +++ b/prefabs/tiles/buildings/soup_kitchen.gd @@ -0,0 +1,32 @@ +class_name SoupKitchen extends Building + +var citizens_served: Array[Citizen] = [] + + +func activate(citizen: Citizen) -> void: + if !citizens_served.has(citizen): + citizen.money += 1 + citizens_served.append(citizen) + citizen.play_money_animation() + + +func handle_post_turn_actions() -> void: + citizens_served.clear() + + +func can_citizen_enter(_coord: Vector2i, _direction: Board.Direction) -> bool: + return false + + +func get_direction_queue(_citizen: Citizen) -> Array[Board.Direction]: + return [] + + +func get_tile_coords() -> Array[Vector2i]: + return [ + starting_coord, + starting_coord + Vector2i.UP, + starting_coord + Vector2i.RIGHT, + starting_coord + Vector2i.DOWN, + starting_coord + Vector2i.LEFT + ] diff --git a/prefabs/tiles/buildings/soup_kitchen.gd.uid b/prefabs/tiles/buildings/soup_kitchen.gd.uid new file mode 100644 index 0000000..70fcf2f --- /dev/null +++ b/prefabs/tiles/buildings/soup_kitchen.gd.uid @@ -0,0 +1 @@ +uid://dnvub78p70s5j diff --git a/prefabs/tiles/buildings/soup_kitchen.tscn b/prefabs/tiles/buildings/soup_kitchen.tscn new file mode 100644 index 0000000..42fd3bc --- /dev/null +++ b/prefabs/tiles/buildings/soup_kitchen.tscn @@ -0,0 +1,151 @@ +[gd_scene format=3 uid="uid://dmfnipmjntenc"] + +[ext_resource type="Script" uid="uid://dnvub78p70s5j" path="res://prefabs/tiles/buildings/soup_kitchen.gd" id="1_sj7qw"] + +[sub_resource type="LabelSettings" id="LabelSettings_vwg8v"] +outline_size = 4 +outline_color = Color(0, 0, 0, 1) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_vwg8v"] +size = Vector2(109, 109) + +[node name="SoupKitchen" type="Node2D" unique_id=746270571 groups=["PostTurnActions"]] +process_mode = 3 +script = ExtResource("1_sj7qw") + +[node name="ColorRect" type="ColorRect" parent="." unique_id=889061850] +custom_minimum_size = Vector2(110, 110) +offset_left = -55.0 +offset_top = -55.0 +offset_right = 55.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(0.6253981, 0.68505514, 0.24526232, 1) + +[node name="ColorRect2" type="ColorRect" parent="." unique_id=76291108] +custom_minimum_size = Vector2(110, 110) +offset_left = -165.0 +offset_top = -55.0 +offset_right = -55.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(0.6253981, 0.68505514, 0.24526232, 1) + +[node name="ColorRect3" type="ColorRect" parent="." unique_id=786140755] +custom_minimum_size = Vector2(110, 110) +offset_left = -55.0 +offset_top = -165.0 +offset_right = 55.0 +offset_bottom = -55.0 +mouse_filter = 2 +color = Color(0.6253981, 0.68505514, 0.24526232, 1) + +[node name="ColorRect4" type="ColorRect" parent="." unique_id=557224551] +custom_minimum_size = Vector2(110, 110) +offset_left = 55.0 +offset_top = -55.0 +offset_right = 165.0 +offset_bottom = 55.0 +mouse_filter = 2 +color = Color(0.6253981, 0.68505514, 0.24526232, 1) + +[node name="ColorRect5" type="ColorRect" parent="." unique_id=1896618491] +custom_minimum_size = Vector2(110, 110) +offset_left = -55.0 +offset_top = 55.0 +offset_right = 55.0 +offset_bottom = 165.0 +mouse_filter = 2 +color = Color(0.6253981, 0.68505514, 0.24526232, 1) + +[node name="Edge1" type="Line2D" parent="." unique_id=729686179] +points = PackedVector2Array(-55, -55, 55, -55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge3" type="Line2D" parent="." unique_id=517881771] +points = PackedVector2Array(-55, -55, -55, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge4" type="Line2D" parent="." unique_id=1010396228] +points = PackedVector2Array(55, -55, 55, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Edge2" type="Line2D" parent="." unique_id=462983650] +points = PackedVector2Array(-55, 55, 55, 55) +width = 1.0 +default_color = Color(0, 0, 0, 1) + +[node name="Label" type="Label" parent="." unique_id=29286194] +custom_minimum_size = Vector2(110, 110) +offset_left = -55.0 +offset_top = -55.0 +offset_right = 55.0 +offset_bottom = 55.0 +text = "SOUP +KITCHEN" +label_settings = SubResource("LabelSettings_vwg8v") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Square1" type="Area2D" parent="." unique_id=333775731] +process_mode = 3 +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Square1" unique_id=1122204523] +process_mode = 3 +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square2" type="Area2D" parent="." unique_id=871528471] +process_mode = 3 +position = Vector2(-110, 0) +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Square2" unique_id=1328243658] +process_mode = 3 +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square3" type="Area2D" parent="." unique_id=1642876812] +process_mode = 3 +position = Vector2(0, -110) +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Square3" unique_id=1392094497] +process_mode = 3 +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square4" type="Area2D" parent="." unique_id=2108585971] +process_mode = 3 +position = Vector2(110, 0) +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Square4" unique_id=11446925] +process_mode = 3 +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Square5" type="Area2D" parent="." unique_id=304733612] +process_mode = 3 +position = Vector2(0, 110) +monitoring = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Square5" unique_id=676150133] +process_mode = 3 +shape = SubResource("RectangleShape2D_vwg8v") + +[node name="Size" type="Control" parent="." unique_id=1036213581] +unique_name_in_owner = true +layout_mode = 3 +anchors_preset = 0 +offset_left = -165.0 +offset_top = -165.0 +offset_right = 165.0 +offset_bottom = 165.0 +mouse_filter = 2 + +[connection signal="area_entered" from="Square1" to="." method="_on_building_area_entered"] +[connection signal="area_entered" from="Square2" to="." method="_on_building_area_entered"] +[connection signal="area_entered" from="Square3" to="." method="_on_building_area_entered"] +[connection signal="area_entered" from="Square4" to="." method="_on_building_area_entered"] +[connection signal="area_entered" from="Square5" to="." method="_on_building_area_entered"] diff --git a/prefabs/tiles/spawns/spawn.gd b/prefabs/tiles/spawns/spawn.gd index 2c41e66..3757dfd 100644 --- a/prefabs/tiles/spawns/spawn.gd +++ b/prefabs/tiles/spawns/spawn.gd @@ -1,4 +1,4 @@ -class_name Spawn extends Tile +class_name Spawn extends Building enum Size { SMALL, MEDIUM, LARGE } @@ -50,3 +50,19 @@ func _physics_process(delta: float) -> void: citizen.set_offset(Vector2(randf_range(-40, 40), randf_range(-40, 40))) citizen.direction = direction citizen.handle_tile_area_exited(null) + + +func activate(_citizen: Citizen) -> void: + pass + + +func can_citizen_enter(_coord: Vector2i, _direction: Board.Direction) -> bool: + return true + + +func get_direction_queue(_citizen: Citizen) -> Array[Board.Direction]: + return [] + + +func get_tile_coords() -> Array[Vector2i]: + return [starting_coord] diff --git a/prefabs/tiles/spawns/spawn.tscn b/prefabs/tiles/spawns/spawn.tscn index ed3ee86..bccb962 100644 --- a/prefabs/tiles/spawns/spawn.tscn +++ b/prefabs/tiles/spawns/spawn.tscn @@ -81,3 +81,13 @@ collision_mask = 0 [node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D" unique_id=2097036302] shape = SubResource("RectangleShape2D_bs4fa") + +[node name="Size" type="Control" parent="." unique_id=1199044498] +unique_name_in_owner = true +custom_minimum_size = Vector2(110, 110) +layout_mode = 3 +anchors_preset = 0 +offset_left = -55.0 +offset_top = -55.0 +offset_right = 55.0 +offset_bottom = 55.0 diff --git a/prefabs/tiles/tile.gd b/prefabs/tiles/tile.gd index d8a022d..bd9e034 100644 --- a/prefabs/tiles/tile.gd +++ b/prefabs/tiles/tile.gd @@ -5,6 +5,9 @@ signal tile_selected(tile: Tile) @export var coords: Vector2i @export var cost: int = 0 +@export var day_placed: int = 0 +@export var player: Player: + set = _set_player var highlighted: bool = false var is_placing: bool = false @@ -18,11 +21,18 @@ func handle_mouse_exited() -> void: highlighted = false +func _set_player(value: Player) -> void: + player = value + + func serialize() -> Dictionary: var result = {} result["scene_file_path"] = scene_file_path result["coords"] = coords result["cost"] = cost + result["day_placed"] = day_placed + if player != null: + result["player"] = player.serialize() return result @@ -30,4 +40,7 @@ static func deserialize(data: Dictionary) -> Tile: var tile: Tile = load(data["scene_file_path"]).instantiate() tile.coords = data["coords"] tile.cost = data["cost"] + tile.day_placed = data["day_placed"] + if data.get("player") != null: + tile.player = Player.deserialize(data["player"]) return tile diff --git a/prefabs/tiles/turns/down_turn.tscn b/prefabs/tiles/turns/down_turn.tscn index e082663..7dcf6f4 100644 --- a/prefabs/tiles/turns/down_turn.tscn +++ b/prefabs/tiles/turns/down_turn.tscn @@ -23,8 +23,17 @@ expand_margin_bottom = 8.0 [node name="DownTurn" unique_id=1363157270 instance=ExtResource("1_xxpct")] direction = 2 -[node name="Icon" parent="." index="0" unique_id=1363157270] +[node name="Icon" parent="PlayerBorder" parent_id_path=PackedInt32Array(1009643853) index="0" unique_id=1363157270] texture = SubResource("AtlasTexture_s65nw") -[node name="Highlight" parent="Icon" index="0" unique_id=715172504] +[node name="Icon#Highlight" type="Panel" parent="PlayerBorder/Icon" index="0" unique_id=715172504] +unique_name_in_owner = true +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_xxpct") diff --git a/prefabs/tiles/turns/left_turn.tscn b/prefabs/tiles/turns/left_turn.tscn index 150b578..672be8c 100644 --- a/prefabs/tiles/turns/left_turn.tscn +++ b/prefabs/tiles/turns/left_turn.tscn @@ -1,10 +1,12 @@ [gd_scene format=3 uid="uid://7jht5hlggey1"] [ext_resource type="PackedScene" uid="uid://cdb6bf7dat3bw" path="res://prefabs/tiles/turns/turn.tscn" id="1_exig8"] -[ext_resource type="Texture2D" uid="uid://8b86ftb4iwfj" path="res://assets/Pattern-Panic-10x10/no-background/Points-and-Pulses.png" id="2_4tde2"] + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_exig8"] +load_path = "res://.godot/imported/Points-and-Pulses.png-edf75043efa977f8c5e27105136679fb.ctex" [sub_resource type="AtlasTexture" id="AtlasTexture_4tde2"] -atlas = ExtResource("2_4tde2") +atlas = SubResource("CompressedTexture2D_exig8") region = Rect2(1, 1, 9, 9) [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_41d4x"] @@ -23,9 +25,18 @@ expand_margin_bottom = 8.0 [node name="LeftTurn" unique_id=1363157270 instance=ExtResource("1_exig8")] direction = 3 -[node name="Icon" parent="." index="0" unique_id=1363157270] +[node name="Icon" parent="PlayerBorder" parent_id_path=PackedInt32Array(1009643853) index="0" unique_id=1363157270] texture = SubResource("AtlasTexture_4tde2") flip_h = true -[node name="Highlight" parent="Icon" index="0" unique_id=715172504] +[node name="Icon#Highlight" type="Panel" parent="PlayerBorder/Icon" index="0" unique_id=715172504] +unique_name_in_owner = true +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_41d4x") diff --git a/prefabs/tiles/turns/right_turn.tscn b/prefabs/tiles/turns/right_turn.tscn index 56b9b5f..09b1f81 100644 --- a/prefabs/tiles/turns/right_turn.tscn +++ b/prefabs/tiles/turns/right_turn.tscn @@ -1,10 +1,12 @@ [gd_scene format=3 uid="uid://ce25rk1nl0pqn"] [ext_resource type="PackedScene" uid="uid://cdb6bf7dat3bw" path="res://prefabs/tiles/turns/turn.tscn" id="1_2yiqp"] -[ext_resource type="Texture2D" uid="uid://8b86ftb4iwfj" path="res://assets/Pattern-Panic-10x10/no-background/Points-and-Pulses.png" id="2_3t120"] + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_2yiqp"] +load_path = "res://.godot/imported/Points-and-Pulses.png-edf75043efa977f8c5e27105136679fb.ctex" [sub_resource type="AtlasTexture" id="AtlasTexture_3t120"] -atlas = ExtResource("2_3t120") +atlas = SubResource("CompressedTexture2D_2yiqp") region = Rect2(1, 1, 9, 9) [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dlxmt"] @@ -20,11 +22,36 @@ expand_margin_top = 8.0 expand_margin_right = 8.0 expand_margin_bottom = 8.0 +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2yiqp"] +resource_local_to_scene = true +bg_color = Color(1, 1, 1, 0) +border_width_left = 5 +border_width_top = 5 +border_width_right = 5 +border_width_bottom = 5 +border_color = Color(1, 1, 1, 1) +expand_margin_left = 8.0 +expand_margin_top = 8.0 +expand_margin_right = 8.0 +expand_margin_bottom = 8.0 + [node name="RightTurn" unique_id=1363157270 instance=ExtResource("1_2yiqp")] direction = 4 -[node name="Icon" parent="." index="0" unique_id=1363157270] +[node name="Icon" parent="PlayerBorder" parent_id_path=PackedInt32Array(1009643853) index="0" unique_id=1363157270] texture = SubResource("AtlasTexture_3t120") -[node name="Highlight" parent="Icon" index="0" unique_id=715172504] +[node name="Icon#Highlight" type="Panel" parent="PlayerBorder/Icon" index="0" unique_id=715172504] +unique_name_in_owner = true +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_dlxmt") + +[node name="Highlight" parent="PlayerBorder/Icon" index="1" unique_id=715172504] +theme_override_styles/panel = SubResource("StyleBoxFlat_2yiqp") diff --git a/prefabs/tiles/turns/turn.gd b/prefabs/tiles/turns/turn.gd index 20f984a..ce7504a 100644 --- a/prefabs/tiles/turns/turn.gd +++ b/prefabs/tiles/turns/turn.gd @@ -3,6 +3,11 @@ class_name Turn extends Tile @export var direction: Board.Direction @onready var highlight: Panel = %Highlight +@onready var player_border: PanelContainer = %PlayerBorder + + +func _ready() -> void: + _set_border_color() func handle_turn_mouse_entered() -> void: @@ -16,3 +21,15 @@ func handle_turn_mouse_exited() -> void: func handle_gui_input(event: InputEvent): if event.is_action_pressed("select") and !is_placing: tile_selected.emit(self) + + +func _set_player(value: Player) -> void: + super(value) + _set_border_color() + + +func _set_border_color() -> void: + if !is_node_ready() or player == null: + return + var style_box: StyleBoxFlat = player_border.get_theme_stylebox("panel") + style_box.border_color = player.color diff --git a/prefabs/tiles/turns/turn.tscn b/prefabs/tiles/turns/turn.tscn index 9aa5d67..9d9cbf8 100644 --- a/prefabs/tiles/turns/turn.tscn +++ b/prefabs/tiles/turns/turn.tscn @@ -3,6 +3,15 @@ [ext_resource type="Texture2D" uid="uid://8b86ftb4iwfj" path="res://assets/Pattern-Panic-10x10/no-background/Points-and-Pulses.png" id="1_qqie6"] [ext_resource type="Script" uid="uid://df5v873offcdf" path="res://prefabs/tiles/turns/turn.gd" id="2_qqie6"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ix7w3"] +resource_local_to_scene = true +bg_color = Color(0, 0, 0, 0) +border_width_left = 5 +border_width_top = 5 +border_width_right = 5 +border_width_bottom = 5 +border_color = Color(0.8001019, 0.8001019, 0.8001019, 0) + [sub_resource type="AtlasTexture" id="AtlasTexture_x2hlk"] atlas = ExtResource("1_qqie6") region = Rect2(30, 70, 10, 10) @@ -26,16 +35,22 @@ size = Vector2(110, 110) [node name="Turn" type="Node2D" unique_id=397844073] script = ExtResource("2_qqie6") -[node name="Icon" type="TextureRect" parent="." unique_id=1363157270] +[node name="PlayerBorder" type="PanelContainer" parent="." unique_id=1009643853] +unique_name_in_owner = true +custom_minimum_size = Vector2(110, 110) +offset_left = -55.0 +offset_top = -55.0 +offset_right = 45.0 +offset_bottom = 45.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_ix7w3") + +[node name="Icon" type="TextureRect" parent="PlayerBorder" unique_id=1363157270] texture_filter = 1 custom_minimum_size = Vector2(100, 100) -offset_left = -50.0 -offset_top = -50.0 -offset_right = 50.0 -offset_bottom = 50.0 +layout_mode = 2 texture = SubResource("AtlasTexture_x2hlk") -[node name="Highlight" type="Panel" parent="Icon" unique_id=715172504] +[node name="Highlight" type="Panel" parent="PlayerBorder/Icon" unique_id=715172504] unique_name_in_owner = true visible = false layout_mode = 1 @@ -54,6 +69,6 @@ collision_mask = 0 [node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D2" unique_id=1032001784] shape = SubResource("RectangleShape2D_qqie6") -[connection signal="gui_input" from="Icon" to="." method="handle_gui_input"] -[connection signal="mouse_entered" from="Icon" to="." method="handle_turn_mouse_entered"] -[connection signal="mouse_exited" from="Icon" to="." method="handle_turn_mouse_exited"] +[connection signal="gui_input" from="PlayerBorder/Icon" to="." method="handle_gui_input"] +[connection signal="mouse_entered" from="PlayerBorder/Icon" to="." method="handle_turn_mouse_entered"] +[connection signal="mouse_exited" from="PlayerBorder/Icon" to="." method="handle_turn_mouse_exited"] diff --git a/prefabs/tiles/turns/up_turn.tscn b/prefabs/tiles/turns/up_turn.tscn index 3b39cbe..ae40147 100644 --- a/prefabs/tiles/turns/up_turn.tscn +++ b/prefabs/tiles/turns/up_turn.tscn @@ -1,10 +1,12 @@ [gd_scene format=3 uid="uid://cisd4grq8kxqn"] [ext_resource type="PackedScene" uid="uid://cdb6bf7dat3bw" path="res://prefabs/tiles/turns/turn.tscn" id="1_3bmx7"] -[ext_resource type="Texture2D" uid="uid://8b86ftb4iwfj" path="res://assets/Pattern-Panic-10x10/no-background/Points-and-Pulses.png" id="2_3ect2"] + +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_2w6nq"] +load_path = "res://.godot/imported/Points-and-Pulses.png-edf75043efa977f8c5e27105136679fb.ctex" [sub_resource type="AtlasTexture" id="AtlasTexture_3bmx7"] -atlas = ExtResource("2_3ect2") +atlas = SubResource("CompressedTexture2D_2w6nq") region = Rect2(0, 11, 9, 9) [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3ect2"] @@ -23,9 +25,18 @@ expand_margin_bottom = 8.0 [node name="UpTurn" unique_id=1363157270 instance=ExtResource("1_3bmx7")] direction = 1 -[node name="Icon" parent="." index="0" unique_id=1363157270] +[node name="Icon" parent="PlayerBorder" parent_id_path=PackedInt32Array(1009643853) index="0" unique_id=1363157270] texture = SubResource("AtlasTexture_3bmx7") flip_v = true -[node name="Highlight" parent="Icon" index="0" unique_id=715172504] +[node name="Icon#Highlight" type="Panel" parent="PlayerBorder/Icon" index="0" unique_id=715172504] +unique_name_in_owner = true +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_3ect2") diff --git a/prefabs/ui/building_selector.gd b/prefabs/ui/building_selector.gd index fa7d7fe..c02efc2 100644 --- a/prefabs/ui/building_selector.gd +++ b/prefabs/ui/building_selector.gd @@ -33,5 +33,5 @@ func _on_child_entered_tree(node: Node) -> void: await node.ready if is_instance_valid(node.size_node): custom_minimum_size = node.size_node.size + Vector2(10, 10) - node.position = position - node.size_node.position + node.position = -node.size_node.position node.position += Vector2(5, 5) diff --git a/prefabs/ui/controls.gd b/prefabs/ui/controls.gd index 5f820ca..2ca5e85 100644 --- a/prefabs/ui/controls.gd +++ b/prefabs/ui/controls.gd @@ -58,6 +58,9 @@ func set_info() -> void: func check_controls_enabled() -> void: + #print(Globals.board_game.current_board_state.current_player.id == Globals.game.this_player.id) + #print(Globals.board_game.current_board_state.state != BoardState.State.PLAY) + #print(Globals.board_game.pending_board_state != null) 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() @@ -75,7 +78,7 @@ func check_controls_enabled() -> void: pass_button.show() submit_button.hide() submit_button.disabled = true - pass_button.disabled = false + pass_button.disabled = Globals.board_game.is_playing_day undo_button.disabled = true rem_button.disabled = false else: @@ -86,6 +89,19 @@ func check_controls_enabled() -> void: undo_button.disabled = true submit_button.disabled = true + # TODO: Fix undo + undo_button.disabled = true + + +func set_board_state(board_state: BoardState) -> void: + for child in draft_container.get_children(): + child.queue_free() + for building in board_state.real_estate_market: + var db: DraftBuilding = DRAFT_BUILDING_SCENE.instantiate() + draft_container.add_child(db) + db.set_building(building.duplicate()) + db.building_selector.select_building.connect(handle_building_selected) + func end_day() -> void: undo_button.hide() @@ -105,7 +121,7 @@ func _on_submit_pressed(): func _on_undo_pressed(): - print("TODO: Handle undo!") + Globals.board_game.reset_turn() func _on_pause_pressed(): @@ -125,16 +141,26 @@ func _on_blueprints_pressed(): func handle_tile_selected(tile: Tile): - _hide_real_estate_market() - Globals.board_game.select_tile(tile) + if ( + tile.cost <= Globals.board_game.current_board_state.current_player.money + and ( + Globals.board_game.current_board_state.current_player.build_actions_taken + < Globals.board_game.current_board_state.current_player.building_permits + ) + ): + _hide_real_estate_market() + Globals.board_game.select_tile(tile) func handle_building_selected(building: Building) -> void: - _hide_real_estate_market() - var db = building.get_parent().get_parent() - if db is DraftBuilding: - Globals.board_game.select_building(building, db.get_index()) - else: + if ( + building.cost <= Globals.board_game.current_board_state.current_player.money + and ( + Globals.board_game.current_board_state.current_player.build_actions_taken + < Globals.board_game.current_board_state.current_player.building_permits + ) + ): + _hide_real_estate_market() Globals.board_game.select_building(building) @@ -187,16 +213,8 @@ func _show_hand() -> void: hand_tween.tween_property(hand, "offset_top", -hand.size.y, 0.5) -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) + Engine.time_scale = 2 fast_1.hide() fast_2.show() fast_4.hide() @@ -204,7 +222,7 @@ func _on_fast_forward_1_pressed(): func _on_fast_forward_2_pressed(): - _speed_up_engine(4) + Engine.time_scale = 4 fast_1.hide() fast_2.hide() fast_4.show() @@ -212,7 +230,7 @@ func _on_fast_forward_2_pressed(): func _on_fast_forward_4_pressed(): - _speed_up_engine(10) + Engine.time_scale = 10 fast_1.hide() fast_2.hide() fast_4.hide() @@ -220,7 +238,7 @@ func _on_fast_forward_4_pressed(): func _on_fast_forward_10_pressed(): - _speed_up_engine(1) + Engine.time_scale = 1 fast_1.show() fast_2.hide() fast_4.hide() @@ -228,6 +246,7 @@ func _on_fast_forward_10_pressed(): func _on_cancel_placement_pressed(): + Globals.board_game.cancel_placement() _hide_real_estate_market() @@ -239,23 +258,8 @@ func _on_hand_building_selected(building: Building) -> void: 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()) + Globals.board_game.add_building_to_draft.rpc(draft_building.serialize()) diff --git a/prefabs/ui/controls.tscn b/prefabs/ui/controls.tscn index 52c0de6..d84fc73 100644 --- a/prefabs/ui/controls.tscn +++ b/prefabs/ui/controls.tscn @@ -8,6 +8,7 @@ [ext_resource type="PackedScene" uid="uid://7jht5hlggey1" path="res://prefabs/tiles/turns/left_turn.tscn" id="5_dxd6m"] [ext_resource type="PackedScene" uid="uid://cpmlj6muvdwix" path="res://prefabs/ui/building_selector.tscn" id="6_7r4kk"] [ext_resource type="PackedScene" uid="uid://bto4vblqk2inb" path="res://prefabs/tiles/buildings/home.tscn" id="7_dxd6m"] +[ext_resource type="PackedScene" uid="uid://wdgig5aclnpx" path="res://prefabs/tiles/buildings/hq.tscn" id="9_wxj2g"] [ext_resource type="Script" uid="uid://s7x0q87dps5d" path="res://prefabs/ui/hand.gd" id="17_r0188"] [sub_resource type="LabelSettings" id="LabelSettings_qhv1l"] @@ -31,9 +32,14 @@ font_size = 24 font_size = 24 [sub_resource type="LabelSettings" id="LabelSettings_7r4kk"] -font_size = 32 +font_size = 24 -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_j4kb6"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_w3n6g"] +resource_local_to_scene = true +bg_color = Color(0, 0, 0, 0) +border_color = Color(1, 1, 1, 1) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_di23u"] resource_local_to_scene = true bg_color = Color(0, 0, 0, 0) border_color = Color(1, 1, 1, 1) @@ -81,20 +87,20 @@ size_flags_vertical = 4 [node name="Undo" type="Button" parent="HBoxContainer/Controls" unique_id=1480835490] unique_name_in_owner = true -custom_minimum_size = Vector2(100, 0) +custom_minimum_size = Vector2(125, 0) layout_mode = 2 disabled = true -text = "Undo" +text = "Reset Turn" [node name="Pass" type="Button" parent="HBoxContainer/Controls" unique_id=1183096687] unique_name_in_owner = true -custom_minimum_size = Vector2(100, 0) +custom_minimum_size = Vector2(125, 0) layout_mode = 2 text = "Pass" [node name="Submit" type="Button" parent="HBoxContainer/Controls" unique_id=122864337] unique_name_in_owner = true -custom_minimum_size = Vector2(100, 0) +custom_minimum_size = Vector2(125, 0) layout_mode = 2 disabled = true text = "Confirm" @@ -240,7 +246,7 @@ alignment = 1 [node name="Label" type="Label" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/BasicTiles" unique_id=1978827830] layout_mode = 2 -text = "Basic Tiles - $1" +text = "Basic Tiles - $2" label_settings = SubResource("LabelSettings_j4kb6") horizontal_alignment = 1 @@ -249,7 +255,7 @@ layout_mode = 2 size_flags_vertical = 6 theme_override_constants/h_separation = 10 theme_override_constants/v_separation = 10 -columns = 4 +columns = 2 [node name="Up" type="Control" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/BasicTiles/GridContainer" unique_id=748424964] custom_minimum_size = Vector2(110, 110) @@ -257,7 +263,7 @@ layout_mode = 2 [node name="UpTurn" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/BasicTiles/GridContainer/Up" unique_id=1363157270 instance=ExtResource("2_eu1vu")] position = Vector2(55, 55) -cost = 1 +cost = 2 [node name="Right" type="Control" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/BasicTiles/GridContainer" unique_id=1274279814] custom_minimum_size = Vector2(110, 110) @@ -265,7 +271,7 @@ layout_mode = 2 [node name="RightTurn" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/BasicTiles/GridContainer/Right" unique_id=1688209745 instance=ExtResource("3_7r4kk")] position = Vector2(55, 55) -cost = 1 +cost = 2 [node name="Down" type="Control" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/BasicTiles/GridContainer" unique_id=871055726] custom_minimum_size = Vector2(110, 110) @@ -273,7 +279,7 @@ layout_mode = 2 [node name="DownTurn" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/BasicTiles/GridContainer/Down" unique_id=269046840 instance=ExtResource("4_c56vf")] position = Vector2(55, 55) -cost = 1 +cost = 2 [node name="Left" type="Control" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/BasicTiles/GridContainer" unique_id=496620027] custom_minimum_size = Vector2(110, 110) @@ -281,23 +287,39 @@ layout_mode = 2 [node name="LeftTurn" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/BasicTiles/GridContainer/Left" unique_id=1788133401 instance=ExtResource("5_dxd6m")] position = Vector2(55, 55) -cost = 1 +cost = 2 [node name="Home" type="VBoxContainer" parent="BlueprintsContainer/VBoxContainer/HBoxContainer" unique_id=85382159] layout_mode = 2 [node name="Label" type="Label" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/Home" unique_id=70473481] layout_mode = 2 -text = "Home - $2" +text = "Move Home - $4" label_settings = SubResource("LabelSettings_7r4kk") [node name="BuildingSelector" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/Home" unique_id=133308872 instance=ExtResource("6_7r4kk")] layout_mode = 2 size_flags_vertical = 6 -theme_override_styles/panel = SubResource("StyleBoxFlat_j4kb6") +theme_override_styles/panel = SubResource("StyleBoxFlat_w3n6g") [node name="Home" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/Home/BuildingSelector" unique_id=1701297833 instance=ExtResource("7_dxd6m")] -cost = 2 +cost = 4 + +[node name="HQ" type="VBoxContainer" parent="BlueprintsContainer/VBoxContainer/HBoxContainer" unique_id=1913362855] +layout_mode = 2 + +[node name="Label" type="Label" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/HQ" unique_id=1804332196] +layout_mode = 2 +text = "Move HQ - $4" +label_settings = SubResource("LabelSettings_7r4kk") + +[node name="BuildingSelector" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/HQ" unique_id=1872170733 instance=ExtResource("6_7r4kk")] +layout_mode = 2 +size_flags_vertical = 6 +theme_override_styles/panel = SubResource("StyleBoxFlat_di23u") + +[node name="HQ" parent="BlueprintsContainer/VBoxContainer/HBoxContainer/HQ/BuildingSelector" unique_id=1188984099 instance=ExtResource("9_wxj2g")] +cost = 4 [node name="ScrollContainer" type="ScrollContainer" parent="BlueprintsContainer/VBoxContainer" unique_id=2014532559] layout_mode = 2 @@ -359,6 +381,8 @@ unique_name_in_owner = true layout_mode = 2 theme = SubResource("Theme_w3n6g") theme_override_constants/buttons_width = 32 +min_value = 1.0 +value = 1.0 rounded = true alignment = 1 prefix = "$" @@ -388,5 +412,6 @@ text = "Set Cost" [connection signal="tile_selected" from="BlueprintsContainer/VBoxContainer/HBoxContainer/BasicTiles/GridContainer/Down/DownTurn" to="." method="handle_tile_selected"] [connection signal="tile_selected" from="BlueprintsContainer/VBoxContainer/HBoxContainer/BasicTiles/GridContainer/Left/LeftTurn" to="." method="handle_tile_selected"] [connection signal="select_building" from="BlueprintsContainer/VBoxContainer/HBoxContainer/Home/BuildingSelector" to="." method="handle_building_selected"] +[connection signal="select_building" from="BlueprintsContainer/VBoxContainer/HBoxContainer/HQ/BuildingSelector" to="." method="handle_building_selected"] [connection signal="building_selected" from="Hand" to="." method="_on_hand_building_selected"] [connection signal="pressed" from="DraftCost/VBoxContainer/SetDraftCost" to="." method="_on_set_draft_cost_pressed"] diff --git a/prefabs/ui/draft_building.gd b/prefabs/ui/draft_building.gd index 4fc5772..54d7b83 100644 --- a/prefabs/ui/draft_building.gd +++ b/prefabs/ui/draft_building.gd @@ -6,4 +6,4 @@ class_name DraftBuilding extends VBoxContainer func set_building(building: Building) -> void: cost_label.text = "$%d" % building.cost - building_selector.add_child(building) + building_selector.call_deferred("add_child", building) diff --git a/prefabs/ui/player_action_light.gd b/prefabs/ui/player_action_light.gd new file mode 100644 index 0000000..6d245dd --- /dev/null +++ b/prefabs/ui/player_action_light.gd @@ -0,0 +1,15 @@ +class_name PlayerActionLight extends Panel + +var style_box: StyleBoxFlat + + +func _ready() -> void: + style_box = get_theme_stylebox("panel") + + +func reset() -> void: + style_box.bg_color = Color(0, 0, 1, 1) + + +func use() -> void: + style_box.bg_color = Color(1, 0, 0, 1) diff --git a/prefabs/ui/player_action_light.gd.uid b/prefabs/ui/player_action_light.gd.uid new file mode 100644 index 0000000..0b74721 --- /dev/null +++ b/prefabs/ui/player_action_light.gd.uid @@ -0,0 +1 @@ +uid://dv4e6iadts64e diff --git a/prefabs/ui/player_action_light.tscn b/prefabs/ui/player_action_light.tscn new file mode 100644 index 0000000..e8b63b4 --- /dev/null +++ b/prefabs/ui/player_action_light.tscn @@ -0,0 +1,23 @@ +[gd_scene format=3 uid="uid://1ltfumpg4ds3"] + +[ext_resource type="Script" uid="uid://dv4e6iadts64e" path="res://prefabs/ui/player_action_light.gd" id="1_wy3l5"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nqh6b"] +resource_local_to_scene = true +bg_color = Color(0, 0, 1, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0, 0, 0, 1) +corner_radius_top_left = 50 +corner_radius_top_right = 50 +corner_radius_bottom_right = 50 +corner_radius_bottom_left = 50 + +[node name="PlayerActionLight" type="Panel" unique_id=603450829] +custom_minimum_size = Vector2(16, 16) +size_flags_horizontal = 4 +size_flags_vertical = 4 +theme_override_styles/panel = SubResource("StyleBoxFlat_nqh6b") +script = ExtResource("1_wy3l5") diff --git a/prefabs/ui/player_info.gd b/prefabs/ui/player_info.gd index 210542f..39ac56b 100644 --- a/prefabs/ui/player_info.gd +++ b/prefabs/ui/player_info.gd @@ -1,15 +1,30 @@ class_name PlayerInfo extends HBoxContainer +const PLAYER_ACTION_LIGHT_SCENE = preload("uid://1ltfumpg4ds3") + +@onready var permits_container: Container = %Permits @onready var name_label: Label = %Name @onready var money_label: Label = %Money +@onready var votes_label: Label = %Votes func set_player(player: Player) -> void: player.changed.connect(_update_player_info) - name_label.text = player.name + if player.id == Globals.game.this_player.id: + name_label.text = "* %s" % player.name + else: + name_label.text = player.name name_label.label_settings.font_color = player.color - money_label.text = "$%s" % str(player.money) + _update_player_info(player) func _update_player_info(player: Player) -> void: - money_label.text = "$%s" % str(player.money) + money_label.text = "$%d" % player.money + votes_label.text = "%d 🗳️" % player.votes + for child in permits_container.get_children(): + child.queue_free() + for i in range(player.building_permits): + var light: PlayerActionLight = PLAYER_ACTION_LIGHT_SCENE.instantiate() + permits_container.add_child(light) + if i < player.build_actions_taken: + light.use() diff --git a/prefabs/ui/player_info.tscn b/prefabs/ui/player_info.tscn index 650dc81..5dd8385 100644 --- a/prefabs/ui/player_info.tscn +++ b/prefabs/ui/player_info.tscn @@ -10,8 +10,15 @@ outline_color = Color(0, 0, 0, 1) [sub_resource type="LabelSettings" id="LabelSettings_tautg"] font_size = 24 -font_color = Color(0, 0, 0, 1) +font_color = Color(0, 1, 0, 1) outline_size = 4 +outline_color = Color(0, 0, 0, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_0g7uu"] +font_size = 24 +font_color = Color(0, 0, 1, 1) +outline_size = 4 +outline_color = Color(0, 0, 0, 1) [node name="PlayerInfo" type="HBoxContainer" unique_id=1335388560] offset_right = 40.0 @@ -19,6 +26,10 @@ offset_bottom = 40.0 theme_override_constants/separation = 16 script = ExtResource("1_tautg") +[node name="Permits" type="HBoxContainer" parent="." unique_id=1767255572] +unique_name_in_owner = true +layout_mode = 2 + [node name="Name" type="Label" parent="." unique_id=402118000] unique_name_in_owner = true layout_mode = 2 @@ -30,3 +41,9 @@ unique_name_in_owner = true layout_mode = 2 text = "$0" label_settings = SubResource("LabelSettings_tautg") + +[node name="Votes" type="Label" parent="." unique_id=1929524068] +unique_name_in_owner = true +layout_mode = 2 +text = "0" +label_settings = SubResource("LabelSettings_0g7uu") diff --git a/resources/board_state.gd b/resources/board_state.gd index f21b29f..d1a31aa 100644 --- a/resources/board_state.gd +++ b/resources/board_state.gd @@ -1,6 +1,6 @@ class_name BoardState -enum State { INITIAL_SETUP, DRAFT, PLAY } +enum State { INITIAL_SETUP, DRAFT, PLAY, PLACING_SPAWNS, DESTROYING_BUILDINGS } var day: int = 0 var turn: int = 0 @@ -10,14 +10,21 @@ var players: Array[Player] = [] var tiles: Array[Tile] = [] var buildings: Array[Building] = [] var players_passed: int = 0 +var real_estate_market: Array[Building] = [] +var spawn_placements: int = 0 +var citizens_starting_money: int = 0 func get_this_player_index() -> int: - return players.find_custom(func(p: Player) -> bool: return p.id == Globals.game.this_player.id) + return get_player_index(Globals.game.this_player) func get_current_player_index() -> int: - return players.find_custom(func(p: Player) -> bool: return p.id == current_player.id) + return get_player_index(current_player) + + +func get_player_index(player: Player) -> int: + return players.find_custom(func(p: Player) -> bool: return p.id == player.id) func serialize() -> Dictionary: @@ -26,6 +33,8 @@ func serialize() -> Dictionary: result["turn"] = turn result["state"] = state result["players_passed"] = players_passed + result["spawn_placements"] = spawn_placements + result["citizens_starting_money"] = citizens_starting_money result["current_player"] = current_player.serialize() result["players"] = [] for p in players: @@ -37,6 +46,9 @@ func serialize() -> Dictionary: result["buildings"] = [] for b in buildings: result["buildings"].append(b.serialize()) + result["real_estate_market"] = [] + for db in real_estate_market: + result["real_estate_market"].append(db.serialize()) return result @@ -46,6 +58,8 @@ static func deserialize(data: Dictionary) -> BoardState: result.turn = data["turn"] result.state = data["state"] result.players_passed = data["players_passed"] + result.spawn_placements = data["spawn_placements"] + result.citizens_starting_money = data["citizens_starting_money"] result.current_player = Player.deserialize(data["current_player"]) for p in data["players"]: result.players.append(Player.deserialize(p)) @@ -53,4 +67,6 @@ static func deserialize(data: Dictionary) -> BoardState: result.tiles.append(Tile.deserialize(t)) for b in data["buildings"]: result.buildings.append(Building.deserialize(b)) + for db in data["real_estate_market"]: + result.real_estate_market.append(Building.deserialize(db)) return result diff --git a/resources/player.gd b/resources/player.gd index de81173..764a148 100644 --- a/resources/player.gd +++ b/resources/player.gd @@ -6,6 +6,18 @@ var money: int = 10: set(value): money = value changed.emit(self) +var votes: int = 0: + set(value): + votes = value + changed.emit(self) +var build_actions_taken: int = 0: + set(value): + build_actions_taken = value + changed.emit(self) +var building_permits: int = 2: + set(value): + building_permits = value + changed.emit(self) var color: Color = Color(randf(), randf(), randf()) @@ -15,6 +27,9 @@ func serialize() -> Dictionary: result["name"] = name result["color"] = color result["money"] = money + result["votes"] = votes + result["building_permits"] = building_permits + result["build_actions_taken"] = build_actions_taken return result @@ -24,4 +39,7 @@ static func deserialize(data: Dictionary) -> Player: result.name = data["name"] result.color = data["color"] result.money = data["money"] + result.votes = data["votes"] + result.building_permits = data["building_permits"] + result.build_actions_taken = data["build_actions_taken"] return result diff --git a/scenes/board_game.gd b/scenes/board_game.gd index 0d47ddd..30e48a8 100644 --- a/scenes/board_game.gd +++ b/scenes/board_game.gd @@ -1,6 +1,9 @@ class_name BoardGame extends Node +signal all_players_ready_for_day_start + const HOME_SCENE = preload("uid://bto4vblqk2inb") +const HQ_SCENE = preload("uid://wdgig5aclnpx") #const DOWN_SPAWN_SCENE = preload("uid://d4ltd1geg7s2p") const BANK_SCENE = preload("uid://c06fsqdixer1c") @@ -11,6 +14,8 @@ 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 CHURCH_SCENE = preload("uid://brn0nbkela0m4") +const CITY_HALL_SCENE = preload("uid://dtnejoimqiu0o") const BASE_DECK = [ BANK_SCENE, @@ -20,7 +25,9 @@ const BASE_DECK = [ GUN_SHOP_SCENE, HOSPITAL_SCENE, OFFICE_SCENE, - SHOP_SCENE + SHOP_SCENE, + CHURCH_SCENE, + CITY_HALL_SCENE ] var citizen_count: int = 0: @@ -31,20 +38,23 @@ var citizen_count: int = 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 num_players_ready_for_day_start: int = 0 +var is_playing_day: bool = false var current_board_state: BoardState: set(value): current_board_state = value - controls.check_controls_enabled() - controls.set_info() + #controls.check_controls_enabled() + #controls.set_info() var pending_board_state: BoardState: set(value): pending_board_state = value - controls.check_controls_enabled() + #controls.check_controls_enabled() + +var original_board_state: BoardState var deck: Array[Building] = [] @@ -65,39 +75,116 @@ func setup_building_deck() -> void: @rpc("any_peer", "call_local", "reliable") -func set_board_state(board_state: Dictionary) -> void: +func advance_board_state(board_state: Dictionary) -> void: + pending_board_state = null current_board_state = BoardState.deserialize(board_state) board.reset() board.set_board_state(current_board_state) + controls.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: + if current_board_state.turn >= 0: + current_board_state.players.reverse() + current_board_state.current_player = current_board_state.players[0] + controls.set_info() + start_day() + elif Globals.game.this_player.id == current_board_state.current_player.id: + if current_board_state.turn >= -current_board_state.players.size(): + board.set_active_building(HQ_SCENE.instantiate()) + else: + board.set_active_building(HOME_SCENE.instantiate()) + elif current_board_state.state == BoardState.State.PLACING_SPAWNS: start_day() if current_board_state.players_passed == Globals.game.players.size(): + current_board_state.players_passed = 0 end_day() + controls.check_controls_enabled() + controls.set_info() @rpc("any_peer", "call_local", "reliable") -func add_building_to_draft() -> void: +func update_board_state(board_state: Dictionary) -> void: + current_board_state = BoardState.deserialize(board_state) + board.reset() + board.set_board_state(current_board_state) + controls.set_board_state(current_board_state) + controls.check_controls_enabled() + controls.set_info() + + +@rpc("any_peer", "call_local", "reliable") +func add_building_to_draft(building_data: Dictionary) -> void: + current_board_state.real_estate_market.append(Building.deserialize(building_data)) buildings_added_to_draft += 1 if buildings_added_to_draft >= Globals.game.players.size(): + buildings_added_to_draft = 0 current_board_state.state = BoardState.State.PLAY controls.check_controls_enabled() + controls.set_info() + original_board_state = BoardState.deserialize(current_board_state.serialize()) + update_board_state.rpc(current_board_state.serialize()) + + +@rpc("any_peer", "call_local", "reliable") +func ready_for_day_start() -> void: + num_players_ready_for_day_start += 1 + if num_players_ready_for_day_start >= Globals.game.players.size(): + all_players_ready_for_day_start.emit() func select_tile(tile: Tile) -> void: - board.set_active_tile(tile.duplicate()) + board.set_active_tile(Tile.deserialize(tile.serialize())) -func select_building(building: Building, delete_index: int = -1) -> void: - board.set_active_building(building.duplicate()) - draft_index_to_be_deleted = delete_index +func select_building(building: Building) -> void: + if building is Home: + board.remove_home(current_board_state.current_player) + if building is HQ: + board.remove_hq(current_board_state.current_player) + board.set_active_building(Building.deserialize(building.serialize())) + draft_index_to_be_deleted = current_board_state.real_estate_market.find_custom( + func(b: Building) -> bool: + return ( + b.get_script() == building.get_script() + and b.cost == building.cost + and b.player == building.player + ) + ) + + +func cancel_placement() -> void: + if is_instance_valid(board.active_tile): + board.active_tile.queue_free() + board.active_tile = null + if is_instance_valid(board.active_building): + board.active_building.queue_free() + board.active_building = null func start_day() -> void: + if current_board_state.day > 0 and current_board_state.state != BoardState.State.PLACING_SPAWNS: + current_board_state.players.sort_custom( + func(p1: Player, p2: Player) -> bool: return p1.money > p2.money + ) + current_board_state.current_player = current_board_state.players[0] + + await all_players_ready_for_day_start + + if current_board_state.state == BoardState.State.PLACING_SPAWNS: + if current_board_state.spawn_placements > 0: + if current_board_state.current_player.id == Globals.game.this_player.id: + board.call_deferred( + "set_active_building", load("uid://d4ltd1geg7s2p").instantiate() + ) + return + current_board_state.state = BoardState.State.DRAFT current_board_state.day += 1 current_board_state.turn = 1 + current_board_state.state = BoardState.State.DRAFT + for p in current_board_state.players: + p.build_actions_taken = 0 + tally_votes() + reduce_draft_costs() + seed(Globals.game.sum_player_ids()) deck.shuffle() var turn_index := current_board_state.get_this_player_index() @@ -108,33 +195,57 @@ func start_day() -> void: func end_day() -> void: controls.end_day() get_tree().call_group("Pausable", "unpause") + is_playing_day = true + + +func update_player_votes(player: Player, votes: int) -> void: + var idx = current_board_state.get_player_index(player) + current_board_state.players[idx].votes = votes + + +func update_player_money(player: Player, money: int) -> void: + var idx = current_board_state.get_player_index(player) + current_board_state.players[idx].money = money + + +func reduce_draft_costs() -> void: + for building in current_board_state.real_estate_market: + building.cost = ceili(building.cost / 2.0) + controls.set_board_state(current_board_state) 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.spawn_placements = current_board_state.spawn_placements + if ( + current_board_state.state != BoardState.State.DRAFT + and current_board_state.state != BoardState.State.PLACING_SPAWNS + ): + pending_board_state.turn = current_board_state.turn + 1 + 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()) + if ( + pending_board_state.state == BoardState.State.INITIAL_SETUP + and pending_board_state.turn == -pending_board_state.players.size() + ): + pending_board_state.players.reverse() 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) + pending_board_state.real_estate_market = current_board_state.real_estate_market controls.check_controls_enabled() + controls.set_info() 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) + pending_board_state.real_estate_market.remove_at(draft_index_to_be_deleted) draft_index_to_be_deleted = -1 + advance_board_state.rpc(pending_board_state.serialize()) func handle_pass() -> void: @@ -142,13 +253,19 @@ func handle_pass() -> void: 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()) + advance_board_state.rpc(current_board_state.serialize()) + + +func reset_turn() -> void: + pending_board_state = null + update_board_state.rpc(original_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() + is_playing_day = false controls.reset_turn() var winning_player_idx = current_board_state.players.find_custom( func(p: Player) -> bool: return p.money >= 100 @@ -157,7 +274,20 @@ func handle_citizens_finished() -> void: game_over.set_winning_player(current_board_state.players[winning_player_idx]) else: start_day() + ready_for_day_start.rpc() -func queue_spawn_placement(_num_placements: int) -> void: - print("Handle queueing spawn placements") +func tally_votes() -> void: + var most_votes: int = ( + current_board_state.players.map(func(p: Player) -> int: return p.votes).max() + ) + var players_with_most_votes: Array[Player] = current_board_state.players.filter( + func(p: Player) -> bool: return p.votes == most_votes + ) + if players_with_most_votes.size() == 1: + players_with_most_votes[0].building_permits += 1 + + +func queue_spawn_placement(num_placements: int) -> void: + current_board_state.spawn_placements += num_placements * current_board_state.players.size() + current_board_state.state = BoardState.State.PLACING_SPAWNS diff --git a/scenes/game.gd b/scenes/game.gd index 44b9994..11dd6ff 100644 --- a/scenes/game.gd +++ b/scenes/game.gd @@ -74,11 +74,14 @@ func create_initial_board_state() -> void: Globals.board_game.board.initialize() var board_state := BoardState.new() players.shuffle() - board_state.turn = -players.size() + board_state.turn = -(players.size() * 2) board_state.players = players board_state.current_player = players[0] board_state.tiles = Globals.board_game.board.tiles.values() - Globals.board_game.set_board_state.rpc(board_state.serialize()) + for building in Globals.board_game.board.buildings.values(): + if !board_state.buildings.has(building): + board_state.buildings.append(building) + Globals.board_game.advance_board_state.rpc(board_state.serialize()) Globals.board_game.setup_building_deck.rpc()