act1: аутентичная страна Р — комната, HUD, канон
Some checks failed
Godot CI / Import + smoke test (push) Failing after 13s

КАНОН (3 новых файла, ресёрч-агент):
- APARTMENT.md: брежневка Купчино 9-эт, комната 10-12м², обои бежевые
  виниловые с растительным узором (наследие маминого ремонта 2010),
  линолеум жёлто-коричневый, ковёр бордовый персидский над кроватью
  (наследство от бабушки), батарея чугунная МС-140 белая с подтёками,
  пластиковый стеклопакет с алоэ+чашкой на подоконнике, кровать с тёмно-
  синим верблюжьим одеялом, стол ИКЕА MICKE, старый офисный «Бюрократ»,
  стеллаж ИКЕА BILLY с учебниками + Гарри Поттер + УК РФ (засев #8),
  постеры CS:GO + Моргенштерн на синей изоленте, банка Adrenaline +
  обёртка Lay's на столе, носки на полу. Все цвета по hex.

- STREET.md: парадная с домофоном Eltis DP-400 (питерский производитель),
  фасад керамической плитки бежевой, балконы остеклены лоскутно, на 1
  этаже Пятёрочка+К&Б, двор с тополями+ракушками-гаражами+советской
  площадкой (горка-«ракета»), лавочки бабушек/подростков, метро жетон 55₽
  август 2020, шаверма 120-180₽ (источник прямой не подтверждён, оценка
  по контексту), сети Pita's/Вкусная шаверма/КручуВерчу.

- HUD.md: pixel-art минимализм с акцентом #F0B419 Steam-inventory,
  Pathologic-2 правило (статы только при пороге), диалог-окно в стиле
  Шиндовс-окна (засев бренда), квест-маркер через ТГ-телефон героя,
  без мини-карты и постоянных таймеров.

КОД:
- act1_room.tscn полностью переписан: 73 sub_resources placeholder-кубов
  с канон-цветами hex. Добавлены: радиатор под окном, оконная рама из 5
  планок + подоконник с алоэ+чашкой, ковёр-на-стене над кроватью
  (бордовый), 2 постера (CS:GO жёлтый + Моргенштерн красный), стеллаж
  ИКЕА BILLY на западной стене с 5 книгами, старый Pentium 4 в углу
  северо-востока, банка Adrenaline + обёртка Lay's + клавиатура на столе,
  2 носка на полу. Спавн игрока сдвинут с z=1.2 на z=0.5 (был внутри
  кровати).

- dialog_manager.gd: новый HUD-API set_date_time / set_objective /
  set_money / set_weather / set_stat_alert + set_controls_hint.

- dialog_ui.tscn: 5 новых HUD-лейблов (DateTime, Objective с жёлтым
  акцентом, Money, Weather, StatsAlert) + ControlsHint всегда видимый
  тусклый.

- act1.gd: HUD теперь показывает «21 АВГ 2020 · ПТ · 10:30» вверху-слева
  и квест «◆ Распакуй подарок от бати» → «◆ Прочитай записку» →
  «◆ Возьми флешку с Шиндовс» вверху-справа.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dmitrii Bykov 2026-05-24 17:38:07 +03:00
parent 3975a28ed1
commit b833127bcc
8 changed files with 826 additions and 33 deletions

View file

@ -21,7 +21,8 @@ func _ready() -> void:
player.interactable_focused.connect(_on_player_focused)
player.interactable_unfocused.connect(_on_player_unfocused)
DialogManager.set_hud("Акт 1 — Подарок · WASD ходить · мышь смотреть · ЛКМ взаимодействие · ESC мышь · Q выход")
DialogManager.set_date_time("21 АВГ 2020 · ПТ", "10:30")
DialogManager.set_objective("Распакуй подарок от бати")
await get_tree().create_timer(0.8).timeout
await DialogManager.say("ОТЕЦ", "Ну? Чё стоишь. Распаковывай давай. Сам собирал, между прочим — полночи не спал.")
@ -51,6 +52,7 @@ func _on_gift_interacted(_p: Node) -> void:
note.visible = true
note.set_interactable(true)
DialogManager.clear_prompt()
DialogManager.set_objective("Прочитай записку")
func _on_note_interacted(_p: Node) -> void:
@ -74,6 +76,7 @@ func _on_note_interacted(_p: Node) -> void:
state = State.SEEK_DRIVE
flash_drive.set_interactable(true)
DialogManager.set_objective("Возьми флешку с Шиндовс")
player.unlock_input()
@ -84,6 +87,7 @@ func _on_drive_interacted(_p: Node) -> void:
flash_drive.set_interactable(false)
player.lock_input()
DialogManager.clear_prompt()
DialogManager.set_objective("")
await DialogManager.think("Ну ладно. Андрюхино так Андрюхино. Поехали.")
await DialogManager.say("СИСТЕМА", "Конец Акта 1. Акт 2 — Установка Шиндовс (TBD).")

View file

@ -11,7 +11,13 @@ signal advanced
@onready var note_text: Label = $NoteOverlay/Center/P/V2/Text
@onready var prompt_label: Label = $PromptLabel
@onready var hud_label: Label = $HudLabel
@onready var controls_hint: Label = $ControlsHint
@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
@ -20,7 +26,11 @@ func _ready() -> void:
subtitle_panel.visible = false
note_overlay.visible = false
prompt_label.visible = false
hud_label.visible = false
objective_label.visible = false
money_label.visible = false
weather_label.visible = false
stats_label.visible = false
# ControlsHint всегда виден, не блокирует игру
func say(who: String, line: String) -> Signal:
@ -57,9 +67,56 @@ func clear_prompt() -> void:
prompt_label.visible = false
func set_hud(text: String) -> void:
hud_label.text = text
hud_label.visible = text != ""
func set_date_time(date: String, time: String) -> void:
date_time_label.text = "%s · %s" % [date, time]
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: