diff options
author | Daniel Weipert <git@mail.dweipert.de> | 2025-02-08 23:44:34 +0100 |
---|---|---|
committer | Daniel Weipert <git@mail.dweipert.de> | 2025-02-08 23:44:34 +0100 |
commit | f6c81b065cf4d7f1302a50f2f72cfab32204a1ec (patch) | |
tree | 7690bae73a7bf54ed973a8c8480ba104d8ab413f | |
parent | d24180c58e9e1d6149f0ac41d4f4bbaf674bdbd3 (diff) |
next commit
-rw-r--r-- | main.gd | 17 | ||||
-rw-r--r-- | main.gd.uid | 1 | ||||
-rw-r--r-- | main.tscn | 27 | ||||
-rw-r--r-- | network/network.gd | 81 | ||||
-rw-r--r-- | network/network.gd.uid | 1 | ||||
-rw-r--r-- | network/network.tscn | 9 | ||||
-rw-r--r-- | player/player.gd | 44 | ||||
-rw-r--r-- | player/player.gd.uid | 1 | ||||
-rw-r--r-- | player/player.tscn | 6 | ||||
-rw-r--r-- | project.godot | 6 | ||||
-rw-r--r-- | stage/dice_throw/dice.tscn | 9 | ||||
-rw-r--r-- | stage/dice_throw/dice_face.gd | 5 | ||||
-rw-r--r-- | stage/dice_throw/dice_face.gd.uid | 1 | ||||
-rw-r--r-- | stage/dice_throw/dice_face.tscn | 6 | ||||
-rw-r--r-- | stage/dice_throw/dice_throw.gd | 6 | ||||
-rw-r--r-- | stage/grid_selector/grid_selector.gd | 12 | ||||
-rw-r--r-- | stage/grid_selector/grid_selector.tscn | 1 | ||||
-rw-r--r-- | stage/grid_selector/state_cube_placement.gd | 9 | ||||
-rw-r--r-- | stage/grid_selector/state_move_mode.gd | 8 | ||||
-rw-r--r-- | stage/hud_main.gd | 10 | ||||
-rw-r--r-- | stage/hud_move_mode.gd | 20 | ||||
-rw-r--r-- | stage/hud_move_mode.gd.uid | 1 | ||||
-rw-r--r-- | stage/hud_unit.gd | 2 | ||||
-rw-r--r-- | stage/stage.gd | 116 | ||||
-rw-r--r-- | stage/stage.tscn | 39 | ||||
-rw-r--r-- | stage/team.gd | 9 | ||||
-rw-r--r-- | stage/team.gd.uid | 1 |
27 files changed, 402 insertions, 46 deletions
@@ -0,0 +1,17 @@ +extends Control + + +func _ready() -> void: + Network.current_player_changed.connect(_current_player_changed) + + +func _on_button_pressed() -> void: + Network.host() + + +func _on_button_2_pressed() -> void: + Network.join() + + +func _current_player_changed() -> void: + get_tree().change_scene_to_file("res://stage/stage.tscn") diff --git a/main.gd.uid b/main.gd.uid new file mode 100644 index 0000000..8f40a31 --- /dev/null +++ b/main.gd.uid @@ -0,0 +1 @@ +uid://dm77sa5w5jdgo @@ -1,4 +1,6 @@ -[gd_scene format=3 uid="uid://c3sdm0knce1fx"] +[gd_scene load_steps=2 format=3 uid="uid://c3sdm0knce1fx"] + +[ext_resource type="Script" uid="uid://dm77sa5w5jdgo" path="res://main.gd" id="1_ig7tw"] [node name="Main" type="Control"] layout_mode = 3 @@ -7,3 +9,26 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +script = ExtResource("1_ig7tw") + +[node name="CenterContainer" type="CenterContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer"] +layout_mode = 2 + +[node name="Button" type="Button" parent="CenterContainer/VBoxContainer"] +layout_mode = 2 +text = "Host" + +[node name="Button2" type="Button" parent="CenterContainer/VBoxContainer"] +layout_mode = 2 +text = "Join" + +[connection signal="pressed" from="CenterContainer/VBoxContainer/Button" to="." method="_on_button_pressed"] +[connection signal="pressed" from="CenterContainer/VBoxContainer/Button2" to="." method="_on_button_2_pressed"] diff --git a/network/network.gd b/network/network.gd new file mode 100644 index 0000000..c6e3351 --- /dev/null +++ b/network/network.gd @@ -0,0 +1,81 @@ +extends Node + + +var local_player: Player + +signal current_player_changed +var current_player_id: int: + set (value): + current_player_id = value + current_player = get_player(value) + current_player_changed.emit() +var current_player: Player + +var player_order := [1]: + set (value): + player_order = value + set_player_order.rpc(value) + + +func _ready() -> void: + multiplayer.peer_connected.connect(_on_peer_connected) + multiplayer.peer_disconnected.connect(_on_peer_disconnected) + + +func host() -> void: + var peer := ENetMultiplayerPeer.new() + peer.create_server(1234) + multiplayer.multiplayer_peer = peer + add_player(multiplayer.get_unique_id()) + local_player = get_player(multiplayer.get_unique_id()) + current_player = local_player + current_player_id = multiplayer.get_unique_id() + + +func join() -> void: + var peer := ENetMultiplayerPeer.new() + peer.create_client("localhost", 1234) + multiplayer.multiplayer_peer = peer + add_player(multiplayer.get_unique_id()) + local_player = get_player(multiplayer.get_unique_id()) + + +func add_player(id: int) -> void: + var player: Player = load("res://player/player.tscn").instantiate() + player.id = id + %Players.add_child(player) + + +func get_player(id: int) -> Player: + return %Players.get_node(str(id)) + + +func is_my_turn() -> bool: + return current_player == local_player + + +func set_current_player(id: int) -> void: + sync_current_player.rpc(id) + +@rpc("any_peer", "call_local") +func sync_current_player(id: int) -> void: + current_player_id = id + + +@rpc("authority", "call_remote") +func set_player_order(value: Array) -> void: + player_order = value + + +func _on_peer_connected(id: int): + add_player(id) + + if multiplayer.is_server(): + sync_current_player.rpc_id(id, current_player_id) + player_order.append(id) + else: + get_player(id).set_initial_values() + + +func _on_peer_disconnected(id: int): + %Players.remove_child(%Players.get_node(str(id))) diff --git a/network/network.gd.uid b/network/network.gd.uid new file mode 100644 index 0000000..ef9f4bd --- /dev/null +++ b/network/network.gd.uid @@ -0,0 +1 @@ +uid://s501248mox21 diff --git a/network/network.tscn b/network/network.tscn new file mode 100644 index 0000000..414712f --- /dev/null +++ b/network/network.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://bcsu36le4cax6"] + +[ext_resource type="Script" uid="uid://s501248mox21" path="res://network/network.gd" id="1_g3i60"] + +[node name="Network" type="Node"] +script = ExtResource("1_g3i60") + +[node name="Players" type="Node" parent="."] +unique_name_in_owner = true diff --git a/player/player.gd b/player/player.gd new file mode 100644 index 0000000..28e9caa --- /dev/null +++ b/player/player.gd @@ -0,0 +1,44 @@ +class_name Player +extends Node + + +var id: int: + set(value): + id = value + name = str(value) + +var current_team_name: String +var current_move_points := 10 + + +func get_color() -> Color: + var rng = RandomNumberGenerator.new() + rng.seed = id + + return Color(rng.randf(), rng.randf(), rng.randf()) + + +func set_current_team_name(value: String) -> void: + sync_current_team_name.rpc(value) + +@rpc("any_peer", "call_local") +func sync_current_team_name(value: String) -> void: + current_team_name = value + + +func set_current_move_points(value: int) -> void: + sync_current_move_points.rpc(value) + +@rpc("any_peer", "call_local") +func sync_current_move_points(value: int) -> void: + current_move_points = value + + +func set_initial_values() -> void: + if not multiplayer.is_server(): + sync_initial_values.rpc_id(1, multiplayer.get_unique_id()) + +@rpc("any_peer", "call_remote") +func sync_initial_values(target_id: int) -> void: + sync_current_team_name.rpc_id(target_id, current_team_name) + sync_current_move_points.rpc_id(target_id, current_move_points) diff --git a/player/player.gd.uid b/player/player.gd.uid new file mode 100644 index 0000000..a9b5dab --- /dev/null +++ b/player/player.gd.uid @@ -0,0 +1 @@ +uid://682w1pah1vve diff --git a/player/player.tscn b/player/player.tscn new file mode 100644 index 0000000..f26e489 --- /dev/null +++ b/player/player.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://b3hprbhw2cait"] + +[ext_resource type="Script" uid="uid://682w1pah1vve" path="res://player/player.gd" id="1_oul6g"] + +[node name="Player" type="Node"] +script = ExtResource("1_oul6g") diff --git a/project.godot b/project.godot index b05ca3f..7c8a08c 100644 --- a/project.godot +++ b/project.godot @@ -11,10 +11,14 @@ config_version=5 [application] config/name="Dice Arena" -run/main_scene="res://stage/stage.tscn" +run/main_scene="uid://c3sdm0knce1fx" config/features=PackedStringArray("4.4", "GL Compatibility") config/icon="res://icon.svg" +[autoload] + +Network="*res://network/network.tscn" + [display] window/size/viewport_width=480 diff --git a/stage/dice_throw/dice.tscn b/stage/dice_throw/dice.tscn index 75fb93c..38f13d0 100644 --- a/stage/dice_throw/dice.tscn +++ b/stage/dice_throw/dice.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=12 format=3 uid="uid://dnq7fpof6w0mj"] +[gd_scene load_steps=13 format=3 uid="uid://dnq7fpof6w0mj"] [ext_resource type="Script" uid="uid://bajtxq3ucs8f4" path="res://stage/dice_throw/dice.gd" id="1_gwnix"] [ext_resource type="Texture2D" uid="uid://blanietpri1be" path="res://icon.svg" id="2_6tbdd"] +[ext_resource type="PackedScene" uid="uid://y1hkmpd41rrq" path="res://stage/dice_throw/dice_face.tscn" id="2_ee854"] [ext_resource type="Texture2D" uid="uid://dtltt171temec" path="res://stage/assets/tinyBlocks.png" id="3_t0umq"] [sub_resource type="PhysicsMaterial" id="PhysicsMaterial_m7tx2"] @@ -44,11 +45,11 @@ shape = SubResource("BoxShape3D_tqijt") [node name="Faces" type="Node3D" parent="."] -[node name="Sprite3D" type="Sprite3D" parent="Faces"] +[node name="DiceFace" parent="Faces" instance=ExtResource("2_ee854")] transform = Transform3D(0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0, 0, 0.51) texture = ExtResource("2_6tbdd") -metadata/up = Vector3(-90, 0, 0) -metadata/type = "move" +up_rotation = Vector3(-90, 0, 0) +type = "move" [node name="Sprite3D2" type="Sprite3D" parent="Faces"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.51) diff --git a/stage/dice_throw/dice_face.gd b/stage/dice_throw/dice_face.gd new file mode 100644 index 0000000..6403a4c --- /dev/null +++ b/stage/dice_throw/dice_face.gd @@ -0,0 +1,5 @@ +extends Sprite3D + + +@export var up_rotation: Vector3 +@export var type: String diff --git a/stage/dice_throw/dice_face.gd.uid b/stage/dice_throw/dice_face.gd.uid new file mode 100644 index 0000000..785acfa --- /dev/null +++ b/stage/dice_throw/dice_face.gd.uid @@ -0,0 +1 @@ +uid://qvqdbngedxd3 diff --git a/stage/dice_throw/dice_face.tscn b/stage/dice_throw/dice_face.tscn new file mode 100644 index 0000000..913b133 --- /dev/null +++ b/stage/dice_throw/dice_face.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://y1hkmpd41rrq"] + +[ext_resource type="Script" uid="uid://qvqdbngedxd3" path="res://stage/dice_throw/dice_face.gd" id="1_63pm6"] + +[node name="DiceFace" type="Sprite3D"] +script = ExtResource("1_63pm6") diff --git a/stage/dice_throw/dice_throw.gd b/stage/dice_throw/dice_throw.gd index e612dc2..d06a8f7 100644 --- a/stage/dice_throw/dice_throw.gd +++ b/stage/dice_throw/dice_throw.gd @@ -6,6 +6,8 @@ signal throw_finished func _ready() -> void: %Side.position.x = -%Side.size.x + + %move.text = "Move: %s" % str(Network.current_player.current_move_points) func _on_dice_throw_3d_throw_finished() -> void: @@ -61,6 +63,10 @@ func _on_dice_throw_3d_throw_finished() -> void: var p3d = %Camera3D.project_position(node.position + node.size * 0.5, 1) tween.tween_property(dice, "position", p3d, 0.25) tween.tween_property(dice, "scale", Vector3(0.1, 0.1, 0.1), 0.25) + + if top_faces[idx].get_meta("type") == "move": + Network.current_player.set_current_move_points(Network.current_player.current_move_points + 1) + %move.text = "Move: %s" % str(Network.current_player.current_move_points) await tween.finished for dice in dices: diff --git a/stage/grid_selector/grid_selector.gd b/stage/grid_selector/grid_selector.gd index a2c3932..dd2f1e4 100644 --- a/stage/grid_selector/grid_selector.gd +++ b/stage/grid_selector/grid_selector.gd @@ -2,8 +2,11 @@ class_name GridSelector extends Node2D +signal state_changed +signal moved(grid_position: Vector2i) signal selected(node: Node2D) signal placed_tiles(grid_positions: Array) +signal move_mode_changed(path: Array) signal move_mode_confirmed(path: Array) signal move_mode_exited signal range_select_confirmed(grid_position: Vector2i, entity: Node2D) @@ -40,6 +43,9 @@ var current_entity: Node2D @export var range_select_current_range: int @export_flags_2d_physics var range_select_collision_mask: int +@export_group("Move Mode", "move_mode") +@export var move_mode_max_range: int + @onready var visual: Node2D = $Visual @onready var state_cube_placement: GridSelectorStateCubePlacement = $StateCubePlacement @onready var state_select: GridSelectorStateSelect = $StateSelect @@ -69,6 +75,7 @@ func _process(delta: float) -> void: movement_delta_threshold += delta * movement_delta_speed current_state.draw(ground_map.local_to_map(base_position) + Vector2i(input_vector)) + moved.emit(ground_map.local_to_map(base_position)) else: movement_delta = 0 movement_delta_threshold = 0 @@ -81,6 +88,7 @@ func set_current_state(value: Node): current_state = value value.process_mode = Node.PROCESS_MODE_INHERIT current_state._state_enter() + state_changed.emit() func adjust_height(selector_tile: Sprite2D) -> void: @@ -132,6 +140,10 @@ func _on_state_move_mode_exited() -> void: move_mode_exited.emit() +func _on_state_move_mode_changed(path: Array) -> void: + move_mode_changed.emit(path) + + func _on_state_range_select_confirmed(grid_position: Vector2i, entity: Node2D) -> void: range_select_confirmed.emit(grid_position, entity) diff --git a/stage/grid_selector/grid_selector.tscn b/stage/grid_selector/grid_selector.tscn index d8b59d4..d2541ed 100644 --- a/stage/grid_selector/grid_selector.tscn +++ b/stage/grid_selector/grid_selector.tscn @@ -89,6 +89,7 @@ y_sort_enabled = true [connection signal="placed_tiles" from="StateCubePlacement" to="." method="_on_state_cube_placement_placed_tiles"] [connection signal="selected" from="StateSelect" to="." method="_on_state_select_selected"] +[connection signal="changed" from="StateMoveMode" to="." method="_on_state_move_mode_changed"] [connection signal="confirmed" from="StateMoveMode" to="." method="_on_state_move_mode_confirmed"] [connection signal="exited" from="StateMoveMode" to="." method="_on_state_move_mode_exited"] [connection signal="confirmed" from="StateRangeSelect" to="." method="_on_state_range_select_confirmed"] diff --git a/stage/grid_selector/state_cube_placement.gd b/stage/grid_selector/state_cube_placement.gd index 3f1d2e7..d238437 100644 --- a/stage/grid_selector/state_cube_placement.gd +++ b/stage/grid_selector/state_cube_placement.gd @@ -196,16 +196,7 @@ func place_tiles(): positions.append(node.global_position) var grid_positions = positions.map(func(p): return ground_map.local_to_map(p)) - for p in grid_positions: - floor_map.set_cell( - p, - grid_selector.placement_tile_source_id, - grid_selector.placement_tile_atlas_coordinates, - grid_selector.placement_tile_alternative_tile - ) - placed_tiles.emit(grid_positions) - draw(ground_map.local_to_map(grid_selector.global_position)) func can_place() -> bool: diff --git a/stage/grid_selector/state_move_mode.gd b/stage/grid_selector/state_move_mode.gd index 25936c6..f903926 100644 --- a/stage/grid_selector/state_move_mode.gd +++ b/stage/grid_selector/state_move_mode.gd @@ -3,6 +3,7 @@ extends Node2D signal confirmed(path: Array) +signal changed(path: Array) signal exited var current_path: Array @@ -28,16 +29,19 @@ func draw(grid_position: Vector2i) -> void: if floor_map.get_cell_tile_data(grid_position) == null: return - current_path = grid.get_point_path( + var calculated_path := grid.get_point_path( ground_map.local_to_map(grid_selector.global_position), grid_position ) - if current_path.is_empty(): + if calculated_path.is_empty() or (calculated_path.size() - 1) > grid_selector.move_mode_max_range: return grid_selector.base_position = ground_map.map_to_local(grid_position) + current_path = calculated_path + changed.emit(current_path) + # remove starting position var working_path := current_path.slice(1) diff --git a/stage/hud_main.gd b/stage/hud_main.gd index 2aea87e..b80b514 100644 --- a/stage/hud_main.gd +++ b/stage/hud_main.gd @@ -37,3 +37,13 @@ func _on_button_pressed() -> void: grid_selector.current_state = grid_selector.state_cube_placement ) get_tree().current_scene.process_mode = PROCESS_MODE_DISABLED + + +func _on_button_2_pressed() -> void: + visible = false + + Network.set_current_player(Network.player_order[ + (Network.player_order.find(Network.current_player.id) + 1) % Network.player_order.size() + ]) + + grid_selector.process_mode = Node.PROCESS_MODE_INHERIT diff --git a/stage/hud_move_mode.gd b/stage/hud_move_mode.gd new file mode 100644 index 0000000..fad6ba2 --- /dev/null +++ b/stage/hud_move_mode.gd @@ -0,0 +1,20 @@ +extends CanvasLayer + + +@onready var grid_selector: GridSelector = get_tree().get_first_node_in_group("grid_selector") + + +func _ready() -> void: + grid_selector.move_mode_changed.connect(_on_grid_selector_move_mode_changed) + grid_selector.state_changed.connect(_on_grid_selector_state_changed) + +func _on_grid_selector_move_mode_changed(path: Array) -> void: + $PanelContainer/Label.text = "%s / %s" % [max(0, path.size() - 1), Network.current_player.current_move_points] + + +func _on_grid_selector_state_changed() -> void: + if grid_selector.current_state == grid_selector.state_move_mode: + _on_grid_selector_move_mode_changed([]) + visible = true + else: + visible = false diff --git a/stage/hud_move_mode.gd.uid b/stage/hud_move_mode.gd.uid new file mode 100644 index 0000000..db3017d --- /dev/null +++ b/stage/hud_move_mode.gd.uid @@ -0,0 +1 @@ +uid://bm0yvrdltu4n1 diff --git a/stage/hud_unit.gd b/stage/hud_unit.gd index b8351f7..bb8f8d8 100644 --- a/stage/hud_unit.gd +++ b/stage/hud_unit.gd @@ -11,7 +11,7 @@ func _ready() -> void: grid_selector.process_mode = Node.PROCESS_MODE_DISABLED visible = true - if node.current_team == grid_selector.current_team: + if node.current_team == grid_selector.current_team and Network.is_my_turn(): $PanelContainer/VBoxContainer/Button.visible = true $PanelContainer/VBoxContainer/Button2.visible = true $PanelContainer/VBoxContainer/Button.grab_focus() diff --git a/stage/stage.gd b/stage/stage.gd index b2d4736..9b1689f 100644 --- a/stage/stage.gd +++ b/stage/stage.gd @@ -3,11 +3,11 @@ extends Node2D var grid := AStarGrid2D.new() +var teams: Dictionary[String, Team] = {} @onready var grid_selector: GridSelector = %GridSelector -# Called when the node enters the scene tree for the first time. func _ready() -> void: grid.region = $Ground.get_used_rect() grid.cell_size = $Floor.tile_set.tile_size @@ -21,59 +21,123 @@ func _ready() -> void: # pre-set floor tiles as walkable for tile in $Floor.get_used_cells(): grid.set_point_solid(tile, false) - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(_delta: float) -> void: - pass + + grid_selector.move_mode_max_range = Network.current_player.current_move_points + + # teams + var team_one := Team.new() + team_one.placement_tile_source_id = 1 + team_one.placement_tile_atlas_coordinates = Vector2(1, 6) + team_one.placement_tile_alternative_tile = 0 + var team_two := Team.new() + team_two.placement_tile_source_id = 1 + team_two.placement_tile_atlas_coordinates = Vector2(3, 6) + team_two.placement_tile_alternative_tile = 0 + teams["1"] = team_one + teams["2"] = team_two + + if multiplayer.is_server(): + Network.local_player.set_current_team_name("1") + else: + Network.local_player.set_current_team_name("2") + + grid_selector.current_team = Network.local_player.current_team_name + + # remote selector + Network.current_player_changed.connect(func(): + if Network.is_my_turn(): + %RemoteSelector.visible = false + _on_grid_selector_moved($Ground.local_to_map(%GridSelector.global_position)) + else: + await get_tree().process_frame + %RemoteSelector.modulate = Network.current_player.get_color() + %RemoteSelector.visible = true + ) + %RemoteSelector.modulate = Network.current_player.get_color() + if Network.is_my_turn(): + %RemoteSelector.visible = false func _input(event: InputEvent) -> void: - if event.is_action_pressed("menu"): + if event.is_action_pressed("menu") and Network.is_my_turn(): $HUDMain.visible = true grid_selector.process_mode = Node.PROCESS_MODE_DISABLED $HUDMain/PanelContainer/VBoxContainer/Button.grab_focus() - - if event.is_action_pressed("test_4"): - var teams := ["1", "2"] - var tiles := [Vector2i(1,6), Vector2i(3,6)] - grid_selector.placement_tile_atlas_coordinates = tiles[(tiles.find(grid_selector.placement_tile_atlas_coordinates) + 1) % tiles.size()] - grid_selector.current_team = teams[(teams.find(grid_selector.current_team) + 1) % teams.size()] -func _on_grid_selector_placed_tiles(grid_positions: Array) -> void: +@rpc("any_peer", "call_local") +func place_tiles(grid_positions: Array, team: String) -> void: + for p in grid_positions: + $Floor.set_cell( + p, + teams[team].placement_tile_source_id, + teams[team].placement_tile_atlas_coordinates, + teams[team].placement_tile_alternative_tile + ) + for p in grid_positions: grid.set_point_solid(p, false) + grid_selector.current_state.draw($Ground.local_to_map(grid_selector.base_position)) + grid_selector.adjust_height(%RemoteSelector) + + +@rpc("any_peer", "call_local") +func place_unit(unit_position: Vector2, team: String) -> void: var unit = preload("res://unit/unit.tscn").instantiate() - unit.global_position = %GridSelector.global_position + $Floor.position - unit.current_team = grid_selector.current_team - add_child(unit) + unit.global_position = unit_position + $Floor.position + unit.current_team = team + unit.modulate = Network.current_player.get_color() + add_child(unit, true) # block unit tile for movement - grid.set_point_solid($Ground.local_to_map(%GridSelector.global_position), true) + grid.set_point_solid($Ground.local_to_map(unit_position), true) + + +@rpc("any_peer", "call_remote") +func move_unit(unit_node_path: String, path: Array) -> void: + var unit: Node2D = get_node(unit_node_path) + var tween = get_tree().create_tween() + for p in path.slice(1): # remove starting position + tween.tween_property(unit, "global_position", p + $Floor.position, 0.1) + await tween.finished + + # clear previous tile and set new tile solid + grid.set_point_solid($Ground.local_to_map(path[0]), false) + grid.set_point_solid($Ground.local_to_map(path[path.size() - 1]), true) + + +func _on_grid_selector_placed_tiles(grid_positions: Array) -> void: + place_tiles.rpc(grid_positions, Network.current_player.current_team_name) + place_unit.rpc(%GridSelector.global_position, Network.current_player.current_team_name) grid_selector.current_state = grid_selector.state_select func _on_grid_selector_move_mode_confirmed(path: Array) -> void: grid_selector.process_mode = Node.PROCESS_MODE_DISABLED - var unit: Node2D = grid_selector.current_entity - var tween = get_tree().create_tween() - for p in path.slice(1): # remove starting position - tween.tween_property(unit, "global_position", p + $Floor.position, 0.1) + move_unit.rpc(grid_selector.current_entity.get_path(), path) + await move_unit(grid_selector.current_entity.get_path(), path) - await tween.finished grid_selector.process_mode = Node.PROCESS_MODE_INHERIT grid_selector.current_state = grid_selector.get_node("StateSelect") grid_selector.current_state.draw($Ground.local_to_map(path[path.size() - 1])) - # clear previous tile and set new tile solid - grid.set_point_solid($Ground.local_to_map(path[0]), false) - grid.set_point_solid($Ground.local_to_map(path[path.size() - 1]), true) + Network.current_player.set_current_move_points(Network.current_player.current_move_points - (path.size() - 1)) + grid_selector.move_mode_max_range = Network.current_player.current_move_points func _on_grid_selector_range_select_confirmed(grid_position: Vector2i, entity: Node2D) -> void: entity.queue_free() grid.set_point_solid(grid_position, false) + + +func _on_grid_selector_moved(grid_position: Vector2i) -> void: + if Network.is_my_turn(): + move_remote_selector.rpc(grid_position) + +@rpc("any_peer", "call_remote") +func move_remote_selector(grid_position: Vector2i) -> void: + %RemoteSelector.global_position = $Ground.map_to_local(grid_position) + grid_selector.adjust_height(%RemoteSelector) diff --git a/stage/stage.tscn b/stage/stage.tscn index 7a2c83a..0490231 100644 --- a/stage/stage.tscn +++ b/stage/stage.tscn @@ -1,10 +1,22 @@ -[gd_scene load_steps=6 format=4 uid="uid://btphwdkbxijnr"] +[gd_scene load_steps=10 format=4 uid="uid://btphwdkbxijnr"] [ext_resource type="TileSet" uid="uid://dl0umywqpu3m8" path="res://stage/assets/tilemap.tres" id="1_0isyp"] [ext_resource type="Script" uid="uid://do2ktbmxsqjvj" path="res://stage/stage.gd" id="1_ccrgc"] [ext_resource type="PackedScene" uid="uid://dfhnxccd41wo0" path="res://stage/grid_selector/grid_selector.tscn" id="3_e6w2r"] [ext_resource type="Script" uid="uid://dp6j6hjfrx2l4" path="res://stage/hud_unit.gd" id="4_e13a1"] +[ext_resource type="Shader" uid="uid://d4hua7o4d6n1m" path="res://stage/grid_selector/grid_selector_item.gdshader" id="4_u7g2e"] +[ext_resource type="Texture2D" uid="uid://db0v50mdroaox" path="res://stage/assets/isometric-tile.png" id="5_h4sia"] [ext_resource type="Script" uid="uid://dydykm70ex0q0" path="res://stage/hud_main.gd" id="5_x0v28"] +[ext_resource type="Script" uid="uid://bm0yvrdltu4n1" path="res://stage/hud_move_mode.gd" id="6_cxybx"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_fwirk"] +shader = ExtResource("4_u7g2e") +shader_parameter/color = Color(9.14484e-06, 0.808187, 0, 1) +shader_parameter/color2 = Color(1.06369e-05, 0.734862, 9.62615e-07, 1) +shader_parameter/width = 1.0 +shader_parameter/pattern = 0 +shader_parameter/inside = true +shader_parameter/add_margins = false [node name="Stage" type="Node2D"] y_sort_enabled = true @@ -30,13 +42,19 @@ unique_name_in_owner = true stage = NodePath("..") ground_map = NodePath("../Ground") floor_map = NodePath("../Floor") -current_team = "1" selection_collision_mask = 2 placement_tile_source_id = 1 placement_tile_atlas_coordinates = Vector2i(1, 6) range_select_current_range = 2 range_select_collision_mask = 2 +[node name="RemoteSelector" type="Sprite2D" parent="."] +unique_name_in_owner = true +modulate = Color(0.92549, 0.92549, 0, 1) +texture_filter = 1 +material = SubResource("ShaderMaterial_fwirk") +texture = ExtResource("5_h4sia") + [node name="HUDUnit" type="CanvasLayer" parent="."] visible = false script = ExtResource("4_e13a1") @@ -84,9 +102,26 @@ theme_override_constants/separation = 0 layout_mode = 2 text = "Roll" +[node name="Button2" type="Button" parent="HUDMain/PanelContainer/VBoxContainer"] +layout_mode = 2 +text = "End Turn" + +[node name="HUDMoveMode" type="CanvasLayer" parent="."] +visible = false +script = ExtResource("6_cxybx") + +[node name="PanelContainer" type="PanelContainer" parent="HUDMoveMode"] +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="Label" type="Label" parent="HUDMoveMode/PanelContainer"] +layout_mode = 2 + [connection signal="move_mode_confirmed" from="GridSelector" to="." method="_on_grid_selector_move_mode_confirmed"] +[connection signal="moved" from="GridSelector" to="." method="_on_grid_selector_moved"] [connection signal="placed_tiles" from="GridSelector" to="." method="_on_grid_selector_placed_tiles"] [connection signal="range_select_confirmed" from="GridSelector" to="." method="_on_grid_selector_range_select_confirmed"] [connection signal="pressed" from="HUDUnit/PanelContainer/VBoxContainer/Button" to="HUDUnit" method="_on_button_pressed"] [connection signal="pressed" from="HUDUnit/PanelContainer/VBoxContainer/Button2" to="HUDUnit" method="_on_button_2_pressed"] [connection signal="pressed" from="HUDMain/PanelContainer/VBoxContainer/Button" to="HUDMain" method="_on_button_pressed"] +[connection signal="pressed" from="HUDMain/PanelContainer/VBoxContainer/Button2" to="HUDMain" method="_on_button_2_pressed"] diff --git a/stage/team.gd b/stage/team.gd new file mode 100644 index 0000000..5c66f51 --- /dev/null +++ b/stage/team.gd @@ -0,0 +1,9 @@ +class_name Team + + +@export var name: String + +@export_group("Placement Tile", "placement_tile") +@export var placement_tile_source_id: int +@export var placement_tile_atlas_coordinates: Vector2i +@export var placement_tile_alternative_tile: int diff --git a/stage/team.gd.uid b/stage/team.gd.uid new file mode 100644 index 0000000..05fcf1c --- /dev/null +++ b/stage/team.gd.uid @@ -0,0 +1 @@ +uid://c0k88psw6lf7q |