Skip to content

Latest commit

 

History

History
686 lines (538 loc) · 60.6 KB

File metadata and controls

686 lines (538 loc) · 60.6 KB

Pathologic 2005 — Внутриигровая консоль: справочник команд

Полный справочник по внутриигровой консоли Pathologic 2005, восстановленный из исходников SRC/PlagueCity.


1. Архитектура

Консоль состоит из двух слабо связанных частей.

1.1 UI-слой: CConsole

SRC/PlagueCity/Game/Game/Console.{h,cpp} — отрисовывает оверлей, обрабатывает ввод, поддерживает историю.

  • Переключается через Show() / Hide() (вызывается из CKeyProcessor / CGame).
  • По нажатию Enter введённая строка диспетчеризуется через IEngine::Execute(cmd).
  • Поддерживает историю команд (стрелки /), прокрутку лога (PgUp/PgDn), Backspace, обычный ASCII (32..126).
  • Когда bShowConsoleLog == true, до трёх недавних (не старше 5 секунд) неперекрытых сообщений отображаются даже при закрытой консоли.

1.2 Диспетчер: CEngine::Execute(pszCmd)

SRC/PlagueCity/Game/Engine/CEngine.cpp:550.

  1. Пропускаются ведущие пробелы; пустая строка игнорируется.
  2. Первый токен, отделённый пробелами, становится именем команды.
  3. Остаток (после разделяющих пробелов) — это строка параметров pszParms.
  4. Эхо полной строки попадает в лог через AddConsoleMessage.
  5. Команда итерирует по каждому зарегистрированному ICmdProcessor (порядок — set<ICmdProcessor*>, зависящий от адреса указателя). Побеждает первый процессор, чей Execute(pszCmd, pszParms, pLog) вернёт true.
  6. Если ни один процессор не распознал команду: "Command not recognized".

1.3 Интерфейс процессора: ICmdProcessor

SRC/PlagueCity/Engine/Core/ICmdProcessor.h:

class ICmdProcessor : public IGeneric {
public:
    virtual bool Execute(const char *pszCmd,
                         const char *pszParms,
                         IConsoleLog *pLog) = 0;
};

Регистрация через IEngine::RegisterCommandProcessor / UnregisterCommandProcessor.

Канал ответов — IConsoleLog (IConsoleLog.h):

Метод Назначение
AddConsoleMessageReply(s) Обычный ответ (белый).
AddConsoleMessageError(s) Сообщение об ошибке.
AddConsoleMessageICA() Сокращение от Invalid Command Arguments — выводит фиксированную строку ошибки разбора.

1.4 Парсер аргументов: CCmdParser

SRC/PlagueCity/Game/Common/CmdParser.{h,cpp} — потоковый токенизатор.

Все перегрузки возвращают bool (успех); позиция чтения сдвигается только при успехе:

CCmdParser p(pszParms);
p.HasMoreParameters();
p.GetNextParameter(bool          &v, bool bLast = false);
p.GetNextParameter(signed long   &v, bool bLast = false);
p.GetNextParameter(unsigned long &v, bool bLast = false);
p.GetNextParameter(float         &v, bool bLast = false);
p.GetNextParameter(CEString      &v, bool bLast = false);

Если bLast == true, вызов дополнительно требует, чтобы после прочитанного токена не оставалось больше токенов — иначе возвращается false. Это используется для строгой фиксации конца команды в командах с фиксированным числом аргументов.

Принимаемые формы токенов:

Тип Принимаемый ввод
bool on, off, 0, 1 (должен сопровождаться пробелом или EOL).
signed long strtol(..., 10) — десятичное, знаковое.
unsigned long strtoul(..., 10) — десятичное, беззнаковое.
float strtod(...) — десятичное с необязательной дробной частью.
CEString Слово без кавычек до пробела, или "строка в кавычках" (может содержать пробелы).

Разделители токенов — пробелы и табы. У строк в кавычках нет escape-синтаксиса — первая " завершает строку.

1.5 Зарегистрированные процессоры

Процессор Регистрируется когда… Источник
CEngine (регистрирует себя сам) В конструкторе CEngine CEngine.cpp:235
CGenCmdProcessor В WinMain после создания движка Game.cpp:629–630
CKeyProcessor В WinMain после создания движка Game.cpp:626–627
CScriptManager В конструкторе CScriptManager ScriptManager.cpp:212
CWorld В конструкторе CWorld (новый/загруженный) World.cpp:279, :377
CGameWorld В конструкторе CGameWorld GameWorld.cpp:1330, :1378
CActorPlayer В конструкторе CActorPlayer / LoadState ActorPlayer.cpp:783, :868
CCameraBase (+ Play) В конструкторе CCameraBase / LoadState CameraBase.cpp:13, :126

