Refine TAB menu presentation and standardize UI fonts
This commit is contained in:
parent
78b91c350b
commit
59bdb07fc5
19 changed files with 393 additions and 435 deletions
Binary file not shown.
|
Before Width: | Height: | Size: 1.6 KiB |
BIN
art/patterns/pattern_tealdot.png
Normal file
BIN
art/patterns/pattern_tealdot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.6 KiB |
|
|
@ -2,16 +2,16 @@
|
||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://d0o3ym81t1sxs"
|
uid="uid://f8a0cs0s7ler"
|
||||||
path="res://.godot/imported/pattern_bluedot.png-2880ee070284314ed1e7b46e1dbc0570.ctex"
|
path="res://.godot/imported/pattern_tealdot.png-ea096873729758aad8d393553ab96b2d.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://art/patterns/pattern_bluedot.png"
|
source_file="res://art/patterns/pattern_tealdot.png"
|
||||||
dest_files=["res://.godot/imported/pattern_bluedot.png-2880ee070284314ed1e7b46e1dbc0570.ctex"]
|
dest_files=["res://.godot/imported/pattern_tealdot.png-ea096873729758aad8d393553ab96b2d.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
11
main/main.gd
11
main/main.gd
|
|
@ -180,9 +180,7 @@ func _ready() -> void:
|
||||||
):
|
):
|
||||||
_settings_manager.settings_changed.connect(_apply_runtime_settings)
|
_settings_manager.settings_changed.connect(_apply_runtime_settings)
|
||||||
_settings_manager.load_settings()
|
_settings_manager.load_settings()
|
||||||
_interface_fonts.set_readable_font_enabled(
|
_interface_fonts.enforce_standard_font()
|
||||||
_settings_manager.current_settings.use_readable_interface_font
|
|
||||||
)
|
|
||||||
if _data_root.resolve():
|
if _data_root.resolve():
|
||||||
_configure_portable_stores()
|
_configure_portable_stores()
|
||||||
_initialize_after_data_root()
|
_initialize_after_data_root()
|
||||||
|
|
@ -856,9 +854,6 @@ func _process(_delta: float) -> void:
|
||||||
func _apply_runtime_settings(settings: PlayerSettingsType) -> void:
|
func _apply_runtime_settings(settings: PlayerSettingsType) -> void:
|
||||||
if settings == null:
|
if settings == null:
|
||||||
return
|
return
|
||||||
_interface_fonts.set_readable_font_enabled(
|
|
||||||
settings.use_readable_interface_font
|
|
||||||
)
|
|
||||||
_apply_world_pixelation(settings.world_pixel_size)
|
_apply_world_pixelation(settings.world_pixel_size)
|
||||||
_ui_pixelation.set_pixel_size(settings.ui_pixel_size)
|
_ui_pixelation.set_pixel_size(settings.ui_pixel_size)
|
||||||
_game_ui.get_title_screen().set_world_pixelation(
|
_game_ui.get_title_screen().set_world_pixelation(
|
||||||
|
|
@ -935,7 +930,7 @@ func _set_player_menu_backdrop_visible(is_visible: bool) -> void:
|
||||||
_player_menu_backdrop,
|
_player_menu_backdrop,
|
||||||
"modulate:a",
|
"modulate:a",
|
||||||
1.0,
|
1.0,
|
||||||
UIMotion.UTILITY_ENTER_DURATION,
|
UIMotion.PLAYER_MENU_ENTER_DURATION,
|
||||||
).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT)
|
).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT)
|
||||||
return
|
return
|
||||||
if not _player_menu_backdrop.visible:
|
if not _player_menu_backdrop.visible:
|
||||||
|
|
@ -945,7 +940,7 @@ func _set_player_menu_backdrop_visible(is_visible: bool) -> void:
|
||||||
_player_menu_backdrop,
|
_player_menu_backdrop,
|
||||||
"modulate:a",
|
"modulate:a",
|
||||||
0.0,
|
0.0,
|
||||||
UIMotion.UTILITY_EXIT_DURATION,
|
UIMotion.PLAYER_MENU_EXIT_DURATION,
|
||||||
).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN)
|
).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN)
|
||||||
_player_menu_backdrop_tween.finished.connect(
|
_player_menu_backdrop_tween.finished.connect(
|
||||||
func() -> void:
|
func() -> void:
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
[ext_resource type="Script" path="res://network/identity_backup_service.gd" id="38_identity_backup"]
|
[ext_resource type="Script" path="res://network/identity_backup_service.gd" id="38_identity_backup"]
|
||||||
[ext_resource type="Script" path="res://ui/interface_font_controller.gd" id="39_fonts"]
|
[ext_resource type="Script" path="res://ui/interface_font_controller.gd" id="39_fonts"]
|
||||||
[ext_resource type="Shader" path="res://ui/title_water_background.gdshader" id="40_title_water"]
|
[ext_resource type="Shader" path="res://ui/title_water_background.gdshader" id="40_title_water"]
|
||||||
[ext_resource type="Texture2D" path="res://art/patterns/pattern_bluedot.png" id="41_menu_pattern"]
|
[ext_resource type="Texture2D" path="res://art/patterns/pattern_tealdot.png" id="41_menu_pattern"]
|
||||||
[ext_resource type="Shader" path="res://ui/player_menu_pattern.gdshader" id="42_menu_pattern"]
|
[ext_resource type="Shader" path="res://ui/player_menu_pattern.gdshader" id="42_menu_pattern"]
|
||||||
|
|
||||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_title_water_native"]
|
[sub_resource type="ShaderMaterial" id="ShaderMaterial_title_water_native"]
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,8 @@ const UI_DESKTOP_RENDER_HEIGHTS: Array[int] = [0, 612, 504, 396, 288]
|
||||||
const UI_COMPACT_RENDER_HEIGHTS: Array[int] = [0, 408, 336, 264, 192]
|
const UI_COMPACT_RENDER_HEIGHTS: Array[int] = [0, 408, 336, 264, 192]
|
||||||
|
|
||||||
@export var auto_click_enabled: bool = false
|
@export var auto_click_enabled: bool = false
|
||||||
@export var use_readable_interface_font: bool = false
|
# Legacy settings-file field. Tuffy is now always used at runtime.
|
||||||
|
@export var use_readable_interface_font: bool = true
|
||||||
@export_range(0.10, 0.50, 0.01) var auto_click_interval: float = 0.20
|
@export_range(0.10, 0.50, 0.01) var auto_click_interval: float = 0.20
|
||||||
@export_range(0.001, 0.012, 0.0005) var mouse_camera_sensitivity: float = 0.005
|
@export_range(0.001, 0.012, 0.0005) var mouse_camera_sensitivity: float = 0.005
|
||||||
@export_range(0.5, 5.0, 0.1) var controller_camera_sensitivity: float = 2.5
|
@export_range(0.5, 5.0, 0.1) var controller_camera_sensitivity: float = 2.5
|
||||||
|
|
@ -54,7 +55,7 @@ func is_valid() -> bool:
|
||||||
func copy() -> PlayerSettings:
|
func copy() -> PlayerSettings:
|
||||||
var result := PlayerSettings.new()
|
var result := PlayerSettings.new()
|
||||||
result.auto_click_enabled = auto_click_enabled
|
result.auto_click_enabled = auto_click_enabled
|
||||||
result.use_readable_interface_font = use_readable_interface_font
|
result.use_readable_interface_font = true
|
||||||
result.auto_click_interval = auto_click_interval
|
result.auto_click_interval = auto_click_interval
|
||||||
result.mouse_camera_sensitivity = mouse_camera_sensitivity
|
result.mouse_camera_sensitivity = mouse_camera_sensitivity
|
||||||
result.controller_camera_sensitivity = controller_camera_sensitivity
|
result.controller_camera_sensitivity = controller_camera_sensitivity
|
||||||
|
|
|
||||||
|
|
@ -61,9 +61,8 @@ func load_settings() -> bool:
|
||||||
return _use_defaults_after_corruption("Player settings values are invalid.")
|
return _use_defaults_after_corruption("Player settings values are invalid.")
|
||||||
var loaded := PlayerSettings.new()
|
var loaded := PlayerSettings.new()
|
||||||
loaded.auto_click_enabled = accessibility["auto_click_enabled"]
|
loaded.auto_click_enabled = accessibility["auto_click_enabled"]
|
||||||
loaded.use_readable_interface_font = bool(
|
# Accept the legacy field, but normalize runtime and future saved state.
|
||||||
accessibility.get("use_readable_interface_font", false)
|
loaded.use_readable_interface_font = true
|
||||||
)
|
|
||||||
loaded.auto_click_interval = _read_float(
|
loaded.auto_click_interval = _read_float(
|
||||||
accessibility.get("auto_click_interval"),
|
accessibility.get("auto_click_interval"),
|
||||||
-1.0
|
-1.0
|
||||||
|
|
@ -159,9 +158,7 @@ func save_now() -> bool:
|
||||||
"accessibility": {
|
"accessibility": {
|
||||||
"auto_click_enabled": current_settings.auto_click_enabled,
|
"auto_click_enabled": current_settings.auto_click_enabled,
|
||||||
"auto_click_interval": current_settings.auto_click_interval,
|
"auto_click_interval": current_settings.auto_click_interval,
|
||||||
"use_readable_interface_font": (
|
"use_readable_interface_font": true,
|
||||||
current_settings.use_readable_interface_font
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
"camera": {
|
"camera": {
|
||||||
"mouse_sensitivity": current_settings.mouse_camera_sensitivity,
|
"mouse_sensitivity": current_settings.mouse_camera_sensitivity,
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ const CONTENT_MARGIN_LEFT := 18.0
|
||||||
const CONTENT_MARGIN_TOP := 98.0
|
const CONTENT_MARGIN_TOP := 98.0
|
||||||
const CONTENT_MARGIN_RIGHT := 18.0
|
const CONTENT_MARGIN_RIGHT := 18.0
|
||||||
const CONTENT_MARGIN_BOTTOM := 16.0
|
const CONTENT_MARGIN_BOTTOM := 16.0
|
||||||
|
const HANDWRITTEN_FONT: Font = preload("res://ui/fonts/seattle_avenue.otf")
|
||||||
|
|
||||||
@export var title_text := "notes"
|
@export var title_text := "notes"
|
||||||
@export var inset_content := true
|
@export var inset_content := true
|
||||||
|
|
@ -17,14 +18,25 @@ const CONTENT_MARGIN_BOTTOM := 16.0
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
mouse_filter = Control.MOUSE_FILTER_PASS
|
mouse_filter = Control.MOUSE_FILTER_PASS
|
||||||
add_theme_font_override("font", UtilityPageStyle.TuffyFont)
|
apply_handwritten_to(self)
|
||||||
add_theme_stylebox_override("panel", make_paper_style(inset_content))
|
add_theme_stylebox_override("panel", make_paper_style(inset_content))
|
||||||
resized.connect(queue_redraw)
|
resized.connect(queue_redraw)
|
||||||
queue_redraw()
|
queue_redraw()
|
||||||
|
|
||||||
|
|
||||||
|
static func apply_handwritten_to(root: Control) -> void:
|
||||||
|
root.add_theme_font_override("font", HANDWRITTEN_FONT)
|
||||||
|
for descendant: Node in root.find_children("*", "Control", true, false):
|
||||||
|
var control := descendant as Control
|
||||||
|
control.add_theme_font_override(
|
||||||
|
"font", HANDWRITTEN_FONT
|
||||||
|
)
|
||||||
|
if control is Label:
|
||||||
|
control.add_theme_color_override("font_color", INK_COLOR)
|
||||||
|
|
||||||
|
|
||||||
func _draw() -> void:
|
func _draw() -> void:
|
||||||
var font: Font = UtilityPageStyle.TuffyFont
|
var font: Font = HANDWRITTEN_FONT
|
||||||
draw_string(
|
draw_string(
|
||||||
font,
|
font,
|
||||||
Vector2(28.0, 25.0),
|
Vector2(28.0, 25.0),
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,37 @@
|
||||||
class_name OrganizerTab
|
class_name OrganizerTab
|
||||||
extends Button
|
extends Button
|
||||||
|
|
||||||
const INACTIVE_COLOR := Color("d6b875")
|
const PALETTE: Array[Color] = [
|
||||||
const SELECTED_COLOR := Color("f0d995")
|
Color("b9deea"),
|
||||||
const BORDER_COLOR := Color("4c3a25")
|
Color("3d9ca0"),
|
||||||
const TEXT_COLOR := Color("251b10")
|
Color("4f9b72"),
|
||||||
const DISABLED_COLOR := Color("aa9a76")
|
]
|
||||||
|
const TEXT_COLOR := Color("102b35")
|
||||||
const RISE_DURATION: float = UIMotion.UTILITY_ENTER_DURATION
|
const RISE_DURATION: float = UIMotion.UTILITY_ENTER_DURATION
|
||||||
const INACTIVE_SETTLE_Y: float = 8.0
|
const INACTIVE_SETTLE_Y: float = 7.0
|
||||||
const SELECTED_SETTLE_Y: float = 0.0
|
const SELECTED_SETTLE_Y: float = 1.0
|
||||||
const HOVER_SETTLE_Y: float = 4.0
|
const HOVER_SETTLE_Y: float = 5.0
|
||||||
const HIDDEN_SETTLE_Y: float = 30.0
|
const HIDDEN_SETTLE_Y: float = 30.0
|
||||||
|
const CAP_HEIGHT: float = 22.0
|
||||||
|
const FONT_SIZE: int = 15
|
||||||
|
|
||||||
|
@export_range(0, 2, 1) var palette_index: int = 0:
|
||||||
|
set(value):
|
||||||
|
palette_index = clampi(value, 0, PALETTE.size() - 1)
|
||||||
|
queue_redraw()
|
||||||
|
|
||||||
var _motion_tween: Tween
|
var _motion_tween: Tween
|
||||||
var _hovered: bool = false
|
var _hovered: bool = false
|
||||||
var _motion_ready: bool = false
|
var _motion_ready: bool = false
|
||||||
var _visual_y: float = INACTIVE_SETTLE_Y
|
var _visual_y: float = INACTIVE_SETTLE_Y
|
||||||
|
var _selected: bool = false
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
toggle_mode = true
|
toggle_mode = true
|
||||||
|
_selected = button_pressed
|
||||||
add_theme_font_override("font", UtilityPageStyle.TuffyFont)
|
add_theme_font_override("font", UtilityPageStyle.TuffyFont)
|
||||||
add_theme_font_size_override("font_size", 18)
|
add_theme_font_size_override("font_size", FONT_SIZE)
|
||||||
for color_name: StringName in [
|
for color_name: StringName in [
|
||||||
&"font_color",
|
&"font_color",
|
||||||
&"font_hover_color",
|
&"font_hover_color",
|
||||||
|
|
@ -45,6 +55,12 @@ func refresh_state(animate: bool = true) -> void:
|
||||||
_move_to_target(animate)
|
_move_to_target(animate)
|
||||||
|
|
||||||
|
|
||||||
|
func set_selected(value: bool, animate: bool = true) -> void:
|
||||||
|
_selected = value
|
||||||
|
set_pressed_no_signal(value)
|
||||||
|
refresh_state(animate)
|
||||||
|
|
||||||
|
|
||||||
func animate_entrance(delay: float = 0.0) -> void:
|
func animate_entrance(delay: float = 0.0) -> void:
|
||||||
_cancel_motion()
|
_cancel_motion()
|
||||||
_motion_ready = true
|
_motion_ready = true
|
||||||
|
|
@ -77,7 +93,14 @@ func _initialize_motion() -> void:
|
||||||
_set_visual_y(_target_y())
|
_set_visual_y(_target_y())
|
||||||
|
|
||||||
|
|
||||||
func _on_toggled(_pressed: bool) -> void:
|
func _on_toggled(pressed: bool) -> void:
|
||||||
|
if _selected and not pressed:
|
||||||
|
# A selected organizer tab is a page marker, not a collapsible toggle.
|
||||||
|
# Restore without another signal before any lower-state frame is drawn.
|
||||||
|
set_pressed_no_signal(true)
|
||||||
|
refresh_state(false)
|
||||||
|
return
|
||||||
|
_selected = pressed
|
||||||
refresh_state()
|
refresh_state()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -107,35 +130,43 @@ func _move_to_target(animate: bool) -> void:
|
||||||
|
|
||||||
|
|
||||||
func _draw() -> void:
|
func _draw() -> void:
|
||||||
var base_color: Color = SELECTED_COLOR if button_pressed else INACTIVE_COLOR
|
var base_color: Color = PALETTE[palette_index]
|
||||||
var border_width: int = 2
|
base_color = (
|
||||||
var shadow_alpha: float = 0.28
|
base_color.lightened(0.06)
|
||||||
if disabled:
|
if button_pressed
|
||||||
base_color = DISABLED_COLOR
|
else base_color.darkened(0.07)
|
||||||
border_width = 1
|
|
||||||
shadow_alpha = 0.12
|
|
||||||
elif has_focus():
|
|
||||||
base_color = base_color.lightened(0.09)
|
|
||||||
border_width = 4
|
|
||||||
shadow_alpha = 0.40
|
|
||||||
elif _hovered:
|
|
||||||
base_color = base_color.lightened(0.07)
|
|
||||||
border_width = 3
|
|
||||||
shadow_alpha = 0.34
|
|
||||||
var visual_rect := Rect2(Vector2(0.0, _visual_y), size)
|
|
||||||
draw_style_box(
|
|
||||||
_make_style(base_color, border_width, shadow_alpha),
|
|
||||||
visual_rect,
|
|
||||||
)
|
)
|
||||||
|
if disabled:
|
||||||
|
base_color = base_color.lerp(Color("8a978f"), 0.62)
|
||||||
|
elif has_focus():
|
||||||
|
base_color = base_color.lightened(0.12)
|
||||||
|
elif _hovered:
|
||||||
|
base_color = base_color.lightened(0.08)
|
||||||
|
var width: float = size.x
|
||||||
|
var height: float = size.y
|
||||||
|
var points := PackedVector2Array([
|
||||||
|
Vector2(10.0, _visual_y),
|
||||||
|
Vector2(width - 10.0, _visual_y),
|
||||||
|
Vector2(width - 5.0, _visual_y + 5.0),
|
||||||
|
Vector2(width - 5.0, _visual_y + 17.0),
|
||||||
|
Vector2(width, _visual_y + 26.0),
|
||||||
|
Vector2(width, _visual_y + height),
|
||||||
|
Vector2(0.0, _visual_y + height),
|
||||||
|
Vector2(0.0, _visual_y + 26.0),
|
||||||
|
Vector2(5.0, _visual_y + 17.0),
|
||||||
|
Vector2(5.0, _visual_y + 5.0),
|
||||||
|
])
|
||||||
|
draw_colored_polygon(points, base_color)
|
||||||
var font: Font = UtilityPageStyle.TuffyFont
|
var font: Font = UtilityPageStyle.TuffyFont
|
||||||
var ink: Color = Color(TEXT_COLOR, 0.52) if disabled else TEXT_COLOR
|
var ink: Color = Color(TEXT_COLOR, 0.52) if disabled else TEXT_COLOR
|
||||||
|
var baseline: float = _visual_y + CAP_HEIGHT * 0.5 + FONT_SIZE * 0.35
|
||||||
draw_string(
|
draw_string(
|
||||||
font,
|
font,
|
||||||
Vector2(0.0, _visual_y + 32.0),
|
Vector2(0.0, baseline),
|
||||||
text,
|
text,
|
||||||
HORIZONTAL_ALIGNMENT_CENTER,
|
HORIZONTAL_ALIGNMENT_CENTER,
|
||||||
size.x,
|
size.x,
|
||||||
18,
|
FONT_SIZE,
|
||||||
ink,
|
ink,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -156,28 +187,6 @@ func _set_visual_y(value: float) -> void:
|
||||||
queue_redraw()
|
queue_redraw()
|
||||||
|
|
||||||
|
|
||||||
func _make_style(fill: Color, border_width: int, shadow_alpha: float) -> StyleBoxFlat:
|
|
||||||
var style := StyleBoxFlat.new()
|
|
||||||
style.bg_color = fill
|
|
||||||
style.border_color = BORDER_COLOR
|
|
||||||
style.border_width_left = border_width
|
|
||||||
style.border_width_top = border_width
|
|
||||||
style.border_width_right = border_width
|
|
||||||
style.border_width_bottom = 1
|
|
||||||
style.corner_radius_top_left = 13
|
|
||||||
style.corner_radius_top_right = 13
|
|
||||||
style.corner_radius_bottom_left = 2
|
|
||||||
style.corner_radius_bottom_right = 2
|
|
||||||
style.shadow_color = Color(0.12, 0.08, 0.04, shadow_alpha)
|
|
||||||
style.shadow_size = 4
|
|
||||||
style.shadow_offset = Vector2(0.0, 3.0)
|
|
||||||
style.content_margin_left = 14.0
|
|
||||||
style.content_margin_right = 14.0
|
|
||||||
style.content_margin_top = 8.0
|
|
||||||
style.content_margin_bottom = 12.0
|
|
||||||
return style
|
|
||||||
|
|
||||||
|
|
||||||
func _cancel_motion() -> void:
|
func _cancel_motion() -> void:
|
||||||
if _motion_tween != null:
|
if _motion_tween != null:
|
||||||
_motion_tween.kill()
|
_motion_tween.kill()
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[gd_resource type="Theme" load_steps=13 format=3]
|
[gd_resource type="Theme" load_steps=13 format=3]
|
||||||
|
|
||||||
[ext_resource type="FontFile" uid="uid://ddbejmxpa3kw6" path="res://ui/fonts/seattle_avenue.otf" id="1_font"]
|
[ext_resource type="FontFile" path="res://ui/fonts/Tuffy_Bold.otf" id="1_font"]
|
||||||
|
|
||||||
[sub_resource type="StyleBoxFlat" id="Panel"]
|
[sub_resource type="StyleBoxFlat" id="Panel"]
|
||||||
bg_color = Color(0.075, 0.145, 0.17, 0.96)
|
bg_color = Color(0.075, 0.145, 0.17, 0.96)
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,9 @@ var _item_effects: PlayerItemEffectsType
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
_hotbar_ui.presentation_transition_finished.connect(
|
||||||
|
_on_hotbar_presentation_transition_finished
|
||||||
|
)
|
||||||
_title_settings_panel.panel_visibility_changed.connect(
|
_title_settings_panel.panel_visibility_changed.connect(
|
||||||
_on_settings_visibility_changed
|
_on_settings_visibility_changed
|
||||||
)
|
)
|
||||||
|
|
@ -284,6 +287,7 @@ func set_system_menu_open(is_open: bool) -> void:
|
||||||
)
|
)
|
||||||
_hotbar_ui.set_drag_enabled(_player_menu_open and not is_open)
|
_hotbar_ui.set_drag_enabled(_player_menu_open and not is_open)
|
||||||
if is_open:
|
if is_open:
|
||||||
|
_hotbar_ui.set_drag_enabled(false)
|
||||||
_shop_prompt.hide()
|
_shop_prompt.hide()
|
||||||
_emit_interactive_pointer_ui_changed()
|
_emit_interactive_pointer_ui_changed()
|
||||||
|
|
||||||
|
|
@ -502,21 +506,27 @@ func _on_player_menu_visibility_changed(is_open: bool) -> void:
|
||||||
_player_menu_open = is_open
|
_player_menu_open = is_open
|
||||||
_gameplay_transient_hud.visible = _gameplay_ui_enabled and not is_open
|
_gameplay_transient_hud.visible = _gameplay_ui_enabled and not is_open
|
||||||
if is_open:
|
if is_open:
|
||||||
|
_hotbar_ui.set_drag_enabled(false)
|
||||||
_hotbar_ui.set_presentation_visible(false, false)
|
_hotbar_ui.set_presentation_visible(false, false)
|
||||||
if _player_menu_hotbar_visible:
|
if _player_menu_hotbar_visible:
|
||||||
_hotbar_ui.set_player_menu_context(true)
|
_hotbar_ui.set_player_menu_context(true)
|
||||||
_hotbar_ui.set_presentation_visible(true, true)
|
_hotbar_ui.set_presentation_visible(
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
UIMotion.PLAYER_MENU_ENTER_DURATION,
|
||||||
|
)
|
||||||
|
player_menu_backdrop_visibility_changed.emit(true)
|
||||||
else:
|
else:
|
||||||
_player_menu_hotbar_visible = false
|
_player_menu_hotbar_visible = false
|
||||||
_hotbar_ui.set_presentation_visible(false, false)
|
_hotbar_ui.set_presentation_visible(false, false)
|
||||||
_hotbar_ui.set_player_menu_context(false)
|
_hotbar_ui.set_player_menu_context(false)
|
||||||
player_menu_backdrop_visibility_changed.emit(is_open)
|
|
||||||
_refresh_chat_availability()
|
_refresh_chat_availability()
|
||||||
_hotbar_ui.set_gameplay_input_enabled(
|
_hotbar_ui.set_gameplay_input_enabled(
|
||||||
_gameplay_ui_enabled and not is_open
|
_gameplay_ui_enabled and not is_open
|
||||||
)
|
)
|
||||||
_hotbar_ui.set_drag_enabled(is_open)
|
if not is_open:
|
||||||
_refresh_hotbar_visibility()
|
_hotbar_ui.set_drag_enabled(false)
|
||||||
|
_refresh_hotbar_visibility()
|
||||||
_refresh_fishing_panel_visibility()
|
_refresh_fishing_panel_visibility()
|
||||||
_emit_interactive_pointer_ui_changed()
|
_emit_interactive_pointer_ui_changed()
|
||||||
if is_open:
|
if is_open:
|
||||||
|
|
@ -529,7 +539,12 @@ func _on_player_menu_exit_started() -> void:
|
||||||
if not _player_menu_open:
|
if not _player_menu_open:
|
||||||
return
|
return
|
||||||
_hotbar_ui.set_drag_enabled(false)
|
_hotbar_ui.set_drag_enabled(false)
|
||||||
_hotbar_ui.set_presentation_visible(false, true)
|
_hotbar_ui.set_presentation_visible(
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
UIMotion.PLAYER_MENU_EXIT_DURATION,
|
||||||
|
)
|
||||||
|
player_menu_backdrop_visibility_changed.emit(false)
|
||||||
|
|
||||||
|
|
||||||
func _on_shop_visibility_changed(is_open: bool) -> void:
|
func _on_shop_visibility_changed(is_open: bool) -> void:
|
||||||
|
|
@ -550,13 +565,39 @@ func _on_shop_visibility_changed(is_open: bool) -> void:
|
||||||
func _on_inventory_hotbar_context_changed(show_hotbar: bool) -> void:
|
func _on_inventory_hotbar_context_changed(show_hotbar: bool) -> void:
|
||||||
var context_changed: bool = _player_menu_hotbar_visible != show_hotbar
|
var context_changed: bool = _player_menu_hotbar_visible != show_hotbar
|
||||||
_player_menu_hotbar_visible = show_hotbar
|
_player_menu_hotbar_visible = show_hotbar
|
||||||
if _player_menu_open and show_hotbar and context_changed:
|
if _player_menu_open and context_changed:
|
||||||
_hotbar_ui.set_presentation_visible(false, false)
|
_hotbar_ui.set_drag_enabled(false)
|
||||||
_hotbar_ui.set_player_menu_context(true)
|
if show_hotbar:
|
||||||
_hotbar_ui.set_drag_enabled(_player_menu_open and show_hotbar)
|
_hotbar_ui.set_presentation_visible(false, false)
|
||||||
|
_hotbar_ui.set_player_menu_context(true)
|
||||||
|
_hotbar_ui.set_presentation_visible(
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
UIMotion.PLAYER_MENU_INVENTORY_DURATION,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
_hotbar_ui.set_presentation_visible(
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
UIMotion.PLAYER_MENU_INVENTORY_DURATION,
|
||||||
|
)
|
||||||
|
elif _player_menu_open and show_hotbar:
|
||||||
|
_hotbar_ui.set_drag_enabled(true)
|
||||||
if not context_changed:
|
if not context_changed:
|
||||||
return
|
return
|
||||||
_refresh_hotbar_visibility()
|
if not _player_menu_open:
|
||||||
|
_refresh_hotbar_visibility()
|
||||||
|
|
||||||
|
|
||||||
|
func _on_hotbar_presentation_transition_finished(
|
||||||
|
is_visible: bool,
|
||||||
|
) -> void:
|
||||||
|
_hotbar_ui.set_drag_enabled(
|
||||||
|
is_visible
|
||||||
|
and _player_menu_open
|
||||||
|
and _player_menu_hotbar_visible
|
||||||
|
and not _system_menu_open
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
func _refresh_hotbar_visibility() -> void:
|
func _refresh_hotbar_visibility() -> void:
|
||||||
|
|
|
||||||
39
ui/hotbar.gd
39
ui/hotbar.gd
|
|
@ -1,6 +1,8 @@
|
||||||
class_name HotbarUI
|
class_name HotbarUI
|
||||||
extends Control
|
extends Control
|
||||||
|
|
||||||
|
signal presentation_transition_finished(is_visible: bool)
|
||||||
|
|
||||||
const ItemCatalogType = preload("res://items/item_catalog.gd")
|
const ItemCatalogType = preload("res://items/item_catalog.gd")
|
||||||
const PlayerBagType = preload("res://inventory/player_bag.gd")
|
const PlayerBagType = preload("res://inventory/player_bag.gd")
|
||||||
const PlayerHotbarType = preload("res://inventory/player_hotbar.gd")
|
const PlayerHotbarType = preload("res://inventory/player_hotbar.gd")
|
||||||
|
|
@ -14,6 +16,9 @@ const COMPACT_REFERENCE_SIZE := Vector2(640.0, 480.0)
|
||||||
const HOTBAR_PRESENTATION_SCALE: float = 0.60
|
const HOTBAR_PRESENTATION_SCALE: float = 0.60
|
||||||
const HOTBAR_CANONICAL_POSITION := Vector2(256.0, 288.0)
|
const HOTBAR_CANONICAL_POSITION := Vector2(256.0, 288.0)
|
||||||
const HOTBAR_MENU_POSITION := Vector2(80.0, 198.0)
|
const HOTBAR_MENU_POSITION := Vector2(80.0, 198.0)
|
||||||
|
const HOTBAR_GAMEPLAY_Z_INDEX: int = 35
|
||||||
|
# PlayerMenu is z=30 and its authored inventory panels are relative z=50.
|
||||||
|
const HOTBAR_MENU_Z_INDEX: int = 90
|
||||||
|
|
||||||
@onready var _presentation_scale_root: Control = %HotbarPresentationScaleRoot
|
@onready var _presentation_scale_root: Control = %HotbarPresentationScaleRoot
|
||||||
@onready var _bubble_field: Control = %BubbleField
|
@onready var _bubble_field: Control = %BubbleField
|
||||||
|
|
@ -90,28 +95,49 @@ func set_player_menu_context(enabled: bool) -> void:
|
||||||
if _player_menu_context == enabled:
|
if _player_menu_context == enabled:
|
||||||
return
|
return
|
||||||
_player_menu_context = enabled
|
_player_menu_context = enabled
|
||||||
|
z_index = HOTBAR_MENU_Z_INDEX if enabled else HOTBAR_GAMEPLAY_Z_INDEX
|
||||||
_presentation_scale_root.position = (
|
_presentation_scale_root.position = (
|
||||||
HOTBAR_MENU_POSITION if enabled else HOTBAR_CANONICAL_POSITION
|
HOTBAR_MENU_POSITION if enabled else HOTBAR_CANONICAL_POSITION
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
func set_presentation_visible(should_show: bool, animate: bool = true) -> void:
|
func set_presentation_visible(
|
||||||
|
should_show: bool,
|
||||||
|
animate: bool = true,
|
||||||
|
transition_duration: float = -1.0,
|
||||||
|
) -> void:
|
||||||
_visibility_generation += 1
|
_visibility_generation += 1
|
||||||
var generation: int = _visibility_generation
|
var generation: int = _visibility_generation
|
||||||
if _visibility_tween != null:
|
if _visibility_tween != null:
|
||||||
_visibility_tween.kill()
|
_visibility_tween.kill()
|
||||||
_visibility_tween = null
|
_visibility_tween = null
|
||||||
if should_show:
|
if should_show:
|
||||||
|
var was_visible: bool = visible
|
||||||
visible = true
|
visible = true
|
||||||
if not animate:
|
if not animate:
|
||||||
modulate.a = 1.0
|
modulate.a = 1.0
|
||||||
|
presentation_transition_finished.emit(true)
|
||||||
return
|
return
|
||||||
|
if not was_visible:
|
||||||
|
modulate.a = 0.0
|
||||||
|
var duration: float = (
|
||||||
|
transition_duration
|
||||||
|
if transition_duration >= 0.0
|
||||||
|
else UIMotion.UTILITY_ENTER_DURATION
|
||||||
|
)
|
||||||
_visibility_tween = create_tween()
|
_visibility_tween = create_tween()
|
||||||
_visibility_tween.tween_property(
|
_visibility_tween.tween_property(
|
||||||
self,
|
self,
|
||||||
"modulate:a",
|
"modulate:a",
|
||||||
1.0,
|
1.0,
|
||||||
UIMotion.UTILITY_ENTER_DURATION,
|
duration,
|
||||||
|
)
|
||||||
|
_visibility_tween.finished.connect(
|
||||||
|
func() -> void:
|
||||||
|
if generation != _visibility_generation:
|
||||||
|
return
|
||||||
|
_visibility_tween = null
|
||||||
|
presentation_transition_finished.emit(true)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
if not visible:
|
if not visible:
|
||||||
|
|
@ -119,13 +145,19 @@ func set_presentation_visible(should_show: bool, animate: bool = true) -> void:
|
||||||
if not animate:
|
if not animate:
|
||||||
visible = false
|
visible = false
|
||||||
modulate.a = 1.0
|
modulate.a = 1.0
|
||||||
|
presentation_transition_finished.emit(false)
|
||||||
return
|
return
|
||||||
|
var duration: float = (
|
||||||
|
transition_duration
|
||||||
|
if transition_duration >= 0.0
|
||||||
|
else UIMotion.UTILITY_EXIT_DURATION
|
||||||
|
)
|
||||||
_visibility_tween = create_tween()
|
_visibility_tween = create_tween()
|
||||||
_visibility_tween.tween_property(
|
_visibility_tween.tween_property(
|
||||||
self,
|
self,
|
||||||
"modulate:a",
|
"modulate:a",
|
||||||
0.0,
|
0.0,
|
||||||
UIMotion.UTILITY_EXIT_DURATION,
|
duration,
|
||||||
)
|
)
|
||||||
_visibility_tween.finished.connect(
|
_visibility_tween.finished.connect(
|
||||||
func() -> void:
|
func() -> void:
|
||||||
|
|
@ -134,6 +166,7 @@ func set_presentation_visible(should_show: bool, animate: bool = true) -> void:
|
||||||
visible = false
|
visible = false
|
||||||
modulate.a = 1.0
|
modulate.a = 1.0
|
||||||
_visibility_tween = null
|
_visibility_tween = null
|
||||||
|
presentation_transition_finished.emit(false)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,40 +1,31 @@
|
||||||
class_name InterfaceFontController
|
class_name InterfaceFontController
|
||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
signal font_mode_changed(use_readable_font: bool)
|
const STANDARD_FONT: Font = preload("res://ui/fonts/Tuffy_Bold.otf")
|
||||||
|
|
||||||
const READABLE_FONT_PATH: String = "res://ui/fonts/Tuffy_Bold.otf"
|
|
||||||
|
|
||||||
var _game_theme: Theme = preload("res://ui/game_theme.tres")
|
var _game_theme: Theme = preload("res://ui/game_theme.tres")
|
||||||
var _game_font: Font = preload("res://ui/fonts/seattle_avenue.otf")
|
|
||||||
var _readable_font: Font
|
|
||||||
var _utility_theme: Theme
|
var _utility_theme: Theme
|
||||||
var _use_readable_font: bool = false
|
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
if ResourceLoader.exists(READABLE_FONT_PATH):
|
enforce_standard_font()
|
||||||
_readable_font = load(READABLE_FONT_PATH) as Font
|
|
||||||
if _readable_font == null:
|
|
||||||
push_error("Readable interface font resource is unavailable.")
|
|
||||||
else:
|
|
||||||
_readable_font.fallbacks = [_game_font]
|
|
||||||
_utility_theme = _game_theme.duplicate(true)
|
_utility_theme = _game_theme.duplicate(true)
|
||||||
_utility_theme.default_font = readable_font()
|
_utility_theme.default_font = STANDARD_FONT
|
||||||
|
|
||||||
|
|
||||||
func set_readable_font_enabled(enabled: bool) -> void:
|
func enforce_standard_font() -> void:
|
||||||
_use_readable_font = enabled
|
_game_theme.default_font = STANDARD_FONT
|
||||||
_game_theme.default_font = (
|
if _utility_theme != null:
|
||||||
_readable_font
|
_utility_theme.default_font = STANDARD_FONT
|
||||||
if enabled and _readable_font != null
|
|
||||||
else _game_font
|
|
||||||
)
|
func set_readable_font_enabled(_enabled: bool) -> void:
|
||||||
font_mode_changed.emit(_use_readable_font)
|
# Compatibility seam for callers compiled against the old setting.
|
||||||
|
enforce_standard_font()
|
||||||
|
|
||||||
|
|
||||||
func is_readable_font_enabled() -> bool:
|
func is_readable_font_enabled() -> bool:
|
||||||
return _use_readable_font
|
return true
|
||||||
|
|
||||||
|
|
||||||
func apply_utility_theme(themed_node: Node) -> void:
|
func apply_utility_theme(themed_node: Node) -> void:
|
||||||
|
|
@ -42,9 +33,7 @@ func apply_utility_theme(themed_node: Node) -> void:
|
||||||
return
|
return
|
||||||
if _utility_theme == null:
|
if _utility_theme == null:
|
||||||
_utility_theme = _game_theme.duplicate(true)
|
_utility_theme = _game_theme.duplicate(true)
|
||||||
_utility_theme.default_font = (
|
_utility_theme.default_font = STANDARD_FONT
|
||||||
_readable_font if _readable_font != null else _game_font
|
|
||||||
)
|
|
||||||
if themed_node is Control:
|
if themed_node is Control:
|
||||||
(themed_node as Control).theme = _utility_theme
|
(themed_node as Control).theme = _utility_theme
|
||||||
elif themed_node is Window:
|
elif themed_node is Window:
|
||||||
|
|
@ -52,4 +41,4 @@ func apply_utility_theme(themed_node: Node) -> void:
|
||||||
|
|
||||||
|
|
||||||
func readable_font() -> Font:
|
func readable_font() -> Font:
|
||||||
return _readable_font if _readable_font != null else _game_font
|
return STANDARD_FONT
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const INK := Color("251b10")
|
||||||
const MUTED_INK := Color("6d5b45")
|
const MUTED_INK := Color("6d5b45")
|
||||||
const PAPER := Color("f2e6c9")
|
const PAPER := Color("f2e6c9")
|
||||||
const PAPER_DARK := Color("e8d7b4")
|
const PAPER_DARK := Color("e8d7b4")
|
||||||
|
const LOGBOOK_TAB_LEFT_INSET: float = 34.0
|
||||||
|
|
||||||
var _collection_log: CollectionLogType
|
var _collection_log: CollectionLogType
|
||||||
var _inventory: FishInventoryType
|
var _inventory: FishInventoryType
|
||||||
|
|
@ -97,7 +98,7 @@ func set_interactive(value: bool) -> void:
|
||||||
)
|
)
|
||||||
tab.mouse_filter = (
|
tab.mouse_filter = (
|
||||||
Control.MOUSE_FILTER_STOP
|
Control.MOUSE_FILTER_STOP
|
||||||
if _interactive
|
if _interactive and not tab.button_pressed
|
||||||
else Control.MOUSE_FILTER_IGNORE
|
else Control.MOUSE_FILTER_IGNORE
|
||||||
)
|
)
|
||||||
for entry: Button in _entry_buttons.values():
|
for entry: Button in _entry_buttons.values():
|
||||||
|
|
@ -139,11 +140,13 @@ func _build_interface() -> void:
|
||||||
outer.add_child(stack)
|
outer.add_child(stack)
|
||||||
|
|
||||||
var tabs := HBoxContainer.new()
|
var tabs := HBoxContainer.new()
|
||||||
tabs.position = Vector2(0.0, 10.0)
|
# The 26 px page corner plus 8 px clearance keeps the flange behind
|
||||||
tabs.size = Vector2(520.0, 58.0)
|
# the straight portion of the spread.
|
||||||
|
tabs.position = Vector2(LOGBOOK_TAB_LEFT_INSET, 20.0)
|
||||||
|
tabs.size = Vector2(384.0, 38.0)
|
||||||
tabs.z_index = 10
|
tabs.z_index = 10
|
||||||
tabs.mouse_filter = Control.MOUSE_FILTER_PASS
|
tabs.mouse_filter = Control.MOUSE_FILTER_PASS
|
||||||
tabs.add_theme_constant_override("separation", 8)
|
tabs.add_theme_constant_override("separation", 6)
|
||||||
stack.add_child(tabs)
|
stack.add_child(tabs)
|
||||||
for category: LogbookCatalog.Category in [
|
for category: LogbookCatalog.Category in [
|
||||||
LogbookCatalog.Category.FRESH_WATER,
|
LogbookCatalog.Category.FRESH_WATER,
|
||||||
|
|
@ -151,10 +154,11 @@ func _build_interface() -> void:
|
||||||
LogbookCatalog.Category.OTHER,
|
LogbookCatalog.Category.OTHER,
|
||||||
]:
|
]:
|
||||||
var tab := OrganizerTabType.new()
|
var tab := OrganizerTabType.new()
|
||||||
tab.custom_minimum_size = Vector2(168, 58)
|
tab.custom_minimum_size = Vector2(124, 38)
|
||||||
tab.toggle_mode = true
|
tab.toggle_mode = true
|
||||||
tab.text = LogbookCatalog.category_label(category)
|
tab.text = LogbookCatalog.category_label(category)
|
||||||
tab.button_pressed = category == _category
|
tab.palette_index = int(category)
|
||||||
|
tab.set_selected(category == _category, false)
|
||||||
tab.pressed.connect(_select_category.bind(category))
|
tab.pressed.connect(_select_category.bind(category))
|
||||||
tabs.add_child(tab)
|
tabs.add_child(tab)
|
||||||
_category_tabs.append(tab)
|
_category_tabs.append(tab)
|
||||||
|
|
@ -365,8 +369,9 @@ func _select_category(category: LogbookCatalog.Category) -> void:
|
||||||
_selected_id = StringName()
|
_selected_id = StringName()
|
||||||
_selected_entry_key = StringName()
|
_selected_entry_key = StringName()
|
||||||
for index: int in _category_tabs.size():
|
for index: int in _category_tabs.size():
|
||||||
_category_tabs[index].button_pressed = index == int(_category)
|
(_category_tabs[index] as OrganizerTabType).set_selected(
|
||||||
(_category_tabs[index] as OrganizerTabType).refresh_state()
|
index == int(_category)
|
||||||
|
)
|
||||||
_begin_category_transition()
|
_begin_category_transition()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -66,16 +66,14 @@ const LogbookEntryScene = preload(
|
||||||
"res://ui/components/bubble_menu/logbook_entry.tscn"
|
"res://ui/components/bubble_menu/logbook_entry.tscn"
|
||||||
)
|
)
|
||||||
|
|
||||||
const PAGE_OUT_DURATION: float = 0.34
|
|
||||||
const PAGE_IN_DURATION: float = 0.42
|
|
||||||
const LOGBOOK_PAGE_DURATION: float = 0.18
|
const LOGBOOK_PAGE_DURATION: float = 0.18
|
||||||
const TRANSITION_SAFE_MARGIN: float = 28.0
|
|
||||||
const DESKTOP_REFERENCE_SIZE := Vector2(1280.0, 720.0)
|
const DESKTOP_REFERENCE_SIZE := Vector2(1280.0, 720.0)
|
||||||
const COMPACT_REFERENCE_SIZE := Vector2(640.0, 480.0)
|
const COMPACT_REFERENCE_SIZE := Vector2(640.0, 480.0)
|
||||||
const COMPACT_HEIGHT_THRESHOLD: float = 560.0
|
const COMPACT_HEIGHT_THRESHOLD: float = 560.0
|
||||||
const NAVIGATION_PRESENTATION_SCALE: float = 0.60
|
const NAVIGATION_PRESENTATION_SCALE: float = 0.60
|
||||||
const NAVIGATION_CANONICAL_POSITION := Vector2(424.0, 44.0)
|
const NAVIGATION_CANONICAL_POSITION := Vector2(424.0, 44.0)
|
||||||
const NAVIGATION_SELECTED_SCALE: float = 1.02
|
const NAVIGATION_SELECTED_SCALE: float = 1.02
|
||||||
|
const INVENTORY_TAB_LEFT_INSET: float = 96.0
|
||||||
const COOLER_RARITY_COMMON := Color("e8eef0")
|
const COOLER_RARITY_COMMON := Color("e8eef0")
|
||||||
const COOLER_RARITY_UNCOMMON := Color("64c87c")
|
const COOLER_RARITY_UNCOMMON := Color("64c87c")
|
||||||
const COOLER_RARITY_RARE := Color("6098dd")
|
const COOLER_RARITY_RARE := Color("6098dd")
|
||||||
|
|
@ -131,6 +129,8 @@ const INVENTORY_NOTEPAD_POSITION := Vector2(
|
||||||
const INVENTORY_NOTEPAD_SIZE := Vector2(278.0, 484.0)
|
const INVENTORY_NOTEPAD_SIZE := Vector2(278.0, 484.0)
|
||||||
const INVENTORY_HEADER_INSET := Vector2(24.0, 20.0)
|
const INVENTORY_HEADER_INSET := Vector2(24.0, 20.0)
|
||||||
const INVENTORY_HEADER_HEIGHT := 40.0
|
const INVENTORY_HEADER_HEIGHT := 40.0
|
||||||
|
const INVENTORY_MAIN_CORNER_RADIUS: int = 58
|
||||||
|
const INVENTORY_INNER_CORNER_RADIUS: int = 45
|
||||||
|
|
||||||
@onready var _navigation_cluster: BubbleClusterType = %NavigationCluster
|
@onready var _navigation_cluster: BubbleClusterType = %NavigationCluster
|
||||||
@onready var _presentation_scale_root: Control = %PlayerMenuPresentationScaleRoot
|
@onready var _presentation_scale_root: Control = %PlayerMenuPresentationScaleRoot
|
||||||
|
|
@ -318,7 +318,8 @@ var _mail_rest_position: Vector2 = Vector2.ZERO
|
||||||
var _profile_rest_position: Vector2 = Vector2.ZERO
|
var _profile_rest_position: Vector2 = Vector2.ZERO
|
||||||
var _page_outgoing_root: Control
|
var _page_outgoing_root: Control
|
||||||
var _page_incoming_root: Control
|
var _page_incoming_root: Control
|
||||||
var _page_hosts_shared: bool = false
|
var _page_outgoing_content_root: Control
|
||||||
|
var _inventory_transition_group: Control
|
||||||
var _fish_nodes: Dictionary[StringName, CoolerFishSpriteType] = {}
|
var _fish_nodes: Dictionary[StringName, CoolerFishSpriteType] = {}
|
||||||
var _sorted_catches: Array[FishCatchType] = []
|
var _sorted_catches: Array[FishCatchType] = []
|
||||||
var _bag_item_nodes: Dictionary[StringName, BagItemSpriteType] = {}
|
var _bag_item_nodes: Dictionary[StringName, BagItemSpriteType] = {}
|
||||||
|
|
@ -334,6 +335,9 @@ var _logbook_page_tween: Tween
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
_configure_inventory_transition_group()
|
||||||
|
_inventory_sub_tabs.move_child(_tackle_sub_tab, 1)
|
||||||
|
_inventory_sub_tabs.move_child(_bag_sub_tab, 2)
|
||||||
_inventory_tab.pressed.connect(_show_last_inventory_section)
|
_inventory_tab.pressed.connect(_show_last_inventory_section)
|
||||||
_cooler_sub_tab.pressed.connect(_show_section.bind(Section.COOLER))
|
_cooler_sub_tab.pressed.connect(_show_section.bind(Section.COOLER))
|
||||||
_bag_sub_tab.pressed.connect(_show_section.bind(Section.BAG))
|
_bag_sub_tab.pressed.connect(_show_section.bind(Section.BAG))
|
||||||
|
|
@ -401,6 +405,39 @@ func _ready() -> void:
|
||||||
set_process(false)
|
set_process(false)
|
||||||
|
|
||||||
|
|
||||||
|
func _configure_inventory_transition_group() -> void:
|
||||||
|
# Keep the organizer row and the panel that masks its lower flange under one
|
||||||
|
# alpha owner. Top-level page crossfades can then never expose a complete tab.
|
||||||
|
var original_layer_index: int = mini(
|
||||||
|
_inventory_sub_tabs.get_index(),
|
||||||
|
mini(
|
||||||
|
_cooler_page.get_index(),
|
||||||
|
mini(_bag_page.get_index(), _tackle_box_page.get_index()),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
_inventory_transition_group = Control.new()
|
||||||
|
_inventory_transition_group.name = "InventoryTransitionGroup"
|
||||||
|
_inventory_transition_group.set_anchors_and_offsets_preset(
|
||||||
|
Control.PRESET_FULL_RECT
|
||||||
|
)
|
||||||
|
_inventory_transition_group.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||||
|
_presentation_scale_root.add_child(_inventory_transition_group)
|
||||||
|
# Adding a runtime container normally places it after NavigationCluster in
|
||||||
|
# GUI picking order. Retain the pages' authored layer so their full-screen
|
||||||
|
# PASS roots cannot cover the top-level navigation hitboxes.
|
||||||
|
_presentation_scale_root.move_child(
|
||||||
|
_inventory_transition_group,
|
||||||
|
original_layer_index,
|
||||||
|
)
|
||||||
|
for control: Control in [
|
||||||
|
_inventory_sub_tabs,
|
||||||
|
_cooler_page,
|
||||||
|
_bag_page,
|
||||||
|
_tackle_box_page,
|
||||||
|
]:
|
||||||
|
control.reparent(_inventory_transition_group, true)
|
||||||
|
|
||||||
|
|
||||||
func _apply_mail_notification_style() -> void:
|
func _apply_mail_notification_style() -> void:
|
||||||
var background := StyleBoxFlat.new()
|
var background := StyleBoxFlat.new()
|
||||||
background.bg_color = Color(0.95, 0.88, 0.63, 0.98)
|
background.bg_color = Color(0.95, 0.88, 0.63, 0.98)
|
||||||
|
|
@ -795,9 +832,9 @@ func _show_section_immediate(section: Section) -> void:
|
||||||
else:
|
else:
|
||||||
_players_page.deactivate()
|
_players_page.deactivate()
|
||||||
_inventory_tab.button_pressed = _is_inventory_section(section)
|
_inventory_tab.button_pressed = _is_inventory_section(section)
|
||||||
_cooler_sub_tab.button_pressed = section == Section.COOLER
|
_cooler_sub_tab.set_selected(section == Section.COOLER)
|
||||||
_bag_sub_tab.button_pressed = section == Section.BAG
|
_bag_sub_tab.set_selected(section == Section.BAG)
|
||||||
_tackle_sub_tab.button_pressed = section == Section.TACKLE_BOX
|
_tackle_sub_tab.set_selected(section == Section.TACKLE_BOX)
|
||||||
_refresh_inventory_organizer_tabs()
|
_refresh_inventory_organizer_tabs()
|
||||||
_logbook_tab.button_pressed = section == Section.LOGBOOK
|
_logbook_tab.button_pressed = section == Section.LOGBOOK
|
||||||
_mail_tab.button_pressed = section == Section.MAIL
|
_mail_tab.button_pressed = section == Section.MAIL
|
||||||
|
|
@ -817,8 +854,8 @@ func _is_inventory_section(section: Section) -> bool:
|
||||||
func _refresh_inventory_organizer_tabs() -> void:
|
func _refresh_inventory_organizer_tabs() -> void:
|
||||||
for tab: OrganizerTabType in [
|
for tab: OrganizerTabType in [
|
||||||
_cooler_sub_tab,
|
_cooler_sub_tab,
|
||||||
_bag_sub_tab,
|
|
||||||
_tackle_sub_tab,
|
_tackle_sub_tab,
|
||||||
|
_bag_sub_tab,
|
||||||
]:
|
]:
|
||||||
tab.refresh_state()
|
tab.refresh_state()
|
||||||
|
|
||||||
|
|
@ -828,8 +865,8 @@ func _animate_inventory_tab_entry() -> void:
|
||||||
return
|
return
|
||||||
var tabs: Array[OrganizerTabType] = [
|
var tabs: Array[OrganizerTabType] = [
|
||||||
_cooler_sub_tab,
|
_cooler_sub_tab,
|
||||||
_bag_sub_tab,
|
|
||||||
_tackle_sub_tab,
|
_tackle_sub_tab,
|
||||||
|
_bag_sub_tab,
|
||||||
]
|
]
|
||||||
for index: int in tabs.size():
|
for index: int in tabs.size():
|
||||||
tabs[index].animate_entrance(float(index) * 0.025)
|
tabs[index].animate_entrance(float(index) * 0.025)
|
||||||
|
|
@ -838,8 +875,8 @@ func _animate_inventory_tab_entry() -> void:
|
||||||
func _settle_inventory_tabs_for_close() -> void:
|
func _settle_inventory_tabs_for_close() -> void:
|
||||||
for tab: OrganizerTabType in [
|
for tab: OrganizerTabType in [
|
||||||
_cooler_sub_tab,
|
_cooler_sub_tab,
|
||||||
_bag_sub_tab,
|
|
||||||
_tackle_sub_tab,
|
_tackle_sub_tab,
|
||||||
|
_bag_sub_tab,
|
||||||
]:
|
]:
|
||||||
tab.settle_for_close()
|
tab.settle_for_close()
|
||||||
|
|
||||||
|
|
@ -905,8 +942,8 @@ func _configure_navigation_focus() -> void:
|
||||||
bubble.focus_neighbor_bottom = bubble.focus_neighbor_right
|
bubble.focus_neighbor_bottom = bubble.focus_neighbor_right
|
||||||
var inventory_tabs: Array[Button] = [
|
var inventory_tabs: Array[Button] = [
|
||||||
_cooler_sub_tab,
|
_cooler_sub_tab,
|
||||||
_bag_sub_tab,
|
|
||||||
_tackle_sub_tab,
|
_tackle_sub_tab,
|
||||||
|
_bag_sub_tab,
|
||||||
]
|
]
|
||||||
for index: int in inventory_tabs.size():
|
for index: int in inventory_tabs.size():
|
||||||
var tab: Button = inventory_tabs[index]
|
var tab: Button = inventory_tabs[index]
|
||||||
|
|
@ -918,13 +955,23 @@ func _configure_navigation_focus() -> void:
|
||||||
)
|
)
|
||||||
tab.focus_neighbor_top = tab.get_path_to(_inventory_tab)
|
tab.focus_neighbor_top = tab.get_path_to(_inventory_tab)
|
||||||
_inventory_tab.focus_neighbor_bottom = _inventory_tab.get_path_to(
|
_inventory_tab.focus_neighbor_bottom = _inventory_tab.get_path_to(
|
||||||
inventory_tabs[int(_last_inventory_section)]
|
_inventory_tab_for_section(_last_inventory_section)
|
||||||
)
|
)
|
||||||
_tackle_sub_tab.focus_neighbor_bottom = _tackle_sub_tab.get_path_to(
|
_tackle_sub_tab.focus_neighbor_bottom = _tackle_sub_tab.get_path_to(
|
||||||
_bait_filter
|
_bait_filter
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func _inventory_tab_for_section(section: Section) -> Button:
|
||||||
|
match section:
|
||||||
|
Section.COOLER:
|
||||||
|
return _cooler_sub_tab
|
||||||
|
Section.BAG:
|
||||||
|
return _bag_sub_tab
|
||||||
|
_:
|
||||||
|
return _tackle_sub_tab
|
||||||
|
|
||||||
|
|
||||||
func _configure_sale_confirmation_focus() -> void:
|
func _configure_sale_confirmation_focus() -> void:
|
||||||
_confirm_sale_button.focus_neighbor_left = (
|
_confirm_sale_button.focus_neighbor_left = (
|
||||||
_confirm_sale_button.get_path_to(_cancel_sale_button)
|
_confirm_sale_button.get_path_to(_cancel_sale_button)
|
||||||
|
|
@ -981,11 +1028,13 @@ func _apply_inventory_styles() -> void:
|
||||||
]:
|
]:
|
||||||
UtilityPageStyle.apply_button(button)
|
UtilityPageStyle.apply_button(button)
|
||||||
for panel: PanelContainer in [_tackle_main_panel]:
|
for panel: PanelContainer in [_tackle_main_panel]:
|
||||||
|
var panel_style := UtilityPageStyle.panel_style()
|
||||||
|
panel_style.set_corner_radius_all(INVENTORY_MAIN_CORNER_RADIUS)
|
||||||
panel.add_theme_stylebox_override(
|
panel.add_theme_stylebox_override(
|
||||||
"panel",
|
"panel",
|
||||||
UtilityPageStyle.panel_style(),
|
panel_style,
|
||||||
)
|
)
|
||||||
for label: Label in [_tackle_empty, _tackle_detail_text]:
|
for label: Label in [_tackle_empty]:
|
||||||
label.add_theme_font_override("font", UtilityPageStyle.TuffyFont)
|
label.add_theme_font_override("font", UtilityPageStyle.TuffyFont)
|
||||||
label.add_theme_color_override(
|
label.add_theme_color_override(
|
||||||
"font_color",
|
"font_color",
|
||||||
|
|
@ -1129,13 +1178,13 @@ func _apply_cooler_wall_styles() -> void:
|
||||||
outer.bg_color = Color(0.76, 0.9, 0.96, 1.0)
|
outer.bg_color = Color(0.76, 0.9, 0.96, 1.0)
|
||||||
outer.border_color = Color(0.91, 0.98, 1.0, 1.0)
|
outer.border_color = Color(0.91, 0.98, 1.0, 1.0)
|
||||||
outer.set_border_width_all(7)
|
outer.set_border_width_all(7)
|
||||||
outer.set_corner_radius_all(58)
|
outer.set_corner_radius_all(INVENTORY_MAIN_CORNER_RADIUS)
|
||||||
_cooler_outer_wall.add_theme_stylebox_override("panel", outer)
|
_cooler_outer_wall.add_theme_stylebox_override("panel", outer)
|
||||||
var inner := StyleBoxFlat.new()
|
var inner := StyleBoxFlat.new()
|
||||||
inner.bg_color = Color(0.018, 0.16, 0.25, 1.0)
|
inner.bg_color = Color(0.018, 0.16, 0.25, 1.0)
|
||||||
inner.border_color = Color(0.56, 0.78, 0.86, 1.0)
|
inner.border_color = Color(0.56, 0.78, 0.86, 1.0)
|
||||||
inner.set_border_width_all(5)
|
inner.set_border_width_all(5)
|
||||||
inner.set_corner_radius_all(45)
|
inner.set_corner_radius_all(INVENTORY_INNER_CORNER_RADIUS)
|
||||||
_cooler_inner_liner.add_theme_stylebox_override("panel", inner)
|
_cooler_inner_liner.add_theme_stylebox_override("panel", inner)
|
||||||
var scroll_bar := _cooler_scroll.get_v_scroll_bar()
|
var scroll_bar := _cooler_scroll.get_v_scroll_bar()
|
||||||
var scroll_grabber := StyleBoxFlat.new()
|
var scroll_grabber := StyleBoxFlat.new()
|
||||||
|
|
@ -1155,6 +1204,7 @@ func _apply_cooler_notepad_style() -> void:
|
||||||
"panel",
|
"panel",
|
||||||
InventoryNotepadType.make_paper_style(false),
|
InventoryNotepadType.make_paper_style(false),
|
||||||
)
|
)
|
||||||
|
InventoryNotepadType.apply_handwritten_to(_detail_constellation)
|
||||||
|
|
||||||
|
|
||||||
func _apply_navigation_styles() -> void:
|
func _apply_navigation_styles() -> void:
|
||||||
|
|
@ -1221,19 +1271,13 @@ func _apply_bag_styles() -> void:
|
||||||
outer.bg_color = Color(0.39, 0.31, 0.2, 1.0)
|
outer.bg_color = Color(0.39, 0.31, 0.2, 1.0)
|
||||||
outer.border_color = Color(0.67, 0.54, 0.33, 1.0)
|
outer.border_color = Color(0.67, 0.54, 0.33, 1.0)
|
||||||
outer.set_border_width_all(7)
|
outer.set_border_width_all(7)
|
||||||
outer.corner_radius_top_left = 88
|
outer.set_corner_radius_all(INVENTORY_MAIN_CORNER_RADIUS)
|
||||||
outer.corner_radius_top_right = 64
|
|
||||||
outer.corner_radius_bottom_right = 94
|
|
||||||
outer.corner_radius_bottom_left = 70
|
|
||||||
_bag_outer_wall.add_theme_stylebox_override("panel", outer)
|
_bag_outer_wall.add_theme_stylebox_override("panel", outer)
|
||||||
var inner := StyleBoxFlat.new()
|
var inner := StyleBoxFlat.new()
|
||||||
inner.bg_color = Color(0.92, 0.85, 0.68, 1.0)
|
inner.bg_color = Color(0.92, 0.85, 0.68, 1.0)
|
||||||
inner.border_color = Color(0.75, 0.62, 0.38, 1.0)
|
inner.border_color = Color(0.75, 0.62, 0.38, 1.0)
|
||||||
inner.set_border_width_all(4)
|
inner.set_border_width_all(4)
|
||||||
inner.corner_radius_top_left = 68
|
inner.set_corner_radius_all(INVENTORY_INNER_CORNER_RADIUS)
|
||||||
inner.corner_radius_top_right = 48
|
|
||||||
inner.corner_radius_bottom_right = 72
|
|
||||||
inner.corner_radius_bottom_left = 52
|
|
||||||
_bag_inner_liner.add_theme_stylebox_override("panel", inner)
|
_bag_inner_liner.add_theme_stylebox_override("panel", inner)
|
||||||
func _apply_logbook_styles() -> void:
|
func _apply_logbook_styles() -> void:
|
||||||
var backing := StyleBoxFlat.new()
|
var backing := StyleBoxFlat.new()
|
||||||
|
|
@ -1312,8 +1356,10 @@ func _update_shell_layout() -> void:
|
||||||
_compact_layout = compact
|
_compact_layout = compact
|
||||||
var reference_size := DESKTOP_REFERENCE_SIZE
|
var reference_size := DESKTOP_REFERENCE_SIZE
|
||||||
_presentation_scale_root.size = reference_size
|
_presentation_scale_root.size = reference_size
|
||||||
_presentation_scale_root.scale = Vector2.ONE
|
if not _transitioning:
|
||||||
|
_presentation_scale_root.scale = Vector2.ONE
|
||||||
_presentation_scale_root.position = Vector2.ZERO
|
_presentation_scale_root.position = Vector2.ZERO
|
||||||
|
_presentation_scale_root.pivot_offset = reference_size * 0.5
|
||||||
_content_shell.position = Vector2(14.0, 92.0) if compact else Vector2(42.0, 104.0)
|
_content_shell.position = Vector2(14.0, 92.0) if compact else Vector2(42.0, 104.0)
|
||||||
_content_shell.size = Vector2(612.0, 286.0) if compact else Vector2(1196.0, 478.0)
|
_content_shell.size = Vector2(612.0, 286.0) if compact else Vector2(1196.0, 478.0)
|
||||||
_presentation_rest_position = _content_shell.position
|
_presentation_rest_position = _content_shell.position
|
||||||
|
|
@ -1329,6 +1375,12 @@ func _update_shell_layout() -> void:
|
||||||
_cooler_page.size = reference_size
|
_cooler_page.size = reference_size
|
||||||
_cooler_page.position = Vector2.ZERO
|
_cooler_page.position = Vector2.ZERO
|
||||||
_cooler_rest_position = Vector2.ZERO
|
_cooler_rest_position = Vector2.ZERO
|
||||||
|
# The Bag shell has the widest 88 px upper-left curve. Eight more pixels
|
||||||
|
# place every tab flange behind a straight section of the shared panel.
|
||||||
|
_inventory_sub_tabs.position = (
|
||||||
|
INVENTORY_MAIN_POSITION
|
||||||
|
+ Vector2(INVENTORY_TAB_LEFT_INSET, -30.0)
|
||||||
|
)
|
||||||
_layout_cooler_fish(false)
|
_layout_cooler_fish(false)
|
||||||
_cooler_outer_wall.position = INVENTORY_MAIN_POSITION
|
_cooler_outer_wall.position = INVENTORY_MAIN_POSITION
|
||||||
_cooler_outer_wall.size = INVENTORY_MAIN_SIZE
|
_cooler_outer_wall.size = INVENTORY_MAIN_SIZE
|
||||||
|
|
@ -1447,7 +1499,7 @@ func _update_shell_layout() -> void:
|
||||||
)
|
)
|
||||||
_bag_filter_tabs.size = Vector2(320.0, INVENTORY_HEADER_HEIGHT)
|
_bag_filter_tabs.size = Vector2(320.0, INVENTORY_HEADER_HEIGHT)
|
||||||
_bag_host.custom_minimum_size = (
|
_bag_host.custom_minimum_size = (
|
||||||
Vector2(520.0, 152.0) if compact else Vector2(796.0, 358.0)
|
Vector2(520.0, 152.0) if compact else Vector2(788.0, 358.0)
|
||||||
)
|
)
|
||||||
_bag_scroll.vertical_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED
|
_bag_scroll.vertical_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED
|
||||||
_bag_detail_constellation.position = INVENTORY_NOTEPAD_POSITION
|
_bag_detail_constellation.position = INVENTORY_NOTEPAD_POSITION
|
||||||
|
|
@ -1585,80 +1637,30 @@ func _layout_cooler_selection_text(compact: bool) -> void:
|
||||||
func _begin_menu_entry() -> void:
|
func _begin_menu_entry() -> void:
|
||||||
_transitioning = true
|
_transitioning = true
|
||||||
_set_shell_interactive(false)
|
_set_shell_interactive(false)
|
||||||
|
_reset_page_transition_visuals()
|
||||||
_animate_inventory_tab_entry()
|
_animate_inventory_tab_entry()
|
||||||
set_process(true)
|
set_process(true)
|
||||||
var generation: int = _transition_generation
|
var generation: int = _transition_generation
|
||||||
var start_offset: float = (
|
_presentation_scale_root.pivot_offset = (
|
||||||
_presentation_scale_root.size.y + TRANSITION_SAFE_MARGIN
|
_presentation_scale_root.size * 0.5
|
||||||
)
|
)
|
||||||
_content_shell.position = _presentation_rest_position + Vector2.DOWN * start_offset
|
_presentation_scale_root.modulate.a = 0.0
|
||||||
_cooler_page.position = _cooler_rest_position + Vector2.DOWN * start_offset
|
_presentation_scale_root.scale = (
|
||||||
_bag_page.position = _bag_rest_position + Vector2.DOWN * start_offset
|
Vector2.ONE * UIMotion.PLAYER_MENU_ENTER_SCALE
|
||||||
_tackle_box_page.position = (
|
|
||||||
_tackle_rest_position + Vector2.DOWN * start_offset
|
|
||||||
)
|
)
|
||||||
_logbook_page.position = _logbook_rest_position + Vector2.DOWN * start_offset
|
|
||||||
_mail_page.position = _mail_rest_position + Vector2.DOWN * start_offset
|
|
||||||
_profile_page.position = _profile_rest_position + Vector2.DOWN * start_offset
|
|
||||||
_players_page.position = Vector2.DOWN * start_offset
|
|
||||||
var navigation_rest: Vector2 = _navigation_cluster.position
|
|
||||||
_navigation_cluster.position = navigation_rest + Vector2.DOWN * start_offset
|
|
||||||
var transition_duration := UIMotion.bubble_duration(start_offset)
|
|
||||||
_presentation_tween = create_tween().set_parallel(true)
|
_presentation_tween = create_tween().set_parallel(true)
|
||||||
_presentation_tween.tween_property(
|
_presentation_tween.tween_property(
|
||||||
_content_shell,
|
_presentation_scale_root,
|
||||||
"position",
|
"modulate:a",
|
||||||
_presentation_rest_position,
|
1.0,
|
||||||
transition_duration
|
UIMotion.PLAYER_MENU_ENTER_DURATION,
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT)
|
||||||
_presentation_tween.tween_property(
|
_presentation_tween.tween_property(
|
||||||
_cooler_page,
|
_presentation_scale_root,
|
||||||
"position",
|
"scale",
|
||||||
_cooler_rest_position,
|
Vector2.ONE,
|
||||||
transition_duration
|
UIMotion.PLAYER_MENU_ENTER_DURATION,
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT)
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_bag_page,
|
|
||||||
"position",
|
|
||||||
_bag_rest_position,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_tackle_box_page,
|
|
||||||
"position",
|
|
||||||
_tackle_rest_position,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_logbook_page,
|
|
||||||
"position",
|
|
||||||
_logbook_rest_position,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_mail_page,
|
|
||||||
"position",
|
|
||||||
_mail_rest_position,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_profile_page,
|
|
||||||
"position",
|
|
||||||
_profile_rest_position,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_players_page,
|
|
||||||
"position",
|
|
||||||
Vector2.ZERO,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_navigation_cluster,
|
|
||||||
"position",
|
|
||||||
navigation_rest,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.chain().tween_callback(
|
_presentation_tween.chain().tween_callback(
|
||||||
_finish_menu_entry.bind(generation)
|
_finish_menu_entry.bind(generation)
|
||||||
)
|
)
|
||||||
|
|
@ -1682,71 +1684,24 @@ func _begin_menu_exit(reason: CloseReason, restore_controls: bool) -> void:
|
||||||
_transitioning = true
|
_transitioning = true
|
||||||
_set_shell_interactive(false)
|
_set_shell_interactive(false)
|
||||||
_settle_inventory_tabs_for_close()
|
_settle_inventory_tabs_for_close()
|
||||||
|
if _current_section == Section.LOGBOOK:
|
||||||
|
_catalog_logbook.deactivate()
|
||||||
get_viewport().gui_release_focus()
|
get_viewport().gui_release_focus()
|
||||||
var generation: int = _transition_generation
|
var generation: int = _transition_generation
|
||||||
var closing_generation: int = _menu_generation
|
var closing_generation: int = _menu_generation
|
||||||
var end_y: float = -maxf(
|
|
||||||
_content_shell.size.y,
|
|
||||||
_navigation_cluster.size.y
|
|
||||||
) - TRANSITION_SAFE_MARGIN
|
|
||||||
var transition_duration := UIMotion.bubble_duration(
|
|
||||||
end_y - _navigation_cluster.position.y
|
|
||||||
)
|
|
||||||
_presentation_tween = create_tween().set_parallel(true)
|
_presentation_tween = create_tween().set_parallel(true)
|
||||||
_presentation_tween.tween_property(
|
_presentation_tween.tween_property(
|
||||||
_content_shell,
|
_presentation_scale_root,
|
||||||
"position:y",
|
"modulate:a",
|
||||||
end_y,
|
0.0,
|
||||||
transition_duration
|
UIMotion.PLAYER_MENU_EXIT_DURATION,
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN)
|
||||||
_presentation_tween.tween_property(
|
_presentation_tween.tween_property(
|
||||||
_cooler_page,
|
_presentation_scale_root,
|
||||||
"position:y",
|
"scale",
|
||||||
-_cooler_page.size.y - TRANSITION_SAFE_MARGIN,
|
Vector2.ONE * UIMotion.PLAYER_MENU_EXIT_SCALE,
|
||||||
transition_duration
|
UIMotion.PLAYER_MENU_EXIT_DURATION,
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN)
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_bag_page,
|
|
||||||
"position:y",
|
|
||||||
-_bag_page.size.y - TRANSITION_SAFE_MARGIN,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_tackle_box_page,
|
|
||||||
"position:y",
|
|
||||||
-_tackle_box_page.size.y - TRANSITION_SAFE_MARGIN,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_logbook_page,
|
|
||||||
"position:y",
|
|
||||||
-_logbook_page.size.y - TRANSITION_SAFE_MARGIN,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_mail_page,
|
|
||||||
"position:y",
|
|
||||||
-_mail_page.size.y - TRANSITION_SAFE_MARGIN,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_profile_page,
|
|
||||||
"position:y",
|
|
||||||
-_profile_page.size.y - TRANSITION_SAFE_MARGIN,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_players_page,
|
|
||||||
"position:y",
|
|
||||||
-_players_page.size.y - TRANSITION_SAFE_MARGIN,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.tween_property(
|
|
||||||
_navigation_cluster,
|
|
||||||
"position:y",
|
|
||||||
-_navigation_cluster.size.y - TRANSITION_SAFE_MARGIN,
|
|
||||||
transition_duration
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_presentation_tween.chain().tween_callback(
|
_presentation_tween.chain().tween_callback(
|
||||||
_finish_menu_exit.bind(
|
_finish_menu_exit.bind(
|
||||||
generation,
|
generation,
|
||||||
|
|
@ -1781,6 +1736,8 @@ func _finish_close(
|
||||||
_page_transitioning = false
|
_page_transitioning = false
|
||||||
_bag_drag_active = false
|
_bag_drag_active = false
|
||||||
_reset_page_transition_visuals()
|
_reset_page_transition_visuals()
|
||||||
|
_presentation_scale_root.modulate.a = 1.0
|
||||||
|
_presentation_scale_root.scale = Vector2.ONE
|
||||||
visible = false
|
visible = false
|
||||||
set_process(false)
|
set_process(false)
|
||||||
get_viewport().gui_release_focus()
|
get_viewport().gui_release_focus()
|
||||||
|
|
@ -1838,74 +1795,59 @@ func _begin_page_transition(section: Section) -> void:
|
||||||
_cancel_page_tween()
|
_cancel_page_tween()
|
||||||
_page_transitioning = true
|
_page_transitioning = true
|
||||||
_set_content_interactive(false)
|
_set_content_interactive(false)
|
||||||
if _is_inventory_section(_current_section) and not _is_inventory_section(section):
|
get_viewport().gui_release_focus()
|
||||||
|
var outgoing_section: Section = _current_section
|
||||||
|
var outgoing_inventory: bool = _is_inventory_section(outgoing_section)
|
||||||
|
var incoming_inventory: bool = _is_inventory_section(section)
|
||||||
|
if outgoing_inventory and not incoming_inventory:
|
||||||
_settle_inventory_tabs_for_close()
|
_settle_inventory_tabs_for_close()
|
||||||
_set_navigation_target(section)
|
_set_navigation_target(section)
|
||||||
var generation: int = _page_transition_generation
|
var generation: int = _page_transition_generation
|
||||||
_page_outgoing_root = _get_section_root(_current_section)
|
_page_outgoing_content_root = _get_section_root(outgoing_section)
|
||||||
_page_incoming_root = _get_section_root(section)
|
_page_outgoing_root = (
|
||||||
_page_hosts_shared = _page_outgoing_root == _page_incoming_root
|
_inventory_transition_group
|
||||||
var outgoing_rest: Vector2 = _get_section_rest_position(_current_section)
|
if outgoing_inventory and not incoming_inventory
|
||||||
|
else _page_outgoing_content_root
|
||||||
|
)
|
||||||
|
_page_incoming_root = (
|
||||||
|
_inventory_transition_group
|
||||||
|
if incoming_inventory and not outgoing_inventory
|
||||||
|
else _get_section_root(section)
|
||||||
|
)
|
||||||
|
var outgoing_rest: Vector2 = _get_section_rest_position(outgoing_section)
|
||||||
var incoming_rest: Vector2 = _get_section_rest_position(section)
|
var incoming_rest: Vector2 = _get_section_rest_position(section)
|
||||||
if (
|
_show_section_immediate(section)
|
||||||
_is_inventory_section(_current_section)
|
if outgoing_inventory and not incoming_inventory:
|
||||||
and _is_inventory_section(section)
|
# Immediate page selection hides Inventory. Restore the outgoing content
|
||||||
):
|
# beneath its still-opaque masking group for the coordinated fade-out.
|
||||||
_show_section_immediate(section)
|
_page_outgoing_content_root.visible = true
|
||||||
_page_outgoing_root.visible = true
|
_inventory_sub_tabs.visible = true
|
||||||
_page_incoming_root.visible = true
|
_inventory_transition_group.visible = true
|
||||||
_page_outgoing_root.position = outgoing_rest
|
_page_outgoing_root.visible = true
|
||||||
_page_incoming_root.position = incoming_rest
|
_page_incoming_root.visible = true
|
||||||
_page_outgoing_root.modulate.a = 1.0
|
_page_outgoing_root.position = outgoing_rest
|
||||||
_page_incoming_root.modulate.a = 0.0
|
_page_incoming_root.position = incoming_rest
|
||||||
_page_tween = create_tween()
|
_page_outgoing_root.modulate.a = 1.0
|
||||||
_page_tween.tween_property(
|
_page_incoming_root.modulate.a = 0.0
|
||||||
_page_outgoing_root,
|
if incoming_inventory and not outgoing_inventory:
|
||||||
"modulate:a",
|
_animate_inventory_tab_entry()
|
||||||
0.0,
|
var duration: float = (
|
||||||
UIMotion.UTILITY_ENTER_DURATION,
|
UIMotion.PLAYER_MENU_INVENTORY_DURATION
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
if outgoing_inventory and incoming_inventory
|
||||||
_page_tween.parallel().tween_property(
|
else UIMotion.PLAYER_MENU_PAGE_DURATION
|
||||||
_page_incoming_root,
|
)
|
||||||
"modulate:a",
|
_page_tween = create_tween().set_parallel(true)
|
||||||
1.0,
|
|
||||||
UIMotion.UTILITY_ENTER_DURATION,
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_page_tween.finished.connect(
|
|
||||||
_finish_page_transition.bind(generation),
|
|
||||||
CONNECT_ONE_SHOT,
|
|
||||||
)
|
|
||||||
return
|
|
||||||
if not _page_hosts_shared:
|
|
||||||
_page_incoming_root.position = incoming_rest + Vector2.DOWN * 18.0
|
|
||||||
_page_incoming_root.modulate.a = 0.0
|
|
||||||
_page_tween = create_tween()
|
|
||||||
_page_tween.tween_property(
|
_page_tween.tween_property(
|
||||||
_page_outgoing_root,
|
_page_outgoing_root,
|
||||||
"modulate:a",
|
"modulate:a",
|
||||||
0.0,
|
0.0,
|
||||||
PAGE_OUT_DURATION
|
duration,
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
||||||
_page_tween.parallel().tween_property(
|
|
||||||
_page_outgoing_root,
|
|
||||||
"position:y",
|
|
||||||
outgoing_rest.y - 18.0,
|
|
||||||
PAGE_OUT_DURATION
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_page_tween.tween_callback(
|
|
||||||
_swap_page.bind(section, generation)
|
|
||||||
)
|
|
||||||
_page_tween.tween_property(
|
_page_tween.tween_property(
|
||||||
_page_incoming_root,
|
_page_incoming_root,
|
||||||
"modulate:a",
|
"modulate:a",
|
||||||
1.0,
|
1.0,
|
||||||
PAGE_IN_DURATION
|
duration,
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
|
||||||
_page_tween.parallel().tween_property(
|
|
||||||
_page_incoming_root,
|
|
||||||
"position",
|
|
||||||
incoming_rest,
|
|
||||||
PAGE_IN_DURATION
|
|
||||||
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
||||||
_page_tween.finished.connect(
|
_page_tween.finished.connect(
|
||||||
_finish_page_transition.bind(generation),
|
_finish_page_transition.bind(generation),
|
||||||
|
|
@ -1913,19 +1855,6 @@ func _begin_page_transition(section: Section) -> void:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
func _swap_page(section: Section, generation: int) -> void:
|
|
||||||
if generation != _page_transition_generation or not visible:
|
|
||||||
return
|
|
||||||
_show_section_immediate(section)
|
|
||||||
if _is_inventory_section(section):
|
|
||||||
_animate_inventory_tab_entry()
|
|
||||||
if _page_hosts_shared:
|
|
||||||
_page_incoming_root.position = (
|
|
||||||
_presentation_rest_position + Vector2.DOWN * 18.0
|
|
||||||
)
|
|
||||||
_page_incoming_root.modulate.a = 0.0
|
|
||||||
|
|
||||||
|
|
||||||
func _finish_page_transition(generation: int) -> void:
|
func _finish_page_transition(generation: int) -> void:
|
||||||
if generation != _page_transition_generation or not visible:
|
if generation != _page_transition_generation or not visible:
|
||||||
return
|
return
|
||||||
|
|
@ -1934,8 +1863,16 @@ func _finish_page_transition(generation: int) -> void:
|
||||||
if (
|
if (
|
||||||
_page_outgoing_root != null
|
_page_outgoing_root != null
|
||||||
and _page_outgoing_root != _page_incoming_root
|
and _page_outgoing_root != _page_incoming_root
|
||||||
|
and _page_outgoing_root != _inventory_transition_group
|
||||||
):
|
):
|
||||||
_page_outgoing_root.visible = false
|
_page_outgoing_root.visible = false
|
||||||
|
if (
|
||||||
|
_page_outgoing_content_root != null
|
||||||
|
and not _is_inventory_section(_current_section)
|
||||||
|
):
|
||||||
|
_page_outgoing_content_root.visible = false
|
||||||
|
_inventory_sub_tabs.visible = _is_inventory_section(_current_section)
|
||||||
|
_inventory_sub_tabs.modulate.a = 1.0
|
||||||
_reset_page_transition_visuals()
|
_reset_page_transition_visuals()
|
||||||
_set_content_interactive(true)
|
_set_content_interactive(true)
|
||||||
_focus_current_section()
|
_focus_current_section()
|
||||||
|
|
@ -1991,7 +1928,7 @@ func _set_content_interactive(interactive: bool) -> void:
|
||||||
)
|
)
|
||||||
tab.mouse_filter = (
|
tab.mouse_filter = (
|
||||||
Control.MOUSE_FILTER_STOP
|
Control.MOUSE_FILTER_STOP
|
||||||
if tab_interactive
|
if tab_interactive and not tab.button_pressed
|
||||||
else Control.MOUSE_FILTER_IGNORE
|
else Control.MOUSE_FILTER_IGNORE
|
||||||
)
|
)
|
||||||
_logbook_page.mouse_filter = (
|
_logbook_page.mouse_filter = (
|
||||||
|
|
@ -2084,8 +2021,13 @@ func _reset_page_transition_visuals() -> void:
|
||||||
var page: Control = _get_section_root(section)
|
var page: Control = _get_section_root(section)
|
||||||
page.position = _get_section_rest_position(section)
|
page.position = _get_section_rest_position(section)
|
||||||
page.modulate.a = 1.0
|
page.modulate.a = 1.0
|
||||||
|
if _inventory_transition_group != null:
|
||||||
|
_inventory_transition_group.modulate.a = 1.0
|
||||||
|
_inventory_transition_group.visible = true
|
||||||
|
_inventory_sub_tabs.modulate.a = 1.0
|
||||||
_page_outgoing_root = null
|
_page_outgoing_root = null
|
||||||
_page_incoming_root = null
|
_page_incoming_root = null
|
||||||
|
_page_outgoing_content_root = null
|
||||||
|
|
||||||
|
|
||||||
func _on_sort_selected(index: int, source: OptionButton) -> void:
|
func _on_sort_selected(index: int, source: OptionButton) -> void:
|
||||||
|
|
|
||||||
|
|
@ -68,16 +68,16 @@ unique_name_in_owner = true
|
||||||
visible = false
|
visible = false
|
||||||
z_index = 40
|
z_index = 40
|
||||||
layout_mode = 0
|
layout_mode = 0
|
||||||
offset_left = 54.0
|
offset_left = 150.0
|
||||||
offset_top = 126.0
|
offset_top = 136.0
|
||||||
offset_right = 504.0
|
offset_right = 534.0
|
||||||
offset_bottom = 184.0
|
offset_bottom = 174.0
|
||||||
mouse_filter = 1
|
mouse_filter = 1
|
||||||
theme_override_constants/separation = 8
|
theme_override_constants/separation = 6
|
||||||
|
|
||||||
[node name="CoolerSubTab" type="Button" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot/InventorySubTabs"]
|
[node name="CoolerSubTab" type="Button" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot/InventorySubTabs"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
custom_minimum_size = Vector2(132, 58)
|
custom_minimum_size = Vector2(124, 38)
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
toggle_mode = true
|
toggle_mode = true
|
||||||
button_group = null
|
button_group = null
|
||||||
|
|
@ -86,21 +86,23 @@ script = ExtResource("23_organizer_tab")
|
||||||
|
|
||||||
[node name="BagSubTab" type="Button" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot/InventorySubTabs"]
|
[node name="BagSubTab" type="Button" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot/InventorySubTabs"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
custom_minimum_size = Vector2(132, 58)
|
custom_minimum_size = Vector2(124, 38)
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
toggle_mode = true
|
toggle_mode = true
|
||||||
button_group = null
|
button_group = null
|
||||||
text = "Bag"
|
text = "Equipment"
|
||||||
script = ExtResource("23_organizer_tab")
|
script = ExtResource("23_organizer_tab")
|
||||||
|
palette_index = 2
|
||||||
|
|
||||||
[node name="TackleSubTab" type="Button" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot/InventorySubTabs"]
|
[node name="TackleSubTab" type="Button" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot/InventorySubTabs"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
custom_minimum_size = Vector2(154, 58)
|
custom_minimum_size = Vector2(124, 38)
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
toggle_mode = true
|
toggle_mode = true
|
||||||
button_group = null
|
button_group = null
|
||||||
text = "Tackle Box"
|
text = "Tackle"
|
||||||
script = ExtResource("23_organizer_tab")
|
script = ExtResource("23_organizer_tab")
|
||||||
|
palette_index = 1
|
||||||
|
|
||||||
[node name="CoolerPage" type="Control" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot"]
|
[node name="CoolerPage" type="Control" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
|
|
@ -541,7 +543,7 @@ horizontal_scroll_mode = 0
|
||||||
|
|
||||||
[node name="BagHost" type="Control" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot/BagPage/BagOuterWall/BagOuterMargin/BagInnerLiner/BagInnerMargin/BagScroll"]
|
[node name="BagHost" type="Control" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot/BagPage/BagOuterWall/BagOuterMargin/BagInnerLiner/BagInnerMargin/BagScroll"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
custom_minimum_size = Vector2(796, 358)
|
custom_minimum_size = Vector2(788, 358)
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
mouse_filter = 1
|
mouse_filter = 1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,6 @@ enum PresentationMode {
|
||||||
@onready var _invert_y_toggle: BubbleButton = %InvertYToggle
|
@onready var _invert_y_toggle: BubbleButton = %InvertYToggle
|
||||||
@onready var _auto_click_toggle: BubbleButton = %AutoClickToggle
|
@onready var _auto_click_toggle: BubbleButton = %AutoClickToggle
|
||||||
@onready var _auto_click_interval: BubbleButton = %AutoClickIntervalValue
|
@onready var _auto_click_interval: BubbleButton = %AutoClickIntervalValue
|
||||||
@onready var _readable_font_toggle: BubbleButton = %ReadableFontToggle
|
|
||||||
|
|
||||||
@onready var _world_options: Array[BubbleButton] = [
|
@onready var _world_options: Array[BubbleButton] = [
|
||||||
%WorldLegible,
|
%WorldLegible,
|
||||||
|
|
@ -149,7 +148,6 @@ func _ready() -> void:
|
||||||
)
|
)
|
||||||
_invert_y_toggle.pressed.connect(_toggle_invert_y)
|
_invert_y_toggle.pressed.connect(_toggle_invert_y)
|
||||||
_auto_click_toggle.pressed.connect(_toggle_auto_click)
|
_auto_click_toggle.pressed.connect(_toggle_auto_click)
|
||||||
_readable_font_toggle.pressed.connect(_toggle_readable_font)
|
|
||||||
for control: Control in [_auto_click_toggle, _auto_click_interval]:
|
for control: Control in [_auto_click_toggle, _auto_click_interval]:
|
||||||
control.mouse_entered.connect(
|
control.mouse_entered.connect(
|
||||||
_show_accessibility_helper.bind(&"auto_click")
|
_show_accessibility_helper.bind(&"auto_click")
|
||||||
|
|
@ -157,12 +155,6 @@ func _ready() -> void:
|
||||||
control.focus_entered.connect(
|
control.focus_entered.connect(
|
||||||
_show_accessibility_helper.bind(&"auto_click")
|
_show_accessibility_helper.bind(&"auto_click")
|
||||||
)
|
)
|
||||||
_readable_font_toggle.mouse_entered.connect(
|
|
||||||
_show_accessibility_helper.bind(&"alternate_font")
|
|
||||||
)
|
|
||||||
_readable_font_toggle.focus_entered.connect(
|
|
||||||
_show_accessibility_helper.bind(&"alternate_font")
|
|
||||||
)
|
|
||||||
%IntervalDecrease.pressed.connect(_adjust_auto_click_interval.bind(-1))
|
%IntervalDecrease.pressed.connect(_adjust_auto_click_interval.bind(-1))
|
||||||
%IntervalIncrease.pressed.connect(_adjust_auto_click_interval.bind(1))
|
%IntervalIncrease.pressed.connect(_adjust_auto_click_interval.bind(1))
|
||||||
_auto_click_interval.pressed.connect(
|
_auto_click_interval.pressed.connect(
|
||||||
|
|
@ -685,9 +677,6 @@ func _load_controls() -> void:
|
||||||
_mouse_sensitivity = settings.mouse_camera_sensitivity
|
_mouse_sensitivity = settings.mouse_camera_sensitivity
|
||||||
_controller_sensitivity = settings.controller_camera_sensitivity
|
_controller_sensitivity = settings.controller_camera_sensitivity
|
||||||
_invert_camera_y = settings.invert_camera_y
|
_invert_camera_y = settings.invert_camera_y
|
||||||
_readable_font_toggle.button_pressed = (
|
|
||||||
settings.use_readable_interface_font
|
|
||||||
)
|
|
||||||
_refresh_value_labels()
|
_refresh_value_labels()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -715,14 +704,6 @@ func _refresh_value_labels() -> void:
|
||||||
"accessibility\nauto-click\n"
|
"accessibility\nauto-click\n"
|
||||||
+ ("on" if _auto_click_enabled else "off")
|
+ ("on" if _auto_click_enabled else "off")
|
||||||
)
|
)
|
||||||
_readable_font_toggle.text = (
|
|
||||||
"alternate\nfont\n"
|
|
||||||
+ (
|
|
||||||
"on"
|
|
||||||
if settings.use_readable_interface_font
|
|
||||||
else "off"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
_auto_click_interval.text = (
|
_auto_click_interval.text = (
|
||||||
"auto-click\ninterval\n%.2f s" % _auto_click_interval_value
|
"auto-click\ninterval\n%.2f s" % _auto_click_interval_value
|
||||||
)
|
)
|
||||||
|
|
@ -734,16 +715,11 @@ func _refresh_value_labels() -> void:
|
||||||
_ui_options[index].button_pressed = index + 1 == settings.ui_pixel_size
|
_ui_options[index].button_pressed = index + 1 == settings.ui_pixel_size
|
||||||
|
|
||||||
|
|
||||||
func _show_accessibility_helper(kind: StringName) -> void:
|
func _show_accessibility_helper(_kind: StringName) -> void:
|
||||||
var helper := %IntervalHelp as BubbleButton
|
var helper := %IntervalHelp as BubbleButton
|
||||||
if kind == &"alternate_font":
|
helper.text = (
|
||||||
helper.text = (
|
"Lower intervals click\nbarriers faster\nwhile held."
|
||||||
"The quick brown fox\njumps over the lazy dog.\n0123456789"
|
)
|
||||||
)
|
|
||||||
else:
|
|
||||||
helper.text = (
|
|
||||||
"Lower intervals click\nbarriers faster\nwhile held."
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
func _style_data_page() -> void:
|
func _style_data_page() -> void:
|
||||||
|
|
@ -775,19 +751,6 @@ func _set_world_pixelation(pixel_size: int) -> void:
|
||||||
_refresh_value_labels()
|
_refresh_value_labels()
|
||||||
|
|
||||||
|
|
||||||
func _toggle_readable_font() -> void:
|
|
||||||
if _settings_manager == null:
|
|
||||||
return
|
|
||||||
var edited: PlayerSettings = _settings_manager.current_settings.copy()
|
|
||||||
edited.use_readable_interface_font = (
|
|
||||||
not edited.use_readable_interface_font
|
|
||||||
)
|
|
||||||
if not _settings_manager.apply_settings(edited):
|
|
||||||
_feedback.text = "failed to save accessibility settings."
|
|
||||||
return
|
|
||||||
_load_controls()
|
|
||||||
|
|
||||||
|
|
||||||
func _set_ui_pixelation(pixel_size: int) -> void:
|
func _set_ui_pixelation(pixel_size: int) -> void:
|
||||||
if _settings_manager == null:
|
if _settings_manager == null:
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -486,8 +486,8 @@ grow_horizontal = 2
|
||||||
grow_vertical = 2
|
grow_vertical = 2
|
||||||
script = ExtResource("3_page")
|
script = ExtResource("3_page")
|
||||||
page_id = &"accessibility"
|
page_id = &"accessibility"
|
||||||
bubble_paths = Array[NodePath]([NodePath("BubbleCluster/AutoClickToggle"), NodePath("BubbleCluster/IntervalDecrease"), NodePath("BubbleCluster/AutoClickIntervalValue"), NodePath("BubbleCluster/IntervalIncrease"), NodePath("BubbleCluster/ReadableFontToggle"), NodePath("BubbleCluster/IntervalHelp"), NodePath("BubbleCluster/AccessibilityBackButton")])
|
bubble_paths = Array[NodePath]([NodePath("BubbleCluster/AutoClickToggle"), NodePath("BubbleCluster/IntervalDecrease"), NodePath("BubbleCluster/AutoClickIntervalValue"), NodePath("BubbleCluster/IntervalIncrease"), NodePath("BubbleCluster/IntervalHelp"), NodePath("BubbleCluster/AccessibilityBackButton")])
|
||||||
focus_paths = Array[NodePath]([NodePath("BubbleCluster/AutoClickToggle"), NodePath("BubbleCluster/IntervalDecrease"), NodePath("BubbleCluster/AutoClickIntervalValue"), NodePath("BubbleCluster/IntervalIncrease"), NodePath("BubbleCluster/ReadableFontToggle"), NodePath("BubbleCluster/AccessibilityBackButton")])
|
focus_paths = Array[NodePath]([NodePath("BubbleCluster/AutoClickToggle"), NodePath("BubbleCluster/IntervalDecrease"), NodePath("BubbleCluster/AutoClickIntervalValue"), NodePath("BubbleCluster/IntervalIncrease"), NodePath("BubbleCluster/AccessibilityBackButton")])
|
||||||
initial_focus_path = NodePath("BubbleCluster/AutoClickToggle")
|
initial_focus_path = NodePath("BubbleCluster/AutoClickToggle")
|
||||||
back_focus_path = NodePath("BubbleCluster/AccessibilityBackButton")
|
back_focus_path = NodePath("BubbleCluster/AccessibilityBackButton")
|
||||||
|
|
||||||
|
|
@ -562,43 +562,6 @@ minimum_font_size = 13
|
||||||
maximum_font_size = 22
|
maximum_font_size = 22
|
||||||
motion_phase = 4.1
|
motion_phase = 4.1
|
||||||
|
|
||||||
[node name="ReadableFontToggle" parent="AccessibilityPage/BubbleCluster" instance=ExtResource("4_bubble")]
|
|
||||||
unique_name_in_owner = true
|
|
||||||
custom_minimum_size = Vector2(0, 0)
|
|
||||||
toggle_mode = true
|
|
||||||
text = "alternate\nfont\noff"
|
|
||||||
neutral_size = Vector2(150, 150)
|
|
||||||
desktop_anchor = Vector2(92, 405)
|
|
||||||
compact_anchor = Vector2(102, 374)
|
|
||||||
compact_minimum_size = Vector2(156, 118)
|
|
||||||
minimum_font_size = 13
|
|
||||||
maximum_font_size = 21
|
|
||||||
motion_phase = 4.6
|
|
||||||
|
|
||||||
[node name="ReadableFontSample" type="Label" parent="AccessibilityPage/BubbleCluster"]
|
|
||||||
visible = false
|
|
||||||
layout_mode = 0
|
|
||||||
offset_left = 250.0
|
|
||||||
offset_top = 20.0
|
|
||||||
offset_right = 700.0
|
|
||||||
offset_bottom = 82.0
|
|
||||||
mouse_filter = 2
|
|
||||||
text = "The quick brown fox jumps over the lazy dog.\n0123456789"
|
|
||||||
horizontal_alignment = 1
|
|
||||||
vertical_alignment = 1
|
|
||||||
autowrap_mode = 2
|
|
||||||
|
|
||||||
[node name="ReadableFontHelper" type="Label" parent="AccessibilityPage/BubbleCluster"]
|
|
||||||
visible = false
|
|
||||||
layout_mode = 0
|
|
||||||
offset_left = 250.0
|
|
||||||
offset_top = 82.0
|
|
||||||
offset_right = 700.0
|
|
||||||
offset_bottom = 112.0
|
|
||||||
mouse_filter = 2
|
|
||||||
text = "Uses a clearer font for menus and interface text."
|
|
||||||
horizontal_alignment = 1
|
|
||||||
|
|
||||||
[node name="AccessibilityBackButton" parent="AccessibilityPage/BubbleCluster" instance=ExtResource("4_bubble")]
|
[node name="AccessibilityBackButton" parent="AccessibilityPage/BubbleCluster" instance=ExtResource("4_bubble")]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
custom_minimum_size = Vector2(0, 0)
|
custom_minimum_size = Vector2(0, 0)
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,12 @@ const BUBBLE_TRANSITION_OVERLAP_DELAY: float = 0.05
|
||||||
const UTILITY_ENTER_DURATION: float = 0.19
|
const UTILITY_ENTER_DURATION: float = 0.19
|
||||||
const UTILITY_EXIT_DURATION: float = 0.15
|
const UTILITY_EXIT_DURATION: float = 0.15
|
||||||
const UTILITY_ENTER_SCALE: float = 0.97
|
const UTILITY_ENTER_SCALE: float = 0.97
|
||||||
|
const PLAYER_MENU_ENTER_DURATION: float = 0.16
|
||||||
|
const PLAYER_MENU_EXIT_DURATION: float = 0.14
|
||||||
|
const PLAYER_MENU_PAGE_DURATION: float = 0.12
|
||||||
|
const PLAYER_MENU_INVENTORY_DURATION: float = 0.10
|
||||||
|
const PLAYER_MENU_ENTER_SCALE: float = 0.985
|
||||||
|
const PLAYER_MENU_EXIT_SCALE: float = 0.99
|
||||||
|
|
||||||
|
|
||||||
static func bubble_duration(distance: float) -> float:
|
static func bubble_duration(distance: float) -> float:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue