Перейти к контенту

Уроки по модостроению


Zeka1996Korneev

Рекомендуемые сообщения

Тутор по системе апгрейдов (ЧН)

Для редактирования уже существующих апгрейдов на примере АК74 нам

обязательно понадобятся файлы:
1. configs\weapons\upgrades\w_ak74_up.ltx
2. configs\text\rus\st_items_weapons_upgrades.xml
3. configs\weapons\upgrades_properties.ltx
4. configs\weapons\w_ak74.ltx
5. configs\ui\textures_descr\ui_ingame2_common.xml

Итак, начнём, открыв файл №1. Видим уже привычную нам параметро-секционную структуру файла:
[секция1]
параметр1 = значение1
параметр2 = значение2
параметр3 = значение3
...

[секция2]
параметр1 = значение1
параметр2 = значение2
...

Все секции в файле №1 можно разбить на три типа:
1. Показывающие стоимость, изменения и значения описаний при апгрейде. Эти секции - не главные, на них идёт ссылка с секций вторых типов. Рассмотрим параметры на примере секции:

[up_sect_c_ak74]
cost                      = 1600
value                    = -30

cam_dispersion              = -0.21;0.7
cam_dispersion_inc             = -0.21;0.7
cam_step_angle_horz            = -0.21;0.7

zoom_cam_dispersion          = -0.2;0.6
zoom_cam_dispersion_inc      = -0.2;0.6
zoom_cam_step_angle_horz     = -0.2;0.6

Параметр cost означает цену, которую должен заплатить игрок для осуществления апгрейда.

Параметр value. Мы знаем, что во множестве апгрейдов есть такие, описания которых сводится к типу: [характеристика] [+ или -] [значение]%. Например: "Отдача -30%". Значение, которое показывается в данном случае берётся из параметра value (остальные случаи, в которых описание не подходит под эту схему, например, "не стреляет дробью" рассмотрим потом). Внимание: это значение является словесным описанием и никак не влияет на характеристики оружия". Т.е. можно в нашей секции поставить value = -10000. Суть апгрейда не изменится, изменяется только его описание.

Параметры изменения характеристик. Далее следуют изменения характеристик оружия. В значениях параметров указывается изменение, относительное по отношению к старым характеристикам. Допустим, перед апгрейдом было:

cam_dispersion = 0.7

Указав в параметрах в файле №1:

cam_dispersion = -0.21

в результате получаем:

cam_dispersion = 0.49

2. Главные секции апгрейда. Опять рассмотрим параметры:

[up_c_ak74]
scheme_index            = 0, 2
known                   = 1
effects                 = up_gr_ac_ak74
section                 = up_sect_c_ak74
property                = prop_recoil

precondition_functor    = inventory_upgrades.precondition_functor_a
precondition_parameter  = true

effect_functor          = inventory_upgrades.effect_functor_a
effect_parameter        = something_here

; ui
prereq_functor          = inventory_upgrades.prereq_functor_a
prereq_tooltip_functor  = inventory_upgrades.prereq_tooltip_functor_a
prereq_params           = up_c_ak74
name                    = st_upg_porsh_recoil
description             = st_upg_porsh_recoil_descr
icon                    = ui_wp_upgrade_41

Параметр scheme_index указывает положение иконки апгрейда в дереве апгрейдов (оно появляется при нажатии кнопки "улучшить") Подробнее на этом параметре остановимся во втором спойлере.

Параметр effects. Всем хорошо известно, что ап №1 во втором столбце дерева апов можно получить только тогда, когда проведены апы №1 и №3 в первом столбце. Для открытия апов после проведения других и служит параметр effects, включающий другие апгрейды. Он даёт ссылку на секцию №3. Подробнее на них остановимся чуть ниже.

Параметр section указывает ссылку на секцию №1. От этого значения зависит изменения при апе.

Параметр property указывает тип проводимого апа. Типы апов можно взять в начале файла №3. Подробнее об этом параметре в спойлере №3.

Типы апов:

prop_weight;; Вес
prop_silencer;; Глушитель
prop_underbarrel_slot;; Крепление подствольника
prop_reliability;; Надежность
prop_bullet_speed;; Настильность
prop_recoil;; Отдача
prop_ammo_size;; Патроны
prop_grenade_launcher;; Подствольник
prop_scope_4x;; Прицел 4
prop_scope_1.6x;; Прицел 1.6
prop_rpm;; Скорострельность
prop_calibre;; калибр (9x18, 5x45)
prop_dispersion;; Точность
prop_inertion;; Удобство

prop_armor;;Броня
prop_damage;;Повреждение
prop_durability;;Износостойкость (прочность)
prop_restore_bleeding;;Уменьшение кровотечения
prop_restore_health;;Восстановление здоровья
prop_night_vision;;Прибор ночного виденья
prop_power;;Восстановление стамины
prop_tonnage;;Переносимый вес
prop_radio_chem;;Радио-хим защита
prop_thermo_electro;;Термо-электро защита
prop_psy;;Пси защита
prop_artefact;;Слот для артефактов

Параметр prereq_params. В значении параметра указывайте секцию, в которой находится параметр. Нужно для скриптовых целей.

