Some checks failed
Godot CI / Import + smoke test (push) Failing after 34s
ФИКС АКТА 2 (главный баг):
- CenterContainer/WelcomeScreen/FourSquares имели
anchor_right=1.0 + offset_right=640 → элементы уезжали
ЗА пределы экрана (далеко на восток). Установочное окно
было невидно. Заменил на anchors_preset=15 (full rect)
без offset, теперь Center правильно центрирует Window.
- PanelContainer без StyleBox = прозрачный. Добавлены 3
StyleBoxFlat (style_window — основное окно с рамкой,
style_titlebar — тёмный header с жёлтым заголовком,
style_panel — для вложенных панелей). Окно установки
теперь видимо как настоящее Шиндовс-окно.
- Body теперь без scroll_active (fit_content), Buttons
с min_size 110×28 — кнопки чётко видны.
ОТЕЦ:
- Шёл на ЗАПАД (position.x - 2.5 = -0.8) в стену, а дверь
на ВОСТОКЕ. Меняю на +1.0 (восток к двери при x=2.05).
- _walk_father_out: сначала поворот корпуса 0.3 сек к двери
(rotation:y = -PI/2), потом 1.4 сек шагание:
* движение position:x на восток
* абс(sin) bob тела на 0.04м (4 шага)
* sin качание ног (LegL/LegR) и рук (ArmL/ArmR) в
противофазе с амплитудой 0.4/0.24 радиан
- Теперь отец действительно идёт к двери с шагающей походкой.
ГЛАВНОЕ МЕНЮ (чего не хватало):
- scenes/main_menu.tscn: тёмный фон с виньетками, заголовок
жёлтым акцентом, 4 кнопки (Новая игра / Продолжить /
Настройки / Выйти), StyleBoxFlat для кнопок.
- main_menu.gd: ESC = Quit, кнопка «Новая игра» →
SceneManager.go_room(), GameState.reset() при входе в меню.
- project.godot main_scene = main_menu.tscn (было act1_room).
- SceneManager + go_main() метод.
HUD UX:
- set_date_time("","") теперь прячет лейбл (раньше показывал
"· "). В меню HUD скрыт полностью.
- В Акте 1 и кухне при _ready восстанавливается crosshair +
controls_hint (которые меню скрывает).
ЧЕГО ВСЁ ЕЩЁ НЕ ХВАТАЕТ (для следующих сессий):
- Звуки/SFX (шаги, клики, sfxr-эффекты, дверь)
- Pause-меню по ESC во время геймплея
- Save/load система (сейчас всё сбрасывается)
- Анимация перехода между сценами (fade-in/out)
- Реальные ассеты (CC0 модели мебели/персонажей)
- Музыка/амбиент (CC0 трек комнаты)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
144 lines
3.6 KiB
GDScript
144 lines
3.6 KiB
GDScript
extends CanvasLayer
|
|
|
|
signal advanced
|
|
|
|
@onready var subtitle_panel: PanelContainer = $SubtitlePanel
|
|
@onready var who_label: Label = $SubtitlePanel/V/Who
|
|
@onready var text_label: RichTextLabel = $SubtitlePanel/V/Text
|
|
@onready var hint_label: Label = $SubtitlePanel/V/Hint
|
|
|
|
@onready var note_overlay: Control = $NoteOverlay
|
|
@onready var note_text: RichTextLabel = $NoteOverlay/Center/P/V2/Text
|
|
|
|
@onready var prompt_label: Label = $PromptLabel
|
|
@onready var controls_hint: Label = $ControlsHint
|
|
@onready var crosshair: Control = $Crosshair
|
|
|
|
@onready var date_time_label: Label = $DateTimeLabel
|
|
@onready var objective_label: Label = $ObjectiveLabel
|
|
@onready var money_label: Label = $MoneyLabel
|
|
@onready var weather_label: Label = $WeatherLabel
|
|
@onready var stats_label: Label = $StatsLabel
|
|
|
|
var _waiting: bool = false
|
|
|
|
|
|
func _ready() -> void:
|
|
subtitle_panel.visible = false
|
|
note_overlay.visible = false
|
|
prompt_label.visible = false
|
|
objective_label.visible = false
|
|
money_label.visible = false
|
|
weather_label.visible = false
|
|
stats_label.visible = false
|
|
crosshair.visible = true
|
|
|
|
|
|
func set_crosshair_visible(v: bool) -> void:
|
|
crosshair.visible = v
|
|
|
|
|
|
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_date_time(date: String, time: String) -> void:
|
|
if date == "" and time == "":
|
|
date_time_label.visible = false
|
|
return
|
|
date_time_label.text = "%s · %s" % [date, time]
|
|
date_time_label.visible = true
|
|
|
|
|
|
func set_objective(text: String) -> void:
|
|
if text == "":
|
|
objective_label.visible = false
|
|
return
|
|
objective_label.text = "◆ " + text
|
|
objective_label.visible = true
|
|
|
|
|
|
func set_money(rub: int, usd: float = 0.0, eur: float = 0.0) -> void:
|
|
if rub == 0 and usd == 0.0 and eur == 0.0:
|
|
money_label.visible = false
|
|
return
|
|
var parts: Array[String] = ["₽ %d" % rub]
|
|
if usd > 0.0:
|
|
parts.append("$ %.2f" % usd)
|
|
if eur > 0.0:
|
|
parts.append("€ %.2f" % eur)
|
|
money_label.text = " ".join(parts)
|
|
money_label.visible = true
|
|
|
|
|
|
func set_weather(text: String, temp_c: int = -999) -> void:
|
|
if text == "":
|
|
weather_label.visible = false
|
|
return
|
|
if temp_c == -999:
|
|
weather_label.text = text
|
|
else:
|
|
weather_label.text = "%s %+d°C" % [text, temp_c]
|
|
weather_label.visible = true
|
|
|
|
|
|
func set_stat_alert(text: String) -> void:
|
|
if text == "":
|
|
stats_label.visible = false
|
|
return
|
|
stats_label.text = text
|
|
stats_label.visible = true
|
|
|
|
|
|
func set_controls_hint(text: String) -> void:
|
|
if text == "":
|
|
controls_hint.visible = false
|
|
return
|
|
controls_hint.text = text
|
|
controls_hint.visible = true
|
|
|
|
|
|
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()
|