So there..
After having had some serious thought and some serious discussions with
Imms we've deviced a better (In our opinion) Saving throw system.
The general idea was to make a system that didn't rely on static Arrays to
work, we didn't quite overcome that one, but at least we made it a bit
more simple :). The system looks at Level of victim and level of attacker
and calculates it's saving throw from there, and then adds/subtracts a
type-modifier, returning the ending result. Also, we've cut down on the
saving throw types from 5 to 3 (but that is fortunately changeable :)
First add this in structs.h after con_app_type:
struct save_modifier_type {
byte physical;
byte staff;
byte magic;
};
then in Class.c (or wherever you'd like the definition of the modifiers to
be):
struct save_modifier_type save_modifier[] = {
/* Physical Staff Magic */
{ 20, -10, -20 }, /* Wizard */
{ 10, 0, -10 }, /* Cleric */
{ 20, 0, -20 }, /* Thief */
{ -15, 5, 15 }, /* Warrior */
{ 0, 0, 0 }, /* Unknown */
};
In magic.c you need to declare the above struct
extern struct save_modifier_type save_modifier[];
int calc_saving_throw(struct char_data *ch, struct char_data *victim, int
save_type)
{
float base_save = 0;
float saving_throw = 0;
float mod = 0;
if (GET_LEVEL(ch) >= LVL_IMMORT) {
/* Gods have all the fun! :) */
return(1);
}
if (!IS_NPC(victim)) {
switch (save_type) {
case SAVE_MAGIC:
mod = save_modifier[(int)GET_CLASS(victim)].magic;
break;
case SAVE_PHYSICAL:
mod = save_modifier[(int)GET_CLASS(victim)].physical;
break;
case SAVE_STAFF:
break;
default:
log("SYSERR: Called saving_throws with an unknown save_type (%d)",
save_type);
return (99);
break;
}
} else {
/*
* NPC's get their saving throw from Knights..
*/
mod = save_modifier[CLASS_WARRIOR].staff;
}
base_save = (100 - (GET_LEVEL(victim) - GET_LEVEL(ch))) / 2;
saving_throw = base_save + ((mod / 100) * base_save);
return MIN(100,(int)saving_throw);
}
And now remove all the saving throws (Those majestic arrays) :).
Still in magic.c, you need to change mag_savingthrow so that it looks like
this:
int mag_savingthrow(struct char_data * ch, struct char_data * victim, int
type)
{
int save;
save = calc_saving_throw(ch,victim,type);
save += GET_SAVE(ch, type);
/* throwing a 0 is always a failure */
if (MAX(1, save) < number(0, 99))
return TRUE;
else
return FALSE;
}
And now it's a matter of finding all the places where mag_saving throw is
called and change them.
NB: I've noted that in more recent versions of Circle, the saving throws
are no longer in magic.c, but in class.c, but of course I don't need to
tell you this.
Also, stock circle carries 5 Savingthrow types instead of these 3. I felt
that a change from 5 to 3 would make things more simple.
Magic means anything that cannot be measured as either Staff or Physical.
Staff is when someone uses a staff against someone.
Physical, All skills can be considered physical (more or less), also
spells like poison.
of course, if you feel like you need all 5 you just expand the function...
Have fun! :)
/S
Speak softly and carry a cellular phone.
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 04/11/01 PDT