diff options
-rw-r--r-- | client/player/controllable_player.gd | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd index 1ac84504..ce20a0a2 100644 --- a/client/player/controllable_player.gd +++ b/client/player/controllable_player.gd @@ -1,6 +1,6 @@ # Hurry Curry! - a game about cooking # Copyright 2024 metamuffin -# Copyright 2024 tpart +# Copyright 2025 tpart # Copyright 2024 nokoe # # This program is free software: you can redistribute it and/or modify @@ -229,28 +229,31 @@ func interact(): 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)) +func get_interact_target() -> Vector2i: + var interact_target := Vector2( + movement_base.position.x + sin(movement_base.rotation.y) * 0.7, + movement_base.position.z + cos(movement_base.rotation.y) * 0.7 + ) + var interact_target_i := Vector2i(interact_target.floor()) + var best_cursor := interact_target_i + var best_distance := 100. + + for offset_x in range(-1,1): + for offset_y in range (-1, 1): + var offset_cursor := interact_target_i + Vector2i(offset_x, offset_y) + var tile_name = game.map.get_tile_name(offset_cursor) 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 + var tile_center := Vector2(offset_cursor) + Vector2(0.5, 0.5) + var cursor_tile_distance := (interact_target - tile_center).length() + var player_tile_distance := Vector2( + movement_base.position.x - tile_center.x, + movement_base.position.z - tile_center.y + ).length() + if player_tile_distance < 1.9 && cursor_tile_distance < best_distance: + best_distance = cursor_tile_distance + best_cursor = offset_cursor + + return best_cursor |