Семейные связи в Native прописываются главным образом в скрипте "initialize_aristocracy" (ищите в module_scripts.py). Там прописаны общие правила, которые, как-правило не удобны для новых модификаций
Как же сделать семейные связи постоянными?
для начала мы можем добавить прародителей в module_troops. это отцы и матери героев, которые фактически в игре не участвуют. лордов можно после претендентов, но перед леди. если известно настоящее имя, используем его:
#non-game lords for parental rerlations ["knight_2_0", "Grant parent one", "Grant parent one", tf_hero, 0, reserved, fac_kingdom_number, [itm_sword_medieval_c], knight_attrib_1,wp(340),knight_skills_1, 0x000000020f00214248cd8a26ce80471900000000001dd89a0000000000000000], #knight_2_0 - should not appear in game ["knight_2_0_2", "Grant parent two", "Grant parent two", tf_hero, 0, reserved, fac_kingdom_number, [itm_mail_boots, itm_mail_mittens], knight_attrib_1,wp(340),knight_skills_1, 0x0000000c5b0032813a9caed51ba5275b00000000001dc8eb0000000000000000],
в конце скрипта game_start находим команду troop_set_note_available и отключаем отображение заметок у прародителей #1 = available, 0 = not available
(troop_set_note_available, "trp_knight_2_0", 0), (troop_set_note_available, "trp_knight_2_0_2", 0),
для того чтобы информация о семье отображалась у лордов и у леди тоже, находим в скрипте game_get_troop_note
#Family notes (try_begin), (this_or_next|is_between, ":troop_no", kings_begin, lords_begin),
и меняем lords_begin на kingdom_ladies_end
тоже самое делаем для переменной ":aristocrat"
ниже, при условии отношения = 0, пишем
(try_begin), (this_or_next|eq, ":aristocrat", "trp_knight_2_0"), (this_or_next|eq, ":aristocrat", "trp_knight_2_0_2"), (str_store_string, s49, "str_s49_end"), (else_try), (str_store_string, s49, "str_s49_s12_s11_end"), (try_end), (else_try), (eq, ":num_relations", 1),###отношения = 1 (try_begin), (this_or_next|eq, ":aristocrat", "trp_knight_2_0"), (this_or_next|eq, ":aristocrat", "trp_knight_2_0_2"), (str_store_string, s49, "str_s49"), (else_try), (str_store_string, s49, "str_s49_s12_s11_mod"), (try_end), (else_try),###в остальных случаях (try_begin), (this_or_next|eq, ":aristocrat", "trp_knight_2_0"), (this_or_next|eq, ":aristocrat", "trp_knight_2_0_2"), (str_store_string, s49, "str_s49"), (else_try), (str_store_string, s49, "str_s49_s12_s11"), (try_end),
не забываем правильно завершить цикл
далее находим script_game_get_faction_note и под строкой
(troop_slot_eq, ":cur_troop", slot_troop_occupation, slto_kingdom_hero),###проверяем равно ли значение в слоте бота "род деятельности" герою королевства (try_begin), (eq, ":num_members", 0),
перед #wars
добавляем
(neq, ":cur_troop", "trp_knight_2_0"), (neq, ":cur_troop", "trp_knight_2_0_2"),
при условии (eq, ":num_members", 1), - тоже самое, и во всех остальных случаях тоже
это нужно, по-видимости, что-бы имена праотцов не выводились в инфо о фракции
(str_store_troop_name_link, s10, ":cur_troop"),# Записывает имя бота идентификатор которого находится в :cur_troop
ну и самое интересное. переписываем полностью скрипт "initialize_aristocracy"
назначаем возраст лидерам. у меня так:
#King ages (try_for_range, ":cur_troop", kings_begin, kings_end), (troop_set_slot, ":cur_troop", slot_troop_occupation, slto_kingdom_hero), (try_begin), (eq, ":cur_troop", "trp_kingdom_1_lord"),# (store_random_in_range, ":age", 50, 60),#т.е. рандомно. полезно кода не известен точный возраст (assign, ":king_age", ":age"), (else_try), (eq, ":cur_troop", "trp_kingdom_2_lord"),# (assign, ":king_age", 20), (else_try), (eq, ":cur_troop", "trp_kingdom_3_lord"),# (assign, ":king_age", 52), (else_try), (eq, ":cur_troop", "trp_kingdom_4_lord"),# (assign, ":king_age", 45), (else_try), (eq, ":cur_troop", "trp_kingdom_5_lord"),# (assign, ":king_age", 42),#unknown (else_try), (eq, ":cur_troop", "trp_kingdom_6_lord"), # (assign, ":king_age", 42),#unknown (try_end), (call_script, "script_init_troop_age", ":cur_troop", ":king_age"), (try_end),
репутацию лордам
#Lord ages and reputation (try_for_range, ":cur_troop", lords_begin, lords_end),#temporary addition for lord rep assignment was kingdom_ladies_begin (store_random_in_range, ":lord_rep", 0, 8),###рандомный выбор репутации, для того-чтобы присвоить его точно используйте команду (troop_set_slot, "trp_id_лорда", slot_lord_reputation_type, "lrep_название характера"),###либо же просто попробовать вместо последнего значения записать его номер №ID (troop_set_slot, ":cur_troop", slot_lord_reputation_type, ":lord_rep"),##делает характер лорда равным переменной ":lord_rep" ###таким образом репутация лорда принимает значение от 0 до 8. всего-же их 10 для лордов и 5 для леди ###0 обозначает отсутствие специфического характера (try_end), #bugfix ###обратите сюда внимание, мы ведь добавили прародителей, и теперь их нужно исключить из героев (try_for_range, ":cur_troop", lords_begin, "trp_knight_2_0"),#was kingdom_ladies_begin (troop_set_slot, ":cur_troop", slot_troop_occupation, slto_kingdom_hero), (try_end), #bugfix_end
Правила по репутации лордам
#The first thing - family structure #lords 1 to 8 are patriarchs with one live-at-home son and one daughter. They come from one of six possible ancestors, thus making it likely that there will be two sets of siblings #lords 9 to 12 are unmarried landowners with sisters #lords 13 to 20 are sons who still live in their fathers' houses #For the sake of simplicity, we can assume that all male aristocrats in prior generations either married commoners or procured their brides from the Old Country, thus discounting intermarriage
Этот скрипт как-то хитро распределяет семьи и характеры по данным правилам.
возраст лордам
(try_for_range, ":cur_troop", lords_begin, kingdom_ladies_begin), ###далее обходим претендентов (neq, ":cur_troop", "trp_kingdom_1_pretender"), (neq, ":cur_troop", "trp_kingdom_2_pretender"), (neq, ":cur_troop", "trp_kingdom_3_pretender"), (neq, ":cur_troop", "trp_kingdom_4_pretender"), (neq, ":cur_troop", "trp_kingdom_5_pretender"), (neq, ":cur_troop", "trp_kingdom_6_pretender"), # (troop_set_slot, ":cur_troop", slot_troop_occupation, slto_kingdom_hero),#bugfix, moved higher (try_begin), (eq, ":cur_troop", "trp_knight_2_0_2"),#Grant parent two (assign, ":lord_age", 49),#возраст на момент начала игры (store_random_in_range, ":lord_rep", 0, 8),###репутация, для лордов 8 можно заменить на 10 (else_try),##таким образом перечисляем далее (eq, ":cur_troop", "trp_knight_3_1"),# (assign, ":lord_age", 32), (store_random_in_range, ":lord_rep", 0, 8), (try_end), (call_script, "script_init_troop_age", ":cur_troop", ":lord_age"), (troop_set_slot, ":cur_troop", slot_lord_reputation_type, ":lord_rep"), (try_end),
теперь Леди
#Lady ages and reputation (try_for_range, ":cur_lady", kingdom_ladies_begin, kingdom_ladies_end), (troop_set_slot, ":cur_lady", slot_troop_occupation, slto_kingdom_lady), (try_begin), (eq, ":cur_lady", "trp_kingdom_2_lady_2"),# (assign, ":lady_age", 40), (store_random_in_range, ":lady_rep", 21, 26),###репутация для леди (else_try), (eq, ":cur_lady", "trp_kingdom_2_lady_9"),# (store_random_in_range, ":age", 34, 39), (assign, ":lady_age", ":age"), (store_random_in_range, ":lady_rep", 21, 26), (else_try),###перечисляем всех (eq, ":cur_lady", "trp_kingdom_3_lady_3"),# (store_random_in_range, ":age", 45, 51), (assign, ":lady_age", ":age"), (store_random_in_range, ":lady_rep", 21, 26), (try_end), (call_script, "script_init_troop_age", ":cur_lady", ":lady_age"), (troop_set_slot, ":cur_lady", slot_lord_reputation_type, ":lady_rep"), (try_end),
Родители и жены лордов/королей
#King and Lord fathers, mothers, wifes (try_for_range, ":cur_troop", kings_begin, kingdom_ladies_begin), (try_begin), (eq, ":cur_troop", "trp_knight_2_0_2"),#Grant parent two (troop_set_slot, ":cur_troop", slot_troop_spouse, "trp_kingdom_2_lady_2"),#супруга (troop_set_slot, ":cur_troop", slot_troop_father, "trp_knight_2_0"),##отец тот-самый что в troops - Grant parent one (else_try), (eq, ":cur_troop", "trp_kingdom_3_lord"),# (troop_set_slot, ":cur_troop", slot_troop_spouse, "trp_kingdom_3_lady_3"), (else_try), (eq, ":cur_troop", "trp_knight_3_1"),# (troop_set_slot, ":cur_troop", slot_troop_spouse, "trp_kingdom_3_lady_4"), (troop_set_slot, ":cur_troop", slot_troop_father, "trp_kingdom_3_lord"),##отец (troop_set_slot, ":cur_troop", slot_troop_mother, "trp_kingdom_3_lady_3"),##мать (try_end), (try_end),
Мужья благородных дам на всякий случай, обратная зависимость
#Lady husbands (try_for_range, ":cur_lady", kingdom_ladies_begin, kingdom_ladies_end), (try_begin), (eq, ":cur_lady", "trp_kingdom_2_lady_2"),# (troop_set_slot, ":cur_lady", slot_troop_spouse, "trp_knight_2_0_2"), (else_try), (eq, ":cur_lady", "trp_kingdom_3_lady_3"),# (troop_set_slot, ":cur_lady", slot_troop_spouse, "trp_kingdom_3_lord"), (try_end), (try_end),
претендентам тоже возможно выставить возраст
(try_for_range, ":cur_troop", pretenders_begin, pretenders_end), (troop_set_slot, ":cur_troop", slot_troop_occupation, slto_inactive_pretender), (store_random_in_range, ":age", 25, 30), (troop_set_slot, ":cur_troop", slot_troop_age, ":age"), и точный # (try_begin), # (eq, ":cur_troop", "trp_kingdom_3_pretender"), # (troop_set_slot, ":cur_troop", slot_troop_age, 27), # (try_end), (try_end),###выход из цикла ]),###обязательно в конце скрипта
напоследок добавляем в strings перед:
("updating_faction_notes_for_s14_temp_=_reg4", "{!}Updating faction notes for {s14}, temp = {reg4}"),
следующее
("s49_s12_s11_mod", "{s49} {s12} ({s11})"),
и
("s49", "{s49}"), ("s49_s12_s11_end", "{s49}, {s12} ({s11})."), ("s49_end", "{s49}."),
после
("_family_", "^Family:"),