aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornokoe <nokoe@mailbox.org>2024-06-22 21:43:35 +0200
committermetamuffin <metamuffin@disroot.org>2024-06-23 19:30:15 +0200
commite468cf085e0b23b3c5b359a672fccc6b8b7d4fc2 (patch)
treeafac68d560c2b02c5000b183921e2000b1d703d4
parent2c5ced9a026012ef8fe890ff006d261148ce70f1 (diff)
downloadhurrycurry-e468cf085e0b23b3c5b359a672fccc6b8b7d4fc2.tar
hurrycurry-e468cf085e0b23b3c5b359a672fccc6b8b7d4fc2.tar.bz2
hurrycurry-e468cf085e0b23b3c5b359a672fccc6b8b7d4fc2.tar.zst
marker
-rw-r--r--client/scenes/game.tscn5
-rw-r--r--client/scenes/marker.tscn50
-rw-r--r--client/scripts/controllable_player.gd16
-rw-r--r--client/scripts/game.gd46
-rw-r--r--client/scripts/tiles/floor.gd27
-rw-r--r--client/textures/interact_marker.gdshader17
6 files changed, 160 insertions, 1 deletions
diff --git a/client/scenes/game.tscn b/client/scenes/game.tscn
index 998329cb..f5c3c0c4 100644
--- a/client/scenes/game.tscn
+++ b/client/scenes/game.tscn
@@ -1,8 +1,10 @@
+[gd_scene load_steps=6 format=3 uid="uid://clsylbmw7jc0s"]
[gd_scene load_steps=7 format=3 uid="uid://clsylbmw7jc0s"]
[ext_resource type="Script" path="res://scripts/game.gd" id="1_qnslj"]
[ext_resource type="PackedScene" uid="uid://bnqujofthaa4h" path="res://scenes/map.tscn" id="1_qt88a"]
[ext_resource type="PackedScene" uid="uid://b31mlnao6ybt8" path="res://scenes/follow_camera.tscn" id="3_6ot70"]
+[ext_resource type="PackedScene" uid="uid://c0euiv7duqfp4" path="res://scenes/marker.tscn" id="5_idjm3"]
[sub_resource type="PhysicalSkyMaterial" id="PhysicalSkyMaterial_ko0bu"]
@@ -33,3 +35,6 @@ environment = SubResource("Environment_h880f")
[node name="FollowCamera" parent="." node_paths=PackedStringArray("target") instance=ExtResource("3_6ot70")]
transform = Transform3D(0.894934, 0.084374, -0.438148, 0, 0.981959, 0.189095, 0.446198, -0.169228, 0.878789, 0, 3.65756, 11.0189)
target = NodePath("../Map")
+
+[node name="Marker" parent="." instance=ExtResource("5_idjm3")]
+visible = false
diff --git a/client/scenes/marker.tscn b/client/scenes/marker.tscn
new file mode 100644
index 00000000..b13d3747
--- /dev/null
+++ b/client/scenes/marker.tscn
@@ -0,0 +1,50 @@
+[gd_scene load_steps=6 format=3 uid="uid://c0euiv7duqfp4"]
+
+[ext_resource type="Shader" path="res://textures/interact_marker.gdshader" id="2_dejwy"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_o4v68"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_2tdb0"]
+_surfaces = [{
+"aabb": AABB(-1, -1, -1, 2, 2, 2.00001),
+"format": 34896613377,
+"index_count": 36,
+"index_data": PackedByteArray(0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 3, 0, 2, 0, 7, 0, 3, 0, 2, 0, 6, 0, 7, 0, 6, 0, 5, 0, 7, 0, 6, 0, 4, 0, 5, 0, 4, 0, 1, 0, 5, 0, 4, 0, 0, 0, 1, 0, 2, 0, 4, 0, 6, 0, 2, 0, 0, 0, 4, 0, 7, 0, 1, 0, 3, 0, 7, 0, 5, 0, 1, 0),
+"primitive": 3,
+"uv_scale": Vector4(0, 0, 0, 0),
+"vertex_count": 8,
+"vertex_data": PackedByteArray(0, 0, 0, 0, 254, 255, 0, 0, 0, 0, 255, 255, 254, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 255, 255, 0, 0, 254, 255, 0, 0, 255, 255, 255, 255, 254, 255, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0)
+}]
+blend_shape_mode = 0
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_2ie13"]
+resource_name = "marker_Cube_001"
+_surfaces = [{
+"aabb": AABB(-1, -1, -1, 2, 2, 2.00001),
+"attribute_data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255),
+"format": 34896613399,
+"index_count": 36,
+"index_data": PackedByteArray(2, 0, 11, 0, 5, 0, 2, 0, 8, 0, 11, 0, 6, 0, 21, 0, 9, 0, 6, 0, 18, 0, 21, 0, 20, 0, 17, 0, 23, 0, 20, 0, 14, 0, 17, 0, 12, 0, 3, 0, 15, 0, 12, 0, 0, 0, 3, 0, 7, 0, 13, 0, 19, 0, 7, 0, 1, 0, 13, 0, 22, 0, 4, 0, 10, 0, 22, 0, 16, 0, 4, 0),
+"material": SubResource("StandardMaterial3D_o4v68"),
+"primitive": 3,
+"uv_scale": Vector4(0, 0, 0, 0),
+"vertex_count": 24,
+"vertex_data": PackedByteArray(0, 0, 0, 0, 254, 255, 255, 191, 0, 0, 0, 0, 254, 255, 255, 191, 0, 0, 0, 0, 254, 255, 84, 213, 0, 0, 255, 255, 254, 255, 255, 191, 0, 0, 255, 255, 254, 255, 255, 255, 0, 0, 255, 255, 254, 255, 84, 213, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 255, 191, 0, 0, 0, 0, 0, 0, 84, 213, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 84, 213, 255, 255, 0, 0, 254, 255, 255, 191, 255, 255, 0, 0, 254, 255, 255, 191, 255, 255, 0, 0, 254, 255, 84, 213, 255, 255, 255, 255, 254, 255, 255, 191, 255, 255, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 254, 255, 84, 213, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 191, 255, 255, 0, 0, 0, 0, 84, 213, 255, 255, 255, 255, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 84, 213, 255, 255, 255, 255, 0, 0, 255, 127, 84, 213, 84, 213, 255, 255, 255, 255, 255, 127, 255, 191, 84, 213, 84, 213, 255, 191, 255, 191, 0, 0, 255, 127, 84, 213, 84, 213, 255, 191, 255, 191, 255, 127, 255, 191, 84, 213, 84, 213, 255, 255, 255, 255, 0, 0, 255, 127, 170, 42, 170, 42, 255, 255, 255, 255, 255, 127, 255, 191, 170, 42, 170, 42, 255, 191, 255, 191, 0, 0, 255, 127, 170, 42, 170, 42, 255, 191, 255, 191, 255, 127, 255, 191, 170, 42, 170, 42)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_2tdb0")
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_wuj1v"]
+render_priority = 0
+shader = ExtResource("2_dejwy")
+shader_parameter/max_width = 0.1
+shader_parameter/marker_length = 0.5
+shader_parameter/pulse_speed = 4.0
+
+[node name="Marker" type="Node3D"]
+
+[node name="Cube" type="MeshInstance3D" parent="."]
+transform = Transform3D(0.25, 0, 0, 0, 0.25, 0, 0, 0, 0.25, 0, 0.25, 0)
+mesh = SubResource("ArrayMesh_2ie13")
+skeleton = NodePath("")
+surface_material_override/0 = SubResource("ShaderMaterial_wuj1v")
diff --git a/client/scripts/controllable_player.gd b/client/scripts/controllable_player.gd
index 59f4c3de..d0852846 100644
--- a/client/scripts/controllable_player.gd
+++ b/client/scripts/controllable_player.gd
@@ -21,6 +21,9 @@ func _process(delta):
var input = Vector2(Input.get_axis("left", "right"), Input.get_axis("forward", "backwards")).normalized()
input = input.rotated(-game.camera.angle_target)
update(delta, input)
+ position_anim = position_
+ rotation_anim = rotation_
+ mark_interact_target()
super(delta)
func update(dt: float, input: Vector2):
@@ -64,3 +67,16 @@ func aabb_point_distance(min: Vector2, max: Vector2, p: Vector2) -> float:
func update_position(_new_position: Vector2, _new_rotation: float):
pass
+
+func mark_interact_target():
+ var target = Vector2i(
+ int(floor(position.x + sin(rotation.y))),
+ int(floor(position.z + cos(rotation.y)))
+ )
+ var tile_idx = str(target)
+ if game.map.tile_by_pos.has(tile_idx):
+ var t: Floor = game.map.tile_by_pos[tile_idx]
+ game.marker.visible = true
+ game.marker_target = t.item_base.global_position
+ else:
+ game.marker.visible = false
diff --git a/client/scripts/game.gd b/client/scripts/game.gd
index 0403e7c4..f363c894 100644
--- a/client/scripts/game.gd
+++ b/client/scripts/game.gd
@@ -2,7 +2,9 @@ class_name Game
extends Node3D
@onready var camera: FollowCamera = $FollowCamera
-@onready var map: Node3D = $Map
+@onready var map: Map = $Map
+@onready var marker: Node3D = $Marker
+var marker_target = Vector3(0,0,0)
var players := {}
# Called when the node enters the scene tree for the first time.
@@ -34,5 +36,47 @@ func _ready():
players.erase(id)
player.queue_free()
)
+
+ Multiplayer.connect("set_tile_item", func(tile: Vector2i, item: int):
+ var t: Floor = map.tile_by_pos[str(tile)]
+ var i = Item.new(item, t.item_base)
+ add_child(i)
+ i.name = Multiplayer.item_names[item]
+ t.put_item(i)
+ )
+
+ Multiplayer.connect("remove_tile_item", func(tile: Vector2i):
+ var t: Floor = map.tile_by_pos[str(tile)]
+ t.take_item().queue_free()
+ )
+
+ Multiplayer.connect("set_player_item", func(player: int, item: int):
+ var p: Player = players[player]
+ var i = Item.new(item, p.hand_base)
+ add_child(i)
+ i.name = Multiplayer.item_names[item]
+ p.set_item(i)
+ )
+
+ Multiplayer.connect("remove_player_item", func(player: int):
+ var p: Player = players[player]
+ p.remove_item().queue_free()
+ )
+
+ Multiplayer.connect("take_item", func(tile: Vector2i, player: int):
+ var t: Floor = map.tile_by_pos[str(tile)]
+ var p: Player = players[player]
+ p.take_item(t)
+ )
+
+ Multiplayer.connect("put_item", func(tile: Vector2i, player: int):
+ var t: FullTile = map.tile_by_pos[str(tile)]
+ var p: Player = players[player]
+ p.put_item(t)
+ )
Multiplayer.send_join("Blub", 1)
+
+
+func _process(delta):
+ marker.position = lerp(marker.position, marker_target, delta * 40.0)
diff --git a/client/scripts/tiles/floor.gd b/client/scripts/tiles/floor.gd
index ba09d40b..0c4af8a0 100644
--- a/client/scripts/tiles/floor.gd
+++ b/client/scripts/tiles/floor.gd
@@ -2,6 +2,8 @@ class_name Floor
extends Node3D
var base = Node3D.new()
+var item: Item = null
+var item_base: Node3D
enum Facing {
NEG_Y = 0,
@@ -16,6 +18,11 @@ func _init(rename: String, _neighbors: Array):
base.position += Vector3(0.5, 0, 0.5)
add_child(base)
self.name = rename
+ var item_base_ = Node3D.new()
+ item_base_.position = interact_target()
+ item_base_.name = "ItemBase"
+ base.add_child(item_base_)
+ item_base = item_base_
func turn_facing(facing: Facing):
base.rotate_y(facing * 0.5 * PI + PI)
@@ -24,3 +31,23 @@ func tile_name(idx):
if idx == null:
return null
return Multiplayer.tile_names[idx]
+
+
+# defines where items go when interacting
+static func interact_target() -> Vector3:
+ return Vector3(0, 0, 0)
+
+# actions when interacting, e.g. animations
+func interact():
+ pass
+
+func put_item(i: Item):
+ if item != null:
+ push_error("already holding an item")
+ item = i
+ i.owned_by = item_base
+
+func take_item() -> Item:
+ var i = item
+ item = null
+ return i
diff --git a/client/textures/interact_marker.gdshader b/client/textures/interact_marker.gdshader
new file mode 100644
index 00000000..dccaf17d
--- /dev/null
+++ b/client/textures/interact_marker.gdshader
@@ -0,0 +1,17 @@
+shader_type spatial;
+
+uniform float max_width = .1;
+uniform float marker_length = .5;
+uniform float pulse_speed = 4.;
+
+void fragment() {
+ ALBEDO = vec3(15., 0., 0.);
+ vec2 uv = abs(2. * UV.xy - 1.);
+ float m_length = marker_length / max_width;
+ float anim = sin(TIME * pulse_speed) * .5 + 1.;
+ float alpha = step(
+ 1. - max_width * anim, max(uv.x, uv.y))
+ * step(1. - max_width * m_length, min(uv.x, uv.y)
+ );
+ ALPHA = alpha;
+}