Триггер будет разбит на две части - присвоение юнитов и наполнение ими замки. Вторая часть это видоизмененный наш предыдущий код, начнем с нее:
(5,
[
(try_for_range, ":town", "p_town_1", "p_village_1"), # 6 3 1224979098644774912 648518346341351446 648518346341351594
(is_between, ":town", "p_town_X", "p_town_Y"), # эта строчка нам больше не нужна, убираем 33 3 1224979098644774912 648518346341351446 648518346341351447 из нашего кода
(party_get_slot, ":guard", ":town", 500), # почему здесь 500 я объясню ниже
(gt, ":guard", 0), # 0 это значение по умолчанию для любого слота, а значит эта проверка заменяет наш is_between который мы выкинули
(party_count_members_of_type, ":cur_guards", ":town", ":guard"), # это старая строчка но в ней уже не "trp_guard" а ":guard", так что старые цифры не подойдут
(lt, ":cur_guards", 100), # 2147483678 2 но у ":cur_guards" уже другой порядковый номер, надо пересчитать
(party_add_members, ":town", ":guard", 1), # пересчитываем, уже не "trp_guard" а ":guard"
(try_end), # вроде в прошлый раз мы цикл не закрыли - не дело
]),
Теперь пора посвятить тебя в удивительный мир слотов. Что такое слоты? Это глобалка, привязанная к объекту. Например ты пишешь яд и чтоб нанести юниту урон, тебе надо проверить что он отравлен. Ты можешь написать (eq, "$poisoned", 1), и для первого юнита это сработает, но также продолжит срабатывать и для всех остальных, которых на самом деле еще не травили. Потому надо проверять (agent_slot_eq, ":agent", slot_poisoned, 1), это у каждого отдельного агента будет считывать что у него там в этом слоте, если 0, а 0 там по умолчанию, то его уже дамажить не будет. Когда я это осмысливал, мне понятнее всего оказалась ассоциация с карманами - есть 10 человек, у каждого есть карманы, но только у одного в кармане что-то лежит. Потому нельзя ставить вопрос лежит ли там у них что-то в целом, нужно каждому отдельно заглядывать и смотреть.
Что мы делаем здесь? Да то же самое - заглядываем в 500-ый "карман" каждому городу, и если у кого-то там не пусто, то достаем оттуда нового жильца и селим на ПМЖ)) Почему 500-ый? Для безопасности - многие слоты уже заняты в нативной модульке, их конечно меньше занято чем 500, но это красивое число и хорошая отправная точка для наших кастомных. Еще надо понимать что у каждого объекта слоты свои, если в 500-ом слоте отряда стоит trp_guard, то в 500-ом слоте, скажем, фракции - по прежнему пусто. Всего слотов 2^20 = 1048576, раздельных на каждый объект.
Вооружившись этой информацией, пихаем в game_start в конец присваивание наших юнитов:
(party_set_slot, "p_town_1", 500, "trp_town1_guard"),
(party_set_slot, "p_town_2", 500, "trp_town2_guard"),
....
(party_set_slot, "p_castle_40", 500, "trp_castle40_guard"),
И, вкупе с триггером выше, получаем рабочую систему своей мечты =)