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>
135 lines
3.4 KiB
GDScript
135 lines
3.4 KiB
GDScript
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 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
|
|
|
|
|
|
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
|
|
# ControlsHint всегда виден, не блокирует игру
|
|
|
|
|
|
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:
|
|
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:
|
|
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()
|