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>
94 lines
3.2 KiB
GDScript
94 lines
3.2 KiB
GDScript
extends Node3D
|
||
|
||
@onready var player: FPVController = $PlayerFPV
|
||
@onready var gift_box: Interactable = $GiftBox
|
||
@onready var system_unit: Node3D = $SystemUnit
|
||
@onready var note: Interactable = $SystemUnit/Note
|
||
@onready var flash_drive: Interactable = $Desk/FlashDrive
|
||
@onready var father: Node3D = $FatherNPC
|
||
|
||
enum State { INTRO, EXPLORE_GIFT, INSIDE_GIFT, NOTE_READ, FATHER_FAREWELL, SEEK_DRIVE, ENDING }
|
||
var state: State = State.INTRO
|
||
|
||
|
||
func _ready() -> void:
|
||
system_unit.visible = false
|
||
note.visible = false
|
||
gift_box.set_interactable(false)
|
||
flash_drive.set_interactable(false)
|
||
|
||
player.lock_input()
|
||
player.interactable_focused.connect(_on_player_focused)
|
||
player.interactable_unfocused.connect(_on_player_unfocused)
|
||
|
||
DialogManager.set_date_time("21 АВГ 2020 · ПТ", "10:30")
|
||
DialogManager.set_objective("Распакуй подарок от бати")
|
||
|
||
await get_tree().create_timer(0.8).timeout
|
||
await DialogManager.say("ОТЕЦ", "Ну? Чё стоишь. Распаковывай давай. Сам собирал, между прочим — полночи не спал.")
|
||
await DialogManager.think("Так… новый пека? Серьёзно? После моего динозавра?")
|
||
|
||
state = State.EXPLORE_GIFT
|
||
gift_box.set_interactable(true)
|
||
player.unlock_input()
|
||
|
||
|
||
func _on_player_focused(obj: Node) -> void:
|
||
if obj.has_method("get_prompt"):
|
||
DialogManager.set_prompt(obj.get_prompt())
|
||
|
||
|
||
func _on_player_unfocused() -> void:
|
||
DialogManager.clear_prompt()
|
||
|
||
|
||
func _on_gift_interacted(_p: Node) -> void:
|
||
if state != State.EXPLORE_GIFT:
|
||
return
|
||
state = State.INSIDE_GIFT
|
||
gift_box.set_interactable(false)
|
||
gift_box.visible = false
|
||
system_unit.visible = true
|
||
note.visible = true
|
||
note.set_interactable(true)
|
||
DialogManager.clear_prompt()
|
||
DialogManager.set_objective("Прочитай записку")
|
||
|
||
|
||
func _on_note_interacted(_p: Node) -> void:
|
||
if state != State.INSIDE_GIFT:
|
||
return
|
||
state = State.NOTE_READ
|
||
note.set_interactable(false)
|
||
player.lock_input()
|
||
DialogManager.clear_prompt()
|
||
|
||
await DialogManager.show_note("«Не сожги. Пароль от Wi-Fi на холодильнике. — Бать»")
|
||
await DialogManager.think("Бать ну ты красавчик конечно.")
|
||
|
||
state = State.FATHER_FAREWELL
|
||
await DialogManager.say("ОТЕЦ", "Флешка с Шиндой на столе. Ставь сам, не маленький. Если запорешь — сам и переставляй.")
|
||
|
||
var tween: Tween = create_tween()
|
||
tween.tween_property(father, "position:x", father.position.x - 2.5, 0.8)
|
||
await tween.finished
|
||
father.visible = false
|
||
|
||
state = State.SEEK_DRIVE
|
||
flash_drive.set_interactable(true)
|
||
DialogManager.set_objective("Возьми флешку с Шиндовс")
|
||
player.unlock_input()
|
||
|
||
|
||
func _on_drive_interacted(_p: Node) -> void:
|
||
if state != State.SEEK_DRIVE:
|
||
return
|
||
state = State.ENDING
|
||
flash_drive.set_interactable(false)
|
||
player.lock_input()
|
||
DialogManager.clear_prompt()
|
||
DialogManager.set_objective("")
|
||
|
||
await DialogManager.think("Ну ладно. Андрюхино так Андрюхино. Поехали.")
|
||
await DialogManager.say("СИСТЕМА", "Конец Акта 1. Акт 2 — Установка Шиндовс (TBD).")
|
||
get_tree().quit()
|