Поведение мерджера
Как выделить свой мод в отдельную папку не смешивая с файлами модульной?
mods_active = [
# insert the active mod names here
"Japan_OSP.quick_start", # добавляет опцию Быстрого старта в стартовое меню игры
# "anothermod",
]
Еще раз об установке и подключении мерж-пака на примере Freelance-мода.
export_dir = "D:/games/Mount&Blade Warband/Modules/YourMod/" # Компиляция напрямую в модуль
mods_active = [
# insert the active mod names here
"Freelancer.freelancer", # Добавляет в игру фриланс-режим
# "anothermod",
]
... стандартная шапка из module_animations.py ...
add_block = [ # This animation will replace an unused_ / Эта анимация заменит неиспользуемую, а существующая заменится.
# Walking
["run_forward", acf_enforce_lowerbody, amf_use_cycle_period|amf_client_prediction,
[2.0, "man_walk", 0, 32, arf_use_walk_progress|arf_cyclic|blend_in_walk|arf_make_walk_sound,pack2f(0.4,0.9), (0, 0, 0), 0.4],],
...
# Stand Up
["stand_up", acf_enforce_lowerbody, amf_priority_jump|amf_play|amf_client_prediction,[1.0, "stand_man", 0, 1, arf_blend_in_10],],
]
from util_animations import *
def modmerge(var_set):
try:
var_name_1 = "animations"
orig_animations = var_set[var_name_1]
modmerge_animations(orig_animations)
except KeyError:
errstring = "Variable set does not contain expected variable: "%s"." % var_name_1
raise ValueError(errstring)
def modmerge_animations(orig_animations):
try:
add_animations(orig_animations, add_block, check_duplicates = True) # заменить существующие добавить новые
except:
import sys
print "Injecton 1 failed:", sys.exc_info()[1]
raise
... стандартная шапка из module_dialogs.py ...
dialogs_insert_block = [
# Harbour Master / Капитан порта
# First conversation / Первая встреча
[anyone, "start", [
(store_conversation_troop, "$g_talk_troop"),
(is_between, "$g_talk_troop", harbour_masters_begin, harbour_masters_end),
(troop_slot_eq, "$g_talk_troop", slot_troop_met_previously, 0),
],
"Good day {young man/lassie}. I'm the Captain of this port.
...
...
]
def modmerge(var_set):
try:
var_name_1 = "dialogs"
orig_dialogs = var_set[var_name_1]
modmerge_dialogs(orig_dialogs)
except KeyError:
errstring = "Variable set does not contain expected variable: "%s"." % var_name_1
raise ValueError(errstring)
def modmerge_dialogs(orig_dialogs):
try:
# Добавление диалогов в начало списка
orig_dialogs.reverse() # Перевернуть список
orig_dialogs = dialogs_insert_block # добавить новый код
orig_dialogs.reverse() # перевернуть список назад
except:
import sys
print "Injecton 1 failed:", sys.exc_info()[1]
raise
# [OSP] Ship Navigation
# Constants that uses in game
# Некий текст, который удобно использовать в скриптах
# MB Warband v1.1xx
# Сode v1.0: by Shcherbyna
# Additional code vX.X: by
# -*- coding: UTF-8 -*-
# Ship stearing commands / Команды управления судном
SHIP_SAIL_ON = 1 # поднять парус, отчалить от причала
SHIP_SAIL_OFF = 2 # опустить парус
SHIP_AHEAD = 3 # двигаться вперед
SHIP_ASTERN = 4 # двигаться назад (только для парусных)
SHIP_RIGHT = 5 # повернуть влево
SHIP_LEFT = 6 # повернуть вправо
# Ship status / Состояния судна - используются при отработке команд управления судном
SHIP_STATUS_UNDERWAY = 1 # на ходу
SHIP_STATUS_ANCHORAGE = 2 # на якоре
SHIP_STATUS_MOORED = 3 # ошвартовано у причала
SHIP_STATUS_BOARDING = 4 # абордаж
SHIP_STATUS_NOT_UNDER_COMMAND = 5 # не управляется (дрейфует с опущенным парусом)
# Wind power / Сила верта - влияет на силу качки и скорость судна
NAVIGATION_WIND_LOW = 1
NAVIGATION_WIND_MEDIUM = 2
NAVIGATION_WIND_STRONG = 3
... стандартная шапка из module_scenes.py ...
scenes = [
("town_harbour",sf_generate,"none", "none", (0,0),(240,240),-0.5,"0x000000033a000980400258960000750d80002cb9000053a6",
[],[], "outer_terrain_beach"),
]
... стандартная шапка mt файла .......
mission_templates = [
... новый mt-сценарий ...
]
from util_common import *
from util_wrappers import *
def add_mission_templates(orig_mission_templates, add_mission_templates, check_duplicates = True):
addmode = ADDMODE_REPLACE_EXIST
if not check_duplicates:
addmode = ADDMODE_APPEND
return add_objects(orig_mission_templates, add_mission_templates, addmode)
def modmerge(var_set):
try:
var_name_1 = "mission_templates"
orig_mission_templates = var_set[var_name_1]
add_mission_templates(orig_mission_templates, mission_templates, True) # add a new mission_tmplt / добавить новую миссию
except KeyError:
errstring = "Variable set does not contain expected variable: "%s"." % var_name_1
raise ValueError(errstring)
... стандартная шапка mt файла .......
# Новые триггеры
on_palanquin_spawn = (
ti_on_agent_spawn, 0, 0,
[
(store_trigger_param_1, ":agent"),
(agent_get_item_id, ":horse_id", ":agent"),
(eq, ":horse_id", "itm_palanquin"),
],
[
#(store_trigger_param_1, ":agent"),
(display_message, "@Event on_palanquin_spawn"),
])
on_ahead_command = (
1, 2, 0, [(eq, "$g_sail_command", SHIP_AHEAD)],
[
(... code ...),
])
on_astern_command = (
1, 2, 0, [(eq, "$g_sail_command", SHIP_ASTERN)],
[
(... code ...),
])
on_mooring_command = (
1, 2, 0, [(eq, "$g_sail_command", SHIP_CREW_MOORING)],
[
(... code ...),
])
# Объединяем их в нужные группы
ship_triggers = [
on_ahead_command,
on_astern_command,
]
crew_triggers = [
on_mooring_command,
]
palanquin_triggers = [
on_palanquin_spawn,
]
from util_common import *
from util_wrappers import *
def modmerge_mission_templates(orig_mission_templates):
# 1) Пример добавления новых триггеров в указанный mt-сценарий
find_i = find_object(orig_mission_templates, "town_harbour") # найти указанную миссию
orig_mission_templates[find_i][5].extend(ship_triggers) # добавить ей новых триггеров
# 2) Пример добавления групп триггеров в несколько mt-сценариев
for n in range(len(orig_mission_templates)):
mt_name = orig_mission_templates[n][0]
if (mt_name=="town_harbour" or mt_name=="open_sea"): # поиск сценариев по точному имени
orig_mission_templates[n][5].extend(ship_triggers ([url]http://storage6.static.itmages.ru/i/14/0930/h_1412080076_7825229_1c78d2c293.gif[/url]) crew_triggers)
elif ("harbour" in mt_name or "sea" in mt_name): # а это поиск сценариев по неполному имени
orig_mission_templates[n][5].extend(ship_triggers)
# 3) Пример добавления триггеров во все mt-сценарии за исключением указанных
elif (not "tutorial" in mt_name and not "multiplayer" in mt_name and not "conversation" in mt_name):
orig_mission_templates[n][5].extend(palanquin_triggers)
def modmerge(var_set):
try:
var_name_1 = "mission_templates"
orig_mission_templates = var_set[var_name_1]
modmerge_mission_templates(orig_mission_templates) # выполнить функцию поиска-вставки
except KeyError:
errstring = "Variable set does not contain expected variable: "%s"." % var_name_1
raise ValueError(errstring)
... стандартная шапка mt файла .......
bc_tab_press_addon = [
#PBOD - Battle Continuation
(else_try),
(party_slot_eq, "p_main_party", slot_party_pref_bc_continue, 1), #PBOD Battle Continuation On
... code ...
(finish_mission, 0),
#PBOD - Battle Continuation END
]
from util_common import *
from util_wrappers import *
def modmerge_mission_templates(orig_mission_templates):
# Подгрузить имена камонов для дальнейшей работы с ними
from module_mission_templates import common_battle_tab_press, common_battle_check_victory_condition, common_battle_order_panel
try:
# 1) Вставка нового кода из блока bc_tab_press_addon на 2 строки выше искомой
codeblock = TriggerWrapper(common_battle_tab_press).GetConsequenceBlock()
pos = codeblock.FindLineMatching((call_script, "script_cf_check_enemies_nearby"))
codeblock.InsertBefore(pos-1, bc_tab_press_addon) # pos-1 to jump above the else try
# 2) Вставка новой строки над искомой
codeblock = TriggerWrapper(common_battle_check_victory_condition).GetConditionBlock()
pos = codeblock.FindLineMatching((neg|main_hero_fallen, 0))
codeblock.InsertBefore(pos,[(this_or_next|party_slot_eq, "p_main_party", slot_party_pref_bc_continue, 1)])
# 3) Вставка новой строки после искомой
codeblock = TriggerWrapper(common_battle_order_panel).GetConsequenceBlock()
pos = codeblock.FindLineMatching((game_key_clicked, gk_view_orders))
codeblock.InsertAfter(pos,[(neg|main_hero_fallen)])
except:
import sys
print "common_triggers injecton failed:", sys.exc_info()[1]
raise
def modmerge(var_set):
try:
var_name_1 = "mission_templates"
orig_mission_templates = var_set[var_name_1]
modmerge_mission_templates(orig_mission_templates) # выполнить функцию поиска-вставки
except KeyError:
errstring = "Variable set does not contain expected variable: "%s"." % var_name_1
raise ValueError(errstring)
... стандартная шапка mt файла .......
# Новый код для вставки
inject_block = [
(is_presentation_active, "prsnt_command_line"),
(try_begin),
... code ...
(try_end),
]
from util_common import *
from util_wrappers import *
def modmerge_mission_templates(orig_mission_templates):
for n in range(len(orig_mission_templates)): # Обойти все mt-сценарии
mt_name = orig_mission_templates[n][0] # взять имя текущего mt-сценария
# 1) Дальнейший код выполнять для всех mt-сценариев за исключением указанных
if (not "tutorial" in mt_name and not "multiplayer" in mt_name and not "conversation" in mt_name ):
# 1.1) Пример добавления новой строки в конец триггера
trigger_i = MissionTemplateWrapper(orig_mission_templates[n]).FindTrigger_i(ti_on_agent_spawn) # найти ti_on_agent_spawn триггер
if ( trigger_i != None ): # если триггер найден => продолжить
trigger = orig_mission_templates[n][5][trigger_i] # берем этот триггер
codeblock = TriggerWrapper(trigger).GetConsequenceBlock() # берем его код
codeblock.Append([(call_script, "script_scene_agent_set_name")]) # добавляем в конец новую строку
# 1.2) Пример добавления списка строк в конец триггера
codeblock.Append(inject_block)
# 2) Дальнейший код выполнять для всех mt-сценариев
# 2.1) Пример поиска-вставки-удаления
trigger_i = MissionTemplateWrapper(orig_mission_templates[n]).FindTrigger_i(1, 4, ti_once [(main_hero_fallen)]) # найти триггер (1 ,4, ti_once, [(main_hero_fallen)])
if ( trigger_i != None ): # если триггер найден => продолжить
trigger = orig_mission_templates[n][5][trigger_i] # берем этот триггер
codeblock = TriggerWrapper(trigger).GetConsequenceBlock() # берем его код
pos = codeblock.FindLineMatching((assign, "$pin_player_fallen", 1)) # в теле триггера найти второе совпадение строки (1 совпадение пропустить)
if (codeblock.GetLineContent(pos 1) != (try_begin) ): # проверить, если следующая строка не (try_begin), т.е. код триггера нативный и не изменялся..
codeblock.InsertAfter(pos, batt_continue_addon) # вставить новый код из блока inject_block после найденной строки
codeblock.Append([(try_end)]) # и в конец триггера добавить (try_end)
if (trigger == common_siege_check_defeat_condition): # а если наш триггер на самом деле носит имя common_siege_check_defeat_condition
pos = codeblock.FindLineMatching((party_slot_eq, "p_main_party", slot_party_pref_bc_charge_ko, 1)) # то найти в нем второе совпадение такой строки
codeblock.RemoveAt(pos, 6) # и удалить 6 строк ниже, включая найденную
# 2.2) Пример замены время-перезарядки триггера с ti_once на 0
orig_mission_templates[n][5][trigger_i] = list(orig_mission_templates[n][5][trigger_i]) # разбить триггер на список элементов
orig_mission_templates[n][5][trigger_i][2] = 0 # заменить 3 элемент
orig_mission_templates[n][5][trigger_i] = tuple(orig_mission_templates[n][5][trigger_i]) # восстановить структуру триггера (собрать список элементов в неизменяемый тапл (кортеж))
def modmerge(var_set):
try:
var_name_1 = "mission_templates"
orig_mission_templates = var_set[var_name_1]
modmerge_mission_templates(orig_mission_templates) # выполнить функцию поиска-вставки
except KeyError:
errstring = "Variable set does not contain expected variable: "%s"." % var_name_1
raise ValueError(errstring)
# [OSP] Harbour
# Harbour visit.
# Переход на сцену Порта ([url]http://storage6.static.itmages.ru/i/14/0930/h_1412080076_7825229_1c78d2c293.gif[/url]) загрузка его mt-сценария.
# MB Warband v1.1xx
# Code v1.0 by: Shcherbyna
# Additional code vX.X: by
# -*- coding: UTF-8 -*-
... стандартная шапка из module_scripts.py ...
scripts = [
#script_harbour_visit - load mission template when visite town_harbour / подгружает сценарий сцены Порта при его посещении
# INPUT: none
# OUTPUT: none
("harbour_visit",
[
(set_jump_mission, "mt_town_harbour"),
(jump_to_scene, "scn_town_harbour"),
(change_screen_mission),
]),
(.. скрипт 2 ...),
(.. скрипт 3 ...),
]
... стандартная шапка из module_scripts.py ...
from util_wrappers import *
from util_scripts import *
# Find and replace
# Указанные строки скрипта заменяет на новые.
scripts_directives = [
# [SD_OP_BLOCK_REPLACE, <script_name>, <position_flags>, <position_value_1>, <position_value_2>, <op_block>, <lines_to_remove>(default 1)]
[SD_OP_BLOCK_REPLACE, "init_town_agent", D_SEARCH_FROM_TOP | D_SEARCH_SCRIPTLINE, (assign, ":stand_animation", "anim_stand_lady"), 0 , [(assign, ":stand_animation", "anim_sitting_woman_seiza")], 1],
[SD_OP_BLOCK_REPLACE, "init_town_agent", D_SEARCH_FROM_TOP | D_SEARCH_SCRIPTLINE, (assign, ":stand_animation", "anim_stand_lord"), 0 , [(assign, ":stand_animation", "anim_sitting_man_seiza")], 1],
]
def modmerge_scripts(orig_scripts):
process_script_directives(orig_scripts, scripts_directives)
def modmerge(var_set):
try:
var_name_1 = "scripts"
orig_scripts = var_set[var_name_1]
modmerge_scripts(orig_scripts) # выполнить замену
except KeyError:
errstring = "Variable set does not contain expected variable: "%s"." % var_name_1
raise ValueError(errstring)
]
... стандартная шапка из module_scripts.py ...
# A new script / Новый скрипт
scripts = [
# script_update_ai_party_icon
# INPUT: none
# OUTPUT: none
("update_ai_party_icon",
[
(store_script_param_1, ":party_no"),
...
...
]),
]
# A new code for exist script updating / Новый код для инжекта существующего скрипта
update_script_create_kingdom_hero_party = [
(call_script, "script_update_ai_party_icon", "$pout_party"),
....
]
from util_wrappers import *
from util_scripts import *
# Добавить новый код из блока update_... в конец существующего скрипта create_kingdom_.. .
scripts_directives = [
[SD_OP_BLOCK_INSERT, "create_kingdom_hero_party", D_SEARCH_FROM_BOTTOM | D_SEARCH_LINENUMBER | D_INSERT_BEFORE, 0, 0, update_script_create_kingdom_hero_party], #ADD TO END.
]
def modmerge_scripts(orig_scripts):
process_script_directives(orig_scripts, scripts_directives)
def modmerge(var_set):
try:
var_name_1 = "scripts"
orig_scripts = var_set[var_name_1]
add_scripts(orig_scripts, scripts, True) # сначала добавить новый скрипт
modmerge_scripts(orig_scripts) # затем проапдейтить старый
except KeyError:
errstring = "Variable set does not contain expected variable: "%s"." % var_name_1
raise ValueError(errstring)
]
... стандартная шапка из module_items.py ...
items = [
["kanji_mahjong_for_tavern", "Kanji Mahjong", [("mahjong_box",0)], itp_type_one_handed_wpn|itp_primary|itp_secondary, itc_longsword, 200, weight(1.5)|spd_rtng(80)|weapon_length(20)|swing_damage(2,blunt),imodbits_none], # not merchandise, tavern use only
["kanji_mahjong","Kanji Mahjong", [("mahjong_box",0)], itp_type_one_handed_wpn|itp_merchandise|itp_primary|itp_secondary, itc_longsword, 50, weight(1.5)|spd_rtng(80)|weapon_length(20)|swing_damage(2,blunt),imodbits_none],
]
# [OSP] Kanji Mahjong
# Registering of mahjong game sounds
# Регистрация звуков игры.
# MB Warband v1.1xx
# Сode v1.0: by Shcherbyna
# Additional code vX.X: by
# -*- coding: UTF-8 -*-
from header_sounds import *
sounds = [
("mahjong_intro", sf_2d|sf_vol_15,["quest_completed2.ogg"]),
("mahjong_round_complete", sf_2d|sf_vol_15,["mahjong_round_complete.wav"]),
("mahjong_nomatches", sf_2d|sf_vol_15,["mahjong_nomatches.wma"]),
...
]
... стандартная шапка из module_meshes.py ...
meshes = [
("mahjong_start_screen", 0, "mahjong_start_screen", 0, 0, 0, 0, 0, 0, 1, 1, 1),
("mahjong_table_1", 0, "mahjong_table_1", 0, 0, 0, 0, 0, 0, 1, 1, 1),
("mahjong_table_2", 0, "mahjong_table_2", 0, 0, 0, 0, 0, 0, 1, 1, 1),
("mahjong_table_3", 0, "mahjong_table_3", 0, 0, 0, 0, 0, 0, 1, 1, 1),
("mahjong_table_4", 0, "mahjong_table_4", 0, 0, 0, 0, 0, 0, 1, 1, 1),
("mahjong_table_5", 0, "mahjong_table_5", 0, 0, 0, 0, 0, 0, 1, 1, 1),
("mahjong_table_6", 0, "mahjong_table_6", 0, 0, 0, 0, 0, 0, 1, 1, 1),
...
]
... стандартная шапка из module_map_icons.py ...
map_icons = [
("player",0,"ronin", avatar_scale, snd_footstep_grass, 0.15, 0.173, 0),
("shinobi",0,"shinobi", avatar_scale, snd_footstep_grass, 0.15, 0.173, 0),
...
("town", mcn_no_shadow, "map_jtown_a", 0.35, 0),
]
... стандартная шапка из module_presentations.py ...
presentations = [
(.. новая презентация ...),
(.. новая презентация 2...),
]
... стандартная шапка из module_game_menus.py ...
game_menus = [
("start_game_0",menu_text_color(0xFF000000)|mnf_disable_all_keys,
"Welcome, adventurer",
"none",
[(start_presentation, "prsnt_studyMod_startMenu")], # Language selecting menu
[]
),
("studyMod_exit_to_main_menu", 0, "@", "none", [(change_screen_quit)],[]),
]
... стандартная шапка из module_game_menus.py ...
game_menus = [
("ship_departure",menu_text_color(0xFF000000)|mnf_disable_all_keys,
"You continue sea passage...", # Вы вышли из гавани порта и продолжаете морской переход..
"none",
[],
[
("continue",[],"Continue...",
[(change_screen_map),
]),
]),
]
# Показать опцию порта в меню города
update_menu_town_block = [
("sail_from_port",
[
(party_slot_eq, "$current_town", slot_party_type, spt_town), # Если это город
(party_get_position, pos1, "p_main_party"),
(map_get_water_position_around_position, pos2, pos1, 6), # и рядом есть вода
],
"Go to port", # Направиться в порт
[
(set_jump_mission, "mt_town_harbour"),
(jump_to_scene, "scn_town_harbour"),
(change_screen_mission),
]),
]
from util_wrappers import *
from util_common import *
# Функция добавления нового меню
def add_game_menus(orig_game_menus, game_menus, check_duplicates = True):
addmode = ADDMODE_REPLACE_EXIST
if not check_duplicates:
addmode = ADDMODE_APPEND
return add_objects(orig_game_menus, game_menus, addmode)
# Функция замены опции меню
def modmerge_game_menus(orig_game_menus):
try: #full replace mno_sail_from_port in mnu_town / заменить опцию в меню города новым кодом
menu_Town = list_find_first_match_i(orig_game_menus, "town") # взять меню "Города"
menu_Town_options_list = GameMenuWrapper(orig_game_menus[menu_Town]).GetMenuOptions() # взять список его опций
for option_i in range(len(menu_Town_options_list)): # пробежаться по всем опциям
option_id = GameMenuOptionWrapper(menu_Town_options_list[option_i]).GetId() # взять имя текущей опции меню
if (option_id == "sail_from_port"): # Если это нужная нам опция
menu_Town_options_list[option_i] = update_menu_town_block[0] # полностью заменить её новым кодом
except:
import sys
print "Injecton 1 failed:", sys.exc_info()[1]
raise
def modmerge(var_set):
try:
var_name_1 = "game_menus"
orig_game_menus = var_set[var_name_1]
add_game_menus(orig_game_menus, game_menus, True) # 1 - add new menu / добавить новое меню
modmerge_game_menus(orig_game_menus) # 2 - replace by new code / внести изменения в существующее
except KeyError:
errstring = "Variable set does not contain expected variable: "%s"." % var_name_1
raise ValueError(errstring)
... стандартная шапка из module_troops.py ...
troops = [
# These are used as arrays in the scripts.
# lvl boundaries dict indexes / приемник указателей границ учебных уровней слов
["studyMod_lvl_indexes_container","{!}","{!}", tf_inactive, 0, 0, fac_neutral,[],0,wp(60),0,0],
# this slot-container needs for dynamic selecting lvl-code-script-loader / это слот-контейнер необходим для динамического определения скрипта-код-загрузчика
["studyMod_lvl_code_loaders_container","{!}","{!}", tf_inactive, 0, 0, fac_neutral,[],0,wp(60),0,0],
# study word's codes holder, loads in before start mission_templates / приемник кодов, загружается кодами учебных слов на указанных миссиях
["studyMod_code_container","{!}","{!}", tf_inactive, 0, 0, fac_neutral,[],0,wp(60),0,0],
]
strings = [
("startMenu_next_str_kanji_reading", "Tsugi e"),
("startMenu_next_str_0", "Next"),
("startMenu_next_str_1", "次へ"),
("startMenu_next_str_2", "Продолжить"),
]
... стандартная шапка из module_simple_triggers.py...
replace_block = (0,
[(troop_get_inventory_slot, ":cur_horse", "trp_player", 8), #horse slot
(assign, ":new_icon", -1),
(try_begin),
....
....
(neq, ":new_icon", "$g_player_party_icon"),
(assign, "$g_player_party_icon", ":new_icon"),
(party_set_icon, "p_main_party", ":new_icon"),
])
from util_wrappers import SimpleTriggerWrapper
def modmerge_simple_triggers(orig_simple_triggers, search_line, replace_block):
for trigger_i in range(len(orig_simple_triggers)): # Пробежаться по всем строкам файла simple_triggers
opblock = SimpleTriggerWrapper(orig_simple_triggers[trigger_i]).GetOpBlock().Unwrap() # взять код текущего триггера
for line_i in range(len(opblock)): # Пробежаться по строкам кода текущего триггера
if (opblock[line_i] == search_line): # если текущая строка кода является искомой
orig_simple_triggers[trigger_i] = replace_block # заменить текущий триггер полностью
def modmerge(var_set):
try:
var_name_1 = "simple_triggers"
orig_simple_triggers = var_set[var_name_1]
# Полная замена триггера, который содержит строку кода (assign, ":new_icon", "icon_player_horseman")
modmerge_simple_triggers(orig_simple_triggers, (assign, ":new_icon", "icon_player_horseman"), replace_block)
except KeyError:
errstring = "Variable set does not contain expected variable: "%s"." % var_name_1
raise ValueError(errstring)
... стандартная шапка из module_simple_triggers.py...
from util_wrappers import SimpleTriggerWrapper
def modmerge_simple_triggers(orig_simple_triggers, search_interval, insert_block):
for trigger_i in range(len(orig_simple_triggers)): # Пробежаться по всем строкам файла simple_triggers
if (SimpleTriggerWrapper(orig_simple_triggers[trigger_i]).GetInterval() == search_interval): # если интервал текущего триггера = 12
# добавить в конец триггера новую строку кода
#print orig_simple_triggers[trigger_i]
orig_simple_triggers[trigger_i] = list(orig_simple_triggers[trigger_i]) # преобразовать неизменяемый тапл-триггер в изменяемый лист-триггер (список из двух елементов: интервал и опблок-список)
orig_simple_triggers[trigger_i][1].append(insert_block) # приатачить к опблок-списку новый элемент (строку кода)
orig_simple_triggers[trigger_i] = tuple(orig_simple_triggers[trigger_i]) # восстановить структуру опблока триггера (собрать список элементов в неизменяемый тапл (кортеж))
#print "========= injected ============"
#print orig_simple_triggers[trigger_i]
break
def modmerge(var_set):
try:
var_name_1 = "simple_triggers"
orig_simple_triggers = var_set[var_name_1]
# Добавить новую строку в конец первого найденного 12-часового симпл-триггера
modmerge_simple_triggers(orig_simple_triggers, 12, (call_script, "script_navigation_init_wind"))
except KeyError:
errstring = "Variable set does not contain expected variable: "%s"." % var_name_1
raise ValueError(errstring)
... стандартная шапка из module_parties.py ...
parties = [
("town_1","Funai", pf_town, no_menu, pt_none, fac_neutral,0,ai_bhvr_hold,0,(-127.496864, -99.361931),[], -176.353),
("town_2","Hatinohe", pf_town, no_menu, pt_none, fac_neutral,0,ai_bhvr_hold,0,(83.973747, 25.656998),[], 0),
("town_3","Tokushima", pf_town, no_menu, pt_none, fac_neutral,0,ai_bhvr_hold,0,(-78.504913, -83.375710),[], 153.912),
("town_4","Okayama", pf_town, no_menu, pt_none, fac_neutral,0,ai_bhvr_hold,0,(-101.799500, -67.782112),[], 431.234),
("town_5","Kyoto", pf_town, no_menu, pt_none, fac_neutral,0,ai_bhvr_hold,0,(-47.491726, -68.609337),[], 104.61),
("town_6","Niigata", pf_town, no_menu, pt_none, fac_neutral,0,ai_bhvr_hold,0,(33.883018, -8.784881),[], 239.225),
("town_7","Toyama", pf_town, no_menu, pt_none, fac_neutral,0,ai_bhvr_hold,0,(-22.662624, -37.361458),[], 166.948),
...
]
... стандартная шапка из module_particle_systems.py ...
particle_systems = [
... новые партиклы ...
]
... стандартная шапка из module_scene_props.py ...
def modmerge_scene_props(orig_scene_props):
# Insert new tuples BEFORE searched objects / Вставка новых елементов списка перед искомыми
# Результат инъекции можно проверить в ID_scene_props.py
for n in range(len(orig_scene_props)): # Пробежаться по всем строкам списка scene_props
if orig_scene_props[n][0] == "ship_b" and orig_scene_props[n-1][0] != "small_blue_ship": # если текущий объект является искомым и над ним еще нет нового
orig_scene_props.insert(n, ("small_blue_ship",0,"small_blue_ship","bo_ship", [])) # вставить новый объект над найденным
elif orig_scene_props[n][0] == "ship_c_sail_off" and orig_scene_props[n-1][0] != "ship_b_sail_off": # иначе, если текущий объект является вторым искомым и над ним еще нет нового
orig_scene_props.insert(n, ("ship_b_sail_off",0,"ship_b_sail_off","bo_ship_b_sail_off", [])) # вставить второй новый объект над найденным
elif orig_scene_props[n][0] == "ramp_small_a" and orig_scene_props[n-1][0] != "ship_d_sail_off": # иначе, если текущий объект является третим искомым и над ним еще нет нового
orig_scene_props.insert(n, ("ship_d_sail_off",0,"ship_d_sail_off","bo_ship_d_sail_off", [])) # вставить третий новый объект над найденным
def modmerge(var_set):
try:
var_name_1 = "scene_props"
orig_scene_props = var_set[var_name_1]
modmerge_scene_props(orig_scene_props) # Добавление новых сцен_пропс в указанные места списка
except KeyError:
errstring = "Variable set does not contain expected variable: "%s"." % var_name_1
raise ValueError(errstring)