11-24-2007, 11:41 PM
Оружие, броня, параметры скиллов сохранены в XML файлах и в базе данных. В скором времени использование базы данных для скиллов будет удалено. В XML файлах сохранено описание как вещи и скиллы должны влиять на статы (которые используются для подсчета повреждений, шансов и т.д.).
Вот пример XML файла для оружия и брони:
Первая строчка нужна только для самого языка XML, пропустите её.
Вторая строка указывает ID вещи и её название (они должны совпадать с такими же в БД).
Затем есть некоторые условия (condition) для принятия вещью изменений для статов (когда оружие одето или снято).
Таких условий может быть от ноль, один, два, или более. Условие заключено в тэг <for>.
Тэг условия состоит из самого условия которое следует проверить на игроке и эффекта на статы игрока. В вышенаписанном примере условие добавление эффекта - это расса людей (если не хуман - эффект не включится). Условие заключено в тэг <cond>, и оно не обязательно. Если условия не указаны - все игроки (которые одевают эту броню\оружие) будут получать эффект от него.
Эффект - это добавление или умножение статов игрока на заданное количество. В примере стат 'pDef' (power defence) и его значение 36. Это означает, что к power defence игрока будет добавлено значение 36. Я опишу 'order' ниже.
В конце, даже если функцию подключена к игроку, необходимо чтобы было условие когда оно будет работать. В нашем примере условие таково: pDef будет увеличен только тогда, когда цель игрока - атака skeleton.
И снова: может быть множество условий <for>, они могут иметь условие присоединенное к игроку <cond>, и каждый из них может влиять на один или несколько статов игрока ( <add>, <sub>, <mul>, <div> ), и каждый стат будет добавлен только в том случае когда условие будет выполнено.
Конечно, всё это не обязательно. Для большинства предметов брони и оружия вы будете иметь что-то простое похожее на это:
которое всего лишь добавляет 36 пунктов к power defence для каждого игрока который оденет её, без каких-либо условий.
Скиллы описаны практически так же, но с одним дополнением - у скиллов есть уровни. По-этому значение для увеличения\уменьшения стата будет зависеть от уровня скилла. Для этих целей мы имеем таблицы:
В строке <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>:
Условиями являются:
Операциями над значениями являются:
Операция для "случайных" чисел и корней и других математический функций возможно будут добавлены позже, в случае необходимости.
Вы должны указать значение не как константу, а как выражение:
Такое выражение начинает расчитывать со значение 0, и для примера вверху мы имеем уровень игрока умноженный на значение с таблицы, и это значение будет использовано для для расчета повреждений манны для каждого периода эффекта. Итого, в результате мы имеем - повышеную точность (accuracy) в бою плюс отнимание за это манны (МР).
Возможные значения для рассчетов:
Продолжительными эффектами скиллов являются:
Вот некоторые статы для редактирования.
Это не все, это всего лишь часть статов, которые мне пришли в голову, но могут вам быть полезными для редактирование шмота и т.д.
Теперь рассмотрим как сделать какой-либо шмот уникальным.
И так, выбираем шмотик который хотим усовершенствовать: я для себя выбрал:
Открываем data\stats\armor600-0699.xml, находим строчку с нашим "плащом магии".
Так как он плащ магии, неплохо было бы сделать его для магов. А что надо магам? Правильно МР, реген МР, скорость каста, сила каста. Но давать всё это сразу - слишком много, по-этому сделаем какие-нибудь три изменения, например увеличим интеллект на +1, regMp, ну и скорость каста (mAtkSpd).
Хм, с бонусами вроде определились, теперь надо определится в количестве этого бонуса, будет ли оно просто добавлять какое-то заданное число (константу) либо проценты от уже имеющегося стата (тобишь был mdef 100, добавили 10% - получили 110).
Для себя я выбираю так:
INTу добавляю 1.
Регенерацию МР - повышаю на 20%.
Скорость каста на 25%.
Теперь что касается соответсвующего кода:
Так как мы добавляем (знак +) INT, то используем тэг <add>:
С интом разобрались, теперь что касающееся regMp (знак *, умножение):
Обратите внимание на order!
Теперь скорость каста на 25%:
В итоге наш плащ будет иметь такой вид:
Автор тектста: VersuS
Вот пример XML файла для оружия и брони:
<?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> ), и каждый стат будет добавлен только в том случае когда условие будет выполнено.
Конечно, всё это не обязательно. Для большинства предметов брони и оружия вы будете иметь что-то простое похожее на это:
<?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 для каждого игрока который оденет её, без каких-либо условий.
Скиллы описаны практически так же, но с одним дополнением - у скиллов есть уровни. По-этому значение для увеличения\уменьшения стата будет зависеть от уровня скилла. Для этих целей мы имеем таблицы:
<?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>:
<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>
Условиями являются:
<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 -
список типа разделен запятыми -->
Операциями над значениями являются:
<add stat='...' val='...'/> <!-- add a value -->
<sub stat='...' val='...'/> <!-- значение подстановки -->
<mul stat='...' val='...'/> <!-- умножить на значение -->
<div stat='...' val='...'/> <!-- разделить на значение -->
Операция для "случайных" чисел и корней и других математический функций возможно будут добавлены позже, в случае необходимости.
Вы должны указать значение не как константу, а как выражение:
<?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) в бою плюс отнимание за это манны (МР).
Возможные значения для рассчетов:
$player_level
$target_level
$player_max_hp
$player_max_mp
Продолжительными эффектами скиллов являются:
<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 -->
Вот некоторые статы для редактирования.
'rEvas'
'cAtk'
'pAtkSpd'
'mAtkSpd'
'maxНp'
'maxMp'
'pAtk'
'mAtk'
'regMp'
'mDef'
'pDef'
'runSpd'
'reflectDam'
'sleepRes'
'rootRes'
'stunRes'
'poisonRes'
'bleedRes'
Это не все, это всего лишь часть статов, которые мне пришли в голову, но могут вам быть полезными для редактирование шмота и т.д.
Теперь рассмотрим как сделать какой-либо шмот уникальным.
И так, выбираем шмотик который хотим усовершенствовать: я для себя выбрал:
<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\armor600-0699.xml, находим строчку с нашим "плащом магии".
Так как он плащ магии, неплохо было бы сделать его для магов. А что надо магам? Правильно МР, реген МР, скорость каста, сила каста. Но давать всё это сразу - слишком много, по-этому сделаем какие-нибудь три изменения, например увеличим интеллект на +1, regMp, ну и скорость каста (mAtkSpd).
Хм, с бонусами вроде определились, теперь надо определится в количестве этого бонуса, будет ли оно просто добавлять какое-то заданное число (константу) либо проценты от уже имеющегося стата (тобишь был mdef 100, добавили 10% - получили 110).
Для себя я выбираю так:
INTу добавляю 1.
Регенерацию МР - повышаю на 20%.
Скорость каста на 25%.
Теперь что касается соответсвующего кода:
Так как мы добавляем (знак +) INT, то используем тэг <add>:
<add val='1' order='0x10' stat='INT'/>
С интом разобрались, теперь что касающееся regMp (знак *, умножение):
<mul val='1.20' order='0x20' stat='regMp'/>
Обратите внимание на order!
Теперь скорость каста на 25%:
<mul val='1.20' order='0x20' stat='mAtkSpd'/>
В итоге наш плащ будет иметь такой вид:
<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>
Автор тектста: VersuS