Автор: uhanich (http://rusmnb.ru/index.php?action=profile;u=15855)
Версия игры: 1.153создавалось и тестировалось на 1.153, но гипотетически должно работать и на более ранних версиях.
Была задача, везде, где возможно, заменить стандартные окна change_screen_*** на более функциональные собственные.
Принцип был понятен, но копипастить из презентации в презентацию здоровенные куски кода напрягало. Вот и решил создать для себя максимально удобный, функциональный и простой инструмент для этого
Ниже комплект скриптов для создания в любой презентации аналога прокручиваемой панели с инвентарём из игровых окон натива (торговля, экипировка компаньонов, лутинг и пр.) всего в несколько строк.
Данный кит позволяет создать до десяти полностью интерактивных панели в одной презентации, функционально ничем не отличающихся от нативных (перемещение и замена предметов внутри одной панели и между разными панелями, всплывающие подсказки с информацией о предмете), а также настроить по своему желанию их масштаб, рабочую область и положение
Итак:
module_scripts:
В начало файла, послеfrom ID_animations import *
Добавитьfrom header_presentations import *
В конец файла, до последней квадратной скобки ]
Добавить#script_prsnt_troop_inventory
# INPUT:
# param1: troop
# param2: inventory slot size. 900 - default. Number must be a multiple of 20
# param3: right boundary. Max 1000
# param4: down boundary. Max 750
# param5: vertical container size. Max 750 - down boundary
("prsnt_troop_inventory",
[
(store_script_param, ":troop_id", 1),
(store_script_param, ":inv_slot_size", 2),
(store_script_param, ":container_pos_x", 3),
(store_script_param, ":container_pos_y", 4),
(store_script_param, ":container_size_y", 5),
(store_div, ":shift", ":inv_slot_size", 20),
(troop_get_inventory_capacity, ":capacity", ":troop_id"),
(val_sub, ":capacity", 10),
(store_mul, ":container_size_x", ":shift", 6),
(val_sub, ":container_pos_x", ":container_size_x"),
(val_sub, ":container_pos_x", 20),
(str_clear, s0),
(create_text_overlay, ":container_overlay", s0, tf_scrollable),
(position_set_x, pos1, ":container_pos_x"),
(position_set_y, pos1, ":container_pos_y"),
(overlay_set_position, ":container_overlay", pos1),
(position_set_x, pos1, ":container_size_x"),
(position_set_y, pos1, ":container_size_y"),
(overlay_set_area_size, ":container_overlay", pos1),
(assign, ":slot", "$g_number_overlays"),
(troop_set_slot, "trp_temp_array_b", ":slot", ":container_overlay"),
(val_add, ":slot", 10),
(troop_set_slot, "trp_temp_array_b", ":slot", ":inv_slot_size"),
(val_add, ":slot", 10),
(troop_set_slot, "trp_temp_array_b", ":slot", ":troop_id"),
(val_add, ":slot", 10),
(troop_set_slot, "trp_temp_array_b", ":slot", ":capacity"),
(val_add, "$g_number_overlays", 1),
(try_for_range, ":inv_slot", 0, ":capacity"),
(store_add, reg1, ":inv_slot", 10),
(create_mesh_overlay, reg0, "mesh_inv_slot"),
(overlay_set_container_overlay, reg0, ":container_overlay"),
(call_script, "script_prsnt_set_obj_pos_and_size", reg0, ":troop_id", reg1, 0, ":inv_slot_size"),
(try_end),
(try_for_range, ":inv_slot", 0, ":capacity"),
(store_add, ":real_inv_slot", ":inv_slot", 10),
(troop_get_inventory_slot, ":item_id", ":troop_id", ":real_inv_slot"),
(store_add, ":inv_slot_overlay", ":container_overlay", 1),
(val_add, ":inv_slot_overlay", ":inv_slot"),
(try_begin),
(gt, ":item_id", 0),
(create_mesh_overlay_with_item_id, reg0, ":item_id"),
(overlay_set_container_overlay, reg0, ":container_overlay"),
(troop_set_slot, "trp_temp_array_a", ":inv_slot_overlay", reg0),
(call_script, "script_prsnt_set_obj_pos_and_size", reg0, ":troop_id", ":real_inv_slot", 1, ":inv_slot_size"),
(else_try),
(troop_set_slot, "trp_temp_array_a", ":inv_slot_overlay", -1),
(try_end),
(try_end),
]),
#script_prsnt_set_obj_pos_and_size
# INPUT:
# param1: overlay
# param2: troop
# param3: inventory slot
# param4: overlay type (0 = inventory slot overlay, 1 = inventory item overlay)
# param5: inventory slot size
("prsnt_set_obj_pos_and_size",
[
(store_script_param, ":overlay", 1),
(store_script_param, ":troop", 2),
(store_script_param, ":inv_slot", 3),
(store_script_param, ":overlay_type", 4),
(store_script_param, ":overlay_size", 5),
(val_sub, ":inv_slot", 10),
(troop_get_inventory_capacity, ":capacity", ":troop"),
(val_sub, ":capacity", 10),
(try_begin),
(eq, ":overlay_type", 1),
(store_mul, ":overlay_new_size", ":overlay_size", 113),
(val_div, ":overlay_new_size", 100),
(else_try),
(assign, ":overlay_new_size", ":overlay_size"),
(try_end),
(store_div, ":shift", ":overlay_size", 20),
(store_add, ":location_in_horizontal", ":inv_slot", 3),
(val_mod, ":location_in_horizontal", 3),
(store_sub, ":location_in_vertical", ":inv_slot", ":capacity"),
(val_sub, ":location_in_vertical", 2),
(val_abs, ":location_in_vertical"),
(val_add, ":location_in_vertical", 3),
(val_div, ":location_in_vertical", 3),
(val_sub, ":location_in_vertical", 2),
(store_mul, ":pos_x", ":location_in_horizontal", ":shift"),
(val_mul, ":pos_x", 2),
(store_mul, ":pos_y", ":location_in_vertical", ":shift"),
(val_mul, ":pos_y", 2),
(try_begin),
(eq, ":overlay_type", 1),
(val_add, ":pos_x", ":shift"),
(val_add, ":pos_y", ":shift"),
(try_end),
(position_set_x, pos1, ":overlay_new_size"),
(position_set_y, pos1, ":overlay_new_size"),
(overlay_set_size, ":overlay", pos1),
(position_set_x, pos1, ":pos_x"),
(position_set_y, pos1, ":pos_y"),
(overlay_set_position, ":overlay", pos1),
(overlay_set_additional_render_height, ":overlay", 0),
]),
#script_prsnt_init_variables_and_show_item_details
# INPUT:
# param1: overlay id
# param2: mouse action (0 if mouse enters, 1 if mouse leaves)
("prsnt_init_variables_and_show_item_details",
[
(store_script_param_1, ":object"),
(store_script_param_2, ":enters_leaves"),
(try_begin),
(eq, ":enters_leaves", 0),
(try_begin),
(assign, ":continue", 0),
(try_for_range, ":array_temp_slot", 0, "$g_number_overlays"),
(troop_get_slot, ":container_overlay", "trp_temp_array_b", ":array_temp_slot"),
(eq, ":container_overlay", ":object"),
(assign, "$cur_cont", ":object"), #selected container id
(val_add, ":array_temp_slot", 10),
(troop_get_slot, "$cur_cont_inv_slot_size", "trp_temp_array_b", ":array_temp_slot"), #selected container inventory slot size
(val_add, ":array_temp_slot", 10),
(troop_get_slot, "$cur_cont_troop", "trp_temp_array_b", ":array_temp_slot"), #selected container inventory troop
(val_add, ":array_temp_slot", 10),
(troop_get_slot, "$cur_cont_cap", "trp_temp_array_b", ":array_temp_slot"), #selected container inventory capacity
(assign, ":continue", 1),
(try_end),
(eq, ":continue", 1),
(else_try),
(lt, "$g_moving_overlay", 0),
(store_add, ":end", "$cur_cont", "$cur_cont_cap"),
(val_add, ":end", 1),
(store_add, ":start", "$cur_cont", 1),
(is_between, ":object", ":start", ":end"),
(store_sub, ":inv_slot", ":object", "$cur_cont"),
(val_add, ":inv_slot", 9),
(troop_get_inventory_slot, ":item_id", "$cur_cont_troop", ":inv_slot"),
(try_begin),
(gt, ":item_id", 0),
(troop_get_inventory_slot_modifier, ":modifier", "$cur_cont_troop", ":inv_slot"),
(overlay_get_position, pos1, ":object"),
(position_get_x, ":pos_x", pos1),
(position_get_y, ":pos_y", pos1),
(store_div, ":shift", "$cur_cont_inv_slot_size", 20),
(val_add, ":pos_x", ":shift"),
(val_add, ":pos_y", ":shift"),
(position_set_x, pos1, ":pos_x"),
(position_set_y, pos1, ":pos_y"),
(show_item_details_with_modifier, ":item_id", ":modifier", pos1, 100),
(else_try),
(close_item_details),
(try_end),
(try_end),
(else_try),
(eq, ":object", "$cur_cont"),
(close_item_details),
(try_end),
]),
#script_prsnt_relocate_item
# INPUT:
# param1: overlay id
# param2: mouse button (0 left mouse button, 1 right mouse button, 2 middle mouse button)
("prsnt_relocate_item",
[
(store_script_param_1, ":object"),
(store_script_param_2, ":mouse_button"),
(try_begin),
(eq, ":mouse_button", 0),
(try_begin),
(lt, "$g_moving_overlay", 0),
(try_begin),
(neq, ":object", "$cur_cont"),
(store_add, ":end", "$cur_cont", "$cur_cont_cap"),
(val_add, ":end", 1),
(store_add, ":start", "$cur_cont", 1),
(is_between, ":object", ":start", ":end"),
(store_sub, ":inv_slot", ":object", "$cur_cont"),
(val_add, ":inv_slot", 9),
(troop_get_inventory_slot, ":item_id", "$cur_cont_troop", ":inv_slot"),
(try_begin),
(gt, ":item_id", 0),
(close_item_details),
(assign, "$g_moving_item", ":item_id"),
(troop_get_inventory_slot_modifier, "$g_moving_modifier", "$cur_cont_troop", ":inv_slot"),
(troop_set_inventory_slot, "$cur_cont_troop", ":inv_slot", -1),
(troop_get_slot, "$g_moving_overlay", "trp_temp_array_a", ":object"),
(store_mul, ":moving_overlay_size", "$cur_cont_inv_slot_size", 226),
(val_div, ":moving_overlay_size", 100),
(overlay_set_container_overlay, "$g_moving_overlay", -1),
(mouse_get_position, pos1),
(overlay_set_position, "$g_moving_overlay", pos1),
(overlay_set_additional_render_height, "$g_moving_overlay", 2),
(position_set_x, pos1, ":moving_overlay_size"),
(position_set_y, pos1, ":moving_overlay_size"),
(overlay_set_size, "$g_moving_overlay", pos1),
(try_end),
(try_end),
(else_try),
(close_item_details),
(try_begin),
(neq, ":object", "$cur_cont"),
(store_add, ":end", "$cur_cont", "$cur_cont_cap"),
(val_add, ":end", 1),
(store_add, ":start", "$cur_cont", 1),
(is_between, ":object", ":start", ":end"),
(store_sub, ":inv_slot", ":object", "$cur_cont"),
(val_add, ":inv_slot", 9),
(troop_get_inventory_slot, ":item_id", "$cur_cont_troop", ":inv_slot"),
(try_begin),
(gt, ":item_id", 0),
(troop_get_inventory_slot_modifier, ":modifier", "$cur_cont_troop", ":inv_slot"),
(troop_set_inventory_slot, "$cur_cont_troop", ":inv_slot", "$g_moving_item"),
(troop_set_inventory_slot_modifier, "$cur_cont_troop", ":inv_slot", "$g_moving_modifier"),
(troop_get_slot, ":replaced_overlay", "trp_temp_array_a", ":object"),
(troop_set_slot, "trp_temp_array_a", ":object", "$g_moving_overlay"),
(assign, "$g_moving_item", ":item_id"),
(assign, "$g_moving_modifier", ":modifier"),
(overlay_set_additional_render_height, "$g_moving_overlay", 0),
(call_script, "script_prsnt_set_obj_pos_and_size", "$g_moving_overlay", "$cur_cont_troop", ":inv_slot", 1, "$cur_cont_inv_slot_size"),
(overlay_set_container_overlay, "$g_moving_overlay", "$cur_cont"),
(assign, "$g_moving_overlay", ":replaced_overlay"),
(overlay_set_container_overlay, "$g_moving_overlay", -1),
(mouse_get_position, pos1),
(overlay_set_position, "$g_moving_overlay", pos1),
(overlay_set_additional_render_height, "$g_moving_overlay", 2),
(store_mul, ":moving_overlay_size", "$cur_cont_inv_slot_size", 226),
(val_div, ":moving_overlay_size", 100),
(position_set_x, pos1, ":moving_overlay_size"),
(position_set_y, pos1, ":moving_overlay_size"),
(overlay_set_size, "$g_moving_overlay", pos1),
(else_try),
(troop_set_inventory_slot, "$cur_cont_troop", ":inv_slot", "$g_moving_item"),
(troop_set_inventory_slot_modifier, "$cur_cont_troop", ":inv_slot", "$g_moving_modifier"),
(troop_set_slot, "trp_temp_array_a", ":object", "$g_moving_overlay"),
(overlay_set_container_overlay, "$g_moving_overlay", "$cur_cont"),
(call_script, "script_prsnt_set_obj_pos_and_size", "$g_moving_overlay", "$cur_cont_troop", ":inv_slot", 1, "$cur_cont_inv_slot_size"),
(overlay_set_additional_render_height, "$g_moving_overlay", 0),
(overlay_get_position, pos1, ":object"),
(position_get_x, ":pos_x", pos1),
(position_get_y, ":pos_y", pos1),
(store_div, ":shift", "$cur_cont_inv_slot_size", 20),
(val_add, ":pos_x", ":shift"),
(val_add, ":pos_y", ":shift"),
(position_set_x, pos1, ":pos_x"),
(position_set_y, pos1, ":pos_y"),
(show_item_details_with_modifier, "$g_moving_item", "$g_moving_modifier", pos1, 100),
(assign, "$g_moving_overlay", -1),
(assign, "$g_moving_item", -1),
(try_end),
(try_end),
(try_end),
(try_end),
]),
module_presentations:
В вашей презентации
В блоке последствий тригера ti_on_presentation_load после (set_fixed_point_multiplier, 1000),
объявить 2 переменные(assign, "$g_moving_overlay", -1),
(assign, "$g_number_overlays", 0),
После чего вызываете script_prsnt_troop_inventory столько раз, сколько панелей инвентаря вы хотите создать, указав при этом желаемые параметры создаваемой панели(call_script, "script_prsnt_troop_inventory", <параметр1>, <параметр2>, <параметр3>, <параметр4>, <параметр5>),
параметр1. Юнит, чей инвентарь будет расположен на панели
параметр2. Размер ячейки инвентаря. По умолчанию 900 (как нативе). Из этого параметра также будет вычисляться ширина панели. Для корректной работы скрипта, желательно, чтобы число без остатка делилось на 20.
параметр3. Координата правой границы панели. Максимально 1000
параметр4. Координата нижней границы панели. Максимально 750
параметр5. Высота панели. Не должна быть больше чем 750 минус координата нижней границы
В блоке последствий тригера ti_on_presentation_run (try_begin),
(gt, "$g_moving_overlay", 0),
(mouse_get_position, pos1),
(overlay_set_position, "$g_moving_overlay", pos1),
(try_end),
В блоке последствий тригера ti_on_presentation_mouse_enter_leave (store_trigger_param_1, ":object"),
(store_trigger_param_2, ":enters_leaves"),
(call_script, "script_prsnt_init_variables_and_show_item_details", ":object", ":enters_leaves"),
В блоке последствий тригера ti_on_presentation_mouse_press (store_trigger_param_1, ":object"),
(store_trigger_param_2, ":mouse_button"),
(call_script, "script_prsnt_relocate_item", ":object", ":mouse_button"),
Пример:
Дополнительно добавив в module_meshes строку("inventory_window", 0, "inventory_window_b", 0, 0, 0, 0, 0, 0, 1, 1, 1),
а в module_presentations создав простую презентацию всего из тридцати строк ("test",0,mesh_inventory_window,[
(ti_on_presentation_load,
[(set_fixed_point_multiplier, 1000),
(assign, "$g_moving_overlay", -1),
(assign, "$g_number_overlays", 0),
(call_script, "script_prsnt_troop_inventory", "trp_player", 900, 980, 100, 600),
(call_script, "script_prsnt_troop_inventory", "trp_town_19_armorer", 900, 310, 100, 600),
(create_game_button_overlay, "$test_obj", "@Continue...", tf_center_justify),
(position_set_x, pos1, 500),
(position_set_y, pos1, 50),
(overlay_set_position, "$test_obj", pos1),
(presentation_set_duration, 999999),
]),
(ti_on_presentation_run,
[
(try_begin),
(gt, "$g_moving_overlay", 0),
(mouse_get_position, pos1),
(overlay_set_position, "$g_moving_overlay", pos1),
(try_end),
]),
(ti_on_presentation_event_state_change,
[
(store_trigger_param_1, ":object"),
(try_begin),
(lt, "$g_moving_overlay", 0),
(eq, ":object", "$test_obj"),
(presentation_set_duration, 0),
(try_end),
]),
(ti_on_presentation_mouse_enter_leave,
[
(store_trigger_param_1, ":object"),
(store_trigger_param_2, ":enters_leaves"),
(call_script, "script_prsnt_init_variables_and_show_item_details", ":object", ":enters_leaves"),
]),
(ti_on_presentation_mouse_press,
[
(store_trigger_param_1, ":object"),
(store_trigger_param_2, ":mouse_button"),
(call_script, "script_prsnt_relocate_item", ":object", ":mouse_button"),
]),
]),
Мы получаем практически полный аналог окна лутинга, за исключением возможности поменять собственную экипировку, но при необходимости это делается просто.
(http://i54.fastpic.ru/big/2012/1218/f0/24fea9d79a3f08711b480bf349626ef0.jpg)
(http://i54.fastpic.ru/big/2012/1218/92/78b8987ffefd77e5ce13d515de8eae92.jpg)
Как видите, нужно указать всего лишь 5 параметров, остальное сделают за вас скрипты