Команды «ниже по стеку» (мир, игрок, камера) становятся доступными только тогда, когда существует соответствующий объект.


2. Типы аргументов — что они означают и откуда берутся

Многие команды принимают небольшой набор повторяющихся типов аргументов. Каждый из них определяется и ищется в конкретном источнике, с конкретными ожидаемыми форматами и допустимыми диапазонами значений.

2.1 <location> / <locator_name> — ключ respawn-локации

Локатор (также называемый «respawn-локацией») — это именованная пара векторов Position + Direction, зарегистрированная в сцене. Используется командами спауна, go и всем семейством rl_*.

Откуда они берутся. Каждый XML-файл сцены (.osc / .isc, стримящийся из FS_STD_SCENE) содержит секцию <Locators> с одним или более элементами <Point>:

<Point Name="birth" Position="100.0,0.0,150.0" Direction="0.0,0.0,1.0" />
<Point Name="entrance_door" Position="..." Direction="..." />

Парсер находится в SceneLocators.cpp:7 и принимает любое имя, если присутствуют атрибуты Position и Direction; направление нормализуется при загрузке.

Соглашение.

Имя локатора Значение
birth Точка спауна игрока по умолчанию. Используется imap, omap, go, если явная локация не указана. Если birth отсутствует, игрок помещается в начало координат с предупреждением.
Любое другое Пользовательская точка — используется квестовыми скриптами, командами spawn и go <scene> <loc>.

Получение списка доступных локаторов. Команда rl_list [regex] итерирует таблицу локаторов активной сцены (World.cpp:1721); без regex выводит их все.

Добавление/изменение в рантайме.

  • rl_set <name> <x y z> [dx dy dz] — программное создание/перезапись.
  • rl <name> — сохранить текущую позицию+направление игрока как локатор (команда игрока, ActorPlayer.cpp:1303); позиция сдвигается на +10 по оси Y.

Изменения сохраняются в save-файлах, но не записываются обратно в XML сцены. Чтобы экспортировать их, используйте rl_save <filename>, которая записывает строки <Point Name="..." Position="..." Direction="..."/> в текущую рабочую директорию как сырой текст через ofstream.

2.2 <actor> — идентификатор актора

В Util::ParseActor (Util.cpp:169):

  1. Сначала парсер пытается прочитать следующий токен как unsigned long — ID актора. При успехе он ищется через IWorld::GetActorByID(id).
  2. Если разбор как целого не удался, токен читается как строка и ищется через IWorld::GetActorByName(name).

Это означает, что числовые имена интерпретируются как ID. Используйте actor_list (ниже), чтобы узнать обе формы.

  • ID акторов — небольшие беззнаковые целые, назначаемые при загрузке (видны в actor_list, id, id_sel, id_player).
  • Имена акторов — человекочитаемые имена, назначенные в XML сцены или командами спауна. Актор игрока называется player.

Используйте id <id>, чтобы вывести строку IObjectInfo для конкретного актора, actor_list [regex] — для перечисления, id_sel — для выделенного, id_trace — для того, кто находится под прицелом игрока.

2.3 <actor_name> (spawn) — встроенный класс актора

В spawn <actor_name> ... первый аргумент — ключ класса актора, а не имя экземпляра. Распознаваемые значения берутся из AFBuiltIn.cpp:31:

fog                  ACTOR_FOG                12
flame                ACTOR_FLAME              13
scripted             ACTOR_SCRIPTED           14
scripted_container   ACTOR_SCRIPTED_CONTAINER 18
blank                ACTOR_BLANK              19
sound-fake3d         ACTOR_SOUND_FAKE3D       21

Полная таблица типов (Actor.h:8–28) также принимается через tspawn (по числовому ID):

ID Тип Примечания
0 ACTOR_STATIC Статичный объект (без скриптов).
1 ACTOR_LIGHT_STATIC Статичный источник света.
2 ACTOR_LIGHT_STATIC_GROUP Группа статичных источников света.
4 ACTOR_BIPED Бипед (NPC); автоматически становится biped-col, если присутствует параметр Collectable.
5 ACTOR_BIPED_LSH Бипед с LSH-анимацией (катсцена).
6 ACTOR_DOOR Дверь.
7 ACTOR_WATER Объём воды.
8 ACTOR_OBJECT Физический объект.
9 ACTOR_FIRE Огонь (конструируется через blank+script).
10 ACTOR_PLAYER Игрок.
11 ACTOR_TRIGGER_VOLUME Объём-триггер.
12 ACTOR_FOG Актор тумана.
13 ACTOR_FLAME Эффект пламени.
14 ACTOR_SCRIPTED Скриптованный актор.
15 ACTOR_DETAILED_OBJECT Детализированный объект (с поддержкой LOD).
16 ACTOR_BIPED_CS Бипед CutScene.
17 ACTOR_BIPED_LSH_CS Бипед LSH CutScene.
18 ACTOR_SCRIPTED_CONTAINER Скриптованный контейнер.
19 ACTOR_BLANK Пустая оболочка (управляемая скриптом).
20 ACTOR_DUMMY Заглушка.
21 ACTOR_SOUND_FAKE3D Источник звука с фейковым 3D.

2.4 <scene_name> — файл сцены в FS_STD_SCENE

Сцены хранятся в Scenes.vfs и адресуются по имени файла с расширением:

  • *.iscindoor scene (внутренняя сцена); загружается через imap / imap_load.
  • *.oscoutdoor scene (внешняя сцена); загружается через omap / omap_load.

Сокращение map <name> автоматически маршрутизирует по расширению. Загрузка доступна через любую из команд: imap, omap, imap_load, omap_load, map (на стороне игрока); после загрузки можно телепортироваться в них через go.

2.5 <item_id|item_name> — предмет инвентаря

Предметы загружаются из XML-базы данных при старте игры (GameWorld.cpp:1190+). Каждый элемент <Item> имеет числовой ID и необязательный атрибут Name="...". Команды additem / removeitem принимают любую форму:

  • Сначала следующий токен читается как беззнаковое целое — ID.
  • Если это не удаётся, он читается как строка и разрешается через GetInvItemByName.

Чтобы увидеть, что в данный момент держит актор, используйте items <actor>. Канонический ресолвер на стороне скрипта — @GetInvItemByName(out_id, name).

2.6 Пары <key> <val> (CreateParams)

После позиционных аргументов spawn / tspawn / sspawn / tl_actor остаток строки читается как чередующиеся пары name value, упакованные в ICreateParamsArray:

spawn biped_npc birth   Script  NPC_Foo.bin   Name  Foo
            ^class       ^locator  ^k1 ^v1     ^k2  ^v2

И ключи, и значения проходят через CCmdParser::GetNextParameter(CEString &) — заключайте их в "...", если значение содержит пробелы. Парсер обрабатывает значения как строки; нижележащий класс конвертирует каждое значение в ожидаемый тип при вызове pParams->GetParameter(key, ...).

Известные/общие ключи (список не полный):

Ключ Используется в Значение
Script blank / scripted Имя файла скрипта (например, NPC_Foo.bin).
Name большинство акторов Переопределение имени актора.
Collectable biped / fog / scripted Переключает их на вариант *Col.
Weapon предметы инвентаря Класс оружия при экипировке.

Остальное документировано по классам акторов в XML-схемах Actors.vfs.

2.7 <key_name> (bind / unbind) — идентификатор клавиши

Разрешается без учёта регистра по таблице, построенной в KeyProcessor.cpp:17–64. Полный список (по алфавиту):

  • Буквы: a..z
  • Цифры: 0..9 (а также num0..num9, но с известной ошибкой — мапится тот же ряд цифр, а не клавиши numpad-а; KeyProcessor.cpp:25 вставляет buf1 вместо buf2)
  • Функциональные клавиши: f1..f24
  • backspace, tab, enter, pause, capslock, escape, space
  • pageup, pagedown, home, end
  • left, right, up, down
  • prtscr, insert, delete
  • Numpad: mult, plus, sep, minus, dot, slash
  • Модификаторы: numlock, scrolllock, lshift, rshift, lctrl, rctrl
  • Мышь: lbutton, rbutton, mbutton

2.8 <action_name> (bind) — игровое действие

Разрешается без учёта регистра по KeyProcessor.cpp:67–86. Полный список:

