diff options
39 files changed, 668 insertions, 103 deletions
diff --git a/project.godot b/project.godot index 2f60eae..b05ca3f 100644 --- a/project.godot +++ b/project.godot @@ -12,7 +12,7 @@ config_version=5 config/name="Dice Arena" run/main_scene="res://stage/stage.tscn" -config/features=PackedStringArray("4.3", "GL Compatibility") +config/features=PackedStringArray("4.4", "GL Compatibility") config/icon="res://icon.svg" [display] @@ -57,22 +57,23 @@ left_click={ } test_1={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":88,"key_label":0,"unicode":120,"location":0,"echo":false,"script":null) -] +"events": [] } test_2={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":90,"key_label":0,"unicode":121,"location":0,"echo":false,"script":null) -] +"events": [] } test_3={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":89,"key_label":0,"unicode":122,"location":0,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":4,"pressure":0.0,"pressed":true,"script":null) -] +"events": [] } test_4={ "deadzone": 0.5, +"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":4,"pressure":0.0,"pressed":true,"script":null) +] +} +menu={ +"deadzone": 0.5, "events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":6,"pressure":0.0,"pressed":true,"script":null) ] } diff --git a/stage/assets/tinyBlocks.png b/stage/assets/tinyBlocks.png Binary files differindex 7d0a964..1b2ada6 100644 --- a/stage/assets/tinyBlocks.png +++ b/stage/assets/tinyBlocks.png diff --git a/stage/assets/tinyBlocks.png.import b/stage/assets/tinyBlocks.png.import index 30cb612..4aeb3f2 100644 --- a/stage/assets/tinyBlocks.png.import +++ b/stage/assets/tinyBlocks.png.import @@ -3,20 +3,19 @@ importer="texture" type="CompressedTexture2D" uid="uid://dtltt171temec" -path.s3tc="res://.godot/imported/tinyBlocks.png-1cc999784a8c355a5b508974705cefda.s3tc.ctex" +path="res://.godot/imported/tinyBlocks.png-1cc999784a8c355a5b508974705cefda.ctex" metadata={ -"imported_formats": ["s3tc_bptc"], -"vram_texture": true +"vram_texture": false } [deps] source_file="res://stage/assets/tinyBlocks.png" -dest_files=["res://.godot/imported/tinyBlocks.png-1cc999784a8c355a5b508974705cefda.s3tc.ctex"] +dest_files=["res://.godot/imported/tinyBlocks.png-1cc999784a8c355a5b508974705cefda.ctex"] [params] -compress/mode=2 +compress/mode=0 compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 diff --git a/stage/assets/tinyBlocks.png~ b/stage/assets/tinyBlocks.png~ Binary files differindex c10c38a..7ec464e 100644 --- a/stage/assets/tinyBlocks.png~ +++ b/stage/assets/tinyBlocks.png~ diff --git a/stage/dice_throw/dice.gd b/stage/dice_throw/dice.gd index 127d968..291710c 100644 --- a/stage/dice_throw/dice.gd +++ b/stage/dice_throw/dice.gd @@ -1,6 +1,11 @@ extends RigidBody3D +var previous_position: Vector3 +var previous_rotation: Vector3 +var is_moving := false + + func roll(direction := Vector3(1.0, 1.0, 1.0), strength: float = 20) -> void: var position_impulse := Vector3( [-1, 1].pick_random(), @@ -16,4 +21,22 @@ func roll(direction := Vector3(1.0, 1.0, 1.0), strength: float = 20) -> void: [-1, 1].pick_random() ) - apply_torque_impulse(rotation_impulse.normalized()) + apply_torque_impulse(rotation_impulse) + + +func get_top() -> Node3D: + var top := -pow(2, 8) + var face: Node3D + for node: Node3D in $Faces.get_children(): + if top < node.global_transform.origin.y: + top = node.global_transform.origin.y + face = node + + return face + + +func _physics_process(_delta: float) -> void: + is_moving = not previous_position == global_position and not previous_rotation == rotation + + previous_position = global_position + previous_rotation = rotation diff --git a/stage/dice_throw/dice.gd.uid b/stage/dice_throw/dice.gd.uid new file mode 100644 index 0000000..c550235 --- /dev/null +++ b/stage/dice_throw/dice.gd.uid @@ -0,0 +1 @@ +uid://bajtxq3ucs8f4 diff --git a/stage/dice_throw/dice.tscn b/stage/dice_throw/dice.tscn index 14f28b7..75fb93c 100644 --- a/stage/dice_throw/dice.tscn +++ b/stage/dice_throw/dice.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=12 format=3 uid="uid://dnq7fpof6w0mj"] -[ext_resource type="Script" path="res://stage/dice_throw/dice.gd" id="1_gwnix"] +[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="Texture2D" uid="uid://dtltt171temec" path="res://stage/assets/tinyBlocks.png" id="3_t0umq"] @@ -47,28 +47,40 @@ shape = SubResource("BoxShape3D_tqijt") [node name="Sprite3D" type="Sprite3D" parent="Faces"] 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" [node name="Sprite3D2" type="Sprite3D" parent="Faces"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.51) pixel_size = 0.05 texture = SubResource("AtlasTexture_0hsac") +metadata/up = Vector3(90, 0, 180) +metadata/type = "move" [node name="Sprite3D3" type="Sprite3D" parent="Faces"] transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0.51, 0, 0) pixel_size = 0.05 texture = SubResource("AtlasTexture_2rcxj") +metadata/up = Vector3(0, -90, 90) +metadata/type = "attack" [node name="Sprite3D4" type="Sprite3D" parent="Faces"] transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -0.51, 0, 0) pixel_size = 0.05 texture = SubResource("AtlasTexture_l100r") +metadata/up = Vector3(0, 90, -90) +metadata/type = "attack" [node name="Sprite3D5" type="Sprite3D" parent="Faces"] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.51, 0) pixel_size = 0.05 texture = SubResource("AtlasTexture_l8don") +metadata/up = Vector3(0, 180, 0) +metadata/type = "defend" [node name="Sprite3D6" type="Sprite3D" parent="Faces"] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, -0.51, 0) pixel_size = 0.05 texture = SubResource("AtlasTexture_ug301") +metadata/up = Vector3(180, 0, 0) +metadata/type = "ability" diff --git a/stage/dice_throw/dice_throw.gd b/stage/dice_throw/dice_throw.gd new file mode 100644 index 0000000..e612dc2 --- /dev/null +++ b/stage/dice_throw/dice_throw.gd @@ -0,0 +1,70 @@ +extends Control + + +signal throw_finished + + +func _ready() -> void: + %Side.position.x = -%Side.size.x + + +func _on_dice_throw_3d_throw_finished() -> void: + await get_tree().create_timer(0.25).timeout + + var dices := %DiceThrow3D/Dice.get_children() + var top_faces := [] + + var tween := create_tween().set_parallel() + + #tween.tween_property(%Camera3D, "rotation_degrees", Vector3(-90, 0, 0), 0.5) + #tween.tween_property(%Camera3D, "position", Vector3(0, %Camera3D.position.y, 0), 0.5) + + for idx in dices.size(): + var dice: RigidBody3D = dices[idx] + dice.freeze = true + + tween.tween_property( + dice, + "position", + %Camera3D.project_position((%SubViewportContainer.size * 0.5) + Vector2(50 * idx, 0) - Vector2(50, 0), 1), + 0.25 + ) + + var face: Node3D = dice.get_top() + top_faces.append(face) + + var up_rotation: Vector3 = face.get_meta("up") + var transform_vector: Vector3 + if up_rotation.y != 0 and up_rotation.z != 0: + transform_vector = Vector3(0, 0, 60) * sign(up_rotation.y) + else: + transform_vector = Vector3(60, 0, 0) * (-1 if up_rotation.y > 0 else 1) + tween.tween_property(dice, "rotation_degrees", face.get_meta("up") + transform_vector, 0.25) + + await tween.finished + await get_tree().create_timer(0.25).timeout + + tween = create_tween().set_parallel() + tween.tween_property(%Side, "position", Vector2(0, %Side.position.y), 0.25) + for dice in dices: + var p2d: Vector2 = %Camera3D.unproject_position(dice.position) + var p3d = %Camera3D.project_position(p2d + %Side.size * 0.5, 1) + tween.tween_property(dice, "position", Vector3(p3d.x, dice.position.y, dice.position.z), 0.25) + + await tween.finished + await get_tree().create_timer(0.25).timeout + + tween = create_tween().set_parallel() + for idx in dices.size(): + var dice: RigidBody3D = dices[idx] + var node := get_node("%" + top_faces[idx].get_meta("type")) + 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) + + await tween.finished + for dice in dices: + dice.visible = false + + await get_tree().create_timer(1.0).timeout + throw_finished.emit() diff --git a/stage/dice_throw/dice_throw.gd.uid b/stage/dice_throw/dice_throw.gd.uid new file mode 100644 index 0000000..f4147a3 --- /dev/null +++ b/stage/dice_throw/dice_throw.gd.uid @@ -0,0 +1 @@ +uid://p3q3cstjxr5l diff --git a/stage/dice_throw/dice_throw.tscn b/stage/dice_throw/dice_throw.tscn index 1311285..286dca4 100644 --- a/stage/dice_throw/dice_throw.tscn +++ b/stage/dice_throw/dice_throw.tscn @@ -1,5 +1,6 @@ -[gd_scene load_steps=5 format=3 uid="uid://dsy8atabknch"] +[gd_scene load_steps=6 format=3 uid="uid://dsy8atabknch"] +[ext_resource type="Script" uid="uid://p3q3cstjxr5l" path="res://stage/dice_throw/dice_throw.gd" id="1_3voo6"] [ext_resource type="PackedScene" uid="uid://dlkds7l1kw468" path="res://stage/dice_throw/dice_throw_3d.tscn" id="1_mg5cv"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_cqep4"] @@ -15,52 +16,92 @@ sky = SubResource("Sky_ij08j") tonemap_mode = 2 [node name="DiceThrow" type="Control"] +z_index = 3 layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +script = ExtResource("1_3voo6") -[node name="HBoxContainer" type="HBoxContainer" parent="."] +[node name="Background" type="ColorRect" parent="."] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +color = Color(0.180005, 0.180005, 0.180005, 1) -[node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] +[node name="Side" type="PanelContainer" parent="."] +unique_name_in_owner = true layout_mode = 2 +offset_right = 136.0 +offset_bottom = 320.0 -[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer/PanelContainer"] +[node name="VBoxContainer" type="VBoxContainer" parent="Side"] layout_mode = 2 -[node name="Label" type="Label" parent="HBoxContainer/PanelContainer/VBoxContainer"] +[node name="move" type="Label" parent="Side/VBoxContainer"] +unique_name_in_owner = true layout_mode = 2 text = "Movement Points" -[node name="SubViewportContainer" type="SubViewportContainer" parent="HBoxContainer"] +[node name="attack" type="Label" parent="Side/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Attack Points" + +[node name="defend" type="Label" parent="Side/VBoxContainer"] +unique_name_in_owner = true layout_mode = 2 +text = "Defend Points" + +[node name="ability" type="Label" parent="Side/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Ability Points" + +[node name="SubViewportContainer" type="SubViewportContainer" parent="."] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 size_flags_horizontal = 3 stretch = true -[node name="SubViewport" type="SubViewport" parent="HBoxContainer/SubViewportContainer"] +[node name="SubViewport" type="SubViewport" parent="SubViewportContainer"] transparent_bg = true handle_input_locally = false -size = Vector2i(340, 320) +size = Vector2i(480, 320) render_target_update_mode = 4 -[node name="DiceThrow3D" parent="HBoxContainer/SubViewportContainer/SubViewport" instance=ExtResource("1_mg5cv")] +[node name="DiceThrow3D" parent="SubViewportContainer/SubViewport" instance=ExtResource("1_mg5cv")] +unique_name_in_owner = true -[node name="Camera3D" type="Camera3D" parent="HBoxContainer/SubViewportContainer/SubViewport"] +[node name="Camera3D" type="Camera3D" parent="SubViewportContainer/SubViewport"] +unique_name_in_owner = true transform = Transform3D(1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, 0, 9, 10) projection = 1 size = 10.0 -[node name="WorldEnvironment" type="WorldEnvironment" parent="HBoxContainer/SubViewportContainer/SubViewport"] +[node name="WorldEnvironment" type="WorldEnvironment" parent="SubViewportContainer/SubViewport"] environment = SubResource("Environment_sn6lt") -[node name="DirectionalLight3D" type="DirectionalLight3D" parent="HBoxContainer/SubViewportContainer/SubViewport"] +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="SubViewportContainer/SubViewport"] transform = Transform3D(1, 0, 0, 0, 0.173648, 0.984808, 0, -0.984808, 0.173648, 0, 25, 0) shadow_enabled = true + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[connection signal="throw_finished" from="SubViewportContainer/SubViewport/DiceThrow3D" to="." method="_on_dice_throw_3d_throw_finished"] diff --git a/stage/dice_throw/dice_throw_3d.gd b/stage/dice_throw/dice_throw_3d.gd index c5734a0..5c2ef94 100644 --- a/stage/dice_throw/dice_throw_3d.gd +++ b/stage/dice_throw/dice_throw_3d.gd @@ -1,11 +1,48 @@ extends Node3D +signal throw_finished + +var dice_scene := preload("res://stage/dice_throw/dice.tscn") +var dices := [] +var do_check_dice_state := false + +@export var dice_count := 3 + + # Called when the node enters the scene tree for the first time. func _ready() -> void: - $Dice.roll() + for _i in dice_count: + var dice: Node3D = dice_scene.instantiate() + $Dice.add_child(dice) + dice.position = Vector3( + randf_range(-3, 3), + randf_range(2, 5), + randf_range(-3, 3) + ) + dice.rotation_degrees = Vector3( + randf_range(0, 360), + randf_range(0, 360), + randf_range(0, 360) + ) + dices.append(dice) + dice.roll() + + await get_tree().create_timer(0.5).timeout + do_check_dice_state = true -func _process(_delta: float) -> void: +func _physics_process(_delta: float) -> void: if Input.is_action_just_pressed("ui_accept"): - $Dice.roll(Vector3(1,1,0)) + for dice in dices: + dice.roll(Vector3(1,1,0)) + + var moving := false + for dice in dices: + if dice.is_moving: + moving = true + break + + if do_check_dice_state and not moving: + do_check_dice_state = false + throw_finished.emit() diff --git a/stage/dice_throw/dice_throw_3d.gd.uid b/stage/dice_throw/dice_throw_3d.gd.uid new file mode 100644 index 0000000..acd3735 --- /dev/null +++ b/stage/dice_throw/dice_throw_3d.gd.uid @@ -0,0 +1 @@ +uid://dkqskd6jbfgj5 diff --git a/stage/dice_throw/dice_throw_3d.tscn b/stage/dice_throw/dice_throw_3d.tscn index 15be9f5..9f63d9a 100644 --- a/stage/dice_throw/dice_throw_3d.tscn +++ b/stage/dice_throw/dice_throw_3d.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=4 format=3 uid="uid://dlkds7l1kw468"] +[gd_scene load_steps=3 format=3 uid="uid://dlkds7l1kw468"] -[ext_resource type="PackedScene" uid="uid://dnq7fpof6w0mj" path="res://stage/dice_throw/dice.tscn" id="1_ovyq0"] -[ext_resource type="Script" path="res://stage/dice_throw/dice_throw_3d.gd" id="1_w4qjs"] +[ext_resource type="Script" uid="uid://dkqskd6jbfgj5" path="res://stage/dice_throw/dice_throw_3d.gd" id="1_w4qjs"] [sub_resource type="BoxShape3D" id="BoxShape3D_pbdn1"] size = Vector3(10, 0.1, 10) @@ -30,5 +29,8 @@ shape = SubResource("BoxShape3D_pbdn1") transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 5, -5) shape = SubResource("BoxShape3D_pbdn1") -[node name="Dice" parent="." instance=ExtResource("1_ovyq0")] -transform = Transform3D(1, 0, 0, 0, 0.707107, -0.707107, 0, 0.707107, 0.707107, 0, 2.83258, -2) +[node name="CollisionShape3D6" type="CollisionShape3D" parent="StaticBody3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 0) +shape = SubResource("BoxShape3D_pbdn1") + +[node name="Dice" type="Node3D" parent="."] diff --git a/stage/grid_selector/grid_selector.gd b/stage/grid_selector/grid_selector.gd index 20c4a3a..a2c3932 100644 --- a/stage/grid_selector/grid_selector.gd +++ b/stage/grid_selector/grid_selector.gd @@ -6,6 +6,8 @@ signal selected(node: Node2D) signal placed_tiles(grid_positions: Array) signal move_mode_confirmed(path: Array) signal move_mode_exited +signal range_select_confirmed(grid_position: Vector2i, entity: Node2D) +signal range_select_exited var movement_delta := 0.0 var movement_delta_threshold := 0.0 @@ -18,17 +20,31 @@ var base_position: Vector2 var current_state: Node: set = set_current_state +var current_entity: Node2D + @export var stage: Stage @export var ground_map: TileMapLayer @export var floor_map: TileMapLayer -@export_flags_2d_physics var selection_collision_mask: int + @export var current_team: String + +@export_group("Selection", "selection") +@export_flags_2d_physics var selection_collision_mask: int + @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 +@export_group("Range Select", "range_select") +@export var range_select_current_range: int +@export_flags_2d_physics var range_select_collision_mask: int + @onready var visual: Node2D = $Visual +@onready var state_cube_placement: GridSelectorStateCubePlacement = $StateCubePlacement +@onready var state_select: GridSelectorStateSelect = $StateSelect +@onready var state_move_mode: GridSelectorStateMoveMode = $StateMoveMode +@onready var state_range_select: GridSelectorStateRangeSelect = $StateRangeSelect func _ready() -> void: @@ -58,17 +74,6 @@ func _process(delta: float) -> void: movement_delta_threshold = 0 -func _input(event: InputEvent) -> void: - if event.is_action_pressed("test_3"): - var states := [$StateSelect, $StateCubePlacement] - current_state = states[(states.find(current_state) + 1) % states.size()] - if event.is_action_pressed("test_4"): - var teams := ["1", "2"] - var tiles := [Vector2i(1,6), Vector2i(3,6)] - placement_tile_atlas_coordinates = tiles[(tiles.find(placement_tile_atlas_coordinates) + 1) % tiles.size()] - current_team = teams[(teams.find(current_team) + 1) % teams.size()] - - func set_current_state(value: Node): if current_state: current_state._state_exit() @@ -78,18 +83,37 @@ func set_current_state(value: Node): current_state._state_enter() -func adjust_height(tile: Sprite2D) -> void: +func adjust_height(selector_tile: Sprite2D) -> void: var tile_size: Vector2i = ground_map.tile_set.tile_size - var tile_data: TileData = floor_map.get_cell_tile_data(ground_map.local_to_map(tile.global_position)) + var tile_data: TileData = floor_map.get_cell_tile_data(ground_map.local_to_map(selector_tile.global_position)) if tile_data != null: - tile.global_position.y -= tile_size.y * 0.5 - tile.offset.y = 0 - tile.z_index = 1 + selector_tile.global_position.y -= tile_size.y * 0.5 + selector_tile.offset.y = 0 + selector_tile.z_index = 1 else: - tile.global_position.y -= 1 - tile.offset.y = 1 - tile.z_index = 0 + selector_tile.global_position.y -= 1 + selector_tile.offset.y = 1 + selector_tile.z_index = 0 + + +func get_entity_at_floor_tile(grid_position: Vector2i, collision_mask: int) -> Node2D: + var query := PhysicsPointQueryParameters2D.new() + query.collision_mask = collision_mask + query.collide_with_areas = true + query.collide_with_bodies = false + query.position = floor_map.map_to_local(grid_position) + floor_map.position + + var collision := get_world_2d().direct_space_state.intersect_point(query, 1) + if collision.size() > 0: + return collision[0].collider.get_parent() + + return null + + +func update_position(new_position: Vector2) -> void: + global_position = new_position + base_position = new_position func _on_state_select_selected(node: Node2D) -> void: @@ -106,3 +130,11 @@ func _on_state_move_mode_confirmed(path: Array) -> void: func _on_state_move_mode_exited() -> void: move_mode_exited.emit() + + +func _on_state_range_select_confirmed(grid_position: Vector2i, entity: Node2D) -> void: + range_select_confirmed.emit(grid_position, entity) + + +func _on_state_range_select_exited() -> void: + range_select_exited.emit() diff --git a/stage/grid_selector/grid_selector.gd.uid b/stage/grid_selector/grid_selector.gd.uid new file mode 100644 index 0000000..00a3ffb --- /dev/null +++ b/stage/grid_selector/grid_selector.gd.uid @@ -0,0 +1 @@ +uid://r8maoyfrrt44 diff --git a/stage/grid_selector/grid_selector.tscn b/stage/grid_selector/grid_selector.tscn index 49d416d..d8b59d4 100644 --- a/stage/grid_selector/grid_selector.tscn +++ b/stage/grid_selector/grid_selector.tscn @@ -1,11 +1,12 @@ -[gd_scene load_steps=8 format=3 uid="uid://dfhnxccd41wo0"] +[gd_scene load_steps=9 format=3 uid="uid://dfhnxccd41wo0"] -[ext_resource type="Shader" path="res://stage/grid_selector/grid_selector_item.gdshader" id="1_3nh1t"] -[ext_resource type="Script" path="res://stage/grid_selector/grid_selector.gd" id="1_3pk7u"] +[ext_resource type="Shader" uid="uid://d4hua7o4d6n1m" path="res://stage/grid_selector/grid_selector_item.gdshader" id="1_3nh1t"] +[ext_resource type="Script" uid="uid://r8maoyfrrt44" path="res://stage/grid_selector/grid_selector.gd" id="1_3pk7u"] [ext_resource type="Texture2D" uid="uid://db0v50mdroaox" path="res://stage/assets/isometric-tile.png" id="2_jd6wm"] -[ext_resource type="Script" path="res://stage/grid_selector/state_cube_placement.gd" id="4_bapxq"] -[ext_resource type="Script" path="res://stage/grid_selector/state_select.gd" id="5_wl8h0"] -[ext_resource type="Script" path="res://stage/grid_selector/state_move_mode.gd" id="6_w3vtp"] +[ext_resource type="Script" uid="uid://mdibwbv50mds" path="res://stage/grid_selector/state_cube_placement.gd" id="4_bapxq"] +[ext_resource type="Script" uid="uid://ccgtsghsvw32d" path="res://stage/grid_selector/state_select.gd" id="5_wl8h0"] +[ext_resource type="Script" uid="uid://g3ir4ke5ks35" path="res://stage/grid_selector/state_move_mode.gd" id="6_w3vtp"] +[ext_resource type="Script" uid="uid://cqdmhd810yfnk" path="res://stage/grid_selector/state_range_select.gd" id="7_0k3dq"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_2b8fn"] shader = ExtResource("1_3nh1t") @@ -79,7 +80,16 @@ script = ExtResource("6_w3vtp") [node name="Visual" type="CanvasGroup" parent="StateMoveMode"] y_sort_enabled = true +[node name="StateRangeSelect" type="Node2D" parent="."] +process_mode = 4 +script = ExtResource("7_0k3dq") + +[node name="Visual" type="CanvasGroup" parent="StateRangeSelect"] +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="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"] +[connection signal="exited" from="StateRangeSelect" to="." method="_on_state_range_select_exited"] diff --git a/stage/grid_selector/grid_selector_item.gdshader.uid b/stage/grid_selector/grid_selector_item.gdshader.uid new file mode 100644 index 0000000..6dd7765 --- /dev/null +++ b/stage/grid_selector/grid_selector_item.gdshader.uid @@ -0,0 +1 @@ +uid://d4hua7o4d6n1m diff --git a/stage/grid_selector/state_cube_placement.gd b/stage/grid_selector/state_cube_placement.gd index 5280906..3f1d2e7 100644 --- a/stage/grid_selector/state_cube_placement.gd +++ b/stage/grid_selector/state_cube_placement.gd @@ -148,13 +148,7 @@ func _process(_delta: float) -> void: func draw(grid_position: Vector2i) -> void: - var node_grid_positions := get_grid_positions(grid_position) - - var all_positions_in_grid := true - for p in node_grid_positions: - all_positions_in_grid = all_positions_in_grid and (ground_map.get_used_rect() as Rect2i).has_point(p) - - if all_positions_in_grid: + if is_in_bounds(grid_position): grid_selector.global_position = ground_map.map_to_local(grid_position) grid_selector.base_position = grid_selector.global_position @@ -172,6 +166,25 @@ func draw(grid_position: Vector2i) -> void: grid_selector.adjust_height(node) +func is_in_bounds(grid_position: Vector2i) -> bool: + var node_grid_positions := get_grid_positions(grid_position) + for p in node_grid_positions: + if not (ground_map.get_used_rect() as Rect2i).has_point(p): + return false + + return true + + +func get_out_of_bounds_tiles(grid_position: Vector2i) -> Array: + var node_grid_positions := get_grid_positions(grid_position) + var out_of_bounds_tiles := [] + for p in node_grid_positions: + if not (ground_map.get_used_rect() as Rect2i).has_point(p): + out_of_bounds_tiles.append(p) + + return out_of_bounds_tiles + + func place_tiles(): if not can_place(): return @@ -234,7 +247,22 @@ func _state_enter() -> void: for node: Node2D in grid_selector.visual.get_children(): node.visible = true - draw(ground_map.local_to_map(grid_selector.global_position)) + # move in bounds + # TODO: check against map boundaries (ex.: test on top left) + var grid_position := ground_map.local_to_map(grid_selector.global_position) + var out_of_bounds_tiles := get_out_of_bounds_tiles(grid_position) + if not out_of_bounds_tiles.is_empty(): + var transform_vector := Vector2i.ZERO + for p: Vector2i in out_of_bounds_tiles: + var vector := p - grid_position + if abs(vector.x) > abs(transform_vector.x): + transform_vector.x = vector.x + if abs(vector.y) > abs(transform_vector.y): + transform_vector.y = vector.y + grid_position = grid_position - transform_vector + grid_selector.update_position(ground_map.map_to_local(grid_position)) + + draw(grid_position) func _state_exit() -> void: diff --git a/stage/grid_selector/state_cube_placement.gd.uid b/stage/grid_selector/state_cube_placement.gd.uid new file mode 100644 index 0000000..289e109 --- /dev/null +++ b/stage/grid_selector/state_cube_placement.gd.uid @@ -0,0 +1 @@ +uid://mdibwbv50mds diff --git a/stage/grid_selector/state_move_mode.gd b/stage/grid_selector/state_move_mode.gd index 908f463..25936c6 100644 --- a/stage/grid_selector/state_move_mode.gd +++ b/stage/grid_selector/state_move_mode.gd @@ -5,7 +5,6 @@ extends Node2D signal confirmed(path: Array) signal exited -var target_position: Vector2i var current_path: Array @onready var grid_selector: GridSelector = get_parent() @@ -29,14 +28,16 @@ func draw(grid_position: Vector2i) -> void: if floor_map.get_cell_tile_data(grid_position) == null: return - target_position = grid_position - grid_selector.base_position = ground_map.map_to_local(target_position) - current_path = grid.get_point_path( ground_map.local_to_map(grid_selector.global_position), - target_position + grid_position ) + if current_path.is_empty(): + return + + grid_selector.base_position = ground_map.map_to_local(grid_position) + # remove starting position var working_path := current_path.slice(1) diff --git a/stage/grid_selector/state_move_mode.gd.uid b/stage/grid_selector/state_move_mode.gd.uid new file mode 100644 index 0000000..e196a89 --- /dev/null +++ b/stage/grid_selector/state_move_mode.gd.uid @@ -0,0 +1 @@ +uid://g3ir4ke5ks35 diff --git a/stage/grid_selector/state_range_select.gd b/stage/grid_selector/state_range_select.gd new file mode 100644 index 0000000..d9345f1 --- /dev/null +++ b/stage/grid_selector/state_range_select.gd @@ -0,0 +1,101 @@ +class_name GridSelectorStateRangeSelect +extends Node2D + + +signal confirmed(grid_position: Vector2i, entity: Node2D) +signal exited + +var directions := [ + Vector2i.UP, + Vector2i.DOWN, + Vector2i.LEFT, + Vector2i.RIGHT, +] + +var valid_tiles := {} + +var previous_tile: Node2D + +var current_base_position: Vector2i +var current_grid_position: Vector2i + +enum Mode { + Attack, +} + +var current_mode: Mode = Mode.Attack + +@onready var grid_selector: GridSelector = get_parent() +@onready var ground_map: TileMapLayer = grid_selector.ground_map +@onready var floor_map: TileMapLayer = grid_selector.floor_map +@onready var selector_tile: Sprite2D = grid_selector.get_node("Visual").get_child(0).duplicate() +@onready var path_tile: Sprite2D = grid_selector.get_node("Visual").get_child(1).duplicate() + + +func _ready() -> void: + pass # Replace with function body. + + +func _input(event: InputEvent) -> void: + if event.is_action_pressed("left_click"): + if current_grid_position != current_base_position: + var entity := grid_selector.get_entity_at_floor_tile( + current_grid_position, + grid_selector.range_select_collision_mask + ) + if entity != null: + if current_mode == Mode.Attack: + if entity.current_team != grid_selector.current_team: + confirmed.emit(current_grid_position, entity) + get_viewport().set_input_as_handled() + else: + confirmed.emit(current_grid_position, entity) + get_viewport().set_input_as_handled() + + if event.is_action_pressed("right_click"): + exited.emit() + + +func draw(grid_position: Vector2i) -> void: + if not grid_position in valid_tiles.keys(): + return + + current_grid_position = grid_position + grid_selector.base_position = ground_map.map_to_local(grid_position) + + var tile: Node2D = valid_tiles[grid_position] + tile.modulate = selector_tile.modulate + + previous_tile.modulate = path_tile.modulate + previous_tile = tile + + +func _state_enter() -> void: + current_base_position = ground_map.local_to_map(grid_selector.base_position) + current_grid_position = current_base_position + + var start_tile := selector_tile.duplicate() + $Visual.add_child(start_tile) + grid_selector.adjust_height(start_tile) + valid_tiles[current_base_position] = start_tile + previous_tile = start_tile + + for i in grid_selector.range_select_current_range: + for direction in directions: + var direction_grid_position = current_base_position + (direction * (i + 1)) + if floor_map.get_cell_tile_data(direction_grid_position) == null: + continue + + var tile := path_tile.duplicate() + $Visual.add_child(tile) + tile.global_position = ground_map.map_to_local(direction_grid_position) + grid_selector.adjust_height(tile) + + valid_tiles[direction_grid_position] = tile + + +func _state_exit() -> void: + valid_tiles.clear() + + for node in $Visual.get_children(): + node.queue_free() diff --git a/stage/grid_selector/state_range_select.gd.uid b/stage/grid_selector/state_range_select.gd.uid new file mode 100644 index 0000000..e9b282e --- /dev/null +++ b/stage/grid_selector/state_range_select.gd.uid @@ -0,0 +1 @@ +uid://cqdmhd810yfnk diff --git a/stage/grid_selector/state_select.gd b/stage/grid_selector/state_select.gd index 986dccc..8c06750 100644 --- a/stage/grid_selector/state_select.gd +++ b/stage/grid_selector/state_select.gd @@ -20,7 +20,13 @@ func _input(event: InputEvent) -> void: var collision := get_world_2d().direct_space_state.intersect_point(query, 1) if not collision.is_empty(): - selected.emit(collision[0].collider) + var collider = collision[0].collider.get_parent() + grid_selector.current_entity = collider + else: + grid_selector.current_entity = null + + if grid_selector.current_entity: + selected.emit(grid_selector.current_entity) func draw(grid_position: Vector2i) -> void: diff --git a/stage/grid_selector/state_select.gd.uid b/stage/grid_selector/state_select.gd.uid new file mode 100644 index 0000000..1096407 --- /dev/null +++ b/stage/grid_selector/state_select.gd.uid @@ -0,0 +1 @@ +uid://ccgtsghsvw32d diff --git a/stage/hud.gd b/stage/hud.gd index 8a0b146..01b00d4 100644 --- a/stage/hud.gd +++ b/stage/hud.gd @@ -40,3 +40,16 @@ func _on_button_pressed() -> void: grid_selector.process_mode = Node.PROCESS_MODE_INHERIT grid_selector.current_state = grid_selector.get_node("StateMoveMode") visible = false + + +func _on_button_3_pressed() -> void: + var dice_throw_scene = load("res://stage/dice_throw/dice_throw.tscn") + var dice_throw = dice_throw_scene.instantiate() + get_tree().root.add_child(dice_throw) + dice_throw.position -= dice_throw.size * 0.5 + dice_throw.throw_finished.connect(func(): + dice_throw.queue_free() + get_tree().current_scene.process_mode = PROCESS_MODE_INHERIT + grid_selector.current_state = grid_selector.state_cube_placement + ) + get_tree().current_scene.process_mode = PROCESS_MODE_DISABLED diff --git a/stage/hud.gd.uid b/stage/hud.gd.uid new file mode 100644 index 0000000..f893662 --- /dev/null +++ b/stage/hud.gd.uid @@ -0,0 +1 @@ +uid://k1bur8ywth7b diff --git a/stage/hud_main.gd b/stage/hud_main.gd new file mode 100644 index 0000000..2aea87e --- /dev/null +++ b/stage/hud_main.gd @@ -0,0 +1,39 @@ +extends CanvasLayer + + +@onready var grid_selector: GridSelector = get_tree().get_first_node_in_group("grid_selector") + + +func _ready() -> void: + visible = false + + +func _input(event: InputEvent) -> void: + if not visible: + return + + if event.is_action_pressed("left_click"): + for button: Button in $PanelContainer/VBoxContainer.get_children(): + if button.has_focus(): + button.pressed.emit() + break + + if event.is_action_pressed("menu") or event.is_action_pressed("right_click"): + visible = false + grid_selector.process_mode = Node.PROCESS_MODE_INHERIT + + +func _on_button_pressed() -> void: + visible = false + + var dice_throw_scene = load("res://stage/dice_throw/dice_throw.tscn") + var dice_throw = dice_throw_scene.instantiate() + get_tree().root.add_child(dice_throw) + dice_throw.position -= dice_throw.size * 0.5 + dice_throw.throw_finished.connect(func(): + dice_throw.queue_free() + get_tree().current_scene.process_mode = PROCESS_MODE_INHERIT + grid_selector.process_mode = PROCESS_MODE_INHERIT + grid_selector.current_state = grid_selector.state_cube_placement + ) + get_tree().current_scene.process_mode = PROCESS_MODE_DISABLED diff --git a/stage/hud_main.gd.uid b/stage/hud_main.gd.uid new file mode 100644 index 0000000..d82798e --- /dev/null +++ b/stage/hud_main.gd.uid @@ -0,0 +1 @@ +uid://dydykm70ex0q0 diff --git a/stage/hud_unit.gd b/stage/hud_unit.gd new file mode 100644 index 0000000..b8351f7 --- /dev/null +++ b/stage/hud_unit.gd @@ -0,0 +1,65 @@ +extends CanvasLayer + + +@onready var grid_selector: GridSelector = get_tree().get_first_node_in_group("grid_selector") + + +func _ready() -> void: + visible = false + + grid_selector.selected.connect(func(node: Node2D): + grid_selector.process_mode = Node.PROCESS_MODE_DISABLED + visible = true + + if node.current_team == grid_selector.current_team: + $PanelContainer/VBoxContainer/Button.visible = true + $PanelContainer/VBoxContainer/Button2.visible = true + $PanelContainer/VBoxContainer/Button.grab_focus() + else: + $PanelContainer/VBoxContainer/Button.visible = false + $PanelContainer/VBoxContainer/Button2.visible = false + $PanelContainer/VBoxContainer/Button3.grab_focus() + ) + + grid_selector.move_mode_exited.connect(func(): + grid_selector.current_state = grid_selector.state_select + grid_selector.process_mode = Node.PROCESS_MODE_DISABLED + visible = true + $PanelContainer/VBoxContainer/Button.grab_focus() + ) + + grid_selector.range_select_confirmed.connect(func(grid_position: Vector2i, _entity: Node2D): + grid_selector.current_state = grid_selector.state_select + grid_selector.current_state.draw(grid_position) + ) + + grid_selector.range_select_exited.connect(func(): + grid_selector.current_state = grid_selector.state_select + ) + + +func _input(event: InputEvent) -> void: + if not visible: + return + + if event.is_action_pressed("left_click"): + for button: Button in $PanelContainer/VBoxContainer.get_children(): + if button.has_focus(): + button.pressed.emit() + break + + elif event.is_action_pressed("right_click"): + visible = false + grid_selector.process_mode = Node.PROCESS_MODE_INHERIT + + +func _on_button_pressed() -> void: + grid_selector.process_mode = Node.PROCESS_MODE_INHERIT + grid_selector.current_state = grid_selector.state_move_mode + visible = false + + +func _on_button_2_pressed() -> void: + grid_selector.process_mode = Node.PROCESS_MODE_INHERIT + grid_selector.current_state = grid_selector.state_range_select + visible = false diff --git a/stage/hud_unit.gd.uid b/stage/hud_unit.gd.uid new file mode 100644 index 0000000..dcb80f4 --- /dev/null +++ b/stage/hud_unit.gd.uid @@ -0,0 +1 @@ +uid://dp6j6hjfrx2l4 diff --git a/stage/stage.gd b/stage/stage.gd index 1f79915..b2d4736 100644 --- a/stage/stage.gd +++ b/stage/stage.gd @@ -29,31 +29,37 @@ func _process(_delta: float) -> void: func _input(event: InputEvent) -> void: - if event.is_action_pressed("test_1"): - var unit = preload("res://unit/unit.tscn").instantiate() - unit.global_position = %GridSelector.global_position + $Floor.position - add_child(unit) - # TODO: generate dice throw anim => on end go to dice placement => add unit with tiles => go to select mode - if event.is_action_pressed("test_2"): - var unit: Node2D = get_node("Unit") - var path = grid.get_point_path( - $Floor.local_to_map(unit.global_position - $Floor.position), - $Floor.local_to_map(get_global_mouse_position() - $Floor.position) - ) - 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) + if event.is_action_pressed("menu"): + $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: for p in grid_positions: grid.set_point_solid(p, false) + + 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) + + # block unit tile for movement + grid.set_point_solid($Ground.local_to_map(%GridSelector.global_position), true) + + 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 = get_node("Unit") + 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) @@ -62,3 +68,12 @@ func _on_grid_selector_move_mode_confirmed(path: Array) -> void: 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) + + +func _on_grid_selector_range_select_confirmed(grid_position: Vector2i, entity: Node2D) -> void: + entity.queue_free() + grid.set_point_solid(grid_position, false) diff --git a/stage/stage.gd.uid b/stage/stage.gd.uid new file mode 100644 index 0000000..5a51fe5 --- /dev/null +++ b/stage/stage.gd.uid @@ -0,0 +1 @@ +uid://do2ktbmxsqjvj diff --git a/stage/stage.tscn b/stage/stage.tscn index adc5173..7a2c83a 100644 --- a/stage/stage.tscn +++ b/stage/stage.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=5 format=4 uid="uid://btphwdkbxijnr"] +[gd_scene load_steps=6 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" path="res://stage/stage.gd" id="1_ccrgc"] +[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" path="res://stage/hud.gd" id="4_cu7bb"] +[ext_resource type="Script" uid="uid://dp6j6hjfrx2l4" path="res://stage/hud_unit.gd" id="4_e13a1"] +[ext_resource type="Script" uid="uid://dydykm70ex0q0" path="res://stage/hud_main.gd" id="5_x0v28"] [node name="Stage" type="Node2D"] y_sort_enabled = true @@ -19,7 +20,7 @@ tile_set = ExtResource("1_0isyp") y_sort_enabled = true texture_filter = 1 position = Vector2(0, -4) -tile_map_data = PackedByteArray("AAANAP//AQABAAYAAADx////AQADAAYAAAA=") +tile_map_data = PackedByteArray("AAAOAP//AQABAAYAAADw////AQADAAYAAAA=") tile_set = ExtResource("1_0isyp") [node name="Camera2D" type="Camera2D" parent="."] @@ -29,15 +30,18 @@ unique_name_in_owner = true stage = NodePath("..") ground_map = NodePath("../Ground") floor_map = NodePath("../Floor") -selection_collision_mask = 2 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="HUD" type="CanvasLayer" parent="."] -script = ExtResource("4_cu7bb") +[node name="HUDUnit" type="CanvasLayer" parent="."] +visible = false +script = ExtResource("4_e13a1") -[node name="PanelContainer" type="PanelContainer" parent="HUD"] +[node name="PanelContainer" type="PanelContainer" parent="HUDUnit"] anchors_preset = 1 anchor_left = 1.0 anchor_right = 1.0 @@ -45,18 +49,44 @@ offset_left = -40.0 offset_bottom = 40.0 grow_horizontal = 0 -[node name="VBoxContainer" type="VBoxContainer" parent="HUD/PanelContainer"] +[node name="VBoxContainer" type="VBoxContainer" parent="HUDUnit/PanelContainer"] layout_mode = 2 theme_override_constants/separation = 0 -[node name="Button" type="Button" parent="HUD/PanelContainer/VBoxContainer"] +[node name="Button" type="Button" parent="HUDUnit/PanelContainer/VBoxContainer"] layout_mode = 2 text = "Move" -[node name="Button2" type="Button" parent="HUD/PanelContainer/VBoxContainer"] +[node name="Button2" type="Button" parent="HUDUnit/PanelContainer/VBoxContainer"] +layout_mode = 2 +text = "Attack" + +[node name="Button3" type="Button" parent="HUDUnit/PanelContainer/VBoxContainer"] layout_mode = 2 text = "Status" +[node name="HUDMain" type="CanvasLayer" parent="."] +script = ExtResource("5_x0v28") + +[node name="PanelContainer" type="PanelContainer" parent="HUDMain"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -40.0 +offset_bottom = 31.0 +grow_horizontal = 0 + +[node name="VBoxContainer" type="VBoxContainer" parent="HUDMain/PanelContainer"] +layout_mode = 2 +theme_override_constants/separation = 0 + +[node name="Button" type="Button" parent="HUDMain/PanelContainer/VBoxContainer"] +layout_mode = 2 +text = "Roll" + [connection signal="move_mode_confirmed" from="GridSelector" to="." method="_on_grid_selector_move_mode_confirmed"] [connection signal="placed_tiles" from="GridSelector" to="." method="_on_grid_selector_placed_tiles"] -[connection signal="pressed" from="HUD/PanelContainer/VBoxContainer/Button" to="HUD" method="_on_button_pressed"] +[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"] diff --git a/unit/area_2d.gd b/unit/area_2d.gd new file mode 100644 index 0000000..15b6a72 --- /dev/null +++ b/unit/area_2d.gd @@ -0,0 +1,5 @@ +extends Area2D + + +func get_entity() -> Unit: + return get_parent() diff --git a/unit/area_2d.gd.uid b/unit/area_2d.gd.uid new file mode 100644 index 0000000..7d11abc --- /dev/null +++ b/unit/area_2d.gd.uid @@ -0,0 +1 @@ +uid://u5kpy6jybqon diff --git a/unit/unit.gd b/unit/unit.gd new file mode 100644 index 0000000..e0f9025 --- /dev/null +++ b/unit/unit.gd @@ -0,0 +1,18 @@ +class_name Unit +extends Node2D + + +@export var max_hp := 0 +@export var current_hp := 0 + +@export var current_team: String + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(_delta: float) -> void: + pass diff --git a/unit/unit.gd.uid b/unit/unit.gd.uid new file mode 100644 index 0000000..6e96e3b --- /dev/null +++ b/unit/unit.gd.uid @@ -0,0 +1 @@ +uid://rbk7n3puwr3q diff --git a/unit/unit.tscn b/unit/unit.tscn index 9b152c1..39de6e6 100644 --- a/unit/unit.tscn +++ b/unit/unit.tscn @@ -1,12 +1,14 @@ -[gd_scene load_steps=3 format=3 uid="uid://dglv8ajgj4i4c"] +[gd_scene load_steps=4 format=3 uid="uid://dglv8ajgj4i4c"] [ext_resource type="Texture2D" uid="uid://blanietpri1be" path="res://icon.svg" id="1_0d47j"] +[ext_resource type="Script" uid="uid://rbk7n3puwr3q" path="res://unit/unit.gd" id="1_5uy8y"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_4xd6x"] size = Vector2(8, 8) [node name="Unit" type="Node2D"] z_index = 2 +script = ExtResource("1_5uy8y") [node name="Icon" type="Sprite2D" parent="."] scale = Vector2(0.063, 0.063) |