From 0d50c324e93139812e8b343db462f3f8139ba442 Mon Sep 17 00:00:00 2001 From: Voyager Date: Sat, 8 Aug 2026 00:34:06 -0400 Subject: [PATCH] Refresh menus chat and player expression --- items/icons/equipment/64_cooler_plus.png | Bin 0 -> 3652 bytes .../icons/equipment/64_cooler_plus.png.import | 40 +++ jobs/player_job_service.gd | 50 ++- network/network_chat_service.gd | 15 + network/network_profile_preferences.gd | 39 ++- network/network_profile_service.gd | 66 +++- network/network_world_time_service.gd | 13 + player/animalese_voice_profiles.gd | 57 ++++ player/animalese_voice_profiles.gd.uid | 1 + player/player.gd | 191 ++++++++++- scripts/generate_placeholder_animalese.gd | 71 ++++ scripts/generate_placeholder_animalese.gd.uid | 1 + sound/dialogue/animalese/placeholder/a.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/a.wav.import | 24 ++ sound/dialogue/animalese/placeholder/b.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/b.wav.import | 24 ++ sound/dialogue/animalese/placeholder/c.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/c.wav.import | 24 ++ sound/dialogue/animalese/placeholder/d.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/d.wav.import | 24 ++ sound/dialogue/animalese/placeholder/e.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/e.wav.import | 24 ++ sound/dialogue/animalese/placeholder/f.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/f.wav.import | 24 ++ .../animalese/placeholder/fallback.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/fallback.wav.import | 24 ++ sound/dialogue/animalese/placeholder/g.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/g.wav.import | 24 ++ sound/dialogue/animalese/placeholder/h.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/h.wav.import | 24 ++ sound/dialogue/animalese/placeholder/i.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/i.wav.import | 24 ++ sound/dialogue/animalese/placeholder/j.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/j.wav.import | 24 ++ sound/dialogue/animalese/placeholder/k.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/k.wav.import | 24 ++ sound/dialogue/animalese/placeholder/l.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/l.wav.import | 24 ++ sound/dialogue/animalese/placeholder/m.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/m.wav.import | 24 ++ sound/dialogue/animalese/placeholder/n.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/n.wav.import | 24 ++ sound/dialogue/animalese/placeholder/o.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/o.wav.import | 24 ++ sound/dialogue/animalese/placeholder/p.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/p.wav.import | 24 ++ sound/dialogue/animalese/placeholder/q.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/q.wav.import | 24 ++ sound/dialogue/animalese/placeholder/r.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/r.wav.import | 24 ++ sound/dialogue/animalese/placeholder/s.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/s.wav.import | 24 ++ sound/dialogue/animalese/placeholder/t.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/t.wav.import | 24 ++ sound/dialogue/animalese/placeholder/u.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/u.wav.import | 24 ++ sound/dialogue/animalese/placeholder/v.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/v.wav.import | 24 ++ sound/dialogue/animalese/placeholder/w.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/w.wav.import | 24 ++ sound/dialogue/animalese/placeholder/x.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/x.wav.import | 24 ++ sound/dialogue/animalese/placeholder/y.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/y.wav.import | 24 ++ sound/dialogue/animalese/placeholder/z.wav | Bin 0 -> 2470 bytes .../animalese/placeholder/z.wav.import | 24 ++ ui/animalese_voice.gd | 123 +++++++ ui/animalese_voice.gd.uid | 1 + ui/assets/logbook/ui_logbook.png | Bin 0 -> 116013 bytes ui/assets/logbook/ui_logbook.png.import | 40 +++ ui/chat_ui.gd | 167 +++++++++- ui/components/bubble_menu/bubble_button.gd | 27 ++ ui/fishing_shop.tscn | 8 +- ui/game_ui.gd | 241 +++++++++++++- ui/game_ui.tscn | 131 +++++++- ui/icons/pictograms/arrow_dark_down_full.png | Bin 0 -> 1883 bytes .../arrow_dark_down_full.png.import | 40 +++ ui/icons/pictograms/arrow_dark_up_full.png | Bin 0 -> 1863 bytes .../pictograms/arrow_dark_up_full.png.import | 40 +++ ui/icons/pictograms/arrow_light_down_more.png | Bin 0 -> 1866 bytes .../arrow_light_down_more.png.import | 40 +++ ui/icons/pictograms/arrow_light_left_more.png | Bin 0 -> 1765 bytes .../arrow_light_left_more.png.import | 40 +++ .../pictograms/arrow_light_right_more.png | Bin 0 -> 1841 bytes .../arrow_light_right_more.png.import | 40 +++ ui/icons/pictograms/arrow_light_up_more.png | Bin 0 -> 1816 bytes .../pictograms/arrow_light_up_more.png.import | 40 +++ ui/icons/pictograms/check_mark_dark.png | Bin 0 -> 1880 bytes .../pictograms/check_mark_dark.png.import | 40 +++ ui/icons/pictograms/check_mark_light.png | Bin 0 -> 1899 bytes .../pictograms/check_mark_light.png.import | 40 +++ ui/icons/pictograms/online_dark.png | Bin 0 -> 2045 bytes ui/icons/pictograms/online_dark.png.import | 40 +++ ui/icons/pictograms/save_dark.png | Bin 0 -> 1919 bytes ui/icons/pictograms/save_dark.png.import | 40 +++ ui/icons/pictograms/settings_dark.png | Bin 0 -> 1967 bytes ui/icons/pictograms/settings_dark.png.import | 40 +++ ui/icons/pictograms/undo_dark.png | Bin 0 -> 1708 bytes ui/icons/pictograms/undo_dark.png.import | 40 +++ ui/icons/pictograms/undo_light.png | Bin 0 -> 1708 bytes ui/icons/pictograms/undo_light.png.import | 40 +++ ui/icons/pictograms/x_dark.png | Bin 0 -> 2406 bytes ui/icons/pictograms/x_dark.png.import | 40 +++ ui/icons/pictograms/x_light.png | Bin 0 -> 2583 bytes ui/icons/pictograms/x_light.png.import | 40 +++ ui/icons/weather/weather_clear_day.png | Bin 0 -> 1427 bytes ui/icons/weather/weather_clear_day.png.import | 40 +++ ui/icons/weather/weather_clear_night_full.png | Bin 0 -> 3475 bytes .../weather_clear_night_full.png.import | 40 +++ ui/icons/weather/weather_cloudy.png | Bin 0 -> 1449 bytes ui/icons/weather/weather_cloudy.png.import | 40 +++ ui/icons/weather/weather_fog.png | Bin 0 -> 2433 bytes ui/icons/weather/weather_fog.png.import | 40 +++ ui/icons/weather/weather_rain.png | Bin 0 -> 1684 bytes ui/icons/weather/weather_rain.png.import | 40 +++ ui/logbook_page.gd | 305 ++++++++++++++---- ui/pause_menu.tscn | 29 +- ui/player_menu.tscn | 13 +- ui/profile_page.gd | 153 ++++++++- ui/settings_panel.tscn | 12 +- ui/surface_drawing_toolbar.tscn | 20 +- ui/the_net_page.gd | 12 +- ui/title_screen.tscn | 20 +- ui/typewriter_reveal.gd | 47 +++ ui/typewriter_reveal.gd.uid | 1 + ui/weather_icon.gd | 83 ++--- world/world_time_service.gd | 18 +- 127 files changed, 3222 insertions(+), 221 deletions(-) create mode 100644 items/icons/equipment/64_cooler_plus.png create mode 100644 items/icons/equipment/64_cooler_plus.png.import create mode 100644 player/animalese_voice_profiles.gd create mode 100644 player/animalese_voice_profiles.gd.uid create mode 100644 scripts/generate_placeholder_animalese.gd create mode 100644 scripts/generate_placeholder_animalese.gd.uid create mode 100644 sound/dialogue/animalese/placeholder/a.wav create mode 100644 sound/dialogue/animalese/placeholder/a.wav.import create mode 100644 sound/dialogue/animalese/placeholder/b.wav create mode 100644 sound/dialogue/animalese/placeholder/b.wav.import create mode 100644 sound/dialogue/animalese/placeholder/c.wav create mode 100644 sound/dialogue/animalese/placeholder/c.wav.import create mode 100644 sound/dialogue/animalese/placeholder/d.wav create mode 100644 sound/dialogue/animalese/placeholder/d.wav.import create mode 100644 sound/dialogue/animalese/placeholder/e.wav create mode 100644 sound/dialogue/animalese/placeholder/e.wav.import create mode 100644 sound/dialogue/animalese/placeholder/f.wav create mode 100644 sound/dialogue/animalese/placeholder/f.wav.import create mode 100644 sound/dialogue/animalese/placeholder/fallback.wav create mode 100644 sound/dialogue/animalese/placeholder/fallback.wav.import create mode 100644 sound/dialogue/animalese/placeholder/g.wav create mode 100644 sound/dialogue/animalese/placeholder/g.wav.import create mode 100644 sound/dialogue/animalese/placeholder/h.wav create mode 100644 sound/dialogue/animalese/placeholder/h.wav.import create mode 100644 sound/dialogue/animalese/placeholder/i.wav create mode 100644 sound/dialogue/animalese/placeholder/i.wav.import create mode 100644 sound/dialogue/animalese/placeholder/j.wav create mode 100644 sound/dialogue/animalese/placeholder/j.wav.import create mode 100644 sound/dialogue/animalese/placeholder/k.wav create mode 100644 sound/dialogue/animalese/placeholder/k.wav.import create mode 100644 sound/dialogue/animalese/placeholder/l.wav create mode 100644 sound/dialogue/animalese/placeholder/l.wav.import create mode 100644 sound/dialogue/animalese/placeholder/m.wav create mode 100644 sound/dialogue/animalese/placeholder/m.wav.import create mode 100644 sound/dialogue/animalese/placeholder/n.wav create mode 100644 sound/dialogue/animalese/placeholder/n.wav.import create mode 100644 sound/dialogue/animalese/placeholder/o.wav create mode 100644 sound/dialogue/animalese/placeholder/o.wav.import create mode 100644 sound/dialogue/animalese/placeholder/p.wav create mode 100644 sound/dialogue/animalese/placeholder/p.wav.import create mode 100644 sound/dialogue/animalese/placeholder/q.wav create mode 100644 sound/dialogue/animalese/placeholder/q.wav.import create mode 100644 sound/dialogue/animalese/placeholder/r.wav create mode 100644 sound/dialogue/animalese/placeholder/r.wav.import create mode 100644 sound/dialogue/animalese/placeholder/s.wav create mode 100644 sound/dialogue/animalese/placeholder/s.wav.import create mode 100644 sound/dialogue/animalese/placeholder/t.wav create mode 100644 sound/dialogue/animalese/placeholder/t.wav.import create mode 100644 sound/dialogue/animalese/placeholder/u.wav create mode 100644 sound/dialogue/animalese/placeholder/u.wav.import create mode 100644 sound/dialogue/animalese/placeholder/v.wav create mode 100644 sound/dialogue/animalese/placeholder/v.wav.import create mode 100644 sound/dialogue/animalese/placeholder/w.wav create mode 100644 sound/dialogue/animalese/placeholder/w.wav.import create mode 100644 sound/dialogue/animalese/placeholder/x.wav create mode 100644 sound/dialogue/animalese/placeholder/x.wav.import create mode 100644 sound/dialogue/animalese/placeholder/y.wav create mode 100644 sound/dialogue/animalese/placeholder/y.wav.import create mode 100644 sound/dialogue/animalese/placeholder/z.wav create mode 100644 sound/dialogue/animalese/placeholder/z.wav.import create mode 100644 ui/animalese_voice.gd create mode 100644 ui/animalese_voice.gd.uid create mode 100644 ui/assets/logbook/ui_logbook.png create mode 100644 ui/assets/logbook/ui_logbook.png.import create mode 100644 ui/icons/pictograms/arrow_dark_down_full.png create mode 100644 ui/icons/pictograms/arrow_dark_down_full.png.import create mode 100644 ui/icons/pictograms/arrow_dark_up_full.png create mode 100644 ui/icons/pictograms/arrow_dark_up_full.png.import create mode 100644 ui/icons/pictograms/arrow_light_down_more.png create mode 100644 ui/icons/pictograms/arrow_light_down_more.png.import create mode 100644 ui/icons/pictograms/arrow_light_left_more.png create mode 100644 ui/icons/pictograms/arrow_light_left_more.png.import create mode 100644 ui/icons/pictograms/arrow_light_right_more.png create mode 100644 ui/icons/pictograms/arrow_light_right_more.png.import create mode 100644 ui/icons/pictograms/arrow_light_up_more.png create mode 100644 ui/icons/pictograms/arrow_light_up_more.png.import create mode 100644 ui/icons/pictograms/check_mark_dark.png create mode 100644 ui/icons/pictograms/check_mark_dark.png.import create mode 100644 ui/icons/pictograms/check_mark_light.png create mode 100644 ui/icons/pictograms/check_mark_light.png.import create mode 100644 ui/icons/pictograms/online_dark.png create mode 100644 ui/icons/pictograms/online_dark.png.import create mode 100644 ui/icons/pictograms/save_dark.png create mode 100644 ui/icons/pictograms/save_dark.png.import create mode 100644 ui/icons/pictograms/settings_dark.png create mode 100644 ui/icons/pictograms/settings_dark.png.import create mode 100644 ui/icons/pictograms/undo_dark.png create mode 100644 ui/icons/pictograms/undo_dark.png.import create mode 100644 ui/icons/pictograms/undo_light.png create mode 100644 ui/icons/pictograms/undo_light.png.import create mode 100644 ui/icons/pictograms/x_dark.png create mode 100644 ui/icons/pictograms/x_dark.png.import create mode 100644 ui/icons/pictograms/x_light.png create mode 100644 ui/icons/pictograms/x_light.png.import create mode 100644 ui/icons/weather/weather_clear_day.png create mode 100644 ui/icons/weather/weather_clear_day.png.import create mode 100644 ui/icons/weather/weather_clear_night_full.png create mode 100644 ui/icons/weather/weather_clear_night_full.png.import create mode 100644 ui/icons/weather/weather_cloudy.png create mode 100644 ui/icons/weather/weather_cloudy.png.import create mode 100644 ui/icons/weather/weather_fog.png create mode 100644 ui/icons/weather/weather_fog.png.import create mode 100644 ui/icons/weather/weather_rain.png create mode 100644 ui/icons/weather/weather_rain.png.import create mode 100644 ui/typewriter_reveal.gd create mode 100644 ui/typewriter_reveal.gd.uid diff --git a/items/icons/equipment/64_cooler_plus.png b/items/icons/equipment/64_cooler_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..acbd8898b798b69e5cf69a714810eecc4ae94ab6 GIT binary patch literal 3652 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 Wz|31SwDM2@0000uQ literal 0 HcmV?d00001 diff --git a/items/icons/equipment/64_cooler_plus.png.import b/items/icons/equipment/64_cooler_plus.png.import new file mode 100644 index 0000000..44e493a --- /dev/null +++ b/items/icons/equipment/64_cooler_plus.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://baht2hredfky8" +path="res://.godot/imported/64_cooler_plus.png-d0daa39246f92fd9774ec1721970efad.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://items/icons/equipment/64_cooler_plus.png" +dest_files=["res://.godot/imported/64_cooler_plus.png-d0daa39246f92fd9774ec1721970efad.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/jobs/player_job_service.gd b/jobs/player_job_service.gd index 5f764f8..9955ccb 100644 --- a/jobs/player_job_service.gd +++ b/jobs/player_job_service.gd @@ -36,7 +36,7 @@ var _pending_rewards: Array[Dictionary] = [] var _lifetime_claimed: Array[String] = [] var _total_catches: int = 0 var _total_sold: int = 0 -var _previous_hour: float = WorldTimeService.DEFAULT_START_HOUR +var _daily_clock_hour: float = WorldTimeService.DEFAULT_START_HOUR func setup( @@ -55,8 +55,8 @@ func setup( _world_time = world_time _world_weather = world_weather _session = session - _previous_hour = _world_time.get_time_hours() - _world_time.time_changed.connect(_on_time_changed) + _daily_clock_hour = _world_time.get_time_hours() + _world_time.natural_time_advanced.connect(_on_natural_time_advanced) _session.state_changed.connect(_on_session_state_changed) _collection.collection_changed.connect(_on_current_state_changed) _experience.experience_changed.connect(_on_experience_changed) @@ -86,7 +86,6 @@ func set_save_manager(save_manager: PlayerSaveManager) -> void: func begin_progression_session() -> void: _progression_ready = true - _previous_hour = _world_time.get_time_hours() if _session.is_host(): _activate_host_board() changed.emit() @@ -155,7 +154,7 @@ func get_time_until_refresh_text() -> String: if _active_plan_id.is_empty() or _world_time == null: return "daily jobs unavailable" var elapsed: float = fposmod( - _world_time.get_time_hours() - DAILY_REFRESH_HOUR, + _daily_clock_hour - DAILY_REFRESH_HOUR, WorldTimeService.HOURS_PER_DAY, ) var hours_remaining: float = WorldTimeService.HOURS_PER_DAY - elapsed @@ -185,7 +184,10 @@ func claim(claim_id: String) -> bool: func get_host_board_network_data() -> Dictionary: - return _host_board.duplicate(true) + var board := _host_board.duplicate(true) + if not board.is_empty(): + board["daily_clock_hour"] = _daily_clock_hour + return board func apply_remote_board(board: Dictionary) -> bool: @@ -198,6 +200,8 @@ func apply_remote_board(board: Dictionary) -> bool: _daily_progress.clear() _daily_completions.clear() _active_board = board.duplicate(true) + if board.has("daily_clock_hour"): + _daily_clock_hour = float(board["daily_clock_hour"]) changed.emit() return true @@ -223,6 +227,7 @@ func to_save_data() -> Dictionary: "active_plan_id": _active_plan_id, "daily_progress": progress, "daily_completions": completions, + "daily_clock_hour": _daily_clock_hour, "pending_rewards": _pending_rewards.duplicate(true), "lifetime_claimed": _lifetime_claimed.duplicate(), "statistics": { @@ -246,6 +251,12 @@ func restore_from_save_data(data: Dictionary) -> bool: var completions: Dictionary = data.get("daily_completions", {}) for key: Variant in completions: _daily_completions[str(key)] = mini(int(completions[key]), 1) + _daily_clock_hour = float(data.get( + "daily_clock_hour", + _world_time.get_time_hours() + if _world_time != null + else WorldTimeService.DEFAULT_START_HOUR, + )) _pending_rewards.clear() var rewards: Array = data.get("pending_rewards", []) var restored_daily_rewards: Dictionary[String, bool] = {} @@ -290,6 +301,7 @@ func reset_to_defaults() -> void: _lifetime_claimed.clear() _total_catches = 0 _total_sold = 0 + _daily_clock_hour = WorldTimeService.DEFAULT_START_HOUR changed.emit() @@ -300,6 +312,7 @@ static func default_save_data() -> Dictionary: "active_plan_id": "", "daily_progress": {}, "daily_completions": {}, + "daily_clock_hour": WorldTimeService.DEFAULT_START_HOUR, "pending_rewards": [], "lifetime_claimed": [], "statistics": {"fish_caught": 0, "fish_sold": 0}, @@ -363,6 +376,16 @@ static func validate_save_data(value: Variant) -> bool: var host_board: Dictionary = data.get("host_board", {}) if not host_board.is_empty() and not validate_board(host_board): return false + if ( + data.has("daily_clock_hour") + and ( + typeof(data["daily_clock_hour"]) not in [TYPE_FLOAT, TYPE_INT] + or not is_finite(float(data["daily_clock_hour"])) + or float(data["daily_clock_hour"]) < 0.0 + or float(data["daily_clock_hour"]) >= WorldTimeService.HOURS_PER_DAY + ) + ): + return false var progress: Dictionary = data.get("daily_progress", {}) if progress.size() > 8: return false @@ -475,19 +498,22 @@ func _apply_host_weather_plan() -> void: ) -func _on_time_changed( - time_hours: float, - _phase: WorldTimeService.Phase, -) -> void: +func _on_natural_time_advanced(hours: float) -> void: + if not is_finite(hours) or hours <= 0.0: + return + var previous_hour := _daily_clock_hour + _daily_clock_hour = fposmod( + _daily_clock_hour + hours, + WorldTimeService.HOURS_PER_DAY, + ) if ( _progression_ready and _session != null and _session.is_host() - and _crossed_daily_refresh(_previous_hour, time_hours) + and _crossed_daily_refresh(previous_hour, _daily_clock_hour) ): var cycle: int = int(_host_board.get("cycle", -1)) + 1 _generate_host_board(maxi(cycle, 0)) - _previous_hour = time_hours func _on_session_state_changed(state: NetworkSession.State) -> void: diff --git a/network/network_chat_service.gd b/network/network_chat_service.gd index ebb65e9..bed0d01 100644 --- a/network/network_chat_service.gd +++ b/network/network_chat_service.gd @@ -79,6 +79,21 @@ func send_local_message(body: String) -> bool: return true +func broadcast_system_message(body: String) -> bool: + if _session == null or not _session.is_host(): + return false + var clean := NetworkChatProtocol.sanitize_body(body) + if clean.is_empty(): + return false + _broadcast(_make_message( + NetworkChatProtocol.Kind.SYSTEM, + 0, + "", + clean, + )) + return true + + func get_history() -> Array[Dictionary]: var result: Array[Dictionary] = [] for message: Dictionary in _history: diff --git a/network/network_profile_preferences.gd b/network/network_profile_preferences.gd index c90cd7d..2c3924e 100644 --- a/network/network_profile_preferences.gd +++ b/network/network_profile_preferences.gd @@ -2,8 +2,13 @@ class_name NetworkProfilePreferences extends Node const FORMAT_VERSION: int = 1 +const VoiceProfilesType = preload( + "res://player/animalese_voice_profiles.gd" +) var profile_id: String = "" var display_name: String = "Player" +var voice_id: String = VoiceProfilesType.DEFAULT_ID +var speech_speed_id: String = VoiceProfilesType.DEFAULT_SPEED_ID var created_at_unix: int = 0 var _profile_path := "" var _expected_hash := "" @@ -48,19 +53,39 @@ func load_or_create() -> bool: Time.get_ticks_usec(), ] display_name = "Player" + voice_id = VoiceProfilesType.DEFAULT_ID + speech_speed_id = VoiceProfilesType.DEFAULT_SPEED_ID created_at_unix = int(Time.get_unix_time_from_system()) return _save_atomic() func set_display_name(value: String) -> bool: + return set_profile_identity(value, voice_id, speech_speed_id) + + +func set_profile_identity( + value: String, + selected_voice_id: String, + selected_speech_speed_id: String, +) -> bool: var clean_name: String = value.strip_edges() - if not is_valid_display_name(clean_name): + if ( + not is_valid_display_name(clean_name) + or not VoiceProfilesType.is_valid(selected_voice_id) + or not VoiceProfilesType.is_valid_speed(selected_speech_speed_id) + ): return false - var previous: String = display_name + var previous_name: String = display_name + var previous_voice_id: String = voice_id + var previous_speech_speed_id: String = speech_speed_id display_name = clean_name + voice_id = selected_voice_id + speech_speed_id = selected_speech_speed_id if _save_atomic(): return true - display_name = previous + display_name = previous_name + voice_id = previous_voice_id + speech_speed_id = previous_speech_speed_id return false @@ -109,6 +134,12 @@ func _load_existing() -> bool: return false profile_id = loaded_id display_name = loaded_name + voice_id = VoiceProfilesType.sanitized_id( + str(data.get("voice_id", VoiceProfilesType.DEFAULT_ID)) + ) + speech_speed_id = VoiceProfilesType.sanitized_speed_id( + str(data.get("speech_speed_id", VoiceProfilesType.DEFAULT_SPEED_ID)) + ) created_at_unix = int(data["created_at_unix"]) return true @@ -118,6 +149,8 @@ func _save_atomic() -> bool: "format_version": FORMAT_VERSION, "profile_id": profile_id, "display_name": display_name, + "voice_id": voice_id, + "speech_speed_id": speech_speed_id, "created_at_unix": created_at_unix, } var result := PortableFileGuard.write_guarded( diff --git a/network/network_profile_service.gd b/network/network_profile_service.gd index 2666d26..4a0a5bd 100644 --- a/network/network_profile_service.gd +++ b/network/network_profile_service.gd @@ -1,6 +1,10 @@ class_name NetworkProfileService extends Node +const VoiceProfilesType = preload( + "res://player/animalese_voice_profiles.gd" +) + signal conflict_result( request_id: String, has_conflict: bool, @@ -18,6 +22,8 @@ var _preferences: NetworkProfilePreferences var _appearance_store: PlayerAppearanceStore var _spawn_service: PlayerSpawnService var _pending_apply: Dictionary[String, Dictionary] = {} +var _pending_voice_ids: Dictionary[String, String] = {} +var _pending_speech_speed_ids: Dictionary[String, String] = {} var _host_pending_apply: Dictionary[String, Dictionary] = {} var _latest_check_id: String = "" var _latest_check_name: String = "" @@ -40,6 +46,7 @@ func setup( _session.join_authenticated.connect(_on_join_authenticated) _session.state_changed.connect(_on_session_state_changed) _apply_to_avatar(1, _appearance_store.get_snapshot()) + _apply_local_voice_to_avatar() func get_persisted_name() -> String: @@ -50,6 +57,14 @@ func get_persisted_appearance() -> Dictionary: return _appearance_store.get_snapshot() +func get_persisted_voice_id() -> String: + return _preferences.voice_id + + +func get_persisted_speech_speed_id() -> String: + return _preferences.speech_speed_id + + func get_identity_fingerprint() -> String: return ( _session.get_local_identity_fingerprint() @@ -87,11 +102,15 @@ func apply_profile( display_name: String, appearance: Dictionary, use_anyway: bool, + voice_id: String = VoiceProfilesType.DEFAULT_ID, + speech_speed_id: String = VoiceProfilesType.DEFAULT_SPEED_ID, ) -> bool: var clean_name := display_name.strip_edges() if ( not NetworkProfilePreferences.is_valid_display_name(clean_name) or not CharacterCustomizationCatalog.validate_snapshot(appearance) + or not VoiceProfilesType.is_valid(voice_id) + or not VoiceProfilesType.is_valid_speed(speech_speed_id) ): apply_finished.emit(false, "Check the player name and appearance choices.") return false @@ -108,6 +127,8 @@ func apply_profile( "profile_update", NetworkProfileProtocol.signature_fields(request) ) _pending_apply[request_id] = request + _pending_voice_ids[request_id] = voice_id + _pending_speech_speed_ids[request_id] = speech_speed_id if _session == null or not _session.is_gameplay_session_active(): _apply_local_result(request_id, true, "", false, PackedStringArray()) elif _session.is_host(): @@ -264,20 +285,46 @@ func _apply_local_result( return if not accepted: _pending_apply.erase(request_id) + _pending_voice_ids.erase(request_id) + _pending_speech_speed_ids.erase(request_id) conflict_result.emit(request_id, conflict, suggestions) apply_finished.emit(false, message) return var previous_name := _preferences.display_name - if not _preferences.set_display_name(str(request["display_name"])): + var previous_voice_id := _preferences.voice_id + var previous_speech_speed_id := _preferences.speech_speed_id + var requested_voice_id: String = _pending_voice_ids.get( + request_id, + VoiceProfilesType.DEFAULT_ID, + ) + var requested_speech_speed_id: String = _pending_speech_speed_ids.get( + request_id, + VoiceProfilesType.DEFAULT_SPEED_ID, + ) + if not _preferences.set_profile_identity( + str(request["display_name"]), + requested_voice_id, + requested_speech_speed_id, + ): _pending_apply.erase(request_id) + _pending_voice_ids.erase(request_id) + _pending_speech_speed_ids.erase(request_id) apply_finished.emit(false, "Profile could not be saved.") return if not _appearance_store.save_snapshot(request["appearance"]): - _preferences.set_display_name(previous_name) + _preferences.set_profile_identity( + previous_name, + previous_voice_id, + previous_speech_speed_id, + ) _pending_apply.erase(request_id) + _pending_voice_ids.erase(request_id) + _pending_speech_speed_ids.erase(request_id) apply_finished.emit(false, "Profile could not be saved.") return _pending_apply.erase(request_id) + _pending_voice_ids.erase(request_id) + _pending_speech_speed_ids.erase(request_id) if _session != null and _session.is_gameplay_session_active(): if _session.is_host(): _session.apply_canonical_profile( @@ -304,6 +351,7 @@ func _apply_local_result( _session.get_local_peer_id() if _session != null else 1, _appearance_store.get_snapshot(), ) + _apply_local_voice_to_avatar() apply_finished.emit(true, "Profile saved.") @@ -361,6 +409,7 @@ func _on_join_authenticated() -> void: _apply_to_avatar( _session.get_local_peer_id(), _appearance_store.get_snapshot() ) + _apply_local_voice_to_avatar() func _on_peer_removed(_peer_id: int) -> void: @@ -400,6 +449,8 @@ func _refresh_latest_check() -> void: func _on_session_state_changed(state: NetworkSession.State) -> void: if state == NetworkSession.State.INACTIVE: _pending_apply.clear() + _pending_voice_ids.clear() + _pending_speech_speed_ids.clear() _host_pending_apply.clear() _latest_check_id = "" _latest_check_name = "" @@ -465,5 +516,16 @@ func _apply_to_avatar(peer_id: int, appearance: Dictionary) -> void: avatar.apply_appearance_snapshot(appearance) +func _apply_local_voice_to_avatar() -> void: + if _spawn_service == null: + return + var local_peer_id := ( + _session.get_local_peer_id() if _session != null else 1 + ) + var avatar := _spawn_service.get_avatar(local_peer_id) + if avatar != null: + avatar.apply_animalese_voice_id(_preferences.voice_id) + + func _new_id() -> String: return Crypto.new().generate_random_bytes(16).hex_encode() diff --git a/network/network_world_time_service.gd b/network/network_world_time_service.gd index 91b4060..246af77 100644 --- a/network/network_world_time_service.gd +++ b/network/network_world_time_service.gd @@ -17,6 +17,12 @@ func setup(session: NetworkSession, world_time: WorldTimeService) -> void: _world_time = world_time _session.state_changed.connect(_on_session_state_changed) _session.peer_authenticated.connect(_on_peer_authenticated) + if not _world_time.authoritative_time_set.is_connected( + _on_authoritative_time_set + ): + _world_time.authoritative_time_set.connect( + _on_authoritative_time_set + ) set_process(true) @@ -82,6 +88,13 @@ func _on_peer_authenticated(peer_id: int, _display_name: String) -> void: _send_snapshot(peer_id) +func _on_authoritative_time_set(_time_hours: float) -> void: + if _session == null or not _session.is_host(): + return + _sync_elapsed = 0.0 + _broadcast_snapshot() + + func _broadcast_snapshot() -> void: if _session == null or not _session.is_host(): return diff --git a/player/animalese_voice_profiles.gd b/player/animalese_voice_profiles.gd new file mode 100644 index 0000000..aa135c1 --- /dev/null +++ b/player/animalese_voice_profiles.gd @@ -0,0 +1,57 @@ +class_name AnimaleseVoiceProfiles +extends RefCounted + +const DEFAULT_ID: String = "natural" +const DEFAULT_SPEED_ID: String = "normal" +const OPTIONS: Array[Dictionary] = [ + {"id": "tiny", "label": "tiny", "pitch": 1.24}, + {"id": "bright", "label": "bright", "pitch": 1.10}, + {"id": "natural", "label": "natural", "pitch": 1.0}, + {"id": "mellow", "label": "mellow", "pitch": 0.89}, + {"id": "deep", "label": "deep", "pitch": 0.77}, +] +const SPEED_OPTIONS: Array[Dictionary] = [ + {"id": "slow", "label": "slow", "characters_per_second": 20.0}, + {"id": "relaxed", "label": "relaxed", "characters_per_second": 24.0}, + {"id": "normal", "label": "normal", "characters_per_second": 28.0}, + {"id": "quick", "label": "quick", "characters_per_second": 34.0}, + {"id": "rapid", "label": "rapid", "characters_per_second": 40.0}, +] + + +static func is_valid(voice_id: String) -> bool: + for option: Dictionary in OPTIONS: + if str(option.get("id", "")) == voice_id: + return true + return false + + +static func sanitized_id(voice_id: String) -> String: + return voice_id if is_valid(voice_id) else DEFAULT_ID + + +static func pitch_for(voice_id: String) -> float: + var resolved_id := sanitized_id(voice_id) + for option: Dictionary in OPTIONS: + if str(option.get("id", "")) == resolved_id: + return float(option.get("pitch", 1.0)) + return 1.0 + + +static func is_valid_speed(speed_id: String) -> bool: + for option: Dictionary in SPEED_OPTIONS: + if str(option.get("id", "")) == speed_id: + return true + return false + + +static func sanitized_speed_id(speed_id: String) -> String: + return speed_id if is_valid_speed(speed_id) else DEFAULT_SPEED_ID + + +static func speed_for(speed_id: String) -> float: + var resolved_id := sanitized_speed_id(speed_id) + for option: Dictionary in SPEED_OPTIONS: + if str(option.get("id", "")) == resolved_id: + return float(option.get("characters_per_second", 28.0)) + return 28.0 diff --git a/player/animalese_voice_profiles.gd.uid b/player/animalese_voice_profiles.gd.uid new file mode 100644 index 0000000..1817007 --- /dev/null +++ b/player/animalese_voice_profiles.gd.uid @@ -0,0 +1 @@ +uid://dlut32tq2v66j diff --git a/player/player.gd b/player/player.gd index 4686df5..d4c0515 100644 --- a/player/player.gd +++ b/player/player.gd @@ -50,6 +50,7 @@ const CONTROLLER_ZOOM_TRIGGER_AXIS: JoyAxis = JOY_AXIS_TRIGGER_LEFT var appearance_snapshot: Dictionary = ( CharacterCustomizationCatalog.default_snapshot() ) +var animalese_voice_id: String = "natural" var active_bait_id: StringName = StringName() signal active_bait_changed(item_id: StringName) @@ -76,6 +77,14 @@ func apply_appearance_snapshot(snapshot: Dictionary) -> void: appearance_snapshot = snapshot.duplicate(true) PlayerVisualPresenter.apply_appearance(_visuals, appearance_snapshot) + +func apply_animalese_voice_id(voice_id: String) -> void: + animalese_voice_id = voice_id + + +func get_animalese_voice_id() -> String: + return animalese_voice_id + class ShowcaseCameraSnapshot: extends RefCounted @@ -129,6 +138,8 @@ class ShowcaseCameraSnapshot: @export var zoom_smoothing: float = 12.0 @export_range(0.1, 12.0, 0.1) var controller_zoom_speed: float = 4.0 @export_range(0.0, 1.0, 0.01) var controller_trigger_threshold: float = 0.55 +@export_range(1.0, 40.0, 0.5) var free_camera_speed: float = 10.0 +@export_range(1.0, 10.0, 0.5) var free_camera_sprint_multiplier: float = 3.0 @onready var _visuals: Node3D = %Visuals @onready var _character_rig: Node3D = get_node_or_null( @@ -141,6 +152,7 @@ class ShowcaseCameraSnapshot: @onready var _camera_pitch: Node3D = %CameraPitch @onready var _spring_arm: SpringArm3D = %SpringArm3D @onready var _camera: Camera3D = %Camera3D +@onready var _player_collision_shape: CollisionShape3D = $CollisionShape3D @onready var inventory: FishInventoryType = %Inventory @onready var collection_log: CollectionLogType = %CollectionLog @onready var wallet: PlayerWalletType = %Wallet @@ -165,6 +177,11 @@ var _catch_attachment_offset: Vector3 = Vector3(0.0, 0.08, 0.04) var _gravity: float = float(ProjectSettings.get_setting("physics/3d/default_gravity")) var _camera_dragging: bool = false var _camera_input_enabled: bool = true +var _free_camera_active: bool = false +var _free_camera_body: CharacterBody3D +var _free_camera: Camera3D +var _free_camera_yaw: float = 0.0 +var _free_camera_pitch: float = 0.0 var _movement_enabled: bool = true var _water_recovery_active: bool = false var _remote_recovery_presentation_active: bool = false @@ -197,6 +214,8 @@ var _network_target_visual_yaw: float = 0.0 var _network_snapshot_ready: bool = false var _character_animation_name: StringName = &"" var _sitting: bool = false +var _sitting_intent_pending: bool = false +var _sitting_intent_sequence: int = -1 var _held_fish_visible: bool = false var _showcase_animation_active: bool = false var _fishing_rod: Node3D @@ -205,6 +224,8 @@ var _controller_mapping_manager: ControllerMappingManagerType func _ready() -> void: + if not bag.contents_changed.is_connected(_on_bag_contents_changed): + bag.contents_changed.connect(_on_bag_contents_changed) PlayerVisualPresenter.apply_appearance(_visuals, appearance_snapshot) _initialize_fishing_rod() _target_zoom = clampf(_spring_arm.spring_length, minimum_zoom, maximum_zoom) @@ -213,6 +234,14 @@ func _ready() -> void: _initialize_held_item_attachment() +func _on_bag_contents_changed() -> void: + if ( + not active_bait_id.is_empty() + and bag.get_quantity(active_bait_id) <= 0 + ): + unequip_bait() + + func set_controller_mapping_manager( mapping_manager: ControllerMappingManagerType, ) -> void: @@ -267,8 +296,18 @@ func _physics_process(delta: float) -> void: if _network_interpolation_enabled: _update_network_interpolation(delta) return + if local_control_enabled and _free_camera_active: + _update_free_camera_physics() + velocity.x = 0.0 + velocity.z = 0.0 + if not is_on_floor(): + velocity.y -= _gravity * fall_gravity_multiplier * delta + move_and_slide() + _network_jump_pending = false + return var jump_requested: bool = ( _movement_enabled + and not _free_camera_active and ( (local_control_enabled and Input.is_action_just_pressed("jump")) or (_network_authoritative_simulation and _network_jump_pending) @@ -276,7 +315,7 @@ func _physics_process(delta: float) -> void: ) if _sitting: if jump_requested: - _set_sitting(false) + _set_sitting(false, local_control_enabled) else: velocity = Vector3.ZERO _network_jump_pending = false @@ -370,6 +409,8 @@ func _process(delta: float) -> void: ) if not local_control_enabled: return + if _free_camera_active: + return if ( _camera_input_enabled @@ -519,7 +560,7 @@ func toggle_sitting() -> void: ]) ): return - _set_sitting(should_sit) + _set_sitting(should_sit, local_control_enabled) func _has_any_character_animation(candidates: Array[StringName]) -> bool: @@ -531,10 +572,16 @@ func _has_any_character_animation(candidates: Array[StringName]) -> bool: return false -func _set_sitting(should_sit: bool) -> void: +func _set_sitting( + should_sit: bool, + is_local_intent: bool = false, +) -> void: if _sitting == should_sit: return _sitting = should_sit + if is_local_intent: + _sitting_intent_pending = true + _sitting_intent_sequence = -1 if _sitting: velocity = Vector3.ZERO _character_animation_name = &"" @@ -548,6 +595,10 @@ func is_sitting() -> bool: func _unhandled_input(event: InputEvent) -> void: if not local_control_enabled or not _camera_input_enabled: return + if event.is_action_pressed("toggle_free_camera"): + _set_free_camera_active(not _free_camera_active) + get_viewport().set_input_as_handled() + return if event.is_action("camera_drag"): _camera_dragging = event.is_pressed() @@ -555,9 +606,14 @@ func _unhandled_input(event: InputEvent) -> void: return if event is InputEventMouseMotion and _camera_dragging: - _rotate_camera(event.relative * mouse_sensitivity) + if _free_camera_active: + _rotate_free_camera(event.relative * mouse_sensitivity) + else: + _rotate_camera(event.relative * mouse_sensitivity) get_viewport().set_input_as_handled() return + if _free_camera_active: + return var mouse_zoom_in: bool = ( event is InputEventMouseButton @@ -617,6 +673,98 @@ func _rotate_camera(delta_rotation: Vector2) -> void: ) +func _set_free_camera_active(active: bool) -> void: + if _free_camera_active == active: + return + if active: + var camera_transform: Transform3D = _camera.global_transform + var duplicated_camera := _camera.duplicate() as Camera3D + if duplicated_camera == null: + return + var camera_body := CharacterBody3D.new() + camera_body.name = "FreeCameraBody" + camera_body.collision_layer = 0 + camera_body.collision_mask = collision_mask + camera_body.motion_mode = CharacterBody3D.MOTION_MODE_FLOATING + add_child(camera_body) + camera_body.top_level = true + camera_body.global_position = camera_transform.origin + var camera_collision := CollisionShape3D.new() + camera_collision.name = "FreeCameraCollision" + camera_collision.shape = _player_collision_shape.shape + camera_body.add_child(camera_collision) + duplicated_camera.name = "FreeCamera" + duplicated_camera.unique_name_in_owner = false + camera_body.add_child(duplicated_camera) + duplicated_camera.transform = Transform3D( + camera_transform.basis, + Vector3.ZERO, + ) + _free_camera_body = camera_body + _free_camera = duplicated_camera + var camera_rotation: Vector3 = _free_camera.global_rotation + _free_camera_yaw = camera_rotation.y + _free_camera_pitch = camera_rotation.x + _camera.current = false + _free_camera.current = true + _free_camera_active = true + return + _free_camera_active = false + _camera_dragging = false + if _free_camera != null: + _free_camera.current = false + _free_camera = null + if _free_camera_body != null: + _free_camera_body.queue_free() + _free_camera_body = null + _camera.current = local_control_enabled + + +func _update_free_camera_physics() -> void: + if _free_camera == null or _free_camera_body == null: + _set_free_camera_active(false) + return + var input_vector: Vector2 = Input.get_vector( + "move_left", + "move_right", + "move_forward", + "move_backward", + ) + var vertical_input: float = ( + Input.get_action_strength("jump") + - Input.get_action_strength("sneak") + ) + var movement: Vector3 = ( + _free_camera.global_basis.x * input_vector.x + + _free_camera.global_basis.z * input_vector.y + + Vector3.UP * vertical_input + ) + if movement.length_squared() > 1.0: + movement = movement.normalized() + var movement_speed: float = free_camera_speed + if Input.is_action_pressed("sprint"): + movement_speed *= free_camera_sprint_multiplier + _free_camera_body.velocity = movement * movement_speed + _free_camera_body.move_and_slide() + + +func _rotate_free_camera(delta_rotation: Vector2) -> void: + if _free_camera == null: + return + _free_camera_yaw -= delta_rotation.x + var vertical_direction: float = -1.0 if invert_camera_y else 1.0 + _free_camera_pitch = clampf( + _free_camera_pitch - delta_rotation.y * vertical_direction, + deg_to_rad(minimum_pitch_degrees), + deg_to_rad(maximum_pitch_degrees), + ) + _free_camera.global_rotation = Vector3( + _free_camera_pitch, + _free_camera_yaw, + 0.0, + ) + + func _set_target_zoom(value: float) -> void: _target_zoom = clampf(value, minimum_zoom, maximum_zoom) @@ -633,6 +781,8 @@ func _apply_axis_deadzone(value: float) -> float: func set_local_control(enabled: bool) -> void: + if not enabled and _free_camera_active: + _set_free_camera_active(false) local_control_enabled = enabled if is_node_ready(): _camera.current = enabled @@ -657,7 +807,9 @@ func configure_network_remote(authoritative_simulation: bool) -> void: func capture_network_input(sequence: int) -> Dictionary: - if not _movement_enabled or _water_recovery_active: + if _sitting_intent_pending and _sitting_intent_sequence < 0: + _sitting_intent_sequence = sequence + if not _movement_enabled or _water_recovery_active or _free_camera_active: return { "sequence": sequence, "axis": [0.0, 0.0], @@ -734,7 +886,17 @@ func apply_local_prediction_correction(snapshot: Dictionary) -> void: var parsed: Dictionary = _parse_network_snapshot(snapshot) if parsed.is_empty(): return - _set_sitting(bool(parsed["sitting"])) + var acknowledged_input: int = parsed["acknowledged_input"] + var sitting_intent_acknowledged: bool = ( + _sitting_intent_pending + and _sitting_intent_sequence >= 0 + and acknowledged_input >= _sitting_intent_sequence + ) + if sitting_intent_acknowledged: + _sitting_intent_pending = false + _sitting_intent_sequence = -1 + if not _sitting_intent_pending: + _set_sitting(bool(parsed["sitting"])) var authoritative_position: Vector3 = parsed["position"] var error_distance: float = global_position.distance_to( authoritative_position @@ -780,6 +942,17 @@ func _parse_network_snapshot(snapshot: Dictionary) -> Dictionary: float(network_velocity[2]) ) var visual_yaw: float = float(snapshot.get("visual_yaw", 0.0)) + if ( + snapshot.has("acknowledged_input") + and ( + typeof(snapshot.get("acknowledged_input")) != TYPE_INT + or int(snapshot.get("acknowledged_input")) < 0 + ) + ): + return {} + var acknowledged_input: int = int( + snapshot.get("acknowledged_input", 0) + ) if snapshot.has("sitting") and typeof(snapshot.get("sitting")) != TYPE_BOOL: return {} var sitting: bool = bool(snapshot.get("sitting", false)) @@ -793,6 +966,7 @@ func _parse_network_snapshot(snapshot: Dictionary) -> Dictionary: "position": parsed_position, "velocity": parsed_velocity, "visual_yaw": visual_yaw, + "acknowledged_input": acknowledged_input, "sitting": sitting, } @@ -835,7 +1009,10 @@ func set_camera_input_enabled(enabled: bool) -> void: func set_camera_active(active: bool) -> void: - _camera.current = active + if _free_camera_active and _free_camera != null: + _free_camera.current = active + else: + _camera.current = active func apply_camera_settings( diff --git a/scripts/generate_placeholder_animalese.gd b/scripts/generate_placeholder_animalese.gd new file mode 100644 index 0000000..8119fd3 --- /dev/null +++ b/scripts/generate_placeholder_animalese.gd @@ -0,0 +1,71 @@ +extends SceneTree + +const OUTPUT_DIRECTORY := "res://sound/dialogue/animalese/placeholder" +const SAMPLE_RATE: int = 22050 +const SAMPLE_SECONDS: float = 0.055 +const CHARACTERS := "abcdefghijklmnopqrstuvwxyz" +const VOWELS := "aeiou" + + +func _initialize() -> void: + var absolute_directory := ProjectSettings.globalize_path(OUTPUT_DIRECTORY) + var directory_error: Error = DirAccess.make_dir_recursive_absolute( + absolute_directory + ) + if directory_error != OK: + push_error("Could not create animalese sample directory.") + quit(1) + return + for character_index: int in range(CHARACTERS.length()): + var character := CHARACTERS.substr(character_index, 1) + _save_sample(character, character_index) + _save_sample("fallback", CHARACTERS.length()) + quit() + + +func _save_sample(sample_name: String, sample_index: int) -> void: + var stream := _build_sample(sample_name, sample_index) + var output_path := "%s/%s" % [OUTPUT_DIRECTORY, sample_name] + var save_error: Error = stream.save_to_wav(output_path) + if save_error != OK: + push_error("Could not save animalese sample: %s" % sample_name) + + +func _build_sample(sample_name: String, sample_index: int) -> AudioStreamWAV: + var frame_count := roundi(SAMPLE_RATE * SAMPLE_SECONDS) + var pcm := PackedByteArray() + pcm.resize(frame_count * 2) + var base_frequency := 245.0 + float(sample_index % 7) * 18.0 + var formant_one := 620.0 + float(sample_index % 5) * 85.0 + var formant_two := 1320.0 + float(sample_index % 6) * 115.0 + var is_vowel := VOWELS.contains(sample_name) + var noise_seed := sample_index * 7919 + 104729 + for frame_index: int in range(frame_count): + var time := float(frame_index) / SAMPLE_RATE + var attack := minf(time / 0.004, 1.0) + var release := minf((SAMPLE_SECONDS - time) / 0.014, 1.0) + var envelope := maxf(minf(attack, release), 0.0) + noise_seed = int( + (noise_seed * 1103515245 + 12345) & 0x7fffffff + ) + var noise := float(noise_seed % 65536) / 32767.5 - 1.0 + var voiced := ( + sin(TAU * base_frequency * time) * 0.42 + + sin(TAU * base_frequency * 2.0 * time) * 0.16 + ) + var formants := ( + sin(TAU * formant_one * time) * 0.18 + + sin(TAU * formant_two * time) * 0.10 + ) + var consonant_noise := noise * (0.08 if is_vowel else 0.24) + var value := envelope * (voiced + formants + consonant_noise) * 0.72 + var signed_sample := clampi(roundi(value * 32767.0), -32768, 32767) + var encoded_sample := signed_sample if signed_sample >= 0 else signed_sample + 65536 + pcm[frame_index * 2] = encoded_sample & 0xff + pcm[frame_index * 2 + 1] = (encoded_sample >> 8) & 0xff + var stream := AudioStreamWAV.new() + stream.set("format", AudioStreamWAV.FORMAT_16_BITS) + stream.mix_rate = SAMPLE_RATE + stream.stereo = false + stream.data = pcm + return stream diff --git a/scripts/generate_placeholder_animalese.gd.uid b/scripts/generate_placeholder_animalese.gd.uid new file mode 100644 index 0000000..9399a64 --- /dev/null +++ b/scripts/generate_placeholder_animalese.gd.uid @@ -0,0 +1 @@ +uid://cwqm75icgcr4u diff --git a/sound/dialogue/animalese/placeholder/a.wav b/sound/dialogue/animalese/placeholder/a.wav new file mode 100644 index 0000000000000000000000000000000000000000..ca652d401c2e99fc9d23bcebf334dfbbaf9329ea GIT binary patch literal 2470 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 PNCsj6HW2srzc9c*!WE=z literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/a.wav.import b/sound/dialogue/animalese/placeholder/a.wav.import new file mode 100644 index 0000000..86de7ca --- /dev/null +++ b/sound/dialogue/animalese/placeholder/a.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dvajjy4bwadio" +path="res://.godot/imported/a.wav-9ab4b1a9a555e6fcf07951f399769b30.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/a.wav" +dest_files=["res://.godot/imported/a.wav-9ab4b1a9a555e6fcf07951f399769b30.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/b.wav b/sound/dialogue/animalese/placeholder/b.wav new file mode 100644 index 0000000000000000000000000000000000000000..71ceb88f174bd6ffed9cbfb4ab3d706458893264 GIT binary patch literal 2470 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 bFcEOj+3&0a8l8E-$3PGe4kQ9p!0!A%6ndy- literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/d.wav.import b/sound/dialogue/animalese/placeholder/d.wav.import new file mode 100644 index 0000000..ffc5bb9 --- /dev/null +++ b/sound/dialogue/animalese/placeholder/d.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://yvha8eukw6l7" +path="res://.godot/imported/d.wav-910bc02bc42bdb1b37561959a317c28a.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/d.wav" +dest_files=["res://.godot/imported/d.wav-910bc02bc42bdb1b37561959a317c28a.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/e.wav b/sound/dialogue/animalese/placeholder/e.wav new file mode 100644 index 0000000000000000000000000000000000000000..76f7b8c862894e14a3b69b366deb066bff350e2e GIT binary patch literal 2470 zcmWO7XIN8*0)XL@bI2l$03l>2B!LVzfw0EE~z*cGBB=pi%>^D{OCvlC6X z+X6m-vZ2+eEQpRZq7PuV<5KNAu@>BY%r4Z7%?#(jGJ_JXFh-m3=3ZlzAy*%+&sSTP zBx>Jf7d^xDI~-%+XpX86s@|JFHXb+p&tUoxvAKYNky~2|**)AB`w?vTn9p@Z9nZ1R#kx{@hI~{i0i%A(jmNUG&Bf7ER^|9K;#@dd+?(H2Msp75E$d=ji zh4?vF?F(q$DUY{X+#8%6zB!=AXKdA%qVM>h@qhN5^cZ9nvpaa-c}_93jF;S-EGE^@ z`IY+vmn8Rb_pe!@?vAeY_ygc^-~%;RUOfkoWvjN&q#HJ=UEo5~ddr;JRco6qn>!?r znN6JSpH7;%Gi4Y}=)(4V({!jdtxD67SDVqsmgbE68lRbtI*g)w+z7-N@+hsso8}!U zI1>h}k%#7rZ~1@1=p}EVzM-@`50SJUUhGQtc2Oa3gZC?zFY~c$2(AnpfH`e1!1sZ( zsCHwShOdj6pIBf`1mh5JIJF3f} ztF>!Q%cqjC?wq%;=QAz4uv|BS_Z9C5|EGaFeeZHt(F-Z9%zR!X|2luaPn5TVc&k9n z5;EU++s}CDHpR`PY~)OdKj)IY-*8SlJ#fx|YfZ=1De}<82Kgxk%krZ|VD8X07(Y^f zZaA%qT0oQyYQ^$JwZw3H@uE!Cb+Yy2O8T>vza1*78_Sx>Z@mVmCfKTHx*Yv(1jc${ zC9at?so;OYvmr@=1mC|zy`!aBv1cwGzJ=a2Cf_#G6bk`GX$sf+es z*zYB+$9dr9kWibwE^Rqv(Put!vVP*cvS>+W>_hR8lXiLl(di7`bBXesLxiyzX;R;j zZePi-eH&Zx?PIMO4a(;7`kKB+gR-S{u&d)X(gnr{c|GGA*}y!3-0Dz5wdcrmdzswnN5j(+zZmv2gjIoI8@G|BjKr$FGcK z%-o*4y4-3V2IDEY%w+aNz;ixR@E?Jdl|t)v+vT#?O~%^m^`Q^h?`Ls~=!6*MSH{`E zs-xm)+o)CSO8Qz>7SV!9wp)+fR`<*Ga_pi+X|MW0XK(t^b{ZIjLVzbo6k=OCpu99S zru@I+%mjIYH9F9Tv=r8TQSDRhTe-9G@aywE>n5%$_FL~-W}qXkQi9Zx>U@JlW0Wyo zd+ri_CE6q`;jCf!Q4+{fQVUhY?-U#t1g@G97l+{kF9+!O1te#p7O%v921i*#EJ;AB z?o)H~O3C8>mEyS$)$WD0<_^6G!XhuQBdAO?XuB;hm`#+%wyy5n-?+J^sG*^KgCwZ! zQFleptM&^6I|h2^Rr+F6395jEVIJ}1FvBTDwCmJ89+${=uKPTGr}eU4@E-DotF8yV z@-6k(iV}Ej!UcXFC)fw;b4PH?Gr_e3KLS-5)~b5sJEkwsh?KkFe0`?*G(Hj&1bu~Q zjPR@U`56jxlss(<=wG*xtNhjw;pFJ%=X&4em18dHAvObB>hQwNMm|ShC)5aE z1l;AO`UyFyyb%5o-(rzf_&9hvs51B`uc!19cONX*CSH~)>eWlikCl(~QhkZ}5>yIY zLp_7<16+fjz7Fa{rvhdGXC)fyCczo1jjKkNl%=e(x;hqEH z#B{w&FK5ouZRALDI@8SL(fmClh1Iki$`Sh>9Be*mxNc1|#p_N0Pv8tx zv6*6JA-|bVTJmfPz#CwLZMZPV9W(%tL7@p!XvcpYtCZ#s4~#gEW=!81Zyi7mc@! zXwxBs()iO#jyilPeNj9+HGgK-G&44LQI)-%t-oQ2HThT`!aUoGr3^WS^Z-<#3R(l5 zvMa?pVLrh5;LhXCxRiHyIc%To3=+jI?ZorW?!m)L3S1#}nc26)@{Hxh-K1bl3l ztZZv391i~%F0@_%?gO__wO|m~is}IPs770bHQO9z3Nt>^#~U{r&Ks156r;sNGEJN2 zO#93+=5H(;tTVP;WCU43_$Wuzb6^w+1M&e2k`H8|yg@VA4jzMsL2rlv4S|Iq1q=mQ YU>oWT3Xie?>A)($gxHXocUF*p0Vw6NGXMYp literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/e.wav.import b/sound/dialogue/animalese/placeholder/e.wav.import new file mode 100644 index 0000000..49de309 --- /dev/null +++ b/sound/dialogue/animalese/placeholder/e.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://8ujopf8aqs83" +path="res://.godot/imported/e.wav-7da5f8fcd017bf931de2bd49dc00f652.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/e.wav" +dest_files=["res://.godot/imported/e.wav-7da5f8fcd017bf931de2bd49dc00f652.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/f.wav b/sound/dialogue/animalese/placeholder/f.wav new file mode 100644 index 0000000000000000000000000000000000000000..bec92c19d5ad175c21a56f4131e31871e5a2ab60 GIT binary patch literal 2470 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%0A#1EU6#LRe=r#U0N96k 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 SU>+|D*a3t9XaEIRKKTEpK(DU= literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/fallback.wav.import b/sound/dialogue/animalese/placeholder/fallback.wav.import new file mode 100644 index 0000000..e116a3c --- /dev/null +++ b/sound/dialogue/animalese/placeholder/fallback.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bw0pod4tmexm0" +path="res://.godot/imported/fallback.wav-7a40516b188f10028ac39bdc24fb52e5.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/fallback.wav" +dest_files=["res://.godot/imported/fallback.wav-7a40516b188f10028ac39bdc24fb52e5.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/g.wav b/sound/dialogue/animalese/placeholder/g.wav new file mode 100644 index 0000000000000000000000000000000000000000..39dccf127da79425bf8eba92e9906fbd9f8d7579 GIT binary patch literal 2470 zcmWN{cU%*P0s!E<~fv7_tP4VG7R);wo0ORSQ-DU!@jb9kkY3`%_Bs z0oGMfYq5w50s^v^2*@UY5HN%!WROcpF1hyi{rhc;69~#k0FV;7YxChRvz_Pw0D%8; z*#!X6e*ypopaX}}v(wM~djMb);03sVpJU!&ZeTJYCDe>_!j(WVL^@=K8;1rVb6hAc z1mgx)61U+DxOGSmQU`nMPr zky9sJXVVvJXBVf_N1hHx4SRmD7G0Ebrfw?obcwQa`cb^fF4L7@b>2BU@Jd+PrjqDe zVYuM!fj9YLzY5BXOB%bt{8wBg6ph=eKV`Pp?7xO^%o*$~{D&C@(HS6-` zYDUiW9-dF@dpDcXn%#D3Jox2OZP!?|@N7#`@9bDS+DO^pe3^g*c=2fNnnaw>!?<8B zC}4VS@;q(7mD|8=w%Y7TXKY{ZWXf`O(fmSU(VKD4XTMuDf`M|$;%iMjsf~I8ya_o& z9`qcCSJ)3EEi(ry#NChyx|5sl&&t~d#yG9PjrmO{r`4_IEtb<_Vg8b0_@TUV^rLW> zq*VDA`oZR$f2tdaCyg{kd>i`%w=K*sLhE#ET{PpZ_o_`R{*EcYyn(TdGW2HVztNW@ zO1*(zPSi*rYj**4a3yKCjH9&DDw8 zc`d4H>e${Dt8`a(t8*3#Df8spsM6yL-+I?q>#p**uj@?=4!Q1ACtxPIML+k?*^p}! zwBfF8HCZf|;+sI6@-Z2P)V+CQoih>A=UeGvYIcSq2&UjT1|``d`5 z(CqMqxFpV`_ln@S9f`L$AkIFAm2a8*X+#CL#4$Qb@2GDw?ZWwXBZ4~&`$O6GDlhVP*96TD9IDnsho zZtf_nmy!WRYk25Ioscvkg{eBU21A#Qi1#c6D6LJGl)F(AwHsd#g4C<^}<=Q;Me2mhwh!ow9wX-)4Z?pRpJ*VXM2R@l>9+qv_tcJoWD2%(@%=h8+tw zwQ`G-OZ@MJKZ^+EJcuNRxOv@YCAiAXVA>1m2}9~454&agnjvS=O7W+0M%``um-4aM z1N02xAt06A)&Rx~*q4}qUYOY|Wh|ZOJ<;zq$L}<&i*GNhOR4pE@nx5Hox@m$lD;x* zTuVC6%2|7!na@W(t@)wBM_f2u4&Ns3v|pWLZiGW1+qWg8e;t>!(V1&HjN{8c6Afy| zMsMg2NX(}46m(s^L2a2uyF+m&j)0x`&um0U`}}k9W<~E@Ti2nnxaR$D2H*cR8{bDB zh#9SD?tFgm6>;FFmb!uQsUOrvOt~h2eA|^^|DBc5_wnY-d`0-Dd}461t2K9TSi2WD zFw2qVC3CqBlo=1&oz(19k1dn1Vr9TekX$a}Na~fjaFnzZVJlP&*zR+?M#mE{f_AJ1 z8R{0;i*J@1dW#w;b(wv~s;h^OcAkBiDpbCGG#Mzi73YgfMc$epXh|#@l;`%nrxzcN zZV&{-x219UJN>`l_k_eo#Rpy6kb+Hwdx7XxKUxY@f)6*mq8OMLC~FA~W?jT*E7z4_ zDg^6^A6D!p>`{E8hBX813V9sz5iLYx#s3pJG~KVAs@mUDBNsTTWSi zX7XIgq-}T5SSND-bbIf7j$a~p#r5%uVt*2x^^FZQ1aC9v*myHEmJOr>%V(Au z^YZBvE78(mQJlDd_|!_I?$cbgOlD75t)Z03!eRBtaY?(_4))aCkXR^_ChaCdI=-3I z&mNx4Yz?Z391ZLH|HKFJmSK+a_l0@zxTP1T*Y~u=li=VW_t0eSU5BXPYr#kTgib2! zH9?nH8P-L%S2(UtRHha>L-m!|8?#sH#S7BCs!^bZ1g^SKpX(ARsb~xuq{}8AqSTNY zpfQoz6m{%pRrk=736F_HN#Rh)(ya;YC@Aq*Abu#3T$sw1?bfjrb9%8Z3N3V)U%%hp z!}Fx?gahPM6j0;VZ~4mhHsvlAb)+#LG4C*!aZg#TxToaH1V$SE7i+$9+~K;Pe$Q6O$bj6bZ^>n(5W-oE3_7m; z31^QSfsO(0=wsYdxEJE-qI7EHfT`3Nqm40TsEmdkGOa2@p;AiZ zBGEBL)bdVckm|wm^_3g&-^OyxMQ{@)1~`T09yt0qOXyA2nF4Xz6M$h$;eyNJK!4T5Ox$5KzZ0r;4O3uT53u%@r^#n zfa#HusMi}mMIP%S^frcM?K^$3?q}T|eTm-3l!6>LHi4_akKhR~3wjB$u=5x@%mjE4 f(*x45Uf@nJ0W$)&0Fj^pU;_ex2atee)PVj2**?WN literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/g.wav.import b/sound/dialogue/animalese/placeholder/g.wav.import new file mode 100644 index 0000000..1709852 --- /dev/null +++ b/sound/dialogue/animalese/placeholder/g.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c7706p0fc8y7c" +path="res://.godot/imported/g.wav-45b2cbd9653a31477e3f00c9432d560c.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/g.wav" +dest_files=["res://.godot/imported/g.wav-45b2cbd9653a31477e3f00c9432d560c.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/h.wav b/sound/dialogue/animalese/placeholder/h.wav new file mode 100644 index 0000000000000000000000000000000000000000..acebfed638d7d2106cb4c97d947fff409744db0f GIT binary patch literal 2470 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 YN8|v10QZ4ZU_U?wluma5a^ivi1MqaZ%>V!Z literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/h.wav.import b/sound/dialogue/animalese/placeholder/h.wav.import new file mode 100644 index 0000000..96b2359 --- /dev/null +++ b/sound/dialogue/animalese/placeholder/h.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://cl66wka105xmo" +path="res://.godot/imported/h.wav-2da53a6638eebb75f0867eaf75dc24ba.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/h.wav" +dest_files=["res://.godot/imported/h.wav-2da53a6638eebb75f0867eaf75dc24ba.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/i.wav b/sound/dialogue/animalese/placeholder/i.wav new file mode 100644 index 0000000000000000000000000000000000000000..fbd10e1c1bbbf9041b5ccbdc6d6cfd1bce55a7db GIT binary patch literal 2470 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 TtMayZZC)aP0ek@;fC~H{)X%}P literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/i.wav.import b/sound/dialogue/animalese/placeholder/i.wav.import new file mode 100644 index 0000000..0c11fd6 --- /dev/null +++ b/sound/dialogue/animalese/placeholder/i.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://jicgdbnyt6bm" +path="res://.godot/imported/i.wav-1e8d7f13980a6f2f61d73f65a2efc91c.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/i.wav" +dest_files=["res://.godot/imported/i.wav-1e8d7f13980a6f2f61d73f65a2efc91c.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/j.wav b/sound/dialogue/animalese/placeholder/j.wav new file mode 100644 index 0000000000000000000000000000000000000000..0087db5092d2d7b567dde6a78ba473c0743c67e7 GIT binary patch literal 2470 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 ZYT!O_?VtaO0geI~VBTePEx2s1{{w*Yx<3E_ literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/k.wav.import b/sound/dialogue/animalese/placeholder/k.wav.import new file mode 100644 index 0000000..4af149c --- /dev/null +++ b/sound/dialogue/animalese/placeholder/k.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://eypaqf1iaq5" +path="res://.godot/imported/k.wav-b85d045dc022b9055c25a650b2e3af2a.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/k.wav" +dest_files=["res://.godot/imported/k.wav-b85d045dc022b9055c25a650b2e3af2a.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/l.wav b/sound/dialogue/animalese/placeholder/l.wav new file mode 100644 index 0000000000000000000000000000000000000000..fe2624be1eed3784ed1e13a5653247756bf9f1dd GIT binary patch literal 2470 zcmWN~cT`h{0)X+GakF;<0g|v22mu5Hks%cXv{DhU#Zk2gt)q$_u%)j!pcPRotyZlR zi(0Whsz+_{RmH(3NJVy72?--W2qBO?$hgn*{rfxT%la@i^%fQYwkKw%?9czon*sm; z?0vr30Fe9;0N?-x_K}LLnn1oLtdoY7&1$H;)Ii?tk zMKmLOAS#HrhoIDODrzI}Kd2m84{)Fl?KzG^;FxngnoI0LQo(PLRM;x)5=cb7wR9W* z1k%l;${qI2i^pagC#J^P)A-&C!x@7)vfWc@bBROuMqR}FClL$(YTNan*(tC_K*xdM zM?Cu@X`VVp27gazEmy_Q^&Vv=uMYM7)%_GT%eBC36Mc)%TgM5@-!>OKhMj~8Wjtgu z3CWBy#3ge%mIpiN+T}CMOz;z-&BzXPyYt`Wj}6V^0Sg2f|6TNmc==rWarvpCi9U1p znzn={O{-+O-z2eK)n%xjX`s>0P?=`bds3p-(Mt9o8$;bo1hM za+t!VFV&Vz$maJtBT>F|6OI*p2b;?J%;TOrIqLJ(&2eWF~tC7wpjS!k_2S2wtDK~cMys@}f%_iPQd(HyNrSc42tkh~cms7U>taS$hi z;T-(Q7b4W`Q6XmZQp^33iq_NPo=p*57f1IfZix3ztCYt&f^}v)Y&pXur*!)7h}#|h zXVhADs=%-*AjNg-)g(mRT*mdZfCyOF7LF^g5H-4@qn}ZC;7{PEfX|o1q0HHosbhv) z7LlUZkc|2s@9I{_*$#>*yVx(F&1w>Ca3X0D559&H?N3Ld7A8b5{%NVtZWZ>xyPgjy z8j^*VL`L(+BZoJq1(&wM`c3k*+Z?hfe>uZjFADk-6j zQ|Z}G@Fr!WA8SmG^QMoW`#6M0t$m7}i<`r;kQw$R{dJ_Cco4D6yO{QtS?OMaOq>5w z{mL|`*(-Z25x2?ucFtT8{yUH_YY^&QF+1aXGn&rKS9ITx1|Ol-&~tbe-zRD4yWl(V>XsR@Hyo?1wotWxZ9iso)Bm%y8hA4p~1Lcv7HZE`W);N9XD zw+7|)Tgg)=>G z$W=81wTl1D4Nj~xJ(K1vAJ=8Bv@5o1GC?)S50S~{Up>WALBv3p``*KP>tOE5<>k~eHBj4p^?6<7E{dW?G05Wk99 z4%!O3Z%ZcOiH(ENj3UCeecW>}6 ziF&YkzX0h^*l<6-De6>8Rzh8Dx0ia2H@nWu1vzF{ndOVQ%KZ6QdoZo;<0g z_8t|rNUJn!m-E#{QyZ0==kgY4CM~_tEi%wE_zIhy&=s+5&0JJS*h}(G=F`Av_8#Id z{y!5>`n3gEY(1NNn=BB}Y@@PvL z|WGq|$Qx46f zkLqV9WnrpuS%G{>INLeU8$Iyto0hhM!ML6f>Ck+geeHa(hHA5t^r%eq$F2vle|d~V z)pAnf16N1z!9WKmm+~dI9FvVTvo4dJE((r}GS9Yw658)yCw)+A1 zLnN7{l^SE?Vjkl=fr6C-)^pB}oEFD5UGMS*8Ff-9pB#yp*`@elSuk5EKCTRuX;n4D zN91f>h$F+qH(oPxapi~yrV)5JP5=u6zh_*b?W7D+BV5bax3D1U5*$SET*L7jiCLs+ zMyAUvVk=QYea^TFKA<#^#8^1B9em25(Gu||V5OF?p%x(3=n5mj@z9d393Vq4Z2vW~ z7o_u(b0|%bE^etwGq1Vh%r;;haZBGDbM-SiwdJ1ejl~ZbHv8HlAu~X+WE*Z+yG(Rg zqr(HN!qISB-=7-Ec_=JqnUsisO2}a_=|zkfh6aD1_zf0K_#He6{0K`yPQlB;YtDLv zC&CI{v?rPOnyXDDryAPi=yhC&V;r79seKzHv>tFYS>u35D~(QxGt+t4{>CwCOSj*( zJT&{+v@0?8B3s(ZZQIg{);Zxwx8HyYfcx+k0FHc(^aDE(hY$zhp@`G)3d9-&98n9~ c2k(TZ!EV8vz-?eR&;{Lw?2rtagly3N0T7nKCIA2c literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/l.wav.import b/sound/dialogue/animalese/placeholder/l.wav.import new file mode 100644 index 0000000..8193ecf --- /dev/null +++ b/sound/dialogue/animalese/placeholder/l.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bixgnaq4idkhj" +path="res://.godot/imported/l.wav-b21006c3b048e0c797d6baf19ab0f663.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/l.wav" +dest_files=["res://.godot/imported/l.wav-b21006c3b048e0c797d6baf19ab0f663.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/m.wav b/sound/dialogue/animalese/placeholder/m.wav new file mode 100644 index 0000000000000000000000000000000000000000..4660d96c7a0c7cd4475c524f7f7c24bcaabdffb1 GIT binary patch literal 2470 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�h4FFI89oSh|T6kn(0{{ZxARqwyKpm;?29zzeCeoV2%_wpr(`H(cJp zX4e;}EW8rG8&X2IfeFkS=a^%?li=zy!&aiz&lswIGmT6qiIGuw$TnIxz!UpTuAW;1jP!eEDKIh=c(kGb7JC4q`~ zdUD~4fcSz~`_jP3w;^rpJnz#qEn^FPJA>v$_b&+lNhFNDwWKP%A+W@M$}5@Kj}ue0 z=xUV773->VU$*v`{LJMBmNnbZp!wNQYC+(qn6=a@f(2VZ^MnpTF4Ij_{M5L3Zzs?? z-}T?_^xnpGVLo@1OYooK z-0=CpXVl|1OTo-#Yq)<2hP?K3H*;nvSm32&TqjZ{PK9aDNLzJZS>4VeFpnh0`BD;D zW#pf*C+yMAz4`*9TA3>Mo}QEkiUWq0vxyly%#fy>xOu_G?y+TV9m#2u9^(En# z?u|bfc4o2H;sD-$FB${JZ(}?sR+0i4{}KGmxy7pteI3H*GXt7ANANSmET_v}VJk=e zV>@f?v1L1dL?$fzOmb^B@{{E^tHLRTv5tDYfcPum#@O6iwYU6BG3Q-JOKa;$Q^G&^ zH}{|8n#;PIN43Mhj|k-t6}nlytZwGLa=XkiyHW<5N^~0YnB`B?Ia{`iYdZt2LIq=@ z8P^4?!nVbJw-V0ya!v5+E2-5<`Af5xwDZ5_!oKUd%NY>6le35OkzX8l7o*qLmwA=k zNR=>Gc}dB7+DGIS>|AmyvxROaZA1=OorWsiZrK{iBei&@+u-TUaWS#AxMt{@JJ%sH zo-*eud#8uTU-VrZF6zwgzSp^|Evo0UW=i`vuQ#+l>*#F1GrV?kt#nTLM6=AUMaW>i zHPYgPgq!9KI`hO_zwuk!ztAC`hXnil7e{Og-4Jy<{_p6wNtv!gGDc~+eFW-^mKNUEiE z;Exg_apxcvxrDNd*o|%m)}UR8NUK)|Nd=0G357gQw%t%<_Hzp0=g7Rh1?)6zR2-YE zo%n9RqaD?J^3~s6AGWRS>gcF#uX)qnL+pC^cK^_7Y1q`D%51z1nTe0d4?Kk)<)k7U z6`hJ%fvf;4@m1I`^0%H{yrgJe{GqrPsh3v#JMCRcY5eI>@9-_6nurJtDm$hIHEy+^ zX_=X0a?Y_0IqFR1kUUd+UK2NST2ngLG`VAvB0k)Y?k{i3Y^ivLG~Rta^iQeV7btHeA5|jdlw~MNMeLbdKSuUqb4L@*XTcubRC5ohE?j*k>{XzMKSwM)vGf_vN z7U*aEI8f|VB6+TT+AbU=Y)PFZ3LVdogphvDIaS8u`o<&^Is`9$XiCXjuQt;`+n%z__loP z^WhLl_1q@iyp``PhT~mMjDRR3s%Yz2G3*-tWq-CHJ;2D-dpCGzcuS~T7aXl%9;f}q z^5HN9AB*;h_613K>3##ecMERJq9$V2Qvl-t-xr!5E)175*i+O{7r}BiRS@nxj#CpJ5LswGx zq#I--v4A2Y;OQA;Ep;7z2PKT=ODiNt67#9M$r~vp6c2I)sRr+lyN%ri)qtQQ1+KSG z+kQlL*&7|(0J3`n=!0p-G(i&dCe#jeG#CKXIkFrN5H-wQu#OsDZg-lC%vViUELY7q z%Tmi%wm)oNz63x%KiWD`XA&izG46X literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/o.wav.import b/sound/dialogue/animalese/placeholder/o.wav.import new file mode 100644 index 0000000..b094a9f --- /dev/null +++ b/sound/dialogue/animalese/placeholder/o.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://lntkug4avr2k" +path="res://.godot/imported/o.wav-6c18faa9701875d7753d91afcd1b09e6.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/o.wav" +dest_files=["res://.godot/imported/o.wav-6c18faa9701875d7753d91afcd1b09e6.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/p.wav b/sound/dialogue/animalese/placeholder/p.wav new file mode 100644 index 0000000000000000000000000000000000000000..29fdd60361335bc5108c40361da32ae43fce8009 GIT binary patch literal 2470 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 UB5)fx1~32&pmf$d%}#~$|Ja7II{*Lx literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/q.wav.import b/sound/dialogue/animalese/placeholder/q.wav.import new file mode 100644 index 0000000..574c906 --- /dev/null +++ b/sound/dialogue/animalese/placeholder/q.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://ct0decr76agoq" +path="res://.godot/imported/q.wav-d494b927c6f2b8bfbaa44d1f81887731.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/q.wav" +dest_files=["res://.godot/imported/q.wav-d494b927c6f2b8bfbaa44d1f81887731.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/r.wav b/sound/dialogue/animalese/placeholder/r.wav new file mode 100644 index 0000000000000000000000000000000000000000..41fda60f7cc450a2d0d84f8aa0788f741b6d4515 GIT binary patch literal 2470 zcmWNTXIN7Q14i$?xmje9gaAn(7s4I}WeAE|Q9wn-QLD8TErp7;RY7rn4ruE@+p1W# zb)cnnwIWbO1P4oGDJzIT7=eU@kU$c$=ly)nzxO#m-k)dvisa-XA^>bk*qF3^SFVpM z007`e_!|Kr@gV>}fGd!ho|}H;qXPgdfgGS0m;-)+`2faZOz;KVUpNAmfy>2CiSF=aXEa7)zuK>5D44anBSt4^jMebo&WTM(SdcY; zU4$ga<}8H&rA&`(mX}CUr^4_z)ppBoREPR3xe7jHDp6%lWnimmYVeTVg(4%|#7&4- zOvj9@Rc>zjvwdH~DdDx@E>TGN;flVx$kLvg$ogA7lQXr7is35gYqFKanz`qa;l3PJ zVJv~mC~2_=!-jlYJSRi5JaH7Ye>ZZ1pU$+f*7$SUq~c!)csRILug3E z;zcS!9zKc2S!674z5VAYrmGd>oCg{kEeV*C7Jf0DrXrmz+b~)vg+eJTv z$2I@$o;0si){;jWey&dauOy_m8 zg{$;=a+#4fUMLh8&(1)m6TmgSiSi|!YWZb4nNR}vyX6xM9!)`K=9X~x21BuxvnwL^ z28jeOqY`<4_|E-=%NH%U9hFVLK--AhA*h)Fu6f$Wh9tA&Onyecfdnc+!bHrFRIQV_5 zRq+~a8qHVaI!AP68ryhOSGDv~cm43)`gtFAH%E?@x1R5`kDVXeUvqoZAkLkNl)EWA zz-5F(;iEK$cPe*bWP8N_l1c^7V%yiu2=s}SVbRN({Fkor1d$CQ79fA(x3auR&#}jW zWZO08HPRo}5N)2d7(0f{!sU{W`&e<0*be-EmI&=0d!O>I(@R5iR*A6M_;FIpm2UTj zVvMOs(?kYM{d+P@kQ3NmNl1ND3u zvEGEJ&Q!I|lyB<-?$5NU>dYidwfA+MOqV+yiajHl_Xw`|hkD&YIG!)v zuLRx}*rG~EEgr>uy%)ocf~2v1fNbz9B#V=U1Tnw$q52RQMH`+USb^=v++5)XS zQuNdY3#yx=Ju2a-F21jnUehMX56hRJDb7jr^5I7<>GC1H*jgFtnqSB zalc#p7RmnxLPVvybHtVOUxD);$%3mK63>HC?JtPyUEUI#z3|AYZA;0)u72JNJtF?2 zN}d0B3Ah?!IaAEKLk|W8_V&=+4pq&vbB2RNVf$z~en8YIpXyK0#B&J&5kaw=qW=xQ7{1f@ z3cHGO$rWi|Y_0v11>!A$-<`ltHN$SOl8glf`^+4N%KVGC@QV-AmFCe9m` z=5w0K4@Q;qb!Q*D4{nZn@=bM7eb2MmgY_Nm(smg^vR)(5c+ozil|#{_Lw>R-pU}(% z<-&U_i<2tC=ft*AUPP^Dz2>KS$Hdh5JIH!hDX-Q2Z#IX1f)q&U3=>C;h8{&WyKw_= z_(qb7>^n?)dbK&h+Qdq9X_Txo1m1 zUwms|m#ATSci#i6=jdkjLHWHQdPlUZ&cp>e6nVxU?4R;pQJZ}0y*Gv<`iFwiIK7E*G;;m#BZN6O(gUk<<-t zFUeAje0n8rHoOzigJR=Zy~E7VBr4`BIbxuC?n_|<+$wxw=-)Jm?>*852*2!p))Utg z+q+St(~nb0)Jk#_?>CE;jOO~Zg8!ua9hDPoVX=Hl_S|yh|>b=UtcpMlH_5M%_dRonebqCb4|(qN9Hd@#sm1qUA5uw<_e2ctCs0JG zpqzv+6MrEtq_qIY&>J=OtwWEY`%Rw!W!6;H4eghT#>oktVX9!FO;M<< znX+q6&yXe&MUYZu!C1B#o}-(=>*%;9S>I{pTf5Yu8osICddxOxKVyqR^N69uyTCod zY8XRhx?N`-r>u09vKyHxlrq7-jgsAIzFZ~n#3LkmnI$9?A* z_zKo@R$Iillbsu*N>O>;}0`PzS^0Sfv literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/r.wav.import b/sound/dialogue/animalese/placeholder/r.wav.import new file mode 100644 index 0000000..1f196b1 --- /dev/null +++ b/sound/dialogue/animalese/placeholder/r.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dpq7rin4pr1n3" +path="res://.godot/imported/r.wav-d1d419e3246c0e918ff51a9dd662a742.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/r.wav" +dest_files=["res://.godot/imported/r.wav-d1d419e3246c0e918ff51a9dd662a742.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/s.wav b/sound/dialogue/animalese/placeholder/s.wav new file mode 100644 index 0000000000000000000000000000000000000000..f9c542ad1ac0a5f1eceb41cb87b1f3a49c789491 GIT binary patch literal 2470 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 literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/t.wav.import b/sound/dialogue/animalese/placeholder/t.wav.import new file mode 100644 index 0000000..ce35ba2 --- /dev/null +++ b/sound/dialogue/animalese/placeholder/t.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dr0dp5v8fdb8r" +path="res://.godot/imported/t.wav-3a26c5be0f8e3007adf1daa05a6a1ea2.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/t.wav" +dest_files=["res://.godot/imported/t.wav-3a26c5be0f8e3007adf1daa05a6a1ea2.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/u.wav b/sound/dialogue/animalese/placeholder/u.wav new file mode 100644 index 0000000000000000000000000000000000000000..81ebbe556c1a34da0cf43ea0e295ad4994624107 GIT binary patch literal 2470 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 literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/w.wav.import b/sound/dialogue/animalese/placeholder/w.wav.import new file mode 100644 index 0000000..36f4e0f --- /dev/null +++ b/sound/dialogue/animalese/placeholder/w.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://5ml2iuf8cpgt" +path="res://.godot/imported/w.wav-d3e9035a1fc5e7946be782a0d4f95e64.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/w.wav" +dest_files=["res://.godot/imported/w.wav-d3e9035a1fc5e7946be782a0d4f95e64.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/sound/dialogue/animalese/placeholder/x.wav b/sound/dialogue/animalese/placeholder/x.wav new file mode 100644 index 0000000000000000000000000000000000000000..e00f08514d1a3db2ca2f8a4d7d04eace2adf7f6f GIT binary patch literal 2470 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 literal 0 HcmV?d00001 diff --git a/sound/dialogue/animalese/placeholder/z.wav.import b/sound/dialogue/animalese/placeholder/z.wav.import new file mode 100644 index 0000000..12b1b54 --- /dev/null +++ b/sound/dialogue/animalese/placeholder/z.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://djvv63b0jlll" +path="res://.godot/imported/z.wav-3e6ff24f53b1014b381cc80ee9fb1a84.sample" + +[deps] + +source_file="res://sound/dialogue/animalese/placeholder/z.wav" +dest_files=["res://.godot/imported/z.wav-3e6ff24f53b1014b381cc80ee9fb1a84.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/ui/animalese_voice.gd b/ui/animalese_voice.gd new file mode 100644 index 0000000..b963a47 --- /dev/null +++ b/ui/animalese_voice.gd @@ -0,0 +1,123 @@ +class_name AnimaleseVoice +extends Node + +const SAMPLE_DIRECTORY := "res://sound/dialogue/animalese/placeholder" +const SUPPORTED_CHARACTERS := "abcdefghijklmnopqrstuvwxyz" +const DEFAULT_CHARACTERS_PER_SECOND: float = 28.0 +const POLYPHONY: int = 8 +const VoiceProfilesType = preload( + "res://player/animalese_voice_profiles.gd" +) +const TypewriterRevealType = preload("res://ui/typewriter_reveal.gd") + +var base_pitch: float = 1.0 +var volume_db: float = -13.0 + +var _samples: Dictionary[String, AudioStream] = {} +var _player: AudioStreamPlayer +var _playback: AudioStreamPlaybackPolyphonic + + +func _ready() -> void: + _load_samples() + var polyphonic_stream := AudioStreamPolyphonic.new() + polyphonic_stream.polyphony = POLYPHONY + _player = AudioStreamPlayer.new() + _player.name = "AnimaleseAudio" + _player.stream = polyphonic_stream + add_child(_player) + _player.play() + _playback = ( + _player.get_stream_playback() as AudioStreamPlaybackPolyphonic + ) + + +func speak_text( + owner: Node, + text: String, + voice_key: String, + voice_profile_id: String = VoiceProfilesType.DEFAULT_ID, + characters_per_second: float = -1.0, +) -> Tween: + var speech_tween := owner.create_tween() + var resolved_characters_per_second := ( + characters_per_second + if characters_per_second > 0.0 + else TypewriterRevealType.get_characters_per_second() + ) + var character_seconds := 1.0 / maxf( + resolved_characters_per_second, + 1.0, + ) + var voice_pitch := ( + base_pitch * VoiceProfilesType.pitch_for(voice_profile_id) + ) + for character_index: int in range(text.length()): + speech_tween.tween_interval(character_seconds) + speech_tween.tween_callback( + _play_character.bind( + text.substr(character_index, 1), + character_index, + text, + voice_key, + voice_pitch, + ) + ) + return speech_tween + + +func _load_samples() -> void: + for character_index: int in range(SUPPORTED_CHARACTERS.length()): + var character := SUPPORTED_CHARACTERS.substr(character_index, 1) + _load_sample(character) + _load_sample("fallback") + + +func _load_sample(sample_name: String) -> void: + var sample_path := "%s/%s.wav" % [SAMPLE_DIRECTORY, sample_name] + var sample := load(sample_path) as AudioStream + if sample != null: + _samples[sample_name] = sample + + +func _play_character( + character: String, + character_index: int, + full_text: String, + voice_key: String, + voice_pitch: float, +) -> void: + if _playback == null or character.strip_edges().is_empty(): + return + var normalized := character.to_lower() + if normalized in [".", ",", "!", "?", ":", ";", "-", "_"]: + return + var sample_name := ( + normalized if SUPPORTED_CHARACTERS.contains(normalized) else "fallback" + ) + var sample: AudioStream = _samples.get(sample_name) + if sample == null: + return + var speaker_variation := ( + float(posmod(hash(voice_key), 1001)) / 1000.0 - 0.5 + ) * 0.16 + var character_variation := ( + float(posmod(hash("%s:%d" % [voice_key, character_index]), 1001)) + / 1000.0 + - 0.5 + ) * 0.10 + var question_lift := 0.0 + if full_text.ends_with("?") and character_index >= full_text.length() * 3 / 4: + var final_progress := ( + float(character_index) / maxf(float(full_text.length() - 1), 1.0) + ) + question_lift = lerpf(0.0, 0.14, final_progress) + var pitch := clampf( + voice_pitch + + speaker_variation + + character_variation + + question_lift, + 0.72, + 1.45, + ) + _playback.play_stream(sample, 0.0, volume_db, pitch) diff --git a/ui/animalese_voice.gd.uid b/ui/animalese_voice.gd.uid new file mode 100644 index 0000000..4cfdf9b --- /dev/null +++ b/ui/animalese_voice.gd.uid @@ -0,0 +1 @@ +uid://djst00wf8yntj diff --git a/ui/assets/logbook/ui_logbook.png b/ui/assets/logbook/ui_logbook.png new file mode 100644 index 0000000000000000000000000000000000000000..2e6126df440c21253d7bf62be894d9adec8c96bb GIT binary patch literal 116013 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 void: _collapse_button.mouse_filter = Control.MOUSE_FILTER_STOP _collapse_button.focus_mode = Control.FOCUS_ALL _collapse_button.z_index = 3 + _collapse_button.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + _collapse_button.expand_icon = true + _collapse_button.alignment = HORIZONTAL_ALIGNMENT_CENTER + _collapse_button.icon_alignment = HORIZONTAL_ALIGNMENT_CENTER + _collapse_button.vertical_icon_alignment = VERTICAL_ALIGNMENT_CENTER + _collapse_button.add_theme_constant_override( + "icon_max_width", + roundi(minf(HANDLE_SIZE.x, HANDLE_SIZE.y) * 0.5), + ) _collapse_button.tooltip_text = "Collapse chat" _collapse_button.pressed.connect(func() -> void: if _presentation_state == PresentationState.COLLAPSED: @@ -405,6 +435,15 @@ func _build_ui() -> void: _height_button.mouse_filter = Control.MOUSE_FILTER_STOP _height_button.focus_mode = Control.FOCUS_ALL _height_button.z_index = 3 + _height_button.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + _height_button.expand_icon = true + _height_button.alignment = HORIZONTAL_ALIGNMENT_CENTER + _height_button.icon_alignment = HORIZONTAL_ALIGNMENT_CENTER + _height_button.vertical_icon_alignment = VERTICAL_ALIGNMENT_CENTER + _height_button.add_theme_constant_override( + "icon_max_width", + roundi(minf(HANDLE_SIZE.x, HANDLE_SIZE.y) * 0.5), + ) _height_button.pressed.connect(func() -> void: if _presentation_state == PresentationState.COLLAPSED: _visible_state_before_collapse = ( @@ -461,6 +500,9 @@ func _build_ui() -> void: _speech_layer.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) _speech_layer.mouse_filter = Control.MOUSE_FILTER_IGNORE add_child(_speech_layer) + _animalese_voice = AnimaleseVoiceType.new() + _animalese_voice.name = "PlayerAnimaleseVoice" + add_child(_animalese_voice) _draft_save_timer = Timer.new() _draft_save_timer.one_shot = true _draft_save_timer.wait_time = DRAFT_SAVE_DELAY @@ -478,7 +520,7 @@ func _build_ui() -> void: func _chat_panel_style() -> StyleBoxFlat: - var style := _borderless_style(Color(0.025, 0.13, 0.19, 0.94)) + var style := _borderless_style(CHAT_SURFACE_COLOR) if _mobile_mode: style.corner_radius_top_left = 0 style.corner_radius_top_right = 0 @@ -509,7 +551,7 @@ func _refresh_input_ownership() -> void: func _clock_panel_style() -> StyleBoxFlat: - var style := _borderless_style(Color(0.025, 0.13, 0.19, 0.94)) + var style := _borderless_style(CHAT_SURFACE_COLOR) style.set_corner_radius_all(12) style.content_margin_left = 10 style.content_margin_right = 10 @@ -522,6 +564,10 @@ func _borderless_style(color: Color) -> StyleBoxFlat: var style := StyleBoxFlat.new() style.bg_color = color style.set_border_width_all(0) + style.anti_aliasing = false + style.shadow_size = 0 + style.shadow_color = Color.TRANSPARENT + style.shadow_offset = Vector2.ZERO return style @@ -530,6 +576,12 @@ func _flat_chat_button_style(color: Color) -> StyleBoxFlat: style.bg_color = color style.set_border_width_all(0) style.set_corner_radius_all(0) + if _dock_right: + style.corner_radius_top_left = 10 + style.corner_radius_bottom_left = 10 + else: + style.corner_radius_top_right = 10 + style.corner_radius_bottom_right = 10 style.anti_aliasing = false style.shadow_size = 0 style.shadow_color = Color.TRANSPARENT @@ -572,6 +624,18 @@ func _apply_flat_chat_button(button: Button) -> void: button.add_theme_stylebox_override( "disabled", _flat_chat_button_style(UtilityPageStyle.OCEAN_DISABLED) ) + for state: StringName in [ + &"normal", + &"hover", + &"pressed", + &"hover_pressed", + &"focus", + &"disabled", + ]: + button.add_theme_stylebox_override( + state, + _flat_chat_button_style(CHAT_SURFACE_COLOR), + ) func _speech_panel_style() -> StyleBoxFlat: @@ -605,6 +669,8 @@ func _send() -> void: if _send_pending: return var body := _entry.text + if _handle_chat_command(body): + return _send_pending = true _pending_send_body = NetworkChatProtocol.sanitize_body(body) _entry.editable = false @@ -616,6 +682,59 @@ func _send() -> void: _set_status("Sending…") +func _handle_chat_command(body: String) -> bool: + var command_text := body.strip_edges() + if not command_text.begins_with("/"): + return false + var parts: PackedStringArray = command_text.split(" ", false) + var command := String(parts[0]).trim_prefix("/").to_lower() + match command: + "time": + _handle_time_command(parts) + "": + _set_status("Enter a command after /.") + _: + _set_status("Unknown command: /%s" % command) + _entry.clear() + _flush_draft() + return true + + +func _handle_time_command(parts: PackedStringArray) -> void: + if parts.size() != 2: + _set_status("Usage: /time [dawn, day, dusk, night]") + return + if _session == null or not _session.is_host(): + _set_status("Only the host can change world time.") + return + if _world_time == null: + _set_status("World time is unavailable.") + return + var phase_name := String(parts[1]).to_lower() + var target_hour: float + match phase_name: + "dawn": + target_hour = WorldTimeServiceType.DAWN_START_HOUR + "day": + target_hour = WorldTimeServiceType.DAWN_END_HOUR + "dusk": + target_hour = WorldTimeServiceType.DUSK_START_HOUR + "night": + target_hour = WorldTimeServiceType.DUSK_END_HOUR + _: + _set_status("Usage: /time [dawn, day, dusk, night]") + return + if not _world_time.set_authoritative_time(target_hour): + _set_status("World time could not be changed.") + return + _set_status("") + _service.broadcast_system_message( + "World time set to %s (%s)." + % [phase_name, _world_time.get_clock_text()] + ) + close_chat() + + func _on_local_message_confirmed(message: Dictionary) -> void: if ( not _send_pending @@ -664,10 +783,27 @@ func _on_message(message: Dictionary) -> void: ) bubble.add_child(label) _speech_layer.add_child(bubble) + var reveal_seconds := TypewriterRevealType.start(label) + var voice_profile_id: String = VoiceProfilesType.DEFAULT_ID + var speaker_avatar := _spawn.get_avatar(peer_id) + if speaker_avatar != null: + voice_profile_id = VoiceProfilesType.sanitized_id( + speaker_avatar.get_animalese_voice_id() + ) + _animalese_voice.speak_text( + label, + label.text, + str(peer_id), + voice_profile_id, + ) _speech[peer_id] = { "bubble": bubble, "pointer": pointer, - "expires": Time.get_ticks_msec() / 1000.0 + SPEECH_SECONDS, + "expires": ( + Time.get_ticks_msec() / 1000.0 + + reveal_seconds + + SPEECH_SECONDS + ), "fingerprint": str(message.get("sender_fingerprint", "")), } @@ -770,6 +906,8 @@ func set_dock_right(should_dock_right: bool) -> void: if not is_node_ready() or _panel == null: return _panel.add_theme_stylebox_override("panel", _chat_panel_style()) + _apply_flat_chat_button(_collapse_button) + _apply_flat_chat_button(_height_button) _refresh_handle_labels(_presentation_state) _layout_presentation(false) @@ -800,21 +938,24 @@ func is_mobile_mode() -> bool: func _refresh_handle_labels(state: PresentationState) -> void: var collapsed := state == PresentationState.COLLAPSED var height_state := _visible_state_before_collapse if collapsed else state - if _mobile_mode: - _collapse_button.text = "v" if collapsed else "^" - elif _dock_right: - _collapse_button.text = "<" if collapsed else ">" - else: - _collapse_button.text = ">" if collapsed else "<" + _collapse_button.text = "" + _collapse_button.icon = CHAT_SHOW_ICON if collapsed else CHAT_HIDE_ICON _collapse_button.tooltip_text = ( "Show chat" if collapsed else "Hide chat" ) - _height_button.text = "v" if height_state == PresentationState.EXPANDED else "^" + _collapse_button.accessibility_name = _collapse_button.tooltip_text + _height_button.text = "" + _height_button.icon = ( + CHAT_COMPACT_ICON + if height_state == PresentationState.EXPANDED + else CHAT_EXPAND_ICON + ) _height_button.tooltip_text = ( "Compact chat" if height_state == PresentationState.EXPANDED else "Expand chat history" ) + _height_button.accessibility_name = _height_button.tooltip_text func _update_panel_opacity(immediate_recheck: bool = false) -> void: @@ -823,10 +964,8 @@ func _update_panel_opacity(immediate_recheck: bool = false) -> void: if _presentation_state == PresentationState.COLLAPSED: if _height_tween == null or not _height_tween.is_running(): _panel.modulate.a = IDLE_ALPHA - _collapse_button.modulate.a = ( - 1.0 if _collapsed_has_unread else 0.82 - ) - _height_button.modulate.a = 0.82 + _collapse_button.modulate.a = IDLE_ALPHA + _height_button.modulate.a = IDLE_ALPHA return var recent := ( Time.get_ticks_msec() / 1000.0 - _last_message_time < RECENT_SECONDS diff --git a/ui/components/bubble_menu/bubble_button.gd b/ui/components/bubble_menu/bubble_button.gd index 15acb0e..32cdef3 100644 --- a/ui/components/bubble_menu/bubble_button.gd +++ b/ui/components/bubble_menu/bubble_button.gd @@ -1,6 +1,8 @@ class_name BubbleButton extends Button +const ICON_FILL_RATIO: float = 0.76 + @export var profile: BubbleMenuProfile @export_group("Authored Layout") @@ -37,6 +39,7 @@ func _ready() -> void: resized.connect(_update_pivot) _update_pivot() apply_profile() + _apply_icon_presentation(neutral_size) func apply_layout( @@ -49,6 +52,7 @@ func apply_layout( neutral_position = position presented_size = bubble_size _update_pivot() + _apply_icon_presentation(bubble_size) var label_control: Control = get_label_control() var font_size := clampi( roundi(minf(bubble_size.x, bubble_size.y) * font_size_ratio), @@ -63,6 +67,9 @@ func get_layout_size(layout_scale: float, compact: bool) -> Vector2: if compact: bubble_size.x = maxf(bubble_size.x, compact_minimum_size.x) bubble_size.y = maxf(bubble_size.y, compact_minimum_size.y) + if _uses_icon_only_presentation(): + var diameter: float = maxf(bubble_size.x, bubble_size.y) + bubble_size = Vector2(diameter, diameter) return bubble_size @@ -78,6 +85,24 @@ func get_label_control() -> Control: return self +func _uses_icon_only_presentation() -> bool: + return icon != null and text.is_empty() and label_control_path.is_empty() + + +func _apply_icon_presentation(bubble_size: Vector2) -> void: + if not _uses_icon_only_presentation(): + return + alignment = HORIZONTAL_ALIGNMENT_CENTER + icon_alignment = HORIZONTAL_ALIGNMENT_CENTER + vertical_icon_alignment = VERTICAL_ALIGNMENT_CENTER + expand_icon = true + texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + add_theme_constant_override( + "icon_max_width", + maxi(1, roundi(minf(bubble_size.x, bubble_size.y) * ICON_FILL_RATIO)), + ) + + func advance_emphasis(delta: float) -> void: var target: float = 1.0 if _hovered or _focused else 0.0 emphasis = move_toward( @@ -122,6 +147,8 @@ func calculate_visual_scale( * motion_scale * lerpf(1.0, profile.emphasized_deformation_scale, emphasis) ) + if _uses_icon_only_presentation(): + deformation_amount = 0.0 var hover_scale: float = lerpf( 1.0, profile.hover_focus_scale, diff --git a/ui/fishing_shop.tscn b/ui/fishing_shop.tscn index 2b1914d..80f6e21 100644 --- a/ui/fishing_shop.tscn +++ b/ui/fishing_shop.tscn @@ -5,7 +5,7 @@ [ext_resource type="Texture2D" path="res://items/icons/placeholder/reel_speed_upgrade.svg" id="3_reel"] [ext_resource type="Texture2D" path="res://items/icons/placeholder/barrier_power_upgrade.svg" id="4_barrier"] [ext_resource type="Texture2D" path="res://items/icons/placeholder/fish_coin.svg" id="5_coin"] -[ext_resource type="Texture2D" path="res://items/icons/placeholder/cooler_expansion.svg" id="6_cooler"] +[ext_resource type="Texture2D" path="res://items/icons/equipment/64_cooler_plus.png" id="6_cooler"] [node name="FishingShop" type="Control"] unique_name_in_owner = true @@ -196,7 +196,7 @@ layout_mode = 2 theme_override_constants/separation = 9 [node name="Icon" type="TextureRect" parent="ShopPanel/Margin/Layout/Body/Upgrades/ReelCard/Margin/Row"] -custom_minimum_size = Vector2(44, 44) +custom_minimum_size = Vector2(88, 88) layout_mode = 2 texture = ExtResource("3_reel") expand_mode = 1 @@ -250,7 +250,7 @@ layout_mode = 2 theme_override_constants/separation = 9 [node name="Icon" type="TextureRect" parent="ShopPanel/Margin/Layout/Body/Upgrades/BarrierCard/Margin/Row"] -custom_minimum_size = Vector2(44, 44) +custom_minimum_size = Vector2(88, 88) layout_mode = 2 texture = ExtResource("4_barrier") expand_mode = 1 @@ -304,7 +304,7 @@ layout_mode = 2 theme_override_constants/separation = 9 [node name="Icon" type="TextureRect" parent="ShopPanel/Margin/Layout/Body/Upgrades/CoolerCard/Margin/Row"] -custom_minimum_size = Vector2(44, 44) +custom_minimum_size = Vector2(88, 88) layout_mode = 2 texture = ExtResource("6_cooler") expand_mode = 1 diff --git a/ui/game_ui.gd b/ui/game_ui.gd index 830f291..a684e8a 100644 --- a/ui/game_ui.gd +++ b/ui/game_ui.gd @@ -12,6 +12,7 @@ const PlayerMenuType = preload("res://ui/player_menu.gd") const PlayerType = preload("res://player/player.gd") const PlayerWalletType = preload("res://economy/player_wallet.gd") const ItemCatalogType = preload("res://items/item_catalog.gd") +const ItemDataType = preload("res://items/item_data.gd") const PlayerBagType = preload("res://inventory/player_bag.gd") const PlayerHotbarType = preload("res://inventory/player_hotbar.gd") const HotbarUIType = preload("res://ui/hotbar.gd") @@ -57,6 +58,12 @@ const PlayerExperienceType = preload( const UIReferencePresentationType = preload( "res://ui/ui_reference_presentation.gd" ) +const MAIN_BUBBLE_PROFILE: BubbleMenuProfile = preload( + "res://ui/components/bubble_menu/bubble_menu_profile.tres" +) +const ACTIVE_BAIT_EMPTY_ICON: Texture2D = preload( + "res://ui/icons/pictograms/x_dark.png" +) signal pixelation_settings_visibility_changed(is_visible: bool) signal crisp_reset_focus_requested @@ -85,6 +92,9 @@ const FISHING_PANEL_SHOWCASE_BOTTOM_OFFSET: float = -104.0 @onready var _status_label: Label = %StatusLabel @onready var _gameplay_transient_hud: Control = %GameplayTransientHUD +@onready var _active_bait_button: Button = %ActiveBaitButton +@onready var _active_bait_quantity_badge: Panel = %ActiveBaitQuantityBadge +@onready var _active_bait_quantity: Label = %ActiveBaitQuantity @onready var _experience_presentation: Control = %ExperiencePresentation @onready var _catch_track: Control = %CatchTrack @onready var _green_catch_progress: ProgressBar = %GreenCatchProgress @@ -101,6 +111,13 @@ const FISHING_PANEL_SHOWCASE_BOTTOM_OFFSET: float = -104.0 @onready var _experience_progress: ProgressBar = %ExperienceProgress @onready var _experience_bubble: PanelContainer = %ExperienceBubble @onready var _experience_bubble_label: Label = %ExperienceBubbleLabel +const TypewriterRevealType = preload("res://ui/typewriter_reveal.gd") +const AnimaleseVoiceType = preload("res://ui/animalese_voice.gd") +const SHOP_ANIMALESE_VOICE_ID: String = "natural" +const SHOP_ANIMALESE_BASE_PITCH: float = 1.08 +const SHOP_SPEECH_CHARACTERS_PER_SECOND: float = 28.0 + + @onready var _canonical_stage: Control = %CanonicalStage @onready var _ui_root: Control = %UIRoot @onready var _player_menu: PlayerMenuType = %PlayerMenu @@ -109,7 +126,13 @@ const FISHING_PANEL_SHOWCASE_BOTTOM_OFFSET: float = -104.0 @onready var _pause_menu: PauseMenuType = %PauseMenu @onready var _hotbar_ui: HotbarUIType = %Hotbar @onready var _fishing_shop: FishingShopType = %FishingShop -@onready var _shop_prompt: PanelContainer = %ShopPrompt +@onready var _shop_prompt: Control = %ShopPrompt +@onready var _shop_prompt_bubble: PanelContainer = %ShopPromptBubble +@onready var _shop_prompt_message: Label = %ShopPromptMessage +@onready var _shop_prompt_key_badge: Panel = %ShopPromptKeyBadge +@onready var _shop_prompt_key: Label = %ShopPromptKey +@onready var _shop_prompt_pointer: Polygon2D = %ShopPromptPointer +var _shop_animalese_voice: AnimaleseVoiceType @onready var _effect_status: Label = %EffectStatus @onready var _chat_ui: ChatUIType = %ChatUI @onready var _emote_radial_menu: EmoteRadialMenuType = %EmoteRadialMenu @@ -129,6 +152,8 @@ const FISHING_PANEL_SHOWCASE_BOTTOM_OFFSET: float = -104.0 var _showcase_active: bool = false var _player: PlayerType +var _bag: PlayerBagType +var _item_catalog: ItemCatalogType var _player_menu_open: bool = false var _gameplay_ui_enabled: bool = false var _fishing_spot: FishingSpotType @@ -163,6 +188,8 @@ var _settings_manager: PlayerSettingsManagerType func _ready() -> void: + _apply_active_bait_indicator_style() + _refresh_active_bait_indicator() # Reward feedback must remain above full-screen canonical menus. Keeping the # overlay as the final stage child makes that ownership explicit instead of # relying on scene declaration order when another menu adds high-z children. @@ -236,10 +263,27 @@ func setup( world_sun: DirectionalLight3D, ) -> void: _player = player + _bag = bag + _item_catalog = item_catalog _settings_manager = settings_manager _fishing_spot = fishing_spot _item_effects = item_effects _experience = experience + if ( + _player != null + and not _player.active_bait_changed.is_connected( + _on_hud_active_bait_changed + ) + ): + _player.active_bait_changed.connect(_on_hud_active_bait_changed) + if ( + _bag != null + and not _bag.contents_changed.is_connected( + _on_hud_bait_inventory_changed + ) + ): + _bag.contents_changed.connect(_on_hud_bait_inventory_changed) + _refresh_active_bait_indicator() if ( _experience != null and not _experience.experience_awarded.is_connected( @@ -1174,6 +1218,88 @@ func get_pause_menu() -> PauseMenuType: return _pause_menu +func _apply_active_bait_indicator_style() -> void: + var normal_style: StyleBoxFlat = MAIN_BUBBLE_PROFILE.make_normal_style() + var hover_style: StyleBoxFlat = MAIN_BUBBLE_PROFILE.make_hover_style() + var pressed_style: StyleBoxFlat = MAIN_BUBBLE_PROFILE.make_pressed_style() + var disabled_style: StyleBoxFlat = MAIN_BUBBLE_PROFILE.make_disabled_style() + for style: StyleBoxFlat in [ + normal_style, + hover_style, + pressed_style, + disabled_style, + ]: + style.set_corner_radius_all(36) + style.content_margin_left = 13.5 + style.content_margin_top = 13.5 + style.content_margin_right = 13.5 + style.content_margin_bottom = 13.5 + _active_bait_button.add_theme_stylebox_override("normal", normal_style) + _active_bait_button.add_theme_stylebox_override("hover", hover_style) + _active_bait_button.add_theme_stylebox_override("focus", hover_style) + _active_bait_button.add_theme_stylebox_override("pressed", pressed_style) + _active_bait_button.add_theme_stylebox_override("disabled", disabled_style) + for state: StringName in [ + &"icon_normal_color", + &"icon_hover_color", + &"icon_focus_color", + &"icon_pressed_color", + ]: + _active_bait_button.add_theme_color_override(state, Color.WHITE) + var badge_style := StyleBoxFlat.new() + badge_style.bg_color = Color("0b5558") + badge_style.set_corner_radius_all(12) + badge_style.anti_aliasing = false + _active_bait_quantity_badge.add_theme_stylebox_override( + "panel", + badge_style, + ) + + +func _refresh_active_bait_indicator() -> void: + if not is_node_ready(): + return + var item: ItemDataType + if ( + _player != null + and _item_catalog != null + and not _player.active_bait_id.is_empty() + ): + item = _item_catalog.get_item_by_id(_player.active_bait_id) + var has_active_bait: bool = item != null and item.is_bait() + _active_bait_button.icon = ( + item.icon + if has_active_bait and item.icon != null + else ACTIVE_BAIT_EMPTY_ICON + ) + _active_bait_quantity_badge.visible = has_active_bait + if not has_active_bait: + _active_bait_button.tooltip_text = "no bait selected" + return + var quantity: int = ( + _bag.get_quantity(item.item_id) + if _bag != null + else 0 + ) + _active_bait_quantity.text = str(quantity) + _active_bait_quantity.add_theme_font_size_override( + "font_size", + 13 if quantity >= 100 else 15, + ) + _active_bait_button.tooltip_text = "%s ×%d" % [ + item.display_name, + quantity, + ] + + +func _on_hud_active_bait_changed(_item_id: StringName) -> void: + _refresh_active_bait_indicator() + + +func _on_hud_bait_inventory_changed() -> void: + _refresh_active_bait_indicator() + + func set_gameplay_ui_enabled(enabled: bool) -> void: _gameplay_ui_enabled = enabled _gameplay_transient_hud.visible = enabled and not _player_menu_open @@ -1231,7 +1357,12 @@ func get_fishing_shop() -> FishingShopType: return _fishing_shop -func set_shop_prompt_visible(is_visible: bool) -> void: +func set_shop_prompt_visible( + is_visible: bool, + world_anchor: Vector3 = Vector3(0.0, INF, 0.0), +) -> void: + _apply_shop_prompt_style() + var was_visible := _shop_prompt.visible _shop_prompt.visible = ( is_visible and _gameplay_ui_enabled @@ -1239,6 +1370,112 @@ func set_shop_prompt_visible(is_visible: bool) -> void: and not _player_menu_open and not _shop_open ) + if _shop_prompt.visible: + if not was_visible: + _ensure_shop_animalese_voice() + TypewriterRevealType.start( + _shop_prompt_message, + SHOP_SPEECH_CHARACTERS_PER_SECOND, + ) + _shop_animalese_voice.speak_text( + _shop_prompt_message, + _shop_prompt_message.text, + "shopkeeper", + SHOP_ANIMALESE_VOICE_ID, + SHOP_SPEECH_CHARACTERS_PER_SECOND, + ) + if world_anchor.is_finite(): + _position_shop_prompt(world_anchor) + + +func _ensure_shop_animalese_voice() -> void: + if _shop_animalese_voice != null: + return + _shop_animalese_voice = AnimaleseVoiceType.new() + _shop_animalese_voice.name = "ShopAnimaleseVoice" + _shop_animalese_voice.base_pitch = SHOP_ANIMALESE_BASE_PITCH + add_child(_shop_animalese_voice) + + +func _apply_shop_prompt_style() -> void: + if _shop_prompt.has_meta(&"shop_prompt_styled"): + return + _shop_prompt.set_meta(&"shop_prompt_styled", true) + var bubble_style := StyleBoxFlat.new() + bubble_style.bg_color = Color(UtilityPageStyle.OCEAN_PANEL_MID, 0.96) + bubble_style.set_border_width_all(0) + bubble_style.set_corner_radius_all(12) + bubble_style.anti_aliasing = false + _shop_prompt_bubble.add_theme_stylebox_override("panel", bubble_style) + var badge_style := StyleBoxFlat.new() + badge_style.bg_color = Color("0b5558") + badge_style.set_border_width_all(0) + badge_style.set_corner_radius_all(12) + badge_style.anti_aliasing = false + _shop_prompt_key_badge.add_theme_stylebox_override("panel", badge_style) + for label: Label in [_shop_prompt_message, _shop_prompt_key]: + label.add_theme_font_override("font", UtilityPageStyle.TuffyFont) + label.add_theme_color_override( + "font_color", + UtilityPageStyle.OCEAN_TEXT_PRIMARY, + ) + _shop_prompt_pointer.color = Color( + UtilityPageStyle.OCEAN_PANEL_MID, + 0.96, + ) + + +func _position_shop_prompt(world_anchor: Vector3) -> void: + if _player == null: + _shop_prompt.hide() + return + var camera: Camera3D = _player.get_gameplay_camera() + if camera == null or camera.is_position_behind(world_anchor): + _shop_prompt.hide() + return + var camera_viewport_size := camera.get_viewport().get_visible_rect().size + var ui_viewport_size: Vector2 = _canonical_stage.size + if camera_viewport_size.x <= 0.0 or camera_viewport_size.y <= 0.0: + _shop_prompt.hide() + return + var screen_position := ( + camera.unproject_position(world_anchor) + * ui_viewport_size + / camera_viewport_size + ) + if ( + screen_position.x < -80.0 + or screen_position.x > ui_viewport_size.x + 80.0 + or screen_position.y < -80.0 + or screen_position.y > ui_viewport_size.y + 80.0 + ): + _shop_prompt.hide() + return + var pointer_height := 10.0 + var desired := screen_position - Vector2( + _shop_prompt.size.x * 0.5, + _shop_prompt.size.y + pointer_height, + ) + _shop_prompt.position = Vector2( + clampf( + desired.x, + 8.0, + ui_viewport_size.x - _shop_prompt.size.x - 8.0, + ), + clampf( + desired.y, + 8.0, + ui_viewport_size.y - _shop_prompt.size.y - pointer_height - 8.0, + ), + ) + _shop_prompt_pointer.position = Vector2( + clampf( + screen_position.x - _shop_prompt.position.x, + 20.0, + _shop_prompt.size.x - 20.0, + ), + _shop_prompt.size.y - 1.0, + ) func get_screen_fade() -> ScreenFade: diff --git a/ui/game_ui.tscn b/ui/game_ui.tscn index 0726da0..ed97ac5 100644 --- a/ui/game_ui.tscn +++ b/ui/game_ui.tscn @@ -82,6 +82,71 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 +[node name="ActiveBaitIndicator" type="Control" parent="UIRoot/CanonicalStage/GameplayTransientHUD"] +unique_name_in_owner = true +z_index = 54 +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -88.0 +offset_top = -88.0 +offset_right = -16.0 +offset_bottom = -16.0 +grow_horizontal = 0 +grow_vertical = 0 +mouse_filter = 2 +theme = ExtResource("3_theme") + +[node name="ActiveBaitButton" type="Button" parent="UIRoot/CanonicalStage/GameplayTransientHUD/ActiveBaitIndicator"] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +focus_mode = 0 +texture_filter = 1 +expand_icon = true +alignment = 1 +icon_alignment = 1 +vertical_icon_alignment = 1 + +[node name="ActiveBaitQuantityBadge" type="Panel" parent="UIRoot/CanonicalStage/GameplayTransientHUD/ActiveBaitIndicator"] +unique_name_in_owner = true +z_index = 2 +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -27.0 +offset_top = 3.0 +offset_right = -3.0 +offset_bottom = 27.0 +grow_horizontal = 0 +mouse_filter = 2 + +[node name="ActiveBaitQuantity" type="Label" parent="UIRoot/CanonicalStage/GameplayTransientHUD/ActiveBaitIndicator/ActiveBaitQuantityBadge"] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 1.0 +offset_right = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme_override_colors/font_color = Color(0.905882, 0.960784, 0.956863, 1) +theme_override_font_sizes/font_size = 15 +text = "0" +horizontal_alignment = 1 +vertical_alignment = 1 + [node name="ExperiencePresentation" type="Control" parent="UIRoot/CanonicalStage"] unique_name_in_owner = true z_index = 200 @@ -333,35 +398,67 @@ unique_name_in_owner = true [node name="QuickRadialMenu" parent="UIRoot/CanonicalStage" instance=ExtResource("12_quick")] unique_name_in_owner = true -[node name="ShopPrompt" type="PanelContainer" parent="UIRoot/CanonicalStage/GameplayTransientHUD"] +[node name="ShopPrompt" type="Control" parent="UIRoot/CanonicalStage/GameplayTransientHUD"] unique_name_in_owner = true visible = false z_index = 55 -anchors_preset = 7 -anchor_left = 0.5 -anchor_top = 1.0 -anchor_right = 0.5 -anchor_bottom = 1.0 -offset_left = -150.0 -offset_top = -284.0 -offset_right = 150.0 -offset_bottom = -246.0 -grow_horizontal = 2 -grow_vertical = 0 +offset_right = 300.0 +offset_bottom = 72.0 mouse_filter = 2 theme = ExtResource("3_theme") -[node name="Margin" type="MarginContainer" parent="UIRoot/CanonicalStage/GameplayTransientHUD/ShopPrompt"] +[node name="ShopPromptBubble" type="PanelContainer" parent="UIRoot/CanonicalStage/GameplayTransientHUD/ShopPrompt"] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Margin" type="MarginContainer" parent="UIRoot/CanonicalStage/GameplayTransientHUD/ShopPrompt/ShopPromptBubble"] layout_mode = 2 theme_override_constants/margin_left = 12 -theme_override_constants/margin_top = 7 +theme_override_constants/margin_top = 8 theme_override_constants/margin_right = 12 -theme_override_constants/margin_bottom = 7 +theme_override_constants/margin_bottom = 8 -[node name="Label" type="Label" parent="UIRoot/CanonicalStage/GameplayTransientHUD/ShopPrompt/Margin"] +[node name="ShopPromptMessage" type="Label" parent="UIRoot/CanonicalStage/GameplayTransientHUD/ShopPrompt/ShopPromptBubble/Margin"] +unique_name_in_owner = true layout_mode = 2 -text = "press e to open fishing shop" +theme_override_font_sizes/font_size = 18 +text = "Hey, if you've got any fish I've got cash! OwO" horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="ShopPromptKeyBadge" type="Panel" parent="UIRoot/CanonicalStage/GameplayTransientHUD/ShopPrompt"] +unique_name_in_owner = true +layout_mode = 0 +offset_left = 282.0 +offset_top = -8.0 +offset_right = 306.0 +offset_bottom = 16.0 +mouse_filter = 2 + +[node name="ShopPromptKey" type="Label" parent="UIRoot/CanonicalStage/GameplayTransientHUD/ShopPrompt/ShopPromptKeyBadge"] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme_override_font_sizes/font_size = 15 +text = "E" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="ShopPromptPointer" type="Polygon2D" parent="UIRoot/CanonicalStage/GameplayTransientHUD/ShopPrompt"] +unique_name_in_owner = true +polygon = PackedVector2Array(-8, 0, 8, 0, 0, 10) [node name="FishingShop" parent="UIRoot/CanonicalStage" instance=ExtResource("8_shop")] unique_name_in_owner = true diff --git a/ui/icons/pictograms/arrow_dark_down_full.png b/ui/icons/pictograms/arrow_dark_down_full.png new file mode 100644 index 0000000000000000000000000000000000000000..e2bdb9e739eceb757ff60083ae10dc406d0843fd GIT binary patch literal 1883 zcmY+C2|U}`7RPU5NvzdY8?|QC5+V{?R8$kS#o9E?6I6=`4TB7!O)ZsRXlhMb`UdUP z@R*XKsy>)niZWA1->9crwAEUxm=3j#dVkZ``ON!#?mg$;^Sj@3KA&^XC7PFulDxV+ z06@u=>PUw?Wp^W`AY0nRUjP86&3160v6)N&)UIC5t9R?7sb#cB-gT2;Fq1D;%EcIg zsaB*`OIC=_+4(Ewo?2fixpo`o=a!|3(ep1gW+&0d_%x1+%#BXrCj28ZEB=Ca(!RI&Qj-V!9@?H8M6W47JGn4w z$Qeq%H1qV)^{!>usiu(H`|44s*K4b#b~EAPSo7hB)1-X3fnRX06LKtLBU)FS*@iND zKJ@saVyS}>8DG9|O7KDYoaf+s38ormcUvLGmk|13R;s)yWlke&6Rs#!ZG$D6c*TET zA_<2YhGtUfo&a1h03bCTfK4crItxHN0f6}+07%yWKygZ1P9B8>KF!0&3GzrZR!Q9e zse@J0z(5wd?%KZ=+C&a*j70BBa-SqLR#w{>7#bpUut41cSXg{|3^Z-zw6O>s6DWhc zHtv5x0OUTW+Liu1e~uVK)t~cPmLZ4X(!IRFP1WxG=|A_)ZGXJ=0R1~B^chy^w!F;7 zrrgni7K_ynu;sLw?EXg$YCC$Z5CaQwcX0$+GFnvVBFCZn#Q|V?cz46jSCA8+AcE`a z>4ca^B2boqyHt4$Vq7lxFu3&Kb7)R%Oc?ts7MjcBu+V=F7p92_gx^2$ad0Zl`m!tZfDLsb{PKE^Qz8STCk&)s6 zcW_AinD&iuG0V5?md^|Uu65%WF<{H~L;mQSsfzx-LKSO4kqvPSU)SHcH^7lW>$iwZ zA(z{Kak;KqfK)w{jcpIZ=ywnFaHpFpDi>!9I`F8VW!k9?<`m9Oav&SLrK0h?JpuhAgVVnj>&AX@2W{?3o=hK*6pmU7pf2lkofzEEU@nWqjAcO%m=ny2 zIKmMe!P>{%f@En!vLs>&1QLOe+`Etce?U}BC_9Yzcfib&M6f2ATYmz&Qu}-$0P|M` zE<1`9#|@6+{GEY{SeZlVKQS4JSGFN$?=A!VD~TDy;l;AU&vJnm-d@A`yNi&h`dJKR z#W7>q94qmXv*YSl=b2xLbJU4#IvXIfI|$Zaua>otWKwJ)->k1b<3#j{iR? zz3Po)ZO90CX;AhZDt}GgZab+jT7nvF5~xaBwVFIK9<;qcn!v>lwyNKU9TEOUQ0(CZ zGIoS(nO!jPz9QBluPBo&`^?PxRRqy5Iail}*P=$=nQKq3w|j!bm24EJQ4(}q4OHvr z1b#V{@)IcOGor5(4mM9zKh+FpU~XpcQ`dSvmMu=ew#*~enCT6CZbz9t$lVV&mD{*3 zHplN-PimXX@(y1)>qlm7M>L-GUwTJ-wWAO)>?&Qo$tL7EANMx>R_Vtt$Nk^^h_v?~ zN($67x;I5mUbh-aHxa6i8*5LPFmN622{DxOGctDzn(wXKFyF2wnb|q*mkC$ZtK!n% zVp~qm>4^lQp(y(Bwc-Enoa_hEFsE9_NRaaxK0#n@Tj)-JqU6eV_-$;3L`J$@HAar6{=lNAutIe$h5f zotjlyK05VkopBC144K9e=Ri3t6G2!=;N>3#E3yA@B^3qy3t^zlw}?<5sLPM2E+vk& zxQE%!QGFBNCb`@FhS9bYAvSB!9At0P{vIafeaGV>9V2*lv+QEKnsCjQnrh*(ATSyQ zgu}e}tOk4xSypEv?An&x!BD9V(Hs7OpRm0ux{UVM#VQj|9ME~VpQLO>CzR{+_CEFv w)TEwn=Sgdn@#>Cp^fn^*7Hq)$ literal 0 HcmV?d00001 diff --git a/ui/icons/pictograms/arrow_dark_down_full.png.import b/ui/icons/pictograms/arrow_dark_down_full.png.import new file mode 100644 index 0000000..2e7726a --- /dev/null +++ b/ui/icons/pictograms/arrow_dark_down_full.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d4aah3j5brkij" +path="res://.godot/imported/arrow_dark_down_full.png-0e7bb59c41a81c0bd02261d6a7b319ef.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/pictograms/arrow_dark_down_full.png" +dest_files=["res://.godot/imported/arrow_dark_down_full.png-0e7bb59c41a81c0bd02261d6a7b319ef.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ui/icons/pictograms/arrow_dark_up_full.png b/ui/icons/pictograms/arrow_dark_up_full.png new file mode 100644 index 0000000000000000000000000000000000000000..a9d2f3da64f5ab50ad8df0e55b76c985855f2e5b GIT binary patch literal 1863 zcmY+Cc{tnY7RP_FG!fEKlQw82sWl`aQcJ}cQfnxU&__@$LWwm)Y^^n=R8f+mt*uq2 zW=Iu-N0m~w%xzqAt1dcdsWnB_rM9a3)82cZxqrOpeBX24&wHNdoO6xtWQ%|+!vO$5 z(Cn-jptsmRFiFssG^Z>A00hmpw4}3HEC5i<&%aS;-$hqUdm8+ky%2|+dMjTc!0~id zf>j=8___v)Z&o;}gdk|owQ_UHuL!W>w@2rvus^2IIr7qFotf7Q@WzMv)}0NXG3k1i3R(=p^yGL-)dhqlu>xtLBxveD?$G$#ovjeXZ)oXKJQ) z|B$6lBTY+dW0h`2GzsCb^*32heF!NhrPn-oOHyvXrbtd5>FY6#8NhBFeC@nAs>K;h zy*4-UqO@xTa<198woN${^=@Om#B44=5J4X5nWf}PXuA94Si{EBw!%~e>Fp@(KL`Iv zk}I*)HrK0IJjeSa72`OtD#TSo%pS^yyOI2!%}Z7^CoUY#*p`sXM7BdN6P%*%7YhTx zhGAKD3`YRCqzM4YsQ|DIhLYz2Ac_P4Vs8MT+yVd;r}(k+4`3pke%jR<^e_xw2CE~3 z#e?Fj{*QoS@CUHO{RjpRsH;OUI&c*&8C5W=13Rw$?J;N(%9=750t`)nffj>@?h8B| zO@yJp{su;{1h~q+25a@&*}8yEjmvOy0Y>ub+csjC#X{WY6(~&^?TMM5|ALIVdihS+ z>WSY!hw%H%S9Vz8Wu@Qdsae=IkS$7q$OHPSXy5Ba^-5~ za)w*^udZ_>36-)RjXZZuKjn^2&s2)~3gnG>g(gO0dXGe%hdiyAbkT|6MDq&j@#~MO zc`&3>7XIl)oW}G1ZtiSz<%8wo7HfuRCOjM(Y!(zYm>2fBN`Np!=dt99 zB8g{C)g>Gh`eRV^b=vT&*9p5K94}KL(LIU9h97&-s+V|Db&8*{sLr?Xvpfc`61SOMAAtj$=H>A zf?{AoF)+fDNE8w&p;v+Ze?VxsANyk5Ujcms3dxvaK>h}}4KH&+0QbKNTz05`B-baD z^H&BeVo0Wt^uIA`a%D7-IkeA!bEUAtIdKu}fIu$bq(?n!b2kZ0BLAE8^N(ajusK|I zco-1Lus!uSHxdeNN#*{QFda{WaHy`2U%0QoZY)?6z~x1`ID{9IRv)xO16XX*yilztlrX~iu=(X7Dd?}w=H^=8^_vV zK@uh2S@m`)8_H(8@qJ-J)MzsgDP`D7c%d_3dWkYYj2LKDZiAf6{791P=6EspGB?t@ zAOeL#|K+&Cbn^qR^^GTkjNB7)R7rX&cER-vPZR3QUcrdPTSZqaqA@g0WZeSKJ^KNC z0wr~U|5NmlmWk?-V*yOuy|k3%jqWey%M*|ta?l1VwIPMuQBDPNzL(II*(w!~^}gGT zZ(qo830MnsH}~HSY7F%FutcBSll2^;NmXyNNjGdxx#-?OJUKh=vGfE+^%#uzQrB*p zF;Cbu98M)}?V>+hulkm^-j#(Vr@=LK~> zk3Sg77`ij8oNa>g`V(*Qo+!GR?PIkURkM<|q7w(K^>lgf?tJKTA2S!$%E}A)h+D(> z@(1s{8md>~+=|98B$Cytr!FgmFM?FtFJ+IoR%8*=xNv^)Yqb(@|% zKi!}OxdXAXr03S_HQ2KYfltCpC?WCo7g_R^RV*T|X?d*r@R2_F=eaf>k!Mos-0*y^;z(dv`Uy u0M;JF`;c^-r@N^i67qt+!*1zO@`cux)=ZYEj@EX)9V=)7o3}qIIiFf-2Tl-IiuQws(8pKh8Pd?>Xml&hwme@@O8;>Z)3* z005{{T_|+O+HMO%0n!!i8H)e_(_uL{&{zxx035h-hF zhjSF9Wb7GO(mPsoR+p#AoIz_tN%5?rPTIos-s@43@usKL-;!%(0>52d>COJ45K8md zY{Qi77d5*Xlucz*!oh1XcZ8~l)ro@cV3Uj!O7H!7ZxnrQW++VU?|Wo(z8|}``-SJ? z$fulvtUT%PlggeI*y;9=rh8g!^z_Ifa_`)cHfXn{Z@4stb0(#3Sy9 za$z_$Ff7A`?hXJ+M*$!`3jj7DSNa?P#DM^?5Cj0kYXE@ely`cbgaWCwQ{Ik{6-`J* zlaihZNzeFSx?3U9ocjTK}^*jXXV1aRW7|uZSw3jPsuf4G}$G>lm4qBm|-eAm{l7#!%k)(*I z0e;l)btUQ~9XlW_mdv%mb+V1SW((!coV&mZGb8JzdQ^Qt6O&mgP76H$hTxHqZB`Sm3 z$48_Eb(;j&$O^&Or9A=Sp?=BpGToRXEm%C2JeBoSSUO_4y*2}`qc1l!n9C$GVwjKt z@F1RG3Z5_pt-SHah?dqwOM)>75iIz~R^`8LW9PR}H zxW7AaS!`x3H<-=&huLXz98Ux-{$%u!RaA)CyUjp*B{HHpi7~A3b6mi~-0qOm_i0cN z^}k>!GnNs<;&55fQ9vx+*}k(lRvEgI+U+axbw35cY_s6d=n$q^0@M@0@#DPQqRT;z zuH`1%X9pJz*n@3=;m-v6ZejHodIruRWupAEEy{NCl=Tg$%TT)l@T>R#QWQp z75aZ``&g@OvOzmy_f&>Z6u*)rdq(oFglVOqXXmT4P* zn0ge|JkRqhyrDXdRy-^CI(~o0c>S<;xG(N{c1HSI@5kz;ao83z^w-9np7Z(wo?w7YAN+1etI!%9_|n++wW;`WVK7A=*RYbkVw4EHf7BBs+gk4P z8zl>y)HF&2>eq&ht8YvPw$`sC`jm~GO~vcgAt{1pXrUjd6gzL&sMR_)i1jJ?{814<~1ek4=kYL-^Q_9Z!)!>FP&kP8DMg3&Rl<;li*Avxdk)O9G32U)U~pmpZ*MtQw#fY<>v_CTKz5#^6Tlh zOYF&&j*IJxW(mC77Fba2Oh%iaU8birk~|flQZX;4#F6uvKPDT^Som7M}AvSkAyQbc@Fo)$!il|>mKBoN6)co;-ML`OkHurAPo z60lXF+A6lFAY~QB6^ag4mNe2NU@53$vD5;+0SeY zb({SlaEcv)ae{-v3g{DoHlhvGi4Z`5n}K=<+Hif2SOTq?H~`xat9d^GS-!wO#08pj z93HeFPAnEm)B(5I=$zG%B6Au904d==4FO0s7JRk-h}#%3vJ&%GO_%jWQW@AbMY^Y?CW%dwbjDiuS?5HkopIdU{3zQH46y z0F)@8q(!EL$w%oD^&han!$QJA{uaI4T$-eOf;v@6RA%Y==`f6&3AXVGr5NNO@f+8p zAXm#K2!4Dd3W`hxz{63!ko0d>?}R}e91CXXyddhB(-4iJ;tK!}JTsUPcvzgoUL+QB zxIDH!zDvZmPv?sO@F_UG1^c3mWOVa))2y63ZtUh%iz30%mtBt}CrWISEYB_LJM5pm zqvL*5(B8e%SmX1Rrp_Mz;_=PjCSF=0uq+yk%&(@7UME;4?8wno{V`dbrcu;w+a7Eu z4_g<#ah-RyFSE#nshrYDK67kPlyb-Ep%$kDzuUN7`(W3D2h>CwZEQ7DV*KNI5p7Y~ zbEz|jP+)&qu;wy7GtA(re|&*vN(0N+krIxDbX8P^mp*15v(vWJ^zsz!GfH2C`}v>K zs3Lyt8f6pSuUKdLn_vAe5WbkCF-tLYzJ+0K&&pT`GnIBAA5yh-*syInaU?@c8 zq|?-A=ghd#;SsM=x`)uW-J^&@g>QdCQjbFhgGyb0v7yCvvBG~V+2-(s(W<+@pwpEc zhd0$N)y?wFn5t%@jqUJ5#fCgq4Z*bVnR}P*SD%EsGqxPJa(z`c%$wp(o{1VWE^K!T zQJH0*RG>q##YYbchmUL}Mq)~n2Y2M?P`kVyty;w?I2^$5C6jko^7ltumpid?B__+f zx~Da71e#fi&(r#oMJ~FgQ7w)qB z-o?;NvHitF>*Hybg=)ai_MyFX zfv-{5x?zPz%0G4d+UUgA`zFPcf8Hy;mOo*r$7}50rqw5gx5*i2MBoW=IGfHAv!MYL z62;q{z zveNi$0Ui>^XU`4{Q^GjT3Q-8>&2D0Q~l0FAo?qBGskpdWTG z@IC`4^K5%Fl>ceZv4vCwxdRxwh8fX%tEXpCPJjucE7>!*!TR3I>GF;x2&yj`M>BVN z8Wxo_kKDGyoEooYIXMJew97~0CsF;9mYBdM{qaRAWgMR3X0iBEW znaW|i{unEoEKTc%J$QG?q9_k}(o>!iF!soB#91>)-$?U>Zu%r2Y0RrV8^BtdtNGLR z_JF4GhE1#sv3Q{Sfe7h9C`x#<`VwYxrRn@)U$Z^gHp@G0WO literal 0 HcmV?d00001 diff --git a/ui/icons/pictograms/arrow_light_left_more.png.import b/ui/icons/pictograms/arrow_light_left_more.png.import new file mode 100644 index 0000000..07d5a52 --- /dev/null +++ b/ui/icons/pictograms/arrow_light_left_more.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3lx64prsccyk" +path="res://.godot/imported/arrow_light_left_more.png-a92f7c96dbcafd9c1b2cb612e94fef44.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/pictograms/arrow_light_left_more.png" +dest_files=["res://.godot/imported/arrow_light_left_more.png-a92f7c96dbcafd9c1b2cb612e94fef44.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ui/icons/pictograms/arrow_light_right_more.png b/ui/icons/pictograms/arrow_light_right_more.png new file mode 100644 index 0000000000000000000000000000000000000000..39d61486c7334ac66323b4d3ba9a6a3fdd083e32 GIT binary patch literal 1841 zcmY+C2{_x?7Qp`rDz;WNr4&t-HfsCJs3k^|5L+!1VV=->mPj>}q=c5Srm-|5mT0wa z6jKu)Q&QBFv8$!^-o(>4YS2NHinVBmu}zx!YrpsAd*65OJ@=k-e&>AmoO6rh?W(4% zqYMCmn!6j33`zX{M#w>DX>-O30KoL=PEI5`l?njI?%c_5xX?>Fmf02c!v!H4Ju|H? zC_=N%^`i7zbHe0MQG?>keFS8=llwKRQvVFqqmyzr&J#BQZFgKBfysjkQGubMpFWOS6X`#6%^Sd8)m~RZ95*2RhRm0{g;< z4U==VGtw6-gf~e0vbr1E_hOrb%7{&IZda&jhONRzAp5Pn|HBNq8O?!b_Sc6{TL)kH ztc;&w4s&kJkNs5EyAHe599Gw%6RkD7wOQ&gA5j#G8F?nb7QjyjgyuOTCNg(o42rTl zwTyoqevzhH>ST?>36 z`0wruBcOtzsBUC007yCw0O=e6*o9Q-3jh!g0>DxT0ATL{fEM$9tIy|pEcnVjvC$v%0?WU`*= zY3SavumHLBO-s^0n)+w<<9u9mP&A0`nS#Pfpp3u$=T-+KP%N^yFYvbxsltKD#RMek zebvKbKNf8G%C9!VwWTV&75LQotzhy|=raH;%)^xkL8Ug_UHFn0}P% zL>yQDso2ua8%|h~T99C`J50&ne^JWIjOeD8Yy@4{U8?uIh20itiCpmg+L|+Ap$2cp zZN!(T((hhab%t3fGI?5q3 zX1FlskLn^d2mL~-YDt{g7mf`n2Zgi~TBJ?)(U-4Mq#`t%tC1RzMx`t3R<&8A+8WI8 zb5;!bF5ynP%GFC9hQ2Muk|#|E@3ah#Wjz|1_!*TK=6Ptj$1MGtkBl^BLC44r^s?0)ki&OnI(B|34s_5l+9H_!nU9hXJuxAlB0M6R`JQ zDG>tD|I5IlN7Le1q0!90n2$-$VX&a(C+3uDxjV!h-e;h`VyO&fVk|x43JdVIARKr3 zHVrZ&|7#4V#ZhDFOctFH1H_SC9a{_H6rm}p+@BJPmnQ^An}>!o!f56~O8U6Lj}-~Bl*|mCht0&cfRnFuT7~ zauc6$!u>R|VUZoct5TlQk`LxzOVDhYsu|Obpr9XQW~6WRf2dfUg6&}kk~rxo<834Ym3bek7Sl*QMsXRe=31U8=ahDi6; z1_CB3DXscKaszX59KqC1h`N9i3LnLo(Jt2>9T zbZn(Iw98C%?&QR&BES$Y2WAlzr8NkHZl8(w?hna*8MuV53E`YE>OIS2iW!0qUK`Gs^lPir}cA649pq`EHoz?Uq=0{8=kQw`BNB zL3$u^pn;dBxNx$mYfCTbQ0uzRyXz-S*5+0kI~7xc8G15*aUX0YJFD{rZkWou>hPf@ zYiDdMyPLD=8>J8YGOLoIy`r~s9L(-m-Z8FE@32UNdyLh!OLxl{?TMJ~U&L#MZ>2lY d>2m*cSXRz&=4f;Aycf`?0e5F_;v>fp_MdRuK~Vqz literal 0 HcmV?d00001 diff --git a/ui/icons/pictograms/arrow_light_right_more.png.import b/ui/icons/pictograms/arrow_light_right_more.png.import new file mode 100644 index 0000000..e0a72ff --- /dev/null +++ b/ui/icons/pictograms/arrow_light_right_more.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cedstrt57et53" +path="res://.godot/imported/arrow_light_right_more.png-56d3df49848f9fee268e5c4b6c279828.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/pictograms/arrow_light_right_more.png" +dest_files=["res://.godot/imported/arrow_light_right_more.png-56d3df49848f9fee268e5c4b6c279828.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ui/icons/pictograms/arrow_light_up_more.png b/ui/icons/pictograms/arrow_light_up_more.png new file mode 100644 index 0000000000000000000000000000000000000000..03e3817ea641d4766b91ae1953074742eae52f57 GIT binary patch literal 1816 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 EH_%4^4FCWD literal 0 HcmV?d00001 diff --git a/ui/icons/pictograms/check_mark_light.png.import b/ui/icons/pictograms/check_mark_light.png.import new file mode 100644 index 0000000..c3af542 --- /dev/null +++ b/ui/icons/pictograms/check_mark_light.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dtibvrik7ug0j" +path="res://.godot/imported/check_mark_light.png-83417416d6580b7b5eb41987b7af5ccf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/pictograms/check_mark_light.png" +dest_files=["res://.godot/imported/check_mark_light.png-83417416d6580b7b5eb41987b7af5ccf.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ui/icons/pictograms/online_dark.png b/ui/icons/pictograms/online_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1c643caa62885d28c160a9cb793656ab1066b4a7 GIT binary patch literal 2045 zcmaJ>30PBC7QP8!5*919C=G-JMMV=Jgs>Pv1Ot*`k;Z_*g#nY7Awm|ylSLgHB#b!5 zG9U`dQd%UUMdT9%K`mQkEFv<>B302=5vl^Bjuk|i`=Zk6%zX2G@1Aq+fByfRdy@C= z{_wDM7N%rV0DuKAh|7n54Yr6z&=%LHKZTAa3gU+XuyZK@Y7GEW5K@l-u!9M};}`%q z1pq8m7Bzn14HE^3kS7TZ1uI}o1aok609FVG@X%Ob77*Zy#F2rC0S6!&XEPg1aE`z6 z_ep{A2aX(iuwI@Zl_OY$V_;_18n$(QAq$eFUA%wwcIxuf&`Qo8bEkVBrIeDbo|6>0PxJ60wKzeO`$1O z3W+oUp`mF?gqA8(0^oJ9ID(gZoN0dXiPa0^vONAXTk_M}+|I-jU;CR8j0iNveD2(s zmE|E$N1B>uuAJGu^lRf_ZGq?^Ig{?A%{VgssFi%hr}C6-T!Mh}XmsXgQ41;Vt1gZ*#Bkfz~#bf3I72 z;$=qypQKNz-5IhYe>1(MJ>vF*5WY=g)@b~f7gmuc0$UdS^v#y!$s6G|#b!S9i#D0? zBTrk8Q963dWZQ9dR+(wq!oY=%UnghJ<8G#Db)!Dq>v4W974g@fnO;NxSmU@)yjtId zdMqmGVPr=CQqd=DP;M(14P0(#{JL*YnurenA-i)h*JRP=(epJb)3uo;KE>D0^j)Y~ zcFwFJdRb2SFX_#5)PFVm=5AQmU+&%b{9Ztosrby{!QFrI_aux_ei&|P%^~&FEkAU3 z-L1YxyD1*)c53#|$92=xEAe90KVlkh-VfY+;?guXW3b}S91ZfxAonFpH^+IHoYwSe ze$(hmiJy+cmFFsIJQ>s>q5aI5EAPm}~)y$zicMEEb)~D&eeEBq&rHl(8ZNxPDTI z=fR})Y?7-G?T{gIG%Qwze7I>wCSJl@4$PnB1i&imC6Xir1+K14&BnA2n5NC9!{ZdF zLWZC!sfZ^>5tUMfps}b_AqT8)wfo`s{%`HVrKw1QkPD}fCt(bCS5}?#`8)s3iTWLf zZXb0Da;R8Oo)Q(Y;g=bZigNr^Xo^A=FOZ@MA5Y&B+L8mQpJG&0D#6B=!4oCDZ#T%6 zZvWWKko_O?hdUg@ZgIna2G0K(aB(a1Z}7@F#^d@4gl(fo`Zu*P%`-0(^DcGRWuEmM zc}xAurR}7QGN5WhcHrzdO_bos(Aw(S#P|%oH&v59&>LJCHSoB03;kFmsU>N2rs^}> zis5rVdYp>x?K&Ox&xhn1q`zht(bj>cYM#pJABZCtelMX15QnF_lD#V}A0I8A*X*3d zt-ad0YkBJ)wq^T0_qnLQ_nnTp*C`i8mr?+;aUI;2O-mk9j ze)>Ewt1GLZYgNA4`A_lH^5bcnaQTsH(^_!+Uc@TZ!PU6RtcCbhFK}CcI;CjI0^F8y z-8>+LsQbJ@agPMeUPu!Tk{5nv(CaH_k~r-dE<*xAV~jd{6gfT=Sys_ zzgDLlif#b-La>_~amdpBO~?V?;-mEMN=9lXtlwyq>nHy{)_I`qggSI=Yv-AfyRzP8 u<8{2M#hogxV{ZMcySy*=49|0^Y<>so&4)CSA#OJOM*%M&j9cX&v-e-@{_TYT literal 0 HcmV?d00001 diff --git a/ui/icons/pictograms/online_dark.png.import b/ui/icons/pictograms/online_dark.png.import new file mode 100644 index 0000000..f917f4c --- /dev/null +++ b/ui/icons/pictograms/online_dark.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://uxkgiwd7py03" +path="res://.godot/imported/online_dark.png-081123db8a385b31ed626b7c95b20c3c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/pictograms/online_dark.png" +dest_files=["res://.godot/imported/online_dark.png-081123db8a385b31ed626b7c95b20c3c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ui/icons/pictograms/save_dark.png b/ui/icons/pictograms/save_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..382648be952a1619717895e0b18d9d1a790af20d GIT binary patch literal 1919 zcmaJ>3s6%>6y2AQuT8KZVl{+d6r&{YlAwg3fF)oe0x3W7QzeoY43dxGApu*6Rs>oc ze}GyABG!spt5i^ds)*F;h~lSJsTAx~3Ro=_|03FbU~#N7o!Pzj?mg$+efQ1o7N{d< zv6y3-005RssfdO?n3!}jw53N^-Gz>qq>PRLAj=Z~+Zq6#!<4NXfOHgqJBa|uw*ug5 z-ck3_bO@AS2`XJg1egM2I-nv{Komj%2^tn*0R_%@WbB|vV7w3+Hympb!5e;_9yknY z0Z4@&#AsGvghzyg8TMp5@>&CPcGABZ60nos#DwludKgi!L_H@q6#5Z7FPgg-9S)w5 z&V_-H<}QRwru$?Dggk`M!X;!DL^WPF_j~N61p2vAC@|IrMwS16pxOK0qE!b`|M>Go=FnI zs$P(yZhTPaS!bfr5f40i+>)5CzXyIxXY?xWwBO%Lxhcw;p{y_KhgxJw_$&p;r?@HM zf?-z9O9Q~0PfWzRJ7@(=(r{HoDD4iN=IRUZ-aUZ;kbJUY6YywF2G49U>GY`>56?7X zJgdPBfNWiHT==F^^u4w}NBOV*C|o3CBP+M;6Q;c=YDPcdKJYyC1F0=O{J{FomV+IA z{PJ@i2}_zd{Of{+JsM8+Z9ms*!GCGuI)jsTT@jmJ1znDa`+}oud@5c4bm@Lq5%q|= zZnWBKc8*I;^L&ejv3ujzk1sS?fA5%fHBT%QGIfSuDuU+o!GY58)tZK)@a^{CnwdN6 zjA1ydsp(7OkCn@uZa@C*{I7gzokPAlaz=H*y14V~Tfx`}$8g8EgKIB(h51v8*FGH; z|70)MvTWjwV<|UVv`a%=tB!XCbT4iCY;|a3NG+#tqIz8Eh#Ag1=2N2M4~#kCSro9# zkb)d>$;~X>9(L3mWUe1kAsQKW^>J!Na@Yz@6 zG9S;0jNg+ncDmAh>U_qWsr6aTjO-mH z{TIy4DPBFDDYA}bv}C@M$Mq~v`6w*&^0Rryoq0|L@J*uf#ruZxhsnXpyqu-gIV=Dd59_1WQj3rk}x24+)h$KaP%;!FeRlM zFe4tRF<^tw%bJW)EXZ&kW`x2TQ94~3h66Dw+q|Wr7Q(z?SiRJQn+zCk(I=^lIA$?h zFkFM{O-3N8C@dhZ^q4nXy%kGMP{1CHX#``cSaQVsSlhdtd2eyNJm&3#953tL9 zW(Q;pHaE!lpXT_D=mz-Kh*XN1u?eT|mGl@J(UEH+7R(kT*Y51}EaF!8zl_Rry1Rkb zo8?O0>Ga_Aa?kcC{y|ab-g={&LUBxdNRLt%wskojW3KY($lBCEw)ufshmcz=;Lj5z z2c5hHr0Mr5z(BjKbmD-4jl8?}nAFM?XU9|F_E;A3lbbDU$!zCJ-SiXO=8}~&@kT0y*W~AY9+0T?oiQ7U}7dvdo){eCX+6Fjls$6%l z&z30+UoPJEv-~)1MMIw0Pw5)yX7kznC_ptpuKvy@%E#_Co+Q2CA}^2~<-@6rBV@ScI^MYzYJr6cR8bK_He2N{|Rhz_2M)AbjA{goNZ%SsIPfS`aCq zh%E}GWwCVuj|*7YL~K<`Yej0sYAY3}ASf1aDWaVZHl8l0=lpr^{dezuGxPrZDG;t- zYp8Fn4*)O}1p0?V?~4yzEodv7w~s+b7YBxi0FdJZfciZE{(vdZOeJ59-<7{rz^Z z{xi#g?2Vrpk5AQyF|WRv!$D?F{HVQjICQk*{XI$E0DE}oO#q0T98okDp0I^3SICl42|~xRa$u+{=?#3I5H4WvZ5z#bmlKrm1 z$9ZLMI9y~D=B?|N2t&FJUN%{J?`~+QLIU{HkE_oVR&({&?(?h93fr4RIP9y=)ao4l z)hwuX+~GPsf5>6~+X0794X)0Rr}a8TE*kVvLwMNQirDD;+m9D9Q*+<3%W2;Gy3!Zw zGot!bp@B9P1=E~g{MOcC)Sk=Vb`Bk1P7Fh1Q^W2|bURA;r2|#0IIB!$kbiT%a57`^ z-r^@F&4)^aaj{=~uF8+R%8Us(dhGlWdbjFWBF|juxw1RP`9)cM!qmFGiKe%2EjFmB zE5AK4l`Xzf%&FTx9MT*&ucI9T9eCp zw!tbv^P*Evr#4V-9&a)`?=d{#RMT9Oc1JOFX*PE(FxG2a%-~oUU48CeJC2F0FL%1C z#qDR;5Yuc*!OVqr^0sb|@$J84tI31kx^tG&s0|OsMbA!{2}3W?b{mZt4d;jtUf`#+ z#aWHKJ3#Bq7;+XLQ>j`C#g4OD5Bs`KY$ZLo1W%MB#*fC55-@}(Rv^#;HjBN&mF4Bi z;)>k8cpNT|#b&TrJQhowlJEUDfmD`+CTIUcz+S=Qte6)Z+fL1gf@PW+FjR^tu>^QD zHIsOX*c_e*8(f)8B=}Mg8;m&SyJ9F#boS46H81^xTA;%uCBamZaF8n?D zSs2exfo+i~-WH*lUlGo>cmiy3J$3Lk4{@E0Kq9IhwB~puos@u~;UMkY z7fs;c@#Uq`1K%6}@wM2iB+n@1q9yH4y6XG5=`|bM^N$YBykyJ<5~wYo*jy>_)m=hq zjdQEnS$DsWROzupr_|{4`ijc78-`UZ{br9sn{P<+E434ahF=i3ZkfJiG!bht)bN%Q z(PhBpk%@kbPQBB)VCK0q1)gBI?}66pqZH%VU7^(rK)`9X> TyPQ<`F@S)--oIgW{Ej~XX;4#F6ut?vi=c?eo)ATrfG>-ZL@hxG5|Kp+2ox(Zd4T{SF+3$KTBK#M6*KEUK#N}4-u4Ue9CbjZ|7(~giQe(1U!g3Hcr}BR6N=^ z!KiDEM?8Vi+Ic3|vY|p&n?!}1z|;lypi6QvoMCZ2Rma*9S6btBU`_Sh*XI!}`fI z@I_D^ciRCswK2XgPy4x!wkZ=}!#{ro0MR8`5Q+r~6G;lCTq2D_Nm!BsC8=Zz09ZNs z!9E8|k-6P}Eo7%}^l@g*Bcv3bq$W(}-9%EY-`HJkA$EuORPB4xQQb2_InqiF-P&wP zd0-zgD738UcQx(gz7z&O;fgBm(&STacYK3?w3J*MW9%D?K4t2xRTt2(D8Om`wsfg(i$;S(tHG6V`+vYvyqWXqDhQZaD?M_~7&HT))vQwc~nhVmeo0{>>VCBox4(tMt0fXfo z+J`Y#Q2kvBdc<9@KqqJ6BN z?6|*m|0C6dv_{se!`?_r?+xbtI$d??x~|ST>+#;yx>vm|n{U}p$@?EN*kPrQq_0R< zHJA6$-r5bR$<&Eqvv&tR-pe+>aH;b~#f^!Z;jEqQ6(8AW>A$ci1WZmVd9^{*md!4@P-JJ)3$vwk`anYm-Ce>0^bbdQ+>d zLO0PEPbE_yl+T{#PHGy*{7OGKYUvIy(^8BViiw37$`L712!M{zS2`msXM`!Bu{aDS z2cbJ52nRt#QQ7Rz3^KV`DoOgx;L4%VIn0$a2BS4vJ+ltrhzVaMPla*Zl~|%& z87q)taWlQ|3Uf??!UebxlS=T>Ww4)wnZq72r7@75o_(7AV)i9A;cuW~dbnxD{|raD zhU|yhYQCqtAhc;n-8wIwYvif#+D%BTnws)w5X#BiHUU!f_eCV@OkojIgO$s$TVi&^ z&zpxh^p)s6$slgEWYD%;S1W!ii9k@b|9COAB{e07{63^S2sT|*4t$Wh}t^^TPzEr(oLkF$dobJUk2ng(~szsk>j;gPaoBzDqi tckMBi`;Y@ldQ&($Wc4U&MOJ-Tlq4<$AxK0PAs|q!#N-76WHCG?ELx;xu@zjx zVp$YHr??>60TfiKBvcs`+y=3wKx7fDh{cKsXnGSYj^j*c-aY@xJ>P%sJu~m+K!D#S zBLfQq0DuwG+cOXkAxVt`Br^x)vpUSEb}8{pZmFrP`lzwU4oPtPjezfGsQrRC)J6)6*ds z)lb(zqq6^F-ZLOqYWBMZZo<50K+&y!>IMhTs#J>ZKDkmkO*VExZ$AVYHBDg8$z^Wu zpjcvoenFrK|My7o+J<3??NG17x#)aDZOZ&7nWxT_We6{fu7DVBr_Ux&kfpQ48~&Ir z_6~~&U?pC?aMIImd*G%X#`IOD;I;96yzN2T57_+U{nPR%eJ$<)Qwzs_s$z ziDsM7oeC@bWBZ69wpDeXt64k!B|EsE&MALD5UJem`v(7L#cLcV9U6~5XXc_?8&JO} zz-jZhrZsoMCG6R!j~v^6S0U}~Uh^=M;OuO`6Z~H07LEs%CAQV<8@WD3rSuy2ll4L` z%t)aq6yB8-X;yQ@xiw8_1c`F^Tz=cy!Fl9llJ2x# zGK)Z=k;pWJ=!76N1mQ$wQ9m;XL|i^E@iT)fjX4& z*aB4ZPe5en*+9Z%hG4)R{ybhhiU9&bkrmvigJtWPazL~Q6A4gE!sjrB7%CA

