LAST SERVICE — игра на Kvas
Полная короткая игра в жанре психологического хоррора от первого лица, сделанная целиком на движке и его SDK: главное меню, настройки, сюжет с головоломками, преследование, сохранения, финал и титры. Папка — games/last_service.
Как запустить
- Скопировать ассеты (сторонние наборы со своими лицензиями в репозиторий не входят):
python tools/import_last_service.py- Открыть проект в редакторе и нажать Play — или собрать игру:
cargo run -p kvas_editor --release -- --build games/last_serviceГотовая игра — games/last_service/build/LastService.exe и game.pak.
Сцену можно пересоздать из кода: cargo run -p kvas_engine --example make_last_service.
Управление
| Клавиша | |
|---|---|
| WASD | ходьба, Shift — бег, C / Ctrl — присесть |
| Мышь | обзор |
| E | взять, использовать, удерживать — долгие действия |
| F | фонарь |
| J / Tab | журнал: задача, имена, прочитанные записки |
| Esc | пауза: сохранить, настройки, выход в меню |
Сюжет (без спойлеров финала)
14 ноября 1998 года. Лида приезжает в закрытую придорожную столовую «Перевал», где работала её мать. Свет горит, а мать отвечает из-за стойки голосом двадцативосьмилетней давности. Нужно накрыть стол для трёх пассажиров рейса 17, восстановить питание конторки, прочитать журнал и узнать имена тех, кого «не было».
Как устроена игра
- Скрипты на своих объектах (см. Архитектура скриптов):
PlayerController,Interactor,Inventory,RoomAcousticsна игроке;MouseLook,CameraFxна его камере;Flashlight;Doorна каждой двери;FlickerLightна лампах;Spinnerна вентиляторе кухни;MonsterAiна Счётчике (маршруты по графу проходов, зрение по конусу и лучу, слух при беге, поиск, открывает незапертые двери);GameDirectorна объекте «Game» (сюжет, замки дверей, сохранения, музыка, финал на рассвете);GameUIна «UI» (меню, настройки, журнал, щиток, HUD, субтитры, титры). - Мир — сцена из отдельных объектов, которые
tools/split_world_glb.pyвырезает из модели продакшена: объект на зону и материал, мебель поштучно (стулья развёрнуты к столам и толкаются). Каждая часть сталкивается по своим треугольникам (ShapeKind::Mesh), стулья — по выпуклой оболочке. Двери — модели на петлях, щели под потолком и в стенах закрыты, предметыI_*с зонами взаимодействия, свет с мерцанием, дождь и туман, лужи-декали, пространственные звуки; иконки инвентаря отрендерены из моделей предметов (make_item_icons). - Камера игрока с шейдерами: VHS, пульс страха (зависит от расстояния до Счётчика), «кровь» при поимке, PS1-дизеринг и туман воспоминаний.
- Звук: реверберация внутри здания и снаружи разная, раздельные громкости музыки и эффектов, шаги Счётчика — пространственные.
- Доступность: режим «без преследования», «меньше движения», выбор языка.
Автотест прохождения
cargo test -p kvas_engine --test last_service запускает игру без окна: скрипт сам проходит всю историю от меню до титров (scripts/src/autotest.rs) — встаёт у каждого предмета, поворачивается к нему, и тот же луч, что у игрока, должен найти предмет и предложить действие. Так ловятся перекрытые и недоступные предметы.