summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Weipert <git@mail.dweipert.de>2025-02-08 14:41:11 +0100
committerDaniel Weipert <git@mail.dweipert.de>2025-02-08 14:41:11 +0100
commitd24180c58e9e1d6149f0ac41d4f4bbaf674bdbd3 (patch)
treeb3316011d7ed6cfa43f6988bd6e05af3b311a495
parenta210c39b5d2be1e7e5c52568d40ba6a29f34b4bb (diff)
next commit
-rw-r--r--project.godot17
-rw-r--r--stage/assets/tinyBlocks.pngbin16548 -> 16572 bytes
-rw-r--r--stage/assets/tinyBlocks.png.import9
-rw-r--r--stage/assets/tinyBlocks.png~bin16521 -> 15739 bytes
-rw-r--r--stage/dice_throw/dice.gd25
-rw-r--r--stage/dice_throw/dice.gd.uid1
-rw-r--r--stage/dice_throw/dice.tscn14
-rw-r--r--stage/dice_throw/dice_throw.gd70
-rw-r--r--stage/dice_throw/dice_throw.gd.uid1
-rw-r--r--stage/dice_throw/dice_throw.tscn65
-rw-r--r--stage/dice_throw/dice_throw_3d.gd43
-rw-r--r--stage/dice_throw/dice_throw_3d.gd.uid1
-rw-r--r--stage/dice_throw/dice_throw_3d.tscn12
-rw-r--r--stage/grid_selector/grid_selector.gd72
-rw-r--r--stage/grid_selector/grid_selector.gd.uid1
-rw-r--r--stage/grid_selector/grid_selector.tscn22
-rw-r--r--stage/grid_selector/grid_selector_item.gdshader.uid1
-rw-r--r--stage/grid_selector/state_cube_placement.gd44
-rw-r--r--stage/grid_selector/state_cube_placement.gd.uid1
-rw-r--r--stage/grid_selector/state_move_mode.gd11
-rw-r--r--stage/grid_selector/state_move_mode.gd.uid1
-rw-r--r--stage/grid_selector/state_range_select.gd101
-rw-r--r--stage/grid_selector/state_range_select.gd.uid1
-rw-r--r--stage/grid_selector/state_select.gd8
-rw-r--r--stage/grid_selector/state_select.gd.uid1
-rw-r--r--stage/hud.gd13
-rw-r--r--stage/hud.gd.uid1
-rw-r--r--stage/hud_main.gd39
-rw-r--r--stage/hud_main.gd.uid1
-rw-r--r--stage/hud_unit.gd65
-rw-r--r--stage/hud_unit.gd.uid1
-rw-r--r--stage/stage.gd45
-rw-r--r--stage/stage.gd.uid1
-rw-r--r--stage/stage.tscn54
-rw-r--r--unit/area_2d.gd5
-rw-r--r--unit/area_2d.gd.uid1
-rw-r--r--unit/unit.gd18
-rw-r--r--unit/unit.gd.uid1
-rw-r--r--unit/unit.tscn4
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
index 7d0a964..1b2ada6 100644
--- a/stage/assets/tinyBlocks.png
+++ b/stage/assets/tinyBlocks.png
Binary files differ
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~
index c10c38a..7ec464e 100644
--- a/stage/assets/tinyBlocks.png~
+++ b/stage/assets/tinyBlocks.png~
Binary files differ
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)