farming-simulator/scripts/prologue/act1_kitchen.gd
Dmitrii Bykov c3190ad058
Some checks failed
Godot CI / Import + smoke test (push) Failing after 29s
prologue: целиком Акт 1 (комната+кухня) + Акт 2 (установка)
ИНФРАСТРУКТУРА:
- GameState autoload: player_name, прогресс актов, ачивки.
- SceneManager autoload: change_scene с deferred переключением,
  shortcuts go_room/go_kitchen/go_install.
- TextureGen autoload: процедурные pixel-art ImageTexture через
  Image.set_pixel, кешируются в Dictionary. Текстуры: wallpaper
  (бежевая с растительным узором), linoleum (полосы паркета),
  ceiling (побелка с шумом), wall_carpet (бордовый с ромбами),
  blanket (тёмно-синее со звёздами), poster_csgo (жёлтый с
  силуэтом AWP), poster_morgen (тёмно-красный с головой),
  door (дерево с волокном), desk_white, book_color(0-4).

АКТ 1 КОМНАТА (act1_room.tscn / act1.gd):
- Все стены/пол/потолок/ковёр/одеяло/постеры/стол/дверь теперь
  с процедурными текстурами через TextureGen.apply_to_material с
  правильным uv1_scale. Texture filter NEAREST для пиксель-арта.
- Door interactable добавлен в east-wall (рядом с DoorPanel).
  Включается после ухода отца. Клик → переход на кухню.
- GameState persists прогресс — возврат из кухни не повторяет интро.
- _setup_post_intro_state восстанавливает SEEK_DRIVE после кухни.
- После подбора флешки — переход на act2_install.

АКТ 1 КУХНЯ (act1_kitchen.tscn / act1_kitchen.gd):
- 3×3м комнатка с холодильником «Атлант», плитой (4 ручки красные),
  столешницей+раковиной, чайником, столом+2 стула, окном+радиатором.
- Wi-Fi записка приклеена на холодильнике, читается → ачивка
  «Wi-Fi разведчик» + GameState.wifi_password_found = true.
- Дверь обратно в комнату — SceneManager.go_room().
- Текстуры через TextureGen.

АКТ 2 УСТАНОВКА ШИНДОВС (act2_install.tscn / act2_install.gd):
- Полная 2D-сцена с 7 шагами state machine:
  BOOT (4 квадратика логотипа 1.6 сек) → LICENSE_INTRO →
  LICENSE_FULL (по «Читать») → DISK → USERNAME → PASSWORD →
  TIMEZONE → INSTALLING (5 фаз прогресс-бара 3 сек) → COMPLETE.
- ШИЗО-пункты лицензионки: 7.3.2, 11.4, 12.1, 15.7, 18.0, 21.3,
  23.9, 27.1 (полный текст из канона Пролог Акт 2).
- Ввод имени с валидацией: 2-24 символа, regex буквы+цифры,
  ban-list титулов (повелитель/владыка/бог/лорд/царь) и мата.
- Подсказка-плейсхолдеры из канона: bossiara13, fr3sh_n3kit и т.п.
- Пароль с чекбоксом «Без пароля» + ачивки «Главное чтоб удобно»
  (123/qwerty/empty) и «Параноик» (12+ символов со спец).
- Часовой пояс OptionButton с 7 регионами страны Р, UTC+3 default.
- Welcome-экран после установки: «Добро пожаловать, {playerName}».
- Кнопка «Запустить стеме» — заглушка Акта 3.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:50:26 +03:00

63 lines
2.3 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends Node3D
@onready var player: FPVController = $PlayerFPV
@onready var fridge_note: Interactable = $Fridge/WiFiNote
@onready var door_back: Interactable = $WallS/DoorBack
func _ready() -> void:
_apply_textures()
player.interactable_focused.connect(_on_player_focused)
player.interactable_unfocused.connect(_on_player_unfocused)
if GameState.wifi_password_found:
fridge_note.set_interactable(false)
else:
fridge_note.set_interactable(true)
door_back.set_interactable(true)
DialogManager.set_date_time(GameState.game_date, GameState.game_time)
if GameState.wifi_password_found:
DialogManager.set_objective("Вернись в комнату — флешка ждёт")
else:
DialogManager.set_objective("Найди пароль Wi-Fi на холодильнике")
func _apply_textures() -> void:
var floor_mat: BaseMaterial3D = ($Floor/Mesh as MeshInstance3D).material_override
TextureGen.apply_to_material(floor_mat, TextureGen.linoleum(), Vector3(6, 6, 6))
var ceiling_mat: BaseMaterial3D = ($Ceiling/Mesh as MeshInstance3D).material_override
TextureGen.apply_to_material(ceiling_mat, TextureGen.ceiling(), Vector3(4, 4, 4))
for wall_path in ["WallN", "WallS", "WallE", "WallW"]:
var wall_node: Node = get_node(wall_path)
var wall_mat: BaseMaterial3D = (wall_node.get_node("Mesh") as MeshInstance3D).material_override
TextureGen.apply_to_material(wall_mat, TextureGen.wallpaper(), Vector3(6, 5, 6))
var door_panel_mat: BaseMaterial3D = ($WallS/DoorPanel as MeshInstance3D).material_override
TextureGen.apply_to_material(door_panel_mat, TextureGen.door(), Vector3(1, 1, 1))
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_note_interacted(_p: Node) -> void:
player.lock_input()
DialogManager.clear_prompt()
await DialogManager.show_note("«Wi-Fi: qwerty. Не парься.»\n— Бать")
fridge_note.set_interactable(false)
GameState.wifi_password_found = true
GameState.unlock_achievement("Wi-Fi разведчик")
DialogManager.set_objective("Вернись в комнату — флешка ждёт")
player.unlock_input()
func _on_door_back_interacted(_p: Node) -> void:
SceneManager.go_room()