Всадники Кальрадии

Модификации => Обмен опытом (в помощь мододелу) => OSP ресурсы: модели, текстуры, скрипты => Тема начата: uhanich от 19 Декабря, 2012, 00:58

Название: [Script]Добавление в презентацию интерактивного инвентаря
Отправлено: uhanich от 19 Декабря, 2012, 00:58
Автор: uhanich (http://rusmnb.ru/index.php?action=profile;u=15855)
Версия игры: 1.153
создавалось и тестировалось на 1.153, но гипотетически должно работать и на более ранних версиях.


Ниже комплект скриптов для создания в любой презентации аналога прокручиваемой панели с инвентарём из игровых окон натива (торговля, экипировка компаньонов, лутинг и пр.) всего в несколько строк.

Данный кит позволяет создать до десяти полностью интерактивных панели в одной презентации, функционально ничем не отличающихся от нативных (перемещение и замена предметов внутри одной панели и между разными панелями, всплывающие подсказки с информацией о предмете), а также настроить по своему желанию их масштаб, рабочую область и положение

Итак:

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>),

В блоке последствий тригера 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 создав простую презентацию всего из тридцати строк
Мы получаем практически полный аналог окна лутинга, за исключением возможности поменять собственную экипировку, но при необходимости это делается просто.



Как видите, нужно указать всего лишь 5 параметров, остальное сделают за вас скрипты
Название: Re: [Script]Добавление в презентацию интерактивного инвентаря
Отправлено: Pavvvell от 21 Октября, 2014, 13:14
сколько панелей инвентаря вы хотите создать, указав при этом желаемые параметры создаваемой панели
А как можно создать панель инвентаря во всю ширину окна презентации, (не В 3 ячейки шириной, а в десять двенадцать)?
Название: Re: [Script]Добавление в презентацию интерактивного инвентаря
Отправлено: Pavvvell от 14 Июля, 2016, 15:10
Поправочка,
в скрипте "prsnt_relocate_item"
перед обоими (store_mul, ":moving_overlay_size", "$cur_cont_inv_slot_size", 226),
надо поставить (set_fixed_point_multiplier, 1000), т.к при выводе на презентацию геральдической брони множитель сбивается.