aboutsummaryrefslogtreecommitdiff
path: root/client/player/controllable_player.gd
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-06-19 21:04:24 +0200
committermetamuffin <metamuffin@disroot.org>2025-06-19 21:04:24 +0200
commit1178300c12b85fa193ccbcfd585b1f321ad06966 (patch)
treec0c328cd4cd126c671994b6b9e1be2e29ebc2abd /client/player/controllable_player.gd
parentfe1695ef4857448f06d388a9b172aeeca364ef63 (diff)
downloadhurrycurry-1178300c12b85fa193ccbcfd585b1f321ad06966.tar
hurrycurry-1178300c12b85fa193ccbcfd585b1f321ad06966.tar.bz2
hurrycurry-1178300c12b85fa193ccbcfd585b1f321ad06966.tar.zst
setting to change interact target behaviour
Diffstat (limited to 'client/player/controllable_player.gd')
-rw-r--r--client/player/controllable_player.gd47
1 files changed, 29 insertions, 18 deletions
diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd
index b8057348..367d4bfe 100644
--- a/client/player/controllable_player.gd
+++ b/client/player/controllable_player.gd
@@ -90,13 +90,7 @@ 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:
- var targets := get_interact_target()
- target_visual = targets[0]
- target_tile = targets[1]
- # target = Vector2i(
- # int(floor(movement_base.position.x + sin(movement_base.rotation.y))),
- # int(floor(movement_base.position.z + cos(movement_base.rotation.y)))
- # )
+ update_interact_target()
if Global.get_setting("gameplay.accessible_movement"):
if input.length() < 0.5: moving_duration -= delta * 2
@@ -235,14 +229,33 @@ func interact():
else:
marker.visible = false
-func get_interact_target() -> Array: # -> [visual_target: Vector3, tile_target: Vector2i]
+func update_interact_target():
+ match Global.get_setting("gameplay.interact_target"):
+ "dirsnap": return update_interact_target_dirsnap()
+ "dir": return update_interact_target_dir()
+ _: return update_interact_target_dir()
+
+func update_interact_target_dir():
+ target_tile = Vector2i(
+ int(floor(movement_base.position.x + sin(movement_base.rotation.y))),
+ int(floor(movement_base.position.z + cos(movement_base.rotation.y)))
+ )
+ var tile = game.map.get_tile_instance(target_tile)
+ if tile != null:
+ found_interact_target = game.get_tile_interactive(target_tile)
+ target_visual = tile.item_base.global_position
+ else:
+ found_interact_target = false
+ target_visual = Vector3(float(target_tile.x), 1., float(target_tile.y))
+
+func update_interact_target_dirsnap():
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 := interact_target.floor()
- var best_cursor_visual := Vector3(interact_target_i.x, 0, interact_target_i.y)
- var best_cursor_i := interact_target_i
+ target_visual = Vector3(interact_target_i.x, 0, interact_target_i.y)
+ target_tile = interact_target_i
var best_distance := 100.
found_interact_target = false
@@ -253,7 +266,7 @@ func get_interact_target() -> Array: # -> [visual_target: Vector3, tile_target:
# Test all tiles in a 3x3 square around the player for interactible tiles.
# Return the one which is closest to interact_target.
- for offset_x in range(-1,2):
+ for offset_x in range(-1, 2):
for offset_y in range (-1, 2):
var offset_cursor := interact_target_i + Vector2(offset_x, offset_y)
var tile_center := Vector2(offset_cursor) + Vector2(0.5, 0.5)
@@ -267,8 +280,8 @@ func get_interact_target() -> Array: # -> [visual_target: Vector3, tile_target:
if player_tile_distance < MAX_PLAYER_INTERACT_DIST && cursor_tile_distance < best_distance:
found_interact_target = true
best_distance = cursor_tile_distance
- best_cursor_visual = game.map.get_tile_instance(offset_cursor).item_base.global_position
- best_cursor_i = offset_cursor
+ target_visual = game.map.get_tile_instance(offset_cursor).item_base.global_position
+ target_tile = offset_cursor
continue
# Check if there are any players on this tile.
@@ -288,7 +301,5 @@ func get_interact_target() -> Array: # -> [visual_target: Vector3, tile_target:
if best_player_tile_distance < MAX_PLAYER_INTERACT_DIST && best_player_tile_distance < best_distance:
found_interact_target = true
best_distance = best_player_tile_distance
- best_cursor_visual = best_player_pos
- best_cursor_i = offset_cursor
-
- return [best_cursor_visual, best_cursor_i]
+ target_visual = best_player_pos
+ target_tile = offset_cursor