Crossfire Server, Trunk  R20513
Macros | Functions | Variables
spell_effect.c File Reference

Various spell effects, non attacks. More...

#include "global.h"
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "living.h"
#include "object.h"
#include "shop.h"
#include "sounds.h"
#include "spells.h"
#include "sproto.h"
Include dependency graph for spell_effect.c:

Go to the source code of this file.

Macros

#define LARGE_NUGGET   "largenugget"
 
#define SMALL_NUGGET   "smallnugget"
 

Functions

int alchemy (object *op, object *caster, object *spell_ob)
 Change items to gold nuggets. More...
 
static void alchemy_object (float value_adj, object *obj, int *small_nuggets, int *large_nuggets, int *weight)
 Compute how many nuggets an object is worth, and remove it. More...
 
int animate_weapon (object *op, object *caster, object *spell, int dir)
 Generalization of staff_to_snake(). More...
 
int cast_bless (object *op, object *caster, object *spell_ob, int dir)
 Improve statistics of some living object. More...
 
int cast_change_ability (object *op, object *caster, object *spell_ob, int dir, int silent)
 Cast some stat-improving spell. More...
 
int cast_change_map_lightlevel (object *op, object *caster, object *spell)
 This changes the light level for the entire map. More...
 
int cast_consecrate (object *op, object *caster, object *spell)
 A spell to make an altar your god's. More...
 
int cast_create_food (object *op, object *caster, object *spell_ob, int dir, const char *stringarg)
 Create food. More...
 
int cast_create_missile (object *op, object *caster, object *spell, int dir, const char *stringarg)
 Create a missile (nonmagic - magic +4). More...
 
int cast_create_town_portal (object *op, object *caster, object *spell, int dir)
 This function cast the spell of town portal for op. More...
 
int cast_detection (object *op, object *caster, object *spell)
 Detect magic or invisible items. More...
 
int cast_earth_to_dust (object *op, object *caster, object *spell_ob)
 Basically destroys earthwalls in the area. More...
 
int cast_heal (object *op, object *caster, object *spell, int dir)
 Heals something. More...
 
int cast_identify (object *op, object *caster, object *spell)
 Identifies objects in the players inventory/on the ground. More...
 
int cast_invisible (object *op, object *caster, object *spell_ob)
 Makes the player or character invisible. More...
 
int cast_item_curse_or_curse (object *op, object *caster, object *spell_ob)
 This alters player's marked item's cursed or blessed status, based on the spell_ob's fields. More...
 
void cast_magic_storm (object *op, object *tmp, int lvl)
 This is really used mostly for spell fumbles and the like. More...
 
int cast_polymorph (object *op, object *caster, object *spell_ob, int dir)
 Polymorph spell casting. More...
 
int cast_transfer (object *op, object *caster, object *spell, int dir)
 This spell transfers sp from the player to another person. More...
 
int cast_wonder (object *op, object *caster, int dir, object *spell_ob)
 wonder is really just a spell that will likely cast another spell. More...
 
int cast_word_of_recall (object *op, object *caster, object *spell_ob)
 Word of recall causes the player to return 'home'. More...
 
static void charge_mana_effect (object *victim, int caster_level)
 Checks if victim has overcharged mana, and if so does some fireball. More...
 
void counterspell (object *op, int dir)
 Nullifies spell effects. More...
 
int create_aura (object *op, object *caster, object *spell)
 Create an aura spell object and put it in the player's inventory. More...
 
int dimension_door (object *op, object *caster, object *spob, int dir)
 Teleport through some doors and space. More...
 
int magic_wall (object *op, object *caster, int dir, object *spell_ob)
 This creates magic walls. More...
 
int makes_invisible_to (object *pl, object *mon)
 This checks to see if 'pl' is invisible to 'mon'. More...
 
int perceive_self (object *op)
 Living thing wants to know information. More...
 
static void place_alchemy_objects (object *op, mapstruct *m, int small_nuggets, int large_nuggets, int x, int y)
 Place gold nuggets on the map. More...
 
void polymorph (object *op, object *who, int level)
 Handles polymorphing an object, living or not. More...
 
static void polymorph_item (object *who, object *op, int level)
 Changes an item to another item of similar type. More...
 
static void polymorph_living (object *op, int level)
 Takes a living object (op) and turns it into another monster of some sort. More...
 
static void polymorph_melt (object *who, object *op)
 Destroys item from polymorph failure. More...
 
int probe (object *op, object *caster, object *spell_ob, int dir, int level)
 Try to get information about a living thing. More...
 
int recharge (object *op, object *caster, object *spell_ob)
 Recharge wands. More...
 
int remove_curse (object *op, object *caster, object *spell)
 This function removes the cursed/damned status on equipped items. More...
 
int write_mark (object *op, object *spell, const char *msg)
 This writes a rune that contains the appropriate message. More...
 

Variables

static const char *const no_gain_msgs [NUM_STATS]
 This is used for the spells that gain stats. More...
 

Detailed Description

Various spell effects, non attacks.

Todo:
use the same parameter names/orders.