Действие Эффект
forward Идти вперёд.
back Идти назад.
left Стрейф влево.
right Стрейф вправо.
use Использовать / взаимодействовать.
jump Прыгнуть.
screenshot Сохранить скриншот.
flashlight Переключить фонарик.
visir Переключить визир (прицел).
shoot Основная стрельба.
altshoot Альтернативная стрельба.
holster Убрать оружие в кобуру.
inventory Открыть инвентарь.
map Открыть карту.
diary Открыть дневник.
message Показать последнее сообщение.
stats Показать статистику персонажа.
rescue Команда спасения.
gamemenu Открыть игровое меню.

Для любого другого действия, которое вы хотите привязать к клавише, используйте bindcmd <key> "command…", чтобы привязать к консольной команде.

2.9 Свойства игрока (prop / propl / propf / props)

Поактороный IPropertySet. Распространённые ключи, наблюдаемые у игрока (UIPlayerStatContext.cpp, ActorPlayer.cpp, скрипты):

Свойство Тип Диапазон Используется в
health float 0..1 Устанавливается god в 1.0.
armor long 0..100 Устанавливается god в 100.
armor_disease long 0..100 Устанавливается god в 100.
disease float 0..1 Уровень заражения чумой.
reputation float 0..1 Репутация игрока.
Hunger float 0..1 Уровень голода (с большой H).
Immunity float 0..1 Уровень иммунной системы.
Tiredness float 0..1 Усталость.
money float ≥ 0 Количество валюты.
noaccess long 0..N Refcount, блокирующий взаимодействия.
visibility float 0..100 Масштабирует m_fVisAmount (проверка видимости).
locked long 0/1 Состояние замка двери (ActorDoor).

У любого актора, реализующего IPropertySet, есть свой набор; проверяйте класс актора, чтобы узнать полную схему. Используйте prop <actor> <name>, чтобы прочитать строковое представление.

2.10 <effect_name> — игровой эффект

Эффекты — это просто скриптыIActorPlayer::ApplyEffect просто запускает именованный скрипт с присоединённым CEffectScriptContext (ActorPlayer.cpp:988):

effect <player_actor> <script_name>

Любой .bin-скрипт в Scripts.vfs может служить эффектом; стандартная практика — давать им имена с префиксом eff_ (например, eff_painkiller, eff_antibiotic). Функция init() скрипта запускается один раз при применении; последующие события скрипта управляют поведением во времени.

2.11 <filename> — имя файла и алиасы файловых систем

Имя файла без префикса всегда разрешается в рамках конкретной виртуальной файловой системы. Каждая команда документирует, какую FS она использует; маппинг настраивается в Game.cpp:444–466:

Алиас FS Числовой ID (IFSShell.h, Config.h) Источник
actor: FS_STD_ACTOR 0 Actors.vfs (+ переопределение loose-файлами)
geom: FS_STD_GEOMETRY 1 Geometries.vfs
tex: FS_STD_TEXTURE 2 Textures.vfs
scene: FS_STD_SCENE 3 Scenes.vfs
sound: FS_STD_SOUND 4 Sounds.vfs
font: FS_STD_FONT 5 Fonts.vfs
str: FS_STD_STRING 6 Strings.vfs
script: FS_STD_SCRIPT 7 Scripts.vfs
world: FS_STD_WORLD 8 World.vfs
ui: FS_STD_UI 9 UI.vfs
root FS_ROOT 100 Сама директория данных игры (loose-файлы).
save FS_SAVE 101 Директория <game>/../saves/.
video FS_VIDEO 102 Директория Video/.

Каждый VFS-ридер (см. vfs_format.md) сначала пытается найти loose-файл, расположенный рядом с архивом — удобно для переопределения ассетов без пересборки .vfs.

2.12 Регулярные выражения (actor_list, getvars, rl_list)

Эти команды принимают необязательный аргумент <regex> — паттерн boost::regex. Сопоставление выполняется по полной строке (boost::regex_match, а не regex_search), поэтому частичный паттерн должен содержать .* с обеих сторон:

actor_list .*Burah.*
rl_list ^birth$
getvars day_.*

Невалидный синтаксис регулярного выражения приводит к ошибке ICA.

2.13 <group_id> (switch) — идентификатор группы света

Числовой ID, соответствующий определению <Group ID="N"> внутри XML сцены. Команда switch переключает каждый актор в группе, который реализует ILightSwitch. Без аргумента on/off выводит статистику on_count/light_count/total.

