Оружие, броня, параметры скиллов сохранены в XML файлах и в базе данных. В скором времени использование базы данных для скиллов будет удалено. В XML файлах сохранено описание как вещи и скиллы должны влиять на статы (которые используются для подсчета повреждений, шансов и т.д.).
Вот пример XML файла для оружия и брони: Код HTML:
<?xml version='1.0' encoding='utf-8'?> <item id='21' name="shirt"> <for> <cond><player race="Human"/></cond> <add stat='pDef' order='0x10' val='36'> <target kind="skeleton"> </add> </for> </item>
Первая строчка нужна только для самого языка XML, пропустите её.
Вторая строка указывает ID вещи и её название (они должны совпадать с такими же в БД).
Затем есть некоторые условия (condition) для принятия вещью изменений для статов (когда оружие одето или снято). Таких условий может быть от ноль, один, два, или более. Условие заключено в тэг <for>.
Тэг условия состоит из самого условия которое следует проверить на игроке и эффекта на статы игрока. В вышенаписанном примере условие добавление эффекта - это расса людей (если не хуман - эффект не включится). Условие заключено в тэг <cond>, и оно не обязательно. Если условия не указаны - все игроки (которые одевают эту броню\оружие) будут получать эффект от него.
Эффект - это добавление или умножение статов игрока на заданное количество. В примере стат 'pDef' (power defence) и его значение 36. Это означает, что к power defence игрока будет добавлено значение 36. Я опишу 'order' ниже.
В конце, даже если функцию подключена к игроку, необходимо чтобы было условие когда оно будет работать. В нашем примере условие таково: pDef будет увеличен только тогда, когда цель игрока - атака skeleton.
И снова: может быть множество условий <for>, они могут иметь условие присоединенное к игроку <cond>, и каждый из них может влиять на один или несколько статов игрока ( <add>, <sub>, <mul>, <div> ), и каждый стат будет добавлен только в том случае когда условие будет выполнено.
Конечно, всё это не обязательно. Для большинства предметов брони и оружия вы будете иметь что-то простое похожее на это: Код HTML: <?xml version='1.0' encoding='utf-8'?> <item id='21' name="shirt"> <for> <add stat='pDef' order='0x10' val='36'/> </for> </item> которое всего лишь добавляет 36 пунктов к power defence для каждого игрока который оденет её, без каких-либо условий.
Скиллы описаны практически так же, но с одним дополнением - у скиллов есть уровни. По-этому значение для увеличения\уменьшения стата будет зависеть от уровня скилла. Для этих целей мы имеем таблицы: Код HTML: <?xml version='1.0' encoding='utf-8'?> <skill id='113' levels='2' name="Long Shot"> <table name="#dist"> 200 400 </table> <for> <add stat='rAtk' order='0x10' val='#dist'> <using kind="Bow"/> </add> </for> </skill>
В строке <skill> вы выборочно указываете количество уровней. Затем вы провозглашаете таблицу (вы можете провозгласить много *04 ), каждый из них будет иметь 'level' значения отделенные друг от друга пробелами. Название таблицы может быть любым, но должно начинаться с символа #. В значениях вы указываете название вашей таблицы.
Сейчас я опишу "order" параметр. "Order" это порядок проведения расчетов. Давайте представим что мы имеем base power defence игрока: basePDef защита одетого доспеха: armourPDef level modifier of the player: lvl passive skill of power defence которое надо добавить: skillPDef1 buff of power defence которое надо умножить: skillPDef2
Получаем такую формулу: ((basePDef + armorPDef)*lvl + skillPDef1)*skillPDef2
Знаки умножение\суммы в этой формуле указаны 'order'ом расчета. Получается: basePDef будеть иметь order 0x10 armorPDef будеть иметь order 0x10 lvl будеть иметь order 0x30 skillPDef1 будеть иметь order 0x40 skillPDef2 будеть иметь order 0x50
Значения с одинаковыми 'order'ами расчета будут рассчитаны в не предсказуемом порядке. По-этому, никогда не указывай одинаковый order параметрам add/substiture и multiplay/divide.
Немного больше о условиях. Вы можете указывать логические операции <and>, <or>, <not>: Код HTML: <and><player race="Human"/><player level="11"/></and> <or><player race="Human"/><player race="Orc"/></or> <not><player race="Human"/></not>
<and> <not> <player race="Human"/> </not> <or> <player level="11"/> <not> <player level=40> </not> </or> </and>
Условиями являются: Код HTML: <player race="..."/> <!-- проверяет рассу игрока --> <player level="..."/> <!-- проверяет является ли уровень игрока таким, или выше указанного здесь --> <player state="..."/> <!-- Делает проверку игрока на выполнение действий: sit, walk, run, swim, etc --> <target level="..."> <!-- проверяет является ли уровень цели таким, или выше указанного здесь --> <using kind="..."/> <!-- игроков одета броня указанного типа, или оружие указанного вида. Броня бывает Light, Heavy, Magic, оружие: Shield, Sword, Blunt, Dagger, Bow, Pole, Etc, Fist, Dual Sword, Dual Fist - список типа разделен запятыми -->
Операциями над значениями являются: Код HTML: <add stat='...' val='...'/> <!-- add a value --> <sub stat='...' val='...'/> <!-- значение подстановки --> <mul stat='...' val='...'/> <!-- умножить на значение --> <div stat='...' val='...'/> <!-- разделить на значение -->
Операция для "случайных" чисел и корней и других математический функций возможно будут добавлены позже, в случае необходимости.
Вы должны указать значение не как константу, а как выражение: Код HTML: <?xml version='1.0' encoding='utf-8'?> <skill id='256' levels='1' name="Accuracy"> <table name="#acc"> 10 </table> <table name="#mana"> 0.2 </table> <for> <add val='#acc' order='0x10' stat='accCombat'/> <effect name="ManaDamOverTime" time="5" count="0x7fffffff"> <val> <add val="$player_level"/> <mul val="#mana"/> </val> </effect> </for> </skill>
Такое выражение начинает расчитывать со значение 0, и для примера вверху мы имеем уровень игрока умноженный на значение с таблицы, и это значение будет использовано для для расчета повреждений манны для каждого периода эффекта. Итого, в результате мы имеем - повышеную точность (accuracy) в бою плюс отнимание за это манны (МР). Возможные значения для рассчетов: Код HTML: $player_level $target_level $player_max_hp $player_max_mp
Продолжительными эффектами скиллов являются: Код HTML: <effect name="Buff"> <!-- buff/debuff, для debuff исользуйте отрицательные значения --> <effect name="DamOverTime"> <!-- единоразовое отнятие HP --> <effect name="ManaDamOverTime"> <!-- единоразовое отнятие MP --> <effect name="HealOverTime"> <!-- единоразовое увеличение HP --> <effect name="Charge"> <!-- "заряжает" игрока, подготавливает его для использования другого скилла --> <effect name="Relaxing"> <!-- relaxing skill --> Вот некоторые статы для редактирования. Код HTML: 'rEvas' 'cAtk' 'pAtkSpd' 'mAtkSpd' 'maxНp' 'maxMp' 'pAtk' 'mAtk' 'regMp' 'mDef' 'pDef' 'runSpd' 'reflectDam' 'sleepRes' 'rootRes' 'stunRes' 'poisonRes' 'bleedRes'
Это не все, это всего лишь часть статов, которые мне пришли в голову, но могут вам быть полезными для редактирование шмота и т.д. Теперь рассмотрим как сделать какой-либо шмот уникальным.
И так, выбираем шмотик который хотим усовершенствовать: я для себя выбрал: Код HTML: <item id='616' name="cloak_of_magic"> <for> <add val='11' order='0x10' stat='pDef' /> <enchant val='0' order='0x0C' stat='pDef' /> </for> </item>
Открываем data\stats\armor\0600-0699.xml, находим строчку с нашим "плащом магии".
Так как он плащ магии, неплохо было бы сделать его для магов. А что надо магам? Правильно МР, реген МР, скорость каста, сила каста. Но давать всё это сразу - слишком много, по-этому сделаем какие-нибудь три изменения, например увеличим интеллект на +1, regMp, ну и скорость каста (mAtkSpd).
Хм, с бонусами вроде определились, теперь надо определится в количестве этого бонуса, будет ли оно просто добавлять какое-то заданное число (константу) либо проценты от уже имеющегося стата (тобишь был mdef 100, добавили 10% - получили 110).
Для себя я выбираю так: INTу добавляю 1. Регенерацию МР - повышаю на 20%. Скорость каста на 25%.
Теперь что касается соответсвующего кода:
Так как мы добавляем (знак +) INT, то используем тэг <add>: Код HTML: <add val='1' order='0x10' stat='INT'/>
С интом разобрались, теперь что касающееся regMp (знак *, умножение): Код HTML: <mul val='1.20' order='0x20' stat='regMp'/>
Обратите внимание на order! Теперь скорость каста на 25%: Код HTML: <mul val='1.20' order='0x20' stat='mAtkSpd'/>
В итоге наш плащ будет иметь такой вид: Код HTML: <item id='616' name="cloak_of_magic"> <for> <add val='11' order='0x10' stat='pDef' /> <add val='1' order='0x10' stat='INT'/> <mul val='1.20' order='0x20' stat='regMp'/> <mul val='1.20' order='0x20' stat='mAtkSpd'/> <enchant val='0' order='0x0C' stat='pDef' /> </for> </item>
|