/*Spell editor */
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
#define KEY( literal, field, value ) if ( !str_cmp( buf, literal ) ) {field=value; fMatch=TRUE;}
static bool prereq_count[SKILL_COUNT];
/* This function places all spells in the correct hashed spell list by
name spots... called whenever a spell name is changed :) */
void
update_prereq (void)
{
SPELL_DATA *spell;
SPELL_DATA *prereq;
int i, j, counter;
/* The idea here is to set up something so that its alot faster
doing the bigass prereq trees. */
for (i = 0; i < SPELL_HASH; i++)
{
for (spell = spell_list[i]; spell != NULL; spell = spell->next)
{
if ((prereq = skill_lookup(spell->prereq_1, -1)) != NULL)
{
spell->pre1 = prereq;
}
if ((prereq = skill_lookup(spell->prereq_2, -1)) != NULL)
{
spell->pre2 = prereq;
}
}
}
/* This is so that we dont have to recalc the number of prereqs for
any given skill each time it asks for it. */
for (i = 0; i < SPELL_HASH; i++)
{
for (spell = spell_list[i]; spell != NULL; spell = spell->next)
{
for (j = 0; j < SKILL_COUNT; j++)
{
prereq_count[j] = FALSE;
}
check_prereq(spell);
counter = 0;
for (j = 0; j < SKILL_COUNT; j++)
{
if (prereq_count[j] == TRUE)
{
counter++;
}
}
spell->num_prereqs = counter;
/* Now we set up the check for whether or not we make a vert line
to the second prereq in the spell tree. */
if(spell->pre1 && spell->pre2 && spell->pre1 != spell->pre2)
{
spell->go_to_second = check_prereq_depth(spell,spell->pre2);
}
else
spell->go_to_second = FALSE;
}
}
return;
}
void check_prereq(SPELL_DATA *spell)
{
prereq_count[spell->gsn] = TRUE;
if (spell->pre1 != NULL && !prereq_count[spell->pre1->gsn])
check_prereq(spell->pre1);
if (spell->pre2 != NULL && !prereq_count[spell->pre2->gsn])
check_prereq(spell->pre2);
return;
}
void
update_name_hash (void)
{
SPELL_DATA *spell;
int i;
bzero (spell_list_2, sizeof (spell_list_2));
for (i = 0; i < SPELL_HASH; i++)
{
for (spell = spell_list[i]; spell != NULL; spell = spell->next)
{
spell->next_a = spell_list_2[UPPER (spell->spell_funky_name[0]) % SPELL_HASH];
spell_list_2[UPPER (spell->spell_funky_name[0]) % SPELL_HASH] = spell;
}
}
return;
}
/* This function is called when gsn's are changed... for instance,
right at bootup when it assigns a high gsn to a skill... */
void
update_gsn_hash (void)
{
SPELL_DATA *spell;
int i;
bzero (spell_list, sizeof (spell_list));
for (i = 0; i < SPELL_HASH; i++)
{
for (spell = spell_list_2[i]; spell != NULL; spell = spell->next_a)
{
spell->next = spell_list[spell->gsn % SPELL_HASH];
spell_list[spell->gsn % SPELL_HASH] = spell;
}
}
return;
}
bool
is_digit (char test)
{
if (test >= '0' && test <= '9')
return TRUE;
else
return FALSE;
}
/* SPELLS/SKILLS are now hashed by name and spell gsn... fast lookups */
SPELL_DATA *
skill_lookup (char *txt, int sn)
{
SPELL_DATA *spell;
if (sn < 0 && !txt)
return NULL;
if (sn < 0)
{
for (spell = spell_list_2[UPPER (txt[0]) % SPELL_HASH]; spell != NULL; spell = spell->next_a)
{
if (!str_prefix (txt, spell->spell_name) || !str_prefix (txt, spell->spell_funky_name))
return spell;
}
return NULL;
}
else
for (spell = spell_list[sn % SPELL_HASH]; spell != NULL; spell = spell->next)
{
if (spell->gsn == sn)
return spell;
}
return NULL;
}
void
fix_skillst (void)
{
gsn_invest = lookup_gsn ("Invest");
gsn_patch = lookup_gsn ("Patch");
gsn_detrap = lookup_gsn ("Detrap");
gsn_locate_trap = lookup_gsn ("Locate Traps");
gsn_awareness = lookup_gsn ("Alertness");
gsn_block = lookup_gsn ("Block");
gsn_mine = lookup_gsn ("Mine");
gsn_forge = lookup_gsn ("Forge");
gsn_weave = lookup_gsn ("Weave");
gsn_stitch = lookup_gsn ("Stitch");
gsn_lore = lookup_gsn ("Lore");
gsn_brew = lookup_gsn ("Brew");
gsn_enchant = lookup_gsn ("Enchant");
gsn_chop = lookup_gsn ("Chop");
gsn_shoot = lookup_gsn ("Shoot");
gsn_ranged = lookup_gsn ("Ranged");
gsn_build = lookup_gsn ("Build");
gsn_throw = lookup_gsn ("Throw");
gsn_critical = lookup_gsn ("Critical");
gsn_skin = lookup_gsn ("Skin");
gsn_tanning = lookup_gsn ("Tanning");
gsn_riding = lookup_gsn ("Riding");
gsn_flail = lookup_gsn ("Flail");
gsn_warcry = lookup_gsn ("Warcry");
gsn_circle = lookup_gsn ("Circle");
gsn_penetration = lookup_gsn ("Armor Penetration");
gsn_grapple = lookup_gsn ("Grapple");
gsn_trapset = lookup_gsn ("Trapset");
gsn_swim = lookup_gsn ("Swim");
gsn_butcher = lookup_gsn ("Butcher");
gsn_backstab = lookup_gsn ("Backstab");
gsn_dodge = lookup_gsn ("Dodge");
gsn_evade = lookup_gsn ("Evade");
gsn_hide = lookup_gsn ("Hide");
gsn_peek = lookup_gsn ("Peek");
gsn_pick_lock = lookup_gsn ("Lock");
gsn_sneak = lookup_gsn ("Sneak");
gsn_steal = lookup_gsn ("Steal");
gsn_bash = lookup_gsn ("Bash");
gsn_track = lookup_gsn ("Track");
gsn_disarm = lookup_gsn ("Disarm");
gsn_enhanced_damage = lookup_gsn ("Enhanced Dam");
gsn_accuracy = lookup_gsn ("Accuracy");
gsn_resilience = lookup_gsn ("Resilience");
gsn_kick = lookup_gsn ("Kick");
gsn_tornado = lookup_gsn ("Tornado Kick");
gsn_impale = lookup_gsn ("Impale");
gsn_charge = lookup_gsn ("Charge");
gsn_double_kick = lookup_gsn ("Double Kick");
gsn_smash = lookup_gsn ("Smash");
gsn_tackle = lookup_gsn ("Tackle");
gsn_flurry = lookup_gsn ("Flurry");
gsn_flash = lookup_gsn ("Flash");
gsn_parry = lookup_gsn ("Parry");
gsn_blink = lookup_gsn ("Blink");
gsn_guard = lookup_gsn ("Guard");
gsn_steadiness = lookup_gsn ("Steadiness");
gsn_shield_block = lookup_gsn ("Shield Block");
gsn_rescue = lookup_gsn ("Rescue");
gsn_second_attack = lookup_gsn ("Second Attack");
gsn_third_attack = lookup_gsn ("Third Attack");
gsn_dual_wield = lookup_gsn ("Dual Wield");
gsn_pierce = lookup_gsn ("Pierc");
gsn_unarmed = lookup_gsn ("Unarm");
gsn_buddha = lookup_gsn ("Buddhas Palm");
gsn_nerve = lookup_gsn ("Nerve Strike");
gsn_spiritregen = lookup_gsn ("Spirit Regeneration");
gsn_slashing = lookup_gsn ("Slash");
gsn_concussion = lookup_gsn ("Concus");
gsn_polearm = lookup_gsn ("Polearm");
gsn_whip = lookup_gsn ("Whip");
gsn_search = lookup_gsn ("Search");
gsn_sixth_sense = lookup_gsn("Sixth Sense");
update_name_hash ();
update_gsn_hash ();
update_prereq ();
return;
}
void
write_spells (void)
{
SPELL_DATA *spell;
FILE *sfp;
int i;
if ((spell = skill_lookup ("Slashing", -1)) == NULL || spell->spell_level == -1)
setup_skills ();
update_name_hash ();
update_gsn_hash ();
update_prereq();
if ((sfp = fopen ("spells.dat", "w")) == NULL)
{
fprintf (stderr, "Shit, failed on spell write!!\n");
exit (99);
}
for (i = 0; i < SPELL_HASH; i++)
{
for (spell = spell_list[i]; spell != NULL; spell = spell->next)
{
fprintf (sfp, "#SPELL\n");
fprintf (sfp, "Slot %d\n", spell->slot);
fprintf (sfp, "Gsn %d\n", spell->gsn);
if (spell->slot == 1)
fprintf (sfp, "SType %d\n", spell->spell_type);
if (spell->spell_bits != 0)
fprintf (sfp, "SBits %d\n", spell->spell_bits);
if (spell->spell_bits2 != 0)
fprintf (sfp, "SBitT %d\n", spell->spell_bits2);
if (spell->bitvector2 != 0)
fprintf (sfp, "BitT %d\n", spell->bitvector2);
fprintf (sfp, "Sname %s~\n", spell->spell_name);
fprintf (sfp, "SFname %s~\n", spell->spell_funky_name);
fprintf (sfp, "SLev %d\n", spell->spell_level);
if (spell->prereq_1 != NULL && str_cmp(spell->prereq_1, "none") && str_cmp(spell->prereq_1, "None"))
fprintf (sfp, "Pr1 %s~\n", spell->prereq_1);
if (spell->prereq_2 != NULL &&str_cmp(spell->prereq_2, "none") && str_cmp(spell->prereq_2, "None"))
fprintf (sfp, "Pr2 %s~\n", spell->prereq_2);
fprintf (sfp, "Noun %s~\n", spell->noun_damage);
if (spell->act_to_ch_1 != NULL)
fprintf (sfp, "A2C1 %s~\n", spell->act_to_ch_1);
if (spell->act_to_ch_2 != NULL)
fprintf (sfp, "A2C2 %s~\n", spell->act_to_ch_2);
if (spell->act_to_vict_1 != NULL)
fprintf (sfp, "A2V1 %s~\n", spell->act_to_vict_1);
if (spell->act_to_vict_2 != NULL)
fprintf (sfp, "A2V2 %s~\n", spell->act_to_vict_2);
if (spell->act_to_notvict_1 != NULL)
fprintf (sfp, "A2NV1 %s~\n", spell->act_to_notvict_1);
if (spell->act_to_notvict_2 != NULL)
fprintf (sfp, "A2NV2 %s~\n", spell->act_to_notvict_2);
if (spell->linked_to != NULL)
{
fprintf (sfp, "Linkd %s~\n", spell->linked_to);
}
fprintf (sfp, "Durat %s~\n", (spell->duration == NULL ? "0" : spell->duration));
if (spell->duration != NULL)
{
int jj;
for (jj = 0; jj < 5; jj++)
{
if(spell->location[jj] > 0)
fprintf(sfp, "Locat%d %d\n", jj, spell->location[jj]);
if(spell->modifier[jj] != NULL && str_cmp(spell->modifier[jj], "0"))
fprintf(sfp, "Modif%d %s~\n", jj, spell->modifier[jj]);
}
}
if (spell->bitvector != 0)
fprintf (sfp, "BitVe %d\n", spell->bitvector);
if (spell->damage != NULL)
fprintf (sfp, "Dam %s~\n", spell->damage);
if (spell->mana > 1)
fprintf (sfp, "Mana %d\n", spell->mana);
if (spell->mana_type > 0)
fprintf (sfp, "ManaT %d\n", spell->mana_type);
if (spell->position != POSITION_RESTING)
fprintf (sfp, "Pos %d\n", spell->position);
fprintf (sfp, "CastT %d\n", spell->casting_time);
fprintf (sfp, "WearO %s~\n", spell->wear_off_msg);
if (spell->creates_obj != 0)
fprintf (sfp, "CrObj %d\n", spell->creates_obj);
if (spell->min_int != 0)
fprintf (sfp, "Minint %d\n", spell->min_int);
if (spell->min_wis != 0)
fprintf (sfp, "Minwis %d\n", spell->min_wis);
if (spell->guilds != 0)
fprintf (sfp, "Guilds %d\n", spell->guilds);
if(spell->in_room_good != 0)
fprintf (sfp, "InRoomGd %d\n", spell->in_room_good);
if(spell->in_room_evil != 0)
fprintf (sfp, "InRoomEv %d\n", spell->in_room_evil);
if(spell->spell_lag != 0)
fprintf (sfp, "SplLag %d\n", spell->spell_lag);
if(spell->fail_chance != 0)
fprintf (sfp, "FailChan %d\n", spell->fail_chance);
if(spell->pk_fail_chance != 0)
fprintf (sfp, "PKChan %d\n", spell->pk_fail_chance);
}
}
fprintf (sfp, "#END");
fclose (sfp);
return;
}
void
load_spells (void)
{
SPELL_DATA *spell = NULL;
FILE *sfp;
char buf[500];
bool fMatch;
if ((sfp = fopen ("spells.dat", "r")) == NULL)
{
write_spells ();
return;
}
for (;;)
{
strcpy (buf, fread_word (sfp));
fMatch = FALSE;
if (!str_cmp ("END", buf) || !str_cmp ("#END", buf))
break;
if (!str_cmp (buf, "SPELL") || !str_cmp ("#SPELL", buf))
{
spell = new_spell ();
free_string (spell->spell_name);
free_string (spell->spell_funky_name);
free_string (spell->noun_damage);
free_string (spell->wear_off_msg);
continue;
}
if (spell == NULL)
{
fprintf (stderr, "BAD FIRST HEADER IN SPELLS.DAT - %s!\n", buf);
exit (99);
}
KEY ("Slot", spell->slot, fread_number (sfp));
KEY ("SType", spell->spell_type, fread_number (sfp));
KEY ("SBits", spell->spell_bits, fread_number (sfp));
KEY ("SBitT", spell->spell_bits2, fread_number (sfp));
KEY ("BitT", spell->bitvector2, fread_number (sfp));
KEY ("Gsn", spell->gsn, fread_number (sfp));
KEY ("Sname", spell->spell_name, fread_string (sfp, NULL));
KEY ("SFname", spell->spell_funky_name, fread_string (sfp, NULL));
KEY ("SLev", spell->spell_level, fread_number (sfp));
KEY ("Pr1", spell->prereq_1, fread_string (sfp, NULL));
KEY ("Pr2", spell->prereq_2, fread_string (sfp, NULL));
KEY ("Noun", spell->noun_damage, fread_string (sfp, NULL));
KEY ("A2C1", spell->act_to_ch_1, fread_string (sfp, NULL));
KEY ("A2C2", spell->act_to_ch_2, fread_string (sfp, NULL));
KEY ("A2V1", spell->act_to_vict_1, fread_string (sfp, NULL));
KEY ("A2V2", spell->act_to_vict_2, fread_string (sfp, NULL));
KEY ("A2NV1", spell->act_to_notvict_1, fread_string (sfp, NULL));
KEY ("A2NV2", spell->act_to_notvict_2, fread_string (sfp, NULL));
KEY ("Linkd", spell->linked_to, fread_string (sfp, NULL));
KEY ("Durat", spell->duration, fread_string (sfp, NULL));
KEY ("Modif0", spell->modifier[0], fread_string (sfp, NULL));
KEY ("Locat0", spell->location[0], fread_number (sfp));
KEY ("Modif1", spell->modifier[1], fread_string (sfp, NULL));
KEY ("Locat1", spell->location[1], fread_number (sfp));
KEY ("Modif2", spell->modifier[2], fread_string (sfp, NULL));
KEY ("Locat2", spell->location[2], fread_number (sfp));
KEY ("Modif3", spell->modifier[3], fread_string (sfp, NULL));
KEY ("Locat3", spell->location[3], fread_number (sfp));
KEY ("Modif4", spell->modifier[4], fread_string (sfp, NULL));
KEY ("Locat4", spell->location[4], fread_number (sfp));
KEY ("BitVe", spell->bitvector, fread_number (sfp));
KEY ("Dam", spell->damage, fread_string (sfp, NULL));
KEY ("Mana", spell->mana, fread_number (sfp));
KEY ("ManaT", spell->mana_type, fread_number (sfp));
KEY ("CastT", spell->casting_time, fread_number (sfp));
KEY ("Pos", spell->position, fread_number (sfp));
KEY ("WearO", spell->wear_off_msg, fread_string (sfp, NULL));
KEY ("CrObj", spell->creates_obj, fread_number (sfp));
KEY ("Minint", spell->min_int, fread_number (sfp));
KEY ("Minwis", spell->min_wis, fread_number (sfp));
KEY ("Guilds", spell->guilds, fread_number (sfp));
KEY ("InRoomGd", spell->in_room_good, fread_number (sfp));
KEY ("InRoomEv", spell->in_room_evil, fread_number (sfp));
KEY ("SplLag", spell->spell_lag, fread_number (sfp));
KEY ("FailChan", spell->fail_chance, fread_number (sfp));
KEY ("PKChan", spell->pk_fail_chance, fread_number (sfp));
if (!fMatch)
{
fprintf (stderr, "%s\n", buf);
bug ("Fread_spell: no match.", 0);
if (!feof (sfp))
fread_to_eol (sfp);
}
if (spell->gsn > 340 && spell->gsn < 400)
spell->slot = 2;
if (spell->gsn > 500)
spell->slot = 0;
}
fclose (sfp);
update_name_hash ();
update_gsn_hash ();
fix_skillst ();
update_name_hash ();
update_gsn_hash ();
update_prereq();
return;
}
int
lookup_gsn (char *nm)
{
SPELL_DATA *spell = NULL;
spell = skill_lookup (nm, -1);
if (spell)
return spell->gsn;
else
return -1;
}
int
tally_spsk (CHAR_DATA * ch, int slot)
{
SPELL_DATA *spell;
int tally = 0;
int i, j, low_gsn, high_gsn;
if (IS_MOB (ch))
return 0;
if (slot < 0 || slot > 2)
return 0;
for (j = 0; j < 3; j++)
{
ch->pcdata->learned[race_info[ch->pcdata->race].nat_skills[j]] = -100;
ch->pcdata->learned[align_info[ch->pcdata->alignment].nat_skills[j]] = -100;
}
if (slot == 0)
{
low_gsn = 549;
high_gsn = SKILL_COUNT;
}
else if (slot == 1)
{
low_gsn = 1;
high_gsn = 200;
}
else if (slot == 2)
{
low_gsn = 349;
high_gsn = 400;
}
for (i = low_gsn; i < high_gsn; i++)
{
if (ch->pcdata->learned[i] > 0)
{
tally++;
}
}
for (j = 0; j < 3; j++)
{
ch->pcdata->learned[race_info[ch->pcdata->race].nat_skills[j]] = 100;
ch->pcdata->learned[align_info[ch->pcdata->alignment].nat_skills[j]] = 100;
}
return tally;
}
void
setup_skills (void)
{
SPELL_DATA *spell;
spell = new_spell ();
spell->slot = 0;
spell->gsn = 549;
gsn_charge = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Charge");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Charge");
free_string (spell->noun_damage);
spell->noun_damage = str_dup ("charge");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 550;
gsn_circle = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Circle");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Circle");
free_string (spell->noun_damage);
spell->noun_damage = str_dup ("circle");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 551;
gsn_penetration = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Armor Penetration");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Armor Penetration");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 552;
gsn_block = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Block");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Block");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 352;
gsn_swim = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Swim");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Swim");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 350;
gsn_patch = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Patch");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Patch");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 351;
gsn_detrap = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Detrap");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Detrap");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 368;
gsn_stitch = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Stitch");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Stitch");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 367;
gsn_weave = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Weave");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Weave");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 366;
gsn_tanning = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Tanning");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Tanning");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 365;
gsn_skin = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Skin");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Skin");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 364;
gsn_mine = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Mine");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Mine");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 353;
gsn_butcher = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Butcher");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Butcher");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 370;
gsn_chop = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Chop");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Chop");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 371;
gsn_build = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Build");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Build");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 354;
gsn_locate_trap = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Locate Traps");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Locate Traps");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 585;
gsn_awareness = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Alertness");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Alertness");
spell->gsn = 554;
gsn_backstab = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Backstab");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Backstab");
free_string (spell->noun_damage);
spell->noun_damage = str_dup ("backstab");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 555;
gsn_dodge = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Dodge");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Dodge");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 560;
gsn_evade = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Evade");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Evade");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 553;
gsn_guard = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Guard");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Guard");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 356;
gsn_hide = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Hide");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Hide");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 357;
gsn_peek = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Peek");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Peek");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 358;
gsn_pick_lock = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Locksmithy");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Locksmithy");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 359;
gsn_sneak = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Sneaking");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Sneaking");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 360;
gsn_steal = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Steal");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Steal");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 561;
gsn_bash = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Bash");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Bash");
free_string (spell->noun_damage);
spell->noun_damage = str_dup ("bash");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 362;
gsn_track = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Tracking");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Tracking");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 361;
gsn_forge = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Forge");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Forge");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 363;
gsn_brew = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Brew");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Brew");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 371;
gsn_enchant = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Enchant");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Enchant");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 372;
gsn_brew = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Lore");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Lore");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 563;
gsn_disarm = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Disarm");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Disarm");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 564;
gsn_enhanced_damage = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Enhanced Damage");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Enhanced Damage");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 565;
gsn_kick = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Kick");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Kick");
free_string (spell->noun_damage);
spell->noun_damage = str_dup ("kick");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 559;
gsn_tornado = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Tornado Kick");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Tornado Kick");
free_string (spell->noun_damage);
spell->noun_damage = str_dup ("kick");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 588;
gsn_impale = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Impale");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Impale");
free_string (spell->noun_damage);
spell->noun_damage = str_dup ("impale");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 590;
gsn_tackle = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Tackle");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Tackle");
free_string (spell->noun_damage);
spell->noun_damage = str_dup ("tackle");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 591;
gsn_flurry = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Flurry");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Flurry");
free_string (spell->noun_damage);
spell->noun_damage = str_dup ("flurry");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 589;
gsn_flash = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Flash");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Flash");
free_string (spell->noun_damage);
spell->noun_damage = str_dup ("flash");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 566;
gsn_parry = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Parry");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Parry");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 592;
gsn_steadiness = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Steadiness");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Steadiness");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 593;
gsn_double_kick = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Double Kick");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Double Kick");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 594;
gsn_smash = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Smash");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Smash");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 595;
gsn_accuracy = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Accuracy");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Accuracy");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 596;
gsn_resilience = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Resilience");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Resilience");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 397;
gsn_sixth_sense = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Sixth Sense");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Sixth Sense");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 576;
gsn_shoot = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Shoot");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Shoot");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 577;
gsn_throw = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Throw");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Throw");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 567;
gsn_shield_block = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Shield Block");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Shield Block");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 568;
gsn_rescue = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Rescue");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Rescue");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 569;
gsn_second_attack = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Second Attack");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Second Attack");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 570;
gsn_third_attack = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Third Attack");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Third Attack");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 571;
gsn_dual_wield = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Dual Wield");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Dual Wield");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 572;
gsn_pierce = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Piercing Weapons");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Piercing Weapons");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 556;
gsn_unarmed = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Unarmed Combat");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Unarmed Combat");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 557;
gsn_spiritregen = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Spirit Regeneration");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Spirit Regeneration");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 558;
gsn_buddha = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Buddhas Palm");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Buddhas Palm");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 561;
gsn_nerve = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Nerve Strike");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Nerve Strike");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 573;
gsn_slashing = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Slashing Weapons");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Slashing Weapons");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 574;
gsn_concussion = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Concussion Weapons");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Concussion Weapons");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 575;
gsn_whip = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Whipping Weapons");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Whipping Weapons");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 376;
gsn_search = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Searching");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Searching");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 378;
gsn_invest = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Investigation");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Investigation");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 377;
gsn_riding = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Riding");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Riding");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 580;
gsn_flail= spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Flail");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Flail");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 579;
gsn_warcry = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Warcry");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Warcry");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 583;
gsn_polearm = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Polearm Weapons");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Polearm Weapons");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 584;
gsn_critical = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Critical Hit");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Critical Hit");
spell = new_spell ();
spell->slot = 0;
spell->gsn = 599;
gsn_grapple = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Grapple");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Grapple");
spell = new_spell ();
spell->slot = 2;
spell->gsn = 398;
gsn_grapple = spell->gsn;
free_string (spell->spell_name);
spell->spell_name = str_dup ("Trapset");
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup ("Trapset");
update_name_hash ();
update_gsn_hash ();
update_prereq();
return;
}
char *
stpos (int pos)
{
static char retb[25];
retb[0] = '\0';
if (pos == POSITION_STANDING)
{
strcpy (retb, "STANDING");
}
if (pos == POSITION_RESTING)
{
strcpy (retb, "RESTING");
}
if (pos == POSITION_FIGHTING)
{
strcpy (retb, "FIGHTING");
}
return retb;
}
int
stpos_rev (char *pos)
{
if (!str_cmp (pos, "standing"))
return POSITION_STANDING;
if (!str_cmp (pos, "resting"))
return POSITION_RESTING;
if (!str_cmp (pos, "fighting"))
return POSITION_FIGHTING;
return -99;
}
char *
mtype (int mana)
{
static char retb[50];
int i;
bool found = FALSE;
retb[0] = '\0';
for (i = 0; str_cmp(mana_data[i].what_you_type, "end_of_list"); i++ )
{
if (mana & mana_data[i].flagname)
{
strcat(retb, mana_data[i].how_it_appears);
found = TRUE;
}
}
if (!found)
{
strcat(retb, "None");
}
return retb;
}
int
mtype_rev (char *mana)
{
int i;
if (!str_cmp (mana, "none"))
return MANA_NONE;
for (i = 0; str_cmp(mana_data[i].what_you_type, "end_of_list"); i++ )
{
if (!str_cmp(mana, mana_data[i].what_you_type))
return mana_data[i].flagname;
}
return -99;
}
int
spell_extra_bits2_rev (char *wrd)
{
int i;
for (i = 0; str_cmp(spell_flags2[i].what_you_type, "end_of_list"); i++)
if (!str_cmp(wrd, spell_flags2[i].what_you_type))
return spell_flags2[i].flagname;
return -99;
}
int
spell_extra_bits_rev (char *wrd)
{
int i;
for (i = 0; str_cmp(spell_flagss[i].what_you_type, "end_of_list"); i++)
if (!str_cmp(wrd, spell_flagss[i].what_you_type))
return spell_flagss[i].flagname;
return -99;
}
char *
spell_extra_bits2 (int bits)
{
int i;
static char retb[200];
retb[0] = '\0';
for (i = 0; str_cmp(spell_flags2[i].what_you_type, "end_of_list"); i ++)
if (bits & spell_flags2[i].flagname)
strcat(retb, spell_flags2[i].how_it_appears);
return retb;
}
char *
spell_extra_bits (int bits)
{
int i;
static char retb[200];
retb[0] = '\0';
for (i = 0; str_cmp(spell_flagss[i].what_you_type, "end_of_list"); i ++)
if (bits & spell_flagss[i].flagname)
strcat(retb, spell_flagss[i].how_it_appears);
return retb;
}
char *
styp (int stype)
{
static char retb[20];
retb[0] = '\0';
if (stype == TAR_IGNORE) {
strcpy (retb, "NONE.");
}
if (stype == TAR_CHAR_OFFENSIVE) {
strcpy (retb, "OFFNS");
}
if (stype == TAR_CHAR_DEFENSIVE) {
strcpy (retb, "DEFNS");
}
if (stype == TAR_CHAR_SELF) {
strcpy (retb, "SELF");
}
if (stype == TAR_OBJ_INV){
strcpy (retb, "OBJINV");
}
if (stype == TAR_OBJ_ROOM) {
strcpy (retb, "OBJROOM");
}
return retb;
}
int
styp_rev (char *stype)
{
if (!str_cmp (stype, "none"))
return TAR_IGNORE;
if (!str_cmp (stype, "offensive"))
return TAR_CHAR_OFFENSIVE;
if (!str_cmp (stype, "defensive"))
return TAR_CHAR_DEFENSIVE;
if (!str_cmp (stype, "self"))
return TAR_CHAR_SELF;
if (!str_cmp (stype, "objinv"))
return TAR_OBJ_INV;
if (!str_cmp (stype, "objroom"))
return TAR_OBJ_ROOM;
return -99;
}
void show_gen_skill (CHAR_DATA * ch, SPELL_DATA * spell) {
char buf[500];
// sprintf (buf, "\x1B[1;1f\x1B[K\x1B[2;1f\x1B[K\x1B[3;1f;%dr", ch->pcdata->pagelen);
sprintf (buf, "\x1B[1;1f\x1B[K\x1B[2;1f\x1B[K\x1B[3;1f\x1B[K\x1B[4;1f");
send_to_char (buf, ch);
// send_to_char ("\x1B[1;1f\x1B[K", ch);
if (spell->gsn == gsn_backstab || spell->gsn == gsn_circle)
sprintf (buf, "Skill %s #%d Delay (Post): %d Moves=(Pre-%s delay): %d\n\r",
spell->spell_name, spell->gsn, spell->casting_time, spell->spell_name, spell->mana);
else
sprintf (buf, "Skill %s (#%d). Delay: %d. Moves: %d.\n\r",
spell->spell_name, spell->gsn, spell->casting_time, spell->mana);
send_to_char (buf, ch);
sprintf (buf, "Level: %d MStr: %d MCon: %d (Min str/con to practice this skill fully).\n\r",
spell->spell_level, spell->min_int, spell->min_wis);
send_to_char (buf, ch);
send_to_char ("\x1B[K----------------------------------------------------------------------------", ch);
sprintf (buf, "\x1B[%d;1f", ch->pcdata->pagelen);
if (spell->gsn > 500) spell->slot = 0;
send_to_char (buf, ch);
return;
}
void
show_spell (CHAR_DATA * ch, SPELL_DATA * spell, int row)
{
char buf[500];
if (spell->gsn >= 500) {
show_gen_skill (ch, spell);
spell->slot = 0;
return;
}
/*
Spel: 43/112 Mana: 38 Lvl: 7 MType: WATER Pos: STANDING Time: 8 Mint:
Type: OFFNS damg: blast Name: Hands of Wind Name2: Hanskdlskjds Mwis:
Pre1: Fireball Pre2: Joeblow Creates: 0 Val: 0 0 0 0 0 0 0 0 0 0
Lctn: None Duration: 2df4343jf Modifier: 84yf8 Bit: AFF_POISON
Damg: 84cfds2 Slot: 1 Wear_off: The spell has worn off.
TO_CHAR1..... Your wind worked... wham! Right into $N!
TO_CHAR2.....
TO_VICT1..... WHAM! $n's wind knocks you down!
TO_VICT2.....
TO_NOTVICT1.. Ouch! $n's wind knocks $N down to the ground...
TO_NOTVICT2..
Extra_bits..: Linked:
-----------------------------------------------------------------------------
*/
if (row == -1)
{
sprintf (buf, "\x1B[1;1f\x1B[K\x1B[2;1f\x1B[K\x1B[3;1f\x1B[K\x1B[4;1f\x1B[K\x1B[5;1f\x1B[K\x1B[6;1f\x1B[K\x1B[7;1f\x1B[K\x1B[8;1f\x1B[K\x1B[9;1f\x1B[K\x1B[10;1f\x1B[K\x1B[11;1f\x1B[K\x1B[12;1f\x1B[K\x1B[13;1f\x1B[K\x1B[14;1f\x1B[K\x1B[15;1f\x1B[K\x1B[16;1f\x1B[17;%dr", ch->pcdata->pagelen);
send_to_char (buf, ch);
}
if (row == -1 || row == 1)
{
send_to_char ("\x1B[1;1f\x1B[K", ch);
sprintf (buf, "Spel: %d/%d Mana: %d Lvl: %d MType: %s Pos: %s Time: %d Mint: %d",
spell->gsn, top_spell, spell->mana, spell->spell_level, mtype (spell->mana_type),
stpos (spell->position), spell->casting_time, spell->min_int);
send_to_char (buf, ch);
}
if (row == -1 || row == 2)
{
send_to_char ("\x1B[2;1f\x1B[K", ch);
sprintf (buf, "Type: %s ndam: %s Name: %s Name2: %s Mwis: %d",
styp (spell->spell_type), (spell->noun_damage == NULL ? "N/S" : spell->noun_damage), spell->spell_name, spell->spell_funky_name, spell->min_wis);
send_to_char (buf, ch);
}
if (row == -1 || row == 3)
{
send_to_char ("\x1B[3;1f\x1B[K", ch);
sprintf (buf, "Pre1: %s Pre2: %s Creates: %d Lag: %d, Fail: %d PKFail: %d",
(spell->prereq_1 == NULL ? "None" : spell->prereq_1),
(spell->prereq_2 == NULL ? "None" : spell->prereq_2),
spell->creates_obj, spell->spell_lag, spell->fail_chance, spell->pk_fail_chance);
send_to_char (buf, ch);
}
if (row == -1 || row == 4)
{
send_to_char ("\x1B[4;1f\x1B[K", ch);
sprintf (buf, "Duration: %s Bit: %s Bit2: %s",
spell->duration,
affect_bit_name (spell->bitvector),
affect_bit_name_two (spell->bitvector2));
send_to_char (buf, ch);
}
if (row == -1 || row == 5)
{
send_to_char ("\x1B[5;1f\x1B[K", ch);
sprintf (buf, "Damg: %s Slot: %d Wear_off: %s",
(spell->damage == NULL ? "N/A" : spell->damage),
spell->slot, (spell->wear_off_msg == NULL ? "None" : spell->wear_off_msg));
send_to_char (buf, ch);
}
if (row == -1 || row == 6)
{
send_to_char ("\x1B[6;1f\x1B[K", ch);
sprintf (buf, "TO_CHAR1..... %s", (spell->act_to_ch_1 == NULL ? "" : spell->act_to_ch_1));
send_to_char (buf, ch);
}
if (row == -1 || row == 7)
{
send_to_char ("\x1B[7;1f\x1B[K", ch);
sprintf (buf, "TO_CHAR2..... %s", (spell->act_to_ch_2 == NULL ? "" : spell->act_to_ch_2));
send_to_char (buf, ch);
}
if (row == -1 || row == 8)
{
send_to_char ("\x1B[8;1f\x1B[K", ch);
sprintf (buf, "TO_VICT1..... %s", (spell->act_to_vict_1 == NULL ? "" : spell->act_to_vict_1));
send_to_char (buf, ch);
}
if (row == -1 || row == 9)
{
send_to_char ("\x1B[9;1f\x1B[K", ch);
sprintf (buf, "TO_VICT2..... %s", (spell->act_to_vict_2 == NULL ? "" : spell->act_to_vict_2));
send_to_char (buf, ch);
}
if (row == -1 || row == 10)
{
send_to_char ("\x1B[10;1f\x1B[K", ch);
sprintf (buf, "TO_NOTVICT1.. %s", (spell->act_to_notvict_1 == NULL ? "" : spell->act_to_notvict_1));
send_to_char (buf, ch);
}
if (row == -1 || row == 11)
{
send_to_char ("\x1B[11;1f\x1B[K", ch);
sprintf (buf, "TO_NOTVICT2.. %s", (spell->act_to_notvict_2 == NULL ? "" : spell->act_to_notvict_2));
send_to_char (buf, ch);
}
if (row == -1 || row == 12)
{
send_to_char ("\x1B[12;1f\x1B[K", ch);
sprintf (buf, "Extra_bits..: %s %s Linked: %s", spell_extra_bits (spell->spell_bits), spell_extra_bits2 (spell->spell_bits2),
(spell->linked_to == NULL ? " " : spell->linked_to));
send_to_char (buf, ch);
}
if (row == -1 || row == 13)
{
send_to_char ("\x1B[13;1f\x1B[K", ch);
sprintf(buf, "Guild(s):");
send_to_char(buf, ch);
if (spell->guilds != 0)
{
char buf[500];
int i=0;
bool prev= FALSE;
for (i = 0; str_cmp(guild_data[i].what_you_type, "end_of_list"); i++)
{
if (IS_SET(spell->guilds, guild_data[i].mob_guildmaster_bit))
{
if (prev)
send_to_char(",", ch);
sprintf(buf, guild_data[i].what_you_see);
send_to_char(buf, ch);
prev = TRUE;
}
}
}
else
{
sprintf(buf, " None");
send_to_char(buf, ch);
}
sprintf(buf, ".\n\r");
send_to_char(buf, ch);
}
if (row == -1 || row == 14)
{
int jj;
send_to_char ("\x1B[14;1f\x1B[K", ch);
sprintf(buf, "Lctns: ");
for (jj = 0; jj < 5; jj++)
{
char buff[100];
sprintf(buff, "%-13s ", affect_loc_name(spell->location[jj]));
strcat(buf, buff);
}
strcat(buf, "\n\r");
send_to_char (buf, ch);
}
if (row == -1 || row == 15)
{
send_to_char ("\x1B[15;1f\x1B[K", ch);
sprintf(buf, "Modif: %-13s %-13s %-13s %-13s %-13s", (spell->modifier[0] == NULL ? "None" : spell->modifier[0]),(spell->modifier[1] == NULL ? "None" : spell->modifier[1]),(spell->modifier[2] == NULL ? "None" : spell->modifier[2]),(spell->modifier[3]
== NULL ? "None" : spell->modifier[3]),(spell->modifier[4] == NULL ? "None" : spell->modifier[4])),
send_to_char (buf, ch);
}
if (row == -1)
{
send_to_char ("\x1B[17;1f\x1B[K----------------------------------------------------------------------------", ch);
}
sprintf (buf, "\x1B[%d;1f", ch->pcdata->pagelen);
send_to_char (buf, ch);
return;
}
void
do_sedit (CHAR_DATA * ch, char *argy)
{
char arg1[SML_LENGTH];
int value;
SPELL_DATA *spell;
DEFINE_COMMAND ("sedit", do_sedit, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "The spell editor... use with caution!")
// umm no mobs sediting! bad mobs!
if (IS_MOB (ch)) return;
argy = one_argy (argy, arg1);
if (is_number (arg1))
{
value = atoi (arg1);
if ((spell = skill_lookup (NULL, value)) == NULL)
{
send_to_char ("That spell number was not found.\n\r", ch);
return;
}
ch->desc->pEdit = (void *) spell;
ch->desc->connected = CON_SEDITOR;
show_spell (ch, spell, -1);
return;
}
if (!str_cmp (arg1, "create"))
{
spell = new_spell ();
changed_spells = TRUE;
ch->desc->pEdit = (void *) spell;
ch->desc->connected = CON_SEDITOR;
update_name_hash ();
update_gsn_hash ();
show_spell (ch, spell, -1);
return;
}
if (arg1[0] != '\0' && (spell = skill_lookup (arg1, -1)) != NULL)
{
ch->desc->pEdit = (void *) spell;
ch->desc->connected = CON_SEDITOR;
show_spell (ch, spell, -1);
if (spell->gsn > 300)
spell->slot = 2;
if (spell->gsn > 500)
spell->slot = 0;
return;
}
send_to_char ("Syntax: SEDIT #, SEDIT 'Spell_name', or SEDIT CREATE.\n\r", ch);
return;
}
void
sedit (CHAR_DATA * ch, char *argy)
{
char *orarg = argy;
char arg1[SML_LENGTH];
char arg2[SML_LENGTH];
bool fnn;
SPELL_DATA *spell;
spell = (SPELL_DATA *) ch->desc->pEdit;
if (!spell)
{
interpret (ch, argy);
return;
}
if (spell->gsn > 500)
spell->slot = 0;
arg1[0] = '\0';
arg2[0] = '\0';
argy = one_argy (argy, arg1);
if (arg1[0] == '\0')
{
show_spell (ch, spell, -1);
return;
}
if (!str_cmp (arg1, "done"))
{
ch->desc->pEdit = NULL;
ch->desc->connected = CON_PLAYING;
sprintf (arg1, "\x1B[1;%dr\x1B[2J\x1B[%d;1f", ch->pcdata->pagelen, ch->pcdata->pagelen);
send_to_char (arg1, ch);
return;
}
if (!str_cmp (arg1, "name"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
send_to_char ("Syntax: Name <spell_name>.\n\r", ch);
return;
}
free_string (spell->spell_name);
spell->spell_name = str_dup (argy);
changed_spells = TRUE;
update_name_hash ();
show_spell (ch, spell, 2);
return;
}
if (!str_cmp (arg1, "name2"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
send_to_char ("Syntax: Name2 <spell_name_2>.\n\r", ch);
return;
}
free_string (spell->spell_funky_name);
spell->spell_funky_name = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 2);
return;
}
if (!str_cmp (arg1, "ndam"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
send_to_char ("Syntax: Ndam <word>.\n\r", ch);
return;
}
if (spell->noun_damage != NULL)
free_string (spell->noun_damage);
spell->noun_damage = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 2);
return;
}
if (!str_cmp (arg1, "guild"))
{
int i;
for (i = 0; str_cmp(guild_data[i].what_you_type, "end_of_list"); i++)
{
if (!str_cmp(guild_data[i].what_you_type, argy))
{
char buf[100];
sprintf(buf, guild_data[i].what_you_see);
if (IS_SET(spell->guilds, guild_data[i].mob_guildmaster_bit))
send_to_char("Guild Removed\n\r", ch);
else
send_to_char("Guild Added\n\r", ch);
spell->guilds ^= guild_data[i].mob_guildmaster_bit;
changed_spells = TRUE;
show_spell (ch, spell, 13);
return;
}
}
send_to_char ("Unknown guild.\n\r", ch);
return;
}
if (!str_prefix ("link", arg1))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
if (spell->linked_to != NULL)
free_string (spell->linked_to);
spell->linked_to = NULL;
send_to_char ("Linked_to cleared.\n\r", ch);
return;
}
if (spell->linked_to != NULL)
free_string (spell->linked_to);
spell->linked_to = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 12);
return;
}
if (!str_cmp (arg1, "damg"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
send_to_char ("Syntax: Damg <string>.\n\r", ch);
return;
}
if (spell->damage != NULL)
free_string (spell->damage);
spell->damage = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 5);
return;
}
if (!str_cmp (arg1, "wear_off"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
send_to_char ("Syntax: wear_off <string>.\n\r", ch);
return;
}
if (spell->wear_off_msg != NULL)
free_string (spell->wear_off_msg);
spell->wear_off_msg = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 5);
return;
}
if (!str_cmp (arg1, "duration"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
send_to_char ("Syntax: duration <duration val>.\n\r", ch);
return;
}
if (spell->duration != NULL)
free_string (spell->duration);
spell->duration = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 4);
return;
}
if (!str_cmp (arg1, "to_char1"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
if (spell->act_to_ch_1 != NULL)
free_string (spell->act_to_ch_1);
spell->act_to_ch_1 = NULL;
return;
}
if (spell->act_to_ch_1 != NULL)
free_string (spell->act_to_ch_1);
spell->act_to_ch_1 = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 6);
return;
}
if (!str_cmp (arg1, "to_char2"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
if (spell->act_to_ch_2 != NULL)
free_string (spell->act_to_ch_2);
spell->act_to_ch_2 = NULL;
return;
}
if (spell->act_to_ch_2 != NULL)
free_string (spell->act_to_ch_2);
changed_spells = TRUE;
spell->act_to_ch_2 = str_dup (argy);
show_spell (ch, spell, 7);
return;
}
if (!str_cmp (arg1, "to_vict1"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
if (spell->act_to_vict_1 != NULL)
free_string (spell->act_to_vict_1);
spell->act_to_vict_1 = NULL;
return;
}
if (spell->act_to_vict_1 != NULL)
free_string (spell->act_to_vict_1);
spell->act_to_vict_1 = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 8);
return;
}
if (!str_cmp (arg1, "to_vict2"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
if (spell->act_to_vict_2 != NULL)
free_string (spell->act_to_vict_2);
spell->act_to_vict_2 = NULL;
return;
}
if (spell->act_to_vict_2 != NULL)
free_string (spell->act_to_vict_2);
spell->act_to_vict_2 = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 9);
return;
}
if (!str_cmp (arg1, "to_notvict1"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
if (spell->act_to_notvict_1 != NULL)
free_string (spell->act_to_notvict_1);
spell->act_to_notvict_1 = NULL;
return;
}
if (spell->act_to_notvict_1 != NULL)
free_string (spell->act_to_notvict_1);
spell->act_to_notvict_1 = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 10);
return;
}
if (!str_cmp (arg1, "to_notvict2"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
if (spell->act_to_notvict_2 != NULL)
free_string (spell->act_to_notvict_2);
spell->act_to_notvict_2 = NULL;
return;
}
if (spell->act_to_notvict_2 != NULL)
free_string (spell->act_to_notvict_2);
spell->act_to_notvict_2 = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 11);
return;
}
if (!str_cmp (arg1, "pre1"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
if (spell->prereq_1 != NULL)
free_string (spell->prereq_1);
spell->prereq_1 = NULL;
return;
}
if (spell->prereq_1 != NULL)
free_string (spell->prereq_1);
spell->prereq_1 = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 3);
return;
}
if (!str_cmp (arg1, "pre2"))
{
if (argy == NULL || argy[0] == '\0' || argy == "")
{
if (spell->prereq_2 != NULL)
free_string (spell->prereq_2);
spell->prereq_2 = NULL;
return;
}
if (spell->prereq_2 != NULL)
free_string (spell->prereq_2);
spell->prereq_2 = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 3);
return;
}
if (!str_cmp (arg1, "modifier"))
{
char arg2[SML_LENGTH];
int num;
argy = one_argy(argy, arg2);
if (!is_number(arg2))
{
send_to_char("Syntax: modifier <number> <modifier val>\n\r", ch);
return;
}
num = atoi(arg2);
if (num < 0 || num > 4)
{
send_to_char("Pick a number from 0-4 to modify.\n\r", ch);
return;
}
if (argy == NULL || argy[0] == '\0' || argy == "")
{
send_to_char ("Syntax: modifier <number> <modifier val>.\n\r", ch);
return;
}
if (spell->modifier[num] != NULL)
free_string (spell->modifier[num]);
spell->modifier[num] = str_dup (argy);
changed_spells = TRUE;
show_spell (ch, spell, 15);
return;
}
if ((!str_cmp (arg1, "mwis") || !str_cmp (arg1, "mdex")) && is_number (argy))
{
int ii;
ii = atoi (argy);
spell->min_wis = ii;
changed_spells = TRUE;
show_spell (ch, spell, 2);
return;
}
if ((!str_cmp (arg1, "mint") || !str_cmp (arg1, "mstr")) && is_number (argy))
{
int ii;
ii = atoi (argy);
spell->min_int = ii;
changed_spells = TRUE;
show_spell (ch, spell, 1);
return;
}
if ((!str_cmp (arg1, "mana") || !str_cmp (arg1, "moves")) && is_number (argy))
{
int ii;
ii = atoi (argy);
spell->mana = ii;
changed_spells = TRUE;
show_spell (ch, spell, 1);
return;
}
if (!str_cmp (arg1, "lvl") && is_number (argy))
{
int ii;
ii = atoi (argy);
spell->spell_level = ii;
changed_spells = TRUE;
show_spell (ch, spell, 1);
return;
}
if (!str_cmp (arg1, "goodroom") && is_number (argy))
{
int ii;
ii = atoi (argy);
spell->in_room_good = ii;
changed_spells = TRUE;
show_spell (ch, spell, 1);
return;
}
if (!str_cmp (arg1, "evilroom") && is_number (argy))
{
int ii;
ii = atoi (argy);
spell->in_room_evil = ii;
changed_spells = TRUE;
show_spell (ch, spell, 3);
return;
}
if (!str_cmp (arg1, "fail_chance") && is_number (argy))
{
int ii;
ii = atoi (argy);
spell->fail_chance = ii;
changed_spells = TRUE;
show_spell (ch, spell, 3);
return;
}
if (!str_cmp (arg1, "spell_lag") && is_number (argy))
{
int ii;
ii = atoi (argy);
spell->spell_lag = ii;
changed_spells = TRUE;
show_spell (ch, spell, 3);
return;
}
if (!str_cmp (arg1, "pk_fail") && is_number (argy))
{
int ii;
ii = atoi (argy);
spell->pk_fail_chance = ii;
changed_spells = TRUE;
show_spell (ch, spell, 3);
return;
}
if ((!str_cmp (arg1, "time") || !str_cmp (arg1, "delay")) && is_number (argy))
{
int ii;
ii = atoi (argy);
spell->casting_time = ii;
changed_spells = TRUE;
show_spell (ch, spell, 1);
return;
}
if (!str_cmp (arg1, "creates_obj") && is_number (argy))
{
int ii;
ii = atoi (argy);
spell->creates_obj = ii;
changed_spells = TRUE;
return;
}
if (!str_cmp (arg1, "slot") && is_number (argy))
{
int ii;
ii = atoi (argy);
if (ii == 0)
{
send_to_char ("You can not set slot number to 0.\n\r", ch);
return;
}
spell->slot = ii;
changed_spells = TRUE;
show_spell (ch, spell, 5);
return;
}
fnn = FALSE;
if (stpos_rev (arg1) != -99)
{
spell->position = stpos_rev (arg1);
changed_spells = TRUE;
show_spell (ch, spell, 1);
fnn = TRUE;
}
if (mtype_rev (arg1) != -99)
{
spell->mana_type ^= mtype_rev (arg1);
changed_spells = TRUE;
show_spell (ch, spell, 1);
fnn = TRUE;
}
if (styp_rev (arg1) != -99)
{
spell->spell_type = styp_rev (arg1);
changed_spells = TRUE;
show_spell (ch, spell, 2);
fnn = TRUE;
}
if (spell_extra_bits_rev (arg1) != -99)
{
spell->spell_bits ^= spell_extra_bits_rev (arg1);
changed_spells = TRUE;
show_spell (ch, spell, 12);
fnn = TRUE;
}
if (spell_extra_bits2_rev (arg1) != -99)
{
spell->spell_bits2 ^= spell_extra_bits2_rev (arg1);
changed_spells = TRUE;
show_spell (ch, spell, 12);
fnn = TRUE;
}
if (affect_name_bit (arg1) != 0)
{
spell->bitvector ^= affect_name_bit (arg1);
changed_spells = TRUE;
show_spell (ch, spell, 4);
fnn = TRUE;
}
if (affect_name_bit_two (arg1) != 0)
{
spell->bitvector2 ^= affect_name_bit_two (arg1);
changed_spells = TRUE;
show_spell (ch, spell, 4);
fnn = TRUE;
}
if( !str_cmp(arg1, "location"))
{
char arg2[SML_LENGTH];
int num;
argy = one_argy(argy, arg2);
if (!is_number(arg2))
{
send_to_char("Syntax: location <number> <type>\n\r", ch);
return;
}
num = atoi(arg2);
if (num < 0 || num > 4)
{
send_to_char("Pick a number from 0-4 to set the location.\n\r", ch);
return;
}
if (argy == NULL || argy[0] == '\0' || argy == "")
{
send_to_char ("Syntax: location <number> <modifier val>.\n\r", ch);
return;
}
if (affect_name_loc (argy) != -99)
{
spell->location[num] = affect_name_loc (argy);
changed_spells = TRUE;
show_spell (ch, spell, 14);
fnn = TRUE;
}
else
{
send_to_char("Location not found.\n\r", ch);
show_spell (ch, spell, 14);
return;
}
}
if (!fnn)
interpret (ch, orarg);
return;
}
SPELL_DATA *
new_spell (void)
{
SPELL_DATA *spell;
spell = mem_alloc (sizeof (*spell));
bzero (spell, sizeof (*spell));
top_spell++;
spell->slot = 1;
spell->linked_to = NULL;
spell->noun_damage = str_dup ("Spell");
spell->gsn = top_spell;
spell->min_int = 0;
spell->min_wis = 0;
spell->spell_type = 0;
spell->spell_bits = 0;
spell->spell_name = str_dup ("Newspell");
spell->spell_funky_name = str_dup ("NewSpell");
spell->spell_level = 0;
spell->prereq_1 = NULL;
spell->prereq_2 = NULL;
spell->act_to_ch_1 = NULL;
spell->act_to_ch_2 = NULL;
spell->act_to_vict_1 = NULL;
spell->act_to_vict_2 = NULL;
spell->act_to_notvict_1 = NULL;
spell->act_to_notvict_2 = NULL;
{
int jj;
for (jj = 0; jj < 5; jj++)
{
spell->location[jj] = 0;
spell->modifier[jj] = NULL;
}
}
spell->duration = NULL;
spell->bitvector = 0;
spell->damage = NULL;
spell->mana = 0;
spell->mana_type = 0;
spell->casting_time = 0;
spell->position = POSITION_RESTING;
spell->wear_off_msg = str_dup ("The spell has worn off.");
spell->creates_obj = 0;
spell->guilds = 0;
spell->spell_lag = 0;
spell->in_room_good = 0;
spell->in_room_evil = 0;
spell->fail_chance = 0;
spell->pk_fail_chance = 0;
spell->next = spell_list[spell->gsn % SPELL_HASH];
spell_list[spell->gsn % SPELL_HASH] = spell;
spell->next_a = spell_list_2[UPPER (spell->spell_funky_name[0]) % SPELL_HASH];
spell_list_2[UPPER (spell->spell_funky_name[0]) % SPELL_HASH] = spell;
return spell;
}
/* Below is my translator. Variables accepted:
l = level
i = char's intelligence
w = char's wisdom
a = random from 1-10
b = random from 10-20
c = random from 20-30
d = random from 1-level
m = Syntax m42 would be max of 42 damage (numeric only)
z = Syntax z3 would be minimum 3 damage (numeric only)
k = kick damage
g = Wizard's Guild then 1, else 0
h = Healer's Guild then 1, else 0
o = Warrior's Guild then 1, else 0
t = max hit points... used for mob exp calc.
please note: all operations are performed from left to right. This makes
for simple coding, and a damn quick pass thru a complicated expression.
sample:
l+w/3 would be written in real terms as: l/3 + w/3 or (l+w)/3
i+w+l*2/3+l would be written in real terms as: (((i+w)+l)*2)/3)+l
You can now use parens :)
*/
char *pos;
long
translate (char *line, int level, CHAR_DATA * ch)
{
long dam = 0;
long cur_num = 0;
char *tp;
char cur_op = '+';
long ctt;
if (!line)
return 0;
pos = line;
for (pos = line; *pos != '\0'; pos++)
{
if (is_digit (*pos))
{
cur_num *= 10;
cur_num += (*pos - '0');
continue;
}
if (*pos == ')')
{
if (cur_op == '*')
dam *= cur_num;
if (cur_op == '/')
dam /= cur_num;
if (cur_op == '+')
dam += cur_num;
if (cur_op == '-')
dam -= cur_num;
if (cur_op == '\0')
dam = cur_num;
return dam;
}
if (*pos == '(')
{
cur_num = translate (pos + 1, level, ch);
continue;
}
if (*pos == 't')
{
cur_num = ch->max_hit;
}
if (*pos == 'g')
{
cur_num = is_member (ch, GUILD_WIZARD) ? 1 : 0;
}
if (*pos == 'u')
{
if (ch->pcdata->race > 10)
cur_num = 1;
else
cur_num = 0;
}
if (*pos == 'h')
{
cur_num = is_member (ch, GUILD_HEALER) ? 1 : 0;
}
if (*pos == 'o')
{
cur_num = is_member (ch, GUILD_WARRIOR) ? 1 : 0;
}
if (*pos == 'z')
{
int tnn = 0;
if (cur_op == '*')
dam *= cur_num;
if (cur_op == '/')
dam /= cur_num;
if (cur_op == '+')
dam += cur_num;
if (cur_op == '-')
dam -= cur_num;
if (cur_op == '\0')
dam = cur_num;
cur_op = '[';
cur_num = 0;
ctt = 0;
for (tp = pos + 1; *tp != '\0' && is_digit ((*tp)); tp++)
{
ctt++;
tnn *= 10;
tnn += (*tp - '0');
}
if (dam < tnn)
{
dam = tnn;
cur_num = tnn;
}
pos += ctt;
continue;
}
if (*pos == 'm')
{
int tnn = 0;
if (cur_op == '*')
dam *= cur_num;
if (cur_op == '/')
dam /= cur_num;
if (cur_op == '+')
dam += cur_num;
if (cur_op == '-')
dam -= cur_num;
if (cur_op == '\0')
dam = cur_num;
cur_op = '[';
cur_num = 0;
ctt = 0;
for (tp = pos + 1; *tp != '\0' && is_digit ((*tp)); tp++)
{
ctt++;
tnn *= 10;
tnn += (*tp - '0');
}
if (dam > tnn)
{
dam = tnn;
cur_num = tnn;
}
pos += ctt;
continue;
}
if (*pos == '+')
{
if (cur_op == '*')
dam *= cur_num;
if (cur_op == '/')
dam /= cur_num;
if (cur_op == '+')
dam += cur_num;
if (cur_op == '-')
dam -= cur_num;
if (cur_op == '\0')
dam = cur_num;
cur_op = '+';
cur_num = 0;
}
if (*pos == '-')
{
if (cur_op == '*')
dam *= cur_num;
if (cur_op == '/')
dam /= cur_num;
if (cur_op == '+')
dam += cur_num;
if (cur_op == '-')
dam -= cur_num;
if (cur_op == '\0')
dam = cur_num;
cur_op = '-';
cur_num = 0;
}
if (*pos == '/')
{
if (cur_op == '*')
dam *= cur_num;
if (cur_op == '/')
dam /= cur_num;
if (cur_op == '+')
dam += cur_num;
if (cur_op == '-')
dam -= cur_num;
if (cur_op == '\0')
dam = cur_num;
cur_op = '/';
cur_num = 0;
}
if (*pos == '*')
{
if (cur_op == '*')
dam *= cur_num;
if (cur_op == '/')
dam /= cur_num;
if (cur_op == '+')
dam += cur_num;
if (cur_op == '-')
dam -= cur_num;
if (cur_op == '\0')
dam = cur_num;
cur_op = '*';
cur_num = 0;
}
if (*pos == 'd')
cur_num = number_range (1, level);
if (*pos == 'k')
cur_num = ch->pcdata->plus_kick;
if (*pos == 'l')
cur_num = level;
if (*pos == 'w' && ch)
cur_num = get_curr_wis (ch);
if (*pos == 'i' && ch)
cur_num = get_curr_int (ch);
if (*pos == 's' && ch)
cur_num = get_curr_str (ch);
if (*pos == 'x' && ch)
cur_num = get_curr_con (ch);
if (*pos == 'y' && ch)
cur_num = get_curr_dex (ch);
if (*pos == 'a')
cur_num = number_range (1, 10);
if (*pos == 'b')
cur_num = number_range (10, 20);
if (*pos == 'c')
cur_num = number_range (20, 30);
}
if (cur_op == '*')
dam *= cur_num;
if (cur_op == '/')
dam /= cur_num;
if (cur_op == '+')
dam += cur_num;
if (cur_op == '-')
dam -= cur_num;
if (cur_op == '\0')
dam = cur_num;
return dam;
}