2.14 <trigger_name> — метка скриптового триггера

Строка свободной формы, посылаемая как единственный аргумент события CGameTrigger целевому актору. Принимающие скрипты обрабатывают её в своём событии OnTrigger (см. events_2005.md — ID события скрипта 26). Точный набор принимаемых имён триггеров зависит от скрипта каждого получателя.


3. Команды

В таблицах ниже [X] обозначает необязательный параметр. Многие команды работают и как геттеры при вызове без аргументов — в этом случае они печатают текущее значение, а не изменяют его.

3.1 CEngine — всегда доступны

Реализация: CEngine::Execute (CEngine.cpp:654–717).

Команда Аргументы Описание
rd_wire [on|off] Переключить wireframe-рендеринг. Без аргументов — вывести текущее состояние.
rd_shadows [on|off] Переключить тени.
rd_stat [on|off] Переключить экранный оверлей статистики.
lds <filename> (string) "Load Strings" — добавить/перезаписать строки из FS_STD_STRING/<filename>. Сообщает, если какие-либо строки были перезаписаны.
gt_speed [factor] (float > 0) Скорость игрового времени: factor игровых часов на 24 реальных часа. Внутренне хранится как m_fGameTimeSpeed = 24/factor. По умолчанию 3 (см. init.cfg).

3.2 CGenCmdProcessor — всегда доступны

Реализация: GenCmdProcessor.cpp:426–455.

Команда Аргументы Описание
exec <filename> (string) Выполнить команды из текстового файла в FS_ROOT/<filename>, по одной на строку, через CExecFile.
rd_gamma [value] (float > 0) Гамма-коррекция рендерера.
sshot_gamma [value] (float ≥ 0) Гамма для скриншотов. 0 ⇒ использовать гамму рендерера.
fps — (без аргументов) Вывести текущий FPS.
quit — (без аргументов) Корректный выход (PostQuitMessage(0)).
abort — (без аргументов) Жёсткий выход (exit(-1)).
ver — (без аргументов) Вывести BUILD_STRING (build.h).
save <filename> (string) Сохранить состояние мира в FS_SAVE/<filename>. Блокируется, пока активен «loop override».
load <filename> (string) Загрузить мир из FS_SAVE/<filename>. То же правило блокировки.
qsave — (без аргументов) Быстрое сохранение: переименовать quicksave1.savquicksave2.sav, затем сохранить quicksave1.sav.
qload — (без аргументов) Быстрая загрузка из quicksave1.sav.
vol_master [value] (float ≥ 0) Общая громкость. Без аргументов — вывести текущее значение.
vol_music [value] (float ≥ 0) Громкость музыки.
vol_voice [value] (float ≥ 0) Громкость голосовых реплик.
vol_sounds [value] (float ≥ 0) Громкость SFX.
dbg_exception — (любые аргументы игнорируются) _asm int 3 — отладочный брейк. Предназначено для сессий с подключённым отладчиком.
save_config требует хотя бы один (любой) аргумент Сохранить текущие настройки (перезаписывается только rd_shadows) в FS_ROOT/init.cfg. Проверка аргументов инвертирована — вызов без аргументов выводит ICA.

3.3 CGenCmdProcessor — только когда мир загружен

Доступны только если m_pEngine->GetCurrentWorld() != NULL.

Команда Аргументы Описание
tl_actor <actor_name> [<key> <val>]… Бенчмарк: 5 циклов IWorld::CreateActor + Load + RemoveActor. Выводит средние времена загрузки/выгрузки. Буферизация файлов отключена во время теста.
tl_geom <anim|static|trans> <geom_name> Бенчмарк: 5 циклов IRenderer::CreateGeometry для указанного класса геометрии.
tl_tex <texture_name> Бенчмарк: 5 циклов IRenderer::CreateImage.

Классы геометрии для tl_geom:

  • animAID_GeometryAnimBone
  • staticAID_GeometryStatic
  • transAID_GeometryTrans

3.4 CKeyProcessor — привязки клавиш

Реализация: KeyProcessor.cpp:347–356.

Команда Аргументы Описание
bind <key_name> <action_name> Привязать клавишу к встроенному игровому действию (см. §2.7–2.8).
bindcmd <key_name> <console_command> Привязать клавишу к консольной команде. Заключайте команду в кавычки, если она содержит пробелы.
unbind <key_name> Удалить одну привязку.
unbind_all — (любые аргументы игнорируются) Удалить все привязки.
save_binds — (без аргументов) Сохранить текущие строки bind/bindcmd в FS_ROOT/init.cfg.

Привязки по умолчанию (alpha/data/init.cfg):

bind a left            bind d right          bind w forward      bind s back
bind e use             bind space jump       bind f12 screenshot
bind f flashlight      bind v visir
bind lbutton shoot     bind rbutton altshoot bind tab holster
bind i inventory       bind m map            bind p stats
bind q diary           bind r message
bindcmd f5 qsave       bindcmd f8 qload

3.5 CScriptManager — диспетчеризация на стороне скриптов

Реализация: ScriptManager.cpp:457–482.

Команда Аргументы Описание
script_list — (без аргументов) Перечислить загруженные скрипты и количество активных запусков на скрипт, плюс общий счётчик.
/<anything> произвольные "Slash-команда": любая строка, начинающаяся с /, рассылается каждому активному запуску скрипта как событие с ID 1000 (событие OnConsole в std.sci). Два аргумента wstringname (без ведущего /) и params (остаток строки).

Именно так скрипты реализуют пользовательские отладочные/консольные команды. Чтобы обработать одну из них, добавьте в скрипт обработчик события OnConsole(wstring cmd, wstring args).

3.6 CWorld — операции уровня мира (мир должен быть загружен)

Реализация: World.cpp:919–947.

Команда Аргументы Описание
gametime [<hh> <mm> [<ss>]] (ulong 0–23, 0–59, 0–59) Получить/установить время в дне. Без аргументов выводит day N HH:MM:SS. С аргументами устанавливает ближайшее будущее HH:MM[:SS] (на следующий день, если уже прошло).
gametimed <day> <hh> <mm> [<ss>] (ulong ≥1, 0–23, 0–59, 0–59) То же, но с абсолютным днём.
map_list — (без аргументов) Перечислить загруженные сцены, активная отмечена *, с счётчиками actors_total/actors_updated.
sun_over [on|off] Переключить переопределение солнца (принудительно применить цвета/направление, заданные ниже, поверх значений по умолчанию из сцены).
sun_on [on|off] При переопределении — солнце вкл/выкл.
sun_color [<r> <g> <b>] (ulong 0–255) Цвет солнца в 8-битном RGB.
sun_colorf [<r> <g> <b>] (float 0–1) Цвет солнца в float-ах.
sun_dir [<x> <y> <z>] (float, длина ≥ 1e-6) Направление солнца. Нормализуется при вводе. Предупреждает, если y > 0 (солнце светит вверх).
amb_color [<r> <g> <b>] (ulong 0–255) Окружающий цвет в 8-битном RGB.
amb_colorf [<r> <g> <b>] (float 0–1) Окружающий цвет в float-ах.
spawn <actor_name> <location> [<key> <val>]… (см. §2.3, §2.1, §2.6) Создать актора по имени встроенного класса, поместить в указанный локатор в активной сцене.
tspawn <actor_type> <location> [<key> <val>]… (см. §2.3 числовые ID) Создать по числовому ID типа.
sspawn <actor_name> [<key> <val>]… Спаун без локатора — PlaceActor(..., NULL) (начало координат, единичная ориентация).
xspawn <actor_name> <location> <xml_file> Спаун с параметрами из FS_STD_ACTOR/<xml_file> (читает блок <Extras>).
kill <actor_id> (ulong) RemoveActor(GetActorByID(id)).
id <actor_id> (ulong) Вывести IObjectInfo актора.
id_sel — (без аргументов) Вывести IObjectInfo текущего выделенного объекта (m_pSelectedObject).
actor_list [<regex>] Перечислить акторов в активной сцене. Фильтрация через boost::regex_match по каждой IObjectInfo.
actor_ref <actor_id> (ulong) Перечислить объекты IReferenceMaker, удерживающие ссылку на указанного актора.
rl_set <name> <x> <y> <z> [<dx> <dy> <dz>] Создать/перезаписать локатор в активной сцене. Направление по умолчанию (0,0,1), нормализуется.
rl_info <name> Вывести позицию и направление именованного локатора.
rl_del <name> Удалить локатор.
rl_save <filename> Экспортировать все локаторы активной сцены в <filename> как XML-строки <Point>. Пишет через ofstream в текущую рабочую директорию (не через VFS).
rl_list [<regex>] Перечислить локаторы активной сцены; фильтр по имени.

3.7 CGameWorld — высокоуровневый геймплей

Реализация: GameWorld.cpp:2419–2443. Имена команд сопоставляются без учёта регистра (stricmp).

Команда Аргументы Описание
imap_load <scene_name> (.isc-имя файла в FS_STD_SCENE) Стрим-загрузка внутренней сцены без выгрузки текущей. Используйте map_unload, чтобы её удалить.
omap_load <scene_name> (.osc) То же для внешней.
map_unload <scene_name> Выгрузить ранее загруженную сцену.
additem <actor> <item_id|item_name> [count] (count по умолчанию 1) Добавить count предметов в ISimpleContainer актора. Предметы можно указать числовым ID или именем (разрешается через GetInvItemByName).
removeitem <actor> <item_id|item_name> [count] Удалить предметы. Ответ содержит фактически удалённое количество.
items <actor> Перечислить предметы в контейнере актора как id [name], amount: N.
switch <group_id> [on|off] Без on/off — вывести статистику группы. С on/off — переключить каждый ILightSwitch в этой группе.
setvar <name> <value> (signed long) Установить общеигровую переменную (таблица m_Variables). Создаёт переменную, если её нет. Эмитит CGamePropChanged2(name).
getvar <name> Прочитать переменную (отображение в десятичном + шестнадцатеричном виде).
getvars [<regex>] Перечислить переменные — все, если паттерн не задан, иначе фильтр boost::regex_match.
prop <actor> <name> Прочитать свойство (как строку).
propl <actor> <name> <long> Установить/добавить свойство типа signed long. Распространённые имена — см. §2.9.
propf <actor> <name> <float> Установить/добавить свойство типа float.
props <actor> <name> <string> Установить/добавить строковое свойство.
effect <actor> <effect_name> (скрипт в Scripts.vfs) Применить скриптовый эффект к актору игрока (IActorPlayer::ApplyEffect).
vis — (без аргументов) Перечислить акторов в активной сцене, чья геометрия имеет GetUserVisibility() == true.
bspawn <name> <script_filename> Создать blank-актора с Script=<script_filename> и без фиксированной локации.
qxspawn <name> Быстрый xspawn — использует FS_STD_ACTOR/<name>.xml (читает <Extras>).
qspawn <name> Быстрый спаун — эквивалент bspawn <name> <name>.bin.
trigger <actor_name> <trigger_name> Послать событие CGameTrigger(1, [wstring trigger_name]) именованному актору.

3.8 CActorPlayer — действия игрока

Реализация: ActorPlayer.cpp:1523–1543. Имена сопоставляются без учёта регистра.

Команда Аргументы Описание
imap <scene_name> (.isc) Выгрузить все сцены, загрузить внутреннюю сцену, поместить игрока в локатор birth (или в начало координат, если его нет).
omap <scene_name> (.osc) То же для внешней.
map [<scene_name>] Без аргументов — вывести заголовок активной сцены. С аргументом — диспетчеризация по расширению (.iscimap, .oscomap).
go <scene_name> [<location>] Телепорт в уже загруженную сцену. Без локации — birth (или начало координат).
id_player — (без аргументов) Вывести ID игрока, позицию, направление.
id_trace — (без аргументов) Идентифицировать объект под прицелом (raycast 10 000 единиц; CCollisionFilterSolid).
rl <name> Сохранить текущую позицию игрока (+10 по Y) и направление как локатор в активной сцене.
fly [on|off] Переключить полёт игрока (на стороне физики IPhyPlayer::SetFlying).
fearme <actor> Послать CGameAttacked(player) актору (событие скрипта 17, OnAttacked).
seeme <actor> Послать CGameSee(player) (событие 1, OnSee).
hearme <actor> Послать CGameHear(player) (событие 3, OnHear).
use <actor> Послать CGamePlayerUse(player) (событие 0, OnUse).
hit <actor> <type> [amount] (long, float; по умолчанию amount=0) Послать CGameHit(player, type, amount, amount) (событие 22, OnHit).
god — (без аргументов) Установить health=1.0, armor=100, armor_disease=100.
pfdist — (без аргументов) Pathfinding-рейтрейс от позиции игрока — вывести максимальную дистанцию (предел 10 000).
pfid — (без аргументов) Вывести ID полигона навигации под игроком + разбор флагов: бит 0 = проходимо для NPC, бит 1 = пригодно для спауна NPC, бит 2 = пригодно для спауна Agony.

