А вы тоже заметили, что если вы становитесь королем собственной фракции, то не получаете никакого +100 к размеру армии? А когда вы маршал - где заслуженные +20? А ведь все другие короли и маршалы их получают:
# 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"),
]),
Да и вообще вы должны еще получать +20 каждый свой замок! Какая несправедливость!
Сейчас мы дадим вам все, заслуженное по праву!
Итак, идем в
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),
]),
Бонусы замков (
{!} города ни деревни его не дают) и маршала будут работать не только для фракции игрока. Проверка на короля тоже универсальная, но тут все равно только один вариант - "фракция игрока".
По-умолчанию бонусы суммируются. Однако, чтобы не было очень жирно, я запретил королю иметь бонус маршала и бонус от замков. +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"),
]
),
]
),
Не пропустите маленькое добавление в самом списке бонусов (str_store_string) =).
При отсутствии бонуса (равен нулю), строчки с бонусом не будет. Так что не стоит сразу паниковать при отсутствии новой строчки - убедитесь, что вы действительно должны получать этот бонус.
С бонусами - все!
Однако есть одна загвоздка... +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"),
]),
Новые переменные я создал на всякий случай, на будущее. Чтобы потом не менять их еще и в отчетах, если захочется изменить размер бонуса. Сейчас бонус морали получится равен по количеству бонуса размера отряда.
Ну и, опять же, добавим вывод этих бонусов в отчет.
("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"),
]),
]
),
Однако, непонятно почему это отличается от отчета размера отряда =/, тут строка прописана не в меню, а в
module_strings.py. Туда следует добавить пару заменяемых фраз, которые будут выводиться при наличии новых бонусов:
("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}^^^"),
Все! Можно наслаждаться привилегиями вашего звания!