aboutsummaryrefslogtreecommitdiff
path: root/client/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'client/scripts')
-rw-r--r--client/scripts/controllable_player.gd16
-rw-r--r--client/scripts/game.gd46
-rw-r--r--client/scripts/tiles/floor.gd27
3 files changed, 88 insertions, 1 deletions
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