summaryrefslogtreecommitdiff
path: root/client/player/controllable_player.gd
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/player/controllable_player.gd
parentd8ad6551d4db1930df4aace1101ed61fca1e0376 (diff)
downloadhurrycurry-0b9628fe39d1b7c32631cd1a4becf25686c7da4e.tar
hurrycurry-0b9628fe39d1b7c32631cd1a4becf25686c7da4e.tar.bz2
hurrycurry-0b9628fe39d1b7c32631cd1a4becf25686c7da4e.tar.zst
Add new interaction target logic
Diffstat (limited to 'client/player/controllable_player.gd')
-rw-r--r--client/player/controllable_player.gd35
1 files changed, 31 insertions, 4 deletions
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