Definition in file spell_effect.c.

Macro Definition Documentation

#define LARGE_NUGGET   "largenugget"

Definition at line 2132 of file spell_effect.c.

Referenced by alchemy_object(), and place_alchemy_objects().

#define SMALL_NUGGET   "smallnugget"

Definition at line 2131 of file spell_effect.c.

Referenced by alchemy_object(), and place_alchemy_objects().

Function Documentation

int alchemy ( object op,
object caster,
object spell_ob 
)

Change items to gold nuggets.

Only works for players.

Parameters
opwho is casting.
casterwhat is casting.
spell_obactual spell object.
Return values
0op isn't a player.
1op is a player.

Definition at line 2250 of file spell_effect.c.

References alchemy_object(), obj::contr, obj::duration, FLAG_ALIVE, FLAG_IS_CAULDRON, FLAG_NO_PICK, FOR_INV_FINISH, FOR_INV_PREPARE, FOR_MAP_FINISH, FOR_MAP_PREPARE, get_map_flags(), GET_MAP_MOVE_BLOCK, socket_struct::look_position, obj::map, MOVE_WALK, P_NO_MAGIC, P_OUT_OF_MAP, place_alchemy_objects(), PLAYER, QUERY_FLAG, pl::socket, SP_level_dam_adjust(), SP_level_duration_adjust(), obj::type, obj::x, and obj::y.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

static void alchemy_object ( float  value_adj,
object obj,
int *  small_nuggets,
int *  large_nuggets,
int *  weight 
)
static

Compute how many nuggets an object is worth, and remove it.

Parameters
value_adjhow much to adjust the cost of obj.
objobject to convert.
[out]small_nuggetshow many small nuggets obj gives.
[out]large_nuggetshow many large nuggets obj gives.
[out]weightthe weight of the object.

< Value of nuggets.

Definition at line 2148 of file spell_effect.c.

References find_archetype(), FLAG_UNPAID, FREE_OBJ_NO_DESTROY_CALLBACK, GEM, LARGE_NUGGET, MONEY, object_free2(), object_remove(), price_base(), QUERY_FLAG, rndm(), SMALL_NUGGET, obj::type, obj::value, and obj::weight.

Referenced by alchemy().

Here is the call graph for this function:

Here is the caller graph for this function:

int animate_weapon ( object op,
object caster,
object spell,
int  dir 
)

Generalization of staff_to_snake().

Makes a golem out of the caster's weapon. The golem is based on the archetype specified, modified by the caster's level and the attributes of the weapon. The weapon is inserted in the golem's inventory so that it falls to the ground when the golem dies. This code was very odd - code early on would only let players use the spell, yet the code was full of player checks. I've presumed that the code that only let players use it was correct, and removed all the other player checks. MSW 2003-01-06

Parameters
opwho is casting.
casterwhat is casting.
spellactual spell object.
dircasting direction.
Return values
0spell failure.
1spell was successful.

Definition at line 3012 of file spell_effect.c.

References add_friendly_object(), add_string(), obj::anim_speed, obj::animation_id, obj::arch, arch_to_object(), AT_PHYSICAL, ATNR_BLIND, ATNR_CONFUSION, ATNR_DEATH, ATNR_DEPLETE, ATNR_FEAR, ATNR_PARALYZE, ATNR_PHYSICAL, ATNR_POISON, ATNR_SLOW, ATNR_TURN_UNDEAD, obj::attacktype, caster_level(), CLEAR_FLAG, archt::clone, liv::Con, obj::contr, obj::count, liv::dam, liv::Dex, obj::direction, draw_ext_info(), draw_ext_info_format(), obj::duration, esrv_update_item(), liv::exp, obj::face, find_marked_object(), fix_object(), FLAG_ANIMATE, FLAG_APPLIED, FLAG_FRIENDLY, FLAG_MONSTER, FLAG_REMOVED, FLAG_UNPAID, FLAG_USE_WEAPON, free_string(), freearr_x, freearr_y, get_map_flags(), GET_MAP_MOVE_BLOCK, GOLEM, pl::golem_count, liv::hp, obj::last_anim, llevError, LOG(), obj::magic, obj::map, obj::materialname, MAX, MAX_BUF, liv::maxgrace, liv::maxhp, obj::move_type, MSG_TYPE_SPELL, MSG_TYPE_SPELL_ERROR, obj::name, archt::name, name_to_material(), NDI_BLACK, NDI_UNIQUE, obj::nrof, NROFATTACKS, object_find_free_spot(), object_insert_in_map_at(), object_insert_in_ob(), object_remove(), object_set_owner(), object_split(), object_update_speed(), obj::other_arch, P_OUT_OF_MAP, pets_control_golem(), PLAYER, QUERY_FLAG, query_name(), obj::race, range_golem, pl::ranges, obj::resist, _materialtype::save, SET_FLAG, set_spell_skill(), pl::shoottype, snprintf, liv::sp, SP_level_dam_adjust(), SP_level_duration_adjust(), SP_level_range_adjust(), obj::speed, obj::speed_left, obj::state, obj::stats, liv::Str, obj::type, UPD_NROF, liv::wc, WEAPON, obj::x, and obj::y.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_bless ( object op,
object caster,
object spell_ob,
int  dir 
)
int cast_change_ability ( object op,
object caster,
object spell_ob,
int  dir,
int  silent 
)

