Для примера возмем идею
раздевать лордов при их захвате в плен.
1) Определяемся с концепцией. Вполне логично, что ГГ может позволить себе наглость раздеть захваченного лорда (такая фишка уже есть, например, в Viking Conquest), но это, разумеется, скажется на его чести и отношениях с лордом.
Для простоты реализации лорд будет автоматически отпускаться после его "раздевания" (иначе нам пришлось бы прописывать опустошение его инвентаря, но при этом сохранять информацию о нем и добавлять дополнительный скрипт, который вновь возвращал бы лорду его шмот, когда тот наконец оказывался бы на воле).
Ну, а тот факт, что освободившийся лорд может без труда достать себе новый комплект доспехов и оружия, думаю, сомнений не вызывает.
При этом из списка "раздевабельных" лордов мы исключим королей. Во-первых, это уже слишком, а, во-вторых, в РоР есть отдельный механизм отъема их уникального оружия, который не хочется портить.
Итого, нам нужны следующие операции:
- (условие) пленный лорд не является королем;
- (условие) в инвентаре ГГ больше 9 свободных мест;
- цикл, который перебирает первые 9 слотов интвентаря лорда (его экипировку) и добавляет каждый из предметов ГГ (итого 5 операции: начало цикла, запрос данных о предмете в слоте, удостоверение в том, что значение больше 0, передача предмета, завершение цикла);
- отпускание лорда на свободу;
- отъем у ГГ чести;
- ухудшение отношений с лордом.
2) В первую очередь глянем на то, как устроен аналогичный скрипт - отпуск лорда за деньги. В conversation.txt ищем "I_will_accept_your_ransom", пока не находим нужное (проще начинать работать, когда видишь хоть какой-то пример):
dlga_prisoner_chat_noble2:close_window 69631 1540 0 Very_well,_I_will_accept_your_ransom_of_{reg23}_Denars.._you_are_free_to_go. 6 2 1616 3 648518346341351424 144115188075855892 1 1528 2 360287970189639680 72057594037927959 NO_VOICEOVER
Тут все просто - 2 операции:
1616 - party_remove_prisoners (ее мы запомним)
1528 - troop_add_gold (она нам не нужна).
Ну, а мы
начнем по порядку со следствий:
1. Отъем чести. Для этого используется специальный скрипт script_change_player_honor. У нас он идет в строке 561, а значит его номер (561-3)/2=279. Прибавляем константу 936748722493063168, оформляем по правилам построение структуры и получаем
1 2 936748722493063447 -1.
2. Ухудшение отношений с лордом. Для этого тоже используется скрипт (script_troop_change_relation_with_troop), в котором задействованы 3 переменные: 2 персонажа и 1 величина изменения отношений. При этом мы можем вспомнить, что что-то такое уже имеется в случае с отпусканием короля за его оружие, а значит мы просто пробьем по поиску " 1 4 " в файле conversation.txt в разделе "I_am_taking_your_weapon._Now_get_out_of_my_sight_and_run_home,_you_coward!" и наткнемся на
1 4 936748722493063690 360287970189639680 144115188075855892 -40. В больших числах мы можем узнать номер скрипта (936748722493063690), номер trp_player, он же ГГ (360287970189639680) и номер специальной глобальной переменной g_talk_troop (с кем ГГ разговаривает, 144115188075855892). Поменяв величину падения отношений на, скажем, -25 (а то -40 жирновато будет), мы получаем
1 4 936748722493063690 360287970189639680 144115188075855892 -25.
3. Цикл. Перед началом мы добавим маленькую хитрость:
1533 1 144115188075855892 (заставим лорда одеть шлем, а также по-максимуму заполнить слоты экипировки оружием, воспользовавшись оператором troop_equip_items).
Начало цикла (
try_for_range, <destination>, <lower_bound>, <upper_bound>):
6 3 1224979098644774927 0 9 (за переменную для хранения этапа цикла мы наугад возьмем 15-ую локальную переменную, т.е. 1224979098644774927; за границы мы возьмем 0 и 9 (верхняя граница не включается)).
Для запроса данных о ячейке инвенторя используется оператор troop_get_inventory_slot (
troop_get_inventory_slot, <destination>, <troop_id>, <inventory_slot_no>). Номер слота - наша 15-ая ЛП, troop_id - упомянутая ранее ГП g_talk_troop, а переменная-destination - пусть будет 16-ая ЛП. Итого мы имеем
1541 3 1224979098644774928 144115188075855892 1224979098644774927.
Удостовериваемся, что значение слота больше 0 (т.е. он не пустой):
32 2 1224979098644774928 0.
Для передачи (а, проще говоря, для выдачи) предмета ГГ мы используем оператор troop_add_items (
troop_add_items, <troop_id>, <item_id>, <number>), где troop_id - trp_player, item_id - 16-ая ЛП, а число равно 1. Итого:
1535 3 360287970189639680 1224979098644774928 1.
Цикл завершаем (try_end). Это будет
3 0.
4. Отпускаем лорда (
party_remove_members, <party_id>, <troop_id>, <number>). Это мы уже видели:
1616 3 648518346341351424 144115188075855892 1 (из отряда ГГ мы удаляем g_talk_troop в кол-ве 1 шт.).
Теперь все следствия объединяем вместе (предварительно посчитав количество операций - 9):
9 1 2 936748722493063447 -1 1 4 936748722493063690 360287970189639680 144115188075855892 -25 1533 1 144115188075855892 6 3 1224979098644774927 0 9 1541 3 1224979098644774928 144115188075855892 1224979098644774927 32 2 1224979098644774928 0 1535 3 360287970189639680 1224979098644774928 1 3 0 1616 3 648518346341351424 144115188075855892 1. Скрипт следствий готов!
Далее
задумаемся над условиями:
1. К условию "не король" мы подойдем так: ограничим диапазоном возможных "жертв" лишь лордами, воспользовавшись оператором is_between (
is_between, <value>, <lower_bound>, <upper_bound>). Поскольку файл troops.txt, как правило, хорошо отсортирован, когда дело доходит до лордов, нам не составит труда узнать номер первого лорда (454, Аламар) и первого не-лорда (554, Дарлион). А нужное нам value для сравнения - все тот же g_talk_troop. Добавив константы, получаем:
33 3 144115188075855892 360287970189640134 360287970189640234.
2. Теперь инвентарь. Тут мы воспользуемся оператором store_free_inventory_capacity (
store_free_inventory_capacity, <destination>, [troop_id]) и убедимся , что результат (за destination возьмем 14-ую ЛП) больше или равен (
ge, <value1>, <value2>) 9 . Итого получим
2167 2 1224979098644774926 360287970189639680 30 2 1224979098644774926 9.
Объединяем и получаем
3 33 3 144115188075855892 360287970189640134 360287970189640234 2167 2 1224979098644774926 360287970189639680 30 2 1224979098644774926 9. Условие готово.
3)
Наконец объединим все это в диалог. За основу возьмем
dlga_prisoner_chat_noble2:close_window.2 69631 1540 0 I_will_think_upon_your_offer. 6 0 NO_VOICEOVER в conversation.txt и
пристроим наш твик следующей строкой:
dlga_prisoner_chat_noble2:close_window.3 69631 1540 3 33 3 144115188075855892 360287970189640134 360287970189640234 2167 2 1224979098644774926 360287970189639680 30 2 1224979098644774926 9 I'm_taking_your_equipment._Run_home,_you_bastard! 6 9 1 2 936748722493063447 -1 1 4 936748722493063690 360287970189639680 144115188075855892 -25 1533 1 144115188075855892 6 3 1224979098644774927 0 9 1541 3 1224979098644774928 144115188075855892 1224979098644774927 32 2 1224979098644774928 0 1535 3 360287970189639680 1224979098644774928 1 3 0 1616 3 648518346341351424 144115188075855892 1 NO_VOICEOVER
(Обращаем внимание, что close_window.2 стало close_window.3, т.к. мы добавили четвертую альтернативную реплику (включая нулевую)).И не забываем увеличить счетчик на самом верху файла на 1.
Вот и все.