/* ************************************************************************
* File: spells.h Part of CircleMUD *
* Usage: header file: constants and fn prototypes for spell system *
* *
* All rights reserved. See license.doc for complete information. *
* *
* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University *
* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. *
************************************************************************ */
#define DEFAULT_STAFF_LVL 12
#define DEFAULT_WAND_LVL 12
#define CAST_UNDEFINED (-1)
#define CAST_SPELL 0
#define CAST_POTION 1
#define CAST_WAND 2
#define CAST_STAFF 3
#define CAST_SCROLL 4
#define CAST_STRIKE 5
#define MAG_DAMAGE (1 << 0)
#define MAG_AFFECTS (1 << 1)
#define MAG_UNAFFECTS (1 << 2)
#define MAG_POINTS (1 << 3)
#define MAG_ALTER_OBJS (1 << 4)
#define MAG_GROUPS (1 << 5)
#define MAG_MASSES (1 << 6)
#define MAG_AREAS (1 << 7)
#define MAG_SUMMONS (1 << 8)
#define MAG_CREATIONS (1 << 9)
#define MAG_MANUAL (1 << 10)
#define MAG_AFFECTSV (1 << 11)
#define MAG_ACTION_FREE (1 << 12)
#define MAG_ACTION_PARTIAL (1 << 13)
#define MAG_ACTION_FULL (1 << 14)
#define MAG_NEXTSTRIKE (1 << 15)
#define MAG_TOUCH_MELEE (1 << 16)
#define MAG_TOUCH_RANGED (1 << 17)
#define MAGSAVE_FORT (1 << 0)
#define MAGSAVE_REFLEX (1 << 1)
#define MAGSAVE_WILL (1 << 2)
#define MAGSAVE_HALF (1 << 3)
#define MAGSAVE_NONE (1 << 4)
#define MAGSAVE_PARTIAL (1 << 5)
#define MAGCOMP_DIVINE_FOCUS (1 << 0)
#define MAGCOMP_EXP_COST (1 << 1)
#define MAGCOMP_FOCUS (1 << 2)
#define MAGCOMP_MATERIAL (1 << 3)
#define MAGCOMP_SOMATIC (1 << 4)
#define MAGCOMP_VERBAL (1 << 5)
#define TYPE_UNDEFINED (-1)
#define SPELL_RESERVED_DBC 0 /* SKILL NUMBER ZERO -- RESERVED */
/* Taken from the SRD under OGL, see ../doc/srd.txt for information */
#define SPELL_MAGE_ARMOR 1
#define SPELL_TELEPORT 2
#define SPELL_BLESS 3
#define SPELL_BLINDNESS 4
#define SPELL_BURNING_HANDS 5
#define SPELL_CALL_LIGHTNING 6
#define SPELL_CHARM 7
#define SPELL_CHILL_TOUCH 8
#define SPELL_COLOR_SPRAY 10
#define SPELL_CONTROL_WEATHER 11
#define SPELL_CREATE_FOOD 12
#define SPELL_CREATE_WATER 13
#define SPELL_REMOVE_BLINDNESS 14
#define SPELL_CURE_CRITIC 15
#define SPELL_CURE_LIGHT 16
#define SPELL_BESTOW_CURSE 17
#define SPELL_DETECT_ALIGN 18
#define SPELL_SEE_INVIS 19
#define SPELL_DETECT_MAGIC 20
#define SPELL_DETECT_POISON 21
#define SPELL_DISPEL_EVIL 22
#define SPELL_EARTHQUAKE 23
#define SPELL_ENCHANT_WEAPON 24
#define SPELL_ENERGY_DRAIN 25
#define SPELL_FIREBALL 26
#define SPELL_HARM 27
#define SPELL_HEAL 28
#define SPELL_INVISIBLE 29
#define SPELL_LIGHTNING_BOLT 30
#define SPELL_LOCATE_OBJECT 31
#define SPELL_MAGIC_MISSILE 32
#define SPELL_POISON 33
#define SPELL_PROT_FROM_EVIL 34
#define SPELL_REMOVE_CURSE 35
#define SPELL_SANCTUARY 36
#define SPELL_SHOCKING_GRASP 37
#define SPELL_SLEEP 38
#define SPELL_BULL_STRENGTH 39
#define SPELL_SUMMON 40
#define SPELL_VENTRILOQUATE 41
#define SPELL_WORD_OF_RECALL 42
#define SPELL_NEUTRALIZE_POISON 43
#define SPELL_SENSE_LIFE 44
#define SPELL_ANIMATE_DEAD 45
#define SPELL_DISPEL_GOOD 46
#define SPELL_GROUP_ARMOR 47
#define SPELL_MASS_HEAL 48
#define SPELL_GROUP_RECALL 49
#define SPELL_DARKVISION 50
#define SPELL_WATERWALK 51
#define SPELL_PORTAL 52
#define SPELL_PARALIZE 53
#define SPELL_INFLICT_LIGHT 54
#define SPELL_INFLICT_CRITIC 55
#define SPELL_IDENTIFY 56
#define SPELL_FAERIE_FIRE 57
#define ABIL_TURNING 58
#define ABIL_LAY_HANDS 59
#define SPELL_RESISTANCE 60
#define SPELL_ACID_SPLASH 61
#define SPELL_DAZE 62
#define SPELL_FLARE 63
#define SPELL_RAY_OF_FROST 64
#define SPELL_DISRUPT_UNDEAD 65
#define SPELL_LESSER_GLOBE_OF_INVUL 66
#define SPELL_STONESKIN 67
#define SPELL_MINOR_CREATION 68
#define SPELL_SUMMON_MONSTER_I 69
#define SPELL_SUMMON_MONSTER_II 70
#define SPELL_SUMMON_MONSTER_III 71
#define SPELL_SUMMON_MONSTER_IV 72
#define SPELL_SUMMON_MONSTER_V 73
#define SPELL_SUMMON_MONSTER_VI 74
#define SPELL_SUMMON_MONSTER_VII 75
#define SPELL_SUMMON_MONSTER_VIII 76
#define SPELL_SUMMON_MONSTER_IX 77
#define SPELL_FIRE_SHIELD 78
#define SPELL_ICE_STORM 79
#define SPELL_SHOUT 80
#define SPELL_FEAR 81
#define SPELL_CLOUDKILL 82
#define SPELL_MAJOR_CREATION 83
#define SPELL_HOLD_MONSTER 84
#define SPELL_CONE_OF_COLD 85
#define SPELL_ANIMAL_GROWTH 86
#define SPELL_BALEFUL_POLYMORPH 87
#define SPELL_PASSWALL 88
#define MIN_LANGUAGES SKILL_LANG_COMMON
#define SKILL_LANG_COMMON 141
#define SKILL_LANG_ELVEN 142
#define SKILL_LANG_GNOME 143
#define SKILL_LANG_DWARVEN 144
#define MAX_LANGUAGES SKILL_LANG_DWARVEN
#define SKILL_WP_UNARMED 179 /* Barehanded weapon group */
#define SPELL_FIRE_BREATH 202
#define SPELL_GAS_BREATH 203
#define SPELL_FROST_BREATH 204
#define SPELL_ACID_BREATH 205
#define SPELL_LIGHTNING_BREATH 206
/*
* to make an affect induced by dg_affect look correct on 'stat' we need
* to define it with a 'spellname'.
*/
#define SPELL_DG_AFFECT 298
/* WEAPON ATTACK TYPES */
#define TYPE_HIT 300
#define TYPE_STING 301
#define TYPE_WHIP 302
#define TYPE_SLASH 303
#define TYPE_BITE 304
#define TYPE_BLUDGEON 305
#define TYPE_CRUSH 306
#define TYPE_POUND 307
#define TYPE_CLAW 308
#define TYPE_MAUL 309
#define TYPE_THRASH 310
#define TYPE_PIERCE 311
#define TYPE_BLAST 312
#define TYPE_PUNCH 313
#define TYPE_STAB 314
/* new attack types can be added here - up to TYPE_SUFFERING */
#define TYPE_SUFFERING 399
#define SKILL_USE_MAGIC_DEVICE 400
#define SKILL_TUMBLE 401
#define SKILL_CRAFT_ALCHEMY 402
#define SKILL_HANDLE_ANIMAL 403
#define SKILL_BALANCE 404
#define SKILL_BLUFF 405
#define SKILL_CLIMB 406
#define SKILL_CONCENTRATION 407
#define SKILL_DECIPHER_SCRIPT 408
#define SKILL_SPOT 409
#define SKILL_DISABLE_DEVICE 410
#define SKILL_DISGUISE 411
#define SKILL_ESCAPE_ARTIST 412
#define SKILL_APPRAISE 413
#define SKILL_HEAL 414
#define SKILL_FORGERY 415
#define SKILL_HIDE 416
#define SKILL_INTIMIDATE 417
#define SKILL_JUMP 418
#define SKILL_LISTEN 419
#define SKILL_GATHER_INFORMATION 420
#define SKILL_DIPLOMACY 421
#define SKILL_PERFORM 422
#define SKILL_OPEN_LOCK 423
#define SKILL_RIDE 424
#define SKILL_SENSE_MOTIVE 425
#define SKILL_UNUSED1 426
#define SKILL_SEARCH 427
#define SKILL_MOVE_SILENTLY 428
#define SKILL_SPELLCRAFT 429
#define SKILL_SLEIGHT_OF_HAND 430
#define SKILL_SWIM 431
#define SKILL_USE_ROPE 432
#define SKILL_KNOWLEDGE_WILDERNESS_LORE 433
#define SKILL_SURVIVAL 434
#define ART_STUNNING_FIST 500
#define ART_WHOLENESS_OF_BODY 501
#define ART_ABUNDANT_STEP 502
#define ART_QUIVERING_PALM 503
#define ART_EMPTY_BODY 504
#define SAVING_FORTITUDE 0
#define SAVING_REFLEX 1
#define SAVING_WILL 2
#define SAVING_OBJ_IMPACT 0
#define SAVING_OBJ_HEAT 1
#define SAVING_OBJ_COLD 2
#define SAVING_OBJ_BREATH 3
#define SAVING_OBJ_SPELL 4
#define TAR_IGNORE (1 << 0)
#define TAR_CHAR_ROOM (1 << 1)
#define TAR_CHAR_WORLD (1 << 2)
#define TAR_FIGHT_SELF (1 << 3)
#define TAR_FIGHT_VICT (1 << 4)
#define TAR_SELF_ONLY (1 << 5) /* Only a check, use with i.e. TAR_CHAR_ROOM */
#define TAR_NOT_SELF (1 << 6) /* Only a check, use with i.e. TAR_CHAR_ROOM */
#define TAR_OBJ_INV (1 << 7)
#define TAR_OBJ_ROOM (1 << 8)
#define TAR_OBJ_WORLD (1 << 9)
#define TAR_OBJ_EQUIP (1 << 10)
#define SKTYPE_NONE 0
#define SKTYPE_SPELL (1 << 0)
#define SKTYPE_SKILL (1 << 1)
#define SKTYPE_LANG (1 << 2)
#define SKTYPE_WEAPON (1 << 3)
#define SKTYPE_ART (1 << 4)
#define SKFLAG_NEEDTRAIN (1 << 0) /* Disallow use of 0 skill with only stat mod */
#define SKFLAG_STRMOD (1 << 1)
#define SKFLAG_DEXMOD (1 << 2)
#define SKFLAG_CONMOD (1 << 3)
#define SKFLAG_INTMOD (1 << 4)
#define SKFLAG_WISMOD (1 << 5)
#define SKFLAG_CHAMOD (1 << 6)
#define SKFLAG_ARMORBAD (1 << 7)
#define SKFLAG_ARMORALL (1 << 8)
#define SKLEARN_CANT 0 /* This class can't learn this skill */
#define SKLEARN_CROSSCLASS 1 /* Cross-class skill for this class */
#define SKLEARN_CLASS 2 /* Class skill for this class */
#define SKLEARN_BOOL 3 /* Skill is known or not */
struct spell_info_type {
byte min_position; /* Position for caster */
int mana_min; /* Min amount of mana used by a spell (highest lev) */
int mana_max; /* Max amount of mana used by a spell (lowest lev) */
int mana_change; /* Change in mana used by spell from lev to lev */
int ki_min; /* Min amount of mana used by a spell (highest lev) */
int ki_max; /* Max amount of mana used by a spell (lowest lev) */
int ki_change; /* Change in mana used by spell from lev to lev */
int min_level[NUM_CLASSES];
int routines;
byte violent;
int targets; /* See below for use with TAR_XXX */
const char *name; /* Input size not limited. Originates from string constants. */
const char *wear_off_msg; /* Input size not limited. Originates from string constants. */
int race_can_learn[NUM_RACES];
int skilltype; /* Is it a spell, skill, art, feat, or what? used as bitvector */
int flags;
int save_flags;
int comp_flags;
byte can_learn_skill[NUM_CLASSES];
int spell_level;
int school;
int domain;
};
extern struct spell_info_type spell_info[];
/* Possible Targets:
bit 0 : IGNORE TARGET
bit 1 : PC/NPC in room
bit 2 : PC/NPC in world
bit 3 : Object held
bit 4 : Object in inventory
bit 5 : Object in room
bit 6 : Object in world
bit 7 : If fighting, and no argument, select tar_char as self
bit 8 : If fighting, and no argument, select tar_char as victim (fighting)
bit 9 : If no argument, select self, if argument check that it IS self.
*/
#define SPELL_TYPE_SPELL 0
#define SPELL_TYPE_POTION 1
#define SPELL_TYPE_WAND 2
#define SPELL_TYPE_STAFF 3
#define SPELL_TYPE_SCROLL 4
/* Attacktypes with grammar */
struct attack_hit_type {
const char *singular;
const char *plural;
};
#define ASPELL(spellname) \
void spellname(int level, struct char_data *ch, \
struct char_data *victim, struct obj_data *obj, const char *arg)
#define MANUAL_SPELL(spellname) spellname(level, caster, cvict, ovict, arg);
ASPELL(spell_create_water);
ASPELL(spell_recall);
ASPELL(spell_teleport);
ASPELL(spell_summon);
ASPELL(spell_locate_object);
ASPELL(spell_charm);
ASPELL(spell_information);
ASPELL(spell_identify);
ASPELL(spell_enchant_weapon);
ASPELL(spell_detect_poison);
ASPELL(spell_portal);
ASPELL(art_abundant_step);
/* basic magic calling functions */
int find_skill_num(char *name);
int mag_damage(int level, struct char_data *ch, struct char_data *victim,
int spellnum);
void mag_affects(int level, struct char_data *ch, struct char_data *victim,
int spellnum);
void mag_groups(int level, struct char_data *ch, int spellnum);
void mag_masses(int level, struct char_data *ch, int spellnum);
void mag_areas(int level, struct char_data *ch, int spellnum);
void mag_summons(int level, struct char_data *ch, struct obj_data *obj,
int spellnum, const char *arg);
void mag_points(int level, struct char_data *ch, struct char_data *victim,
int spellnum);
void mag_unaffects(int level, struct char_data *ch, struct char_data *victim,
int spellnum);
void mag_alter_objs(int level, struct char_data *ch, struct obj_data *obj,
int spellnum);
void mag_creations(int level, struct char_data *ch, int spellnum);
void mag_affectsv(int level, struct char_data *ch, struct char_data *victim,
int spellnum);
int call_magic(struct char_data *caster, struct char_data *cvict,
struct obj_data *ovict, int spellnum, int level, int casttype, const char *arg);
void mag_objectmagic(struct char_data *ch, struct obj_data *obj,
char *argument);
int cast_spell(struct char_data *ch, struct char_data *tch,
struct obj_data *tobj, int spellnum, const char *arg);
int mag_newsaves(struct char_data *ch, struct char_data *victim, int spellnum,
int level, int cast_stat);
/* other prototypes */
void skill_level(int spell, int chclass, int level);
void skill_race_class(int spell, int race, int learntype);
void init_skill_classes(void);
void init_skill_race_classes(void);
void skill_class(int skill, int chclass, int learntype);
const char *skill_name(int num);
int roll_skill(const struct char_data *ch, int snum);
int roll_resisted(const struct char_data *actor, int sact, const struct char_data *resistor, int sres);
int skill_type(int skill);