Cast some stat-improving spell.

Parameters
opwho is casting.
casterwhat is casting.
spell_obactual spell object.
dircasting direction.
silentif non zero, don't say when the spell is already is effect.
Return values
0spell failed.
1spell was successful.
Todo:
weird check on duration? since you'll never get there since a force would have been found?

Definition at line 1862 of file spell_effect.c.

References liv::ac, add_refcount(), arch_to_object(), obj::attacktype, change_abil(), CLEAR_FLAG, create_archetype(), draw_ext_info(), draw_ext_info_format(), obj::duration, liv::exp, find_target_for_friendly_spell(), FLAG_APPLIED, FLAG_NO_FIX_PLAYER, FLAG_SEE_IN_DARK, FLAG_XRAYS, FOR_INV_FINISH, FOR_INV_PREPARE, FORCE, FORCE_CHANGE_ABILITY, FORCE_NAME, free_string(), get_attr_value(), liv::hp, INS_ON_TOP, obj::map, obj::move_type, MSG_TYPE_SPELL, MSG_TYPE_SPELL_ERROR, MSG_TYPE_SPELL_FAILURE, MSG_TYPE_SPELL_SUCCESS, obj::name, obj::name_pl, NDI_UNIQUE, no_gain_msgs, NROFATTACKS, NUM_STATS, object_insert_in_map_at(), object_insert_in_ob(), obj::other_arch, PLAYER, QUERY_FLAG, obj::race, obj::resist, rndm(), set_attr_value(), SET_FLAG, SP_level_dam_adjust(), SP_level_duration_adjust(), obj::speed, obj::speed_left, obj::stats, store_spell_expiry(), obj::subtype, obj::type, liv::wc, obj::x, and obj::y.

Referenced by cast_spell(), and god_intervention().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_change_map_lightlevel ( object op,
object caster,
object spell 
)

This changes the light level for the entire map.

Parameters
opwho is casting.
casterwhat is casting.
spellactual spell object.
Return values
0light not affected.
1light changed.

Definition at line 3240 of file spell_effect.c.

References change_map_light(), liv::dam, draw_ext_info(), obj::map, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, NDI_UNIQUE, and obj::stats.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_consecrate ( object op,
object caster,
object spell 
)

A spell to make an altar your god's.

Parameters
opwho is casting.
casterwhat is casting.
spellactual spell object.
Return values
0no consecration happened.
1an altar waas consecrated.

Definition at line 2934 of file spell_effect.c.

References arch_to_object(), caster_level(), determine_god(), draw_ext_info(), draw_ext_info_format(), find_archetype(), find_god(), FLAG_IS_BUILDABLE, FLAG_IS_FLOOR, FOR_BELOW_FINISH, FOR_BELOW_PREPARE, HOLY_ALTAR, INS_BELOW_ORIGINATOR, obj::level, llevError, LOG(), obj::map, MAX_BUF, MSG_TYPE_SPELL, MSG_TYPE_SPELL_ERROR, MSG_TYPE_SPELL_FAILURE, MSG_TYPE_SPELL_SUCCESS, obj::name, NDI_UNIQUE, object_insert_in_map_at(), object_remove(), QUERY_FLAG, SET_FLAG, snprintf, and tolower.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_create_food ( object op,
object caster,
object spell_ob,
int  dir,
const char *  stringarg 
)

Create food.

Allows the choice of what sort of food object to make. If stringarg is NULL, it will create food dependent on level –PeterM

Parameters
opwho is casting.
casterwhat is casting.
spell_obactual spell object.
dircasting direction.
stringargoptional parameter specifying what kind of items to create.
Return values
0no food created.
foodwas created.

Definition at line 605 of file spell_effect.c.

References cast_create_obj(), archt::clone, draw_ext_info(), DRINK, find_archetype_by_object_type_name(), first_archetype, liv::food, FOOD, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, NDI_UNIQUE, archt::next, obj::nrof, object_copy(), object_new(), SP_level_duration_adjust(), obj::stats, obj::type, and obj::value.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_create_missile ( object op,
object caster,
object spell,
int  dir,
const char *  stringarg 
)

Create a missile (nonmagic - magic +4).

Will either create bolts or arrows based on whether a crossbow or bow is equiped. If neither, it defaults to arrows. Sets the plus based on the casters level. It is also settable with the invoke command. If the caster attempts to create missiles with too great a plus, the default is used. The # of arrows created also goes up with level, so if a 30th level mage wants LOTS of arrows, and doesn't care what the plus is he could create nonnmagic arrows, or even -1, etc...

Parameters
opwho is casting.
casterwhat is casting.
spellactual spell object.
dircasting direction.
stringargoptional parameter specifying what kind of items to create.
Return values
0no missile created.
missileswere created.

Definition at line 498 of file spell_effect.c.

References BOW, cast_create_obj(), obj::count, create_archetype(), liv::dam, draw_ext_info_format(), obj::duration, find_archetype(), find_artifactlist(), FLAG_IDENTIFIED, FREE_OBJ_NO_DESTROY_CALLBACK, give_artifact_abilities(), artifactstruct::item, artifactliststruct::items, llevDebug, LOG(), obj::magic, MSG_TYPE_SPELL, MSG_TYPE_SPELL_ERROR, obj::name, NDI_UNIQUE, artifactstruct::next, obj::nrof, object_find_by_type_applied(), object_free2(), object_was_destroyed, pick_up(), PLAYER, obj::race, SET_FLAG, obj::slaying, SP_level_dam_adjust(), SP_level_duration_adjust(), obj::stats, strcasecmp(), obj::type, and obj::value.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_create_town_portal ( object op,
object caster,
object spell,
int  dir 
)

This function cast the spell of town portal for op.

The spell operates in two passes. During the first one a place is marked as a destination for the portal. During the second one, 2 portals are created, one in the position the player cast it and one in the destination place. The portal are synchronized and 2 forces are inserted in the player to destruct the portal next time player creates a new portal pair. This spell has a side effect that it allows people to meet each other in a permanent, private, apartments by making a town portal from it to the town or another public place. So, check if the map is unique and if so return an error

Code by Tchize (david.nosp@m..del.nosp@m.becq@.nosp@m.usa..nosp@m.net)

Parameters
opwho is casting.
casterwhat is casting.
spellactual spell object.
dircasting direction.
Return values
0spell was insuccessful for some reason.
1spell worked.

Definition at line 1129 of file spell_effect.c.

References add_string(), ARCH_PORTAL_FAILED, arch_to_object(), cast_create_obj(), caster_level(), check_inv_recursive(), obj::contr, create_archetype(), Settings::create_home_portals, draw_ext_info(), EXIT_PATH, EXIT_X, EXIT_Y, find_archetype(), FOR_OB_AND_ABOVE_FINISH, FOR_OB_AND_ABOVE_PREPARE, FREE_AND_COPY, FREE_OBJ_FREE_INVENTORY, FREE_OBJ_NO_DESTROY_CALLBACK, free_string(), mapdef::last_reset_time, llevDebug, llevError, Settings::localdir, LOG(), obj::map, map_find_by_archetype(), MAP_PLAYER_UNIQUE, MSG_TYPE_SPELL, MSG_TYPE_SPELL_ERROR, MSG_TYPE_SPELL_FAILURE, MSG_TYPE_SPELL_SUCCESS, obj::name, obj::name_pl, NDI_NAVY, NDI_UNIQUE, object_free2(), object_insert_in_map_at(), object_insert_in_ob(), object_remove(), object_set_msg(), obj::other_arch, mapdef::path, obj::race, ready_map_name(), settings, obj::slaying, snprintf, pl::transport, obj::weapontype, obj::x, and obj::y.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_detection ( object op,
object caster,
object spell 
)
int cast_earth_to_dust ( object op,
object caster,
object spell_ob 
)

Basically destroys earthwalls in the area.

Parameters
opwho is casting.
casterwhat is casting.
spell_obactual spell object.
Return values
0op isn't a player.
1op is a player.

Definition at line 848 of file spell_effect.c.

References AT_PHYSICAL, FLAG_TEAR_DOWN, FOR_MAP_FINISH, FOR_MAP_PREPARE, get_map_flags(), GET_MAP_MOVE_BLOCK, hit_player(), obj::map, P_OUT_OF_MAP, PLAYER, QUERY_FLAG, obj::range, SP_level_range_adjust(), obj::type, obj::x, and obj::y.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_heal ( object op,
object caster,
object spell,
int  dir 
)

Heals something.

Parameters
opwho is casting.
casterwhat is casting.
spellactual spell object.
dircasting direction.
Todo:
check spurious cure_disease call (shouldn't the spell's level be sent?) and return check value (always 1).

Definition at line 1711 of file spell_effect.c.

References arch_present_in_ob(), arch_to_object(), AT_BLIND, AT_CONFUSION, AT_DISEASE, AT_POISON, obj::attacktype, cure_disease(), liv::dam, draw_ext_info(), obj::duration, find_archetype(), find_target_for_friendly_spell(), liv::food, FORCE, liv::grace, liv::hp, INS_ON_TOP, obj::last_grace, obj::last_sp, obj::map, liv::maxgrace, liv::maxhp, liv::maxsp, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, MSG_TYPE_SPELL_HEAL, NDI_UNIQUE, object_insert_in_map_at(), object_present_in_ob_by_name(), obj::other_arch, PLAYER, PREFER_HIGH, random_roll(), obj::skill, liv::sp, obj::stats, obj::type, obj::x, and obj::y.

Referenced by cast_spell(), and god_intervention().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_identify ( object op,
object caster,
object spell 
)

Identifies objects in the players inventory/on the ground.

