diff --git a/src/base-environments/transition/subway_sequence.gd b/src/base-environments/transition/subway_sequence.gd index 1a25e1a..f34c743 100644 --- a/src/base-environments/transition/subway_sequence.gd +++ b/src/base-environments/transition/subway_sequence.gd @@ -15,7 +15,7 @@ func _ready() -> void: func start_room(): save_game = State.save_game - %PlayerController.has_stage = true + Scenes.player_enable.emit(true) on_first_station() var left_first_station: bool = false diff --git a/src/base-environments/volunteer_room/shared_flat.gd b/src/base-environments/volunteer_room/shared_flat.gd index 26d536d..d6905dd 100644 --- a/src/base-environments/volunteer_room/shared_flat.gd +++ b/src/base-environments/volunteer_room/shared_flat.gd @@ -19,7 +19,7 @@ func start_room(): save_room()) %PlayerController.process_mode = Node.PROCESS_MODE_INHERIT ini_room.emit() - %PlayerController.has_stage = true + Scenes.player_enable.emit(true) func _ready(): id = State.rooms.ADULTHOOD diff --git a/src/base-environments/youth_room/interactive_sprite.gd b/src/base-environments/youth_room/interactive_sprite.gd index 17b84f0..3c84d06 100644 --- a/src/base-environments/youth_room/interactive_sprite.gd +++ b/src/base-environments/youth_room/interactive_sprite.gd @@ -78,13 +78,8 @@ func collapse(): revealed = false func _on_playback_finished(): - # Restore player controller control using the room's unique node reference - var player_controller := owner.get_node_or_null("%PlayerController") as PlayerController - if player_controller and "has_stage" in player_controller: - player_controller.has_stage = true - else: - # Fallback: ensure mouse is visible if we can't find player controller - Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + # Restore player control via central signal + Scenes.player_enable.emit(true) func handle(event: InputEvent): viewport.push_input(event) diff --git a/src/base-environments/youth_room/youth_room.gd b/src/base-environments/youth_room/youth_room.gd index a7f6f4f..7496e31 100644 --- a/src/base-environments/youth_room/youth_room.gd +++ b/src/base-environments/youth_room/youth_room.gd @@ -1,8 +1,8 @@ class_name YouthRoom extends RoomTemplate -## Used by the stage system when this room takes stage for intro playback -# var has_stage: bool = false # Reminder, do not uncomment, this field is inherited from RoomTemplate! +## Used by the room system when this room becomes active +# var is_active: bool = false # Reminder, do not uncomment, this field is inherited from RoomTemplate! @onready var board_trigger: InteractiveSprite = %MindBoard @onready var door_trigger: InteractiveSprite = %Door @@ -21,7 +21,7 @@ func start_room(): %LightAnimation.lights_on() # Give player control after intro (or immediately if repeating) - %PlayerController.has_stage = true + Scenes.player_enable.emit(true) func _play_intro_scene() -> void: diff --git a/src/dev-util/room_template.gd b/src/dev-util/room_template.gd index 7c02bd3..5ed4198 100644 --- a/src/dev-util/room_template.gd +++ b/src/dev-util/room_template.gd @@ -3,10 +3,10 @@ class_name RoomTemplate extends Node3D var initialised: bool = false var id: State.rooms = State.rooms.NULL -var has_stage: bool: +var is_active: bool: set(value): - has_stage = value - if has_stage and not initialised: + is_active = value + if is_active and not initialised: start_room() @@ -19,7 +19,7 @@ func _ready() -> void: State.current_room = id func disable()-> void: - has_stage = false + is_active = false set_process_input(false) set_process(false) diff --git a/src/logic-scenes/board/card-board.gd b/src/logic-scenes/board/card-board.gd index b5b64d9..f35dc01 100644 --- a/src/logic-scenes/board/card-board.gd +++ b/src/logic-scenes/board/card-board.gd @@ -25,16 +25,16 @@ var focus_stickies:bool = true: else: current_dropzone_id = current_dropzone_id -var has_stage := false: +var focused := false: set(focus): if focus: - has_stage = true + focused = true get_tree().call_group("interactables", "collapse") current_dropzone_id = 0 current_sticky_note_id = 0 focus_stickies = true else: - has_stage = false + focused = false if is_node_ready(): if focus: process_mode = Node.PROCESS_MODE_INHERIT @@ -43,7 +43,7 @@ var has_stage := false: for sticky in dropzone.get_children(): if sticky is StickyNote: sticky.is_dragged = false - visible = has_stage + visible = focused @onready var dropzone := $HBoxContainer/dropzone @@ -144,7 +144,7 @@ func _ready(): populate_board(["c_comic_heroes", 'c_teasing', "p_agent_q", "p_good_intended"]) populate_board(["c_out_of_world", 'c_confusion', "p_outer_conflict", "p_unique"]) - has_stage = has_stage + focused = focused get_viewport().gui_focus_changed.connect(reclaim_lost_focus) @@ -157,12 +157,12 @@ func _ready(): func reclaim_lost_focus(_thief): - if has_stage: + if focused: grab_focus() #func _process(delta): # # drops dragged area when Mouse is no longer pressed. -# if has_stage and !Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) and current_context == DRAG: +# if focused and !Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) and current_context == DRAG: # currently_active_node.is_dragged = false ## Will be used later to spawn Cards and Post-Its and remember them in the dictionary @@ -408,10 +408,10 @@ func insert_area(parent: Control, node: Area2D): # Takes the inputs for control inputs func _input(event) -> void: - if not has_stage or not is_instance_valid(currently_active_node): return + if not focused or not is_instance_valid(currently_active_node): return if event.is_action_pressed("ui_cancel"): - has_stage = false + focused = false get_viewport().set_input_as_handled() if event is InputEventMouse: @@ -571,7 +571,7 @@ func on_scene_skipped(i: int): mementos_collected += i # FIXME: sometimes -1 is passed here, why? func claim_focus(): - has_stage = true + focused = true func find_first_free_card() -> int: for i in range(dropzone.get_child_count()): diff --git a/src/logic-scenes/card_burner/card_burner.gd b/src/logic-scenes/card_burner/card_burner.gd index 1ba711d..dafab3f 100644 --- a/src/logic-scenes/card_burner/card_burner.gd +++ b/src/logic-scenes/card_burner/card_burner.gd @@ -1,9 +1,9 @@ class_name CardBurner extends CenterContainer -var has_stage: bool = false: +var focused: bool = false: set(focus): if is_node_ready(): - if not focus == has_stage: + if not focus == focused: if focus: process_mode = Node.PROCESS_MODE_INHERIT self.show() @@ -13,7 +13,7 @@ var has_stage: bool = false: else: self.hide() process_mode = Node.PROCESS_MODE_DISABLED - has_stage = focus + focused = focus @onready var cursor: CandleCursor = %CandleCursor @onready var ancors: Array[Control] = [%Ancor1, %Ancor2, %Ancor3, %Ancor4] @@ -59,7 +59,7 @@ func handle_mouse_button(event: InputEventMouseButton, card: Card): card.burn_state = Card.burned.BURNING func _input(event: InputEvent) -> void: - if has_stage: + if focused: if event.is_action_pressed("ui_up"): handle_direction_input(Vector2.UP) elif event.is_action_pressed("ui_down"): diff --git a/src/logic-scenes/player_controller/player_controller.gd b/src/logic-scenes/player_controller/player_controller.gd index d69b806..ec5508f 100644 --- a/src/logic-scenes/player_controller/player_controller.gd +++ b/src/logic-scenes/player_controller/player_controller.gd @@ -1,33 +1,34 @@ class_name PlayerController extends RigidBody3D -var has_stage: bool = false: - set(on_stage): - print_debug("%s player controller take stage" % "True: " if on_stage else "false") - if has_stage != on_stage: - if on_stage: - has_stage = true - if is_node_ready(): - camera.make_current() - get_viewport().gui_release_focus() - Input.mouse_mode = Input.MOUSE_MODE_CAPTURED - var jitter_tween: Tween = create_tween() - jitter_tween.tween_property(self, "jitter_strength", 1, 1) - if has_entered: emit_signal("ui_exited") - elif has_stage: - await ready - camera.make_current() - jitter_strength = 1 - else: - if is_node_ready() and has_stage: - Input.mouse_mode = Input.MOUSE_MODE_VISIBLE - var jitter_tween: Tween = create_tween() - jitter_tween.tween_property(self, "jitter_strength", 0, 0.5) - if has_entered: emit_signal("ui_exited") - else: - jitter_strength = 0 - has_stage = false - print_debug("player controller %s take stage" % "did" if has_stage else "didn't") - sleeping = has_stage +@export var enabled: bool = false: + set(value): + if enabled == value: + return + enabled = value + if is_node_ready(): + _apply_enabled_state() + + +func _apply_enabled_state() -> void: + # Kill any existing jitter tween to prevent stacking + if jitter_tween and jitter_tween.is_valid(): + jitter_tween.kill() + + if enabled: + camera.make_current() + get_viewport().gui_release_focus() + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + jitter_tween = create_tween() + jitter_tween.tween_property(self, "jitter_strength", 1.0, 1.0) + if has_entered: + ui_exited.emit() + else: + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + jitter_tween = create_tween() + jitter_tween.tween_property(self, "jitter_strength", 0.0, 0.5) + if has_entered: + ui_exited.emit() + sleeping = not enabled @export var mouse_sensitivity: Vector2 = Vector2(6, 5) @@ -47,6 +48,7 @@ var has_stage: bool = false: @export var location_jitter:Vector3 = Vector3(0.05, 0.05, 0.05) @export var location_jitter_speed:Vector3 = Vector3(2, 0.3, 1) var jitter_strength: float = 0 +var jitter_tween: Tween = null var loc_noise_spot: Vector3 = Vector3.ZERO var rot_noise_spot: Vector3 = Vector3.ZERO @@ -59,9 +61,9 @@ var crouched:bool = false: set(set_crouching): if is_node_ready(): if set_crouching and not crouched: - if State.reduce_motion:# or true: + if State.reduce_motion: $PlayerAnimationPlayer.play("reduced_crouch") - elif trigger_slow_crouch:# or true: + elif trigger_slow_crouch: $PlayerAnimationPlayer.play("crouch") trigger_slow_crouch = false else: @@ -69,9 +71,9 @@ var crouched:bool = false: crouched = set_crouching elif (not set_crouching and crouched) and not crouch_held: if can_stand_up(): - if State.reduce_motion:# or true: + if State.reduce_motion: $PlayerAnimationPlayer.play("reduced_stand_up") - elif trigger_slow_crouch:# or true: + elif trigger_slow_crouch: $PlayerAnimationPlayer.play("stand_up") trigger_slow_crouch = false else: @@ -106,21 +108,24 @@ func _ready(): ui_prober.area_exited.connect(_on_ray_exited) $CrouchDetector.area_exited.connect(exit_crouch) pitch.rotation_degrees.x = initial_pitch - crouched = false + # Connect to central player enable signal. + # Guard for standalone test scenes without autoloads. + if get_node_or_null("/root/Scenes"): + Scenes.player_enable.connect(_on_player_enable) + + # Apply exported enabled state now that nodes are ready + _apply_enabled_state() + + +func _on_player_enable(enable: bool) -> void: + enabled = enable + func _process(_delta): - if has_entered: - if focus_ray.get_collider() == null: - pass - #emit_signal("ui_exited") - #dhas_entered = false - if Input.is_action_just_pressed("ui_accept"): - # Pass focus to the collider if it has has_stage property - var collider := focus_ray.get_collider() - if collider and "has_stage" in collider: - has_stage = false - collider.has_stage = true - else: + if not enabled: + return + + if not has_entered: camera.fov = base_fov / (1 + Input.get_action_raw_strength("zoom_in_controller")) var has_entered:bool = false: @@ -155,11 +160,12 @@ func _on_ray_exited(area): has_entered = false -func _physics_process(delta:float): - if has_stage or true: +func _physics_process(delta: float): + if enabled: _handle_movement(delta) _handle_rotation(delta) - if jitter_strength > 0 and not State.reduce_motion: _handle_jitter(delta) + if jitter_strength > 0 and not State.reduce_motion: + _handle_jitter(delta) func _handle_movement(delta:float): var input:Vector2 = Vector2(Input.get_action_strength("player_right") - Input.get_action_strength("player_left"), @@ -228,56 +234,44 @@ func _handle_mouse_input(event:InputEventMouseMotion): var trigger_slow_crouch: bool = false var crouch_held: bool = false var crouch_toggled: bool = false -var cround_start_time: float = 0 +var crouch_start_time: float = 0 -func _input(event:InputEvent) -> void: - if Scenes.current_sequence != -1: return - if has_stage and Scenes.current_sequence == -1 or true: - if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: - _handle_mouse_input(event) - get_viewport().set_input_as_handled() - if event is InputEventMouseButton and event.pressed: - if Input.is_action_just_pressed("zoom_in_mouse"): - zoomed = true - elif Input.is_action_just_pressed("zoom_out_mouse"): - zoomed = false - - if event.is_action_pressed("collect_memento_ui") or event.is_action_pressed("option_memento_ui"): - if focus_ray.is_colliding(): - var collider := focus_ray.get_collider() - if collider is InteractiveSprite: - collider.handle(event) - get_viewport().set_input_as_handled() - - if event.is_action_pressed("crouch"): - # Remember how long the key is held to tell apart toggle and hold behaviour. - cround_start_time = Time.get_unix_time_from_system() - if crouch_toggled: - cround_start_time = 0 - #Causes the next release action to 100% stand up the player... - else: - crouch_held = true - crouched = true - - elif event.is_action_released("crouch"): - crouch_held = false - - # Toggles crouch in case the player just pressed the button indicating they want to toggle crouch. - if Time.get_unix_time_from_system() > cround_start_time + 0.5: - if crouched and can_stand_up(): - crouch_toggled = false - crouched = false - else: - crouch_toggled = true - -func play_scene(_id: int, _repeat: bool): - pass - #if id == Scenes.id.YOUTH_DRAVEN: - # var rotation_tween := create_tween() - -func scene_finished(_id, repeat: bool): - if repeat: - has_stage = true +func _input(event: InputEvent) -> void: + if not enabled: + return + + if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: + _handle_mouse_input(event) + get_viewport().set_input_as_handled() + + if event is InputEventMouseButton and event.pressed: + if Input.is_action_just_pressed("zoom_in_mouse"): + zoomed = true + elif Input.is_action_just_pressed("zoom_out_mouse"): + zoomed = false + + if event.is_action_pressed("collect_memento_ui") or event.is_action_pressed("option_memento_ui"): + if focus_ray.is_colliding(): + var collider := focus_ray.get_collider() + if collider is InteractiveSprite: + collider.handle(event) + get_viewport().set_input_as_handled() + + if event.is_action_pressed("crouch"): + crouch_start_time = Time.get_unix_time_from_system() + if crouch_toggled: + crouch_start_time = 0 + else: + crouch_held = true + crouched = true + elif event.is_action_released("crouch"): + crouch_held = false + if Time.get_unix_time_from_system() > crouch_start_time + 0.5: + if crouched and can_stand_up(): + crouch_toggled = false + crouched = false + else: + crouch_toggled = true func _on_bed_enter(_body): if not (crouched or on_crouch_cooldown): diff --git a/src/singletons/global_state.gd b/src/singletons/global_state.gd index 9d8d052..2255ad2 100644 --- a/src/singletons/global_state.gd +++ b/src/singletons/global_state.gd @@ -277,7 +277,7 @@ func leave_stage(actor:Object) -> void: # Currently focused element loses focus, but remains in stack. func free_focus(): if focus_locked: return false - if stage_list.size() > 0: stage_list.front().has_stage = false + if stage_list.size() > 0: stage_list.front().focused = false func reset_focus(): stage_list = [stage_list[-1]] diff --git a/src/singletons/scene_reference.gd b/src/singletons/scene_reference.gd index 3a0b336..7426801 100644 --- a/src/singletons/scene_reference.gd +++ b/src/singletons/scene_reference.gd @@ -28,10 +28,9 @@ enum id { ADULT_BURNOUT } -signal player_enable(enabled: bool); - signal scene_starting(scene_id: id, is_repeating: bool) signal scene_finished(scene_id: id, is_repeating: bool) +signal player_enable(enabled: bool) func _ready() -> void: pass @@ -40,6 +39,9 @@ func _ready() -> void: func begin_sequence(scene_id: id) -> void: print_debug(">>> Scenes.begin_sequence(%s)" % id.keys()[scene_id]) + # Disable player movement during cutscenes + player_enable.emit(false) + current_sequence = scene_id started_sequences = started_sequences | (1 << scene_id) @@ -59,6 +61,9 @@ func end_sequence(scene_id: id) -> void: # Clear current sequence if current_sequence == scene_id: current_sequence = -1 + + # Re-enable player movement after cutscene + player_enable.emit(true) # Legacy support - redirects to begin_sequence func start_sequence(scene_id: id) -> void: @@ -95,6 +100,7 @@ func is_sequence_unlocked(index: id) -> bool: return (1 << int(index)) & enabled_sequences > 0 func get_completed_total() -> int: + # https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel var i: int = completed_sequences - ((completed_sequences >> 1) & 0x55555555); i = (i & 0x33333333) + ((i >> 2) & 0x33333333); i = (i + (i >> 4)) & 0x0F0F0F0F; diff --git a/src/tab_container.gd b/src/tab_container.gd index c753b5f..e27e573 100644 --- a/src/tab_container.gd +++ b/src/tab_container.gd @@ -10,18 +10,18 @@ func _ready() -> void: pass_to_actor = get_child(current_tab) func _on_tab_changed(tab_id: int): - # Transfer has_stage to the new tab's child + # Transfer focused to the new tab's child for child in get_children(): - if "has_stage" in child: - child.has_stage = false + if "focused" in child: + child.focused = false var new_child = get_child(tab_id) - if "has_stage" in new_child: - new_child.has_stage = true + if "focused" in new_child: + new_child.focused = true pass_to_actor = new_child func _on_stage_left(): await get_tree().process_frame - if not pass_to_actor.has_stage: + if not pass_to_actor.focused: get_parent().vanish() diff --git a/src/tests/player_tests.tscn b/src/tests/player_tests.tscn index e1690c2..4396099 100644 --- a/src/tests/player_tests.tscn +++ b/src/tests/player_tests.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=7 format=3 uid="uid://cjb4gu40l3jah"] +[gd_scene load_steps=9 format=3 uid="uid://bystjfm61jw7t"] [ext_resource type="Script" uid="uid://c281w7earok6w" path="res://base-environments/youth_room/crouch_volume.gd" id="1_ki2be"] [ext_resource type="PackedScene" uid="uid://mkccbig41bqb" path="res://logic-scenes/player_controller/player_controller.tscn" id="2_rmwd0"] @@ -7,7 +7,15 @@ radius = 1.14469 height = 3.78697 -[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_ki2be"] +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ki2be"] +transparency = 1 +blend_mode = 1 +albedo_color = Color(0.48962224, 0.48962224, 0.48962218, 1) + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_ki2be"] +material = SubResource("StandardMaterial3D_ki2be") +radius = 1.145 +height = 3.787 [sub_resource type="PlaneMesh" id="PlaneMesh_ki2be"] size = Vector2(50, 50) @@ -16,6 +24,8 @@ size = Vector2(50, 50) radius = 5.0 height = 10.0 +[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_ki2be"] + [node name="CharacterTests" type="Node3D"] [node name="bed_crouch" type="Area3D" parent="."] @@ -28,7 +38,9 @@ script = ExtResource("1_ki2be") transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0.107988, 1.56575e-08, -0.358201) shape = SubResource("CapsuleShape3D_ki2be") -[node name="MeshInstance3D" type="MeshInstance3D" parent="bed_crouch"] +[node name="MeshInstance3D" type="MeshInstance3D" parent="bed_crouch/CollisionShape3D"] +mesh = SubResource("CapsuleMesh_ki2be") +skeleton = NodePath("../..") [node name="Label3D" type="Label3D" parent="bed_crouch"] transform = Transform3D(1, 0, 0, 0, 0.27838773, 0.96046877, 0, -0.96046877, 0.27838773, 0, 0.29873586, 0) @@ -36,13 +48,8 @@ text = "CROUCH VOLUME" [node name="PlayerController" parent="." groups=["camera_owner"] instance=ExtResource("2_rmwd0")] unique_name_in_owner = true -process_mode = 4 transform = Transform3D(0.686123, 0, 0.727485, 0, 1, 0, -0.727485, 0, 0.686123, 0.63, 0, 0.925) - -[node name="CollisionShape3D" type="CollisionShape3D" parent="."] - -[node name="CollisionShape3D" type="CollisionShape3D" parent="CollisionShape3D"] -shape = SubResource("WorldBoundaryShape3D_ki2be") +enabled = true [node name="MeshInstance3D" type="MeshInstance3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0049040318, -0.008946419, 0.003689289) @@ -50,7 +57,13 @@ mesh = SubResource("PlaneMesh_ki2be") [node name="OmniLight3D" type="OmniLight3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.221635, 0) +omni_range = 9.435307 [node name="MeshInstance3D2" type="MeshInstance3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.5455923, 4.7683716e-07, -5.57273) mesh = SubResource("SphereMesh_ki2be") + +[node name="StaticBody3D" type="StaticBody3D" parent="."] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D"] +shape = SubResource("WorldBoundaryShape3D_ki2be") diff --git a/src/ui/menu_main/Main Menu.gd b/src/ui/menu_main/Main Menu.gd index db052c3..abd652a 100644 --- a/src/ui/menu_main/Main Menu.gd +++ b/src/ui/menu_main/Main Menu.gd @@ -1,11 +1,11 @@ extends Panel -@onready var has_stage = true: +@onready var focused = true: set(focus): if focus: - has_stage = State.request_focus(self) + focused = State.request_focus(self) else: - has_stage = false + focused = false State.drop_own_focus(self) func _ready(): diff --git a/src/ui/menu_main/accessibility_settings.gd b/src/ui/menu_main/accessibility_settings.gd index 027878e..bd70e29 100644 --- a/src/ui/menu_main/accessibility_settings.gd +++ b/src/ui/menu_main/accessibility_settings.gd @@ -4,10 +4,10 @@ class_name AccessibilitySettings signal changed signal leave_stage -var has_stage:bool = false: - set(stage): - has_stage = stage - is_active = has_stage +var focused:bool = false: + set(focus): + focused = focus + is_active = focused # used to override state management in case menu is being used while game is paused. var is_active:bool = false: @@ -18,7 +18,7 @@ var is_active:bool = false: leave_stage.emit() is_active = active - if (is_active and not has_stage) and not get_tree().paused: + if (is_active and not focused) and not get_tree().paused: push_warning("%s has been set active but not been given the stage while the tree is unpaused!") @export var is_in_beginning: bool = false diff --git a/src/ui/menu_main/audio_settings.gd b/src/ui/menu_main/audio_settings.gd index 44508f7..12d9be2 100644 --- a/src/ui/menu_main/audio_settings.gd +++ b/src/ui/menu_main/audio_settings.gd @@ -3,12 +3,12 @@ extends VBoxContainer signal changed signal leave_stage -var has_stage:bool = false: - set(stage): - has_stage = stage +var focused:bool = false: + set(focus): + focused = focus if is_node_ready(): - %MusicPreview.playing = has_stage - if has_stage: + %MusicPreview.playing = focused + if focused: music_mute_switch.grab_focus() @@ -86,5 +86,5 @@ func _on_exit_button_pressed() -> void: State.save_settings() func _input(event: InputEvent) -> void: - if event.is_action_pressed("ui_cancel") and has_stage: + if event.is_action_pressed("ui_cancel") and focused: leave_stage.emit() diff --git a/src/ui/menu_main/content_settings.gd b/src/ui/menu_main/content_settings.gd index 069e3fc..d4bad37 100644 --- a/src/ui/menu_main/content_settings.gd +++ b/src/ui/menu_main/content_settings.gd @@ -4,10 +4,10 @@ signal changed var has_unsaved_changes: bool = false signal leave_stage -var has_stage:bool = false: - set(stage): - has_stage = stage - if is_node_ready() and has_stage: +var focused:bool = false: + set(focus): + focused = focus + if is_node_ready() and focused: %ExpandButton.grab_focus() @export var is_in_beginning: bool = false @@ -47,5 +47,5 @@ func _on_exit_button_pressed() -> void: leave_stage.emit() func _input(event: InputEvent) -> void: - if event.is_action_pressed("ui_cancel") and has_stage: + if event.is_action_pressed("ui_cancel") and focused: leave_stage.emit() diff --git a/src/ui/menu_main/gameplay_settings.gd b/src/ui/menu_main/gameplay_settings.gd index 71fe6b7..a6dbb32 100644 --- a/src/ui/menu_main/gameplay_settings.gd +++ b/src/ui/menu_main/gameplay_settings.gd @@ -3,10 +3,10 @@ extends VBoxContainer signal changed signal leave_stage -var has_stage:bool = false: - set(stage): - has_stage = stage - if is_node_ready() and has_stage: +var focused:bool = false: + set(focus): + focused = focus + if is_node_ready() and focused: y_switch_gamepad.grab_focus() var current_music_decay:float = 0 @@ -39,5 +39,5 @@ func _on_exit_button_pressed() -> void: State.save_settings() func _input(event: InputEvent) -> void: - if event.is_action_pressed("ui_cancel") and has_stage: + if event.is_action_pressed("ui_cancel") and focused: leave_stage.emit() diff --git a/src/ui/menu_main/privacy_settings.gd b/src/ui/menu_main/privacy_settings.gd index daea4ff..56ce779 100644 --- a/src/ui/menu_main/privacy_settings.gd +++ b/src/ui/menu_main/privacy_settings.gd @@ -2,11 +2,11 @@ extends VBoxContainer signal leave_stage -var has_stage:bool = false: - set(stage): - has_stage = stage +var focused:bool = false: + set(focus): + focused = focus if is_node_ready(): - if has_stage: + if focused: steam_optout.grab_focus() var current_music_decay:float = 0 @@ -41,7 +41,7 @@ func _on_exit_button_pressed() -> void: State.save_settings() func _input(event: InputEvent) -> void: - if event.is_action_pressed("ui_cancel") and has_stage: + if event.is_action_pressed("ui_cancel") and focused: leave_stage.emit() func reset_all_stats(): diff --git a/src/ui/menu_main/video_settings.gd b/src/ui/menu_main/video_settings.gd index 8944795..e114cfe 100644 --- a/src/ui/menu_main/video_settings.gd +++ b/src/ui/menu_main/video_settings.gd @@ -5,9 +5,9 @@ signal changed signal leave_stage var has_unsaved_changes:= false -var has_stage:bool = false: - set(stage): - has_stage = stage +var focused:bool = false: + set(focus): + focused = focus match preset_selected: 1: %PerformancePreset.grab_focus() 2: %BalancedPreset.grab_focus() @@ -286,5 +286,5 @@ func select_id_to_window_mode(item_id) -> DisplayServer.WindowMode: return item_id + 2 if item_id != 0 else 0 func _input(event: InputEvent) -> void: - if event.is_action_pressed("ui_cancel") and has_stage: + if event.is_action_pressed("ui_cancel") and focused: _on_exit_button_pressed()