Полный справочник по внутриигровой консоли Pathologic 2005,
восстановленный из исходников SRC/PlagueCity.
Консоль состоит из двух слабо связанных частей.
SRC/PlagueCity/Game/Game/Console.{h,cpp} — отрисовывает оверлей, обрабатывает
ввод, поддерживает историю.
- Переключается через
Show()/Hide()(вызывается изCKeyProcessor/CGame). - По нажатию Enter введённая строка диспетчеризуется через
IEngine::Execute(cmd). - Поддерживает историю команд (стрелки
↑/↓), прокрутку лога (PgUp/PgDn), Backspace, обычный ASCII (32..126). - Когда
bShowConsoleLog == true, до трёх недавних (не старше 5 секунд) неперекрытых сообщений отображаются даже при закрытой консоли.
SRC/PlagueCity/Game/Engine/CEngine.cpp:550.
- Пропускаются ведущие пробелы; пустая строка игнорируется.
- Первый токен, отделённый пробелами, становится именем команды.
- Остаток (после разделяющих пробелов) — это строка параметров
pszParms. - Эхо полной строки попадает в лог через
AddConsoleMessage. - Команда итерирует по каждому зарегистрированному
ICmdProcessor(порядок —set<ICmdProcessor*>, зависящий от адреса указателя). Побеждает первый процессор, чейExecute(pszCmd, pszParms, pLog)вернётtrue. - Если ни один процессор не распознал команду:
"Command not recognized".
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 — выводит фиксированную строку ошибки разбора. |
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-синтаксиса —
первая " завершает строку.
| Процессор | Регистрируется когда… | Источник |
|---|---|---|
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 |
Команды «ниже по стеку» (мир, игрок, камера) становятся доступными только тогда, когда существует соответствующий объект.
Многие команды принимают небольшой набор повторяющихся типов аргументов. Каждый из них определяется и ищется в конкретном источнике, с конкретными ожидаемыми форматами и допустимыми диапазонами значений.
Локатор (также называемый «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.
В Util::ParseActor (Util.cpp:169):
- Сначала парсер пытается прочитать следующий токен как
unsigned long— ID актора. При успехе он ищется черезIWorld::GetActorByID(id). - Если разбор как целого не удался, токен читается как строка и ищется
через
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 — для того, кто находится под прицелом игрока.
В 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. |
Сцены хранятся в Scenes.vfs и адресуются по имени файла с
расширением:
*.isc— indoor scene (внутренняя сцена); загружается черезimap/imap_load.*.osc— outdoor scene (внешняя сцена); загружается черезomap/omap_load.
Сокращение map <name> автоматически маршрутизирует по расширению. Загрузка
доступна через любую из команд: imap, omap, imap_load, omap_load, map
(на стороне игрока); после загрузки можно телепортироваться в них через go.
Предметы загружаются из XML-базы данных при старте игры
(GameWorld.cpp:1190+). Каждый элемент <Item> имеет числовой ID и
необязательный атрибут Name="...". Команды additem / removeitem
принимают любую форму:
- Сначала следующий токен читается как беззнаковое целое — ID.
- Если это не удаётся, он читается как строка и разрешается через
GetInvItemByName.
Чтобы увидеть, что в данный момент держит актор, используйте items <actor>.
Канонический ресолвер на стороне скрипта — @GetInvItemByName(out_id, name).
После позиционных аргументов 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.
Разрешается без учёта регистра по таблице, построенной в
KeyProcessor.cpp:17–64. Полный список (по алфавиту):
- Буквы:
a..z - Цифры:
0..9(а такжеnum0..num9, но с известной ошибкой — мапится тот же ряд цифр, а не клавиши numpad-а;KeyProcessor.cpp:25вставляетbuf1вместоbuf2) - Функциональные клавиши:
f1..f24 backspace,tab,enter,pause,capslock,escape,spacepageup,pagedown,home,endleft,right,up,downprtscr,insert,delete- Numpad:
mult,plus,sep,minus,dot,slash - Модификаторы:
numlock,scrolllock,lshift,rshift,lctrl,rctrl - Мышь:
lbutton,rbutton,mbutton
Разрешается без учёта регистра по 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…", чтобы привязать к консольной команде.
Поактороный 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>,
чтобы прочитать строковое представление.
Эффекты — это просто скрипты — IActorPlayer::ApplyEffect просто запускает
именованный скрипт с присоединённым CEffectScriptContext
(ActorPlayer.cpp:988):
effect <player_actor> <script_name>
Любой .bin-скрипт в Scripts.vfs может служить эффектом; стандартная практика —
давать им имена с префиксом eff_ (например, eff_painkiller,
eff_antibiotic). Функция init() скрипта запускается один раз при применении;
последующие события скрипта управляют поведением во времени.
Имя файла без префикса всегда разрешается в рамках конкретной виртуальной
файловой системы. Каждая команда документирует, какую 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.
Эти команды принимают необязательный аргумент <regex> — паттерн
boost::regex. Сопоставление выполняется по полной строке
(boost::regex_match, а не regex_search), поэтому частичный паттерн должен
содержать .* с обеих сторон:
actor_list .*Burah.*
rl_list ^birth$
getvars day_.*
Невалидный синтаксис регулярного выражения приводит к ошибке ICA.
Числовой ID, соответствующий определению <Group ID="N"> внутри XML сцены.
Команда switch переключает каждый актор в группе, который реализует
ILightSwitch. Без аргумента on/off выводит статистику
on_count/light_count/total.
Строка свободной формы, посылаемая как единственный аргумент события
CGameTrigger целевому актору. Принимающие скрипты обрабатывают её в своём
событии OnTrigger (см. events_2005.md — ID события скрипта 26).
Точный набор принимаемых имён триггеров зависит от скрипта каждого получателя.
В таблицах ниже [X] обозначает необязательный параметр. Многие команды
работают и как геттеры при вызове без аргументов — в этом случае они печатают
текущее значение, а не изменяют его.
Реализация: 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). |
Реализация: 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.sav → quicksave2.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. |
Доступны только если 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:
anim→AID_GeometryAnimBonestatic→AID_GeometryStatictrans→AID_GeometryTrans
Реализация: 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
Реализация: ScriptManager.cpp:457–482.
| Команда | Аргументы | Описание |
|---|---|---|
script_list |
— (без аргументов) | Перечислить загруженные скрипты и количество активных запусков на скрипт, плюс общий счётчик. |
/<anything> |
произвольные | "Slash-команда": любая строка, начинающаяся с /, рассылается каждому активному запуску скрипта как событие с ID 1000 (событие OnConsole в std.sci). Два аргумента wstring — name (без ведущего /) и params (остаток строки). |
Именно так скрипты реализуют пользовательские отладочные/консольные команды.
Чтобы обработать одну из них, добавьте в скрипт обработчик события
OnConsole(wstring cmd, wstring args).
Реализация: 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>] |
Перечислить локаторы активной сцены; фильтр по имени. |
Реализация: 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]) именованному актору. |
Реализация: ActorPlayer.cpp:1523–1543. Имена сопоставляются
без учёта регистра.
| Команда | Аргументы | Описание |
|---|---|---|
imap |
<scene_name> (.isc) |
Выгрузить все сцены, загрузить внутреннюю сцену, поместить игрока в локатор birth (или в начало координат, если его нет). |
omap |
<scene_name> (.osc) |
То же для внешней. |
map |
[<scene_name>] |
Без аргументов — вывести заголовок активной сцены. С аргументом — диспетчеризация по расширению (.isc → imap, .osc → omap). |
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. |
Реализация: 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 |
— (без аргументов) | Остановить запись. |
Реализация: CameraPlay.cpp:114–132. Наследует команды CCameraBase
и добавляет:
| Команда | Аргументы | Описание |
|---|---|---|
play_load |
<filename> |
Загрузить трек камеры из FS_VIDEO/<filename> и начать воспроизведение. |
play_stop |
— (без аргументов) | Остановить воспроизведение. |
Путь: <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)
для обновления конкретных строк, не затрагивая пользовательских правок.
Любая строка, начинающаяся с /<command> [args…], не обрабатывается
движком. Вместо этого CScriptManager::Execute рассылает её каждому активному
запуску скрипта как событие с ID 1000 (OnConsole):
event_args[0] = wstring ("command" — без ведущего '/')
event_args[1] = wstring ("args" — всё после первого пробела)
Скрипт реализует свою собственную консольную команду, добавив обработчик
OnConsole, принимающий два wstring. Ошибки, выброшенные внутри обработчика,
молча перехватываются (ScriptManager.cpp:478).
SRC/PlagueCity/Engine/Core/ICmdProcessor.h— интерфейс процессораSRC/PlagueCity/Engine/Core/IConsole.h— интерфейс UISRC/PlagueCity/Engine/Core/IConsoleLog.h— API ответовSRC/PlagueCity/Engine/Core/IFSShell.h+Game/Config.h— алиасы FSSRC/PlagueCity/Engine/Core/IScene.h—IRLEnumeratorSRC/PlagueCity/Game/Common/CmdParser.{h,cpp}— парсер аргументовSRC/PlagueCity/Game/Game/Console.{h,cpp}— UISRC/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.cpp—GetRespawnLocation/SetRespawnLocation/Remove…SRC/PlagueCity/Game/Engine/ScriptManager.cpp—script_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.cpp—ParseActorSRC/PlagueCity/Game/Game/AFBuiltIn.cpp+Actor.h— встроенные классы/ID акторовSRC/PlagueCity/Game/Game/Game.cpp— настройка файловой системы
Итого: 9 процессоров, ~96 команд плюс slash-команды и привязки по умолчанию.