Parameters
opwho is casting.
casterwhat is casting.
spellactual spell object.
Return values
0nothing was identified.
1at least one object was identified.

Definition at line 2449 of file spell_effect.c.

References liv::dam, draw_ext_info(), draw_ext_info_format(), esrv_update_item(), FLAG_IDENTIFIED, FOR_INV_FINISH, FOR_INV_PREPARE, FOR_MAP_FINISH, FOR_MAP_PREPARE, identify(), obj::map, MAX_BUF, MSG_TYPE_ITEM, MSG_TYPE_ITEM_INFO, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, NDI_UNIQUE, need_identify(), ob_describe(), PLAYER, QUERY_FLAG, SP_level_dam_adjust(), spell_effect(), obj::stats, obj::type, UPD_FLAGS, UPD_NAME, obj::x, and obj::y.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_invisible ( object op,
object caster,
object spell_ob 
)

Makes the player or character invisible.

Note the spells to 'stack', but perhaps in odd ways. the duration for all is cumulative. In terms of invis undead/normal invis, it is the last one cast that will determine if you are invisible to undead or normal monsters. For improved invis, if you cast it with a one of the others, you lose the improved part of it, and the above statement about undead/ normal applies.

Parameters
opwho is casting.
casterwhat is casting.
spell_obactual spell object.
Return values
0invisibility was already in action.
1op is now invisible.

Definition at line 787 of file spell_effect.c.

References obj::active_next, active_objects, add_refcount(), obj::contr, draw_ext_info(), obj::duration, obj::enemy, FLAG_MAKE_INVIS, FREE_AND_CLEAR_STR, pl::hidden, pl::invis_race, obj::invisible, makes_invisible_to(), MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, MSG_TYPE_SPELL_SUCCESS, NDI_UNIQUE, object_set_enemy(), object_update(), PLAYER, QUERY_FLAG, obj::race, SP_level_duration_adjust(), pl::tmp_invis, obj::type, and UP_OBJ_FACE.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_item_curse_or_curse ( object op,
object caster,
object spell_ob 
)

This alters player's marked item's cursed or blessed status, based on the spell_ob's fields.

Parameters
opplayer casting the spell.
casterwhat object was used to cast the spell.
spell_obspell itself.
Returns
1 if item was changed, 0 else.

Definition at line 2398 of file spell_effect.c.

References CLEAR_FLAG, draw_ext_info(), draw_ext_info_format(), esrv_update_item(), find_marked_object(), FLAG_BLESSED, FLAG_CURSED, FLAG_IDENTIFIED, FLAG_KNOWN_BLESSED, FLAG_KNOWN_CURSED, FLAG_STARTEQUIP, HUGE_BUF, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, MSG_TYPE_SPELL_SUCCESS, NDI_UNIQUE, QUERY_FLAG, query_short_name(), SET_FLAG, and UPD_FLAGS.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

void cast_magic_storm ( object op,
object tmp,
int  lvl 
)

This is really used mostly for spell fumbles and the like.

Parameters
opwhat is casting this.
tmpobject to propagate.
lvlhow nasty should the propagation be.

Definition at line 44 of file spell_effect.c.

References obj::count, liv::dam, obj::duration, obj::level, obj::map, liv::maxhp, object_insert_in_map_at(), obj::range, obj::stats, obj::x, and obj::y.

Referenced by alchemy_failure_effect(), become_follower(), god_examines_priest(), pray_at_altar(), prayer_failure(), and scroll_failure().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_polymorph ( object op,
object caster,
object spell_ob,
int  dir 
)

Polymorph spell casting.

Parameters
opwho is casting the spell.
casterobject used to cast spell.
spell_obspell itself.
dircasting direction. 0 won't have any effect.
Returns
Returns 0 on illegal cast, otherwise 1.

Definition at line 430 of file spell_effect.c.

References obj::above, arch_to_object(), caster_level(), FLAG_IS_FLOOR, liv::food, FOR_OB_AND_BELOW_FINISH, FOR_OB_AND_BELOW_PREPARE, freearr_x, freearr_y, get_map_flags(), GET_MAP_MOVE_BLOCK, GET_MAP_OB, obj::map, MOVE_FLY_LOW, object_insert_in_map_at(), obj::other_arch, P_NO_MAGIC, P_OUT_OF_MAP, polymorph(), QUERY_FLAG, obj::range, SP_level_range_adjust(), obj::speed_left, obj::stats, obj::x, and obj::y.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_transfer ( object op,
object caster,
object spell,
int  dir 
)

This spell transfers sp from the player to another person.

We let the target go above their normal maximum SP.

Parameters
opwho is casting.
casterwhat is casting.
spellactual spell object.
dircasting direction.
Return values
0no transfer happened.
1transfer happened.

Definition at line 2785 of file spell_effect.c.

