aboutsummaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authortpart <tpart120@proton.me>2025-06-01 12:42:56 +0200
committertpart <tpart120@proton.me>2025-06-01 12:43:30 +0200
commit0b9628fe39d1b7c32631cd1a4becf25686c7da4e (patch)
treea77e7ee11bd3db0f82381fdc738eb802c144fbf8 /client
parentd8ad6551d4db1930df4aace1101ed61fca1e0376 (diff)
downloadhurrycurry-0b9628fe39d1b7c32631cd1a4becf25686c7da4e.tar
hurrycurry-0b9628fe39d1b7c32631cd1a4becf25686c7da4e.tar.bz2
hurrycurry-0b9628fe39d1b7c32631cd1a4becf25686c7da4e.tar.zst
Add new interaction target logic
Diffstat (limited to 'client')
-rw-r--r--client/map/map.gd6
-rw-r--r--client/player/controllable_player.gd35
2 files changed, 34 insertions, 7 deletions
diff --git a/client/map/map.gd b/client/map/map.gd
index 2b8dd651..fe8ddd66 100644
--- a/client/map/map.gd
+++ b/client/map/map.gd
@@ -18,13 +18,13 @@
class_name Map
extends Node3D
-var tile_by_pos: Dictionary = {}
+var tile_by_pos: Dictionary = {} # Dictionary[String, [Vector2i, String, Tile, Array]]
var autobake = false
var currently_baked = false
var floor_mesher := FloorMesher.new()
var floor_node := MeshInstance3D.new()
-func get_tile_name(pos: Vector2i):
+func get_tile_name(pos: Vector2i): # -> String?
var e = tile_by_pos.get(str(pos))
if e != null: return e[1]
else: return null
@@ -35,7 +35,7 @@ func get_tile_instance(pos: Vector2i) -> Tile:
func set_tile(pos: Vector2i, name_: String, neighbors: Array = [null,null,null,null]) -> Tile:
clear_tile(pos)
- var tile = TileFactory.produce(name_, pos, neighbors, floor_mesher)
+ var tile := TileFactory.produce(name_, pos, neighbors, floor_mesher)
add_child(tile)
tile.position = Vector3(pos.x, 0, pos.y)
tile_by_pos[str(pos)] = [pos, name_, tile, neighbors]
diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd
index 99625762..1ac84504 100644
--- a/client/player/controllable_player.gd
+++ b/client/player/controllable_player.gd
@@ -86,10 +86,11 @@ func _process_movement(delta):
if Input.is_action_pressed("interact_left") or Input.is_action_just_released("interact_left") or Input.is_action_pressed("interact_right") or Input.is_action_just_released("interact_right"):
input *= 0
else:
- target = Vector2i(
- int(floor(movement_base.position.x + sin(movement_base.rotation.y))),
- int(floor(movement_base.position.z + cos(movement_base.rotation.y)))
- )
+ target = get_interact_target()
+ # target = Vector2i(
+ # int(floor(movement_base.position.x + sin(movement_base.rotation.y))),
+ # int(floor(movement_base.position.z + cos(movement_base.rotation.y)))
+ # )
if Global.get_setting("gameplay.accessible_movement"):
if input.length() < 0.5: moving_duration -= delta * 2
@@ -227,3 +228,29 @@ func interact():
marker.set_interacting(false)
else:
marker.visible = false
+
+func get_interact_target():
+ var rx := movement_base.position.x + sin(movement_base.rotation.y) * 0.7
+ var ry := movement_base.position.z + cos(movement_base.rotation.y) * 0.7
+ var bx = floor(rx)
+ var by = floor(ry)
+ var best := Vector2i(bx, by)
+ var best_d = 100
+ for ox in range(-1,1):
+ for oy in range (-1, 1):
+ var tile_name = game.map.get_tile_name(Vector2i(bx + ox, by + oy))
+ if tile_name == null: continue
+ var tile_id: int = game.tile_index_by_name[tile_name]
+ if game.tile_interact[tile_id]:
+ var cx = (bx + ox + 0.5)
+ var cy = (by + oy + 0.5)
+ var dx = rx - cx
+ var dy = ry - cy
+ var pdx = movement_base.position.x - cx
+ var pdy = movement_base.position.z - cy
+ var d = sqrt(dx * dx + dy * dy)
+ var pd = sqrt(pdx * pdx + pdy * pdy)
+ if pd < 2 && d < best_d:
+ best_d = d
+ best = Vector2i(bx + ox, by + oy)
+ return best