Spells in
Combat
Now, you can put all the neat
spells that your game has to offer to good use. You
know how spells work, but you need to know how the spells affect the characters.
Remember that the spell controller tracks only the meshes that create the visual
side of spells; the character controller determines the effects of the spells.
Spells in combat are used
mainly to damage an opponent. A spell uses a series of
calculations to determine the outcome of the spell’s effects, just as physical
attacks
do. Spells have a chance of failing, which is determined by the spell’s chance
value
in the spell definition.
The chance of a spell working
is increased by the caster’s mental ability, which uses
the following calculation to determine the multiplier to apply to the chance
value:
// Chance =
spell’s chance of working
// Mental = caster’s mental ability
Chance = (long)(((float)Mental / 100.0f + 1.0f) * (float)Chance);
The last line shows that the
mental value can range from 0 and up. A value of 150
means to increase the chance by 50 percent, whereas a value of 200 means to
double
the chances. To aid victims of a spell, the target characters have their
associated
resistance abilities factored in as well:
// Resistance =
target’s resistance ability
Chance = (long)((1.0f - (float)GetResistance(Target) / 100.0f) * (float)Chance);
When it is determined that the
spell took effect, the appropriate actions can be
taken to handle the results. The only spell effect you want to contend with at
this
time is damage. Whenever damage is dealt to a victim, the victim’s resistance
ability
is used to reduce the amount of damage. Resistance is a percentage value, which
means that a value of 0 does not reduce spell damage, whereas a value of 100
completely
dispels damage.
Status ailments also work their
way into spell casting. An ailment of Silenced means a
character can’t even cast magic spells, whereas an ailment of Dumbfounded
reduces
a character’s mental ability by half. Finally, the Enchanted and Barrier
ailments
reduce the victim’s resistance by half or increase the resistance by 50 percent,
respectively.
You can use the following code
to determine whether a spell affects the victim and
just how much damage is dealt:
// Chance =
Magic spell’s chance of working
// Mental = Spell caster’s mental ability
// Resistance = victim character’s resistance amount
// Amount = base damage amount spell causes
// Apply status ailments to mental and resistance
if(Ailments & AILMENT_DUMBFOUNDED)
Mental /= 2;
if(Ailments & AILMENT_ENCHANTED)
Resistance = (long)((float)Resistance * 0.5f);
if(Ailments & AILMENT_BARRIER)
Resistance = (long)((float)Resistance * 1.5f);
// Check chance of working and calculate damage
Chance=(long)(((float)Mental / 100.0f + 1.0f) * (float)Chance);
if((rand() % 100) < Chance) {
float Resist = 1.0f - ((float)Resistance / 100.0f);
long DmgAmount = (long)((float)Amount * Resist);
// Apply
extra class damage or cure-class amounts here
}
After a spell has hit its
target, the proper amount of damage to apply is calculated.
Remember that certain classes of spells can cause twice as much damage as the
spell
normally would to a character, whereas other spells can cure half the damage
dealt.
Intelligence
in Combat
Although your game’s players
are completely capable of controlling their player
characters, it’s up to you to control the NPCs. In order to make your game
worthy,
the NPCs’ artificial intelligence needs to be up to par for combating. Their
actions
need to mimic yours, from choosing to attack, healing themselves, or casting a
spell.
Characters are given a
rudimentary intelligence when it comes to combat. If a character
has lost over half of his health or is under the effects of a status ailment,
that
character will attempt to heal himself or dispel the ailments. This means it
will
search through its list of known spells (if any) and cast the appropriate spell
for aid.
If, on the other hand, a PC
comes into another character’s range, a hostile charac-
ter then chooses to either perform a physical attack or a magical attack (if any
spells are known). You need to assign the chances that a character will perform
either type of attack. Note that attacks are based on the built-up charge of the
attacking creature—the charge must be full in order for the creature to attack.
When the decision is made to
attack a nearby character, either the attack is performed
or a magic spell is chosen. Only spells that hurt other characters are cast. If
a character
does not have a viable target character in range, the game randomly decides that
the character in question will attempt to enhance itself by using a status
ailment-causing
spell, in this way raising its strength, agility, or other beneficial ailment.
The specifics on performing the
preceding actions come into play when you create
a character controller that will make such decisions for your characters.