diff options
-rw-r--r-- | client/scenes/game.tscn | 5 | ||||
-rw-r--r-- | client/scenes/marker.tscn | 50 | ||||
-rw-r--r-- | client/scripts/controllable_player.gd | 16 | ||||
-rw-r--r-- | client/scripts/game.gd | 46 | ||||
-rw-r--r-- | client/scripts/tiles/floor.gd | 27 | ||||
-rw-r--r-- | client/textures/interact_marker.gdshader | 17 |
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; +} |