Параметр name содержит ссылку на текстовый блок из файла №2. В нашем случае:

name                    = st_upg_porsh_recoil
<string id="st_upg_porsh_recoil">
    <text>Модификация газового поршня</text>
</string>

Параметр description похож на параметр name, но касается описания апгрейда. Здесь:

description             = st_upg_porsh_recoil_descr
<string id="st_upg_porsh_recoil_descr">
    <text>Установка компенсатора газового поршня позволяет уменьшить отдачу</text>
</string>

Параметр icon содержит указатель на описание иконок в файле №5.
Вот структура файла:

<texture id="[указатель на иконку]" x="[координата x верхнего левого пикселя иконки]" y="[координата y верхнего левого пикселя иконки]" width="[ширина иконки]" height="[высота]" />

В нашем случае:

<texture id="ui_wp_upgrade_41" x="420" y="944" width="70" height="40" />

3. Секции, объединяющие апгрейды в группы апгрейдов. (в единственном параметре elements указываются апгрейды, входящие в группу, т.е. ссылки на секции вторых типов) Из группы апгрейдов может быть проведён только один апгрейд (в первом столбце может быть проведён только один из апгрейдов - №1 или №2). При включении группы апгрейдов включаются все апгрейды, входящие в группу. Для включения группы необходимо, чтобы все апгрейды с эффектом включения этой группы были проведены. (Для открытия группы апгрейдов up_gr_ac_ak74 необходимо, чтобы были проведены апгрейды up_gr_a_ak74 и up_gr_c_ak74. Названия тут ни при чём: в главных секциях (тип секции №2) этих двух апгрейдов параметр effects принимает значение up_gr_ac_ak74)

Таким образом, каждый апгрейд:
1. Имеет какие-то характеристики.
2. Имеет какое-то описание.
3. Принадлежит к какой-то группе апгрейдов.

Теперь несколько важных замечаний:
1. В файле №4 (конфиг самого АК74 и его уникальных модификаций) присутствует несколько параметров:

Параметр upgrades. В его значениях перечисляются группы апгрейдов, апгрейды которых могут быть проведены на чистом АК74. Перечисление идёт через запятую. После последней группы апгрейдов запятая не нужна.
Параметр installed_upgrades указывает апгрейды, которые уже проведены в этом оружии. Здесь указываются не группы апгрейдов, а сами апгрейды, т.е. секции второго типа.

Нам необходимо иметь 7 файлов:
1. configs\weapons\upgrades\w_ak74_up.ltx
2. configs\text\rus\st_items_weapons_upgrades.xml
3. configs\weapons\upgrades_properties.ltx
4. configs\ui\inventory_upgrade_16.xml (для широкоформатных)
5. configs\weapons\w_ak74.ltx
6. configs\ui\textures_descr\ui_ingame2_common.xml
7. scripts\inventory_upgrades.script

Перед прочтением текста ниже рекомендуется прочитать содержание первого спойлера.

Итак, начнём по порядку:
1. Создадим главную секцию (секцию типа №2) нового апгрейда, скопировав любую другую и поменяв параметры и само название секции:

[up_pack_a_ak74]
scheme_index            = 3, 0
known                   = 1
effects                 =
section                 = up_sect_pack_a_ak74
property                = prop_pack

precondition_functor    = inventory_upgrades.precondition_functor_a
precondition_parameter  = true

effect_functor          = inventory_upgrades.effect_functor_a
effect_parameter        = something_here

; ui
prereq_functor          = inventory_upgrades.prereq_functor_a
prereq_tooltip_functor  = inventory_upgrades.prereq_tooltip_functor_a
prereq_params           = up_pack_a_ak74
name                    = st_upg_pack_a_ak74
description             = st_upg_pack_a_ak74_descr
icon                    = ui_wp_upgrade_30

Как видим, в параметре property "prop_pack", мы указали не существующий тип. Мы его создадим самостоятельно чуть позже.

2. Теперь создадим секцию типа №1, которую мы указали в параметре section "up_sect_pack_a_ak74":

[up_sect_pack_a_ak74]
cost                      = 5120
value                    = desc_value_pack_a
rpm                     = 100
cam_dispersion              = -0.21;0.7
cam_dispersion_inc             = -0.21;0.7
cam_step_angle_horz            = -0.21;0.7
zoom_cam_dispersion          = -0.2;0.6
zoom_cam_dispersion_inc      = -0.2;0.6
zoom_cam_step_angle_horz     = -0.2;0.6
grenade_launcher_status = 2
grenade_launcher_name   = wpn_addon_grenade_launcher
grenade_launcher_x      = 126
grenade_launcher_y      = 24
control_inertion_factor    = -0.2
inv_weight                = -0.3
PDM_disp_vel_factor     = -0.3;1.7
PDM_disp_accel_factor   = -0.3;1.7

Здесь я собрал все улучшения четырёх апгрейдов, суммировав цену и делая скидку 20% (1600*4*0.8 = 5120) Отсюда и название апгрейда - st_upg_pack_a_ak74. В значении value я поставил "desc_value_pack_a". В данном случае в value присутствует ссылка на текстовый блок, а не кол-во процентов.