References caster_level(), charge_mana_effect(), liv::dam, draw_ext_info(), FLAG_ALIVE, FOR_MAP_FINISH, FOR_MAP_PREPARE, freearr_x, freearr_y, get_map_flags(), obj::map, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, NDI_BLACK, P_IS_ALIVE, P_OUT_OF_MAP, QUERY_FLAG, liv::sp, SP_level_dam_adjust(), obj::stats, obj::x, and obj::y.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_wonder ( object op,
object caster,
int  dir,
object spell_ob 
)

wonder is really just a spell that will likely cast another spell.

Parameters
opwho is casting.
casterwhat is casting.
dircasting direction.
spell_obactual spell object.
Todo:
doesn't it decrease sp without checking?

Definition at line 961 of file spell_effect.c.

References cast_cone(), cast_spell(), generate_treasure(), obj::level, llevError, LOG(), obj::name, obj::randomitems, rndm(), SP_WONDER, SPELL, obj::subtype, and obj::type.

Referenced by cast_spell(), and scroll_failure().

Here is the call graph for this function:

Here is the caller graph for this function:

int cast_word_of_recall ( object op,
object caster,
object spell_ob 
)

Word of recall causes the player to return 'home'.

we put a force into the player object, so that there is a time delay effect.

Parameters
opwho is casting.
casterwhat is casting.
spell_obactual spell object.
Return values
0op isn't a player.
1word of recall initiated.

Definition at line 899 of file spell_effect.c.

References add_string(), pl::bed_x, pl::bed_y, obj::contr, create_archetype(), draw_ext_info(), obj::duration, EXIT_PATH, EXIT_X, EXIT_Y, FORCE_NAME, llevError, LOG(), MSG_TYPE_SPELL, MSG_TYPE_SPELL_ERROR, MSG_TYPE_SPELL_SUCCESS, NDI_UNIQUE, object_find_by_type_subtype(), object_insert_in_ob(), object_update_speed(), PLAYER, pl::savebed_map, SP_level_duration_adjust(), SP_WORD_OF_RECALL, obj::speed, obj::speed_left, SPELL_EFFECT, obj::subtype, and obj::type.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

static void charge_mana_effect ( object victim,
int  caster_level 
)
static

Checks if victim has overcharged mana, and if so does some fireball.

Parameters
victimwho may have overcharged.
caster_levelcaster's (skill) level whose spell did cause the overcharge.

Definition at line 2730 of file spell_effect.c.

References confuse_living(), create_archetype(), obj::dam_modifier, draw_ext_info(), EXPLODING_FIREBALL, obj::map, liv::maxhp, liv::maxsp, MSG_TYPE_SPELL, MSG_TYPE_SPELL_TARGET, MSG_TYPE_VICTIM, MSG_TYPE_VICTIM_SPELL, NDI_ORANGE, NDI_UNIQUE, object_insert_in_map_at(), PREFER_LOW, random_roll(), liv::sp, obj::stats, obj::x, and obj::y.

Referenced by cast_transfer().

Here is the call graph for this function:

Here is the caller graph for this function:

void counterspell ( object op,
int  dir 
)

Nullifies spell effects.

Basically, if the object has a magic attacktype, this may nullify it.

Parameters
opcounterspell object.
dirdirection it was cast in.

Definition at line 2858 of file spell_effect.c.

References AT_COUNTERSPELL, AT_MAGIC, obj::attacktype, FLAG_MONSTER, liv::food, FOR_MAP_FINISH, FOR_MAP_PREPARE, freearr_x, freearr_y, get_map_flags(), HEAD, liv::hp, obj::level, obj::map, object_free2(), object_get_owner(), object_remove(), P_OUT_OF_MAP, QUERY_FLAG, rndm(), RUNE, obj::speed_left, SPELL_EFFECT, obj::stats, obj::type, obj::x, and obj::y.

Referenced by hit_map().

Here is the call graph for this function:

Here is the caller graph for this function:

int create_aura ( object op,
object caster,
object spell 
)

Create an aura spell object and put it in the player's inventory.

This is also used for elemental shields - the creation is the same just the 'move' code is different.

Parameters
opwho is casting.
casterwhat is casting.
spellactual spell object.
Returns
1.

Definition at line 3272 of file spell_effect.c.

References add_refcount(), arch_present_in_ob(), arch_to_object(), obj::attacktype, caster_level(), change_abil(), create_archetype(), liv::dam, draw_ext_info(), obj::duration, fix_object(), FLAG_APPLIED, FORCE, FORCE_CHANGE_ABILITY, FORCE_NAME, free_string(), obj::level, MSG_TYPE_SPELL, MSG_TYPE_SPELL_SUCCESS, obj::name, obj::name_pl, NDI_UNIQUE, NROFATTACKS, object_insert_in_ob(), object_present_in_ob_by_name(), object_set_owner(), obj::other_arch, PLAYER, obj::resist, SET_FLAG, set_spell_skill(), SP_level_dam_adjust(), SP_level_duration_adjust(), obj::speed, obj::stats, store_spell_expiry(), obj::subtype, and obj::type.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int dimension_door ( object op,
object caster,
object spob,
int  dir 
)

Teleport through some doors and space.

Parameters
opwho is casting.
casterwhat is casting.
spobactual spell object.
dircasting direction.
Return values
0spell failure.
1spell was successful.

