Деревни, города, замки... Все исправно платят вам налоги. Но почему нельзя влиять на эти налоги? Вы же их Лорд, меч мне в... ножны! Сейчас мы попытаемся силой воли и усилием мысли своими руками создать систему налогов.
Примечание:
Для удобства я выделяю все по данной схеме:
Синий - искомый текст.
Зеленый - добавленный текст.
Красный - замененный текст.
Серый - исходный текст файла.
Итак:
Создание системы налогов для Warband1.134, 1.143, 1.153
0. ВведениеДля начала скажу, что делаем моя версия системы налогов. Вы сможете менять налог в диапазоне 0%-200%, где 100% - стандартный, то и так, как бы, очевидно :), а 0% - совсем без налогов, 200% - вся прибыль населения. Стандартное значение я пододвинул под 50% прибыли (средние века все-таки). Изменение налогов приводит к изменению благополучия деревни (со временем, конечно). Понятное дело, что оставив деревню совсем без средств она начнет относительно быстро беднеть, а дав ей полную свободу она начнет процветать...
1. Новые переменныеРаз мы собираемся делать менять налоги, то нам понадобится, что бы игра всегда помнила, какие большущие налоги мы ставим бедным деревенькам. Для этого нам явно понадобятся новые переменные!
Как бы это странно не звучало, но новые переменные мы прописываем в константах :-\ Ну что поделаешь, так уж назвали файл... В
constants после
slot_party_last_in_any_center мы дописываем:
slot_party_leader_last_courted = 70 #used for AI
slot_party_last_in_any_center = 71 #used for AI
slot_party_taxes_level = 72 # | taxes system
slot_party_taxes_accumulate = 73 # | taxes system
slot_castle_exterior = slot_town_center
#slot_town_rebellion_contact = 76
Как видите, для партий такие переменные зовутся слотами...
2. Новые менюУправлять налогами будем из меню. Можно было и диалогами, но всем всегда так впадлу идти к старосте/гильдмастеру, не так ли?
Добавим новый пункт прямо в меню деревни. Итак в
game_menus находим опцию меню
village_wait и после нее добавляем наш пункт:
(change_screen_mission),
]),
("village_wait",
[(party_slot_eq, "$current_town", slot_center_has_manor, 1),
(party_slot_eq, "$current_town", slot_town_lord, "trp_player"),
],
"Wait here for some time.",
[
(assign,"$auto_enter_town","$current_town"),
(assign, "$g_last_rest_center", "$current_town"),
(try_begin),
(party_is_active, "p_main_party"),
(party_get_current_terrain, ":cur_terrain", "p_main_party"),
(try_begin),
(eq, ":cur_terrain", rt_desert),
(unlock_achievement, ACHIEVEMENT_SARRANIDIAN_NIGHTS),
(try_end),
(try_end),
(rest_for_hours_interactive, 24 * 7, 5, 1), #rest while attackable
(change_screen_return),
]),
# taxes system +
("village_change_taxes",
[
(neg|party_slot_eq, "$current_town", slot_village_state, svs_looted),
(neg|party_slot_eq, "$current_town", slot_village_state, svs_being_raided),
(neg|party_slot_ge, "$current_town", slot_village_infested_by_bandits, 1),
(party_slot_eq, "$current_town", slot_town_lord, "trp_player")
],
"Change taxes level.",
[(party_get_slot, reg50, "$current_town", slot_party_taxes_level),
(val_add, reg50, 5),
(val_mul, reg50, 10),
(assign, reg49, reg50),
(val_mul, reg49, 2),
(str_store_party_name, s60, "$current_town"),
(jump_to_menu, "mnu_taxes_sys_change_taxes_level")
]),
# taxes system -
("collect_taxes_qst",[(party_slot_eq, "$current_town", slot_village_state, 0),
(neg|party_slot_ge, "$current_town", slot_village_infested_by_bandits, 1),
(check_quest_active, "qst_collect_taxes"),
(quest_get_slot, ":quest_giver_troop", "qst_collect_taxes", slot_quest_giver_troop),
(quest_slot_eq, "qst_collect_taxes", slot_quest_target_center, "$current_town"),
(neg|quest_slot_eq, "qst_collect_taxes", slot_quest_current_state, 4),
(str_store_troop_name, s1, ":quest_giver_troop"),
По желанию можете добавить это в любом другом месте меню деревни, где вам удобнее. Помните, что заканчиваются опции
]),, а начинаются с
("",. Не промахнитесь...
Альтернативным вариантом могу предложить добавить в меню "Управление деревней". Тоже как бы логично выходит. В этом случае надо вписать вот тут:
(party_slot_eq, "$g_encountered_party", slot_center_has_messenger_post, 0),
],
"Build a messenger post.",[(assign, "$g_improvement_type", slot_center_has_messenger_post),
(jump_to_menu, "mnu_center_improve"),]),
("center_build_prisoner_tower",[(eq, reg6, 0),
(this_or_next|party_slot_eq, "$g_encountered_party", slot_party_type, spt_town),
(party_slot_eq, "$g_encountered_party", slot_party_type, spt_castle),
(party_slot_eq, "$g_encountered_party", slot_center_has_prisoner_tower, 0),
],
"Build a prisoner tower.",[(assign, "$g_improvement_type", slot_center_has_prisoner_tower),
(jump_to_menu, "mnu_center_improve"),]),
("go_back_dot",[],"Go back.",[(jump_to_menu, "$g_next_menu")]),
# taxes system +
("village_change_taxes",
[
(neg|party_slot_eq, "$current_town", slot_village_state, svs_looted),
(neg|party_slot_eq, "$current_town", slot_village_state, svs_being_raided),
(neg|party_slot_ge, "$current_town", slot_village_infested_by_bandits, 1),
(party_slot_eq, "$current_town", slot_town_lord, "trp_player")
],
"Change taxes level.",
[(party_get_slot, reg50, "$current_town", slot_party_taxes_level),
(val_add, reg50, 5),
(val_mul, reg50, 10),
(assign, reg49, reg50),
(val_mul, reg49, 2),
(str_store_party_name, s60, "$current_town"),
(jump_to_menu, "mnu_taxes_sys_change_taxes_level")]),
# taxes system -
],
),
(
"center_improve",0,
"{s19} As the party member with the highest engineer skill ({reg2}), {reg3?you reckon:{s3} reckons} that building the {s4} will cost you\
{reg5} denars and will take {reg6} days.",
"none",
Вписываем аж после всех улучшений, чтобы наше меню не оказалось вперемешку с ними...
Теперь добавим варианты уровня налогов. Для этого надо создать новое меню Новое меню можно добавить в любом месте, давайте сделаем это сразу после меню деревни, что бы ориентироваться проще было.
Обратите внимание, что до этого мы добавляли
опцию, они располагаться внутри меню и есть строчками выбора в меню. А сейчас мы добавляем новое
меню. У них похожая, но разная структура, не путайте их.
Найдем операцию меню
village_leave, знаменующую конец меню деревни, и добавим наше новое с вариантами уровня налогов:
[(jump_to_menu,"mnu_village_hostile_action"),
]),
("village_reports",[(eq, "$cheat_mode", 1),], "{!}CHEAT! Show reports.",
[(jump_to_menu,"mnu_center_reports"),
]),
("village_leave",[],"Leave...",[(change_screen_return,0)]),
],
),
# taxes system +
(
"taxes_sys_change_taxes_level",0,
"You decide to change the level of taxes in {s60}.^Current level: {reg49}% ({reg50}% of profits)^Select a new level of taxes:",
"none",
[],
[
("village_change_taxes_0", [], "0% (no taxes)", [(party_set_slot, "$current_town", slot_party_taxes_level, -5),(jump_to_menu, "mnu_village"),(is_between, "$current_town", towns_begin, towns_end),(jump_to_menu, "mnu_town")]),
("village_change_taxes_10", [], "20% (10% of profits)", [(party_set_slot, "$current_town", slot_party_taxes_level, -4),(jump_to_menu, "mnu_village"),(is_between, "$current_town", towns_begin, towns_end),(jump_to_menu, "mnu_town")]),
("village_change_taxes_20", [], "40% (20% of profits)", [(party_set_slot, "$current_town", slot_party_taxes_level, -3),(jump_to_menu, "mnu_village"),(is_between, "$current_town", towns_begin, towns_end),(jump_to_menu, "mnu_town")]),
("village_change_taxes_30", [], "60% (30% of profits)", [(party_set_slot, "$current_town", slot_party_taxes_level, -2),(jump_to_menu, "mnu_village"),(is_between, "$current_town", towns_begin, towns_end),(jump_to_menu, "mnu_town")]),
("village_change_taxes_40", [], "80% (40% of profits)", [(party_set_slot, "$current_town", slot_party_taxes_level, -1),(jump_to_menu, "mnu_village"),(is_between, "$current_town", towns_begin, towns_end),(jump_to_menu, "mnu_town")]),
("village_change_taxes_50", [], "100% (50% of profits) - Default", [(party_set_slot, "$current_town", slot_party_taxes_level, 0),(jump_to_menu, "mnu_village"),(is_between, "$current_town", towns_begin, towns_end),(jump_to_menu, "mnu_town")]),
("village_change_taxes_60", [], "120% (60% of profits)", [(party_set_slot, "$current_town", slot_party_taxes_level, 1),(jump_to_menu, "mnu_village"),(is_between, "$current_town", towns_begin, towns_end),(jump_to_menu, "mnu_town")]),
("village_change_taxes_70", [], "140% (70% of profits)", [(party_set_slot, "$current_town", slot_party_taxes_level, 2),(jump_to_menu, "mnu_village"),(is_between, "$current_town", towns_begin, towns_end),(jump_to_menu, "mnu_town")]),
("village_change_taxes_80", [], "160% (80% of profits)", [(party_set_slot, "$current_town", slot_party_taxes_level, 3),(jump_to_menu, "mnu_village"),(is_between, "$current_town", towns_begin, towns_end),(jump_to_menu, "mnu_town")]),
("village_change_taxes_90", [], "180% (90% of profits)", [(party_set_slot, "$current_town", slot_party_taxes_level, 4),(jump_to_menu, "mnu_village"),(is_between, "$current_town", towns_begin, towns_end),(jump_to_menu, "mnu_town")]),
("village_change_taxes_100", [], "200% (all the profits)", [(party_set_slot, "$current_town", slot_party_taxes_level, 5),(jump_to_menu, "mnu_village"),(is_between, "$current_town", towns_begin, towns_end),(jump_to_menu, "mnu_town")]),
("village_change_taxes_return", [], "Return.", [(jump_to_menu, "mnu_village"),(is_between, "$current_town", towns_begin, towns_end),(jump_to_menu, "mnu_town")]),
]
),
# taxes system -
(
"village_hostile_action",0,
"What action do you have in mind?",
"none",
[],
Для удобства я добавил в заголовок название деревни и текущий уровень налогов.
Такс, мы забыли еще кое-что. Надо добавить такое же меню и для города. Я добавлял после меню покупок.
], "Door to the garden."),
("trade_with_merchants",
[
(party_slot_eq,"$current_town",slot_party_type, spt_town)
],
"Go to the marketplace.",
[
(try_begin),
(call_script, "script_cf_enter_center_location_bandit_check"),
(else_try),
(jump_to_menu,"mnu_town_trade"),
(try_end),
]),
# taxes system +
("town_change_taxes",
[
(neg|party_slot_eq, "$current_town", slot_village_state, svs_under_siege),
(party_slot_eq, "$current_town", slot_town_lord, "trp_player")
],
"Change taxes.",
[(party_get_slot, reg50, "$current_town", slot_party_taxes_level),
(val_add, reg50, 5),
(val_mul, reg50, 10),
(assign, reg49, reg50),
(val_mul, reg49, 2),
(str_store_party_name, s60, "$current_town"),
(jump_to_menu,"mnu_taxes_sys_change_taxes_level"),
]),
# taxes system -
("walled_center_manage",
[
(neg|party_slot_eq, "$current_town", slot_village_state, svs_under_siege),
(party_slot_eq, "$current_town", slot_town_lord, "trp_player"),
(assign, reg0, 1),
(try_begin),
(party_slot_eq, "$current_town", slot_party_type, spt_castle),
(assign, reg0, 0),
(try_end),
],
"Manage this {reg0?town:castle}.",
[
(assign, "$g_next_menu", "mnu_town"),
(jump_to_menu, "mnu_center_manage"),
]),
Как и в случае улучшений, осажденному замку не до уровня налогов. При осаде менять нельзя.
Город пользуется тем же меню вариантов, что деревня. Оно универсальное.
Если вы хотели сделать еще и городу это меню внутри "Управления", то вы это уже сделали раньше. Само меню "Управление городом/деревней" общее для обоих типов, просто там разные условия на опциях стоят.
2.1. СкриптыТут мелкий корректив, по этому определил в подпункт. По сути это изменение прямо касается п.2.
Еще остались замки. Замки вообще не самостоятельные... Даже благополучие у них от их деревни берется. Раз замок не имеет собственного развития, то и отдельный налог смысла ставить нет. Просто воспользуемся скриптом, находящимся в
scripts, который ставит замкам достаток деревень и всунем туда еще и уровень налогов:
(assign, reg0, ":estimate"),
]),
#script_calculate_castle_prosperities_by_using_its_villages
(
"calculate_castle_prosperities_by_using_its_villages", #This is called from within decide_faction_ai, or from
[
(try_for_range, ":cur_castle", castles_begin, castles_end),
(assign, ":total_prosperity", 0),
(assign, ":total_villages", 0),
(try_for_range, ":cur_village", villages_begin, villages_end),
(party_get_slot, ":bound_center", ":cur_village", slot_village_bound_center),
(eq, ":cur_castle", ":bound_center"),
(party_get_slot, ":village_prosperity", ":cur_village", slot_town_prosperity),
(party_get_slot, ":taxes_level", ":cur_village", slot_party_taxes_level), # | taxes system
(val_add, ":total_prosperity", ":village_prosperity"),
(val_add, ":total_villages", 1),
(try_end),
(try_begin),
(store_div, ":castle_prosperity", ":total_prosperity", ":total_villages"),
(else_try),
(assign, ":castle_prosperity", 50),
(try_end),
(party_set_slot, ":cur_castle", slot_party_taxes_level, ":taxes_level"), # | taxes system
(party_set_slot, ":cur_castle", slot_town_prosperity, ":castle_prosperity"),
(try_end),
]),
#script_initialize_tavern_variables
(
"initialize_tavern_variables",
[
Теперь замки автоматически получат свой уровень налогов от своих деревень.
3. ПрезентацииЧто бы игра тоже поняла, что мы поменяли уровень налогом, то внесем новые строки в presentations в недельную смету, где, собственно, и вычисляются все налоги.
Добавляем как раз недалеко от строки, очень удобной для поиска:
(try_end),
#Enterprise ends, taxes begin
(party_slot_eq, ":center_no", slot_town_lord, "trp_player"),
(party_get_slot, ":accumulated_rents", ":center_no", slot_center_accumulated_rents),
# taxes system +
(party_get_slot, ":taxes_level", ":center_no", slot_party_taxes_level),
(assign, ":rents_differents", ":accumulated_rents"),
(val_div, ":rents_differents", 5),
(val_mul, ":rents_differents", ":taxes_level"),
(val_add, ":accumulated_rents", ":rents_differents"),
# taxes system -
(party_get_slot, ":accumulated_tariffs", ":center_no", slot_center_accumulated_tariffs),
(store_add, ":accumulated_total", ":accumulated_rents", ":accumulated_tariffs"),
(val_add, ":all_centers_accumulated_total", ":accumulated_total"),
Теперь вы абсолютно точно получите столько процентов налога, сколько вы сам установили! Никаких условностей нет. Сухой расчет. Но помните, что скрипты M&B не очень любят дроби, по-этому иногда при налогах 0% вы можете получить приятный подарок в виде 5-20 динаров :lol:
4. ТриггерыСамое интересное! Сейчас мы добавим замудрёную систему изменения благополучия в триггеры!
Ищем пустой триггер, коих там ровно 10, в конце
simple_triggers и вписываем в него вот это:
(val_sub, ":days_to_completion", 1),
(party_set_slot, ":town", slot_center_player_enterprise_days_until_complete, ":days_to_completion"),
(try_end),
]),
(24,
[
# Arantir | Taxes system +
(try_begin),
(try_for_range, ":center_no", centers_begin, centers_end),
(party_slot_eq, ":center_no", slot_town_lord, "trp_player"),
(party_get_slot, ":taxes_level", ":center_no", slot_party_taxes_level),
(try_begin),
(assign, ":tax_accum_change", ":taxes_level"),
(val_mul, ":tax_accum_change", -1),
(party_get_slot, ":old_tax_accum", ":center_no", slot_party_taxes_accumulate),
(val_add, ":tax_accum_change", ":old_tax_accum"),
(party_set_slot, ":center_no", slot_party_taxes_accumulate, ":tax_accum_change"),
(try_end),
(party_get_slot, ":prosperity_change", ":center_no", slot_party_taxes_accumulate),
(try_begin),
(le, ":prosperity_change", -10),
(call_script, "script_change_center_prosperity", ":center_no", -1),
(val_add, ":prosperity_change", 10),
(party_set_slot, ":center_no", slot_party_taxes_accumulate, ":prosperity_change"),
(else_try),
(ge, ":prosperity_change", 20),
(call_script, "script_change_center_prosperity", ":center_no", 1),
(val_sub, ":prosperity_change", 20),
(party_set_slot, ":center_no", slot_party_taxes_accumulate, ":prosperity_change"),
(try_end),
(try_end),
(try_end),
# Arantir | Taxes system -
]),
(24,
[]),
(24,
По-настоящему система очень проста. Сейчас разжую...
Налоги устанавливаются по шкале [-5;5], где -5 - без налогов, 5 - почти все доходы населения идут вам. Каждый день за соответственный налог вы получаете столько же бонусных баллов (только наоборот [5;-5], за низкие налоги - плюс, за высокие - минус). Когда баллов становится -10, то надел теряет единицу процветания, а если баллов 20 - то получает. На изменение процветания эти балы тратятся, то есть если было -10, то деревня получит -1 достатка, а балов станет ноль. Эти баллы записаны отдельно на каждый надел и собираются, в зависимости от налогов.
Как видите, повышается благополучие медленнее, чем понижается. А потому, что не брать налогов - это одно, а отбирать последний хлеб - совсем другое...
По-моему значения как раз оптимальные. Без налогов деревня получает +1 достатка каждые 4 дня. Это не очень мало, но и вполне приемлемо, ведь налогов-то нет. А с 200% налогами деревня теряет -1 каждые 2 дня, что вполне понятно, т.к. населению вообще не на что жить.
Остальные расчеты, кому лень посчитать:
0% = +1 благополучия каждые 4 дня.
20% = +1 благополучия каждые 5 дней.
40% = +1 благополучия каждые 6 1/3 дней (+3 за 20 дней)
60% = +1 благополучия каждые 10 дней.
80% = +1 благополучия каждые 20 дней.
100% = без бонуса/штрафа, это стандартный уровень налогов
120% = -1 благополучия каждые 10 дней.
140% = -1 благополучия каждые 5 дней.
160% = -1 благополучия каждые 3 1/6 дней (-3 за 10 дней).
180% = -1 благополучия каждые 2 1/2 дней (-2 за 5 дней).
200% = -1 благополучия каждые 2 дней.
В общем это все. Компилируем и пользуемся.
5. Суть налоговИтак, теперь расскажу в чем суть налогов. Она очень простая - вы можете получить больше денег, просто поменяв налоги... Но не без последствий. Понятное дело, что чем меньше у населения денег, тем хуже им живется. Так что вы можете понизить налоги и дать своему наделу новый толчок для развития.
А сейчас я вам объясню всю прелесть системы налогов!Итак. У меня есть деревня. Я уже давно дотянул ее до уровня 100 и она живет-поживает. А новые единицы процветания пропадают напрасно! Ну тут и пригодилась система налогов. Хм... Думаю за 10 дней крестьяне точно успеют набрать +1 достатка... Поставлю ка я налог 140%. Ну вот! Теперь от этого появился прок! Все заработанные селянами "сверхурочные" единицы достатка теперь будут "конвертироваться" в мои динары.
Здорово, не правда ли?
Систему проверял на работоспособность. Компилируется без ошибок. Рента рассчитывается правильно, процветания меняется в соответствии с задумкой.
В общем работает отлично. Но если вы вдруг обнаружите ошибки - сообщайте. Я не исключаю возможность, что где-то что-то недодумал.
Родная страница
Комментариев 6
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.