diff options
author | tpart <tpart120@proton.me> | 2025-06-01 12:42:56 +0200 |
---|---|---|
committer | tpart <tpart120@proton.me> | 2025-06-01 12:43:30 +0200 |
commit | 0b9628fe39d1b7c32631cd1a4becf25686c7da4e (patch) | |
tree | a77e7ee11bd3db0f82381fdc738eb802c144fbf8 /client/player/controllable_player.gd | |
parent | d8ad6551d4db1930df4aace1101ed61fca1e0376 (diff) | |
download | hurrycurry-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.gd | 35 |
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 |