Definition at line 1575 of file spell_effect.c.

References obj::contr, pl::count, draw_ext_info(), FABS, freearr_x, freearr_y, get_map_flags(), GET_MAP_MOVE_BLOCK, obj::map, map_newmap_cmd(), MSG_TYPE_SPELL, MSG_TYPE_SPELL_ERROR, MSG_TYPE_SPELL_FAILURE, NDI_UNIQUE, ob_apply(), OB_TYPE_MOVE_BLOCK, object_insert_in_map_at(), object_remove(), P_BLOCKSVIEW, P_IS_ALIVE, P_NO_MAGIC, P_OUT_OF_MAP, PLAYER, player_update_bg_music(), obj::range, pl::socket, SP_level_range_adjust(), obj::speed, obj::speed_left, TRANSPORT, pl::transport, obj::type, obj::x, and obj::y.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int magic_wall ( object op,
object caster,
int  dir,
object spell_ob 
)
int makes_invisible_to ( object pl,
object mon 
)

This checks to see if 'pl' is invisible to 'mon'.

Does race check, undead check, etc Returns TRUE if mon can't see pl, false otherwise. This doesn't check range, walls, etc. It only checks the racial adjustments, and in fact that pl is invisible.

Parameters
plpotentially invisible object.
monwho may see pl.
Return values
0mon can see pl.
1mon can't see pl.

Definition at line 740 of file spell_effect.c.

References obj::contr, FLAG_UNDEAD, pl::invis_race, obj::invisible, is_true_undead(), PLAYER, QUERY_FLAG, obj::race, and obj::type.

Referenced by cast_invisible(), and monster_can_see_enemy().

Here is the call graph for this function:

Here is the caller graph for this function:

int perceive_self ( object op)
static void place_alchemy_objects ( object op,
mapstruct m,
int  small_nuggets,
int  large_nuggets,
int  x,
int  y 
)
static

Place gold nuggets on the map.

Parameters
opplayer who is casting the spell. Just used so nuggets are inserted below her.
mmap to insert to.
small_nuggets
large_nuggetshow many nuggets to place.
x
ywhere to place the nuggets.

Definition at line 2214 of file spell_effect.c.

References create_archetype(), INS_BELOW_ORIGINATOR, LARGE_NUGGET, obj::map, object_insert_in_map_at(), SMALL_NUGGET, obj::x, and obj::y.

Referenced by alchemy().

Here is the call graph for this function:

Here is the caller graph for this function:

void polymorph ( object op,
object who,
int  level 
)

Handles polymorphing an object, living or not.

Will avoid some specific items (flying arrows and such).

Parameters
opobject being polymorphed.
whospell caster.
levelspell level.

Definition at line 376 of file spell_effect.c.

References obj::arch, FABS, FLAG_ALIVE, FLAG_ANIMATE, FLAG_GENERATOR, FLAG_MONSTER, FLAG_NO_PICK, obj::move_block, PLAYER, polymorph_item(), polymorph_living(), polymorph_melt(), QUERY_FLAG, rndm(), obj::speed, TREASURE, and obj::type.

Referenced by cast_polymorph().

Here is the call graph for this function:

Here is the caller graph for this function:

static void polymorph_item ( object who,
object op,
int  level 
)
static

Changes an item to another item of similar type.

Parameters
whospell caster.
opobject being polymorphed. Should be a non living thing.
levelspell level, required for monster resistance.

Definition at line 276 of file spell_effect.c.

References archt::clone, FABS, first_archetype, fix_generated_item(), FLAG_NO_DROP, FLAG_STARTEQUIP, liv::food, FOOD, FREE_OBJ_NO_DESTROY_CALLBACK, GT_ENVIRONMENT, INS_NO_MERGE, INS_NO_WALK_ON, obj::invisible, llevError, LOG(), obj::magic, obj::map, obj::name, archt::next, obj::nrof, object_copy(), object_free2(), object_insert_in_map_at(), object_new(), object_remove(), polymorph_melt(), QUERY_FLAG, RING, rndm(), obj::stats, obj::type, obj::value, obj::x, and obj::y.

Referenced by polymorph().

Here is the call graph for this function:

Here is the caller graph for this function:

static void polymorph_living ( object op,
int  level 
)
static

Takes a living object (op) and turns it into another monster of some sort.

Parameters
opobject to try to polymorph. Should be monster.
levellevel of the polymorph spell.

Definition at line 157 of file spell_effect.c.

References add_friendly_object(), apply_manual(), ATNR_MAGIC, obj::attack_movement, CLEAR_FLAG, archt::clone, create_treasure(), did_make_save(), mapdef::difficulty, first_archetype, FLAG_APPLIED, FLAG_FRIENDLY, FLAG_MONSTER, FOR_INV_FINISH, FOR_INV_PREPARE, GT_INVISIBLE, HAS_RANDOM_ITEMS, HEAD, obj::level, obj::map, monster_check_apply_all(), archt::next, object_copy(), object_find_free_spot(), object_free2(), object_get_owner(), object_insert_in_map_at(), object_remove(), object_set_owner(), PETMOVE, QUERY_FLAG, obj::randomitems, remove_friendly_object(), obj::resist, rndm(), SET_FLAG, SIZEOFFREE, SPELL, obj::x, and obj::y.

