1
Инструкции и уроки по созданию модификаций / [MS] Дополнения для Warband
« : 12 Августа, 2012, 16:53 »
Такс... В прошлой теме форум уже начал обрезать мой пост. Так что решил перенести пункт "Дополнения" в новую тему.
Примечание:
Для удобства я выделяю все по данной схеме:
Синий - искомый текст.
Зеленый - добавленный текст.
Красный - замененный текст.
Серый - исходный текст файла.
Итак:
Содержание:
1. Показывать благополучие точным числом.
5. Узнать местонахождение спутников независимо от того, были ли они в отряде.
6. Смена частоты показа сообщений о изменении благополучия (дополнение для п.1)
7. Заставляем ваш эскорт разбивать лагерь вместе с вами.
8. Королю - королевское! Маршалу - маршальское! Бонус к размеру армии.
Остальное можно найти в Исправлениях
1. Показывать благополучие точным числом
5. Узнать местонахождение спутников независимо от того, были ли они в отряде.
6. Смена частоты показа сообщений о изменении благополучия. (дополнение для п.1)
7. Заставляем ваш эскорт разбивать лагерь вместе с вами.
8. Королю - королевское! Маршалу - маршальское! Бонус к размеру армии.
Примечание:
Для удобства я выделяю все по данной схеме:
Синий - искомый текст.
Зеленый - добавленный текст.
Красный - замененный текст.
Серый - исходный текст файла.
Итак:
Дополнения для Warband
1.134, 1.143, 1.153
Содержание:
1. Показывать благополучие точным числом.
5. Узнать местонахождение спутников независимо от того, были ли они в отряде.
6. Смена частоты показа сообщений о изменении благополучия (дополнение для п.1)
7. Заставляем ваш эскорт разбивать лагерь вместе с вами.
8. Королю - королевское! Маршалу - маршальское! Бонус к размеру армии.
Остальное можно найти в Исправлениях
1. Показывать благополучие точным числом
Вам никогда не казалось, что деревня уже целую вечность бедная и ни капельки не развивается? Хочется заглянуть под ширму этих 5 состояний благополучия? Это просто!
В scrips найдите script_get_prosperity_text_to_s50 и сделайте следующие изменения:
По желанию можете возле {reg0} дописать знак процентов для отображения в процентах. От этого принципиально ничего не меняется.
После этого, когда вы нажмете ПКМ по наделу и выберете "Посмотреть информацию", то в графе "Достаток" вместо "Высокий", "Средний" и т.д. вы увидите точное число от 1 до 99! Теперь вы точно будете знать, какое состояние вашей (и не только) деревни!
Если вас заинтересовало данное исправление, то посмотрите еще и "2. Изменяем максимум благополучия на "100" вместо "99"".
В scrips найдите script_get_prosperity_text_to_s50 и сделайте следующие изменения:
#script_get_prosperity_text_to_s50
# INPUT: center_no
# OUTPUT: none
("get_prosperity_text_to_s50",
[(store_script_param, ":center_no", 1),
(party_get_slot, ":prosperity", ":center_no", slot_town_prosperity),
(assign, reg0, ":prosperity"),
## (val_div, ":prosperity", 20),
(try_begin),
(str_store_string, s50, "@{reg0}"),
## (eq, ":prosperity", 0), #0..19
## (str_store_string, s50, "@Very Poor"),
## (else_try),
## (eq, ":prosperity", 1), #20..39
## (str_store_string, s50, "@Poor"),
## (else_try),
## (eq, ":prosperity", 2), #40..59
## (str_store_string, s50, "@Average"),
## (else_try),
## (eq, ":prosperity", 3), #60..79
## (str_store_string, s50, "@Rich"),
## (else_try),
## (str_store_string, s50, "@Very Rich"), #80..99
(try_end),
]),
# INPUT: center_no
# OUTPUT: none
("get_prosperity_text_to_s50",
[(store_script_param, ":center_no", 1),
(party_get_slot, ":prosperity", ":center_no", slot_town_prosperity),
(assign, reg0, ":prosperity"),
## (val_div, ":prosperity", 20),
(try_begin),
(str_store_string, s50, "@{reg0}"),
## (eq, ":prosperity", 0), #0..19
## (str_store_string, s50, "@Very Poor"),
## (else_try),
## (eq, ":prosperity", 1), #20..39
## (str_store_string, s50, "@Poor"),
## (else_try),
## (eq, ":prosperity", 2), #40..59
## (str_store_string, s50, "@Average"),
## (else_try),
## (eq, ":prosperity", 3), #60..79
## (str_store_string, s50, "@Rich"),
## (else_try),
## (str_store_string, s50, "@Very Rich"), #80..99
(try_end),
]),
После этого, когда вы нажмете ПКМ по наделу и выберете "Посмотреть информацию", то в графе "Достаток" вместо "Высокий", "Средний" и т.д. вы увидите точное число от 1 до 99! Теперь вы точно будете знать, какое состояние вашей (и не только) деревни!
Если вас заинтересовало данное исправление, то посмотрите еще и "2. Изменяем максимум благополучия на "100" вместо "99"".
5. Узнать местонахождение спутников независимо от того, были ли они в отряде.
Иногда ну хоть глаз выколи не можешь найти всех спутников! По умолчанию путешественник скажет вам местонахождение спутника, только если тот был в вашем отряде, но ушел. Данное дополнение заставит путешественника рассказать вам про спутников независимо от того, встречались вы когда-либо.
В dialogs найдите строку [anyone|plyr|repeat_for_troops, "tavern_traveler_companion_location_ask" и сделайте следующие исправления:
Все, мы отключили проверку на пребывание в отряде...
Но для сохранения баланса настоятельно рекомендую следующие изменения после указанного диалога":
[anyone|plyr, "tavern_traveler_companion_location_ask",
[], "Never mind.", "tavern_traveler_pretalk", []],
[anyone, "tavern_traveler_companion_location_ask_2", [(troop_slot_eq, "$temp", slot_troop_playerparty_history, 0),(str_store_troop_name, s15, "$temp")], "I guess I know where {s15} is. For 500 denars, I'll tell you.", "tavern_traveler_companion_location_ask_money", []],
[anyone, "tavern_traveler_companion_location_ask_2", [(str_store_troop_name, s15, "$temp")], "I guess I know where {s15} is. For 30 denars, I'll tell you.", "tavern_traveler_companion_location_ask_money", []],
[anyone|plyr, "tavern_traveler_companion_location_ask_money",
[
(troop_slot_eq, "$temp", slot_troop_playerparty_history, 0),
(store_troop_gold, ":cur_gold", "trp_player"),
(ge, ":cur_gold", 500),
], "All right. Here is 500 denars.", "tavern_traveler_companion_location_tell",
[
(troop_remove_gold, "trp_player", 500),
]],
[anyone|plyr, "tavern_traveler_companion_location_ask_money",
[
(troop_slot_ge, "$temp", slot_troop_playerparty_history, 1),
(store_troop_gold, ":cur_gold", "trp_player"),
(ge, ":cur_gold", 30),
], "All right. Here is 30 denars.", "tavern_traveler_companion_location_tell",
[
(troop_remove_gold, "trp_player", 30),
]],
Теперь, если вы еще не встретили спутника, то информация обойдется куда дороже, а если уже встречали, то стоимость будет обычной.
В dialogs найдите строку [anyone|plyr|repeat_for_troops, "tavern_traveler_companion_location_ask" и сделайте следующие исправления:
[anyone, "tavern_traveler_companion_location", [], "Maybe I can help you. Who are you looking for?", "tavern_traveler_companion_location_ask", []],
[anyone|plyr|repeat_for_troops, "tavern_traveler_companion_location_ask",
[
(store_repeat_object, ":troop_no"),
(is_between, ":troop_no", companions_begin, companions_end),
# (troop_slot_ge, ":troop_no", slot_troop_playerparty_history, 1),
(assign, ":continue", 0),
(try_begin),
(this_or_next|troop_slot_ge, ":troop_no", slot_troop_cur_center, 1),
(troop_slot_ge, ":troop_no", slot_troop_prisoner_of_party, 0),
(assign, ":continue", 1),
(try_end),
[anyone|plyr|repeat_for_troops, "tavern_traveler_companion_location_ask",
[
(store_repeat_object, ":troop_no"),
(is_between, ":troop_no", companions_begin, companions_end),
# (troop_slot_ge, ":troop_no", slot_troop_playerparty_history, 1),
(assign, ":continue", 0),
(try_begin),
(this_or_next|troop_slot_ge, ":troop_no", slot_troop_cur_center, 1),
(troop_slot_ge, ":troop_no", slot_troop_prisoner_of_party, 0),
(assign, ":continue", 1),
(try_end),
Но для сохранения баланса настоятельно рекомендую следующие изменения после указанного диалога":
[anyone|plyr, "tavern_traveler_companion_location_ask",
[], "Never mind.", "tavern_traveler_pretalk", []],
[anyone, "tavern_traveler_companion_location_ask_2", [(troop_slot_eq, "$temp", slot_troop_playerparty_history, 0),(str_store_troop_name, s15, "$temp")], "I guess I know where {s15} is. For 500 denars, I'll tell you.", "tavern_traveler_companion_location_ask_money", []],
[anyone, "tavern_traveler_companion_location_ask_2", [(str_store_troop_name, s15, "$temp")], "I guess I know where {s15} is. For 30 denars, I'll tell you.", "tavern_traveler_companion_location_ask_money", []],
[anyone|plyr, "tavern_traveler_companion_location_ask_money",
[
(troop_slot_eq, "$temp", slot_troop_playerparty_history, 0),
(store_troop_gold, ":cur_gold", "trp_player"),
(ge, ":cur_gold", 500),
], "All right. Here is 500 denars.", "tavern_traveler_companion_location_tell",
[
(troop_remove_gold, "trp_player", 500),
]],
[anyone|plyr, "tavern_traveler_companion_location_ask_money",
[
(troop_slot_ge, "$temp", slot_troop_playerparty_history, 1),
(store_troop_gold, ":cur_gold", "trp_player"),
(ge, ":cur_gold", 30),
], "All right. Here is 30 denars.", "tavern_traveler_companion_location_tell",
[
(troop_remove_gold, "trp_player", 30),
]],
6. Смена частоты показа сообщений о изменении благополучия. (дополнение для п.1)
Это изменение вряд-ли (очень вряд-ли...) будет вам надо, если вы не делали изменение в п.1.
Вспомнил важную деталь, которую я поправил у себя, но запамятовал сообщить вам! Быстрые сообщения о смене благополучия все-равно ведь будут показываться каждые 20 единиц, т.к. раньше были настроены на 5 разных состояний благополучия (по 20 ед. каждое).
Чтобы это иправить, просто найдите в scripts скрипт под названием change_center_prosperity, который нам знаком с прошлых изменений, и измените делители перед выводом текста:
Теперь даже при смене достатка на 1 единицу вы сразу об этом узнаете! Но если частенько пишутся сообщения и вам это мешает, то можете поставить число побольше. Поставив число Х вы будете сообщены только о смене благополучия на значения, кратные этому Х.
Чтобы это иправить, просто найдите в scripts скрипт под названием change_center_prosperity, который нам знаком с прошлых изменений, и измените делители перед выводом текста:
#script_change_center_prosperity
# INPUT: arg1 = center_no, arg2 = difference
# OUTPUT: none
("change_center_prosperity",
[(store_script_param, ":center_no", 1),
(store_script_param, ":difference", 2),
(party_get_slot, ":old_prosperity", ":center_no", slot_town_prosperity),
(store_add, ":new_prosperity", ":old_prosperity", ":difference"),
(val_clamp, ":new_prosperity", 0, 101),
(store_div, ":old_state", ":old_prosperity", 1),
(store_div, ":new_state", ":new_prosperity", 1),
(try_begin),
(neq, ":old_state", ":new_state"),
(neg|is_between, ":center_no", castles_begin, castles_end),
(str_store_party_name_link, s2, ":center_no"),
(call_script, "script_get_prosperity_text_to_s50", ":center_no"),
(str_store_string, s3, s50),
(party_set_slot, ":center_no", slot_town_prosperity, ":new_prosperity"),
(call_script, "script_get_prosperity_text_to_s50", ":center_no"),
(str_store_string, s4, s50),
(try_begin),
(party_slot_eq, ":center_no", slot_town_lord, "trp_player"),
(display_message, "@Prosperity of {s2} has changed from {s3} to {s4}."),
(try_end),
(call_script, "script_update_center_notes", ":center_no"),
(else_try),
(party_set_slot, ":center_no", slot_town_prosperity, ":new_prosperity"),
(try_end),
# INPUT: arg1 = center_no, arg2 = difference
# OUTPUT: none
("change_center_prosperity",
[(store_script_param, ":center_no", 1),
(store_script_param, ":difference", 2),
(party_get_slot, ":old_prosperity", ":center_no", slot_town_prosperity),
(store_add, ":new_prosperity", ":old_prosperity", ":difference"),
(val_clamp, ":new_prosperity", 0, 101),
(store_div, ":old_state", ":old_prosperity", 1),
(store_div, ":new_state", ":new_prosperity", 1),
(try_begin),
(neq, ":old_state", ":new_state"),
(neg|is_between, ":center_no", castles_begin, castles_end),
(str_store_party_name_link, s2, ":center_no"),
(call_script, "script_get_prosperity_text_to_s50", ":center_no"),
(str_store_string, s3, s50),
(party_set_slot, ":center_no", slot_town_prosperity, ":new_prosperity"),
(call_script, "script_get_prosperity_text_to_s50", ":center_no"),
(str_store_string, s4, s50),
(try_begin),
(party_slot_eq, ":center_no", slot_town_lord, "trp_player"),
(display_message, "@Prosperity of {s2} has changed from {s3} to {s4}."),
(try_end),
(call_script, "script_update_center_notes", ":center_no"),
(else_try),
(party_set_slot, ":center_no", slot_town_prosperity, ":new_prosperity"),
(try_end),
Например, если вы поставите значение 3, то будете видеть только сообщения типа:
" ... изменено с 2 на 3", " ... изменено с 11 на 12", " ... изменено с 32 на 33" и т.д.
Если поставите 15, то сообщения:
" ... изменено с 14 на 15", " ... изменено с 29 на 30", " ... изменено с 59 на 60" и т.д.
По умолчанию стояло 20. Это значило, что выводится будут только 5 версий:
"... с 19 на 20", " ... с 39 на 40", " ... с 59 на 60", " ... с 79 на 80", " ... с 99 на 100", что соответствовало их же пяти текстовым аналогам "очень низкий", "низкий", "средний", "высокий", "очень высокий"...
" ... изменено с 2 на 3", " ... изменено с 11 на 12", " ... изменено с 32 на 33" и т.д.
Если поставите 15, то сообщения:
" ... изменено с 14 на 15", " ... изменено с 29 на 30", " ... изменено с 59 на 60" и т.д.
По умолчанию стояло 20. Это значило, что выводится будут только 5 версий:
"... с 19 на 20", " ... с 39 на 40", " ... с 59 на 60", " ... с 79 на 80", " ... с 99 на 100", что соответствовало их же пяти текстовым аналогам "очень низкий", "низкий", "средний", "высокий", "очень высокий"...
7. Заставляем ваш эскорт разбивать лагерь вместе с вами.
Вас никогда не удивляло (или раздражало), что когда вы маршал, вы ведете за собой целую армию, то при разбитии лагеря палатка появляется только у группы главного героя? А все остальные отряды стоят сбоку, как придурки =)
Так вот! Настало время это исправить! Добавим же палатки всем, вас сопровождающим.
Чтобы сделать скрипт более универсальным, я решил добавить новую переменную (слот группы), которая будет хранить старую иконку отряда, чтобы потом поставить ее вместо иконки палатки.
module_constants.py:
Не обязаттельно ставить ID именно 72. Вполне вероятно, у вас там есть слоты и из других модов или моих же скриптов. Просто поставьте ID на 1 больше, чем в предыдущей строки.
Теперь перейдем к основной части. К большому счастью, предусмотрительные разработчики оставили нам один интересный скрипт - скрипт модификации скорости отряда. Помимо того, что он примерно раз в 2 секунды выполняется для каждого движущего отряда (города и деревни уже отсеяны, что просто замечательно), мы так же воспользуемся его основной функцией. Вам же не надо ходячих палаток? =).
Найдите в module_scripts.py скрипт под названием "game_get_party_speed_multiplier". По умолчанию он весь закомментирован по ненадобности (при этом множитель скорости равен единице). Для начала удалите все знаки комментария в начале строк. В редакторе "PythonWin" достаточно выделить строки и нажать Alt+4.
После чего добавим в него основной код наработки:
Как вы могли заметить, я не стал привязывать обнуление скорости к лагерю игрока. Вместо этого нулевая скорость просто-напросто ставится всем отрядам с иконкой палатки. А уже иконка палатки ставится для эскорта игрока, если игрок разбил лагерь.
Описание работы скрипта:
Если игрока сопровождают другие отряды (приказ "следуйте за мной"), то, при разбитии игроком лагеря, сопровождающие отряды, находящиеся вблизи игрока так же разобьют лагеря. При этом они не смогут передвигаться, так что будьте аккуратнее. Отряды, которые находятся где-то далеко, разобьют лагерь только тогда, когда догонят отряд игрока. При снятии лагеря возможна задержка в 1-2 секунды перед снятием лагеря у сопровождающих групп.
Некоторые предостережения:
Скрипт проверяет основной режим ИИ у отрядов, а не текущий. Разница между ними такова, что если вы прикажете отряду следовать за вами, то это будет основной режим. Но если по дороге отряд начнет убегать от бандитов, то побег - это текущий ИИ. И после погони отряд опять начнет следовать к вам.
Исходя из этого следует заметить, что отряды, которые сидят в режиме лагеря, не смогут убегать от врагов, а так же снять с себя лагерь и напасть на них. Если вы хотите использовать для проверки текущий ИИ вместо основного, то замените в скрипте операции "get_party_ai_object" и "get_party_ai_behavior" на операции "get_party_ai_current_object" и "get_party_ai_current_behavior".
Иконка палатки никак не влияет на решения игры на счет действий лордов. То есть, если лорду "надоест" за вами следовать - у него смениться режим ИИ и лагерь будет снят при следующем вызове вышеупомянутого скрипта (то есть, уже через 1-2 секунды).
Ну, вроде бы, все! Теперь вы готовы пользоваться данным скриптом =)
Вы только посмотрите, какая красота получилась:
Так вот! Настало время это исправить! Добавим же палатки всем, вас сопровождающим.
Чтобы сделать скрипт более универсальным, я решил добавить новую переменную (слот группы), которая будет хранить старую иконку отряда, чтобы потом поставить ее вместо иконки палатки.
module_constants.py:
slot_party_last_in_home_center = 69 #used for AI
slot_party_leader_last_courted = 70 #used for AI
slot_party_last_in_any_center = 71 #used for AI
slot_party_own_icon = 72 # | escort icons
slot_party_leader_last_courted = 70 #used for AI
slot_party_last_in_any_center = 71 #used for AI
slot_party_own_icon = 72 # | escort icons
Теперь перейдем к основной части. К большому счастью, предусмотрительные разработчики оставили нам один интересный скрипт - скрипт модификации скорости отряда. Помимо того, что он примерно раз в 2 секунды выполняется для каждого движущего отряда (города и деревни уже отсеяны, что просто замечательно), мы так же воспользуемся его основной функцией. Вам же не надо ходячих палаток? =).
Найдите в module_scripts.py скрипт под названием "game_get_party_speed_multiplier". По умолчанию он весь закомментирован по ненадобности (при этом множитель скорости равен единице).
## #script_game_get_party_speed_multiplier
## # This script is called from the game engine when a skill's modifiers are needed
## # INPUT: arg1 = party_no
## # OUTPUT: trigger_result = multiplier (scaled by 100, meaning that giving 100 as the trigger result does not change the party speed)
## ("game_get_party_speed_multiplier",
## [
## (store_script_param, ":party_no", 1),
## (set_trigger_result, 100),
## ]),
## # This script is called from the game engine when a skill's modifiers are needed
## # INPUT: arg1 = party_no
## # OUTPUT: trigger_result = multiplier (scaled by 100, meaning that giving 100 as the trigger result does not change the party speed)
## ("game_get_party_speed_multiplier",
## [
## (store_script_param, ":party_no", 1),
## (set_trigger_result, 100),
## ]),
После чего добавим в него основной код наработки:
#script_game_get_party_speed_multiplier
# This script is called from the game engine when a skill's modifiers are needed
# INPUT: arg1 = party_no
# OUTPUT: trigger_result = multiplier (scaled by 100, meaning that giving 100 as the trigger result does not change the party speed)
("game_get_party_speed_multiplier",
[
(store_script_param, ":party_no", 1),
(assign, ":party_icon", -1),
(try_begin),
(eq, "$g_player_icon_state", pis_camping),
(party_get_icon, ":party_icon", ":party_no"),
(neq, ":party_icon", "icon_camp"),
(assign, ":party_ai_object", -1),
(get_party_ai_object, ":party_ai_object", ":party_no"),
(eq, ":party_ai_object", "p_main_party"),
(assign, ":party_ai_behavior", -1),
(get_party_ai_behavior, ":party_ai_behavior", ":party_no"),
(eq, ":party_ai_behavior", ai_bhvr_escort_party),
(assign, ":distance", -1),
(store_distance_to_party_from_party, ":distance", ":party_no", "p_main_party"),
(le, ":distance", 1),
(party_set_slot, ":party_no", slot_party_own_icon, ":party_icon"),
(party_set_icon, ":party_no", "icon_camp"),
(else_try),
(neq, "$g_player_icon_state", pis_camping),
(party_get_icon, ":party_icon", ":party_no"),
(eq, ":party_icon", "icon_camp"),
(party_get_slot, ":party_icon", ":party_no", slot_party_own_icon),
(party_set_icon, ":party_no", ":party_icon"),
(try_end),
(try_begin),
(party_get_icon, ":party_icon", ":party_no"),
(eq, ":party_icon", "icon_camp"),
(set_trigger_result, 0),
(else_try),
(set_trigger_result, 100),
(try_end),
]),
# This script is called from the game engine when a skill's modifiers are needed
# INPUT: arg1 = party_no
# OUTPUT: trigger_result = multiplier (scaled by 100, meaning that giving 100 as the trigger result does not change the party speed)
("game_get_party_speed_multiplier",
[
(store_script_param, ":party_no", 1),
(assign, ":party_icon", -1),
(try_begin),
(eq, "$g_player_icon_state", pis_camping),
(party_get_icon, ":party_icon", ":party_no"),
(neq, ":party_icon", "icon_camp"),
(assign, ":party_ai_object", -1),
(get_party_ai_object, ":party_ai_object", ":party_no"),
(eq, ":party_ai_object", "p_main_party"),
(assign, ":party_ai_behavior", -1),
(get_party_ai_behavior, ":party_ai_behavior", ":party_no"),
(eq, ":party_ai_behavior", ai_bhvr_escort_party),
(assign, ":distance", -1),
(store_distance_to_party_from_party, ":distance", ":party_no", "p_main_party"),
(le, ":distance", 1),
(party_set_slot, ":party_no", slot_party_own_icon, ":party_icon"),
(party_set_icon, ":party_no", "icon_camp"),
(else_try),
(neq, "$g_player_icon_state", pis_camping),
(party_get_icon, ":party_icon", ":party_no"),
(eq, ":party_icon", "icon_camp"),
(party_get_slot, ":party_icon", ":party_no", slot_party_own_icon),
(party_set_icon, ":party_no", ":party_icon"),
(try_end),
(try_begin),
(party_get_icon, ":party_icon", ":party_no"),
(eq, ":party_icon", "icon_camp"),
(set_trigger_result, 0),
(else_try),
(set_trigger_result, 100),
(try_end),
]),
Описание работы скрипта:
Если игрока сопровождают другие отряды (приказ "следуйте за мной"), то, при разбитии игроком лагеря, сопровождающие отряды, находящиеся вблизи игрока так же разобьют лагеря. При этом они не смогут передвигаться, так что будьте аккуратнее. Отряды, которые находятся где-то далеко, разобьют лагерь только тогда, когда догонят отряд игрока. При снятии лагеря возможна задержка в 1-2 секунды перед снятием лагеря у сопровождающих групп.
Некоторые предостережения:
Скрипт проверяет основной режим ИИ у отрядов, а не текущий. Разница между ними такова, что если вы прикажете отряду следовать за вами, то это будет основной режим. Но если по дороге отряд начнет убегать от бандитов, то побег - это текущий ИИ. И после погони отряд опять начнет следовать к вам.
Исходя из этого следует заметить, что отряды, которые сидят в режиме лагеря, не смогут убегать от врагов, а так же снять с себя лагерь и напасть на них. Если вы хотите использовать для проверки текущий ИИ вместо основного, то замените в скрипте операции "get_party_ai_object" и "get_party_ai_behavior" на операции "get_party_ai_current_object" и "get_party_ai_current_behavior".
Иконка палатки никак не влияет на решения игры на счет действий лордов. То есть, если лорду "надоест" за вами следовать - у него смениться режим ИИ и лагерь будет снят при следующем вызове вышеупомянутого скрипта (то есть, уже через 1-2 секунды).
Ну, вроде бы, все! Теперь вы готовы пользоваться данным скриптом =)
Вы только посмотрите, какая красота получилась:
8. Королю - королевское! Маршалу - маршальское! Бонус к размеру армии.
А вы тоже заметили, что если вы становитесь королем собственной фракции, то не получаете никакого +100 к размеру армии? А когда вы маршал - где заслуженные +20? А ведь все другие короли и маршалы их получают:
Да и вообще вы должны еще получать +20 каждый свой замок! Какая несправедливость!
Сейчас мы дадим вам все, заслуженное по праву!
Итак, идем в module_scripts.py, ищем скудненький скрипт расчета размера отряда game_get_party_companion_limit, в котором нет никаких вышеупомянутых бонусов , и добавляем их:
Бонусы замков ({!} города ни деревни его не дают) и маршала будут работать не только для фракции игрока. Проверка на короля тоже универсальная, но тут все равно только один вариант - "фракция игрока".
По-умолчанию бонусы суммируются. Однако, чтобы не было очень жирно, я запретил королю иметь бонус маршала и бонус от замков. +100 покрывает все их с лихвой. Впрочем, вы можете закомментировать эти условия (они с примечанием "King have no {какой-то} bonus").
Это еще не все. Теперь надо добавить показ этих бонусов в отчеты. А то не будет понятно, откуда они вообще взялись. Отчеты у нас сделаны в module_game_menus.py (а не в module_presentations.py, как могло показатся). Ищем меню party_size_report и добавляем пару строк и условий их вывода:
Не пропустите маленькое добавление в самом списке бонусов (str_store_string) =).
При отсутствии бонуса (равен нулю), строчки с бонусом не будет. Так что не стоит сразу паниковать при отсутствии новой строчки - убедитесь, что вы действительно должны получать этот бонус.
С бонусами - все!
Однако есть одна загвоздка... +100 армии получили. А что потом делать с лишними -100 к морали (боевого духа) за набранные войска? У NPC ведь морали нет, короли набирают чуть ли не под 400 рыл и у них никто не диззертирует и не ноет... Да и с другой стороны, почему, если вы - король, то нет никакого бонуса морали? Служить в королевком отряде вообще должно быть для воинов большой честью!
Если вы тоже так считаете, давайте добавим для всех бонусов столько же морали, сколько прибавляется размера отряда. Имеется ввиду, что король может водить +100 человек без последствий для боевого духа отряда.
Итак, тот же module_scripts.py, скрипт get_player_party_morale_values:
Новые переменные я создал на всякий случай, на будущее. Чтобы потом не менять их еще и в отчетах, если захочется изменить размер бонуса. Сейчас бонус морали получится равен по количеству бонуса размера отряда.
Ну и, опять же, добавим вывод этих бонусов в отчет.
Однако, непонятно почему это отличается от отчета размера отряда , тут строка прописана не в меню, а в module_strings.py. Туда следует добавить пару заменяемых фраз, которые будут выводиться при наличии новых бонусов: Все! Можно наслаждаться привилегиями вашего звания!
# script_party_get_ideal_size @used for NPC parties.
# Input: arg1 = party_no
# Output: reg0: ideal size
("party_get_ideal_size",
[
(store_script_param_1, ":party_no"),
#default limit is 30 for any party
(assign, ":limit", 30),
(try_begin),
(party_slot_eq, ":party_no", slot_party_type, spt_kingdom_hero_party),
(party_stack_get_troop_id, ":party_leader", ":party_no", 0),
(store_faction_of_party, ":faction_id", ":party_no"),
#default limit is 10 for kingdom lords
(assign, ":limit", 10),
#each (leadership level) gives 5 to limit
(store_skill_level, ":skill", "skl_leadership", ":party_leader"),
(store_attribute_level, ":charisma", ":party_leader", ca_charisma),
(val_mul, ":skill", 5),
(val_add, ":limit", ":skill"),
#each (charisma level) gives 1 to limit
(val_add, ":limit", ":charisma"),
#each (25 renown) gives 1 to limit
(troop_get_slot, ":troop_renown", ":party_leader", slot_troop_renown),
(store_div, ":renown_bonus", ":troop_renown", 25),
(val_add, ":limit", ":renown_bonus"),
#if this party is faction leader it takes additional 100 limit
(try_begin),
(faction_slot_eq, ":faction_id", slot_faction_leader, ":party_leader"),
(val_add, ":limit", 100),
(try_end),
#if this party is faction marshall it takes additional 20 limit
(try_begin),
(faction_slot_eq, ":faction_id", slot_faction_marshall, ":party_leader"),
(val_add, ":limit", 20),
(try_end),
#party takes additional 20 limit per each castle it's party leader owns
(try_for_range, ":cur_center", castles_begin, castles_end),
(party_slot_eq, ":cur_center", slot_town_lord, ":party_leader"),
(val_add, ":limit", 20),
(try_end),
(try_end),
#if player has level of 0 then ideal limit will be exactly same, if player has level of 80 then ideal limit will be multiplied by 2 ((80 + 80) / 80)
#below code will increase limits a little as the game progresses and player gains level
(store_character_level, ":level", "trp_player"),
(val_min, ":level", 80),
(store_add, ":level_factor", 80, ":level"),
(val_mul, ":limit", ":level_factor"),
(val_div, ":limit", 80),
(assign, reg0, ":limit"),
]),
# Input: arg1 = party_no
# Output: reg0: ideal size
("party_get_ideal_size",
[
(store_script_param_1, ":party_no"),
#default limit is 30 for any party
(assign, ":limit", 30),
(try_begin),
(party_slot_eq, ":party_no", slot_party_type, spt_kingdom_hero_party),
(party_stack_get_troop_id, ":party_leader", ":party_no", 0),
(store_faction_of_party, ":faction_id", ":party_no"),
#default limit is 10 for kingdom lords
(assign, ":limit", 10),
#each (leadership level) gives 5 to limit
(store_skill_level, ":skill", "skl_leadership", ":party_leader"),
(store_attribute_level, ":charisma", ":party_leader", ca_charisma),
(val_mul, ":skill", 5),
(val_add, ":limit", ":skill"),
#each (charisma level) gives 1 to limit
(val_add, ":limit", ":charisma"),
#each (25 renown) gives 1 to limit
(troop_get_slot, ":troop_renown", ":party_leader", slot_troop_renown),
(store_div, ":renown_bonus", ":troop_renown", 25),
(val_add, ":limit", ":renown_bonus"),
#if this party is faction leader it takes additional 100 limit
(try_begin),
(faction_slot_eq, ":faction_id", slot_faction_leader, ":party_leader"),
(val_add, ":limit", 100),
(try_end),
#if this party is faction marshall it takes additional 20 limit
(try_begin),
(faction_slot_eq, ":faction_id", slot_faction_marshall, ":party_leader"),
(val_add, ":limit", 20),
(try_end),
#party takes additional 20 limit per each castle it's party leader owns
(try_for_range, ":cur_center", castles_begin, castles_end),
(party_slot_eq, ":cur_center", slot_town_lord, ":party_leader"),
(val_add, ":limit", 20),
(try_end),
(try_end),
#if player has level of 0 then ideal limit will be exactly same, if player has level of 80 then ideal limit will be multiplied by 2 ((80 + 80) / 80)
#below code will increase limits a little as the game progresses and player gains level
(store_character_level, ":level", "trp_player"),
(val_min, ":level", 80),
(store_add, ":level_factor", 80, ":level"),
(val_mul, ":limit", ":level_factor"),
(val_div, ":limit", 80),
(assign, reg0, ":limit"),
]),
Сейчас мы дадим вам все, заслуженное по праву!
Итак, идем в module_scripts.py, ищем скудненький скрипт расчета размера отряда game_get_party_companion_limit, в котором нет никаких вышеупомянутых бонусов , и добавляем их:
#script_game_get_party_companion_limit:
# This script is called from the game engine when the companion limit is needed for a party.
# INPUT: arg1 = none
# OUTPUT: reg0 = companion_limit
("game_get_party_companion_limit",
[
(assign, ":troop_no", "trp_player"),
(assign, ":limit", 30),
(store_skill_level, ":skill", "skl_leadership", ":troop_no"),
(store_attribute_level, ":charisma", ":troop_no", ca_charisma),
(val_mul, ":skill", 5),
(val_add, ":limit", ":skill"),
(val_add, ":limit", ":charisma"),
# Arantir | Lord`s bonuses +
(assign, "$g_player_party_limit_modifier_king", 0),
(assign, "$g_player_party_limit_modifier_marshal", 0),
(assign, "$g_player_party_limit_modifier_lord", 0),
(try_begin),
(faction_slot_eq, "fac_player_supporters_faction", slot_faction_state, sfs_active),
(assign, ":faction_id", -1),
(store_troop_faction, ":faction_id", "trp_player"),
#if this party is faction leader it takes additional 100 limit
(try_begin),
(faction_slot_eq, ":faction_id", slot_faction_leader, "trp_player"),
(val_add, "$g_player_party_limit_modifier_king", 100),
(try_end),
#if this party is faction marshall it takes additional 20 limit
(try_begin),
(neg|faction_slot_eq, ":faction_id", slot_faction_leader, "trp_player"), # King have no marshal's bonus
(faction_slot_eq, ":faction_id", slot_faction_marshall, "trp_player"),
(val_add, "$g_player_party_limit_modifier_marshal", 20),
(try_end),
#party takes additional 20 limit per each castle it's party leader owns
(try_begin),
(neg|faction_slot_eq, ":faction_id", slot_faction_leader, "trp_player"), # King have no boundaries' bonus
(neg|faction_slot_eq, ":faction_id", slot_faction_marshall, "trp_player"),
(try_for_range, ":cur_center", castles_begin, castles_end),
(party_slot_eq, ":cur_center", slot_town_lord, "trp_player"),
(val_add, "$g_player_party_limit_modifier_lord", 20),
(try_end),
(try_end),
(val_add, ":limit", "$g_player_party_limit_modifier_king"),
(val_add, ":limit", "$g_player_party_limit_modifier_marshal"),
(val_add, ":limit", "$g_player_party_limit_modifier_lord"),
(try_end),
# Arantir | Lord`s bonuses -
(troop_get_slot, ":troop_renown", ":troop_no", slot_troop_renown),
(store_div, ":renown_bonus", ":troop_renown", 25),
(val_add, ":limit", ":renown_bonus"),
(assign, reg0, ":limit"),
(set_trigger_result, reg0),
]),
# This script is called from the game engine when the companion limit is needed for a party.
# INPUT: arg1 = none
# OUTPUT: reg0 = companion_limit
("game_get_party_companion_limit",
[
(assign, ":troop_no", "trp_player"),
(assign, ":limit", 30),
(store_skill_level, ":skill", "skl_leadership", ":troop_no"),
(store_attribute_level, ":charisma", ":troop_no", ca_charisma),
(val_mul, ":skill", 5),
(val_add, ":limit", ":skill"),
(val_add, ":limit", ":charisma"),
# Arantir | Lord`s bonuses +
(assign, "$g_player_party_limit_modifier_king", 0),
(assign, "$g_player_party_limit_modifier_marshal", 0),
(assign, "$g_player_party_limit_modifier_lord", 0),
(try_begin),
(faction_slot_eq, "fac_player_supporters_faction", slot_faction_state, sfs_active),
(assign, ":faction_id", -1),
(store_troop_faction, ":faction_id", "trp_player"),
#if this party is faction leader it takes additional 100 limit
(try_begin),
(faction_slot_eq, ":faction_id", slot_faction_leader, "trp_player"),
(val_add, "$g_player_party_limit_modifier_king", 100),
(try_end),
#if this party is faction marshall it takes additional 20 limit
(try_begin),
(neg|faction_slot_eq, ":faction_id", slot_faction_leader, "trp_player"), # King have no marshal's bonus
(faction_slot_eq, ":faction_id", slot_faction_marshall, "trp_player"),
(val_add, "$g_player_party_limit_modifier_marshal", 20),
(try_end),
#party takes additional 20 limit per each castle it's party leader owns
(try_begin),
(neg|faction_slot_eq, ":faction_id", slot_faction_leader, "trp_player"), # King have no boundaries' bonus
(neg|faction_slot_eq, ":faction_id", slot_faction_marshall, "trp_player"),
(try_for_range, ":cur_center", castles_begin, castles_end),
(party_slot_eq, ":cur_center", slot_town_lord, "trp_player"),
(val_add, "$g_player_party_limit_modifier_lord", 20),
(try_end),
(try_end),
(val_add, ":limit", "$g_player_party_limit_modifier_king"),
(val_add, ":limit", "$g_player_party_limit_modifier_marshal"),
(val_add, ":limit", "$g_player_party_limit_modifier_lord"),
(try_end),
# Arantir | Lord`s bonuses -
(troop_get_slot, ":troop_renown", ":troop_no", slot_troop_renown),
(store_div, ":renown_bonus", ":troop_renown", 25),
(val_add, ":limit", ":renown_bonus"),
(assign, reg0, ":limit"),
(set_trigger_result, reg0),
]),
По-умолчанию бонусы суммируются. Однако, чтобы не было очень жирно, я запретил королю иметь бонус маршала и бонус от замков. +100 покрывает все их с лихвой. Впрочем, вы можете закомментировать эти условия (они с примечанием "King have no {какой-то} bonus").
Это еще не все. Теперь надо добавить показ этих бонусов в отчеты. А то не будет понятно, откуда они вообще взялись. Отчеты у нас сделаны в module_game_menus.py (а не в module_presentations.py, как могло показатся). Ищем меню party_size_report и добавляем пару строк и условий их вывода:
("party_size_report",0,
"{s1}",
"none",
[(call_script, "script_game_get_party_companion_limit"),
(assign, ":party_size_limit", reg0),
(store_skill_level, ":leadership", "skl_leadership", "trp_player"),
(val_mul, ":leadership", 5),
(store_attribute_level, ":charisma", "trp_player", ca_charisma),
(troop_get_slot, ":renown", "trp_player", slot_troop_renown),
(val_div, ":renown", 25),
(try_begin),
(gt, ":leadership", 0),
(str_store_string, s2, "@{!} +"),
(else_try),
(str_store_string, s2, "str_space"),
(try_end),
(try_begin),
(gt, ":charisma", 0),
(str_store_string, s3, "@{!} +"),
(else_try),
(str_store_string, s3, "str_space"),
(try_end),
(try_begin),
(gt, ":renown", 0),
(str_store_string, s4, "@{!} +"),
(else_try),
(str_store_string, s4, "str_space"),
(try_end),
# Lord`s bonuses +
(try_begin),
(gt, "$g_player_party_limit_modifier_king", 0),
(assign, reg6, "$g_player_party_limit_modifier_king"),
(str_store_string, s7, "@{!}^King's Rank: +{reg6}"),
(else_try),
(str_store_string, s7, "str_space"),
(try_end),
(try_begin),
(gt, "$g_player_party_limit_modifier_marshal", 0),
(assign, reg6, "$g_player_party_limit_modifier_marshal"),
(str_store_string, s8, "@{!}^Marshal's Rank: +{reg6}"),
(else_try),
(str_store_string, s8, "str_space"),
(try_end),
(try_begin),
(gt, "$g_player_party_limit_modifier_lord", 0),
(assign, reg6, "$g_player_party_limit_modifier_lord"),
(str_store_string, s9, "@{!}^Castles' Boundaries: +{reg6}"),
(else_try),
(str_store_string, s9, "str_space"),
(try_end),
# Lord`s bonuses -
(assign, reg5, ":party_size_limit"),
(assign, reg1, ":leadership"),
(assign, reg2, ":charisma"),
(assign, reg3, ":renown"),
(str_store_string, s1, "@Current party size limit is {reg5}.^Current party size modifiers are:^^Base size: +30^Leadership: {s2}{reg1}^Charisma: {s3}{reg2}^Renown: {s4}{reg3}{s7}{s8}{s9}^TOTAL: {reg5}"),
],
[
("continue",[],"Continue...",
[(jump_to_menu, "mnu_reports"),
]
),
]
),
"{s1}",
"none",
[(call_script, "script_game_get_party_companion_limit"),
(assign, ":party_size_limit", reg0),
(store_skill_level, ":leadership", "skl_leadership", "trp_player"),
(val_mul, ":leadership", 5),
(store_attribute_level, ":charisma", "trp_player", ca_charisma),
(troop_get_slot, ":renown", "trp_player", slot_troop_renown),
(val_div, ":renown", 25),
(try_begin),
(gt, ":leadership", 0),
(str_store_string, s2, "@{!} +"),
(else_try),
(str_store_string, s2, "str_space"),
(try_end),
(try_begin),
(gt, ":charisma", 0),
(str_store_string, s3, "@{!} +"),
(else_try),
(str_store_string, s3, "str_space"),
(try_end),
(try_begin),
(gt, ":renown", 0),
(str_store_string, s4, "@{!} +"),
(else_try),
(str_store_string, s4, "str_space"),
(try_end),
# Lord`s bonuses +
(try_begin),
(gt, "$g_player_party_limit_modifier_king", 0),
(assign, reg6, "$g_player_party_limit_modifier_king"),
(str_store_string, s7, "@{!}^King's Rank: +{reg6}"),
(else_try),
(str_store_string, s7, "str_space"),
(try_end),
(try_begin),
(gt, "$g_player_party_limit_modifier_marshal", 0),
(assign, reg6, "$g_player_party_limit_modifier_marshal"),
(str_store_string, s8, "@{!}^Marshal's Rank: +{reg6}"),
(else_try),
(str_store_string, s8, "str_space"),
(try_end),
(try_begin),
(gt, "$g_player_party_limit_modifier_lord", 0),
(assign, reg6, "$g_player_party_limit_modifier_lord"),
(str_store_string, s9, "@{!}^Castles' Boundaries: +{reg6}"),
(else_try),
(str_store_string, s9, "str_space"),
(try_end),
# Lord`s bonuses -
(assign, reg5, ":party_size_limit"),
(assign, reg1, ":leadership"),
(assign, reg2, ":charisma"),
(assign, reg3, ":renown"),
(str_store_string, s1, "@Current party size limit is {reg5}.^Current party size modifiers are:^^Base size: +30^Leadership: {s2}{reg1}^Charisma: {s3}{reg2}^Renown: {s4}{reg3}{s7}{s8}{s9}^TOTAL: {reg5}"),
],
[
("continue",[],"Continue...",
[(jump_to_menu, "mnu_reports"),
]
),
]
),
При отсутствии бонуса (равен нулю), строчки с бонусом не будет. Так что не стоит сразу паниковать при отсутствии новой строчки - убедитесь, что вы действительно должны получать этот бонус.
С бонусами - все!
Однако есть одна загвоздка... +100 армии получили. А что потом делать с лишними -100 к морали (боевого духа) за набранные войска? У NPC ведь морали нет, короли набирают чуть ли не под 400 рыл и у них никто не диззертирует и не ноет... Да и с другой стороны, почему, если вы - король, то нет никакого бонуса морали? Служить в королевком отряде вообще должно быть для воинов большой честью!
Если вы тоже так считаете, давайте добавим для всех бонусов столько же морали, сколько прибавляется размера отряда. Имеется ввиду, что король может водить +100 человек без последствий для боевого духа отряда.
Итак, тот же module_scripts.py, скрипт get_player_party_morale_values:
# script_get_player_party_morale_values
# Output: reg0 = player_party_morale_target
("get_player_party_morale_values",
[
(party_get_num_companion_stacks, ":num_stacks","p_main_party"),
(assign, ":num_men", 0),
(try_for_range, ":i_stack", 1, ":num_stacks"),
(party_stack_get_troop_id, ":stack_troop","p_main_party",":i_stack"),
(try_begin),
(troop_is_hero, ":stack_troop"),
(val_add, ":num_men", 1), #it was 3 in "Mount&Blade", now it is 1 in Warband
(else_try),
(party_stack_get_size, ":stack_size","p_main_party",":i_stack"),
(val_add, ":num_men", ":stack_size"),
(try_end),
(try_end),
(assign, "$g_player_party_morale_modifier_party_size", ":num_men"),
(store_skill_level, ":player_leadership", "skl_leadership", "trp_player"),
(try_begin),
(eq, "$players_kingdom", "fac_player_supporters_faction"),
(faction_get_slot, ":cur_faction_king", "$players_kingdom", slot_faction_leader),
(eq, ":cur_faction_king", "trp_player"),
(store_mul, "$g_player_party_morale_modifier_leadership", ":player_leadership", 15),
(else_try),
(store_mul, "$g_player_party_morale_modifier_leadership", ":player_leadership", 12),
(try_end),
(assign, ":new_morale", "$g_player_party_morale_modifier_leadership"),
(val_sub, ":new_morale", "$g_player_party_morale_modifier_party_size"),
(val_add, ":new_morale", 50),
(assign, "$g_player_party_morale_modifier_food", 0),
(try_for_range, ":cur_edible", food_begin, food_end),
(call_script, "script_cf_player_has_item_without_modifier", ":cur_edible", imod_rotten),
(item_get_slot, ":food_bonus", ":cur_edible", slot_item_food_bonus),
(val_mul, ":food_bonus", 3),
(val_div, ":food_bonus", 2),
(val_add, "$g_player_party_morale_modifier_food", ":food_bonus"),
(try_end),
(val_add, ":new_morale", "$g_player_party_morale_modifier_food"),
(try_begin),
(eq, "$g_player_party_morale_modifier_food", 0),
(assign, "$g_player_party_morale_modifier_no_food", 30),
(val_sub, ":new_morale", "$g_player_party_morale_modifier_no_food"),
(else_try),
(assign, "$g_player_party_morale_modifier_no_food", 0),
(try_end),
# Lord`s Bonuses +
(assign, "$g_player_party_morale_modifier_king", 0),
(assign, "$g_player_party_morale_modifier_marshal", 0),
(assign, "$g_player_party_morale_modifier_lord", 0),
(val_add, "$g_player_party_morale_modifier_king", "$g_player_party_limit_modifier_king"),
(val_add, "$g_player_party_morale_modifier_marshal", "$g_player_party_limit_modifier_marshal"),
(val_add, "$g_player_party_morale_modifier_lord", "$g_player_party_limit_modifier_lord"),
(val_add, ":new_morale", "$g_player_party_morale_modifier_king"),
(val_add, ":new_morale", "$g_player_party_morale_modifier_marshal"),
(val_add, ":new_morale", "$g_player_party_morale_modifier_lord"),
# Lord`s Bonuses -
(assign, "$g_player_party_morale_modifier_debt", 0),
(try_begin),
(gt, "$g_player_debt_to_party_members", 0),
(call_script, "script_calculate_player_faction_wage"),
(assign, ":total_wages", reg0),
(store_mul, "$g_player_party_morale_modifier_debt", "$g_player_debt_to_party_members", 10),
(val_max, ":total_wages", 1),
(val_div, "$g_player_party_morale_modifier_debt", ":total_wages"),
(val_clamp, "$g_player_party_morale_modifier_debt", 1, 31),
(val_sub, ":new_morale", "$g_player_party_morale_modifier_debt"),
(try_end),
(val_clamp, ":new_morale", 0, 100),
(assign, reg0, ":new_morale"),
]),
# Output: reg0 = player_party_morale_target
("get_player_party_morale_values",
[
(party_get_num_companion_stacks, ":num_stacks","p_main_party"),
(assign, ":num_men", 0),
(try_for_range, ":i_stack", 1, ":num_stacks"),
(party_stack_get_troop_id, ":stack_troop","p_main_party",":i_stack"),
(try_begin),
(troop_is_hero, ":stack_troop"),
(val_add, ":num_men", 1), #it was 3 in "Mount&Blade", now it is 1 in Warband
(else_try),
(party_stack_get_size, ":stack_size","p_main_party",":i_stack"),
(val_add, ":num_men", ":stack_size"),
(try_end),
(try_end),
(assign, "$g_player_party_morale_modifier_party_size", ":num_men"),
(store_skill_level, ":player_leadership", "skl_leadership", "trp_player"),
(try_begin),
(eq, "$players_kingdom", "fac_player_supporters_faction"),
(faction_get_slot, ":cur_faction_king", "$players_kingdom", slot_faction_leader),
(eq, ":cur_faction_king", "trp_player"),
(store_mul, "$g_player_party_morale_modifier_leadership", ":player_leadership", 15),
(else_try),
(store_mul, "$g_player_party_morale_modifier_leadership", ":player_leadership", 12),
(try_end),
(assign, ":new_morale", "$g_player_party_morale_modifier_leadership"),
(val_sub, ":new_morale", "$g_player_party_morale_modifier_party_size"),
(val_add, ":new_morale", 50),
(assign, "$g_player_party_morale_modifier_food", 0),
(try_for_range, ":cur_edible", food_begin, food_end),
(call_script, "script_cf_player_has_item_without_modifier", ":cur_edible", imod_rotten),
(item_get_slot, ":food_bonus", ":cur_edible", slot_item_food_bonus),
(val_mul, ":food_bonus", 3),
(val_div, ":food_bonus", 2),
(val_add, "$g_player_party_morale_modifier_food", ":food_bonus"),
(try_end),
(val_add, ":new_morale", "$g_player_party_morale_modifier_food"),
(try_begin),
(eq, "$g_player_party_morale_modifier_food", 0),
(assign, "$g_player_party_morale_modifier_no_food", 30),
(val_sub, ":new_morale", "$g_player_party_morale_modifier_no_food"),
(else_try),
(assign, "$g_player_party_morale_modifier_no_food", 0),
(try_end),
# Lord`s Bonuses +
(assign, "$g_player_party_morale_modifier_king", 0),
(assign, "$g_player_party_morale_modifier_marshal", 0),
(assign, "$g_player_party_morale_modifier_lord", 0),
(val_add, "$g_player_party_morale_modifier_king", "$g_player_party_limit_modifier_king"),
(val_add, "$g_player_party_morale_modifier_marshal", "$g_player_party_limit_modifier_marshal"),
(val_add, "$g_player_party_morale_modifier_lord", "$g_player_party_limit_modifier_lord"),
(val_add, ":new_morale", "$g_player_party_morale_modifier_king"),
(val_add, ":new_morale", "$g_player_party_morale_modifier_marshal"),
(val_add, ":new_morale", "$g_player_party_morale_modifier_lord"),
# Lord`s Bonuses -
(assign, "$g_player_party_morale_modifier_debt", 0),
(try_begin),
(gt, "$g_player_debt_to_party_members", 0),
(call_script, "script_calculate_player_faction_wage"),
(assign, ":total_wages", reg0),
(store_mul, "$g_player_party_morale_modifier_debt", "$g_player_debt_to_party_members", 10),
(val_max, ":total_wages", 1),
(val_div, "$g_player_party_morale_modifier_debt", ":total_wages"),
(val_clamp, "$g_player_party_morale_modifier_debt", 1, 31),
(val_sub, ":new_morale", "$g_player_party_morale_modifier_debt"),
(try_end),
(val_clamp, ":new_morale", 0, 100),
(assign, reg0, ":new_morale"),
]),
Ну и, опять же, добавим вывод этих бонусов в отчет.
("morale_report",0,
"{s1}",
"none",
[
(call_script, "script_get_player_party_morale_values"),
(assign, ":target_morale", reg0),
(assign, reg1, "$g_player_party_morale_modifier_party_size"),
(try_begin),
(gt, reg1, 0),
(str_store_string, s2, "@{!} -"),
(else_try),
(str_store_string, s2, "str_space"),
(try_end),
(assign, reg2, "$g_player_party_morale_modifier_leadership"),
(try_begin),
(gt, reg2, 0),
(str_store_string, s3, "@{!} +"),
(else_try),
(str_store_string, s3, "str_space"),
(try_end),
(try_begin),
(gt, "$g_player_party_morale_modifier_no_food", 0),
(assign, reg7, "$g_player_party_morale_modifier_no_food"),
(str_store_string, s5, "@^No food: -{reg7}"),
(else_try),
(str_store_string, s5, "str_space"),
(try_end),
(assign, reg3, "$g_player_party_morale_modifier_food"),
(try_begin),
(gt, reg3, 0),
(str_store_string, s4, "@{!} +"),
(else_try),
(str_store_string, s4, "str_space"),
(try_end),
(try_begin),
(gt, "$g_player_party_morale_modifier_debt", 0),
(assign, reg6, "$g_player_party_morale_modifier_debt"),
(str_store_string, s6, "@^Wage debt: -{reg6}"),
(else_try),
(str_store_string, s6, "str_space"),
(try_end),
(party_get_morale, reg5, "p_main_party"),
(store_sub, reg4, reg5, ":target_morale"),
(try_begin),
(gt, reg4, 0),
(str_store_string, s7, "@{!} +"),
(else_try),
(str_store_string, s7, "str_space"),
(try_end),
(assign, reg6, 50),
# Lord`s Bonuses +
(try_begin),
(gt, "$g_player_party_morale_modifier_king", 0),
(assign, reg7, "$g_player_party_morale_modifier_king"),
(str_store_string, s8, "@{!}^King's Rank: +{reg7}"),
(else_try),
(str_store_string, s8, "str_space"),
(try_end),
(try_begin),
(gt, "$g_player_party_morale_modifier_marshal", 0),
(assign, reg7, "$g_player_party_morale_modifier_marshal"),
(str_store_string, s9, "@{!}^Marshal's Rank: +{reg7}"),
(else_try),
(str_store_string, s9, "str_space"),
(try_end),
(try_begin),
(gt, "$g_player_party_morale_modifier_lord", 0),
(assign, reg7, "$g_player_party_morale_modifier_lord"),
(str_store_string, s10, "@{!}^Castles' Boundaries: +{reg7}"),
(else_try),
(str_store_string, s10, "str_space"),
(try_end),
# Lord`s Bonuses -
(str_store_string, s1, "str_current_party_morale_is_reg5_current_party_morale_modifiers_are__base_morale__50_party_size_s2reg1_leadership_s3reg2_food_variety_s4reg3s5s6_recent_events_s7reg4_total__reg5___"),
(try_for_range, ":kingdom_no", npc_kingdoms_begin, npc_kingdoms_end),
(faction_get_slot, ":faction_morale", ":kingdom_no", slot_faction_morale_of_player_troops),
(val_div, ":faction_morale", 100),
(neq, ":faction_morale", 0),
(assign, reg6, ":faction_morale"),
(str_store_faction_name, s9, ":kingdom_no"),
(str_store_string, s1, "str_s1extra_morale_for_s9_troops__reg6_"),
(try_end),
],
[
("continue",[],"Continue...",
[
(jump_to_menu, "mnu_reports"),
]),
]
),
"{s1}",
"none",
[
(call_script, "script_get_player_party_morale_values"),
(assign, ":target_morale", reg0),
(assign, reg1, "$g_player_party_morale_modifier_party_size"),
(try_begin),
(gt, reg1, 0),
(str_store_string, s2, "@{!} -"),
(else_try),
(str_store_string, s2, "str_space"),
(try_end),
(assign, reg2, "$g_player_party_morale_modifier_leadership"),
(try_begin),
(gt, reg2, 0),
(str_store_string, s3, "@{!} +"),
(else_try),
(str_store_string, s3, "str_space"),
(try_end),
(try_begin),
(gt, "$g_player_party_morale_modifier_no_food", 0),
(assign, reg7, "$g_player_party_morale_modifier_no_food"),
(str_store_string, s5, "@^No food: -{reg7}"),
(else_try),
(str_store_string, s5, "str_space"),
(try_end),
(assign, reg3, "$g_player_party_morale_modifier_food"),
(try_begin),
(gt, reg3, 0),
(str_store_string, s4, "@{!} +"),
(else_try),
(str_store_string, s4, "str_space"),
(try_end),
(try_begin),
(gt, "$g_player_party_morale_modifier_debt", 0),
(assign, reg6, "$g_player_party_morale_modifier_debt"),
(str_store_string, s6, "@^Wage debt: -{reg6}"),
(else_try),
(str_store_string, s6, "str_space"),
(try_end),
(party_get_morale, reg5, "p_main_party"),
(store_sub, reg4, reg5, ":target_morale"),
(try_begin),
(gt, reg4, 0),
(str_store_string, s7, "@{!} +"),
(else_try),
(str_store_string, s7, "str_space"),
(try_end),
(assign, reg6, 50),
# Lord`s Bonuses +
(try_begin),
(gt, "$g_player_party_morale_modifier_king", 0),
(assign, reg7, "$g_player_party_morale_modifier_king"),
(str_store_string, s8, "@{!}^King's Rank: +{reg7}"),
(else_try),
(str_store_string, s8, "str_space"),
(try_end),
(try_begin),
(gt, "$g_player_party_morale_modifier_marshal", 0),
(assign, reg7, "$g_player_party_morale_modifier_marshal"),
(str_store_string, s9, "@{!}^Marshal's Rank: +{reg7}"),
(else_try),
(str_store_string, s9, "str_space"),
(try_end),
(try_begin),
(gt, "$g_player_party_morale_modifier_lord", 0),
(assign, reg7, "$g_player_party_morale_modifier_lord"),
(str_store_string, s10, "@{!}^Castles' Boundaries: +{reg7}"),
(else_try),
(str_store_string, s10, "str_space"),
(try_end),
# Lord`s Bonuses -
(str_store_string, s1, "str_current_party_morale_is_reg5_current_party_morale_modifiers_are__base_morale__50_party_size_s2reg1_leadership_s3reg2_food_variety_s4reg3s5s6_recent_events_s7reg4_total__reg5___"),
(try_for_range, ":kingdom_no", npc_kingdoms_begin, npc_kingdoms_end),
(faction_get_slot, ":faction_morale", ":kingdom_no", slot_faction_morale_of_player_troops),
(val_div, ":faction_morale", 100),
(neq, ":faction_morale", 0),
(assign, reg6, ":faction_morale"),
(str_store_faction_name, s9, ":kingdom_no"),
(str_store_string, s1, "str_s1extra_morale_for_s9_troops__reg6_"),
(try_end),
],
[
("continue",[],"Continue...",
[
(jump_to_menu, "mnu_reports"),
]),
]
),
("current_party_morale_is_reg5_current_party_morale_modifiers_are__base_morale__50_party_size_s2reg1_leadership_s3reg2_food_variety_s4reg3s5s6_recent_events_s7reg4_total__reg5___", "Current party morale is {reg5}.^Current party morale modifiers are:^^Base morale: +{reg6}^Party size: {s2}{reg1}^Leadership: {s3}{reg2}^Food variety: {s4}{reg3}{s5}{s6}^Recent events: {s7}{reg4}{s8}{s9}{s10}^TOTAL: {reg5}^^^"),