summaryrefslogtreecommitdiff
path: root/stage
diff options
context:
space:
mode:
authorDaniel Weipert <git@mail.dweipert.de>2025-02-12 20:05:59 +0100
committerDaniel Weipert <git@mail.dweipert.de>2025-02-12 20:05:59 +0100
commit218748f67a6a6b35efc4a732ad11426d0f528709 (patch)
treee58504dd758ce6525844872007221cda2a8b6926 /stage
parentf6c81b065cf4d7f1302a50f2f72cfab32204a1ec (diff)
next commitHEADmain
Diffstat (limited to 'stage')
-rw-r--r--stage/assets/Halloween_PumpkinPatch_Bright.pngbin0 -> 377180 bytes
-rw-r--r--stage/assets/Halloween_PumpkinPatch_Bright.png.import34
-rw-r--r--stage/dice_throw/dice.gd18
-rw-r--r--stage/dice_throw/dice.tscn81
-rw-r--r--stage/dice_throw/dice_configuration.gd10
-rw-r--r--stage/dice_throw/dice_configuration.gd.uid1
-rw-r--r--stage/dice_throw/dice_face.gd3
-rw-r--r--stage/dice_throw/dice_face_configuration.gd6
-rw-r--r--stage/dice_throw/dice_face_configuration.gd.uid1
-rw-r--r--stage/dice_throw/dice_throw.gd44
-rw-r--r--stage/grid_selector/grid_selector.gd22
-rw-r--r--stage/grid_selector/grid_selector.tscn4
-rw-r--r--stage/grid_selector/state_cube_placement.gd1
-rw-r--r--stage/grid_selector/state_move_mode.gd1
-rw-r--r--stage/grid_selector/state_range_select.gd6
-rw-r--r--stage/grid_selector/state_select.gd64
-rw-r--r--stage/hud_main.gd38
-rw-r--r--stage/hud_unit.gd20
-rw-r--r--stage/player_unit.gd40
-rw-r--r--stage/player_unit.gd.uid1
-rw-r--r--stage/player_unit.tscn68
-rw-r--r--stage/stage.gd48
-rw-r--r--stage/stage.tscn84
23 files changed, 526 insertions, 69 deletions
diff --git a/stage/assets/Halloween_PumpkinPatch_Bright.png b/stage/assets/Halloween_PumpkinPatch_Bright.png
new file mode 100644
index 0000000..84a7aac
--- /dev/null
+++ b/stage/assets/Halloween_PumpkinPatch_Bright.png
Binary files differ
diff --git a/stage/assets/Halloween_PumpkinPatch_Bright.png.import b/stage/assets/Halloween_PumpkinPatch_Bright.png.import
new file mode 100644
index 0000000..89a2952
--- /dev/null
+++ b/stage/assets/Halloween_PumpkinPatch_Bright.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cb0rokx0rstj0"
+path="res://.godot/imported/Halloween_PumpkinPatch_Bright.png-56043f3a48c70ddc2917e8de0c6e221d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://stage/assets/Halloween_PumpkinPatch_Bright.png"
+dest_files=["res://.godot/imported/Halloween_PumpkinPatch_Bright.png-56043f3a48c70ddc2917e8de0c6e221d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/stage/dice_throw/dice.gd b/stage/dice_throw/dice.gd
index 291710c..88fdbb8 100644
--- a/stage/dice_throw/dice.gd
+++ b/stage/dice_throw/dice.gd
@@ -1,3 +1,4 @@
+class_name Dice
extends RigidBody3D
@@ -5,6 +6,17 @@ var previous_position: Vector3
var previous_rotation: Vector3
var is_moving := false
+@export var configuration: DiceConfiguration
+
+
+func _ready() -> void:
+ %DiceFaceFront.configuration = configuration.front_face
+ %DiceFaceBack.configuration = configuration.back_face
+ %DiceFaceTop.configuration = configuration.top_face
+ %DiceFaceBottom.configuration = configuration.bottom_face
+ %DiceFaceLeft.configuration = configuration.left_face
+ %DiceFaceRight.configuration = configuration.right_face
+
func roll(direction := Vector3(1.0, 1.0, 1.0), strength: float = 20) -> void:
var position_impulse := Vector3(
@@ -24,10 +36,10 @@ func roll(direction := Vector3(1.0, 1.0, 1.0), strength: float = 20) -> void:
apply_torque_impulse(rotation_impulse)
-func get_top() -> Node3D:
+func get_top() -> DiceFace:
var top := -pow(2, 8)
- var face: Node3D
- for node: Node3D in $Faces.get_children():
+ var face: DiceFace
+ for node: DiceFace in $Faces.get_children():
if top < node.global_transform.origin.y:
top = node.global_transform.origin.y
face = node
diff --git a/stage/dice_throw/dice.tscn b/stage/dice_throw/dice.tscn
index 38f13d0..5834cfb 100644
--- a/stage/dice_throw/dice.tscn
+++ b/stage/dice_throw/dice.tscn
@@ -1,13 +1,61 @@
-[gd_scene load_steps=13 format=3 uid="uid://dnq7fpof6w0mj"]
+[gd_scene load_steps=22 format=3 uid="uid://dnq7fpof6w0mj"]
[ext_resource type="Script" uid="uid://bajtxq3ucs8f4" path="res://stage/dice_throw/dice.gd" id="1_gwnix"]
[ext_resource type="Texture2D" uid="uid://blanietpri1be" path="res://icon.svg" id="2_6tbdd"]
+[ext_resource type="Script" uid="uid://dnklife8p0m35" path="res://stage/dice_throw/dice_face_configuration.gd" id="2_6vba1"]
[ext_resource type="PackedScene" uid="uid://y1hkmpd41rrq" path="res://stage/dice_throw/dice_face.tscn" id="2_ee854"]
+[ext_resource type="Script" uid="uid://6rit5abkk1rw" path="res://stage/dice_throw/dice_configuration.gd" id="3_juxel"]
[ext_resource type="Texture2D" uid="uid://dtltt171temec" path="res://stage/assets/tinyBlocks.png" id="3_t0umq"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_m7tx2"]
bounce = 0.5
+[sub_resource type="Resource" id="Resource_arxo3"]
+script = ExtResource("2_6vba1")
+type = "move"
+value = 1
+metadata/_custom_type_script = "uid://dnklife8p0m35"
+
+[sub_resource type="Resource" id="Resource_ms37x"]
+script = ExtResource("2_6vba1")
+type = "attack"
+value = 1
+metadata/_custom_type_script = "uid://dnklife8p0m35"
+
+[sub_resource type="Resource" id="Resource_tk6el"]
+script = ExtResource("2_6vba1")
+type = "move"
+value = 1
+metadata/_custom_type_script = "uid://dnklife8p0m35"
+
+[sub_resource type="Resource" id="Resource_l28ne"]
+script = ExtResource("2_6vba1")
+type = "defend"
+value = 1
+metadata/_custom_type_script = "uid://dnklife8p0m35"
+
+[sub_resource type="Resource" id="Resource_eguj2"]
+script = ExtResource("2_6vba1")
+type = "ability"
+value = 1
+metadata/_custom_type_script = "uid://dnklife8p0m35"
+
+[sub_resource type="Resource" id="Resource_c3r23"]
+script = ExtResource("2_6vba1")
+type = "attack"
+value = 1
+metadata/_custom_type_script = "uid://dnklife8p0m35"
+
+[sub_resource type="Resource" id="Resource_inr58"]
+script = ExtResource("3_juxel")
+front_face = SubResource("Resource_tk6el")
+back_face = SubResource("Resource_arxo3")
+top_face = SubResource("Resource_c3r23")
+bottom_face = SubResource("Resource_ms37x")
+left_face = SubResource("Resource_l28ne")
+right_face = SubResource("Resource_eguj2")
+metadata/_custom_type_script = "uid://6rit5abkk1rw"
+
[sub_resource type="BoxMesh" id="BoxMesh_gof22"]
[sub_resource type="BoxShape3D" id="BoxShape3D_tqijt"]
@@ -36,6 +84,7 @@ region = Rect2(72, 144, 18, 18)
physics_material_override = SubResource("PhysicsMaterial_m7tx2")
gravity_scale = 2.0
script = ExtResource("1_gwnix")
+configuration = SubResource("Resource_inr58")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("BoxMesh_gof22")
@@ -45,43 +94,47 @@ shape = SubResource("BoxShape3D_tqijt")
[node name="Faces" type="Node3D" parent="."]
-[node name="DiceFace" parent="Faces" instance=ExtResource("2_ee854")]
+[node name="DiceFaceFront" parent="Faces" instance=ExtResource("2_ee854")]
+unique_name_in_owner = true
transform = Transform3D(0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0, 0, 0.51)
texture = ExtResource("2_6tbdd")
up_rotation = Vector3(-90, 0, 0)
-type = "move"
-[node name="Sprite3D2" type="Sprite3D" parent="Faces"]
+[node name="DiceFaceBack" parent="Faces" instance=ExtResource("2_ee854")]
+unique_name_in_owner = true
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"
+up_rotation = Vector3(90, 0, 180)
-[node name="Sprite3D3" type="Sprite3D" parent="Faces"]
+[node name="DiceFaceLeft" parent="Faces" instance=ExtResource("2_ee854")]
+unique_name_in_owner = true
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"
+up_rotation = Vector3(0, -90, 90)
-[node name="Sprite3D4" type="Sprite3D" parent="Faces"]
+[node name="DiceFaceRight" parent="Faces" instance=ExtResource("2_ee854")]
+unique_name_in_owner = true
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"
+up_rotation = Vector3(0, 90, -90)
-[node name="Sprite3D5" type="Sprite3D" parent="Faces"]
+[node name="DiceFaceTop" parent="Faces" instance=ExtResource("2_ee854")]
+unique_name_in_owner = true
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")
+up_rotation = Vector3(0, 180, 0)
metadata/up = Vector3(0, 180, 0)
metadata/type = "defend"
-[node name="Sprite3D6" type="Sprite3D" parent="Faces"]
+[node name="DiceFaceBottom" parent="Faces" instance=ExtResource("2_ee854")]
+unique_name_in_owner = true
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")
+up_rotation = Vector3(180, 0, 0)
metadata/up = Vector3(180, 0, 0)
metadata/type = "ability"
diff --git a/stage/dice_throw/dice_configuration.gd b/stage/dice_throw/dice_configuration.gd
new file mode 100644
index 0000000..48a7d22
--- /dev/null
+++ b/stage/dice_throw/dice_configuration.gd
@@ -0,0 +1,10 @@
+class_name DiceConfiguration
+extends Resource
+
+
+@export var front_face: DiceFaceConfiguration
+@export var back_face: DiceFaceConfiguration
+@export var top_face: DiceFaceConfiguration
+@export var bottom_face: DiceFaceConfiguration
+@export var left_face: DiceFaceConfiguration
+@export var right_face: DiceFaceConfiguration
diff --git a/stage/dice_throw/dice_configuration.gd.uid b/stage/dice_throw/dice_configuration.gd.uid
new file mode 100644
index 0000000..e82d430
--- /dev/null
+++ b/stage/dice_throw/dice_configuration.gd.uid
@@ -0,0 +1 @@
+uid://6rit5abkk1rw
diff --git a/stage/dice_throw/dice_face.gd b/stage/dice_throw/dice_face.gd
index 6403a4c..f314a3f 100644
--- a/stage/dice_throw/dice_face.gd
+++ b/stage/dice_throw/dice_face.gd
@@ -1,5 +1,6 @@
+class_name DiceFace
extends Sprite3D
@export var up_rotation: Vector3
-@export var type: String
+@export var configuration: DiceFaceConfiguration
diff --git a/stage/dice_throw/dice_face_configuration.gd b/stage/dice_throw/dice_face_configuration.gd
new file mode 100644
index 0000000..e75dd90
--- /dev/null
+++ b/stage/dice_throw/dice_face_configuration.gd
@@ -0,0 +1,6 @@
+class_name DiceFaceConfiguration
+extends Resource
+
+
+@export var type: String
+@export var value: int
diff --git a/stage/dice_throw/dice_face_configuration.gd.uid b/stage/dice_throw/dice_face_configuration.gd.uid
new file mode 100644
index 0000000..3ffc129
--- /dev/null
+++ b/stage/dice_throw/dice_face_configuration.gd.uid
@@ -0,0 +1 @@
+uid://dnklife8p0m35
diff --git a/stage/dice_throw/dice_throw.gd b/stage/dice_throw/dice_throw.gd
index d06a8f7..c6573be 100644
--- a/stage/dice_throw/dice_throw.gd
+++ b/stage/dice_throw/dice_throw.gd
@@ -8,21 +8,23 @@ func _ready() -> void:
%Side.position.x = -%Side.size.x
%move.text = "Move: %s" % str(Network.current_player.current_move_points)
+ %attack.text = "Attack: %s" % str(Network.current_player.current_attack_points)
+ %defend.text = "Defend: %s" % str(Network.current_player.current_defend_points)
+ %ability.text = "Ability: %s" % str(Network.current_player.current_ability_points)
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 dices: Array[Dice]
+ dices.assign(%DiceThrow3D/Dice.get_children())
+ var top_faces: Array[DiceFace] = []
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)
-
+ # move to center and rotate to camera
for idx in dices.size():
- var dice: RigidBody3D = dices[idx]
+ var dice := dices[idx]
dice.freeze = true
tween.tween_property(
@@ -32,20 +34,21 @@ func _on_dice_throw_3d_throw_finished() -> void:
0.25
)
- var face: Node3D = dice.get_top()
+ var face := dice.get_top()
top_faces.append(face)
- var up_rotation: Vector3 = face.get_meta("up")
+ var up_rotation: Vector3 = face.up_rotation
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)
+ tween.tween_property(dice, "rotation_degrees", face.up_rotation + transform_vector, 0.25)
await tween.finished
await get_tree().create_timer(0.25).timeout
+ # show sidebar
tween = create_tween().set_parallel()
tween.tween_property(%Side, "position", Vector2(0, %Side.position.y), 0.25)
for dice in dices:
@@ -56,17 +59,32 @@ func _on_dice_throw_3d_throw_finished() -> void:
await tween.finished
await get_tree().create_timer(0.25).timeout
+ # move to labels
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 dice := dices[idx]
+ var top_face := top_faces[idx]
+ var node := get_node("%" + top_face.configuration.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)
- if top_faces[idx].get_meta("type") == "move":
- Network.current_player.set_current_move_points(Network.current_player.current_move_points + 1)
+ if top_face.configuration.type == "move":
+ #Network.current_player.set_current_move_points(Network.current_player.current_move_points + 1)
+ Network.current_player.current_move_points += top_face.configuration.value
%move.text = "Move: %s" % str(Network.current_player.current_move_points)
+ elif top_face.configuration.type == "attack":
+ #Network.current_player.set_current_attack_points(Network.current_player.current_attack_points + 1)
+ Network.current_player.current_attack_points += top_face.configuration.value
+ %attack.text = "Attack: %s" % str(Network.current_player.current_attack_points)
+ elif top_face.configuration.type == "defend":
+ #Network.current_player.set_current_defend_points(Network.current_player.current_defend_points + 1)
+ Network.current_player.current_defend_points += top_face.configuration.value
+ %defend.text = "Defend: %s" % str(Network.current_player.current_defend_points)
+ elif top_face.configuration.type == "ability":
+ #Network.current_player.set_current_ability_points(Network.current_player.current_ability_points + 1)
+ Network.current_player.current_ability_points += top_face.configuration.value
+ %ability.text = "Ability: %s" % str(Network.current_player.current_ability_points)
await tween.finished
for dice in dices:
diff --git a/stage/grid_selector/grid_selector.gd b/stage/grid_selector/grid_selector.gd
index dd2f1e4..156065b 100644
--- a/stage/grid_selector/grid_selector.gd
+++ b/stage/grid_selector/grid_selector.gd
@@ -5,6 +5,8 @@ extends Node2D
signal state_changed
signal moved(grid_position: Vector2i)
signal selected(node: Node2D)
+signal hover_enter(node: Node2D)
+signal hover_exit
signal placed_tiles(grid_positions: Array)
signal move_mode_changed(path: Array)
signal move_mode_confirmed(path: Array)
@@ -28,6 +30,7 @@ var current_entity: Node2D
@export var stage: Stage
@export var ground_map: TileMapLayer
@export var floor_map: TileMapLayer
+@export var camera: Camera2D
@export var current_team: String
@@ -41,6 +44,7 @@ var current_entity: Node2D
@export_group("Range Select", "range_select")
@export var range_select_current_range: int
+@export var range_select_current_mode: GridSelectorStateRangeSelect.Mode
@export_flags_2d_physics var range_select_collision_mask: int
@export_group("Move Mode", "move_mode")
@@ -74,8 +78,7 @@ func _process(delta: float) -> void:
else:
movement_delta_threshold += delta * movement_delta_speed
- current_state.draw(ground_map.local_to_map(base_position) + Vector2i(input_vector))
- moved.emit(ground_map.local_to_map(base_position))
+ move(ground_map.local_to_map(base_position) + Vector2i(input_vector))
else:
movement_delta = 0
movement_delta_threshold = 0
@@ -91,6 +94,11 @@ func set_current_state(value: Node):
state_changed.emit()
+func move(grid_position: Vector2i) -> void:
+ current_state.draw(grid_position)
+ moved.emit(ground_map.local_to_map(base_position))
+
+
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(selector_tile.global_position))
@@ -114,7 +122,7 @@ func get_entity_at_floor_tile(grid_position: Vector2i, collision_mask: int) -> N
var collision := get_world_2d().direct_space_state.intersect_point(query, 1)
if collision.size() > 0:
- return collision[0].collider.get_parent()
+ return collision[0].collider.get_root_node()
return null
@@ -128,6 +136,14 @@ func _on_state_select_selected(node: Node2D) -> void:
selected.emit(node)
+func _on_state_select_hover_enter(node: Node2D) -> void:
+ hover_enter.emit(node)
+
+
+func _on_state_select_hover_exit() -> void:
+ hover_exit.emit()
+
+
func _on_state_cube_placement_placed_tiles(grid_positions: Array) -> void:
placed_tiles.emit(grid_positions)
diff --git a/stage/grid_selector/grid_selector.tscn b/stage/grid_selector/grid_selector.tscn
index d2541ed..11bb6df 100644
--- a/stage/grid_selector/grid_selector.tscn
+++ b/stage/grid_selector/grid_selector.tscn
@@ -17,7 +17,7 @@ shader_parameter/pattern = 0
shader_parameter/inside = true
shader_parameter/add_margins = false
-[node name="GridSelector" type="Node2D"]
+[node name="GridSelector" type="Node2D" groups=["grid_selector"]]
y_sort_enabled = true
script = ExtResource("1_3pk7u")
@@ -88,6 +88,8 @@ script = ExtResource("7_0k3dq")
y_sort_enabled = true
[connection signal="placed_tiles" from="StateCubePlacement" to="." method="_on_state_cube_placement_placed_tiles"]
+[connection signal="hover_enter" from="StateSelect" to="." method="_on_state_select_hover_enter"]
+[connection signal="hover_exit" from="StateSelect" to="." method="_on_state_select_hover_exit"]
[connection signal="selected" from="StateSelect" to="." method="_on_state_select_selected"]
[connection signal="changed" from="StateMoveMode" to="." method="_on_state_move_mode_changed"]
[connection signal="confirmed" from="StateMoveMode" to="." method="_on_state_move_mode_confirmed"]
diff --git a/stage/grid_selector/state_cube_placement.gd b/stage/grid_selector/state_cube_placement.gd
index d238437..a1901ad 100644
--- a/stage/grid_selector/state_cube_placement.gd
+++ b/stage/grid_selector/state_cube_placement.gd
@@ -151,6 +151,7 @@ func draw(grid_position: Vector2i) -> void:
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
+ grid_selector.camera.global_position = grid_selector.global_position
var selector_tiles: Array = grid_selector.visual.get_children()
for idx in selector_tiles.size():
diff --git a/stage/grid_selector/state_move_mode.gd b/stage/grid_selector/state_move_mode.gd
index f903926..160d377 100644
--- a/stage/grid_selector/state_move_mode.gd
+++ b/stage/grid_selector/state_move_mode.gd
@@ -38,6 +38,7 @@ func draw(grid_position: Vector2i) -> void:
return
grid_selector.base_position = ground_map.map_to_local(grid_position)
+ grid_selector.camera.global_position = grid_selector.base_position
current_path = calculated_path
changed.emit(current_path)
diff --git a/stage/grid_selector/state_range_select.gd b/stage/grid_selector/state_range_select.gd
index d9345f1..cf671e6 100644
--- a/stage/grid_selector/state_range_select.gd
+++ b/stage/grid_selector/state_range_select.gd
@@ -23,8 +23,6 @@ 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
@@ -43,8 +41,9 @@ func _input(event: InputEvent) -> void:
current_grid_position,
grid_selector.range_select_collision_mask
)
+
if entity != null:
- if current_mode == Mode.Attack:
+ if grid_selector.range_select_current_mode == Mode.Attack:
if entity.current_team != grid_selector.current_team:
confirmed.emit(current_grid_position, entity)
get_viewport().set_input_as_handled()
@@ -62,6 +61,7 @@ func draw(grid_position: Vector2i) -> void:
current_grid_position = grid_position
grid_selector.base_position = ground_map.map_to_local(grid_position)
+ grid_selector.camera.global_position = grid_selector.base_position
var tile: Node2D = valid_tiles[grid_position]
tile.modulate = selector_tile.modulate
diff --git a/stage/grid_selector/state_select.gd b/stage/grid_selector/state_select.gd
index 8c06750..23c387e 100644
--- a/stage/grid_selector/state_select.gd
+++ b/stage/grid_selector/state_select.gd
@@ -3,6 +3,10 @@ extends Node2D
signal selected(node: Node2D)
+signal hover_enter(node: Node2D)
+signal hover_exit
+
+var current_unit_index: int = 0
@onready var grid_selector: GridSelector = get_parent()
@onready var ground_map: TileMapLayer = grid_selector.ground_map
@@ -12,21 +16,40 @@ signal selected(node: Node2D)
func _input(event: InputEvent) -> void:
if event.is_action_pressed("left_click"):
- var query := PhysicsPointQueryParameters2D.new()
- query.collision_mask = grid_selector.selection_collision_mask
- query.collide_with_areas = true
- query.position = selector_tile.global_position
-
- var collision := get_world_2d().direct_space_state.intersect_point(query, 1)
+ var collision := get_world_2d().direct_space_state.intersect_point(
+ get_collision_query(), 1
+ )
if not collision.is_empty():
- var collider = collision[0].collider.get_parent()
- grid_selector.current_entity = collider
+ var collider: Area2D = collision[0].collider
+ grid_selector.current_entity = collider.get_root_node()
else:
grid_selector.current_entity = null
if grid_selector.current_entity:
selected.emit(grid_selector.current_entity)
+
+
+ # jump to unit on field previous/next in list
+ if event.is_action_pressed("previous_rotation"):
+ if Network.local_player.units.size() > 0:
+ var next_index: int = (current_unit_index - 1) % Network.local_player.units.size()
+ current_unit_index = next_index
+ grid_selector.move(
+ floor_map.local_to_map(
+ Network.local_player.units[current_unit_index].global_position - floor_map.position
+ )
+ )
+
+ if event.is_action_pressed("next_rotation"):
+ if Network.local_player.units.size() > 0:
+ var next_index: int = (current_unit_index + 1) % Network.local_player.units.size()
+ current_unit_index = next_index
+ grid_selector.move(
+ floor_map.local_to_map(
+ Network.local_player.units[current_unit_index].global_position - floor_map.position
+ )
+ )
func draw(grid_position: Vector2i) -> void:
@@ -34,8 +57,33 @@ func draw(grid_position: Vector2i) -> void:
grid_selector.global_position = ground_map.map_to_local(grid_position)
grid_selector.base_position = grid_selector.global_position
selector_tile.global_position = grid_selector.global_position
+ grid_selector.camera.global_position = grid_selector.global_position
grid_selector.adjust_height(selector_tile)
+
+ # hover
+ var collision := get_world_2d().direct_space_state.intersect_point(
+ get_collision_query(), 1
+ )
+
+ if not collision.is_empty():
+ var collider: Area2D = collision[0].collider
+ grid_selector.current_entity = collider.get_root_node()
+ current_unit_index = Network.local_player.units.find(grid_selector.current_entity)
+ hover_enter.emit(grid_selector.current_entity)
+ else:
+ grid_selector.current_entity = null
+ hover_exit.emit()
+
+
+func get_collision_query() -> PhysicsPointQueryParameters2D:
+ var query := PhysicsPointQueryParameters2D.new()
+ query.collision_mask = grid_selector.selection_collision_mask
+ query.collide_with_areas = true
+ query.collide_with_bodies = false
+ query.position = selector_tile.global_position
+
+ return query
func _state_enter() -> void:
diff --git a/stage/hud_main.gd b/stage/hud_main.gd
index b80b514..c736e34 100644
--- a/stage/hud_main.gd
+++ b/stage/hud_main.gd
@@ -6,6 +6,10 @@ extends CanvasLayer
func _ready() -> void:
visible = false
+
+ Network.current_player_changed.connect(func():
+ set_current_player()
+ )
func _input(event: InputEvent) -> void:
@@ -23,13 +27,43 @@ func _input(event: InputEvent) -> void:
grid_selector.process_mode = Node.PROCESS_MODE_INHERIT
+func set_current_player() -> void:
+ if Network.is_my_turn():
+ $PanelContainer3/CurrentTurn.text = "Current Turn: Me"
+ else:
+ $PanelContainer3/CurrentTurn.text = "Current Turn: " + str(Network.current_player.id)
+
+
+func enable():
+ $PanelContainer2/VBoxContainer/move.text = "Move: " + str(Network.local_player.current_move_points)
+ $PanelContainer2/VBoxContainer/attack.text = "Atk: " + str(Network.local_player.current_attack_points)
+ $PanelContainer2/VBoxContainer/defend.text = "Def: " + str(Network.local_player.current_defend_points)
+ $PanelContainer2/VBoxContainer/ability.text = "Ablty: " + str(Network.local_player.current_ability_points)
+
+ set_current_player()
+
+ if Network.is_my_turn():
+ $PanelContainer/VBoxContainer/Button.visible = true
+ $PanelContainer/VBoxContainer/Button2.visible = true
+ else:
+ $PanelContainer/VBoxContainer/Button.visible = false
+ $PanelContainer/VBoxContainer/Button2.visible = false
+
+ visible = true
+
+ $PanelContainer/VBoxContainer/Button.grab_focus()
+
+
func _on_button_pressed() -> void:
visible = false
+ # TODO: open dice selection screen
+ # TODO: => then open throw
+
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
+ Game.overlay.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
diff --git a/stage/hud_unit.gd b/stage/hud_unit.gd
index bb8f8d8..060f0e5 100644
--- a/stage/hud_unit.gd
+++ b/stage/hud_unit.gd
@@ -1,12 +1,20 @@
extends CanvasLayer
+var units_moved: Array[Unit]
+var units_attacked: Array[Unit]
+
@onready var grid_selector: GridSelector = get_tree().get_first_node_in_group("grid_selector")
func _ready() -> void:
visible = false
+ Network.current_player_changed.connect(func():
+ units_moved.clear()
+ units_attacked.clear()
+ )
+
grid_selector.selected.connect(func(node: Node2D):
grid_selector.process_mode = Node.PROCESS_MODE_DISABLED
visible = true
@@ -19,6 +27,13 @@ func _ready() -> void:
$PanelContainer/VBoxContainer/Button.visible = false
$PanelContainer/VBoxContainer/Button2.visible = false
$PanelContainer/VBoxContainer/Button3.grab_focus()
+
+ $PanelContainer/VBoxContainer/Button.disabled = node in units_moved
+ $PanelContainer/VBoxContainer/Button2.disabled = node in units_attacked
+ )
+
+ grid_selector.move_mode_confirmed.connect(func(_path: Array):
+ units_moved.append(grid_selector.current_entity)
)
grid_selector.move_mode_exited.connect(func():
@@ -29,6 +44,9 @@ func _ready() -> void:
)
grid_selector.range_select_confirmed.connect(func(grid_position: Vector2i, _entity: Node2D):
+ if grid_selector.range_select_current_mode == GridSelectorStateRangeSelect.Mode.Attack:
+ units_attacked.append(grid_selector.current_entity)
+
grid_selector.current_state = grid_selector.state_select
grid_selector.current_state.draw(grid_position)
)
@@ -44,7 +62,7 @@ func _input(event: InputEvent) -> void:
if event.is_action_pressed("left_click"):
for button: Button in $PanelContainer/VBoxContainer.get_children():
- if button.has_focus():
+ if button.has_focus() and not button.disabled:
button.pressed.emit()
break
diff --git a/stage/player_unit.gd b/stage/player_unit.gd
new file mode 100644
index 0000000..ca3565a
--- /dev/null
+++ b/stage/player_unit.gd
@@ -0,0 +1,40 @@
+class_name PlayerUnit
+extends Node2D
+
+
+@export var direction: Corner = CORNER_BOTTOM_RIGHT
+@export var max_hp := 0
+@export var current_team: String
+
+var current_hp := 0:
+ set(value):
+ current_hp = value
+ $Label.text = str(value)
+
+
+func _ready() -> void:
+ current_hp = max_hp
+ $Label.visible = false
+
+ var grid_selector := get_tree().get_first_node_in_group("grid_selector") as GridSelector
+ grid_selector.hover_enter.connect(func(node: Node2D):
+ $Label.visible = node == self
+ )
+ grid_selector.hover_exit.connect(func():
+ $Label.visible = false
+ )
+
+
+func _process(_delta: float) -> void:
+ if direction == CORNER_TOP_LEFT:
+ $AnimatedSprite2D.play("top_left")
+ $AnimatedSprite2D.flip_h = false
+ elif direction == CORNER_TOP_RIGHT:
+ $AnimatedSprite2D.play("top_left")
+ $AnimatedSprite2D.flip_h = true
+ elif direction == CORNER_BOTTOM_LEFT:
+ $AnimatedSprite2D.play("bottom_right")
+ $AnimatedSprite2D.flip_h = true
+ elif direction == CORNER_TOP_LEFT:
+ $AnimatedSprite2D.play("bottom_right")
+ $AnimatedSprite2D.flip_h = false
diff --git a/stage/player_unit.gd.uid b/stage/player_unit.gd.uid
new file mode 100644
index 0000000..d139243
--- /dev/null
+++ b/stage/player_unit.gd.uid
@@ -0,0 +1 @@
+uid://bu1yqgv7omm6u
diff --git a/stage/player_unit.tscn b/stage/player_unit.tscn
new file mode 100644
index 0000000..03bd904
--- /dev/null
+++ b/stage/player_unit.tscn
@@ -0,0 +1,68 @@
+[gd_scene load_steps=9 format=3 uid="uid://dqk3l801walv"]
+
+[ext_resource type="Texture2D" uid="uid://cb0rokx0rstj0" path="res://stage/assets/Halloween_PumpkinPatch_Bright.png" id="1_fl4ys"]
+[ext_resource type="Script" uid="uid://bu1yqgv7omm6u" path="res://stage/player_unit.gd" id="1_ijjix"]
+[ext_resource type="Script" uid="uid://drs01qvt6fnrx" path="res://area_2d.gd" id="3_tgb43"]
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_fl4ys"]
+atlas = ExtResource("1_fl4ys")
+region = Rect2(0, 0, 128, 128)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_tgb43"]
+atlas = ExtResource("1_fl4ys")
+region = Rect2(128, 0, 128, 128)
+
+[sub_resource type="AtlasTexture" id="AtlasTexture_5ycgq"]
+atlas = ExtResource("1_fl4ys")
+region = Rect2(256, 0, 128, 128)
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_5ycgq"]
+animations = [{
+"frames": [{
+"duration": 20.0,
+"texture": SubResource("AtlasTexture_fl4ys")
+}, {
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_tgb43")
+}],
+"loop": true,
+"name": &"bottom_right",
+"speed": 4.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": SubResource("AtlasTexture_5ycgq")
+}],
+"loop": false,
+"name": &"top_left",
+"speed": 5.0
+}]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_fl4ys"]
+size = Vector2(10, 8.875)
+
+[node name="PlayerUnit" type="Node2D"]
+z_index = 2
+script = ExtResource("1_ijjix")
+
+[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
+position = Vector2(0, -3)
+scale = Vector2(0.125, 0.125)
+sprite_frames = SubResource("SpriteFrames_5ycgq")
+animation = &"bottom_right"
+
+[node name="Area2D" type="Area2D" parent="." node_paths=PackedStringArray("root_node")]
+collision_layer = 4
+collision_mask = 0
+script = ExtResource("3_tgb43")
+root_node = NodePath("..")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
+position = Vector2(0, -1)
+shape = SubResource("RectangleShape2D_fl4ys")
+
+[node name="Label" type="Label" parent="."]
+offset_left = -5.0
+offset_right = 5.0
+offset_bottom = 23.0
+text = "0"
diff --git a/stage/stage.gd b/stage/stage.gd
index 9b1689f..b25e1da 100644
--- a/stage/stage.gd
+++ b/stage/stage.gd
@@ -22,6 +22,9 @@ func _ready() -> void:
for tile in $Floor.get_used_cells():
grid.set_point_solid(tile, false)
+ for node in find_children("PlayerUnit*", "PlayerUnit"):
+ grid.set_point_solid($Ground.local_to_map(node.global_position - $Floor.position), true)
+
grid_selector.move_mode_max_range = Network.current_player.current_move_points
# teams
@@ -37,9 +40,9 @@ func _ready() -> void:
teams["2"] = team_two
if multiplayer.is_server():
- Network.local_player.set_current_team_name("1")
+ Network.local_player.current_team_name = "1"
else:
- Network.local_player.set_current_team_name("2")
+ Network.local_player.current_team_name = "2"
grid_selector.current_team = Network.local_player.current_team_name
@@ -59,10 +62,10 @@ func _ready() -> void:
func _input(event: InputEvent) -> void:
- if event.is_action_pressed("menu") and Network.is_my_turn():
- $HUDMain.visible = true
+ if event.is_action_pressed("menu"):
grid_selector.process_mode = Node.PROCESS_MODE_DISABLED
- $HUDMain/PanelContainer/VBoxContainer/Button.grab_focus()
+ $HUDMain.enable() # TODO: shouldn't be possible to open when unitmenu open
+ $HUDUnit.visible = false
@rpc("any_peer", "call_local")
@@ -87,9 +90,12 @@ func place_unit(unit_position: Vector2, team: String) -> void:
var unit = preload("res://unit/unit.tscn").instantiate()
unit.global_position = unit_position + $Floor.position
unit.current_team = team
+ unit.current_player = Network.current_player
unit.modulate = Network.current_player.get_color()
add_child(unit, true)
+ Network.current_player.units.append(unit)
+
# block unit tile for movement
grid.set_point_solid($Ground.local_to_map(unit_position), true)
@@ -124,13 +130,39 @@ func _on_grid_selector_move_mode_confirmed(path: Array) -> void:
grid_selector.current_state = grid_selector.get_node("StateSelect")
grid_selector.current_state.draw($Ground.local_to_map(path[path.size() - 1]))
- Network.current_player.set_current_move_points(Network.current_player.current_move_points - (path.size() - 1))
+ #Network.current_player.set_current_move_points(Network.current_player.current_move_points - (path.size() - 1))
+ Network.current_player.current_move_points -= path.size() - 1
grid_selector.move_mode_max_range = Network.current_player.current_move_points
func _on_grid_selector_range_select_confirmed(grid_position: Vector2i, entity: Node2D) -> void:
- entity.queue_free()
- grid.set_point_solid(grid_position, false)
+ if grid_selector.range_select_current_mode == GridSelectorStateRangeSelect.Mode.Attack:
+ Network.current_player.current_attack_points -= 1
+ attack_entity.rpc(grid_position, grid_selector.current_entity.get_path(), entity.get_path())
+
+@rpc("any_peer", "call_local")
+func attack_entity(grid_position: Vector2i, attacking_entity_node_path: String, target_entity_node_path: String):
+ var attacking_entity := get_node(attacking_entity_node_path) as Unit
+ var target_entity = get_node(target_entity_node_path)
+
+ if target_entity is PlayerUnit:
+ target_entity.current_hp -= 1
+ print(target_entity, target_entity.current_hp)
+ if target_entity.current_hp <= 0:
+ target_entity.queue_free()
+ print("GAME OVER!!")
+
+ elif target_entity is Unit:
+ var damage: int = attacking_entity.unit_data.attack - target_entity.unit_data.defense
+ if damage > 0:
+ target_entity.current_hp -= damage
+
+ if target_entity.current_hp <= 0:
+ if target_entity in Network.current_player.units:
+ target_entity.current_player.units.erase(target_entity)
+
+ target_entity.queue_free()
+ grid.set_point_solid(grid_position, false)
func _on_grid_selector_moved(grid_position: Vector2i) -> void:
diff --git a/stage/stage.tscn b/stage/stage.tscn
index 0490231..f18a23a 100644
--- a/stage/stage.tscn
+++ b/stage/stage.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=10 format=4 uid="uid://btphwdkbxijnr"]
+[gd_scene load_steps=11 format=4 uid="uid://btphwdkbxijnr"]
[ext_resource type="TileSet" uid="uid://dl0umywqpu3m8" path="res://stage/assets/tilemap.tres" id="1_0isyp"]
[ext_resource type="Script" uid="uid://do2ktbmxsqjvj" path="res://stage/stage.gd" id="1_ccrgc"]
@@ -8,6 +8,7 @@
[ext_resource type="Texture2D" uid="uid://db0v50mdroaox" path="res://stage/assets/isometric-tile.png" id="5_h4sia"]
[ext_resource type="Script" uid="uid://dydykm70ex0q0" path="res://stage/hud_main.gd" id="5_x0v28"]
[ext_resource type="Script" uid="uid://bm0yvrdltu4n1" path="res://stage/hud_move_mode.gd" id="6_cxybx"]
+[ext_resource type="PackedScene" uid="uid://dqk3l801walv" path="res://stage/player_unit.tscn" id="6_h4sia"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_fwirk"]
shader = ExtResource("4_u7g2e")
@@ -32,28 +33,48 @@ tile_set = ExtResource("1_0isyp")
y_sort_enabled = true
texture_filter = 1
position = Vector2(0, -4)
-tile_map_data = PackedByteArray("AAAOAP//AQABAAYAAADw////AQADAAYAAAA=")
+tile_map_data = PackedByteArray("AAAOAP//AQABAAYAAADw////AQADAAYAAAANAP//AQABAAYAAAAMAP//AQABAAYAAAALAP//AQABAAYAAAAKAP//AQABAAYAAAAJAP//AQABAAYAAAAIAP//AQABAAYAAAAHAP//AQABAAYAAAAGAP//AQABAAYAAAAFAP//AQABAAYAAAAEAP//AQABAAYAAAADAP//AQABAAYAAAACAP//AQABAAYAAAABAP//AQABAAYAAAAAAP//AQABAAYAAAD/////AQABAAYAAAD+////AQABAAYAAAD9////AQADAAYAAAD8////AQADAAYAAAD7////AQADAAYAAAD6////AQADAAYAAAD5////AQADAAYAAAD4////AQADAAYAAAD3////AQADAAYAAAD2////AQADAAYAAAD1////AQADAAYAAAD0////AQADAAYAAADz////AQADAAYAAADy////AQADAAYAAADx////AQADAAYAAAA=")
tile_set = ExtResource("1_0isyp")
[node name="Camera2D" type="Camera2D" parent="."]
+position_smoothing_enabled = true
+position_smoothing_speed = 10.0
+drag_horizontal_enabled = true
+drag_vertical_enabled = true
+drag_left_margin = 0.1
+drag_top_margin = 0.1
+drag_right_margin = 0.1
+drag_bottom_margin = 0.1
-[node name="GridSelector" parent="." node_paths=PackedStringArray("stage", "ground_map", "floor_map") groups=["grid_selector"] instance=ExtResource("3_e6w2r")]
+[node name="RemoteSelector" type="Sprite2D" parent="."]
+unique_name_in_owner = true
+modulate = Color(0.92549, 0.92549, 0, 1)
+texture_filter = 1
+material = SubResource("ShaderMaterial_fwirk")
+texture = ExtResource("5_h4sia")
+
+[node name="GridSelector" parent="." node_paths=PackedStringArray("stage", "ground_map", "floor_map", "camera") instance=ExtResource("3_e6w2r")]
unique_name_in_owner = true
stage = NodePath("..")
ground_map = NodePath("../Ground")
floor_map = NodePath("../Floor")
-selection_collision_mask = 2
+camera = NodePath("../Camera2D")
+selection_collision_mask = 6
placement_tile_source_id = 1
placement_tile_atlas_coordinates = Vector2i(1, 6)
-range_select_current_range = 2
-range_select_collision_mask = 2
+range_select_current_range = 1
+range_select_collision_mask = 6
-[node name="RemoteSelector" type="Sprite2D" parent="."]
-unique_name_in_owner = true
-modulate = Color(0.92549, 0.92549, 0, 1)
-texture_filter = 1
-material = SubResource("ShaderMaterial_fwirk")
-texture = ExtResource("5_h4sia")
+[node name="PlayerUnit" parent="." instance=ExtResource("6_h4sia")]
+position = Vector2(-112, -68)
+max_hp = 3
+current_team = "2"
+
+[node name="PlayerUnit2" parent="." instance=ExtResource("6_h4sia")]
+position = Vector2(128, 52)
+direction = 0
+max_hp = 3
+current_team = "1"
[node name="HUDUnit" type="CanvasLayer" parent="."]
visible = false
@@ -106,6 +127,45 @@ text = "Roll"
layout_mode = 2
text = "End Turn"
+[node name="PanelContainer2" type="PanelContainer" parent="HUDMain"]
+offset_right = 40.0
+offset_bottom = 40.0
+
+[node name="VBoxContainer" type="VBoxContainer" parent="HUDMain/PanelContainer2"]
+layout_mode = 2
+
+[node name="move" type="Label" parent="HUDMain/PanelContainer2/VBoxContainer"]
+layout_mode = 2
+text = "0"
+horizontal_alignment = 1
+
+[node name="attack" type="Label" parent="HUDMain/PanelContainer2/VBoxContainer"]
+layout_mode = 2
+text = "0"
+horizontal_alignment = 1
+
+[node name="defend" type="Label" parent="HUDMain/PanelContainer2/VBoxContainer"]
+layout_mode = 2
+text = "0"
+horizontal_alignment = 1
+
+[node name="ability" type="Label" parent="HUDMain/PanelContainer2/VBoxContainer"]
+layout_mode = 2
+text = "0"
+horizontal_alignment = 1
+
+[node name="PanelContainer3" type="PanelContainer" parent="HUDMain"]
+anchors_preset = 2
+anchor_top = 1.0
+anchor_bottom = 1.0
+offset_top = -40.0
+offset_right = 40.0
+grow_vertical = 0
+
+[node name="CurrentTurn" type="Label" parent="HUDMain/PanelContainer3"]
+layout_mode = 2
+text = "CurrentTurn"
+
[node name="HUDMoveMode" type="CanvasLayer" parent="."]
visible = false
script = ExtResource("6_cxybx")