3. Теперь вернёмся в главную секцию. Т.к. апгрейд является пакетом апгрейдов up_sect_a_ak74,up_sect_c_ak74,up_sect_e_ak74,up_sect_g_ak74, то после проведения нашего апгрейда, четыре выше упомянутые должны выключиться. Для этого запишем наш апгрейд одновременно в несколько секций типов №3:

[up_gr_ab_ak74]
elements                = up_a_ak74, up_b_ak74, up_pack_a_ak74

[up_gr_cd_ak74]
elements                = up_c_ak74, up_d_ak74, up_pack_a_ak74

[up_gr_ef_ak74]
elements                = up_e_ak74, up_f_ak74, up_pack_a_ak74

[up_gr_gh_ak74]
elements                = up_g_ak74, up_h_ak74, up_pack_a_ak74

Т.к. из одной группы апгрейдов можно провести только один, то при проведении нашего апгрейда остальные "соседи" по группе апгрейдов выключатся.

4. Теперь, пользуясь файлом №2 запишем текстовые блоки, упомянутые в секциях типов №1 и №2.

    <string id="st_upg_pack_a_ak74">
        <text>Пакет апгрейдов №1</text>
    </string>
    <string id="st_upg_pack_a_ak74_descr">
        <text>Пакет апгрейдов №1, включающий в себя увеличение темпа стрельбы, уменьшение отдачи, установку крепежа для подствольного гранатомёта, уменьшение веса оружия</text>
    </string>
    <string id="st_upg_pack_a_ak74">
        <text>Пакет апгрейдов №1 Убийца</text>
    </string>

5. Теперь создадим ui для нашего апгрейда для того, чтобы кнопка апгрейда была видна в дереве апгрейдов. В парамре scheme_index мы указали "3,0". Это значит, что в дереве апгрейдов этот апгрейд будет в 3-ем столбце и 0-ой строке. К каждому оружию предлагается своя схема дерева апгрейдов. Чтобы узнать схему АК74 откроем его конфиг (файл №5) и найдём параметр upgrade_scheme. Его значение - upgrade_scheme_u17b. Откроем файл №4 со схемами апгрейдов. Вот его общая структура:

<template name="[название схемы]">

      [нулевой столбец]<column>
        [нулевая строка нулевого столбца. [b]Соответствует индексу 0,0[/b]]<cell x="[координата x]" y="[координата y]"   />
        [первая строка нулевого столбца. [b]Соответствует индексу 0,1[/b]]<cell x="[координата x]" y="[координата y]"  />
        ...
      [конец нулевого столбца]</column>

      [начало первого столбца]<column>
        [нулевая строка первого столбца. [b]Соответствует индексу 1,0[/b]]<cell x="[координата x]" y="[координата y]"  />
        ...
      [конец первого столбца]</column>
      ...
    [конец схемы]</template>

Найдём интересующую нас схему и добавим столбец и строку:

   <template name="upgrade_scheme_u17b">

      <column>
        <cell x="17" y="5"   />
        <cell x="17" y="50"  />
        <cell x="17" y="100" />
        <cell x="17" y="145" />
        <cell x="17" y="195" />
        <cell x="17" y="240" />
        <cell x="17" y="290" />
        <cell x="17" y="335" />
        <cell x="17" y="385" />
      </column>

      <column>
        <cell x="100" y="50"  />
        <cell x="100" y="100" />
        <cell x="100" y="240" />
        <cell x="100" y="290" />
        <cell x="100" y="385" />
       </column>

      <column>
        <cell x="183" y="145" />
        <cell x="183" y="195" />
        <cell x="183" y="385" />
      </column>
      
      <column>
        <cell x="183" y="5" />
      </column>

    </template>

6. Создадим новый тип апгрейдов: prop_pack. Для этого воспользуемся файлом №3.
Для начала добавим наш тип в начало файла:

[upgrades_properties]
prop_pack
prop_weight;; Вес
prop_silencer;; Глушитель
prop_underbarrel_slot;; Крепление подствольника
...

Теперь создадим новую секцию:

[prop_pack]
name     = st_prop_weight
icon     = ui_wp_propery_11
functor  = inventory_upgrades.property_functor_d
params   = hit_power, rpm, cost

В нашем случае важен только один параметр:

functor  = inventory_upgrades.property_functor_d

Он указывает, какая скриптовая функция будет составлять описание. Вы можете сами рассмотреть остальные параметры: name - название типа апгрейда (даётся ссылка на текстовый блок), icon - ссылка на указатель иконок из файла №6.

7. Составим функцию описания апгрейда inventory_upgrades.property_functor_d. Для этого откроем файл №7 и впишем туда маленькую функцию:

function property_functor_d( param1, name )
    local prorerty_name = char_ini:r_string(name, "name")
    local value_table = utils.parse_names(param1)
    local section = value_table[1]
    if section then
        local value = char_ini:r_string(section, "value")
        if value then
            return game.translate_string(value)
        end
    end
    return game.translate_string(prorerty_name)
end

 

 

Изменено пользователем World_Stalker
  • Спасибо 2
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...