act1: FPV-комната с подарком, запиской и флешкой
Some checks failed
Godot CI / Import + smoke test (push) Failing after 19s
Some checks failed
Godot CI / Import + smoke test (push) Failing after 19s
3D-сцена 4×4м: стены/пол/потолок, окно (свечение), дверь, стол с пека, кровать с одеялом, подарок-коробка на полу, отец-NPC в дверях. Архитектура: - FPVController (CharacterBody3D + Camera3D + RayCast3D) — mouse look, WASD, raycast-pickup, lock_input для катсцен. - Interactable (StaticBody3D base) — toggle через collision_layer. - DialogManager (autoload CanvasLayer) — субтитры snake-case, fullscreen записка, HUD-подсказки, prompt над крестом, await через signal. - act1.gd — state machine: INTRO → EXPLORE_GIFT → INSIDE_GIFT → NOTE_READ → FATHER_FAREWELL (tween x-2.5) → SEEK_DRIVE → ENDING. Канон-реплики из Пролог_Первый_день.md без правок: - Отец intro + про флешку с Шиндой - Записка «Не сожги. Пароль от Wi-Fi на холодильнике. — Бать» - Мысли героя: «новый пека?», «бать ну ты красавчик», «Андрюхино так Андрюхино» GL Compatibility renderer, unshaded материалы плоскими цветами под pixel-art 640×360. Тестировано на RTX 5070 — стартует без ошибок. main.tscn placeholder удалён, main_scene = act1_room.tscn. Не покрыто в MVP (TBD): - Опц. выход на кухню → холодильник → Wi-Fi пароль - Mastermind hack-mini-game для подбора Wi-Fi - Sfxr звуки (открытие коробки, шаги) - Переход в Акт 2 (пока quit на финале) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
d1c28d088b
commit
d1b3afd006
15 changed files with 733 additions and 50 deletions
78
scripts/ui/dialog_manager.gd
Normal file
78
scripts/ui/dialog_manager.gd
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
extends CanvasLayer
|
||||
|
||||
signal advanced
|
||||
|
||||
@onready var subtitle_panel: PanelContainer = $SubtitlePanel
|
||||
@onready var who_label: Label = $SubtitlePanel/V/Who
|
||||
@onready var text_label: Label = $SubtitlePanel/V/Text
|
||||
@onready var hint_label: Label = $SubtitlePanel/V/Hint
|
||||
|
||||
@onready var note_overlay: Control = $NoteOverlay
|
||||
@onready var note_text: Label = $NoteOverlay/Center/P/V2/Text
|
||||
|
||||
@onready var prompt_label: Label = $PromptLabel
|
||||
@onready var hud_label: Label = $HudLabel
|
||||
|
||||
var _waiting: bool = false
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
subtitle_panel.visible = false
|
||||
note_overlay.visible = false
|
||||
prompt_label.visible = false
|
||||
hud_label.visible = false
|
||||
|
||||
|
||||
func say(who: String, line: String) -> Signal:
|
||||
who_label.text = "[%s]" % who
|
||||
text_label.text = line
|
||||
hint_label.text = "ЛКМ или ПРОБЕЛ — дальше"
|
||||
subtitle_panel.visible = true
|
||||
note_overlay.visible = false
|
||||
_waiting = true
|
||||
return advanced
|
||||
|
||||
|
||||
func think(line: String) -> Signal:
|
||||
return say("Я", line)
|
||||
|
||||
|
||||
func show_note(text: String) -> Signal:
|
||||
note_text.text = text
|
||||
note_overlay.visible = true
|
||||
subtitle_panel.visible = false
|
||||
_waiting = true
|
||||
return advanced
|
||||
|
||||
|
||||
func set_prompt(text: String) -> void:
|
||||
if text == "":
|
||||
prompt_label.visible = false
|
||||
return
|
||||
prompt_label.text = "[ЛКМ] %s" % text
|
||||
prompt_label.visible = true
|
||||
|
||||
|
||||
func clear_prompt() -> void:
|
||||
prompt_label.visible = false
|
||||
|
||||
|
||||
func set_hud(text: String) -> void:
|
||||
hud_label.text = text
|
||||
hud_label.visible = text != ""
|
||||
|
||||
|
||||
func _input(event: InputEvent) -> void:
|
||||
if not _waiting:
|
||||
return
|
||||
var advance: bool = false
|
||||
if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
|
||||
advance = true
|
||||
elif event is InputEventKey and event.pressed and (event.keycode == KEY_SPACE or event.keycode == KEY_ENTER):
|
||||
advance = true
|
||||
if advance:
|
||||
get_viewport().set_input_as_handled()
|
||||
subtitle_panel.visible = false
|
||||
note_overlay.visible = false
|
||||
_waiting = false
|
||||
advanced.emit()
|
||||
1
scripts/ui/dialog_manager.gd.uid
Normal file
1
scripts/ui/dialog_manager.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://eb6vorv2mguj
|
||||
Loading…
Add table
Add a link
Reference in a new issue