Следуя тому, что сказал Willcodejavaforfood, вы можете создать класс SpellEffect
, который описывает один эффект, который может оказать ваше заклинание. Вы можете создать «словарь» для описания:
Атрибуты заклинания:
- Имя
- Стоимость маны
- Целевое ограничение заклинания целом (игрок, NPC, монстр, ...)
- Общая продолжительность заклинания (наибольшая из длительностей эффекта заклинания) (10 секунд, 5 тактов, ...)
- Время каста
- Дальность заклинаний (5 метров, 65 единиц, ...)
- Процент отказов (5%, 90%)
- Время ожидания, прежде чем это заклинание может быть снова использовано (Время перемотки)
- Время ожидания, прежде чем ЛЮБОЕ заклинание может быть снова использовано (Время восстановления)
- и т.д ...
Атрибуты для эффекта заклинания:
- Тип эффекта (защита, нападение, бафф, дебафф, ...)
- Цель Эффект (само, партия, цель, область вокруг цели, линия к цели, ...)
- Свойство или характеристики, на которые действует эффект (л.с., мана, макс. Л.с., сила, скорость атаки, ...)
- Насколько эффект меняет стат (+10, -500, 5%, ...)
- Как долго длится эффект (10 секунд, 5 тиков, ...)
- и т.д.
Я бы предположил, что ваш словарный запас (слова в скобках выше) будет определен в виде набора перечислений. Также может быть целесообразно создать иерархию классов для представления типов SpellEffect вместо использования перечисления для этого конкретного атрибута, поскольку может быть типом SpellEffect, которому не нужны все эти атрибуты или, возможно, существует какая-то нестандартная логика для каждого базового типа SpellEffect, о которой я не думаю. Но это также может усложнить ситуацию. Принцип поцелуя =).
В любом случае, дело в том, что вы извлекаете конкретную информацию об эффекте заклинания в отдельную структуру данных. Прелесть этого в том, что вы можете создать 1 Spell
класс и сделать так, чтобы он содержал список эффектов заклинаний для применения при активации. Затем заклинание может выполнять несколько функций (наносить урон врагу и лечить игрока, также называемое «спасение жизни») за один выстрел. Вы создаете новый экземпляр заклинания для каждого заклинания. Конечно, в какой-то момент вам придется на самом деле создавать заклинаний. Вы можете легко собрать утилиту редактирования заклинаний, чтобы сделать это проще.
Кроме того, каждый заданный вами эффект SpellEffect может очень легко записываться и загружаться из XML с помощью класса XmlSerializer System.Xml.Serialization. Легко использовать на простых классах данных, таких как SpellEffect. Вы даже можете просто сериализовать ваш окончательный список заклинаний в XML тоже. Например:
<?xml header-blah-blah?>
<Spells>
<Spell Name="Light Healing" Restriction="Player" Cost="100" Duration="0s"
CastTime="2s" Range="0" FailRate="5%" Recast="10s" Recovery="5s">
<SpellEffect Type="Heal" Target="Self" Stat="Hp" Degree="500" Duration="0s"/>
</Spell>
<Spell Name="Steal Haste" Restriction="NPC" Cost="500" Duration="120s"
CastTime="10s" Range="100" FailRate="10%" Recast="15s" Recovery="8s">
<SpellEffect Type="Buff" Target="Self" Stat="AttackSpeed" Degree="20%" Duration="120s"/>
<SpellEffect Type="Debuff" Target="Target" Stat="AttackSpeed" Degree="-20%" Duration="60s"/>
</Spell>
...
</Spells>
Вы также можете поместить свои данные в базу данных вместо xml. Sqlite будет маленьким, быстрым, легким и бесплатным. Вы также можете использовать LINQ для запроса данных заклинаний из xml или sqlite.
Конечно, вы могли бы сделать что-то подобное для своих монстров и тому подобное - по крайней мере, для их данных. Я не уверен насчет логики.
Если вы используете систему такого типа, вы можете получить дополнительное преимущество от возможности использовать свою систему Существо / Заклинание для других игр. Вы не можете сделать это, если вы «жестко закодируете» свои заклинания. Это также позволит вам изменить заклинания (балансировка классов, ошибки, что угодно) без без необходимости перестраивать и перераспределять ваш исполняемый файл игры. Просто простой XML-файл.
Святая корова! Я действительно взволнован вашим проектом сейчас и тем, как что-то подобное я мог бы реализовать. Если вам нужна помощь, дайте мне знать !!