Для целого ряда существующих в игре объектов возможно создание специальных ячеек памяти, называемых слотами (slot). Слоты упрощают хранение и систематизацию информации, избавляют нас от необходимости сочинять и запоминать тьму-тьмущую переменных. Вот список таких объектов: item, agent, faction, party, party_template, scene, scene_prop, troop, quest, player, team. Для каждой сцены, для каждого предмета, юнита и т.д. мы можем создать почти неограниченное множество слотов (ячеек памяти). Чтобы обращаться к этим слотам годятся как порядковые номера (от нуля до... почти бесконечности), так и названия. Названия вновь придуманных слотов необходимо прописать в файле module_constants.py. Учтите, что большое количество слотов уже имеют свои названия и используются игрой в различных ситуациях.
Например, для агентов в нативе используется 26 слотов, пронумерованных от 0 до 25 и снабжённых названиями типа slot_agent_is_running_away (в данном случе это слот с номером 15). Следовательно, надёжнее всего новый слот создать с номером 26, это на 100% защитит нас от багов, связнных с использованием одного и того же слота двумя разными скриптами. Упомянутый слот позволяет для любого из агентов, находящихся на сцене, сделать запись, что он в данный момент убегает (дезертирует):
(agent_set_slot, ":cur_agent", slot_agent_is_running_away, 1),
Даже если агентов на сцене 200, мы обходимся одной строкой и не мучаемся созданием двухсот (плюс ещё сколько-то про запас) переменных. Согласитесь, одна строка это гораздо удобнее, чем сотни строк. Причём приведённую выше строку мы можем записать и так:
(agent_set_slot, ":cur_agent", 15, 1),
Функционировать всё будет точно так же, разница лишь в том, что человеку обычно легче запомнить несущие значения слова, чем набор чисел. В нашем примере slot_agent_is_running_away означает - вот константа, используемая для обозначения слота агента, где хранится информация, убегает он или нет. Если какое-то название слота вам сложно запомнить, то вы можете ввести для него альтернативное название. Для этого достаточно в файле module_constants.py добавить соответствующую запись:
run_away = slot_agent_is_running_away
и тогда наша строка-пример преображается в следующую с полным сохранением своей функции:
(agent_set_slot, ":cur_agent", run_away, 1),
Для обращения к слотам мы также можем использовать переменные, например следующий скрипт позволяет с помощью трёх строк сделать значение всех двадцати шести слотов агента равным нулю:
(try_for_range, ":unused", 0, 26),
(agent_set_slot, ":cur_agent", ":unused", 0),
(try_end),
Кстати, для любого слота, в который мы ещё не записывали никакого числа, игра будет считать его содержимое равным нулю. Итак, для обращения к слоту можно применять его номер, название, любое альтернативное название, любую переменную, а также простые арифметические выражения:
(agent_set_slot, ":cur_agent", run_away + 1, 1),
в данном случае мы обратились уже к следующему слоту, имеющему номер 16.
По отношению к слотам нам доступны следующие операторы:
(agent_set_slot,<agent_id>,<slot_no>,<value>), записывает в слот число (value)
(agent_get_slot,<destination>,<agent_id>,<slot_no>), узнаёт записанное в слот число
(agent_slot_eq,<agent_id>,<slot_no>,<value>), делает строгую проверку (содержимое слота равно определённому значению)
(agent_slot_ge,<agent_id>,<slot_no>,<value>), делает нестрогую проверку (содержимое либо больше, либо равно определённому значению)
(neg|agent_slot_eq,<agent_id>,<slot_no>,<value>), делает нестрогую проверку (содержимое либо больше, либо меньше определённого значения)
(neg|agent_slot_ge,<agent_id>,<slot_no>,<value>), делает строгую проверку (содержимое меньше определённого значения)
Разумеется при работе с другим объектом вместо слова agent будет фигурировать что-то из списка item, faction, party, party_template, scene, scene_prop, troop, quest, player или team.