From 147eba9421a8c932e2dc8e1eda3ff65123af6595 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sat, 20 Jun 2026 14:37:10 +0900 Subject: [PATCH] Add fullscreen display setting --- scripts/scenes/battle_scene.gd | 80 ++++++++++++++++++++++++++++++---- tools/smoke_title_menu.gd | 24 +++++++--- 2 files changed, 91 insertions(+), 13 deletions(-) diff --git a/scripts/scenes/battle_scene.gd b/scripts/scenes/battle_scene.gd index aff8f15..eebac9e 100644 --- a/scripts/scenes/battle_scene.gd +++ b/scripts/scenes/battle_scene.gd @@ -210,7 +210,7 @@ const BATTLE_UNIT_LIST_CLASS_CREST_ICON_SIZE := Vector2(17, 17) const BATTLE_UNIT_LIST_BADGE_SIZE := Vector2(72, 22) const BATTLE_UNIT_LIST_BADGE_ICON_SIZE := Vector2(15, 15) const BATTLE_UNIT_LIST_HP_BAR_SIZE := Vector2(40, 7) -const SETTINGS_PANEL_SIZE := Vector2(420, 330) +const SETTINGS_PANEL_SIZE := Vector2(420, 368) const LOCAL_COMMAND_BUTTON_SIZE := Vector2(92, 38) const LOCAL_COMMAND_CANCEL_BUTTON_SIZE := Vector2(196, 30) const LOCAL_COMMAND_HEADER_ICON_SIZE := Vector2(24, 24) @@ -587,6 +587,7 @@ var settings_panel: PanelContainer var settings_bgm_toggle: CheckButton var settings_sfx_toggle: CheckButton var settings_edge_scroll_toggle: CheckButton +var settings_fullscreen_toggle: CheckButton var settings_bgm_volume_slider: HSlider var settings_sfx_volume_slider: HSlider var settings_bgm_volume_value_label: Label @@ -623,6 +624,7 @@ var title_settings_panel: PanelContainer var title_bgm_toggle: CheckButton var title_sfx_toggle: CheckButton var title_edge_scroll_toggle: CheckButton +var title_fullscreen_toggle: CheckButton var title_bgm_volume_slider: HSlider var title_sfx_volume_slider: HSlider var title_bgm_volume_value_label: Label @@ -633,6 +635,7 @@ var title_screen_visible := false var title_bgm_enabled := true var title_sfx_enabled := true var title_edge_scroll_enabled := true +var title_fullscreen_enabled := false var title_bgm_volume_percent := DEFAULT_AUDIO_VOLUME_PERCENT var title_sfx_volume_percent := DEFAULT_AUDIO_VOLUME_PERCENT var log_box: RichTextLabel @@ -665,7 +668,9 @@ var unit_idle_time := 0.0 func _ready() -> void: texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR + title_fullscreen_enabled = _is_current_window_fullscreen() _load_title_settings() + _apply_window_mode_settings() _create_hud() _create_audio() state.changed.connect(_on_state_changed) @@ -3257,6 +3262,13 @@ func _create_hud() -> void: settings_edge_scroll_toggle.toggled.connect(_on_settings_edge_scroll_toggled) settings_column.add_child(settings_edge_scroll_toggle) + settings_fullscreen_toggle = CheckButton.new() + settings_fullscreen_toggle.text = "전체화면" + settings_fullscreen_toggle.custom_minimum_size = Vector2(374, 30) + settings_fullscreen_toggle.tooltip_text = "QHD 화면에서 전장을 꽉 채워 표시합니다. 버튼과 패널은 같은 비율로 유지됩니다." + settings_fullscreen_toggle.toggled.connect(_on_settings_fullscreen_toggled) + settings_column.add_child(settings_fullscreen_toggle) + objective_notice_panel = PanelContainer.new() objective_notice_panel.visible = false objective_notice_panel.position = Vector2(338, 88) @@ -4498,8 +4510,8 @@ func _create_hud() -> void: title_menu_surface_texture_rect = TextureRect.new() title_menu_surface_texture_rect.name = "TitleGeneratedCommandBoard" title_menu_surface_texture_rect.position = Vector2(28, 32) - title_menu_surface_texture_rect.size = Vector2(520, 586) - title_menu_surface_texture_rect.custom_minimum_size = Vector2(520, 586) + title_menu_surface_texture_rect.size = Vector2(520, 626) + title_menu_surface_texture_rect.custom_minimum_size = Vector2(520, 626) title_menu_surface_texture_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE title_menu_surface_texture_rect.expand_mode = TextureRect.EXPAND_IGNORE_SIZE title_menu_surface_texture_rect.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_COVERED @@ -4542,8 +4554,8 @@ func _create_hud() -> void: title_panel = PanelContainer.new() title_panel.name = "TitleMenuPanel" title_panel.position = Vector2(58, 78) - title_panel.size = Vector2(462, 486) - title_panel.custom_minimum_size = Vector2(462, 486) + title_panel.size = Vector2(462, 526) + title_panel.custom_minimum_size = Vector2(462, 526) _apply_panel_style(title_panel, "transparent_overlay") title_screen_root.add_child(title_panel) @@ -4573,7 +4585,7 @@ func _create_hud() -> void: title_column.add_child(title_subtitle_label) var title_body_panel := PanelContainer.new() - title_body_panel.custom_minimum_size = Vector2(430, 330) + title_body_panel.custom_minimum_size = Vector2(430, 370) _apply_panel_style(title_body_panel, "command_seal") title_column.add_child(title_body_panel) @@ -4685,7 +4697,7 @@ func _create_hud() -> void: title_settings_panel = PanelContainer.new() title_settings_panel.visible = false - title_settings_panel.custom_minimum_size = Vector2(390, 276) + title_settings_panel.custom_minimum_size = Vector2(390, 314) _apply_panel_style(title_settings_panel, "hud_info") title_menu_column.add_child(title_settings_panel) @@ -4797,6 +4809,14 @@ func _create_hud() -> void: title_edge_scroll_toggle.toggled.connect(_on_title_edge_scroll_toggled) title_settings_column.add_child(title_edge_scroll_toggle) + title_fullscreen_toggle = CheckButton.new() + title_fullscreen_toggle.text = "전체화면" + title_fullscreen_toggle.custom_minimum_size = Vector2(350, 30) + title_fullscreen_toggle.button_pressed = title_fullscreen_enabled + title_fullscreen_toggle.tooltip_text = "QHD 화면에서 전장을 꽉 채워 표시합니다. 버튼과 패널은 같은 비율로 유지됩니다." + title_fullscreen_toggle.toggled.connect(_on_title_fullscreen_toggled) + title_settings_column.add_child(title_fullscreen_toggle) + title_settings_back_button = Button.new() _configure_title_menu_button( title_settings_back_button, @@ -4868,9 +4888,11 @@ func _create_hud() -> void: _apply_button_style(title_bgm_toggle) _apply_button_style(title_sfx_toggle) _apply_button_style(title_edge_scroll_toggle) + _apply_button_style(title_fullscreen_toggle) _apply_button_style(settings_bgm_toggle) _apply_button_style(settings_sfx_toggle) _apply_button_style(settings_edge_scroll_toggle) + _apply_button_style(settings_fullscreen_toggle) _apply_button_style(briefing_start_button, true) @@ -4883,6 +4905,29 @@ func _create_audio() -> void: _apply_audio_settings() +func _window_backend_allows_mode_changes() -> bool: + return DisplayServer.get_name().to_lower() != "headless" + + +func _is_current_window_fullscreen() -> bool: + if not _window_backend_allows_mode_changes(): + return false + var current_mode := DisplayServer.window_get_mode() + return current_mode == DisplayServer.WINDOW_MODE_FULLSCREEN or current_mode == DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN + + +func _window_mode_for_fullscreen(enabled: bool) -> int: + return DisplayServer.WINDOW_MODE_FULLSCREEN if enabled else DisplayServer.WINDOW_MODE_WINDOWED + + +func _apply_window_mode_settings() -> void: + if not _window_backend_allows_mode_changes(): + return + var target_mode := _window_mode_for_fullscreen(title_fullscreen_enabled) + if DisplayServer.window_get_mode() != target_mode: + DisplayServer.window_set_mode(target_mode) + + func _load_title_settings() -> void: if not FileAccess.file_exists(SETTINGS_PATH): return @@ -4892,6 +4937,7 @@ func _load_title_settings() -> void: title_bgm_enabled = bool(parsed.get("bgm_enabled", title_bgm_enabled)) title_sfx_enabled = bool(parsed.get("sfx_enabled", title_sfx_enabled)) title_edge_scroll_enabled = bool(parsed.get("edge_scroll_enabled", title_edge_scroll_enabled)) + title_fullscreen_enabled = bool(parsed.get("fullscreen_enabled", title_fullscreen_enabled)) title_bgm_volume_percent = _clamp_volume_percent(parsed.get("bgm_volume_percent", title_bgm_volume_percent)) title_sfx_volume_percent = _clamp_volume_percent(parsed.get("sfx_volume_percent", title_sfx_volume_percent)) @@ -4907,7 +4953,8 @@ func _save_title_settings() -> bool: "bgm_volume_percent": title_bgm_volume_percent, "sfx_enabled": title_sfx_enabled, "sfx_volume_percent": title_sfx_volume_percent, - "edge_scroll_enabled": title_edge_scroll_enabled + "edge_scroll_enabled": title_edge_scroll_enabled, + "fullscreen_enabled": title_fullscreen_enabled } file.store_string(JSON.stringify(payload, "\t")) return true @@ -4946,6 +4993,10 @@ func _refresh_title_volume_controls() -> void: settings_sfx_toggle.set_pressed_no_signal(title_sfx_enabled) if settings_edge_scroll_toggle != null: settings_edge_scroll_toggle.set_pressed_no_signal(title_edge_scroll_enabled) + if settings_fullscreen_toggle != null: + settings_fullscreen_toggle.set_pressed_no_signal(title_fullscreen_enabled) + if title_fullscreen_toggle != null: + title_fullscreen_toggle.set_pressed_no_signal(title_fullscreen_enabled) if title_bgm_volume_slider != null: title_bgm_volume_slider.set_value_no_signal(float(title_bgm_volume_percent)) title_bgm_volume_slider.editable = title_bgm_enabled @@ -13557,6 +13608,10 @@ func _on_settings_edge_scroll_toggled(enabled: bool) -> void: _on_title_edge_scroll_toggled(enabled) +func _on_settings_fullscreen_toggled(enabled: bool) -> void: + _on_title_fullscreen_toggled(enabled) + + func _on_settings_bgm_volume_changed(value: float) -> void: _on_title_bgm_volume_changed(value) @@ -14158,6 +14213,8 @@ func _update_title_menu_state() -> void: title_sfx_toggle.set_pressed_no_signal(title_sfx_enabled) if title_edge_scroll_toggle != null: title_edge_scroll_toggle.set_pressed_no_signal(title_edge_scroll_enabled) + if title_fullscreen_toggle != null: + title_fullscreen_toggle.set_pressed_no_signal(title_fullscreen_enabled) _refresh_title_volume_controls() @@ -14370,6 +14427,13 @@ func _on_title_edge_scroll_toggled(enabled: bool) -> void: queue_redraw() +func _on_title_fullscreen_toggled(enabled: bool) -> void: + title_fullscreen_enabled = enabled + _apply_window_mode_settings() + _save_title_settings() + _update_title_menu_state() + + func _on_title_bgm_volume_changed(value: float) -> void: title_bgm_volume_percent = _clamp_volume_percent(value) _apply_audio_settings() diff --git a/tools/smoke_title_menu.gd b/tools/smoke_title_menu.gd index 43a027e..53a924c 100644 --- a/tools/smoke_title_menu.gd +++ b/tools/smoke_title_menu.gd @@ -169,13 +169,15 @@ func _check_title_menu_start_load_and_settings(failures: Array[String]) -> void: failures.append("title settings panel should open from the title screen") if scene.title_start_button != null and scene.title_start_button.visible: failures.append("title settings should replace the main title commands while open") - if scene.title_bgm_toggle == null or scene.title_sfx_toggle == null or scene.title_edge_scroll_toggle == null: - failures.append("title settings should expose BGM, SFX, and edge-scroll toggles") + if scene.title_bgm_toggle == null or scene.title_sfx_toggle == null or scene.title_edge_scroll_toggle == null or scene.title_fullscreen_toggle == null: + failures.append("title settings should expose BGM, SFX, edge-scroll, and fullscreen toggles") else: if not scene.title_bgm_toggle.text.contains("군막의 새벽"): failures.append("title BGM toggle should name the active menu theme") if not scene.title_sfx_toggle.text.contains("클릭") or not scene.title_sfx_toggle.text.contains("발소리") or not scene.title_sfx_toggle.text.contains("전투"): failures.append("title SFX toggle should clarify menu, movement, and battle effects") + if not scene.title_fullscreen_toggle.text.contains("전체화면"): + failures.append("title fullscreen toggle should be clearly named") if scene.title_bgm_volume_slider == null or scene.title_sfx_volume_slider == null: failures.append("title settings should expose BGM and SFX volume sliders") scene._on_title_bgm_toggled(false) @@ -195,10 +197,19 @@ func _check_title_menu_start_load_and_settings(failures: Array[String]) -> void: failures.append("edge-scroll toggle should disable edge scrolling") if scene._update_edge_scroll(0.25): failures.append("edge scrolling should not move while disabled in settings") + scene._on_title_fullscreen_toggled(true) + if not scene.title_fullscreen_enabled: + failures.append("fullscreen toggle should enable fullscreen state") + if scene._window_mode_for_fullscreen(false) != DisplayServer.WINDOW_MODE_WINDOWED: + failures.append("windowed display mode should map to Godot's windowed mode") + if scene._window_mode_for_fullscreen(true) != DisplayServer.WINDOW_MODE_FULLSCREEN: + failures.append("fullscreen display mode should map to Godot's fullscreen mode") var persisted_scene = BattleSceneScript.new() persisted_scene._ready() if persisted_scene.title_bgm_enabled or persisted_scene.title_sfx_enabled or persisted_scene.title_edge_scroll_enabled: failures.append("title settings toggles should persist into a new scene instance") + if not persisted_scene.title_fullscreen_enabled: + failures.append("fullscreen setting should persist into a new scene instance") if persisted_scene.title_bgm_volume_percent != 45 or persisted_scene.title_sfx_volume_percent != 35: failures.append("title settings volume values should persist into a new scene instance") persisted_scene.free() @@ -426,21 +437,24 @@ func _check_title_menu_start_load_and_settings(failures: Array[String]) -> void: scene._on_settings_pressed() if scene.settings_panel == null or not scene.settings_panel.visible: failures.append("top Settings icon should open the in-game settings panel") - if scene.settings_bgm_toggle == null or scene.settings_sfx_toggle == null or scene.settings_edge_scroll_toggle == null: - failures.append("in-game settings panel should expose BGM, SFX, and edge-scroll toggles") + if scene.settings_bgm_toggle == null or scene.settings_sfx_toggle == null or scene.settings_edge_scroll_toggle == null or scene.settings_fullscreen_toggle == null: + failures.append("in-game settings panel should expose BGM, SFX, edge-scroll, and fullscreen toggles") else: if not scene.settings_bgm_toggle.text.contains("군막") or not scene.settings_bgm_toggle.text.contains("전투"): failures.append("in-game BGM toggle should clarify menu and battle music") if not scene.settings_sfx_toggle.text.contains("선택") or not scene.settings_sfx_toggle.text.contains("발소리") or not scene.settings_sfx_toggle.text.contains("전투"): failures.append("in-game SFX toggle should clarify menu, movement, and battle effects") + if not scene.settings_fullscreen_toggle.text.contains("전체화면"): + failures.append("in-game fullscreen toggle should be clearly named") if scene.settings_bgm_volume_slider == null or scene.settings_sfx_volume_slider == null: failures.append("in-game settings panel should expose BGM and SFX volume sliders") scene._on_settings_bgm_toggled(true) scene._on_settings_sfx_toggled(true) scene._on_settings_edge_scroll_toggled(true) + scene._on_settings_fullscreen_toggled(true) scene._on_settings_bgm_volume_changed(70.0) scene._on_settings_sfx_volume_changed(60.0) - if not scene.title_bgm_enabled or not scene.title_sfx_enabled or not scene.title_edge_scroll_enabled: + if not scene.title_bgm_enabled or not scene.title_sfx_enabled or not scene.title_edge_scroll_enabled or not scene.title_fullscreen_enabled: failures.append("in-game settings toggles should update the shared settings state") if scene.title_bgm_volume_percent != 70 or scene.title_sfx_volume_percent != 60: failures.append("in-game settings sliders should update the shared volume state")