Представление заклинаний

Материал из Клуб любителей рогаликов
Перейти к: навигация, поиск

Эта статья была первоначально написана для Darren Hebden's RLNews

Эта статья описывает основы представления и использования заклинаний в roguelikes. Общая техника - очень подобна использованной в моей статье об объектном представлении.

Для начала, нам нужен класс, чтобы хранить информацию для специфического заклинания.

class Spell {
public:

Хорошо, теперь, давайте дадим заклинанию имя.

char *Name;

Теперь, каждое заклинание должно иметь затраты маны (если Вы используете аналогичную систему). Итак, нам нужно определить стоимость заклинания в MP.

int MPCost;

Также, каждое заклинание имеет уровень: как трудно его использовать. Только более мощные волшебники смогут использовать более мощные заклинания.

int Level;

Теперь всем нам нужно знать, что заклинание делает. Мы сделаем под-класс, называемый эффектом, для хранения этой информации.

class Effect: {
friend Spell;

Что делает специфическое заклинание? Мы сделаем простой int, чтобы описать тип специфического эффекта.

int Type;

Ну и что из себя представляет Тип? Мы будем использовать #define'ы, чтобы определить это.

#define HEAL 0
#define SCORCH 1
#define TICKLE 2
#define CREATE_OBJ 3

Вы можете добавить их так много, как захотите. Теперь, мы знаем, что эффект делает, но этого не достаточно. Например, для эффекта лечения, сколько HP он излечивает? Мы могли бы базировать все на уровне (получив жесткую, однородную и предсказуемую магическую систему), или мы могли бы дать каждому эффекту набор аргументов для определения более детально, что он делает. Мы сделаем это с помощью 5 int'ов.

int Args[5];

Что делают поля Args? Это основывается на типе эффекта. Для эффекта лечения, мы могли бы задать это:

Args[0] is Number of Dice
Args[1] is Sides per Die
Args[3] is Roll Mod

Так что эффект лечения с Args[0] = 2, Args[1] = 6, Args[3] = 2 будет излечивать 2d6+2 HP. Красиво и просто, не так ли?

Теперь, мы можем закрыть класс эффекта. Мы хотим, чтобы каждое заклинание имело 5 эффектов (так, каждое заклинание может иметь большую гибкость).

} Effects[5];

Мы теперь можем закрыть класс заклинания.

};

Так что теперь мы имеем базовый класс магии.

Кастование заклинаний также просто. Сделаем функцию, называемую Кастование (Cast). которая должна принимать как аргументы заклинание, цель, и т.п.

void Cast ( Spell *SpellToCast, int TX, int TY );

Затем мы переходим к большому, злому, оператору выбора (switch) основыванному на эффекте. Это действительно работает ОЧЕНЬ ХОРОШО. Гибкость поражает...

Конечно, каждое заклинание использует эффект, основываясь на том, как Вы запрограммировали остальную часть своей roguelike. Из-за ООП природы своей игры (WotR), я использовал простые объектные методы, для эффектов заклинаний.

Для эффекта заклинания лечения, Вы можете, сделать что-то такое же простое, как цикл через всех персонажей (NPC's и Игроки) в целевой локации (определенной TX и TY), и излечивать их, основываясь на аргументах указанных выше... 2d6+2.

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



Автор: Sean Middleditch.
Источник: Representing Magick Spells.
Перевел: Сергей В. Ждановских [Alchemist], 16.05.2005.