Как определить оптимальную глубину рассчета параметров чаров/мобов в ядре?

BladeRunner

Дрыщ, очкарик, задрот, ботан, на мамкиной шее
Меценат
Сообщения
1 490
Розыгрыши
0
Репутация
-268
Реакции
541
Баллы
615
Хроники
  1. Interlude
  2. Chaotic Throne: High Five
  3. Goddess of Destruction Lindvior
  4. Master Class
Исходники
Присутствуют
Сборка
все
как-то поднимали мельком тему в чате, как оптимизировать рассчеты в ядре сборки. Насколько глубоко и как часто надо пересчитывать все параметры?
Например, у нас есть одетый чар, с полученными статами. как глубоко мы при каждом его действии/ударе перепроверяем/считаем его параметры? ведь по сути каждый параметр имеет глубокую ветвь рассчета от изначальных табличных параметров и исходных статов. И если заморочиться, то и табличные параметры можно еще глубже определить через функции их рассчета.
Собственно вопрос, как определить оптимальную глубину просчета параметров на результат каждого действия чара? В каких ядрах ява/птс какие решения в этом плане используются? и как по вашему эффективнее, как можно оптимизировать? Хранить максимально посчитанную таблицу параметров чара, обновляя ее при смене эквипа/бафов/обнормалов, или пересчитывать каждый тик/действие?
Понятно сформулировал вопрос?
 
Последнее редактирование:
ну если в статах нет вложенных кондишнов то можно конечно, но это такое костылище и извращение...
а вот если есть кондишны, то никаких кэширований и т.п. быть не может по определению, т.к. нам всегда в этом случае надо пробегаться по всем зареганным в калькуляторе функциям для статы, чтобы получать всегда актуальное финальное значение с учетом условий кондишнов.
 

нубский вопрос - кондишены это....?
 
нубский вопрос - кондишены это....?
условия для юза скиллов/учета в данный момент знаечния статы в калькуляторе

ну вот как пример - тут ноды using как раз кондишны/условия использования этих значений стат только когда экипировано оружие перечисленных типов
XML:
    <skill id="10001" levels="10" name="Великое Владение Мечом / Дробящим Оружием" pts_name="[s_knight_sword_blunt_mastery1]">
        <stat name="icon" value="icon.skill10001" />
        <stat name="magicLevel" value="{85 90 95 99 100 102 104 106 108 110}" />
        <stat name="operateType" value="P" />
        <for>
            <set order="0x10" stat="skillCritical" value="1" />
            <add order="0x40" stat="STR" value="2" />
            <add order="0x40" stat="powerShock" value="75" />
            <add order="0x40" stat="pAccuracy" value="8">
                <using weapon="sword;buster;twohandsword;blunt;staff;twohandblunt;twohandstaff" />
            </add>
            <add order="0x40" stat="pAtk" value="{1689 1958 2270 2555 2895 3071 3258 3457 3667 3890}">
                <using weapon="sword;buster;twohandsword;blunt;staff;twohandblunt;twohandstaff" />
            </add>
            <mul order="0x30" stat="pAtk" value="20;per">
                <using weapon="sword;buster;twohandsword;blunt;staff;twohandblunt;twohandstaff" />
            </mul>
            <mul order="0x30" stat="hateBonus" value="560;per">
                <using weapon="sword;buster;twohandsword;blunt;staff;twohandblunt;twohandstaff" />
            </mul>
            <mul order="0x30" stat="pvePDamageBonus" value="30;per" />
            <mul order="0x30" stat="pvePSkillDamageBonus" value="30;per" />
            <mul order="0x30" stat="pveMSkillDamageBonus" value="30;per" />
            <mul order="0x30" stat="pSkillPower" value="{0 0 0 0 0 0 0 2 3 5};per" levels="8+" />
        </for>
    </skill>
 
У вас есть пример кода как такие conditions используются в калькуляторах? Все то что я видел основывается на использование conditions у скиллов. Ну перед тем как скилл использовать будет проверка на условия (conditions) . Но я не видел примеров кода где они могли бы использоватся в функцияx калькулятора. Скажем так, в L2J есть код под condition для функций калькулятора, но сами conditions не создаются при парсинге XML от брони или же прeдметов. То есть единственное место то что я видел где conditions действительно существуют, так это скиллы.

Кстати немного неправильно сказал. Условия как таковые существуют на придметаx, но не на функциях калькуляторов. Но вот интересно то что кто и где именно используюет conditions именно для вычисления статов.
 
Судя по xml описанию пассивки, могу предположить что у гайки кондишны проверяются при вызове calc эффекта. Дополнительный плюс в том, что кондишны описываются в одном месте и могут использоваться как для определенного эффекта, так для для условия к касту скила. У мобиуса например есть куча реализаций эффектов, в каждом свое условие
 
Да в том же овере к примеру это повсеместно в баффах или пассивках разных используется для того чтобы например конкретизировать, при наличии какого экипированного оружия или брони давать прибавки.
Без подобного пришлось бы например для всех видов оружия заводить отдельные статы (например pAtkForSword или pAtkForBlunt), чтобы корректно считать итоговые значения при использовании разных видов оружия. Ну или передавать условия параметрами статы/эффекта.

Не разбирался детально как там лыже или у мобиуса, но скорее всего там так же при их pump-ах идут проверки подобные - просто там те же типы оружия к примеру вроде как передаются как параметры для стат/эффектов. Но смысл остается тот же, правда становится еще более замороченным, т.к. нам приходится в каждом подобном эффекте/стате реализовывать проверки этих параметров.

---
Потому мне вот и более логичен и прост принцип реализации работы со статами в овере, по сравнению с тем же мобиусом и т.п.
Он может и немного более ресурсоемкий, но зато более понятный, простой и гибкий. При этом в любой момент времени при запросе финального значения статы мы гарантированно получаем именно актуальное на этот момент значение, с учетом всех условий для расчета этой статы, т.к. мы проходим всю цепочку расчетов при этом.
 
Последнее редактирование:
Это видел. Но какое имеет отношение использование условий в бафаx и пассивных скиллах к калькуляторам статов? Статы ведь изменяются спомощью функций статов, а не самими эффектами/баффами/скиллами или же предметами. Я к тому что эффекты скиллов сами производят функции которые добавляются к мобу или персонажу. Ну а при пересчете определенного значения сами условия conditions не используются.
 
Ну у меня к примеру используются и проверяются калькулятором при расчетах. И в исходном овере использовались. И в "папе/маме" овера - фениксе, тоже использовались
 
Они в эффектах, в птс есть такая функция CheckPumpCondition, которая для эффектов типа pump (то есть все что связано с p_* эффектами)