3.9 CCameraBase — общие команды камеры

Реализация: CameraBase.cpp:95–112.

Команда Аргументы Описание
fov [degrees] (float) Получить/установить FOV в градусах (внутренне хранится в радианах). Сопоставляется без учёта регистра (stricmp).
rec_save <filename> Начать запись трека камеры в FS_ROOT/<filename>. Каждые 0.1 с движок пишет [float dt, CVector pos, CQuat orient].
rec_stop — (без аргументов) Остановить запись.

3.10 CCameraPlay — воспроизведение

Реализация: CameraPlay.cpp:114–132. Наследует команды CCameraBase и добавляет:

Команда Аргументы Описание
play_load <filename> Загрузить трек камеры из FS_VIDEO/<filename> и начать воспроизведение.
play_stop — (без аргументов) Остановить воспроизведение.

4. Конфигурационный файл init.cfg

Путь: <game_root>/init.cfg, доступ через FS_ROOT.

Текстовый формат: последовательность консольных команд, по одной на строку. Загружается при старте и применяется через exec init.cfg. Содержимое по умолчанию см. в §3.4.

Управляется тремя командами:

  • save_config — перезаписывает строку rd_shadows. (Обратите внимание на инвертированную проверку аргументов в §3.2.)
  • save_binds — перезаписывает все строки bind/bindcmd.
  • exec init.cfg — применить.

Оба сохранителя используют CExecFile::UniqueCommand(regex_pattern, replacement) для обновления конкретных строк, не затрагивая пользовательских правок.


5. Slash-команды на стороне скриптов

Любая строка, начинающаяся с /<command> [args…], не обрабатывается движком. Вместо этого CScriptManager::Execute рассылает её каждому активному запуску скрипта как событие с ID 1000 (OnConsole):

event_args[0] = wstring   ("command" — без ведущего '/')
event_args[1] = wstring   ("args" — всё после первого пробела)

Скрипт реализует свою собственную консольную команду, добавив обработчик OnConsole, принимающий два wstring. Ошибки, выброшенные внутри обработчика, молча перехватываются (ScriptManager.cpp:478).


6. Источники

  • SRC/PlagueCity/Engine/Core/ICmdProcessor.h — интерфейс процессора
  • SRC/PlagueCity/Engine/Core/IConsole.h — интерфейс UI
  • SRC/PlagueCity/Engine/Core/IConsoleLog.h — API ответов
  • SRC/PlagueCity/Engine/Core/IFSShell.h + Game/Config.h — алиасы FS
  • SRC/PlagueCity/Engine/Core/IScene.hIRLEnumerator
  • SRC/PlagueCity/Game/Common/CmdParser.{h,cpp} — парсер аргументов
  • SRC/PlagueCity/Game/Game/Console.{h,cpp} — UI
  • SRC/PlagueCity/Game/Engine/CEngine.cpp — диспетчер + 5 команд (rd_wire, rd_shadows, rd_stat, lds, gt_speed)
  • SRC/PlagueCity/Game/Engine/SceneLocators.{h,cpp} — таблица локаторов
  • SRC/PlagueCity/Game/Engine/SceneBase.cppGetRespawnLocation/SetRespawnLocation/Remove…
  • SRC/PlagueCity/Game/Engine/ScriptManager.cppscript_list + slash-диспетчер
  • SRC/PlagueCity/Game/Engine/World.cpp — команды мира (24)
  • SRC/PlagueCity/Game/Game/GenCmdProcessor.{h,cpp} — общие команды (17 + 3 условные по миру)
  • SRC/PlagueCity/Game/Game/KeyProcessor.{h,cpp} — привязки (5)
  • SRC/PlagueCity/Game/Game/GameWorld.cpp — высокоуровневые (20)
  • SRC/PlagueCity/Game/Game/ActorPlayer.cpp — действия игрока (16)
  • SRC/PlagueCity/Game/Game/CameraBase.cpp — камера (3)
  • SRC/PlagueCity/Game/Game/CameraPlay.cpp — воспроизведение (2)
  • SRC/PlagueCity/Game/Game/Util.cppParseActor
  • SRC/PlagueCity/Game/Game/AFBuiltIn.cpp + Actor.h — встроенные классы/ID акторов
  • SRC/PlagueCity/Game/Game/Game.cpp — настройка файловой системы

Итого: 9 процессоров, ~96 команд плюс slash-команды и привязки по умолчанию.