Голосование

Как вы оцениваете Смуту?












Оформление



Пользователей
  • Всего: 28883
  • Последний: alexff099
Сейчас на форуме
Пользователи: 0
Гостей: 764
Всего: 764

0 Пользователей и 1 Гость просматривают эту тему.

Тема: [Script]Добавление в презентацию интерактивного инвентаря  (Прочитано 4974 раз)

  • Сообщений: 350
  • За создание технических проектов различного характера
    • Просмотр профиля
Автор: uhanich
Версия игры: 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 параметров, остальное сделают за вас скрипты
« Последнее редактирование: 04 Февраля, 2013, 13:55 от uhanich »
  • Фракция: Наемники
  • Сообщений: 892
  • За создание крупных модов и других особо сложных проектов За создание технических проектов различного характера
    • Просмотр профиля
сколько панелей инвентаря вы хотите создать, указав при этом желаемые параметры создаваемой панели
А как можно создать панель инвентаря во всю ширину окна презентации, (не В 3 ячейки шириной, а в десять двенадцать)?
  • Сообщений: 892
  • За создание крупных модов и других особо сложных проектов За создание технических проектов различного характера
    • Просмотр профиля
Поправочка,
в скрипте "prsnt_relocate_item"
перед обоими (store_mul, ":moving_overlay_size", "$cur_cont_inv_slot_size", 226),
надо поставить (set_fixed_point_multiplier, 1000), т.к при выводе на презентацию геральдической брони множитель сбивается.

СиЧЪ Total War СиЧЪ Total War
Сайт "Всадники Кальрадии" не является СМИ. Администрация не несет ответственность за высказывания и публикацию каких-либо материалов, сделанные любыми пользователями форума, в том числе посредством личных и публичных сообщений. Материалы, размещенные на ресурсе третьими лицами, могут содержать информацию, не предназначенную для лиц, не достигнувших совершеннолетия. При обнаружении на ресурсе материалов, нарушающих законодательство Российской Федерации, необходимо обращаться к администрации.
Сайт работает на быстром VPS/VDS хостинге от FASTVPS


Powered by SMF 2.0 | SMF © Simple Machines LLC