XML:
<skill id="10001" fromLevel="1" toLevel="12" name="Superior Sword/Blunt Weapon Mastery" updatedFromClientData="true">
    <icon>icon.skill10001</icon>
    <operateType>P</operateType>
    <magicLevel>
        <value level="1">85</value>
        <value level="2">90</value>
        <value level="3">95</value>
        <value level="4">99</value>
        <value level="5">100</value>
        <value level="6">102</value>
        <value level="7">104</value>
        <value level="8">106</value>
        <value level="9">108</value>
        <value level="10">110</value>
        <value level="11">115</value>
        <value level="12">120</value>
    </magicLevel>
    <automaticUse>NONE</automaticUse>
    <magicCriticalRate>5</magicCriticalRate>
    <effects>
        <effect name="p_skill_critical">
            <stat>STR</stat>
        </effect>
        <effect name="p_stat_up">
            <stat>STR</stat>
            <amount>2</amount>
        </effect>
        <effect name="p_physical_attack">
            <weaponType>
                <item>SWORD</item>
                <item>BUSTER</item>
                <item>TWOHANDSWORD</item>
                <item>BLUNT</item>
                <item>STAFF</item>
                <item>TWOHANDBLUNT</item>
                <item>TWOHANDSTAFF</item>
            </weaponType>
            <amount>
                <value level="1">1689</value>
                <value level="2">1958</value>
                <value level="3">2270</value>
                <value level="4">2555</value>
                <value level="5">2895</value>
                <value level="6">3071</value>
                <value level="7">3258</value>
                <value level="8">3457</value>
                <value level="9">3667</value>
                <value level="10">3890</value>
                <value level="11">4279</value>
                <value level="12">4707</value>
            </amount>
            <mode>DIFF</mode>
        </effect>
        <effect name="p_physical_attack">
            <weaponType>
                <item>SWORD</item>
                <item>BUSTER</item>
                <item>TWOHANDSWORD</item>
                <item>BLUNT</item>
                <item>STAFF</item>
                <item>TWOHANDBLUNT</item>
                <item>TWOHANDSTAFF</item>
            </weaponType>
            <amount>
                <value level="1">15</value>
                <value level="2">20</value>
                <value level="3">25</value>
                <value level="4">30</value>
                <value level="5">35</value>
                <value level="6">40</value>
                <value level="7">45</value>
                <value level="8">50</value>
                <value level="9">55</value>
                <value level="10">60</value>
                <value level="11">65</value>
                <value level="12">65</value>
            </amount>
            <mode>PER</mode>
        </effect>
        <effect name="p_hit">
            <weaponType>
                <item>SWORD</item>
                <item>BUSTER</item>
                <item>TWOHANDSWORD</item>
                <item>BLUNT</item>
                <item>STAFF</item>
                <item>TWOHANDBLUNT</item>
                <item>TWOHANDSTAFF</item>
            </weaponType>
            <amount>8</amount>
            <mode>DIFF</mode>
        </effect>
        <effect name="p_hate_attack">
            <weaponType>
                <item>SWORD</item>
                <item>BUSTER</item>
                <item>TWOHANDSWORD</item>
                <item>BLUNT</item>
                <item>STAFF</item>
                <item>TWOHANDBLUNT</item>
                <item>TWOHANDSTAFF</item>
            </weaponType>
            <amount>560</amount>
            <mode>PER</mode>
        </effect>
        <effect name="p_pve_physical_attack_dmg_bonus">
            <type>ENEMY_ALL</type>
            <amount>
                <value level="1">30</value>
                <value level="2">33</value>
                <value level="3">36</value>
                <value level="4">39</value>
                <value level="5">42</value>
                <value level="6">45</value>
                <value level="7">48</value>
                <value level="8">51</value>
                <value level="9">54</value>
                <value level="10">57</value>
                <value level="11">61</value>
                <value level="12">65</value>
            </amount>
            <mode>PER</mode>
        </effect>
        <effect name="p_pve_physical_skill_dmg_bonus">
            <type>ENEMY_ALL</type>
            <amount>
                <value level="1">30</value>
                <value level="2">33</value>
                <value level="3">36</value>
                <value level="4">39</value>
                <value level="5">42</value>
                <value level="6">45</value>
                <value level="7">48</value>
                <value level="8">51</value>
                <value level="9">54</value>
                <value level="10">57</value>
                <value level="11">61</value>
                <value level="12">65</value>
            </amount>
            <mode>PER</mode>
        </effect>
        <effect name="p_skill_power" fromLevel="8" toLevel="12">
            <amount>
                <value level="8">1</value>
                <value level="9">2</value>
                <value level="10">3</value>
                <value level="11">4</value>
                <value level="12">5</value>
            </amount>
            <mode>PER</mode>
        </effect>
        <effect name="p_skill_critical_probability" fromLevel="8" toLevel="12">
            <amount>
                <value level="8">1</value>
                <value level="9">2</value>
                <value level="10">3</value>
                <value level="11">4</value>
                <value level="12">5</value>
            </amount>
            <mode>PER</mode>
        </effect>
        <effect name="p_physical_skill_critical_damage" fromLevel="8" toLevel="12">
            <amount>
                <value level="8">5</value>
                <value level="9">10</value>
                <value level="10">15</value>
                <value level="11">17</value>
                <value level="12">20</value>
            </amount>
            <mode>PER</mode>
        </effect>
    </effects>
</skill>
 
Я согласен что есть и работает. Но фишка в том что это не работa калькуляторa статов, а просто проверка условий работы скилла или же эффекта скилла. Ну а если еффект прекращает работу, то фсе функции эффекта будут убраны. Вот и все. Работают условия проверки (conditions) ? Конечно да. Но в смысле пересчета статов там ничего не происходит. Пересчет будет тогда когда нужно, ну например другой скилл что-то проверяет. А без кеширования у нас может пересчет постоянно проходить, даже если у тебя уж много бафов с pump видом.
 
Он вызывается при пересчете статов CCreature::ValidateSkillMod
 
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше…