diff options
Diffstat (limited to 'stage')
23 files changed, 526 insertions, 69 deletions
diff --git a/stage/assets/Halloween_PumpkinPatch_Bright.png b/stage/assets/Halloween_PumpkinPatch_Bright.png Binary files differnew file mode 100644 index 0000000..84a7aac --- /dev/null +++ b/stage/assets/Halloween_PumpkinPatch_Bright.png 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") |