Referenced by polymorph().

Here is the call graph for this function:

Here is the caller graph for this function:

static void polymorph_melt ( object who,
object op 
)
static

Destroys item from polymorph failure.

Note
We should probably do something more clever ala nethack - create an iron golem or something.
Parameters
whowho cast the spell.
opspell victim.

Definition at line 248 of file spell_effect.c.

References draw_ext_info_format(), MAX_BUF, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, NDI_GREY, obj::nrof, object_free2(), object_remove(), play_sound_map(), query_name(), and SOUND_TYPE_ITEM.

Referenced by polymorph(), and polymorph_item().

Here is the call graph for this function:

Here is the caller graph for this function:

int probe ( object op,
object caster,
object spell_ob,
int  dir,
int  level 
)

Try to get information about a living thing.

Parameters
opwho is casting.
casterwhat is casting.
spell_obspell object being cast.
dircast direction.
levelprobe level.
Return values
0nothing probed.
1something was probed.

Definition at line 683 of file spell_effect.c.

References draw_ext_info(), examine_monster(), FLAG_ALIVE, FLAG_MONSTER, FLAG_WIZCAST, FOR_MAP_FINISH, FOR_MAP_PREPARE, freearr_x, freearr_y, get_map_flags(), HEAD, obj::map, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, MSG_TYPE_SPELL_SUCCESS, NDI_UNIQUE, P_IS_ALIVE, P_NO_MAGIC, P_OUT_OF_MAP, PLAYER, QUERY_FLAG, obj::range, SP_level_range_adjust(), obj::x, and obj::y.

Referenced by cast_spell(), check_probe(), and examine_monster().

Here is the call graph for this function:

Here is the caller graph for this function:

int recharge ( object op,
object caster,
object spell_ob 
)

Recharge wands.

Parameters
opwho is casting.
casterwhat is casting.
spell_obspell object.
Return values
0nothing happened.
1wand was recharged, or destroyed.

Definition at line 79 of file spell_effect.c.

References obj::arch, archt::clone, create_archetype(), liv::dam, draw_ext_info(), draw_ext_info_format(), find_marked_object(), FLAG_ANIMATE, liv::food, liv::hp, obj::inv, obj::level, obj::map, MAX_BUF, MSG_TYPE_SPELL, MSG_TYPE_SPELL_ERROR, MSG_TYPE_SPELL_FAILURE, MSG_TYPE_SPELL_SUCCESS, NDI_UNIQUE, object_free2(), object_insert_in_map_at(), object_remove(), object_update_speed(), play_sound_map(), PREFER_HIGH, QUERY_FLAG, query_name(), random_roll(), SET_FLAG, SOUND_TYPE_ITEM, SP_level_dam_adjust(), obj::speed, obj::stats, obj::type, WAND, obj::x, and obj::y.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int remove_curse ( object op,
object caster,
object spell 
)

This function removes the cursed/damned status on equipped items.

Parameters
opwho is casting.
casterwhat is casting.
spellactual spell object.
Returns
how many items were affected.
Todo:
why is the value set to 0?

Definition at line 2348 of file spell_effect.c.

References caster_level(), CLEAR_FLAG, draw_ext_info(), esrv_update_item(), FLAG_APPLIED, FLAG_CURSED, FLAG_DAMNED, FLAG_KNOWN_CURSED, FOR_INV_FINISH, FOR_INV_PREPARE, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, MSG_TYPE_SPELL_SUCCESS, NDI_UNIQUE, PLAYER, QUERY_FLAG, obj::type, and UPD_FLAGS.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int write_mark ( object op,
object spell,
const char *  msg 
)

This writes a rune that contains the appropriate message.

There really aren't any adjustments we make.

Parameters
opwho is casting.
spellactual spell cast.
msgmessage to write.
Return values
0failure.
1success.

Definition at line 3354 of file spell_effect.c.

References add_string(), arch_to_object(), draw_ext_info(), HUGE_BUF, INS_BELOW_ORIGINATOR, llevInfo, LOG(), obj::map, MSG_TYPE_SPELL, MSG_TYPE_SPELL_ERROR, obj::name, NDI_UNIQUE, object_insert_in_map_at(), object_set_msg(), obj::other_arch, obj::race, strcasestr_local, obj::x, and obj::y.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

Variable Documentation

const char* const no_gain_msgs[NUM_STATS]
static
Initial value:
= {
"You grow no stronger.",
"You grow no more agile.",
"You don't feel any healthier.",
"no wis",
"You are no easier to look at.",
"no int",
"no pow"
}

This is used for the spells that gain stats.

There are no spells right now that icnrease wis/int/pow on a temp basis, so no good comments for those.

Definition at line 1833 of file spell_effect.c.

Referenced by cast_change_ability().