summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/player/controllable_player.gd47
-rw-r--r--client/settings.gd3
-rw-r--r--locale/en.ini3
3 files changed, 34 insertions, 19 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
diff --git a/client/settings.gd b/client/settings.gd
index 35bdf02d..ddecea64 100644
--- a/client/settings.gd
+++ b/client/settings.gd
@@ -26,11 +26,12 @@ static func get_root():
ToggleSetting.new("vibration", true),
ToggleSetting.new("invert_camera", false),
ToggleSetting.new("interpolate_camera_rotation", false),
- ButtonSetting.new("setup_completed", false , launch_setup),
+ ButtonSetting.new("setup_completed", false, launch_setup),
ToggleSetting.new("tutorial_disabled", false),
ToggleSetting.new("hints_started", false),
ToggleSetting.new("accessible_movement", false),
ToggleSetting.new("first_person", false),
+ DropdownSetting.new("interact_target", "dirsnap", ["dir", "dirsnap"]),
]),
SettingsCategory.new("graphics", [
PresetRow.new("preset", {
diff --git a/locale/en.ini b/locale/en.ini
index cbc00f4c..2952e19a 100644
--- a/locale/en.ini
+++ b/locale/en.ini
@@ -108,6 +108,9 @@ c.settings.gameplay.setup_completed.button_label=Open setup form
c.settings.gameplay.tutorial_disabled=Disable tutorial
c.settings.gameplay.usernames=Show username tags
c.settings.gameplay.vibration=Enable vibrations
+c.settings.gameplay.interact_target=Interact Target Behaviour
+c.settings.gameplay.interact_target.dir=Based on look direction (old behaviour)
+c.settings.gameplay.interact_target.dirsnap=Snap to interactable tile close to look direction
c.settings.gameplay=Gameplay
c.settings.graphics.aa.disabled=Disabled
c.settings.graphics.aa.fx=FXAA (computationally cheap but generated artifacts)