Difference between revisions of "Representing Magic Skills"
Jump to navigation
Jump to search
m (magick -> magic) |
|||
Line 1: | Line 1: | ||
<pre> | <pre> | ||
This article describes the basics of representing and using | This article describes the basics of representing and using Magic Spells in roguelikes. | ||
The general techniques are very similar to those used in my article on Object | The general techniques are very similar to those used in my article on Object | ||
representation. | representation. | ||
Line 13: | Line 13: | ||
char *Name; | char *Name; | ||
There. Now, every | There. Now, every magic spell costs Mana Points (well, if you're using a magic system | ||
similar to most others). So we need to define the spell's cost in MP. | similar to most others). So we need to define the spell's cost in MP. | ||
Line 43: | Line 43: | ||
You can of course add as many as you want. Now, we know what an Effect does, but | You can of course add as many as you want. Now, we know what an Effect does, but | ||
that's not enough. For example, for a HEAL Effect, how much HP does it heal? We | that's not enough. For example, for a HEAL Effect, how much HP does it heal? We | ||
could base everything of level (making a rigid and uniform | could base everything of level (making a rigid and uniform magic system, which may | ||
be what you want: predictability), or we could give each Effect a set of arguments to | be what you want: predictability), or we could give each Effect a set of arguments to | ||
define in more detial what it does. We'll do this through the use of 5 int's. | define in more detial what it does. We'll do this through the use of 5 int's. | ||
Line 68: | Line 68: | ||
}; | }; | ||
So that's all there is to a basic | So that's all there is to a basic magic class. | ||
Casting the spell is just as simple. Make a function called Cast or whatever (I used an | Casting the spell is just as simple. Make a function called Cast or whatever (I used an | ||
Line 87: | Line 87: | ||
heal them based on the arguments listed above... 2d6+2, or whatever. | heal them based on the arguments listed above... 2d6+2, or whatever. | ||
Anyways, this is just the basics. The advanced stuff all depends on your | Anyways, this is just the basics. The advanced stuff all depends on your magic | ||
system and how you programmed the rest of the game. | system and how you programmed the rest of the game. | ||
Revision as of 00:25, 24 March 2007
This article describes the basics of representing and using Magic Spells in roguelikes. The general techniques are very similar to those used in my article on Object representation. For starts, we need a class to hold the information for a specific spell. class Spell { public: OK. Now, let's give the spell a name. char *Name; There. Now, every magic spell costs Mana Points (well, if you're using a magic system similar to most others). So we need to define the spell's cost in MP. int MPCost; Also, every spell has a level: how difficult a spell it is. Only more powerful casters can use more powerful spells. int Level; There. Now all we need to know is what in Gehenna the spell does. We'll make a sub-class called Effect to store this information. class Effect: { friend Spell; OK, so what does a specific spell do? We'll make a simple int to describe what a specific Effect describes. int Type; So what does Type mean? We'll use some #define's to specify. #define HEAL 0 #define SCORCH 1 #define TICKLE 2 #define CREATE_OBJ 3 You can of course add as many as you want. Now, we know what an Effect does, but that's not enough. For example, for a HEAL Effect, how much HP does it heal? We could base everything of level (making a rigid and uniform magic system, which may be what you want: predictability), or we could give each Effect a set of arguments to define in more detial what it does. We'll do this through the use of 5 int's. int Args[5]; What do the fields of Args mean? That's based on what Type is equal to. For an Effect with Type HEAL, we might say that: Args[0] is Number of Dice Args[1] is Sides per Die Args[3] is Roll Mod So an Effect of type HEAL with Args[0] = 2, Args[1] = 6, Args[3] = 2 would heal 2d6+2 HP. Pretty simple, eh? Anyways, we can close of the Effect class. We want each Spell to have 5 Effect's (so every spell can have lots of flexibility). } Effects[5]; We can now close of the Spell class. }; So that's all there is to a basic magic class. Casting the spell is just as simple. Make a function called Cast or whatever (I used an object method inside the Spell class, since I'm a C++ OOP freak). The function would take as arguments the spell to cast, the target, etc. void Cast ( Spell *SpellToCast, int TX, int TY ); Then we go with a big, evil, switch statement based on effect. This actually works VERY well. The flexibility is astounding... Of course, how each spell takes effect is based on how you've programmed the rest of your roguelike. Because of the OO nature of WotR, I found it very easy to create simple object Methods for spell effects. For the HEAL Spell Effect Type, you might to do something as simple as loop through all the Characters (NPC's and Players) in the target loc (defined by TX and TY), and heal them based on the arguments listed above... 2d6+2, or whatever. Anyways, this is just the basics. The advanced stuff all depends on your magic system and how you programmed the rest of the game. The complete source for the Spell class is: #define HEAL 0 #define SCORCH 1 #define TICKLE 2 #define CREATE_OBJ 3 class Spell { public: char *Name; int MPCost; int Level; class Effect: { friend Spell; int Type; int Args[5]; } Effects[5]; }; Any questions, comments, threats, etc., e-mail me at sean.middleditch@iname.com Well, I don't really want any threats. The End Sean Middleditch