hZ7 zMM6LIr8M#;b|d1Y+&VE1h35VV^NhHeqKWvqas8DaJTt_*F8b z7|mURC5R-kEIt-DefND~j)@RlpawBMPd&N--Y0(gur4w`239q*YpP$&zU-^;*O1T* zry>4lID8{=7_wDNPj^1Dg5Uul6j$^kgQF~ zA=xc6KjG)iKpc9D4f@lyc3P1LJ8sFuzZFLysLX$&$hj#cIosx4h2~<U1BWBu=qR;DiFyiI`^PU3i_Z+v@slMRtI(kz#>Zuu(6qA5@z>t<|q?qW`{Mm z(<4!F#5phaSR!l*wg*M*v6dA4Um{RbiwGT27LlOxoIV9CbHowtwXNVt!Ohtrk%5`( zeDkyI!47fesGznr4Vr~aSoiO)ai4zyU~LV^s43WXm+f2hb7vyq!4W{);zsZLx9{RH znyxDyx*ur_J)K%oeRAjBmtil?jXeM0ak=HsT~}9E4LGU&{P^2~)VgUe#g|XclqA0q zs4vqQo%y=e>edR19#@%fe`v>g$L~EWYZ%$ao5n?p#7iZ#O`^TGho;^7!}ghC zP|LY#aTYkM>!rr&pc&y^yql|QnJn* z^E|sP8#C0KdF7Z$_gFRCUF*8pfgWJ;%%E4t5i`zbJvv}%q9-yokG4v+aLPeSVhq|s zhlByI&8pV7m3QamFvl+3uNMjlrhnM@4AKJHM&HNeNhoRKl6K;AS7B}{GU$=!TlYj- z&f9RabB4u#q?)u-ws-9-B8pufS6%lDPD^C5N3Siddz$$oxHV(f&?&D0pC0Ftx+=!& zUunuD^D-bRZNlHWnY`#nYCqSptT^y(^2P!j?#$q#=Y$}~hrLw71e)3+|&l1Fv zB$06IX9=s=G#Z;RpMcqQ@D@z4U8sPF!~!{z2oL5$kyVj&2HTkq<>!jzZ!4LBIr?ah zAWI}z;F1NnG` zXjHnKV^;@Z(n5CVCJ7=D3lN!z@1KSUWKx*`Nkl}FG(bPLe;;}=7=Pl5vILuX-q1jr z9A!Au=s!C)_x~>^<}(i2GNvAKOi&$vDZ*#Mzml7Uusvl+rbLz+DMB{G#@$2f8zIX8 zWg#LVYFZ4Nkle^`tekYHuL+-2oX*j%Q2id^j z(Ea;|2$pNja^wOWctKQz?)oK{@rW5VORk*A}kz0oFjn$M}vq@-yC^)wM4 zubhZzn>_lxn$zw~U;LY`fO(3~b(p3-?D&KK>|BY^iE6z39^(r3mVhaBDA}Eb?gW zX#ts`ul&Xx-xBVY5;e!twfuzCmBSrZ7VW8_KbzRlu^q{%!Jb!L(Cu|A87{v4f_7F{ zeMhY7?rQF22!$=}n!I{4Z<_NVuGi}gr`cf2X}DH;pwXM~dS_XxUPqCO?-9+@dz#12 z+c!nMxMQA0Dh^Sq2CpU`f5nNfb-c2QGkDl%Qy8}IL-g&J1p(iDEM8+=p<tNdmX Q;Nb!O++gn?ISIM{1(wl7B>(^b literal 0 HcmV?d00001 diff --git a/ui/icons/pictograms/x_dark.png.import b/ui/icons/pictograms/x_dark.png.import new file mode 100644 index 0000000..36797cb --- /dev/null +++ b/ui/icons/pictograms/x_dark.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cg8vi6sxnpl2t" +path="res://.godot/imported/x_dark.png-5430cf57b7772f059ee1fac9842c6898.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/pictograms/x_dark.png" +dest_files=["res://.godot/imported/x_dark.png-5430cf57b7772f059ee1fac9842c6898.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ui/icons/pictograms/x_light.png b/ui/icons/pictograms/x_light.png new file mode 100644 index 0000000000000000000000000000000000000000..68b318008e96167cc60b6181d78630cfb16dd41c GIT binary patch literal 2583 zcmaJ>2{@E%8-534JE=&^Q5qr6S_M3#v;BIIOAmd1=G%S_`dl0RC6I%$(XPF)CD zj#8(t(xir2q|kOq=eNvYwkT9ik!Ak(oBaB_{_Fa$>-(PfS?=e4p67kv@5}M`^U~2a z&;|hLki9(v;kpTZHC3U!eE0BMxEN8q1APHVH3J~y7yw_OD?<*zK0E+}Q2-Dx0I z%32i)jzS?2z2S+6ng--NC8k=T;6s>53e9@4m@AT^rclD|mGFcz9t1-ZB9#~zYCyA4 z%vTs+sW+kkWjT~btbm+QL3z+NfI`6)iuwIgLBG<|hdQ}J30hPnYwDBpg<>9bqJ<>z zLCHl@Zm%>W12QR~Qs3Ll9~y#y*49=ip%Y5TAn59cN_BO0W6uCIIo;5dJrj=b`_Q&g z5-5A6+&&o`hbxpRX$Sa1SRF>iP~mh8ayZIvyU~gq;o$6CC`QZ|$zI6iFqbcq3*>TM z58RX4-GB_Re<+&<2ENupM^^4R$}f^MDTi%Dw^7RNf~94=J~?c!v0F)^YM@L6%>+FmWKs3vqgi8Su=(i2b!~OYu>eF}xR?X3DU5i9jIP_&v z>5cS%eFzxl$luLuY-LYmynE(S(lfOlGc$2Viuvb8mzk`%ik3-_<2z;d^J4#|s;CSt z)fvQ2tDb#e@=A5}xRqof=|gFL=Gyazc34+UxfRb-E3->ow)^ZTefo!l(j{40gAA|s zy;=p+nN#JJC%i`d9xpz(rJMM9jOT-Kzx0m=jVg6)Nrn9@*d%6`kC!LN#u|DT9}+CKWQXO~L?xGy z)ys`f7ZpoLtolmpAia}0djcb-7+H-ab?nrpRXf?Iy$YR-66%<5F5(|qZZ!5N^Dz1& zadXVR@zy1`A2b`x?;jVjsAWI<%;#o))J&kop08IW1ibDEKU&h9>>=y)Az~LFPg(j( z)IR@Sx$fKW@{#0Kx9Qohg_BO*0XfUDNvx#kjp84Q5d+J0dMm;l-M7;(MmTK=KFzMe z%D3z9iP&(;y3d8_lxf=2_w$8Aj9oGICZ)|p+j{p^J)Krpx7jA&G`W0vGI9o8xy@MWX!^l$d2Y|0!32)*&?6+B)Wuv1XPj)&OO)qq+ zmT^eT-d$eun~(DLZg`m6cJb-*{roQrwokA_?0lX)g!gGRLJC1*q7f>Q!lJ?j*y3$B ztiu!5;q8NL2t+%3BHq>#k0;{sl-O*??-CLiF?8C2?-G6@+Sm~7W)rX(XV5!sK34&u zCs31+Xm~N_iu@F0Ye#gjh4f#GWFE|$hB>-u4mE{NBYH668LVy0XbKhBEci`@41cJoRe}zeqU@MK5L`8rN-ZshIq5_7E=Cb{FGZ01s6=BgS zpa=#-07EYavPxMIm$=I&=bTCh2RXUVHi;7*$TK zjDA10w;}Ta3@gV{hX2o4CS3d(_`|Ryd%6XM@ZROig4;Lg3yM~$ti5qWhg42Ji;b`J zJ|7XDs#_ic8nrbmi(g{PEVP?H)=Eqn{lnbW7_-U7BtrfAzq*|`PU{M+8r-I9i3q{m zXhw6Dx<&(zRC?*7S*~&Jguk}t$3>?NU3ITFdo9Ghsb%{a?8;NYxu=a;Pqe?WyL#vq zl~-iqLOZ>8#@#A(Y5COZJxBpXAXsC1?l)6u6()i#Wm{Cy#gV?Uf#G={>@p2wc2agS zap#6w?;98Nx9!;Oeup`ASMvLcG_SmdvHMZmu3tJ>L%&{o=@CE8X(iCs4jq_`xRy;8 zXghhON}k7J#uhj!wiqI2f-rVIOF+^52l`x6}keoILs&K1Esh;J(m-l+@j_m z0}H`tHJk|}{IH@mnR8JZtmSI#+SqUAoBo6b{@j&*T%BMkk(ru|rJW!4%5(4%K±(y! i$eCN$nsMzeHHLMP6qoiweS3Jt0GZ_HdEGtg$iD&aD#o(_ literal 0 HcmV?d00001 diff --git a/ui/icons/pictograms/x_light.png.import b/ui/icons/pictograms/x_light.png.import new file mode 100644 index 0000000..36b30e7 --- /dev/null +++ b/ui/icons/pictograms/x_light.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvb228ypykqaq" +path="res://.godot/imported/x_light.png-b099203c17614ca6f36b269beabfcbab.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/pictograms/x_light.png" +dest_files=["res://.godot/imported/x_light.png-b099203c17614ca6f36b269beabfcbab.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ui/icons/weather/weather_clear_day.png b/ui/icons/weather/weather_clear_day.png new file mode 100644 index 0000000000000000000000000000000000000000..266887dd0b37bb6a390d4bf537d3d8887b05e1f4 GIT binary patch literal 1427 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 literal 0 HcmV?d00001 diff --git a/ui/icons/weather/weather_clear_night_full.png.import b/ui/icons/weather/weather_clear_night_full.png.import new file mode 100644 index 0000000..b9cffaf --- /dev/null +++ b/ui/icons/weather/weather_clear_night_full.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://78l0keyrvuiw" +path="res://.godot/imported/weather_clear_night_full.png-3640fcf886e9bd01942e21cc0212bc45.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/weather/weather_clear_night_full.png" +dest_files=["res://.godot/imported/weather_clear_night_full.png-3640fcf886e9bd01942e21cc0212bc45.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ui/icons/weather/weather_cloudy.png b/ui/icons/weather/weather_cloudy.png new file mode 100644 index 0000000000000000000000000000000000000000..0e96583b484bb1597827277b460c0f1980f036ae GIT binary patch literal 1449 zcmV;a1y=frP)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Rl2nQD_Gc;4GGynhu z|4BqaRCwC$TH8+?RUH0)b3s-hSizc7p>iqg1$KGSC#x~BHmqruCPrhTHfq8e{|Wm? z7-f0UsPO@lE~IoZZ4HS$HJVtkg34tnvfJej%Ps8A%<-W#-OCI+vpc&;JKy8Z%sJ=x zo!{+zX8{WqELgB$!GZ+~7A!o8pkfVtWn@G+wXt^#gx9hrCER2Taeue>?Z=9Mz(9!Q z^PSDcSAKZm!p^ZKAeZqcYHM-o^b4xb68rm@pPj)+-Z$tt5FG2y*ty0! zIyMCK1#fgRl72VC@U%toc+dg9GoI&pw6%8>v?wOy*J37UQ#?Q| z=9}B>c&fa-papHLts)kQLQ&+@Wv=?WyK4V81gIJBaC<e=k|Ad zxq~r}h5&=c=XQ5R!Q>y~hrZ+VbV5-S#3B)FtgWKe<-+S{&(M+PfJaRYWgE}*QM!ByUDbo*IMmhGqprRl05BSkG63vcV;xsA4+sQ92@pgxvi))_hULYWDb=Hp(kU3E zOH9xB`8g0{EX(*p%I0V|%JL=#Mqs*-Bo+16vhJp&)8Vs;P9V$CBd&pM#>YLdwW_RIXXNbF0=G8 z$cl`mSPYd_RjS`j{WYoE_+(-q_hx6&Vt3>;o`^%M!wFs#4yrK2LU<0_@whWrf)tDx z?{s?rt%ipPJTGV-c^@`Ch3>AN5F!xj8yj_1i7Wy%jW;1#iDDU&$%HQB2!JEUoJQ89 zMM7E*2n>c)+p@Dx7tBD5Q5+u9?QCgz4b~fT2Ns=R|W39z<}uJ*cRxG@R4` zVEQ13s`kA>R7qsSVZnHy{r2@|_+;;%J&+-5U6s*v$ zEH4#TydZ)gh$iTl!{4S6@a51@lNk$KibjEBaSy;gNF#ugxXY>~qD(ZcF)@POo#H9v zoWN%%L1Ij`KuZbfNOnn&uF;AmQ-Zj@~IQxjiRb#>7QSXo@mZiEztVnpo7 zrTftf@y;^$b&j5M=CO zFScw*6Wof&vA4Se+tU@M#xLp6W(Z&m!~n)=(?~hR=+sT=@p(@g7DdBTQz*CD(A3%n z09yd6v~+L+OE6H`VWQ~f`Wo&pEPycvt@DR0E3mh>6X-DIigLnfW#kni-0bmr-_#|F_6}Y@PmFGqxKZB$Lq$=BW~{&G z(p&H5qY7^W#aYw?2}*p%|IYbMt;bhyk6m8AANi(`DSCWe9BFiV`tJn>LraX|ITK9Y z2O#^qy@pBsD)`gO94WVTf56KX{)-oPO}!od;_9s$kxPs+uonqr({oA|h+h4~*Y)>f z`8T=1wQIGI_>V#OJfB^)V8Ma~3l=O`uwcQ0g`>cKe)ZnyuS46J00000NkvXXu0mjf Dm1Lq# literal 0 HcmV?d00001 diff --git a/ui/icons/weather/weather_cloudy.png.import b/ui/icons/weather/weather_cloudy.png.import new file mode 100644 index 0000000..c74657d --- /dev/null +++ b/ui/icons/weather/weather_cloudy.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b17frlbta1p7f" +path="res://.godot/imported/weather_cloudy.png-c41e4d98007294310395f752b39ddaa6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/weather/weather_cloudy.png" +dest_files=["res://.godot/imported/weather_cloudy.png-c41e4d98007294310395f752b39ddaa6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ui/icons/weather/weather_fog.png b/ui/icons/weather/weather_fog.png new file mode 100644 index 0000000000000000000000000000000000000000..00e93b68678c41a64f80ed6a533db533add49782 GIT binary patch literal 2433 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 literal 0 HcmV?d00001 diff --git a/ui/icons/weather/weather_fog.png.import b/ui/icons/weather/weather_fog.png.import new file mode 100644 index 0000000..8887cfb --- /dev/null +++ b/ui/icons/weather/weather_fog.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wpaj2l01upt6" +path="res://.godot/imported/weather_fog.png-0fe4352261121bbcc8da10ebc1995663.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/weather/weather_fog.png" +dest_files=["res://.godot/imported/weather_fog.png-0fe4352261121bbcc8da10ebc1995663.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/ui/icons/weather/weather_rain.png b/ui/icons/weather/weather_rain.png new file mode 100644 index 0000000000000000000000000000000000000000..b3de5171a3f0a2a6debd424977b5c453220c8807 GIT binary patch literal 1684 zcmV;F25b3=P)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Rl2nQD{7dmDvX8-^N z>PbXFRCwC$TT4t-R~Y{ObFTx!_&{2O5o$r?VI77h)x}touG(bUM6_wr1-5Ay(zT|W zZfd%37u_^Nx{^ton6^NS=&msen>LL=A#XABMWXMLP*PIqtJ#LV5VR&EwZk(uF5>z`sK6&zFhK@IeLXH-mo1MjttD~-?$HklD z?1l(i1XMKdPiCr+vja#6Ur||wlG0MoGeK8jPzc4*xZyOL-xF$f4Srb@^5z4gT|ILE z3evw<6oK*`RoGHeV%3T22zaGt7yO$xxdK1be_6i<@xIRvz5BZq0-~K~e+JPJYjhI! zG=*$!)=kosK9`elDRO#z6Yxa(`PB_-&P{m*etG}QOpctOS#@W&ajVIUqL{m%@jG{r zc=Qki%7`@S;7iNOu)QK+m}6YJbx$+XbX9hNW9ArBC#^TB5>o-DgP%(Lty`-h7&JA> zWe1rpObP?=n)K?Z?xv!+qYBF@1W}_p(CKZ^X&UZ`&1MKvZUDWN8!eehR-JM zjaw$%$$=P=AoSsbeli+Zzc(n2fStQ)QBzlM`0U~R`K?)#piH z!WMz)(Z^Qurl^Q^_snJx(B6Hn%VX~w-i3)$Xk1pes3>Wl1k_0GEH%_c8T9*D|epUcx$hDD?)IR2T)&ecpTi#b|>rhl&w7l*D z2r59t%!@=&*+SKq-WJPMJ=WAWprEkO@yRbPEa2+U6~j&uIepLH*c7srli&Pn6tjqh z{F}Gn@ys+HWUnfpw6#PEE%zv*XU-HMsr>7alb&a$h+ypw3mRaeFNpbTX|pq~w;hhu zI%(2Swl0wjvC_HyuDj=T!T2K|YgjhoZ(}{13;Y-XP~q?d79j8gGz5up{MeDm1t-&- zK7HDkDDdB9#>+W=I$i8TWosld<=OoJ-CIwhc>v_&C*_|UKAgaskd8jXl(42^|cybpKV|@bv2f?_G zqX%jYo?psY4a9mGplfIi@Am%ncx%}2PPKWdzitG6$$K6!J^g29Xae4*wyIK8QI>yj zJKlk*x^Ib{y7Y!8j;*8bn|$~wVUywOnKRIDo}BQ}@bP>&M`2UFYIICnJy|Brv&dkR zAaWI(JNjBc-04-wTA46tu9jW-{HF`7id$l`Gczk`u7`=21s^~Rpd%;vQ~ky0=$*5X z6wR!LtkXgs5Voi#Gd6vRK~fd#d(To|xTE(+5WS7oaOukW0O`VKo@(7t_J+W(e$3-T zSq*d{wR$rPcXoV9YdHI*gn8ez%zQwu1{@75uHy6xgj3;J`N}vUA=iI|7g}Py!z void: var outer := MarginContainer.new() outer.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) outer.add_theme_constant_override("margin_left", 52) - outer.add_theme_constant_override("margin_top", 116) + outer.add_theme_constant_override("margin_top", 85) outer.add_theme_constant_override("margin_right", 52) outer.add_theme_constant_override("margin_bottom", 18) add_child(outer) @@ -155,9 +176,8 @@ func _build_interface() -> void: outer.add_child(stack) var tabs := HBoxContainer.new() - # The 26 px page corner plus 8 px clearance keeps the flange behind - # the straight portion of the spread. - tabs.position = Vector2(LOGBOOK_TAB_LEFT_INSET, 20.0) + # Align the first flange with the authored left paper edge. + tabs.position = Vector2(LOGBOOK_TAB_LEFT_INSET, 37.0) tabs.size = Vector2(384.0, 38.0) tabs.z_index = 10 tabs.mouse_filter = Control.MOUSE_FILTER_PASS @@ -179,71 +199,206 @@ func _build_interface() -> void: _category_tabs.append(tab) _configure_category_focus() - var book := HBoxContainer.new() + var book := Control.new() book.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) book.offset_top = 50.0 book.z_index = 20 - book.add_theme_constant_override("separation", 12) + book.mouse_filter = Control.MOUSE_FILTER_IGNORE stack.add_child(book) - var left_page := PanelContainer.new() - left_page.size_flags_horizontal = Control.SIZE_EXPAND_FILL - left_page.size_flags_stretch_ratio = 1.12 - left_page.add_theme_stylebox_override( - "panel", _paper_style(PAPER, true) - ) + var artwork := TextureRect.new() + artwork.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + artwork.texture = LOGBOOK_ARTWORK + artwork.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + artwork.stretch_mode = TextureRect.STRETCH_SCALE + artwork.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + artwork.mouse_filter = Control.MOUSE_FILTER_IGNORE + book.add_child(artwork) + + var left_page := Control.new() + left_page.mouse_filter = Control.MOUSE_FILTER_IGNORE + _apply_artwork_rect(left_page, LEFT_PAGE_CONTENT_RECT) book.add_child(left_page) - var left_margin := MarginContainer.new() - _set_margins(left_margin, 18, 16, 18, 16) - left_page.add_child(left_margin) var left_layout := VBoxContainer.new() + left_layout.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) left_layout.add_theme_constant_override("separation", 8) - left_margin.add_child(left_layout) - var heading := _label("catch catalog", 25) - heading.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER - left_layout.add_child(heading) + left_page.add_child(left_layout) + _apply_page_content_scale(left_layout) + var scroll_indicator_top_lane := Control.new() + scroll_indicator_top_lane.custom_minimum_size.y = 20.0 + scroll_indicator_top_lane.mouse_filter = Control.MOUSE_FILTER_IGNORE + left_layout.add_child(scroll_indicator_top_lane) _empty_state = _label("", 18) _empty_state.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER _empty_state.vertical_alignment = VERTICAL_ALIGNMENT_CENTER _empty_state.size_flags_vertical = Control.SIZE_EXPAND_FILL left_layout.add_child(_empty_state) + var catalog_scroll_margin := MarginContainer.new() + catalog_scroll_margin.size_flags_vertical = Control.SIZE_EXPAND_FILL + catalog_scroll_margin.add_theme_constant_override("margin_left", 20) + left_layout.add_child(catalog_scroll_margin) _catalog_scroll = ScrollContainer.new() _catalog_scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL _catalog_scroll.horizontal_scroll_mode = ( ScrollContainer.SCROLL_MODE_DISABLED ) - left_layout.add_child(_catalog_scroll) + _catalog_scroll.scroll_vertical_custom_step = CATALOG_ROW_STEP + catalog_scroll_margin.add_child(_catalog_scroll) _catalog_grid = GridContainer.new() - _catalog_grid.columns = 5 + _catalog_grid.columns = 4 _catalog_grid.size_flags_horizontal = Control.SIZE_EXPAND_FILL - _catalog_grid.add_theme_constant_override("h_separation", 8) - _catalog_grid.add_theme_constant_override("v_separation", 8) + _catalog_grid.add_theme_constant_override("h_separation", 6) + _catalog_grid.add_theme_constant_override("v_separation", 6) _catalog_scroll.add_child(_catalog_grid) - - var gutter := ColorRect.new() - gutter.custom_minimum_size.x = 10 - gutter.color = Color("795f3f") - gutter.mouse_filter = Control.MOUSE_FILTER_IGNORE - book.add_child(gutter) - - var right_page := PanelContainer.new() - right_page.size_flags_horizontal = Control.SIZE_EXPAND_FILL - right_page.add_theme_stylebox_override( - "panel", _paper_style(PAPER_DARK, false) + var scroll_indicator_bottom_lane := Control.new() + scroll_indicator_bottom_lane.custom_minimum_size.y = 32.0 + scroll_indicator_bottom_lane.mouse_filter = Control.MOUSE_FILTER_IGNORE + left_layout.add_child(scroll_indicator_bottom_lane) + _configure_catalog_scroll_bar() + _catalog_scroll_up_indicator = _make_scroll_indicator( + "CatalogScrollUpIndicator", + SCROLL_UP_TEXTURE, + true, ) + left_page.add_child(_catalog_scroll_up_indicator) + _catalog_scroll_down_indicator = _make_scroll_indicator( + "CatalogScrollDownIndicator", + SCROLL_DOWN_TEXTURE, + false, + ) + left_page.add_child(_catalog_scroll_down_indicator) + + var right_page := Control.new() + right_page.mouse_filter = Control.MOUSE_FILTER_IGNORE + _apply_artwork_rect(right_page, RIGHT_PAGE_CONTENT_RECT) book.add_child(right_page) - var right_margin := MarginContainer.new() - _set_margins(right_margin, 22, 16, 22, 16) - right_page.add_child(right_margin) _detail_body = VBoxContainer.new() + _detail_body.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) _detail_body.size_flags_horizontal = Control.SIZE_EXPAND_FILL _detail_body.size_flags_vertical = Control.SIZE_EXPAND_FILL _detail_body.add_theme_constant_override("separation", 16) - right_margin.add_child(_detail_body) + right_page.add_child(_detail_body) + _apply_page_content_scale(_detail_body) _show_no_selection() _build_portrait_overlay() +func _apply_artwork_rect(control: Control, source_rect: Rect2) -> void: + control.anchor_left = source_rect.position.x / LOGBOOK_ARTWORK_SOURCE_SIZE.x + control.anchor_top = source_rect.position.y / LOGBOOK_ARTWORK_SOURCE_SIZE.y + control.anchor_right = source_rect.end.x / LOGBOOK_ARTWORK_SOURCE_SIZE.x + control.anchor_bottom = source_rect.end.y / LOGBOOK_ARTWORK_SOURCE_SIZE.y + control.offset_left = 0.0 + control.offset_top = 0.0 + control.offset_right = 0.0 + control.offset_bottom = 0.0 + + +func _apply_page_content_scale(control: Control) -> void: + control.scale = Vector2.ONE * PAGE_CONTENT_SCALE + control.resized.connect(_center_scaled_content.bind(control)) + _center_scaled_content.call_deferred(control) + + +func _center_scaled_content(control: Control) -> void: + if is_instance_valid(control): + control.pivot_offset = control.size * 0.5 + + +func _configure_catalog_scroll_bar() -> void: + _catalog_scroll_snap_timer = Timer.new() + _catalog_scroll_snap_timer.one_shot = true + _catalog_scroll_snap_timer.wait_time = CATALOG_SNAP_DELAY + _catalog_scroll_snap_timer.timeout.connect(_snap_catalog_scroll_to_row) + _catalog_scroll.add_child(_catalog_scroll_snap_timer) + var scroll_bar: VScrollBar = _catalog_scroll.get_v_scroll_bar() + scroll_bar.mouse_filter = Control.MOUSE_FILTER_IGNORE + scroll_bar.focus_mode = Control.FOCUS_NONE + scroll_bar.self_modulate = Color.TRANSPARENT + scroll_bar.custom_minimum_size.x = 0.0 + scroll_bar.add_theme_constant_override("scroll_size", 0) + var empty_style := StyleBoxEmpty.new() + for style_name: StringName in [ + &"scroll", + &"scroll_focus", + &"grabber", + &"grabber_highlight", + &"grabber_pressed", + ]: + scroll_bar.add_theme_stylebox_override(style_name, empty_style) + scroll_bar.changed.connect(_refresh_catalog_scroll_indicators) + scroll_bar.value_changed.connect(_on_catalog_scroll_value_changed) + + +func _make_scroll_indicator( + indicator_name: String, + indicator_texture: Texture2D, + at_top: bool, +) -> TextureRect: + var indicator := TextureRect.new() + indicator.name = indicator_name + indicator.anchor_left = 0.5 + indicator.anchor_right = 0.5 + indicator.anchor_top = 0.0 if at_top else 1.0 + indicator.anchor_bottom = indicator.anchor_top + indicator.offset_left = -14.0 + indicator.offset_right = 14.0 + indicator.offset_top = -8.0 if at_top else -35.0 + indicator.offset_bottom = 20.0 if at_top else -7.0 + indicator.z_index = 30 + indicator.texture = indicator_texture + indicator.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + indicator.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + indicator.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + indicator.mouse_filter = Control.MOUSE_FILTER_IGNORE + indicator.visible = false + return indicator + + +func _on_catalog_scroll_value_changed(value: float) -> void: + if _snapping_catalog_scroll: + return + _catalog_scroll_snap_timer.start() + _refresh_catalog_scroll_indicators() + + +func _snap_catalog_scroll_to_row() -> void: + var scroll_bar: VScrollBar = _catalog_scroll.get_v_scroll_bar() + var value: float = scroll_bar.value + var maximum_scroll: float = scroll_bar.max_value - scroll_bar.page + var snapped_value: float = clampf( + roundf(value / CATALOG_ROW_STEP) * CATALOG_ROW_STEP, + scroll_bar.min_value, + maximum_scroll, + ) + if not is_equal_approx(value, snapped_value): + _snapping_catalog_scroll = true + _catalog_scroll.scroll_vertical = roundi(snapped_value) + _snapping_catalog_scroll = false + _refresh_catalog_scroll_indicators() + + +func _refresh_catalog_scroll_indicators() -> void: + if ( + _catalog_scroll == null + or _catalog_scroll_up_indicator == null + or _catalog_scroll_down_indicator == null + ): + return + var scroll_bar: VScrollBar = _catalog_scroll.get_v_scroll_bar() + var maximum_scroll: float = scroll_bar.max_value - scroll_bar.page + var has_overflow: bool = ( + _catalog_scroll.visible + and maximum_scroll > scroll_bar.min_value + 0.5 + ) + _catalog_scroll_up_indicator.visible = ( + has_overflow and scroll_bar.value > scroll_bar.min_value + 0.5 + ) + _catalog_scroll_down_indicator.visible = ( + has_overflow and scroll_bar.value < maximum_scroll - 0.5 + ) + + func _refresh_catalog() -> void: if not is_node_ready(): return @@ -293,11 +448,12 @@ func _refresh_catalog() -> void: _refresh_selection_styles() _refresh_details(false) set_interactive(_interactive) + _refresh_catalog_scroll_indicators.call_deferred() func _make_entry(fish: FishDataType, discovered: bool) -> Button: var entry := Button.new() - entry.custom_minimum_size = Vector2(102, 102) + entry.custom_minimum_size = CATALOG_ENTRY_SIZE entry.size_flags_horizontal = Control.SIZE_SHRINK_CENTER entry.size_flags_vertical = Control.SIZE_SHRINK_CENTER entry.toggle_mode = true @@ -344,7 +500,7 @@ func _add_entry_content( var portrait_view := LogbookPortraitType.new() portrait_view.configure( portrait, - LogbookPortraitType.ENTRY_FRAME_SIZE, + CATALOG_PORTRAIT_SIZE, _silhouette_material if unknown else null, ) content.add_child(portrait_view) @@ -495,10 +651,14 @@ func _refresh_details(animate: bool) -> void: func _build_known_details(fish: FishDataType) -> void: _clear_details() var catalog_number: int = LogbookCatalog.catalog_number(fish.id) + var summary_margin := MarginContainer.new() + summary_margin.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _set_margins(summary_margin, 40, 0, 40, 0) + _detail_body.add_child(summary_margin) var summary_columns := HBoxContainer.new() summary_columns.size_flags_horizontal = Control.SIZE_EXPAND_FILL summary_columns.add_theme_constant_override("separation", 24) - _detail_body.add_child(summary_columns) + summary_margin.add_child(summary_columns) var portrait_column := VBoxContainer.new() portrait_column.size_flags_horizontal = Control.SIZE_EXPAND_FILL @@ -510,12 +670,11 @@ func _build_known_details(fish: FishDataType) -> void: portrait_column.add_child(title) if fish.display_texture != null: _detail_portrait_button = Button.new() - _detail_portrait_button.custom_minimum_size = ( - LogbookPortraitType.DETAIL_FRAME_SIZE - ) + _detail_portrait_button.custom_minimum_size = DETAIL_PORTRAIT_SIZE _detail_portrait_button.size_flags_horizontal = ( Control.SIZE_SHRINK_CENTER ) + _detail_portrait_button.clip_contents = true _detail_portrait_button.tooltip_text = "View larger artwork" _detail_portrait_button.accessibility_name = ( "View larger artwork for %s" % fish.display_name @@ -545,7 +704,7 @@ func _build_known_details(fish: FishDataType) -> void: var artwork := LogbookPortraitType.new() artwork.configure( fish.display_texture, - LogbookPortraitType.DETAIL_FRAME_SIZE, + DETAIL_PORTRAIT_SIZE, ) artwork_center.add_child(artwork) @@ -562,11 +721,15 @@ func _build_known_details(fish: FishDataType) -> void: facts_column.add_child(facts) _detail_body.add_child(_build_quality_progress(fish.id)) + var stats_anchor := VBoxContainer.new() + stats_anchor.size_flags_horizontal = Control.SIZE_EXPAND_FILL + stats_anchor.size_flags_vertical = Control.SIZE_EXPAND_FILL + stats_anchor.alignment = BoxContainer.ALIGNMENT_END + _detail_body.add_child(stats_anchor) var stats_columns := HBoxContainer.new() stats_columns.size_flags_horizontal = Control.SIZE_EXPAND_FILL - stats_columns.size_flags_vertical = Control.SIZE_EXPAND_FILL stats_columns.add_theme_constant_override("separation", 28) - _detail_body.add_child(stats_columns) + stats_anchor.add_child(stats_columns) var left_stats := _make_stats_column() var right_stats := _make_stats_column() stats_columns.add_child(left_stats) @@ -611,11 +774,16 @@ func _build_known_details(fish: FishDataType) -> void: "number owned", str(_inventory.get_count(fish.id) if _inventory != null else 0), ) + var bottom_inset := Control.new() + bottom_inset.custom_minimum_size.y = DETAIL_BOTTOM_INSET + bottom_inset.mouse_filter = Control.MOUSE_FILTER_IGNORE + stats_anchor.add_child(bottom_inset) func _build_quality_progress(fish_id: StringName) -> VBoxContainer: var quality_section := VBoxContainer.new() - quality_section.add_theme_constant_override("separation", 3) + quality_section.size_flags_horizontal = Control.SIZE_EXPAND_FILL + quality_section.add_theme_constant_override("separation", 6) var discovered_count: int = 0 for quality: int in FishQualityType.TIER_COUNT: if _collection_log.has_discovered_quality(fish_id, quality): @@ -625,29 +793,36 @@ func _build_quality_progress(fish_id: StringName) -> VBoxContainer: discovered_count, FishQualityType.TIER_COUNT, ], - 14, + 17, ) heading.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER heading.add_theme_color_override("font_color", MUTED_INK) quality_section.add_child(heading) - var tiers := HBoxContainer.new() - tiers.alignment = BoxContainer.ALIGNMENT_CENTER - tiers.add_theme_constant_override("separation", 10) + var tiers := VBoxContainer.new() + tiers.add_theme_constant_override("separation", 6) quality_section.add_child(tiers) for quality: int in FishQualityType.TIER_COUNT: + var row: HBoxContainer + if quality % 2 == 0: + row = HBoxContainer.new() + row.alignment = BoxContainer.ALIGNMENT_CENTER + row.add_theme_constant_override("separation", 28) + tiers.add_child(row) + else: + row = tiers.get_child(tiers.get_child_count() - 1) as HBoxContainer var discovered: bool = _collection_log.has_discovered_quality( fish_id, quality, ) var tier := HBoxContainer.new() tier.alignment = BoxContainer.ALIGNMENT_CENTER - tier.add_theme_constant_override("separation", 3) + tier.add_theme_constant_override("separation", 5) var quality_color: Color = UIPalette.get_quality_color(quality) - var dot := _label("●" if discovered else "○", 13) + var dot := _label("●" if discovered else "○", 17) dot.add_theme_color_override("font_color", quality_color) dot.modulate.a = 1.0 if discovered else 0.48 tier.add_child(dot) - var tier_label := _label(FishQualityType.display_name(quality), 13) + var tier_label := _label(FishQualityType.display_name(quality), 16) tier_label.add_theme_color_override( "font_color", INK if discovered else MUTED_INK, @@ -659,7 +834,7 @@ func _build_quality_progress(fish_id: StringName) -> VBoxContainer: else "%s quality not yet collected" ) % FishQualityType.display_name(quality) tier.add_child(tier_label) - tiers.add_child(tier) + row.add_child(tier) return quality_section @@ -848,18 +1023,6 @@ func _entry_label_text(entry_name: String) -> String: ) -func _paper_style(color: Color, left: bool) -> StyleBoxFlat: - var style := StyleBoxFlat.new() - style.bg_color = color - style.border_color = Color("9b7a4f") - style.set_border_width_all(3) - style.corner_radius_top_left = 26 if left else 6 - style.corner_radius_bottom_left = 32 if left else 6 - style.corner_radius_top_right = 6 if left else 28 - style.corner_radius_bottom_right = 6 if left else 34 - return style - - func _build_portrait_overlay() -> void: _portrait_overlay = Control.new() _portrait_overlay.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) diff --git a/ui/pause_menu.tscn b/ui/pause_menu.tscn index 2477f23..941e26e 100644 --- a/ui/pause_menu.tscn +++ b/ui/pause_menu.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3] +[gd_scene load_steps=16 format=3] [ext_resource type="Script" path="res://ui/pause_menu.gd" id="1_script"] [ext_resource type="PackedScene" path="res://ui/settings_panel.tscn" id="2_settings"] @@ -10,6 +10,11 @@ [ext_resource type="Script" path="res://ui/components/bubble_menu/bubble_transition_flurry.gd" id="8_flurry"] [ext_resource type="PackedScene" path="res://ui/components/bubble_menu/bubble_confirmation_page.tscn" id="9_confirmation"] [ext_resource type="PackedScene" path="res://ui/network/join_game_page.tscn" id="10_join_page"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/online_dark.png" id="11_online_dark"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/save_dark.png" id="12_save_dark"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/settings_dark.png" id="13_settings_dark"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/undo_dark.png" id="14_undo_dark"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/x_dark.png" id="15_x_dark"] [node name="PauseMenu" type="Control"] unique_name_in_owner = true @@ -87,7 +92,9 @@ compact_reference_size = Vector2(608, 448) [node name="ResumeButton" parent="ResponsivePauseStage/PausePresentationScaleRoot/RootPage/BubbleCluster" instance=ExtResource("5_bubble")] unique_name_in_owner = true custom_minimum_size = Vector2(0, 0) -text = "return\nto game" +texture_filter = 1 +icon = ExtResource("14_undo_dark") +tooltip_text = "return to game" accessibility_name = "return to game" neutral_size = Vector2(174, 164) desktop_anchor = Vector2(335, 220) @@ -100,7 +107,9 @@ motion_phase = 0.3 [node name="SaveButton" parent="ResponsivePauseStage/PausePresentationScaleRoot/RootPage/BubbleCluster" instance=ExtResource("5_bubble")] unique_name_in_owner = true custom_minimum_size = Vector2(0, 0) -text = "save\nnow" +texture_filter = 1 +icon = ExtResource("12_save_dark") +tooltip_text = "save now" accessibility_name = "save now" neutral_size = Vector2(126, 120) desktop_anchor = Vector2(185, 185) @@ -113,7 +122,10 @@ motion_phase = 1.15 [node name="SettingsButton" parent="ResponsivePauseStage/PausePresentationScaleRoot/RootPage/BubbleCluster" instance=ExtResource("5_bubble")] unique_name_in_owner = true custom_minimum_size = Vector2(0, 0) -text = "settings" +texture_filter = 1 +icon = ExtResource("13_settings_dark") +tooltip_text = "settings" +accessibility_name = "settings" neutral_size = Vector2(144, 136) desktop_anchor = Vector2(485, 170) compact_anchor = Vector2(515, 175) @@ -125,7 +137,9 @@ motion_phase = 2.05 [node name="JoinGameButton" parent="ResponsivePauseStage/PausePresentationScaleRoot/RootPage/BubbleCluster" instance=ExtResource("5_bubble")] unique_name_in_owner = true custom_minimum_size = Vector2(0, 0) -text = "join\ngame" +texture_filter = 1 +icon = ExtResource("11_online_dark") +tooltip_text = "join game" accessibility_name = "join game" neutral_size = Vector2(126, 120) desktop_anchor = Vector2(105, 320) @@ -164,7 +178,10 @@ motion_phase = 3.9 [node name="QuitButton" parent="ResponsivePauseStage/PausePresentationScaleRoot/RootPage/BubbleCluster" instance=ExtResource("5_bubble")] unique_name_in_owner = true custom_minimum_size = Vector2(0, 0) -text = "quit" +texture_filter = 1 +icon = ExtResource("15_x_dark") +tooltip_text = "quit" +accessibility_name = "quit" neutral_size = Vector2(102, 98) desktop_anchor = Vector2(390, 395) compact_anchor = Vector2(390, 410) diff --git a/ui/player_menu.tscn b/ui/player_menu.tscn index c2ebff5..4fcf0c0 100644 --- a/ui/player_menu.tscn +++ b/ui/player_menu.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=26 format=3] +[gd_scene load_steps=27 format=3] [ext_resource type="Script" path="res://ui/player_menu.gd" id="1_menu"] [ext_resource type="Theme" path="res://ui/game_theme.tres" id="2_theme"] @@ -24,6 +24,7 @@ [ext_resource type="Script" path="res://ui/components/inventory_notepad.gd" id="22_inventory_notepad"] [ext_resource type="Script" path="res://ui/components/organizer_tab.gd" id="23_organizer_tab"] [ext_resource type="PackedScene" path="res://ui/the_net_page.tscn" id="24_the_net_page"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/online_dark.png" id="25_online_dark"] [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_collection"] @@ -700,11 +701,13 @@ layout_mode = 2 text = "Select bait or a lure for details." autowrap_mode = 2 -[node name="TackleEquipButton" type="Button" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot/TackleBoxPage/TackleDetailPanel/Margin/Layout"] +[node name="TackleEquipButton" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot/TackleBoxPage/TackleDetailPanel/Margin/Layout" instance=ExtResource("12_ink_action")] unique_name_in_owner = true layout_mode = 2 -custom_minimum_size = Vector2(0, 44) +custom_minimum_size = Vector2(150, 68) +size_flags_horizontal = 4 text = "equip worms" +allow_persistent_mark = true [node name="LogbookPage" type="Control" parent="ResponsivePlayerMenuStage/PlayerMenuPresentationScaleRoot"] unique_name_in_owner = true @@ -1506,7 +1509,9 @@ deformation_period = 6.5 unique_name_in_owner = true layout_mode = 0 toggle_mode = true -text = "online" +texture_filter = 1 +icon = ExtResource("25_online_dark") +tooltip_text = "online" accessibility_name = "online" script = ExtResource("6_bubble") profile = ExtResource("4_profile") diff --git a/ui/profile_page.gd b/ui/profile_page.gd index a5b030c..b895bac 100644 --- a/ui/profile_page.gd +++ b/ui/profile_page.gd @@ -6,6 +6,12 @@ const OPTION_GRID_COLUMNS: int = 6 const ControllerMappingManagerType = preload( "res://settings/controller_mapping_manager.gd" ) +const AnimaleseVoiceType = preload("res://ui/animalese_voice.gd") +const TypewriterRevealType = preload("res://ui/typewriter_reveal.gd") +const VoiceProfilesType = preload( + "res://player/animalese_voice_profiles.gd" +) +const VOICE_CATEGORY_ID: String = "voice" var _service: NetworkProfileService var _experience: PlayerExperience @@ -13,6 +19,10 @@ var _draft_name: String = "" var _draft_appearance: Dictionary = {} var _persisted_name: String = "" var _persisted_appearance: Dictionary = {} +var _draft_voice_id: String = VoiceProfilesType.DEFAULT_ID +var _persisted_voice_id: String = VoiceProfilesType.DEFAULT_ID +var _draft_speech_speed_id: String = VoiceProfilesType.DEFAULT_SPEED_ID +var _persisted_speech_speed_id: String = VoiceProfilesType.DEFAULT_SPEED_ID var _category_id: String = "species" var _dirty: bool = false var _allow_duplicate: bool = false @@ -36,6 +46,8 @@ var _experience_progress: ProgressBar var _experience_value: Label var _feature_preview_cache: Dictionary = {} var _scale_value_label: Label +var _voice_preview: AnimaleseVoiceType +var _voice_preview_tween: Tween func _ready() -> void: @@ -104,6 +116,8 @@ func activate() -> void: func deactivate() -> void: visible = false _debounce.stop() + if _voice_preview_tween != null and _voice_preview_tween.is_valid(): + _voice_preview_tween.kill() _preview.reset_view() @@ -368,15 +382,22 @@ func _build_ui() -> void: UtilityPageStyle.apply_ocean_button(_keep_editing_button) confirm_buttons.add_child(_keep_editing_button) + _voice_preview = AnimaleseVoiceType.new() + _voice_preview.name = "ProfileVoicePreview" + add_child(_voice_preview) _build_categories() func _build_categories() -> void: for child: Node in _category_list.get_children(): child.queue_free() - for category_id: String in CharacterCustomizationCatalog.CATEGORY_IDS: + var category_ids: Array[String] = [] + for appearance_category: String in CharacterCustomizationCatalog.CATEGORY_IDS: + category_ids.append(appearance_category) + category_ids.append(VOICE_CATEGORY_ID) + for category_id: String in category_ids: var button := Button.new() - button.text = CharacterCustomizationCatalog.category_label(category_id) + button.text = _category_label(category_id) button.toggle_mode = true button.custom_minimum_size.x = 120.0 button.button_pressed = category_id == _category_id @@ -392,7 +413,7 @@ func _select_category(category_id: String) -> void: var button := child as Button if button != null: button.button_pressed = button.text == ( - CharacterCustomizationCatalog.category_label(category_id) + _category_label(category_id) ) _refresh_options() @@ -401,12 +422,15 @@ func _refresh_options() -> void: for child: Node in _option_list.get_children(): child.queue_free() var title := Label.new() - title.text = CharacterCustomizationCatalog.category_label(_category_id) + title.text = _category_label(_category_id) title.add_theme_font_size_override("font_size", 18) title.add_theme_color_override( "font_color", UtilityPageStyle.OCEAN_TEXT_PRIMARY ) _option_list.add_child(title) + if _category_id == VOICE_CATEGORY_ID: + _build_voice_options() + return if _category_id == CharacterCustomizationCatalog.SCALE_CATEGORY_ID: _build_scale_option() return @@ -440,6 +464,106 @@ func _refresh_options() -> void: _option_list.add_child(button) +func _category_label(category_id: String) -> String: + return ( + "voice" + if category_id == VOICE_CATEGORY_ID + else CharacterCustomizationCatalog.category_label(category_id) + ) + + +func _build_voice_options() -> void: + var description := Label.new() + description.text = "Choose how your character sounds in chat." + description.add_theme_color_override( + "font_color", UtilityPageStyle.OCEAN_TEXT_SECONDARY + ) + _option_list.add_child(description) + var grid := GridContainer.new() + grid.columns = 2 + grid.add_theme_constant_override("h_separation", 8) + grid.add_theme_constant_override("v_separation", 8) + _option_list.add_child(grid) + for option: Dictionary in VoiceProfilesType.OPTIONS: + var option_id := str(option.get("id", "")) + var button := Button.new() + button.text = str(option.get("label", option_id)) + button.toggle_mode = true + button.custom_minimum_size = Vector2(170.0, 42.0) + button.button_pressed = _draft_voice_id == option_id + button.pressed.connect(_select_voice_option.bind(option_id)) + UtilityPageStyle.apply_compact_ocean_button(button) + grid.add_child(button) + var divider := HSeparator.new() + divider.custom_minimum_size.y = 8.0 + _option_list.add_child(divider) + var speed_title := Label.new() + speed_title.text = "speech speed" + speed_title.add_theme_font_size_override("font_size", 16) + speed_title.add_theme_color_override( + "font_color", UtilityPageStyle.OCEAN_TEXT_PRIMARY + ) + _option_list.add_child(speed_title) + var speed_description := Label.new() + speed_description.text = "Controls player chat speech on this device only." + speed_description.add_theme_color_override( + "font_color", UtilityPageStyle.OCEAN_TEXT_SECONDARY + ) + _option_list.add_child(speed_description) + var speed_grid := GridContainer.new() + speed_grid.columns = 2 + speed_grid.add_theme_constant_override("h_separation", 8) + speed_grid.add_theme_constant_override("v_separation", 8) + _option_list.add_child(speed_grid) + for option: Dictionary in VoiceProfilesType.SPEED_OPTIONS: + var speed_id := str(option.get("id", "")) + var speed_button := Button.new() + speed_button.text = str(option.get("label", speed_id)) + speed_button.tooltip_text = "%d characters per second" % roundi( + float(option.get("characters_per_second", 28.0)) + ) + speed_button.toggle_mode = true + speed_button.custom_minimum_size = Vector2(170.0, 38.0) + speed_button.button_pressed = _draft_speech_speed_id == speed_id + speed_button.pressed.connect( + _select_speech_speed_option.bind(speed_id) + ) + UtilityPageStyle.apply_compact_ocean_button(speed_button) + speed_grid.add_child(speed_button) + + +func _select_voice_option(voice_id: String) -> void: + if not VoiceProfilesType.is_valid(voice_id): + return + _draft_voice_id = voice_id + _dirty = _draft_differs() + _refresh_options() + _refresh_actions() + _play_voice_preview() + + +func _select_speech_speed_option(speed_id: String) -> void: + if not VoiceProfilesType.is_valid_speed(speed_id): + return + _draft_speech_speed_id = speed_id + _dirty = _draft_differs() + _refresh_options() + _refresh_actions() + _play_voice_preview() + + +func _play_voice_preview() -> void: + if _voice_preview_tween != null and _voice_preview_tween.is_valid(): + _voice_preview_tween.kill() + _voice_preview_tween = _voice_preview.speak_text( + self, + "hello there!", + "profile-preview", + _draft_voice_id, + VoiceProfilesType.speed_for(_draft_speech_speed_id), + ) + + func _build_scale_option() -> void: var description := Label.new() description.text = "Adjust your character's visual size." @@ -741,7 +865,13 @@ func _apply() -> void: if _service == null: return _apply_button.disabled = true - _service.apply_profile(_draft_name, _draft_appearance, _allow_duplicate) + _service.apply_profile( + _draft_name, + _draft_appearance, + _allow_duplicate, + _draft_voice_id, + _draft_speech_speed_id, + ) func _on_apply_finished(accepted: bool, message: String) -> void: @@ -756,8 +886,17 @@ func _load_persisted() -> void: return _persisted_name = _service.get_persisted_name() _persisted_appearance = _service.get_persisted_appearance() + _persisted_voice_id = _service.get_persisted_voice_id() + _persisted_speech_speed_id = ( + _service.get_persisted_speech_speed_id() + ) _draft_name = _persisted_name _draft_appearance = _persisted_appearance.duplicate(true) + _draft_voice_id = _persisted_voice_id + _draft_speech_speed_id = _persisted_speech_speed_id + TypewriterRevealType.set_characters_per_second( + VoiceProfilesType.speed_for(_persisted_speech_speed_id) + ) _name_edit.text = _draft_name _preview.apply_appearance_profile(_draft_appearance) _dirty = false @@ -793,6 +932,8 @@ func _confirm_pending_action() -> void: _discard_confirmation.visible = false if _confirmation_action == "defaults": _draft_appearance = CharacterCustomizationCatalog.default_snapshot() + _draft_voice_id = VoiceProfilesType.DEFAULT_ID + _draft_speech_speed_id = VoiceProfilesType.DEFAULT_SPEED_ID _preview.apply_appearance_profile(_draft_appearance) _dirty = _draft_differs() _refresh_options() @@ -806,6 +947,8 @@ func _draft_differs() -> bool: return ( _draft_name.strip_edges() != _persisted_name or _draft_appearance != _persisted_appearance + or _draft_voice_id != _persisted_voice_id + or _draft_speech_speed_id != _persisted_speech_speed_id ) diff --git a/ui/settings_panel.tscn b/ui/settings_panel.tscn index e821c82..6d05831 100644 --- a/ui/settings_panel.tscn +++ b/ui/settings_panel.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=7 format=3] +[gd_scene load_steps=9 format=3] [ext_resource type="Script" path="res://ui/settings_panel.gd" id="1_panel"] [ext_resource type="Theme" path="res://ui/game_theme.tres" id="2_theme"] @@ -6,6 +6,8 @@ [ext_resource type="PackedScene" path="res://ui/components/bubble_menu/bubble_button.tscn" id="4_bubble"] [ext_resource type="Script" path="res://ui/components/bubble_menu/bubble_cluster.gd" id="5_cluster"] [ext_resource type="Resource" path="res://ui/components/bubble_menu/bubble_menu_profile.tres" id="6_profile"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/undo_dark.png" id="7_undo_dark"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/check_mark_dark.png" id="8_check_mark_dark"] [node name="SettingsPanel" type="Control"] visible = false @@ -109,7 +111,9 @@ offset_left = 474.0 offset_top = 308.0 offset_right = 586.0 offset_bottom = 412.0 -text = "apply" +icon = ExtResource("8_check_mark_dark") +tooltip_text = "apply" +accessibility_name = "apply" neutral_size = Vector2(112, 104) desktop_anchor = Vector2(511, 332) compact_anchor = Vector2(470, 330) @@ -137,7 +141,9 @@ offset_left = 70.0 offset_top = 343.0 offset_right = 170.0 offset_bottom = 437.0 -text = "back" +icon = ExtResource("7_undo_dark") +tooltip_text = "back" +accessibility_name = "back" neutral_size = Vector2(100, 94) desktop_anchor = Vector2(220, 300) compact_anchor = Vector2(155, 275) diff --git a/ui/surface_drawing_toolbar.tscn b/ui/surface_drawing_toolbar.tscn index 61db805..d1d2864 100644 --- a/ui/surface_drawing_toolbar.tscn +++ b/ui/surface_drawing_toolbar.tscn @@ -1,7 +1,10 @@ -[gd_scene load_steps=3 format=3] +[gd_scene load_steps=6 format=3] [ext_resource type="Script" path="res://ui/surface_drawing_toolbar.gd" id="1_script"] [ext_resource type="Theme" path="res://ui/game_theme.tres" id="2_theme"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/undo_light.png" id="3_undo_light"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/check_mark_light.png" id="4_check_mark_light"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/x_light.png" id="5_x_light"] [node name="SurfaceDrawingToolbar" type="Control"] visible = false @@ -55,8 +58,11 @@ text = "⌫" [node name="UndoButton" type="Button" parent="TopPanel/Top"] unique_name_in_owner = true layout_mode = 2 +texture_filter = 1 tooltip_text = "undo last stroke" -text = "↶" +accessibility_name = "undo last stroke" +icon = ExtResource("3_undo_light") +expand_icon = true [node name="HideGuideButton" type="Button" parent="TopPanel/Top"] unique_name_in_owner = true @@ -75,15 +81,21 @@ text = "▤" [node name="FinalizeGuideButton" type="Button" parent="TopPanel/Top"] unique_name_in_owner = true layout_mode = 2 +texture_filter = 1 tooltip_text = "finish grid on next click" toggle_mode = true -text = "✓" +accessibility_name = "finish grid on next click" +icon = ExtResource("4_check_mark_light") +expand_icon = true [node name="CloseButton" type="Button" parent="TopPanel/Top"] unique_name_in_owner = true layout_mode = 2 +texture_filter = 1 tooltip_text = "close art tools" -text = "×" +accessibility_name = "close art tools" +icon = ExtResource("5_x_light") +expand_icon = true [node name="ColorPanel" type="PanelContainer" parent="."] unique_name_in_owner = true diff --git a/ui/the_net_page.gd b/ui/the_net_page.gd index 3ee735a..8adc772 100644 --- a/ui/the_net_page.gd +++ b/ui/the_net_page.gd @@ -407,9 +407,9 @@ func _refresh_forecast(force: bool) -> void: slot.mouse_filter = Control.MOUSE_FILTER_IGNORE _forecast_list.add_child(slot) var icon := WeatherIcon.new() - icon.position = Vector2(1.0, 7.0) - icon.size = Vector2(56.0, 56.0) - icon.custom_minimum_size = Vector2(56.0, 56.0) + icon.position = Vector2(10.5, 17.0) + icon.size = Vector2(42.0, 42.0) + icon.custom_minimum_size = Vector2(42.0, 42.0) icon.set_weather(weather) icon.set_nighttime( WorldTimeService.phase_for_hour(start_hour) @@ -417,13 +417,13 @@ func _refresh_forecast(force: bool) -> void: ) slot.add_child(icon) var time_label := Label.new() - time_label.position = Vector2(34.0, 0.0) - time_label.size = Vector2(29.0, 18.0) + time_label.position = Vector2(27.0, 0.0) + time_label.size = Vector2(36.0, 22.0) time_label.mouse_filter = Control.MOUSE_FILTER_IGNORE time_label.text = _forecast_exponent_time(start_hour) time_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER time_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - time_label.add_theme_font_size_override("font_size", 10) + time_label.add_theme_font_size_override("font_size", 13) time_label.add_theme_constant_override("outline_size", 3) time_label.add_theme_color_override( "font_color", UtilityPageStyle.OCEAN_TEXT_PRIMARY diff --git a/ui/title_screen.tscn b/ui/title_screen.tscn index 44da14a..d9234c1 100644 --- a/ui/title_screen.tscn +++ b/ui/title_screen.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3] +[gd_scene load_steps=17 format=3] [ext_resource type="Script" path="res://ui/title_screen.gd" id="1_script"] [ext_resource type="Theme" path="res://ui/game_theme.tres" id="2_theme"] @@ -11,6 +11,9 @@ [ext_resource type="Resource" path="res://ui/components/bubble_menu/bubble_menu_profile.tres" id="9_bubble_profile"] [ext_resource type="PackedScene" path="res://ui/title_confirmation_bubble_page.tscn" id="10_confirmation_page"] [ext_resource type="PackedScene" path="res://ui/network/join_game_page.tscn" id="11_join_page"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/online_dark.png" id="12_online_dark"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/settings_dark.png" id="13_settings_dark"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/x_dark.png" id="14_x_dark"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_title_water"] shader = ExtResource("4_water_shader") @@ -303,7 +306,10 @@ offset_left = 264.0 offset_top = 17.0 offset_right = 384.0 offset_bottom = 133.0 -text = "settings" +texture_filter = 1 +icon = ExtResource("13_settings_dark") +tooltip_text = "settings" +accessibility_name = "settings" script = ExtResource("7_bubble_button") profile = ExtResource("9_bubble_profile") desktop_anchor = Vector2(324, 75) @@ -322,7 +328,10 @@ offset_left = 126.0 offset_top = 224.0 offset_right = 248.0 offset_bottom = 342.0 -text = "join\ngame" +texture_filter = 1 +icon = ExtResource("12_online_dark") +tooltip_text = "join game" +accessibility_name = "join game" script = ExtResource("7_bubble_button") profile = ExtResource("9_bubble_profile") neutral_size = Vector2(122, 118) @@ -380,7 +389,10 @@ offset_left = 275.0 offset_top = 217.0 offset_right = 369.0 offset_bottom = 309.0 -text = "quit" +texture_filter = 1 +icon = ExtResource("14_x_dark") +tooltip_text = "quit" +accessibility_name = "quit" script = ExtResource("7_bubble_button") profile = ExtResource("9_bubble_profile") neutral_size = Vector2(94, 92) diff --git a/ui/typewriter_reveal.gd b/ui/typewriter_reveal.gd new file mode 100644 index 0000000..aa4f3d6 --- /dev/null +++ b/ui/typewriter_reveal.gd @@ -0,0 +1,47 @@ +class_name TypewriterReveal +extends RefCounted + +const DEFAULT_CHARACTERS_PER_SECOND: float = 28.0 +const MIN_CHARACTERS_PER_SECOND: float = 12.0 +const MAX_CHARACTERS_PER_SECOND: float = 60.0 + +static var _characters_per_second: float = DEFAULT_CHARACTERS_PER_SECOND + + +static func set_characters_per_second(value: float) -> void: + _characters_per_second = clampf( + value, + MIN_CHARACTERS_PER_SECOND, + MAX_CHARACTERS_PER_SECOND, + ) + + +static func get_characters_per_second() -> float: + return _characters_per_second + + +static func start( + label: Label, + characters_per_second: float = -1.0, +) -> float: + if label == null: + return 0.0 + var character_count: int = label.get_total_character_count() + if character_count <= 0: + label.visible_characters = -1 + return 0.0 + label.visible_characters = 0 + var resolved_characters_per_second := ( + characters_per_second + if characters_per_second > 0.0 + else _characters_per_second + ) + var duration := float(character_count) / resolved_characters_per_second + var reveal_tween := label.create_tween() + reveal_tween.tween_property( + label, + "visible_characters", + character_count, + duration, + ).from(0).set_trans(Tween.TRANS_LINEAR) + return duration diff --git a/ui/typewriter_reveal.gd.uid b/ui/typewriter_reveal.gd.uid new file mode 100644 index 0000000..2d96fd3 --- /dev/null +++ b/ui/typewriter_reveal.gd.uid @@ -0,0 +1 @@ +uid://c1as5qlog6ijy diff --git a/ui/weather_icon.gd b/ui/weather_icon.gd index 894e140..e14f3dc 100644 --- a/ui/weather_icon.gd +++ b/ui/weather_icon.gd @@ -1,11 +1,21 @@ class_name WeatherIcon extends Control -const BUBBLE_COLOR := Color(0.025, 0.13, 0.19, 0.94) -const ICON_COLOR := Color(0.78, 0.91, 0.95) -const SUN_COLOR := Color(0.98, 0.82, 0.34) -const MOON_COLOR := Color(0.78, 0.88, 1.0) -const RAIN_COLOR := Color(0.28, 0.73, 0.82) +const CLEAR_DAY_TEXTURE: Texture2D = preload( + "res://ui/icons/weather/weather_clear_day.png" +) +const CLEAR_NIGHT_TEXTURE: Texture2D = preload( + "res://ui/icons/weather/weather_clear_night_full.png" +) +const CLOUDY_TEXTURE: Texture2D = preload( + "res://ui/icons/weather/weather_cloudy.png" +) +const FOG_TEXTURE: Texture2D = preload( + "res://ui/icons/weather/weather_fog.png" +) +const RAIN_TEXTURE: Texture2D = preload( + "res://ui/icons/weather/weather_rain.png" +) var _weather: WorldWeatherService.Weather = WorldWeatherService.Weather.SUNNY var _is_nighttime: bool = false @@ -14,6 +24,7 @@ var _is_nighttime: bool = false func _ready() -> void: mouse_filter = Control.MOUSE_FILTER_PASS focus_mode = Control.FOCUS_NONE + texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST custom_minimum_size = Vector2(34.0, 34.0) _update_tooltip() queue_redraw() @@ -44,55 +55,22 @@ func get_weather() -> WorldWeatherService.Weather: func _draw() -> void: - var center: Vector2 = size * 0.5 - var radius: float = minf(size.x, size.y) * 0.5 - draw_circle(center, radius, BUBBLE_COLOR) + var icon_size := Vector2.ONE * minf(size.x, size.y) + var icon_rect := Rect2((size - icon_size) * 0.5, icon_size) + draw_texture_rect(_get_weather_texture(), icon_rect, false) + + +func _get_weather_texture() -> Texture2D: match _weather: WorldWeatherService.Weather.SUNNY: - if _is_nighttime: - _draw_moon(center) - else: - _draw_sun(center) + return CLEAR_NIGHT_TEXTURE if _is_nighttime else CLEAR_DAY_TEXTURE WorldWeatherService.Weather.CLOUDY: - _draw_cloud(center + Vector2(0.0, 1.0)) + return CLOUDY_TEXTURE WorldWeatherService.Weather.RAINY: - _draw_cloud(center + Vector2(0.0, -2.0)) - for x_offset: float in PackedFloat32Array([-6.0, 0.0, 6.0]): - draw_line( - center + Vector2(x_offset + 1.0, 5.0), - center + Vector2(x_offset - 1.0, 9.0), - RAIN_COLOR, - 2.0, - true, - ) + return RAIN_TEXTURE WorldWeatherService.Weather.FOGGY: - for y_offset: float in PackedFloat32Array([-6.0, 0.0, 6.0]): - draw_line( - center + Vector2(-9.0, y_offset), - center + Vector2(9.0, y_offset), - ICON_COLOR, - 2.0, - true, - ) - - -func _draw_sun(center: Vector2) -> void: - draw_circle(center, 5.0, SUN_COLOR) - for index: int in 8: - var angle: float = TAU * float(index) / 8.0 - var direction := Vector2(cos(angle), sin(angle)) - draw_line( - center + direction * 8.0, - center + direction * 11.0, - SUN_COLOR, - 2.0, - true, - ) - - -func _draw_moon(center: Vector2) -> void: - draw_circle(center, 8.0, MOON_COLOR) - draw_circle(center + Vector2(4.0, -2.0), 7.0, BUBBLE_COLOR) + return FOG_TEXTURE + return CLEAR_DAY_TEXTURE func _update_tooltip() -> void: @@ -101,10 +79,3 @@ func _update_tooltip() -> void: if _weather == WorldWeatherService.Weather.SUNNY else WorldWeatherService.weather_name(_weather) ) - - -func _draw_cloud(center: Vector2) -> void: - draw_circle(center + Vector2(-5.0, 0.0), 5.0, ICON_COLOR) - draw_circle(center + Vector2(0.0, -3.0), 6.0, ICON_COLOR) - draw_circle(center + Vector2(6.0, 0.0), 5.0, ICON_COLOR) - draw_rect(Rect2(center + Vector2(-9.0, 0.0), Vector2(18.0, 5.0)), ICON_COLOR) diff --git a/world/world_time_service.gd b/world/world_time_service.gd index 1285f3e..c3186b4 100644 --- a/world/world_time_service.gd +++ b/world/world_time_service.gd @@ -3,6 +3,8 @@ extends Node signal time_changed(time_hours: float, phase: Phase) signal phase_changed(phase: Phase) +signal authoritative_time_set(time_hours: float) +signal natural_time_advanced(hours: float) enum Phase { DAWN, @@ -54,10 +56,12 @@ func end_session() -> void: func advance_time(real_seconds: float) -> void: if not _running or real_seconds <= 0.0: return + var advanced_hours := real_seconds * HOURS_PER_REAL_SECOND _set_time_hours( - _time_hours + real_seconds * HOURS_PER_REAL_SECOND, + _time_hours + advanced_hours, false, ) + natural_time_advanced.emit(advanced_hours) func synchronize_time(authoritative_time_hours: float) -> void: @@ -66,6 +70,18 @@ func synchronize_time(authoritative_time_hours: float) -> void: _set_time_hours(authoritative_time_hours, true) +func set_authoritative_time(time_hours: float) -> bool: + if ( + not is_finite(time_hours) + or time_hours < 0.0 + or time_hours >= HOURS_PER_DAY + ): + return false + _set_time_hours(time_hours, true) + authoritative_time_set.emit(_time_hours) + return true + + func set_persistence_tracking_enabled(enabled: bool) -> void: if _persistence_tracking_enabled == enabled: return