/* ************************************************************************
* File: spell_parser.c Part of CircleMUD *
* Usage: command interpreter for 'cast' command (spells) *
* *
* All rights reserved. See license.doc for complete information. *
* *
* Copyright (C) 1993 by the Trustees of the Johns Hopkins University *
* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. *
************************************************************************ */
/* spell_parser.c split into two files spell_parser1.c and spell_parser2.c*/
/* Archipelago changes by Alastair J. Neil Copyright (C) 1993, 94, 95, 96 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "db.h"
#include "interpreter.h"
#include "spells.h"
#include "handler.h"
#define NSKILLO(nr, beat, pos, lev, guild, mx_lev, \
ubaslev, diff, gld, keys, secs, ters, tar, func, \
race) { \
spell_info[nr].spll_pointer = (func); \
spell_info[nr].beats = (beat); \
spell_info[nr].minimum_position = (pos); \
spell_info[nr].min_level = (lev); \
spell_info[nr].which_guild = (guild); \
spell_info[nr].max_level = (mx_lev); \
spell_info[nr].difficulty = (diff);\
spell_info[nr].use_bas_lev = (ubaslev);\
spell_info[nr].gold = (gld);\
spell_info[nr].key_stats = (keys); \
spell_info[nr].sec_stats = (secs); \
spell_info[nr].ter_stats = (ters); \
spell_info[nr].targets = (tar); \
spell_info[nr].race_flag = (race); \
}
#define NSPELLO(nr, beat, pos, lev, guild, mx_lev, \
ubaslev, diff, gld, keys, secs, ters, tar, dur, func,\
race) { \
spell_info[nr].spll_pointer = (func); \
spell_info[nr].beats = (beat); \
spell_info[nr].minimum_position = (pos); \
spell_info[nr].min_level = (lev); \
spell_info[nr].which_guild = (guild); \
spell_info[nr].max_level = (mx_lev); \
spell_info[nr].difficulty = (diff);\
spell_info[nr].use_bas_lev = (ubaslev);\
spell_info[nr].gold = (gld);\
spell_info[nr].key_stats = (keys); \
spell_info[nr].sec_stats = (secs); \
spell_info[nr].ter_stats = (ters); \
spell_info[nr].targets = (tar); \
spell_info[nr].dam_duration = (dur); \
spell_info[nr].race_flag = (race); \
}
void add_event(int plse, int event, int inf1, int inf2, int inf3
, int inf4, char *arg, void *subj, void *vict);
int spell_lev(struct char_data *caster, int spell);
int stress_die(void);
int find_spell_num(char *arg);
char *find_spell_name(int spl);
char *find_skill_name(int spl);
char *rev_search_list(int num, struct list_index_type *list);
char *skip_spaces(char *string);
void say_spell(struct char_data *ch, int si, int subcmd );
int generic_find_target(char *arg, int bitvector,
struct char_data *ch,
struct char_data **tar_ch,
struct obj_data **tar_obj);
/* Global data */
extern struct room_data *world;
extern struct char_data *character_list;
extern char *spell_wear_off_msg[];
struct spell_info_type spell_info[MAX_SPL_LIST];
struct list_index_type am_skills[] = {
{"Creo", 112,"\0"},
{"Intellego", 113,"\0"},
{"Muto", 114,"\0"},
{"Perdo", 115,"\0"},
{"Rego", 116,"\0"},
{"Animal", 117,"\0"},
{"Aquam", 118,"\0"},
{"Auram", 119,"\0"},
{"Corpus", 120,"\0"},
{"Herbam", 121,"\0"},
{"Ignem", 122,"\0"},
{"Imagonem", 123,"\0"},
{"Mentem", 124,"\0"},
{"Terram", 125,"\0"},
{"Vim", 126,"\0"},
{"Magic Theory",127,"\0"},
{"\n", -1,"\0"}
};
struct list_index_type Cleric_skills[] ={
{"Bless", 135, "\0"},
{"Turn Undead", 136, "\0"},
{"\n",-1,"\0"}
};
struct list_index_type Horse_skills[] ={
{"Mount", 129,"\0"},
{"Riding", 130,"\0"},
{"\n",-1,"\0"}
};
struct list_index_type Ranger_skills[] ={
{"Track", 131,"\0"},
{"Taming the wild beast", 132,"\0"},
{"\n",-1,"\0"}
};
struct list_index_type Hasad_skills[] ={
{"Mount", 129,"\0"},
{"Riding", 130,"\0"},
{"Track", 131,"\0"},
{"Taming the wild beast", 132,"\0"},
{"\n",-1,"\0"}
};
struct list_index_type Warrior_skills[] ={
{"Fisticuffs", 133,"\0"},
{"Kick", 106,"\0"},
{"Bash", 107,"\0"},
{"Rescue", 108,"\0"},
{"Behead", 111,"\0"},
{"Dual Wield", 134,"\0"},
{"Cavalry Skills", 128,"\0"},
{"\n",-1,"\0"}
};
struct list_index_type Weapons[] ={
{"Sword", 201,"\0"},
{"2H Sword", 202,"\0"},
{"Dagger", 203,"\0"},
{"Club", 204,"\0"},
{"2H Club", 205,"\0"},
{"Hammer", 206,"\0"},
{"2H Hammer",207,"\0"},
{"Axe", 208,"\0"},
{"2H Axe", 209,"\0"},
{"Spear", 210,"\0"},
{"Whip", 211,"\0"},
{"Claw", 212,"\0"},
{"\n",-1,"\0"}
};
struct list_index_type Thief_skills[] ={
{"Sneak", 101,"\0"},
{"Hide", 102,"\0"},
{"Steal", 103,"\0"},
{"Backstab", 104,"\0"},
{"Pick Lock", 105,"\0"},
{"Climb", 109,"\0"},
{"\n",-1,"\0"}
};
struct list_index_type combat_other[] ={
{"Invocation of the Milky Eyes",4,"PeCo"},
{"Palm of Flame", 92,"CrIg"},
{"Flash of the Scarlet Flames", 93,"CrIg"},
{"Pilum of Fire", 94,"CrIg"},
{"Pilum of Fire", 94,"CrIg"},
{"Pilum of Fire", 94,"CrIg"},
{"Pilum of Fire", 94,"CrIg"},
{"Spasms of the Uncontrollable Hands", 341,"ReCo"},
{"Footsteps of the Slippery Oil", 302,"CrAq"},
{"Pilum of Fire", 94,"CrIg"},
{"Invocation of the Milky Eyes",4,"PeCo"},
{"Palm of Flame", 92,"CrIg"},
{"Flash of the Scarlet Flames", 93,"CrIg"},
{"Palm of Flame", 92,"CrIg"},
{"Flash of the Scarlet Flames", 93,"CrIg"},
{"Palm of Flame", 92,"CrIg"},
{"Flash of the Scarlet Flames", 93,"CrIg"},
{"Deluge of the Rushing and Gushing", 320,"CrAq"},
{"Mighty Torrent of Water", 321,"CrAq"},
{"Blade of Shivering Ice", 322,"CrAq"},
{"Blade of Shivering Ice", 322,"CrAq"},
{"Encase in Ice", 323,"CrAq"},
{"Mighty Torrent of Water", 321,"CrAq"},
{"Blade of Shivering Ice", 322,"CrAq"},
{"Blade of Shivering Ice", 322,"CrAq"},
{"Encase in Ice", 323,"CrAq"},
{"Deluge of the Rushing and Gushing", 320,"CrAq"},
{"Mighty Torrent of Water", 321,"CrAq"},
{"Deluge of the Rushing and Gushing", 320,"CrAq"},
{"Mighty Torrent of Water", 321,"CrAq"},
{"Blade of Shivering Ice", 322,"CrAq"},
{"Encase in Ice", 323,"CrAq"},
{"Lungs of Water and Death", 324,"CrAq"},
{"Seven League Stride", 346,"ReCo"},
{"Seven League Stride", 346,"ReCo"},
{"Carbuncle of the Earth",5,"ReTe"},
{"Carbuncle of the Earth",5,"ReTe"},
{"Carbuncle of the Earth",5,"ReTe"},
{"Carbuncle of the Earth",5,"ReTe"},
{"Seven League Stride", 346,"ReCo"},
{"Flash of the Scarlet Flames", 93,"CrIg"},
{"Pilum of Fire", 94,"CrIg"},
{"Lance of Solar Fury", 98,"CrIg"},
{"Weavers Trap of Webs",14,"CrAn"},
{"Lance of Solar Fury", 98,"CrIg"},
{"Weavers Trap of Webs",14,"CrAn"},
{"Arc of Fiery Ribbons", 95,"CrIg"},
{"Ball of Abysmal Flame", 96,"CrIg"},
{"Earth Shock",23,"ReTe"},
{"Lance of Solar Fury", 98,"CrIg"},
{"Weavers Trap of Webs",14,"CrAn"},
{"Lance of Solar Fury", 98,"CrIg"},
{"Weavers Trap of Webs",14,"CrAn"},
{"Arc of Fiery Ribbons", 95,"CrIg"},
{"Ball of Abysmal Flame", 96,"CrIg"},
{"Earth Shock",23,"ReTe"},
{"Lance of Solar Fury", 98,"CrIg"},
{"Weavers Trap of Webs",14,"CrAn"},
{"Lance of Solar Fury", 98,"CrIg"},
{"Weavers Trap of Webs",14,"CrAn"},
{"Arc of Fiery Ribbons", 95,"CrIg"},
{"Ball of Abysmal Flame", 96,"CrIg"},
{"Earth Shock",23,"ReTe"},
{"Breath of Vulcan", 97,"CrIg"},
{"The Pool of Jenny Greenteeth", 325,"CrAq"},
{"Call to the Watery Grave", 326,"CrAq"},
{"\n",-1,"\0"}
};
struct list_index_type combat_self[] ={
{"Free the Accursed Body", 332,"CrCo"},
{"Breath of Invigoration",2,"CrCo"},
{"Breath of Invigoration",2,"CrCo"},
{"Breath of Invigoration",2,"CrCo"},
{"Healing Touch of the Chirugeon", 333,"CrCo"},
{"Healing Touch of the Chirugeon", 333,"CrCo"},
{"Healing Touch of the Chirugeon", 333,"CrCo"},
{"Healing Touch of the Chirugeon", 333,"CrCo"},
{"Healing Touch of the Chirugeon", 333,"CrCo"},
{"Restoration of the Body Defiled", 334,"CrCo"},
{"Restoration of the Body Defiled", 334,"CrCo"},
{"Strength of the Blacksmith", 331,"CrCo"},
{"Grip of the Lightning Swordsman", 3,"MuCo"},
{"Fortitude of the Bear", 1,"MuCo"},
{"Bind Wounds", 330,"CrCo"},
{"Discern Image of Truth and Falsehood", 19,"InIm"},
{"Lungs of the Fish",47,"MuAq"},
{"Lungs of the Fish",47,"MuAq"},
{"\n",-1,"\0"}
};
struct list_index_type mob_beneficial[] ={
{"Bind Wounds", 330,"CrCo"},
{"Bind Wounds", 330,"CrCo"},
{"Bind Wounds", 330,"CrCo"},
{"Bind Wounds", 330,"CrCo"},
{"Bind Wounds", 330,"CrCo"},
{"Free the Accursed Body", 332,"CrCo"},
{"Breath of Invigoration",2,"CrCo"},
{"Healing Touch of the Chirugeon", 333,"CrCo"},
{"Healing Touch of the Chirugeon", 333,"CrCo"},
{"Restoration of the Body Defiled", 334,"CrCo"},
{"\n",-1,"\0"}
};
struct list_index_type Water[] = {
{"Quench the Thirst of Five Men", 301,"CrAq"},
{"Lungs of the Fish",47,"MuAq"},
{"Footsteps of the Slippery Oil", 302,"CrAq"},
{"Deluge of the Rushing and Gushing", 320,"CrAq"},
{"Grant Lungs of the Fish",48,"MuAq"},
{"Mighty Torrent of Water", 321,"CrAq"},
{"Blade of Shivering Ice", 322,"CrAq"},
{"Encase in Ice", 323,"CrAq"},
{"Lungs of Water and Death", 324,"CrAq"},
{"The Pool of Jenny Greenteeth", 325,"CrAq"},
{"Call to the Watery Grave", 326,"CrAq"},
{"\n", -1,"\0"}
};
struct list_index_type InVm[] ={
{"Sense the Nature of Vis", 20, "InVm"},
{"Scales of the Magical Balance", 21, "InVm"},
{"Perceive Magical Scent", 22, "InVm"},
{"\n", -1,"\0"}
};
struct list_index_type ReCo[] ={
{"Spasms of the Uncontrollable Hands", 341,"ReCo"},
{"Endurance of the Beserker", 344,"ReCo"},
{"Gift of Vigour", 343,"ReCo"},
{"The Walking Corpse", 345,"ReCo"},
{"Leap of Homecoming", 342,"ReCo"},
{"Seven League Stride", 346,"ReCo"},
{"\n", -1,"\0"}
};
struct list_index_type ReTe[] ={
{"Carbuncle of the Earth",5,"ReTe"},
{"Earth Shock",23,"ReTe"},
{"\n", -1,"\0"}
};
struct list_index_type MuTe[] ={
{"Edge of the Razor",30,"MuTe"},
{"\n", -1,"\0"}
};
struct list_index_type Mason_spells[] ={
{"Edge of the Razor",30,"MuTe"},
{"Carbuncle of the Earth",5,"ReTe"},
{"Earth Shock",23,"ReTe"},
};
struct list_index_type PeIm[] ={
{"Invisibility of the Standing Wizard", 27,"PeIm"},
{"Chamber of Invisibility", 28,"PeIm"},
{"Veil of Invisibility", 29,"PeIm"},
{"\n", -1,"\0"}
};
struct list_index_type CrIm[]= {
{"Reveal the Lost Image", 24,"CrIm"},
{"\n", -1,"\0"}
};
struct list_index_type InIm[]={
{"Discern Image of Truth and Falsehood", 19,"InIm"},
{"\n", -1,"\0"}
};
struct list_index_type archivist[] ={
{"Discern Image of Truth and Falsehood", 19,"InIm"},
{"Reveal the Lost Image", 24,"CrIm"},
{"Sense the Nature of Vis", 20, "InVm"},
{"Scales of the Magical Balance", 21, "InVm"},
{"Perceive Magical Scent", 22, "InVm"},
{"\n", -1,"\0"}
};
struct list_index_type wizened[] ={
{"Lamp Without Flame", 91,"CrIg"},
{"Bind Wounds", 330,"CrCo"},
{"Palm of Flame", 92,"CrIg"},
{"Lungs of the Fish",47,"MuAq"},
{"\n", -1,"\0"}
};
struct list_index_type clio[] ={
{"Spasms of the Uncontrollable Hands", 341,"ReCo"},
{"Grip of the Lightning Swordsman", 3,"MuCo"},
{"Fortitude of the Bear", 1,"MuCo"},
{"Strength of the Blacksmith", 331,"CrCo"},
{"\n", -1,"\0"}
};
struct list_index_type Stout_spells[] ={
{"Spasms of the Uncontrollable Hands", 341,"ReCo"},
{"Grip of the Lightning Swordsman", 3,"MuCo"},
{"Fortitude of the Bear", 1,"MuCo"},
{"Endurance of the Beserker", 344,"ReCo"},
{"Gift of Vigour", 343,"ReCo"},
{"Invocation of the Milky Eyes",4,"PeCo"},
{"The Walking Corpse", 345,"ReCo"},
{"Leap of Homecoming", 342,"ReCo"},
{"Seven League Stride", 346,"ReCo"},
{"\n", -1,"\0"}
};
struct list_index_type MuCo[] = {
{"Grip of the Lightning Swordsman", 3,"MuCo"},
{"Fortitude of the Bear", 1,"MuCo"},
{"\n", -1,"\0"}
};
struct list_index_type Thin_spells[] = {
{"Reveal the Lost Image", 24,"CrIm"},
{"Discern Image of Truth and Falsehood", 19,"InIm"},
{"Sense the Nature of Vis", 20, "InVm"},
{"Grip of the Lightning Swordsman", 3,"MuCo"},
{"Fortitude of the Bear", 1,"MuCo"},
{"Scales of the Magical Balance", 21, "InVm"},
{"Perceive Magical Scent", 22, "InVm"},
{"Rain of Stones",32,"MuAu"},
{"Invisibility of the Standing Wizard", 27,"PeIm"},
{"Chamber of Invisibility", 28,"PeIm"},
{"Veil of Invisibility", 29,"PeIm"},
{"\n", -1,"\0"}
};
struct list_index_type CrCo[] = {
{"Bind Wounds", 330,"CrCo"},
{"Strength of the Blacksmith", 331,"CrCo"},
{"Free the Accursed Body", 332,"CrCo"},
{"Breath of Invigoration",2,"CrCo"},
{"Healing Touch of the Chirugeon", 333,"CrCo"},
{"Restoration of the Body Defiled", 334,"CrCo"},
{"Beauty of the Youthful", 335,"CrCo"},
{"Feet of the Nimble Cat", 336,"CrCo"},
{"Health of the Hearty Lad", 337,"CrCo"},
{"Conjure the Homunculous", 338,"CrCo"},
{"Incantation of the Body Made Whole", 339,"CrCo"},
{"Conjure the Golem", 340,"CrCo"},
{"\n", -1,"\0"}
};
struct list_index_type PeCo[] = {
{"Invocation of the Milky Eyes",4,"PeCo"},
{"\n", -1,"\0"}
};
struct list_index_type CrIg[] = {
{"Lamp Without Flame", 91,"CrIg"},
{"Palm of Flame", 92,"CrIg"},
{"Flash of the Scarlet Flames", 93,"CrIg"},
{"Pilum of Fire", 94,"CrIg"},
{"Arc of Fiery Ribbons", 95,"CrIg"},
{"Ball of Abysmal Flame", 96,"CrIg"},
{"Breath of Vulcan", 97,"CrIg"},
{"Lance of Solar Fury", 98,"CrIg"},
{"Last Flight of the Phoenix", 99,"CrIg"},
{"\n", -1,"\0"}
};
struct list_index_type Animal[] = {
{"Feast for Five Men",12,"CrAn"},
{"Soothe the Pains of the Beast",13,"CrAn"},
{"Weavers Trap of Webs",14,"CrAn"},
{"\n", -1,"\0"}
};
struct list_index_type MuAu[] ={
{"Rain of Stones",32,"MuAu"},
{"\n", -1,"\0"}
};
struct list_index_type Techs[] = {
{"Creo", SKILL_CREO,"Cr"},
{"Intellego", SKILL_INTELLEGO,"In"},
{"Muto", SKILL_MUTO,"Mu"},
{"Perdo", SKILL_PERDO,"Pr"},
{"Rego", SKILL_REGO,"Re"},
{"\n", -1,"\0"}
};
struct list_index_type Forms[] = {
{"Animal", SKILL_ANIMAL,"An"},
{"Aquam", SKILL_AQUAM,"Aq"},
{"Auram", SKILL_AURAM,"Au"},
{"Corpus", SKILL_CORPUS,"Co"},
{"Herbam", SKILL_HERBAM,"He"},
{"Ignem", SKILL_IGNEM,"Ig"},
{"Imagonem", SKILL_IMAGONEM,"Im"},
{"Mentem", SKILL_MENTEM,"Me"},
{"Terram", SKILL_TERRAM,"Te"},
{"Vim", SKILL_VIM,"Vm"},
{"\n", -1,"\0"}
};
struct list_index_type TechForms[] = {
{"Creo Ignem", CRIG_GUILD,"CrIg"},
{"Creo Aquam", CRAQ_GUILD,"CrAq"},
{"Creo Corpus", CRCO_GUILD,"CrCo"},
{"Rego Corpus", RECO_GUILD,"ReCo"},
{"Perdo Corpus", PECO_GUILD,"PeCo"},
{"Muto Corpus", MUCO_GUILD,"MuCo"},
{"Creo Animal", CRAN_GUILD,"CrAn"},
{"Rego Terram", RETE_GUILD,"ReTe"},
{"Perdo Imagonem", PEIM_GUILD,"PeIm"},
{"Intellego Imagonem", INIM_GUILD,"InIm"},
{"Intellego Vim", INVM_GUILD,"InVm"},
{"Creo Imagonem", CRIM_GUILD,"CrIm"},
{"Muto Terram", MUTE_GUILD,"MuTe"},
{"Muto Auram", MUAU_GUILD,"MuAu"},
{"\n", -1,"\0"}
};
struct list_index_type *guild_list[] ={
CrIg,
Water,
CrCo,
ReCo,
MuCo,
PeCo,
Animal,
ReTe,
PeIm,
InIm,
InVm,
CrIm,
MuTe,
MuAu
};
bool botch_level_0(struct char_data *ch, int spell_no,
int botches, int delay, char *arg
, struct char_data *tar_char
, struct obj_data *tar_obj)
{
struct char_data *tmp;
int temp;
int value;
bool state = TRUE;
value = number(0,20);
/* sprintf(buf,"botch_level_0: value1 = %d",value);
logg(buf); */
switch (value)
{
case 0:
case 1:
case 2:
case 3:
case 4:
act("$n messed up $s spell.",TRUE,ch,0,0,TO_ROOM);
act("Loses $s balance and falls over.",TRUE,ch,0,0,TO_ROOM);
act("You lost your balance.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= 25;
if (ch->specials.mount) {
act("$n falls from $N's back.",FALSE,ch,0,ch->specials.mount,TO_ROOM);
act("You fall from $N's back.",FALSE,ch,0,ch->specials.mount,TO_CHAR);
rmdamage(ch,GET_HEIGHT(ch->specials.mount)/number(5,20));
tmp = ch->specials.mount;
unmount(ch);
if (!number(0,10) && IS_MOB(tmp) && (GET_INT(tmp) < 10))
do_flee(tmp,"",0,0);
}
GET_POS(ch) = POSITION_SITTING;
state = FALSE;
break;
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
act("$n messed up $s spell.",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell. You are fatigued.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= 50;
state = FALSE;
break;
case 11:
case 12:
case 13:
case 14:
case 15:
act("$n messed up $s spell.",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell. You are fatigued.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= 65;
state = FALSE;
break;
case 16:
case 17:
case 18:
case 19:
case 20:
act("$n really messes up $s spell, $e seem exhausted!",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You are fatigued.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= GET_MAX_MOVE(ch)/2;
break;
}
value = number(0,20);
/* sprintf(buf,"botch_level_0: value2 = %d",value);
logg(buf); */
if (value == 0)
{
act("You botched the spell badly. You gain new insight.",TRUE,ch,0,0,TO_CHAR);
if (!IS_NPC(ch)){
switch (number(0,2)) {
case 0:
temp = GET_SKILL(ch,spell_info[spell_no].key_stats) +1;
SET_SKILL(ch,spell_info[spell_no].key_stats, MIN(30,temp));
break;
case 1:
temp = GET_SKILL(ch,spell_info[spell_no].sec_stats) +1;
SET_SKILL(ch,spell_info[spell_no].sec_stats, MIN(30,temp));
break;
case 2:
temp = GET_SKILL(ch,SKILL_MAGICTHEORY) +1;
SET_SKILL(ch,SKILL_MAGICTHEORY, MIN(30,temp));
break;
}
}
}
return(state);
}
bool botch_level_1(struct char_data *ch, int spell_no,
int botches, int delay, char *arg
, struct char_data *tar_char
, struct obj_data *tar_obj)
{
int temp;
struct affected_type af;
int value;
bool state = TRUE;
value = number(0,3);
/* sprintf(buf, "botch_level_1: value1 = %d", value);
logg(buf);*/
switch(value)
{
case 0:
act("$n messed up $s spell.",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell. You are fatigued.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= 65;
state = FALSE;
break;
case 1:
case 2:
act("$n really messes up $s spell!",TRUE,ch,0,0,TO_ROOM);
act("$n seems dazed!",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You are disoriented.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= GET_MOVE(ch) + number(1,30);
af.type = spell_no;
af.location = APPLY_INT;
af.modifier = -10;
af.duration = 1;
af.level = GET_LEVEL(ch);
af.bitvector = AFF_CONFUSION;
affect_join(ch, &af, FALSE, FALSE);
af.location = APPLY_FOCUS;
af.modifier = -10;
af.duration = 1;
affect_join(ch, &af, FALSE, FALSE);
break;
default:
break;
}
value = number(0,10);
/* sprintf(buf, "botch_level_1: value2 = %d", value);
logg(buf);*/
if (value == 0){
act("You botched the spell badly. You gain new insight.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= 25;
if (!IS_NPC(ch)){
switch (number(0,3)) {
case 0:
temp = GET_SKILL(ch,spell_info[spell_no].sec_stats) +1;
SET_SKILL(ch,spell_info[spell_no].sec_stats, MIN(30,temp));
break;
case 1:
temp = GET_SKILL(ch,spell_info[spell_no].key_stats) +1;
SET_SKILL(ch,spell_info[spell_no].key_stats, MIN(30,temp));
break;
case 2:
case 3:
temp = GET_SKILL(ch,spell_no) + 1;
SET_SKILL(ch,spell_no,MIN(30,temp));
break;
}
}
}
return(state);
}
bool botch_level_2(struct char_data *ch, int spell_no,
int botches, int delay, char *arg
, struct char_data *tar_char
, struct obj_data *tar_obj)
{
int temp;
struct affected_type af;
struct char_data *vict;
struct obj_data *vict_obj;
int value;
bool state = TRUE;
value = number(0,12);
/* sprintf(buf, "botch_level_2: value1 = %d", value);
logg(buf); */
switch(value){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
if (IS_SET(spell_info[spell_no].targets, TAR_CHAR_ROOM)){
act("$n messes up $s spell targeting!",TRUE,ch,0,0,TO_ROOM);
act("Uhoh! something is badly wrong!",TRUE,ch,0,0,TO_CHAR);
for (vict = world[ch->in_room].people;vict;vict = vict->next_in_room)
if (IS_NPC(vict) && vict != tar_char&& !number(0,1))
break;
GET_MOVE(ch) -= GET_MAX_MOVE(ch)/2;
if (vict)
add_event(delay,EVENT_SPELL,0,-30,0,spell_no,arg,ch,vict);
else
add_event(delay,EVENT_SPELL,0,-30,0,spell_no,arg,ch,ch);
}
else if (IS_SET(spell_info[spell_no].targets, TAR_OBJ_INV) ||
IS_SET(spell_info[spell_no].targets, TAR_OBJ_EQUIP) ||
IS_SET(spell_info[spell_no].targets, TAR_OBJ_WORLD) ||
IS_SET(spell_info[spell_no].targets, TAR_OBJ_ROOM)){
act("$n messes up $s spell targeting!",TRUE,ch,0,0,TO_ROOM);
for (vict_obj = ch->inventory;
vict_obj; vict_obj = vict_obj->next_content)
if (vict_obj != tar_obj && !number(0,1))
break;
if (vict_obj)
add_event(delay,EVENT_SPELL,0,-30,1,spell_no,arg,ch,vict_obj);
}
else {
act("$n really messes up $s spell!",TRUE,ch,0,0,TO_ROOM);
act("$n seems dazed!",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You are disoriented.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= GET_MOVE(ch) + number(1,30);
af.type = spell_no;
af.location = APPLY_INT;
af.modifier = -15;
af.duration = 1;
af.level = spell_info[spell_no].min_level + 30;
af.bitvector = AFF_CONFUSION;
affect_join(ch, &af, FALSE, FALSE);
af.location = APPLY_FOCUS;
af.modifier = -15;
af.duration = 1;
affect_join(ch, &af, FALSE, FALSE);
}
break;
case 8:
case 9:
act("$n really messes up $s spell!",TRUE,ch,0,0,TO_ROOM);
act("$n seems dazed!",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You are disoriented.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= GET_MOVE(ch) + number(15,30);
af.type = spell_no;
af.location = APPLY_INT;
af.modifier = -20;
af.duration = 1;
af.level = spell_info[spell_no].min_level + 30;
af.bitvector = AFF_CONFUSION;
affect_to_char(ch, &af);
af.location = APPLY_FOCUS;
af.modifier = -20;
af.duration = 1;
affect_to_char(ch, &af);
case 10:
case 11:
act("$n messed up $s spell.",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell. You are fatigued.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= 65;
state = FALSE;
break;
case 12:
act("$n really messes up $s spell!",TRUE,ch,0,0,TO_ROOM);
act("$n seems dazed!",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You are disoriented.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= GET_MOVE(ch) + number(1,30);
af.type = spell_no;
af.location = APPLY_INT;
af.modifier = -10;
af.duration = 1;
af.level = spell_info[spell_no].min_level + 30;
af.bitvector = AFF_CONFUSION;
affect_join(ch, &af, FALSE, FALSE);
af.location = APPLY_FOCUS;
af.modifier = -10;
af.duration = 1;
affect_join(ch, &af, FALSE, FALSE);
break;
default:
break;
}
value = number(0,3);
if (!value){
/* sprintf(buf, "botch_level_2: value2 = %d", value);
logg(buf);*/
act("Something seems to go wrong with $n's spell.",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You gain new insight.",TRUE,ch,0,0,TO_CHAR);
switch(value){
case 0:
temp = GET_SKILL(ch,spell_info[spell_no].key_stats) +1;
SET_SKILL(ch,spell_info[spell_no].key_stats, MIN(30,temp));
break;
case 1:
temp = GET_SKILL(ch,spell_info[spell_no].sec_stats) + 1;
SET_SKILL(ch,spell_info[spell_no].sec_stats,MIN(30,temp));
break;
case 2:
case 3:
temp = GET_SKILL(ch,spell_no) + 1;
SET_SKILL(ch,spell_no,MIN(30,temp));
break;
default:
break;
}
}
return(state);
}
bool botch_level_3(struct char_data *ch, int spell_no,
int botches, int delay, char *arg
, struct char_data *tar_char
, struct obj_data *tar_obj)
{
int temp;
struct affected_type af;
struct char_data *vict;
struct obj_data *vict_obj;
int value;
bool state = TRUE;
value = number(1,10);
/* sprintf(buf,"botch_level_3: value1 = %d", value);
logg(buf);*/
switch (value)
{
case 1:
act("$n really messes up $s spell!",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You damage your health.",TRUE,ch,0,0,TO_CHAR);
af.type = spell_no;
af.location = APPLY_CON;
af.modifier = -number(1,3);
af.duration = -1;
af.level = spell_info[spell_no].min_level + 30;
af.bitvector = AFF_SPELLBOTCH;
affect_join(ch, &af, TRUE, FALSE );
GET_MAX_MOVE(ch) -= number(GET_LEVEL(ch)/10 + 1,GET_LEVEL(ch)/5 + 5);
break;
case 2:
act("$n really messes up $s spell!",TRUE,ch,0,0,TO_ROOM);
act("$n passes out!",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You faint!.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= GET_MOVE(ch) + number(1,30);
GET_POS(ch) = POSITION_SLEEPING;
break;
case 3:
case 4:
act("$n really messes up $s spell!",TRUE,ch,0,0,TO_ROOM);
act("$n seems dazed!",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You are disoriented.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= GET_MOVE(ch) + number(15,30);
af.type = spell_no;
af.location = APPLY_INT;
af.modifier = -20;
af.level = spell_info[spell_no].min_level + 30;
af.duration = 1;
af.bitvector = AFF_CONFUSION;
affect_to_char(ch, &af);
af.location = APPLY_FOCUS;
af.modifier = -20;
af.duration = 1;
affect_to_char(ch, &af);
break;
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
if (IS_SET(spell_info[spell_no].targets, TAR_CHAR_ROOM)){
act("$n messes up $s spell targeting!",TRUE,ch,0,0,TO_ROOM);
act("Uhoh! something is badly wrong!",TRUE,ch,0,0,TO_CHAR);
for (vict = world[ch->in_room].people;vict;vict = vict->next_in_room)
if (IS_NPC(vict) && vict != tar_char&& !number(0,1))
break;
GET_MOVE(ch) -= GET_MAX_MOVE(ch)/2;
if (vict)
add_event(delay,EVENT_SPELL,0,-30,0,spell_no,arg,ch,vict);
else
add_event(delay,EVENT_SPELL,0,-30,0,spell_no,arg,ch,ch);
}
else if (IS_SET(spell_info[spell_no].targets, TAR_OBJ_INV) ||
IS_SET(spell_info[spell_no].targets, TAR_OBJ_EQUIP) ||
IS_SET(spell_info[spell_no].targets, TAR_OBJ_WORLD) ||
IS_SET(spell_info[spell_no].targets, TAR_OBJ_ROOM)){
act("$n messes up $s spell targeting!",TRUE,ch,0,0,TO_ROOM);
for (vict_obj = ch->inventory;
vict_obj; vict_obj = vict_obj->next_content)
if (vict_obj != tar_obj && !number(0,1))
break;
if (vict_obj)
add_event(delay,EVENT_SPELL,0,-30,1,spell_no,arg,ch,vict_obj);
}
else {
act("$n really messes up $s spell!",TRUE,ch,0,0,TO_ROOM);
act("$n seems dazed!",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You are disoriented.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= GET_MOVE(ch) + number(15,30);
af.type = spell_no;
af.location = APPLY_INT;
af.modifier = -20;
af.level = spell_info[spell_no].min_level + 30;
af.duration = 1;
af.bitvector = AFF_CONFUSION;
affect_to_char(ch, &af);
af.location = APPLY_FOCUS;
af.modifier = -20;
af.duration = 1;
affect_to_char(ch, &af);
}
break;
}
value = number(1,12);
/* sprintf(buf,"botch_level_3: value2 = %d", value);
logg(buf);*/
switch (value)
{
case 1:
act("You botched the spell badly. You gain new insight.",TRUE,ch,0,0,TO_CHAR);
if (!IS_NPC(ch)){
switch (number(0,2)) {
case 0:
temp = GET_SKILL(ch,spell_info[spell_no].sec_stats) +1;
SET_SKILL(ch,spell_info[spell_no].sec_stats, MIN(30,temp));
break;
case 1:
temp = GET_SKILL(ch,spell_info[spell_no].key_stats) +1;
SET_SKILL(ch,spell_info[spell_no].key_stats, MIN(30,temp));
break;
case 2:
temp = GET_SKILL(ch,SKILL_MAGICTHEORY) +1;
SET_SKILL(ch,SKILL_MAGICTHEORY, MIN(30,temp));
break;
}
}
break;
case 2:
case 3:
case 4:
case 5:
act("You gain deep new insight.",TRUE,ch,0,0,TO_CHAR);
if (!IS_NPC(ch)){
temp = GET_SKILL(ch,spell_no) + 2;
SET_SKILL(ch,spell_no,MIN(30,temp));
}
break;
default:
break;
}
return(state);
}
bool botch_level_4(struct char_data *ch, int spell_no,
int botches, int delay, char *arg
, struct char_data *tar_char
, struct obj_data *tar_obj)
{
int temp;
struct affected_type af;
int value;
bool state = TRUE;
value = number(0,9);
/* sprintf(buf,"botch_level_4: value1 = %d", value);
logg(buf);*/
switch (value)
{
case 0:
case 1:
case 2:
act("$n really messes up $s spell!",TRUE,ch,0,0,TO_ROOM);
act("$n seems dazed!",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You are disoriented.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= GET_MOVE(ch) + number(15,30);
af.type = spell_no;
af.location = APPLY_INT;
af.modifier = -20;
af.level = spell_info[spell_no].min_level + 30;
af.duration = 1;
af.bitvector = AFF_CONFUSION;
affect_to_char(ch, &af);
af.location = APPLY_FOCUS;
af.modifier = -20;
af.duration = 1;
affect_to_char(ch, &af);
case 3:
case 4:
case 5:
act("$n really messes up $s spell!",TRUE,ch,0,0,TO_ROOM);
act("$n passes out!",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You faint!.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= GET_MOVE(ch) + number(1,30);
GET_POS(ch) = POSITION_SLEEPING;
break;
case 6:
case 7:
case 8:
case 9:
act("$n really messes up $s spell!",TRUE,ch,0,0,TO_ROOM);
act("You botched the spell badly. You damage your health.",TRUE,ch,0,0,TO_CHAR);
af.type = spell_no;
af.location = APPLY_CON;
af.modifier = -number(1,3);
af.duration = -1;
af.level = spell_info[spell_no].min_level + 30;
af.bitvector = AFF_SPELLBOTCH;
affect_join(ch, &af, TRUE, FALSE );
GET_MAX_MOVE(ch) -= number(GET_LEVEL(ch)/10 + 1,GET_LEVEL(ch)/5 + 5);
break;
}
value = number(0,9);
/* sprintf(buf,"botch_level_4: value1 = %d", value);
logg(buf);*/
switch (value)
{
case 0:
case 1:
act("You botched the spell badly. You gain new insight.",TRUE,ch,0,0,TO_CHAR);
if (!IS_NPC(ch)){
switch (number(0,2)) {
case 0:
temp = GET_SKILL(ch,spell_info[spell_no].sec_stats) +1;
SET_SKILL(ch,spell_info[spell_no].sec_stats, MIN(30,temp));
break;
case 1:
temp = GET_SKILL(ch,spell_info[spell_no].key_stats) +1;
SET_SKILL(ch,spell_info[spell_no].key_stats, MIN(30,temp));
break;
case 2:
temp = GET_SKILL(ch,SKILL_MAGICTHEORY) +1;
SET_SKILL(ch,SKILL_MAGICTHEORY, MIN(30,temp));
break;
}
}
break;
case 2:
case 3:
case 4:
act("You gain deep new insight.",TRUE,ch,0,0,TO_CHAR);
GET_MOVE(ch) -= 25;
if (!IS_NPC(ch)){
temp = GET_SKILL(ch,spell_no) + 3;
SET_SKILL(ch,spell_no,MIN(30,temp));
}
break;
default:
break;
}
return(state);
}
bool do_botch(struct char_data *ch, int spell_no,
int botches, int delay, char *arg
, struct char_data *tar_char
, struct obj_data *tar_obj)
{
int spell_lev, prof, total=0;
if (!IS_NPC(ch))
prof = GET_SKILL(ch,spell_no);
else
prof = MAX(30, GET_LEVEL(ch)/3);
spell_lev = spell_info[spell_no].min_level;
if (spell_lev > GET_LEVEL(ch) + 10)
while (spell_lev > GET_LEVEL(ch) + 10){
spell_lev -= 10;
botches++;}
else if (spell_lev < GET_LEVEL(ch) - 10)
while (spell_lev < GET_LEVEL(ch) - 10){
spell_lev += 10;
botches--;}
if (prof < 5){
prof -= 5;
botches -= prof/2;}
if (prof > 5)
while (prof > 0){
prof -= 5;
botches--;}
botches = MAX(1,botches);
botches = MIN(10,botches);
total = 0;
while (botches > 0){
if (!stress_die())
total++;
sprintf(buf,"Botch total: %d\r\n",total);
if (PRF_FLAGGED(ch,PRF_DEBUG))
send_to_char(buf,ch);
botches--;
}
if (!total)
return(FALSE);
total--;
total = MIN(4,total);
switch(total)
{
case 0:
return(botch_level_0(ch,spell_no,botches,delay,arg,tar_char,tar_obj));
break;
case 1:
return(botch_level_1(ch,spell_no,botches,delay,arg,tar_char,tar_obj));
break;
case 2:
return(botch_level_2(ch,spell_no,botches,delay,arg,tar_char,tar_obj));
break;
case 3:
return(botch_level_3(ch,spell_no,botches,delay,arg,tar_char,tar_obj));
break;
case 4:
return(botch_level_4(ch,spell_no,botches,delay,arg,tar_char,tar_obj));
break;
}
return(TRUE);
}
ACMD(do_invoke)
{
ACMD(do_action);
struct obj_data *tar_obj, *vis;
struct char_data *tar_char;
char name[MAX_STRING_LENGTH], *wrd;
int inv, qend, spll, result, i,delay, casting_total, botches = 1, cast_die;
bool no_voice = FALSE, no_gesture = FALSE, spontaneous = FALSE;
bool botched=FALSE, use_vis=FALSE;
int target_ok, bonus, tech, form, pawns=0;
argument = skip_spaces(argument);
bonus = combat_bonus(ch);
if (ch->equipment[WEAR_MOUTH])
no_voice = TRUE;
if (ch->equipment[WIELD] && ch->equipment[HOLD])
no_gesture = TRUE;
if (ch->equipment[HOLD] && is_held_obj_twohanded(ch, ch->equipment[HOLD]))
no_gesture = TRUE;
if (ch->equipment[WIELD] && is_two_handed(ch, ch->equipment[WIELD]))
no_gesture = TRUE;
if (IS_NPC(ch) && ch->specials.timer)
return;
/* things that add into botches */
if (ch->specials.fighting)
botches++;
if (ch->specials.fighting && ch->specials.fighting->specials.fighting == ch)
botches++;
if (IS_AFFECTED(ch, AFF_CHARM))
botches += 3;
if (IS_AFFECTED(ch,AFF_CONFUSION))
botches += 3;
if (!affected_by_spell(ch, SPELL_ENDURANCE))
botches += bonus;
/* If there is no chars in argument */
if (!(*argument)) {
send_to_char("Cast what which where?\r\n", ch);
return;}
while (*argument == '-')
{
half_chop(argument,buf, buf2);
if (strstr("-novoice", buf))
no_voice = TRUE;
else if (strstr("-nogesture", buf))
no_gesture = TRUE;
else if (strstr("-vis", buf))
use_vis = TRUE;
strcpy(argument, buf2);
}
if (*argument != '\'') {
send_to_char("Magic must always be enclosed by the holy magic symbols: '\r\n", ch);
return;
}
if (world[ch->in_room].sector_type == SECT_UNDER_WATER && !IS_AFFECTED(ch,AFF_FREE_ACTION))
no_gesture = TRUE;
if (world[ch->in_room].sector_type == SECT_UNDER_WATER && !IS_AFFECTED(ch,AFF_WATER_BREATH))
no_voice = TRUE;
/* Locate the last quote && lowercase the magic words (if any) */
*buf = 0;
for (qend = 1; *(argument + qend) && (*(argument + qend) != '\'') ; qend++)
*(buf+qend-1) = LOWER(*(argument + qend));
if (*(argument + qend) != '\'') {
send_to_char("Magic must always be enclosed by the holy magic symbols: '\r\n", ch);
return;
}
*(buf + qend -1) = '\0';
spll = find_spell_num(buf);
if (spll < 0) {
send_to_char("Your lips do not move, no magic appears.\r\n", ch);
return;
}
if (spll == SPELL_LANCE_OF_SOLAR_FURY)
if (IS_DARK(ch->in_room) || (world[ch->in_room].sector_type
== SECT_INSIDE || IS_SET(world[ch->in_room].room_flags, INDOORS)))
{
act("You are unable to see the sun.\r\nYou cannot cast this spell here!",FALSE,ch,0,0,TO_CHAR);
return;
}
else if (weather_info.sunlight == SUN_DARK){
act("It's nighttime.\r\nYou cannot cast this spell now!",FALSE,ch,0,0,TO_CHAR);
return;
}
if (spll >= 0 && spell_info[spll].spll_pointer) {
if (!GET_SKILL(ch,spll) || (IS_NPC(ch) && !MOB_FLAGGED(ch, MOB_SPELL_CASTER))){
wrd = find_spell_name(spll);
sprintf(buf,"You attempt to spontaneously cast '%s'.\r\n",((wrd) ?
wrd: "this is a bug report me"));
send_to_char(buf,ch);
spontaneous = TRUE;
}
if (spell_info[spll].minimum_position == POSITION_STANDING
&& ch->specials.fighting){
send_to_char("Impossible! You can't concentrate enough!\r\n", ch);
return;
}
else if (GET_POS(ch) < spell_info[spll].minimum_position
&& GET_POS(ch) < POSITION_STANDING) {
switch (GET_POS(ch))
{
case POSITION_SLEEPING :
send_to_char("You dream of great magical powers.\r\n", ch);
break;
case POSITION_RESTING :
send_to_char("You can't concentrate enough while resting.\r\n", ch);
break;
case POSITION_SITTING :
send_to_char("You can't do this sitting!\r\n", ch);
break;
} /* Switch */
return;
}
argument += qend + 1; /* Point to the last ' */
for (; *argument == ' '; argument++)
;
/* **************** Locate targets **************** */
target_ok = FALSE;
tar_char = 0;
tar_obj = 0;
target_ok = generic_find_target(argument, spell_info[spll].targets,
ch, &tar_char, &tar_obj);
if (!target_ok) {
if (*name) {
if (IS_SET(spell_info[spll].targets, TAR_CHAR_ROOM))
send_to_char("Nobody here by that name.\r\n", ch);
else if (IS_SET(spell_info[spll].targets, TAR_CHAR_WORLD))
send_to_char("Nobody playing by that name.\r\n", ch);
else if (IS_SET(spell_info[spll].targets, TAR_OBJ_INV))
send_to_char("You are not carrying anything like that.\r\n", ch);
else if (IS_SET(spell_info[spll].targets, TAR_OBJ_ROOM))
send_to_char("Nothing here by that name.\r\n", ch);
else if (IS_SET(spell_info[spll].targets, TAR_OBJ_WORLD))
send_to_char("Nothing at all by that name.\r\n", ch);
else if (IS_SET(spell_info[spll].targets, TAR_OBJ_EQUIP))
send_to_char("You are not wearing anything like that.\r\n", ch);
else if (IS_SET(spell_info[spll].targets, TAR_OBJ_WORLD))
send_to_char("Nothing at all by that name.\r\n", ch);
return;
}
else { /* Nothing was given as argument */
if (spell_info[spll].targets < TAR_OBJ_INV){
send_to_char("Who should the spell be cast upon?\r\n", ch);
return;
}
else{
send_to_char("What should the spell be cast upon?\r\n",ch);
return;
}
}
}
/* TARGET IS OK */
else {
if ((tar_char == ch)
&& IS_SET(spell_info[spll].targets, TAR_SELF_NONO)) {
send_to_char("You cannot cast this spell upon yourself.\r\n", ch);
return;}
else if ((tar_char != ch) && IS_SET(spell_info[spll].targets,
TAR_SELF_ONLY)) {
send_to_char("You can only cast this spell upon yourself.\r\n", ch);
return;
}
else if (IS_AFFECTED(ch, AFF_CHARM) && (ch->master == tar_char)) {
send_to_char("You are afraid that it could harm your master.\r\n", ch);
return;
}
}
if (GET_MOVE(ch) <= 0){
act("You are too exhausted to concentrate.",FALSE,ch,0,0,TO_CHAR);
return;
}
delay = spell_info[spll].beats*10;;
if (!no_gesture) {
if (tar_char){
if (tar_char != ch){
act("$n starts making cryptic gestures at $N."
,TRUE,ch,tar_obj, tar_char, TO_ROOM);
act("You start making mystic gestures."
,TRUE,ch,tar_obj,tar_char, TO_CHAR);
}
else{
act("$n starts gesturing mystically.",TRUE,ch,0,0,TO_ROOM);
act("You start tracing the mystic runes.",TRUE,ch,0,0,TO_CHAR);
}
}
else if (tar_obj){
sprintf(buf,"$n starts making cryptic gestures at $p.");
act(buf,TRUE,ch,tar_obj,tar_char,TO_ROOM);
sprintf(buf,"You start making cryptic gestures at $p.");
act(buf,TRUE,ch,tar_obj,tar_char,TO_CHAR);
}
else{
act("$n starts gesturing mystically.",TRUE,ch,0,0,TO_ROOM);
act("You start tracing the mystic runes.",TRUE,ch,0,0,TO_CHAR);
}
}
else
delay += 20;
if (!no_voice) {
act("$n starts muttering under $s breath.",TRUE,ch,0,0,TO_ROOM);
act("You start to intone the words of power.",TRUE,ch,0,0,TO_CHAR);
say_spell(ch, spll, -1);
}
else
delay += 20 ;
if (!IS_NPC(ch))
delay /= (1 + ((float)GET_SKILL(ch,spll)/30.));
else
delay /= (1 + GET_LEVEL(ch)/3);
if ((spell_info[spll].spll_pointer == 0) && spll > 0){
send_to_char("Sorry, this magic does not exist!\r\n", ch);
return;
}
/* casting total additions*/
if (use_vis && !GET_SKILL(ch, SKILL_VIM)){
send_to_char("You are not knowlegable enough to use raw Vis!.\r\n",ch);
use_vis = FALSE;
}
tech = spell_info[spll].key_stats;
form = spell_info[spll].sec_stats;
casting_total = GET_INT(ch);
/* find vis objects */
if (use_vis)
for (i = 0; i < MAX_WEAR; i++)
if (vis = ch->equipment[i])
if (GET_ITEM_TYPE(vis) == ITEM_VIS)
if (((vis->obj_flags.value[1] == tech) &&
(!vis->obj_flags.value[2]
|| vis->obj_flags.value[2] == form)) ||
((vis->obj_flags.value[2] == form) &&
(!vis->obj_flags.value[1]
|| vis->obj_flags.value[1] == tech))){
pawns += vis->obj_flags.value[3];
}
botches += pawns;
pawns = MIN(pawns, GET_SKILL(ch, SKILL_VIM));
if (!IS_NPC(ch)){
casting_total += 3*GET_SKILL(ch,tech);
casting_total += 3*GET_SKILL(ch,form);
}
else
casting_total += GET_LEVEL(ch)*3;
casting_total += 5*pawns;
casting_total -= 3*bonus;
cast_die = stress_die();
sprintf(buf,"No of Botch dies: %d\r\n",botches);
if (PRF_FLAGGED(ch,PRF_DEBUG))
send_to_char(buf,ch);
if (!cast_die){
if ((botched
= do_botch(ch,spll,botches,delay,argument,tar_char,tar_obj)))
return;
}
if (IS_AFFECTED(ch,AFF_CONFUSION))
{
act("You are feeling a bit muddled.",FALSE,ch,0,0,TO_CHAR);
casting_total /= 2;
}
casting_total += cast_die;
if (IS_AFFECTED(ch, AFF_CHARM))
casting_total -= 200;
if (IS_SET(world[ch->in_room].room_flags, NO_MAGIC)){
send_to_char("Something about this place makes magic very difficult.\r\n",ch);
casting_total -= 200;
}
if (no_voice)
casting_total -= 30;
if (no_gesture)
casting_total -= 15;
if (!spontaneous)
result = spell_info[spll].min_level - casting_total;
else
result = 2*spell_info[spll].min_level - casting_total;
sprintf(buf,"Total: %d, Level: %d, Result: %d\r\n",
casting_total, spell_info[spll].min_level, result);
if (PRF_FLAGGED(ch,PRF_DEBUG))
send_to_char(buf,ch);
if (result >= 30){
send_to_char("You fail to cast the spell...",ch);
send_to_char("You fatigue yourself.\r\n",ch);
act("$n loses $s concentration and is fatigued.",TRUE,ch,0,0,TO_ROOM);
if (IS_NPC(ch))
ch->specials.timer = delay/2;
WAIT_STATE(ch,delay);
GET_MOVE(ch) -= 45;
return;}
else {
send_to_char("You cast the spell.",ch);
if (result > 0){
if (result >= 15)
GET_MOVE(ch) -= 30;
else
GET_MOVE(ch) -= 15;
send_to_char("..You fatigue yourself.\r\n",ch);
}
else
send_to_char("\r\n",ch);
if (tar_char && !tar_obj)
add_event(delay/2,EVENT_SPELL,subcmd,result,0,spll,argument,ch,tar_char);
else if (!tar_char && tar_obj)
add_event(delay/2,EVENT_SPELL,subcmd,result,1,spll,argument,ch,tar_obj);
else
add_event(delay/2,EVENT_SPELL,subcmd,result,1,spll,argument,ch,0);
if (spll == SPELL_LAST_FLIGHT_OT_POENIX){
act("$N's body starts to glow in an alarming fashion.", FALSE,ch,0,ch,
TO_NOTVICT);
act("You feel your body starting to fill with energy.", FALSE,ch,0,ch,
TO_CHAR);
}
if (IS_NPC(ch))
ch->specials.timer = delay;
WAIT_STATE(ch,delay);
/* scrap and clear the vis list */
if (use_vis)
for (i=0;i < MAX_WEAR;i++)
if (vis = ch->equipment[i])
if (GET_ITEM_TYPE(vis) == ITEM_VIS)
if (((vis->obj_flags.value[1] == tech) &&
(!vis->obj_flags.value[2]
|| vis->obj_flags.value[2] == form)) ||
((vis->obj_flags.value[2] == form) &&
(!vis->obj_flags.value[1]
|| vis->obj_flags.value[1] == tech))){
vis = unequip_char(ch, i);
obj_to_room(vis,ch->in_room, FALSE);
scrap_item(vis);
}
return;
}
}
switch (number(1, 5)) {
case 1:
send_to_char("Bylle Grylle Grop Gryf???\r\n", ch);
break;
case 2:
send_to_char("Olle Bolle Snop Snyf?\r\n", ch);
break;
case 3:
send_to_char("Olle Grylle Bolle Bylle?!?\r\n", ch);
break;
case 4:
send_to_char("Gryffe Olle Gnyffe Snop???\r\n", ch);
break;
default:
send_to_char("Bolle Snylle Gryf Bylle?!!?\r\ny", ch);
break;
}
}
int generic_find_target(char *arg, int bitvector,
struct char_data *ch,
struct char_data **tar_ch,
struct obj_data **tar_obj)
{
char name[100];
int inv;
if (*arg){
arg = one_argument(arg, name);
if (IS_SET(bitvector, TAR_CHAR_ROOM))
if ((*tar_ch = get_char_room_vis(ch, name)))
return(TAR_CHAR_ROOM);
if (IS_SET(bitvector,TAR_CHAR_WORLD))
if ((*tar_ch = get_char_vis(ch, name)))
return(TAR_CHAR_WORLD);
if (IS_SET(bitvector, TAR_OBJ_INV))
if ((*tar_obj = get_obj_in_list_vis(ch, name,ch->inventory)))
return(TAR_OBJ_INV);
if (IS_SET(bitvector,TAR_OBJ_ROOM))
if ((*tar_obj=get_obj_in_list_vis(ch,name,world[ch->in_room].contents)))
return(TAR_OBJ_ROOM);
if (IS_SET(bitvector, TAR_OBJ_WORLD))
if ((*tar_obj = get_obj_vis(ch, name)))
return(TAR_OBJ_WORLD);
if (IS_SET(bitvector, TAR_OBJ_EQUIP))
if((*tar_obj = get_object_in_equip_vis(ch, name,ch->equipment,&inv)))
return(TAR_OBJ_EQUIP);
if (IS_SET(bitvector, TAR_SELF_ONLY))
if ((str_cmp(GET_NAME(ch), name) == 0) ||
(str_cmp("self", name) == 0) ||
(str_cmp("me", name) == 0)){
*tar_ch = ch;
return(TAR_SELF_ONLY);
}
if (bitvector == TAR_IGNORE)
{
*tar_ch = 0;
*tar_obj = 0;
return(TAR_IGNORE);
}
}
else
{ /* No argument was typed */
if (IS_SET(bitvector, TAR_FIGHT_SELF))
if (ch->specials.fighting) {
*tar_ch = ch;
return(TAR_FIGHT_SELF);
}
if (IS_SET(bitvector, TAR_FIGHT_VICT))
if (ch->specials.fighting) {
/* WARNING, MAKE INTO POINTER */
*tar_ch = ch->specials.fighting;
return(TAR_FIGHT_VICT);
}
if (IS_SET(bitvector, TAR_SELF_ONLY))
{
*tar_ch = ch;
return(TAR_SELF_ONLY);
}
if (IS_SET(bitvector, TAR_IGNORE))
{
*tar_ch = 0;
*tar_obj = 0;
return(TAR_IGNORE);
}
}
}
int find_spell_num(char *arg)
{
int spl = -1;
spl = search_list(arg, CrIg, FALSE);
if (spl < 0)
spl = search_list(arg, Water, FALSE);
if (spl < 0)
spl = search_list(arg, CrCo, FALSE);
if (spl < 0)
spl = search_list(arg, ReCo, FALSE);
if (spl < 0)
spl = search_list(arg, ReTe, FALSE);
if (spl < 0)
spl = search_list(arg, MuTe, FALSE);
if (spl < 0)
spl = search_list(arg, MuCo, FALSE);
if (spl < 0)
spl = search_list(arg, PeCo, FALSE);
if (spl < 0)
spl = search_list(arg, PeIm, FALSE);
if (spl < 0)
spl = search_list(arg, InIm, FALSE);
if (spl < 0)
spl = search_list(arg, InVm, FALSE);
if (spl < 0)
spl = search_list(arg, CrIm, FALSE);
if (spl < 0)
spl = search_list(arg, Animal, FALSE);
if (spl < 0)
spl = search_list(arg, MuAu, FALSE);
return(spl);
}
char *find_spell_name(int spl)
{
char *name = 0;
name = rev_search_list(spl, CrIg);
if (!name)
name = rev_search_list(spl, Water);
if (!name)
name = rev_search_list(spl, CrCo);
if (!name)
name = rev_search_list(spl, ReCo);
if (!name)
name = rev_search_list(spl, ReTe);
if (!name)
name = rev_search_list(spl, MuTe);
if (!name)
name = rev_search_list(spl, MuCo);
if (!name)
name = rev_search_list(spl, PeCo);
if (!name)
name = rev_search_list(spl, PeIm);
if (!name)
name = rev_search_list(spl, InIm);
if (!name)
name = rev_search_list(spl, InVm);
if (!name)
name = rev_search_list(spl, CrIm);
if (!name)
name = rev_search_list(spl, Animal);
if (!name)
name = rev_search_list(spl, MuAu);
return(name);
}
char *find_skill_name(int spl)
{
char *name = 0;
name = rev_search_list(spl, Warrior_skills);
if (!name)
name = rev_search_list(spl, Thief_skills);
if (!name)
name = rev_search_list(spl, Ranger_skills);
if (!name)
name = rev_search_list(spl, Horse_skills);
if (!name)
name = rev_search_list(spl, am_skills);
return(name);
}
void assign_spell_pointers(void)
{
int i;
for (i = 0; i < MAX_SPL_LIST; i++)
spell_info[i].spll_pointer = 0;
NSPELLO(1, 4, POSITION_STANDING, 20, MUCO_GUILD, 20,TRUE,1,10,
SKILL_MUTO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM, 0, cast_fortitude_ot_bear,0)
NSPELLO(3, 4, POSITION_STANDING, 20, MUCO_GUILD, 20,TRUE,1,10,
SKILL_MUTO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM, 0, cast_lightning_swordsman,0)
NSPELLO(4, 4, POSITION_FIGHTING, 80, PECO_GUILD, 20,TRUE,3,10,
SKILL_PERDO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM, 0, cast_invok_ot_milky_eyes,0)
NSPELLO(20, 4, POSITION_STANDING, 10, INVM_GUILD, 20,TRUE,1,10,
SKILL_INTELLEGO, SKILL_VIM, 0,
TAR_OBJ_ROOM | TAR_OBJ_EQUIP | TAR_OBJ_INV, 0,cast_detect_magic1
,0)
NSPELLO(21, 4, POSITION_STANDING, 30, INVM_GUILD, 20,TRUE,1,10,
SKILL_INTELLEGO, SKILL_VIM, 0,
TAR_OBJ_ROOM | TAR_OBJ_EQUIP | TAR_OBJ_INV, 0,cast_detect_magic2
,0)
NSPELLO(22, 4, POSITION_STANDING, 40, INVM_GUILD, 20,TRUE,1,10,
SKILL_INTELLEGO, SKILL_VIM, 0,
TAR_SELF_ONLY, 0,cast_detect_magic3 ,0)
NSPELLO(91, 4, POSITION_STANDING, 20, CRIG_GUILD, 20,TRUE,1,10,
SKILL_CREO, SKILL_IGNEM, 0,
TAR_OBJ_INV | TAR_OBJ_ROOM | TAR_OBJ_EQUIP | TAR_IGNORE, 0,
cast_lamp_wo_flame,0)
NSPELLO(92, 4, POSITION_FIGHTING, 40, CRIG_GUILD, 20,TRUE,1,10,
SKILL_CREO, SKILL_IGNEM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_gen_dam,0)
NSPELLO(93, 4, POSITION_FIGHTING, 60, CRIG_GUILD, 20,TRUE,2,10,
SKILL_CREO, SKILL_IGNEM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_gen_dam,0)
NSPELLO(94, 6, POSITION_FIGHTING, 80, CRIG_GUILD, 20,TRUE,2,10,
SKILL_CREO, SKILL_IGNEM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_gen_dam,0)
NSPELLO(95, 6, POSITION_FIGHTING, 100, CRIG_GUILD, 20,TRUE,3,10,
SKILL_CREO, SKILL_IGNEM, 0,
TAR_IGNORE, 0,cast_gen_dam,0)
NSPELLO(96, 6, POSITION_FIGHTING, 120, CRIG_GUILD, 20,TRUE,3,10,
SKILL_CREO, SKILL_IGNEM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_gen_dam,0)
NSPELLO(97, 8, POSITION_STANDING, 140, CRIG_GUILD, 20,TRUE,4,10,
SKILL_CREO, SKILL_IGNEM, 0,
TAR_IGNORE, 3,cast_gen_dam,0)
NSPELLO(32, 6, POSITION_STANDING, 60, MUAU_GUILD, 20,TRUE,4,10,
SKILL_MUTO, SKILL_AURAM, 0,
TAR_IGNORE, 3,cast_gen_dam,0)
NSPELLO(98, 6, POSITION_FIGHTING, 160, CRIG_GUILD, 20,TRUE,5,10,
SKILL_CREO, SKILL_IGNEM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_gen_dam,0)
NSPELLO(99, 10, POSITION_FIGHTING, 180, CRIG_GUILD, 20,TRUE,6,10,
SKILL_CREO, SKILL_IGNEM, 0,
TAR_IGNORE, 0,cast_gen_dam,0)
NSPELLO(23, 3, POSITION_FIGHTING, 120, RETE_GUILD, 20,TRUE,6,10,
SKILL_REGO, SKILL_TERRAM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_gen_dam,0)
NSPELLO(5, 2, POSITION_FIGHTING, 60, RETE_GUILD, 20,TRUE,6,10,
SKILL_REGO, SKILL_TERRAM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_gen_dam,0)
NSPELLO(30, 8, POSITION_STANDING, 20, MUTE_GUILD, 20,TRUE,1,10,
SKILL_MUTO, SKILL_TERRAM, 0,
TAR_OBJ_ROOM | TAR_OBJ_EQUIP | TAR_OBJ_INV, 0,cast_enchant1,0)
NSPELLO(301, 4, POSITION_STANDING, 40, CRAQ_GUILD, 20,TRUE,1,10,
SKILL_CREO, SKILL_AQUAM, 0,
TAR_OBJ_ROOM | TAR_OBJ_EQUIP | TAR_OBJ_INV, 0,cast_quench_thirst,0)
NSPELLO(12, 4, POSITION_STANDING, 40, CRAN_GUILD, 20,TRUE,1,10,
SKILL_CREO, SKILL_ANIMAL, 0,
TAR_IGNORE, 0,cast_feast_for_five,0)
NSPELLO(13, 4, POSITION_FIGHTING, 60, CRAN_GUILD, 20,TRUE,2,10,
SKILL_CREO, SKILL_ANIMAL, 0,
TAR_CHAR_ROOM, 0,cast_soothe_pains_ot_beast, 0)
NSPELLO(14, 4, POSITION_FIGHTING, 80, CRAN_GUILD, 20,TRUE,4,10,
SKILL_CREO, SKILL_ANIMAL, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_web,0)
NSPELLO(47, 4, POSITION_STANDING, 40, MUAQ_GUILD, 20,TRUE,1,10,
SKILL_MUTO, SKILL_AQUAM, 0,
TAR_SELF_ONLY , 0,cast_lungs_ot_fish,0)
NSPELLO(19, 4, POSITION_FIGHTING, 0, INIM_GUILD, 20,TRUE,1,10,
SKILL_INTELLEGO, SKILL_IMAGONEM, 0,
TAR_SELF_ONLY , 0,cast_detect_invis,0)
NSPELLO(24, 2, POSITION_FIGHTING, 0, CRIM_GUILD, 20,TRUE,1,10,
SKILL_CREO, SKILL_IMAGONEM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT , 0,cast_dispel_invis,0)
NSPELLO(27, 4, POSITION_STANDING, 60, PEIM_GUILD, 20,TRUE,1,10,
SKILL_PERDO, SKILL_IMAGONEM, 0,
TAR_SELF_ONLY , 0,cast_invis1,0)
NSPELLO(28, 4, POSITION_STANDING, 100, PEIM_GUILD, 20,TRUE,1,10,
SKILL_PERDO, SKILL_IMAGONEM, 0,
TAR_SELF_ONLY , 0,cast_invis2,0)
NSPELLO(29, 4, POSITION_STANDING, 120, PEIM_GUILD, 20,TRUE,1,10,
SKILL_PERDO, SKILL_IMAGONEM, 0,
TAR_SELF_ONLY , 0,cast_invis3,0)
NSPELLO(48, 4, POSITION_STANDING, 80, MUAQ_GUILD, 20,TRUE,3,10,
SKILL_MUTO, SKILL_AQUAM, 0,
TAR_CHAR_ROOM , 0,cast_lungs_ot_fish, TEACH_MERMAN)
NSPELLO(302, 4, POSITION_FIGHTING, 60, CRAQ_GUILD, 20,TRUE,1,10,
SKILL_CREO, SKILL_AQUAM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_footstep_slippery,0)
NSPELLO(320, 4, POSITION_FIGHTING, 80, CRAQ_GUILD, 20,TRUE,2,10,
SKILL_CREO, SKILL_AQUAM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_gen_dam,0)
NSPELLO(321, 4, POSITION_FIGHTING, 100, CRAQ_GUILD, 20,TRUE,3,10,
SKILL_CREO, SKILL_AQUAM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_gen_dam,0)
NSPELLO(322, 4, POSITION_FIGHTING, 120, CRAQ_GUILD, 20,TRUE,3,10,
SKILL_CREO, SKILL_AQUAM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_gen_dam,0)
NSPELLO(323, 4, POSITION_FIGHTING, 140, CRAQ_GUILD, 20,TRUE,4,10,
SKILL_CREO, SKILL_AQUAM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_encase_in_ice,0)
NSPELLO(324, 4, POSITION_FIGHTING, 160, CRAQ_GUILD, 20,TRUE,3,10,
SKILL_CREO, SKILL_AQUAM, 0,
TAR_CHAR_ROOM | TAR_FIGHT_VICT, 0,cast_gen_dam,0)
NSPELLO(325, 4, POSITION_FIGHTING, 180, CRAQ_GUILD, 20,TRUE,3,10,
SKILL_CREO, SKILL_AQUAM, 0,
TAR_IGNORE, 0,cast_gen_dam,0)
NSPELLO(326, 4, POSITION_FIGHTING, 200, CRAQ_GUILD, 20,TRUE,3,10,
SKILL_CREO, SKILL_AQUAM, 0,
TAR_IGNORE, 0,cast_gen_dam,0)
NSPELLO(330, 4, POSITION_FIGHTING, 20, CRCO_GUILD, 20,TRUE,1,10,
SKILL_CREO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM, 0,cast_bind_wounds,0)
NSPELLO(331, 4, POSITION_FIGHTING, 40, CRCO_GUILD, 20,TRUE,1,10,
SKILL_CREO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM, 0,cast_blacksmith_might,0)
NSPELLO(2, 4, POSITION_STANDING, 60, CRCO_GUILD, 20,TRUE,2,10,
SKILL_CREO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM | TAR_SELF_NONO, 0,cast_breath_of_vigor, TEACH_ELF
| TEACH_HELF | TEACH_PIXIE | TEACH_GNOME)
NSPELLO(333, 4, POSITION_FIGHTING, 80, CRCO_GUILD, 20,TRUE,2,10,
SKILL_CREO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM, 0,cast_healing_touch, 0)
NSPELLO(334, 4, POSITION_STANDING, 100, CRCO_GUILD, 20,TRUE,3,10,
SKILL_CREO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM, 0,cast_restoration,TEACH_GNOME | TEACH_HUMAN
| TEACH_OGIER)
NSPELLO(335, 4, POSITION_FIGHTING, 120, CRCO_GUILD, 20,TRUE,2,10,
SKILL_CREO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM, 0,cast_youthful_beauty,0)
NSPELLO(336, 4, POSITION_FIGHTING, 130, CRCO_GUILD, 20,TRUE,2,10,
SKILL_CREO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM , 0,cast_nimble_cat,0)
NSPELLO(337, 4, POSITION_FIGHTING, 140, CRCO_GUILD, 20,TRUE,2,10,
SKILL_CREO, SKILL_CORPUS, 0,
TAR_SELF_ONLY, 0,cast_hearty_health,0)
NSPELLO(339, 4, POSITION_FIGHTING, 180, CRCO_GUILD, 20,TRUE,2,10,
SKILL_CREO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM, 0,cast_body_made_whole, TEACH_GNOME | TEACH_HUMAN)
NSPELLO(341, 1, POSITION_FIGHTING, 20, RECO_GUILD, 20,TRUE,2,10,
SKILL_REGO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM, 0,cast_spasm,TEACH_HUMAN)
NSPELLO(342, 8, POSITION_STANDING, 140, RECO_GUILD, 20,TRUE,2,10,
SKILL_REGO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM, 0,cast_leap,0)
NSPELLO(343, 4, POSITION_FIGHTING, 80, RECO_GUILD, 20,TRUE,2,10,
SKILL_REGO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM | TAR_SELF_NONO, 0,cast_gift_of_vigour,
TEACH_GNOME | TEACH_HUMAN)
NSPELLO(344, 4, POSITION_FIGHTING, 60, RECO_GUILD, 20,TRUE,2,10,
SKILL_REGO, SKILL_CORPUS, 0,
TAR_CHAR_ROOM, 0,cast_endurance,0)
NSPELLO(345, 4, POSITION_FIGHTING, 100, RECO_GUILD, 20,TRUE,2,10,
SKILL_REGO, SKILL_CORPUS, 0,
TAR_OBJ_ROOM, 0,cast_walking_corpse,TEACH_GNOME | TEACH_HUMAN)
NSPELLO(346, 5, POSITION_FIGHTING, 180, RECO_GUILD, 20,TRUE,3,10,
SKILL_REGO, SKILL_CORPUS, 0,
TAR_SELF_ONLY, 0,cast_seven_league,0)
NSKILLO(101, 0, POSITION_STANDING, 1, THIEF_GUILD,15,TRUE,1,0, STAT_DEX,
STAT_GUI,0, TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_GIANT ^ TEACH_OGIER);
NSKILLO(102, 0, POSITION_STANDING, 1, THIEF_GUILD, 15,TRUE,1,0,
STAT_DEX,STAT_GUI,0,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_GIANT ^ TEACH_OGIER);
NSKILLO(103, 0, POSITION_STANDING, 1, THIEF_GUILD, 10,TRUE,2,0,
STAT_DEX,STAT_GUI,0,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_GIANT ^ TEACH_OGIER ^ TEACH_GNOME);
NSKILLO(104, 0, POSITION_STANDING, 2, THIEF_GUILD, 5,TRUE,3,40,
STAT_DEX,STAT_STR,STAT_GUI,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_GIANT ^ TEACH_OGIER ^ TEACH_GNOME);
NSKILLO(105, 0, POSITION_STANDING, 5, THIEF_GUILD, 10,TRUE,3,3,
STAT_DEX,0,0,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_GIANT ^ TEACH_OGIER);
NSKILLO(106, 0, POSITION_STANDING,1, WARRIOR_GUILD, 10,TRUE,1,0,
STAT_DEX,STAT_STR,0,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_PIXIE ^ TEACH_GNOME ^ TEACH_HALF);
NSKILLO(107, 0, POSITION_STANDING, 2, WARRIOR_GUILD, 10, TRUE,1,0,
STAT_STR,0,STAT_DEX,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_PIXIE ^ TEACH_GNOME ^ TEACH_HALF);
NSKILLO(108, 0, POSITION_STANDING, 5, WARRIOR_GUILD, 10,TRUE,2,3,
STAT_DEX,STAT_STR,0,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_PIXIE ^ TEACH_GNOME ^ TEACH_HALF);
NSKILLO(109, 0, POSITION_STANDING, 5, THIEF_GUILD, 10,TRUE,2,3,
STAT_DEX,STAT_STR,STAT_FOC,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_GIANT ^ TEACH_OGIER);
NSKILLO(135, 0, POSITION_STANDING, 10, CLERIC_GUILD, 30,TRUE,6,3,
STAT_WIS,STAT_FOC,0,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_PIXIE ^ TEACH_ELF ^ TEACH_HELF);
NSKILLO(136, 0, POSITION_STANDING, 25, CLERIC_GUILD, 30,TRUE,6,3,
STAT_WIS,STAT_FOC,0,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_PIXIE ^ TEACH_ELF ^ TEACH_HELF);
NSKILLO(111, 0, POSITION_STANDING, 10, WARRIOR_GUILD, 10,TRUE,2,3,
STAT_STR,STAT_DEX,STAT_STR,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_PIXIE ^ TEACH_GNOME ^ TEACH_GIANT);
/* Ars magica skills */
NSKILLO(112, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_INT,STAT_FOC,STAT_WIS,TAR_IGNORE, 0, 0);
NSKILLO(113, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_INT,STAT_FOC,STAT_WIS,TAR_IGNORE, 0, 0);
NSKILLO(114, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_INT,STAT_FOC,STAT_WIS,TAR_IGNORE, 0, 0);
NSKILLO(115, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_INT,STAT_FOC,STAT_WIS,TAR_IGNORE, 0, 0);
NSKILLO(116, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_WIS,STAT_FOC,STAT_INT,TAR_IGNORE, 0, 0);
NSKILLO(117, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_WIS,STAT_FOC,0,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_DWARF ^ TEACH_GNOME );
NSKILLO(118, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_INT,STAT_FOC,0,TAR_IGNORE,0, TEACH_MERMAN | TEACH_HUMAN);
NSKILLO(119, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_INT,STAT_FOC,0,TAR_IGNORE,0, TEACH_PIXIE | TEACH_HELF
| TEACH_ELF | TEACH_HUMAN );
NSKILLO(120, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_WIS,STAT_FOC,0,TAR_IGNORE, 0, TEACH_GNOME | TEACH_HUMAN);
NSKILLO(121, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_WIS,STAT_FOC,0,TAR_IGNORE, 0,
TEACH_GNOME | TEACH_ELF | TEACH_HUMAN | TEACH_HELF | TEACH_OGIER);
NSKILLO(122, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_INT,STAT_FOC,0,TAR_IGNORE, 0,
TEACH_HUMAN | TEACH_DWARF);
NSKILLO(123, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_INT,STAT_FOC,STAT_WIS,TAR_IGNORE, 0,
TEACH_HUMAN | TEACH_OGIER | TEACH_PIXIE);
NSKILLO(124, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_INT,STAT_FOC,STAT_INT,TAR_IGNORE, 0,
TEACH_GNOME | TEACH_HUMAN | TEACH_OGIER);
NSKILLO(125, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_INT,STAT_FOC,STAT_STR,TAR_IGNORE, 0,
TEACH_DWARF | TEACH_HUMAN);
NSKILLO(126, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,3,15,
STAT_INT,STAT_FOC,STAT_FOC,TAR_IGNORE, 0,
TEACH_HUMAN | TEACH_PIXIE | TEACH_ELF | TEACH_HELF);
NSKILLO(127, 0, POSITION_STANDING, 1, ARSMAGICA_GUILD, 15,TRUE,5,10,
STAT_INT,STAT_FOC,STAT_INT,TAR_IGNORE, 0,TEACH_ALL ^ TEACH_GIANT);
NSKILLO(128, 0, POSITION_STANDING, 20, WARRIOR_GUILD, 10,TRUE,2,3,
STAT_DEX,STAT_DEX,STAT_STR,TAR_IGNORE, 0,TEACH_ALL ^ TEACH_PIXIE ^
TEACH_GNOME ^ TEACH_DWARF ^ TEACH_HALF ^ TEACH_GIANT);
NSKILLO(129, 0, POSITION_STANDING, 1, RIDING_GUILD, 10,TRUE,2,3,
STAT_DEX,STAT_DEX,0,TAR_IGNORE, 0, TEACH_ALL )
NSKILLO(130, 0, POSITION_STANDING, 1, RIDING_GUILD, 10,TRUE,2,3,
STAT_DEX,STAT_DEX,0,TAR_IGNORE, 0, TEACH_ALL )
NSKILLO(131, 0, POSITION_STANDING, 40, RANGER_GUILD, 10,TRUE,2,3,
STAT_PER,STAT_WIS,0,TAR_IGNORE, 0, TEACH_ALL )
NSKILLO(132, 0, POSITION_STANDING, 60, RANGER_GUILD, 10,TRUE,2,3,
STAT_CHR,STAT_PER,0,TAR_IGNORE, 0, TEACH_ALL )
NSKILLO(133, 0, POSITION_STANDING,1, WARRIOR_GUILD, 10,TRUE,2,0,
STAT_DEX,STAT_STR,0,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_PIXIE ^ TEACH_GNOME ^ TEACH_HALF);
NSKILLO(134, 0, POSITION_STANDING,20, WARRIOR_GUILD, 10,TRUE,5,0,
STAT_DEX,STAT_DEX,STAT_STR,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_PIXIE ^ TEACH_GNOME ^ TEACH_HALF);
/* weapon profs */
NSKILLO(201, 0, POSITION_STANDING, 1, WARRIOR_GUILD, 0,TRUE,1,3,
STAT_STR,0,0,TAR_IGNORE, 0,0);
NSKILLO(202, 0, POSITION_STANDING, 1, WARRIOR_GUILD, 0,TRUE,2,3,
STAT_STR,STAT_DEX,0,TAR_IGNORE, 0,0)
NSKILLO(203,0, POSITION_STANDING, 1, WARRIOR_GUILD, 0,TRUE,1,3,
STAT_DEX,0,STAT_FOC,TAR_IGNORE, 0,
TEACH_ALL ^ TEACH_GIANT ^ TEACH_OGIER);
NSKILLO(204, 0, POSITION_STANDING, 1, WARRIOR_GUILD, 0,TRUE,1,3,
STAT_STR,0,STAT_DEV,TAR_IGNORE, 0,0);
NSKILLO(205, 0, POSITION_STANDING, 1, WARRIOR_GUILD, 0,TRUE,2,3,
STAT_STR,STAT_DEV,STAT_DEX,TAR_IGNORE, 0,0);
NSKILLO(206, 0, POSITION_STANDING, 1, WARRIOR_GUILD, 0,TRUE,1,3,
STAT_STR,0,STAT_DEV,TAR_IGNORE, 0,0);
NSKILLO(207, 0, POSITION_STANDING, 1, WARRIOR_GUILD, 0,TRUE,2,3,
STAT_STR,STAT_DEV,STAT_DEX,TAR_IGNORE, 0,0);
NSKILLO(208, 0, POSITION_STANDING, 1, WARRIOR_GUILD, 0,TRUE,1,3,
STAT_STR,STAT_DEX,0,TAR_IGNORE, 0,0);
NSKILLO(209, 0, POSITION_STANDING, 1, WARRIOR_GUILD, 0, TRUE,2,3,
STAT_STR,STAT_DEX,STAT_STR,TAR_IGNORE, 0,0);
NSKILLO(210, 0, POSITION_STANDING, 1, WARRIOR_GUILD, 0,TRUE,2,3,
STAT_STR,STAT_DEX,0,TAR_IGNORE, 0,0);
NSKILLO(211, 0, POSITION_STANDING, 1, WARRIOR_GUILD, 0,TRUE,1,3,
STAT_STR,STAT_DEX,0,TAR_IGNORE, 0,0);
NSKILLO(212, 0, POSITION_STANDING, 1, WARRIOR_GUILD, 0,TRUE,1,3,
STAT_STR,STAT_DEX,0,TAR_IGNORE, 0,0);
}