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

Spell-related helper functions. More...

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

Go to the source code of this file.

Functions

static int can_be_transmuted_to_flower (object *op)
 Determines if an item can be transmuted after a cast failure. More...
 
int cast_create_obj (object *op, object *new_op, int dir)
 Creates object new_op in direction dir or if that is blocked, beneath the player (op). More...
 
int cast_spell (object *op, object *caster, int dir, object *spell_ob, char *stringarg)
 Main dispatch when someone casts a spell. More...
 
int caster_level (const object *caster, const object *spell)
 This function returns the effective level the spell is being cast at. More...
 
void check_spell_expiry (object *spell)
 Checks if player should be warned of soon expiring spell. More...
 
objectcheck_spell_known (object *op, const char *name)
 Checks to see if player knows the spell. More...
 
void check_spells (void)
 It goes through the spells looking for any obvious errors. More...
 
void drain_rod_charge (object *rod)
 Drain charges from a rod. More...
 
void drain_wand_charge (object *wand)
 Drains a charge from a wand. More...
 
void dump_spells (void)
 Dumps all the spells - now also dumps skill associated with the spell. More...
 
objectfind_random_spell_in_ob (object *ob, const char *skill)
 This returns a random spell from 'ob'. More...
 
objectfind_target_for_friendly_spell (object *op, int dir)
 This function is commonly used to find a friendly target for spells such as heal or protection or armour. More...
 
int fire_arch_from_position (object *op, object *caster, int16_t x, int16_t y, int dir, object *spell)
 Fires an archetype. More...
 
static void handle_spell_confusion (object *op)
 This does a random effect for op, which tried to cast a spell in a confused state. More...
 
objectlookup_spell_by_name (object *op, const char *spname)
 Look at object 'op' and see if they know the spell spname. More...
 
int min_casting_level (const object *caster, const object *spell)
 This function takes a caster and spell and presents the effective level the caster needs to be to cast the spell. More...
 
int ok_to_put_more (mapstruct *m, int16_t x, int16_t y, object *op, uint32_t immune_stop)
 Returns true if it is ok to put spell op on the space/may provided. More...
 
static void prayer_failure (object *op, int failure, int power)
 Called when a player fails at casting a prayer. More...
 
static int put_a_monster (object *op, const char *monstername)
 Puts a monster named monstername near by op. More...
 
int reflwall (mapstruct *m, int x, int y, object *sp_op)
 Decides weither the (spell-)object sp_op will be reflected from the given mapsquare. More...
 
void regenerate_rod (object *rod)
 Regenerates a rod's charges. More...
 
void rod_adjust (object *rod)
 Adjusts rod attributes. More...
 
void set_spell_skill (object *op, object *caster, object *spob, object *dest)
 Utility function to assign the correct skill when casting. More...
 
void shuffle_attack (object *op, int change_face)
 This routine shuffles the attack of op to one of the ones in the list. More...
 
int SP_level_dam_adjust (const object *caster, const object *spob)
 Returns adjusted damage based on the caster. More...
 
int SP_level_duration_adjust (const object *caster, const object *spob)
 Adjust the duration of the spell based on level. More...
 
int SP_level_range_adjust (const object *caster, const object *spob)
 Adjust the range of the spell based on level. More...
 
int16_t SP_level_spellpoint_cost (object *caster, object *spell, int flags)
 Scales the spellpoint cost of a spell by it's increased effectiveness. More...
 
int SP_level_wc_adjust (const object *caster, const object *spob)
 Returns adjusted wc based on the caster and the spell. More...
 
static int spell_consume_items (object *op, const object *spell_ob)
 Check if the player attempting to cast a spell has the required items, and eat those. More...
 
void spell_effect (object *spob, int x, int y, mapstruct *map, object *originator)
 Inserts into map a spell effect based on other_arch. More...
 
void spell_failure (object *op, int failure, int power, object *skill)
 Handles the various effects for differing degrees of failure badness. More...
 
int spell_find_dir (mapstruct *m, int x, int y, object *exclude)
 Search what direction a spell should go in, first the center square then some close squares in the given map at the given coordinates for live objects. More...
 
void store_spell_expiry (object *spell)
 Stores in the spell when to warn player of expiration. More...
 
int summon_hostile_monsters (object *op, int n, const char *monstername)
 Summons hostile monsters and places them in nearby squares. More...
 
static void swap_random_stats (object *op)
 Randomly swaps 2 stats of op. More...
 
static void transmute_item_to_flower (object *op)
 This transforms one random item of op to a flower. More...
 

Variables

const char *const spell_mapping []
 

Detailed Description

Spell-related helper functions.

Definition in file spell_util.c.

Function Documentation

static int can_be_transmuted_to_flower ( object op)
static

Determines if an item can be transmuted after a cast failure.

Parameters
opitem to check.
Returns
1 if op can be transmuted, 0 else.
Note
can_be_tansmuted() has been renamed to can_be_transmuted_to_flower()

Definition at line 1211 of file spell_util.c.

References obj::invisible, POTION, ROD, SCROLL, obj::type, WAND, and WEAPON.

Referenced by transmute_item_to_flower().

Here is the caller graph for this function:

int cast_create_obj ( object op,
object new_op,
int  dir 
)

Creates object new_op in direction dir or if that is blocked, beneath the player (op).

This is really just a simple wrapper function .

Parameters
opwho is casting.
new_opobject to insert.
dirdirection to insert into. Can be 0 to insert below.
Returns
direction that the object was actually placed in.

Definition at line 535 of file spell_util.c.

References draw_ext_info(), freearr_x, freearr_y, get_map_flags(), GET_MAP_MOVE_BLOCK, INS_BELOW_ORIGINATOR, obj::map, MSG_TYPE_SPELL, MSG_TYPE_SPELL_INFO, NDI_UNIQUE, OB_TYPE_MOVE_BLOCK, object_insert_in_map_at(), P_OUT_OF_MAP, obj::x, and obj::y.

Referenced by cast_create_food(), cast_create_missile(), cast_create_town_portal(), and cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

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

Main dispatch when someone casts a spell.

Will decrease mana/gr points, check for skill, confusion and such.

Note that this function is really a dispatch routine that calls other functions - it just blindly returns what ever value those functions return. So if your writing a new function that is called from this, it should also return 1 on success, 0 on failure.

if it is a player casting the spell (op->type == PLAYER, op == caster), this function will decrease the mana/grace appropriately. For other objects, the caller should do what it considers appropriate.

Parameters
opcreature that is owner of the object that is casting the spell - eg, the player or monster.
casteractual object (wand, potion) casting the spell. can be same as op.
dirdirection to cast in. Note in some cases, if the spell is self only, dir really doesn't make a difference.
spell_obspell object that is being cast. From that, we can determine what to do. *
stringargany options that are being used. It can be NULL. Almost certainly, only players will set it. It is basically used as optional parameters to a spell (eg, item to create, information for marking runes, etc.
Returns
1 on successful cast, or 0 on error. These values should really be swapped, so that 0 is successful, and non zero is failure, with a code of what it failed.
Todo:
return a failure value?

Definition at line 1471 of file spell_util.c.

References alchemy(), obj::anim_suffix, animate_weapon(), apply_anim_suffix(), ARCH_SPELL_BLOCKED, ARCH_SPELL_BUNGLE, cast_bless(), cast_cause_disease(), cast_change_ability(), cast_change_map_lightlevel(), cast_cone(), cast_consecrate(), cast_create_food(), cast_create_missile(), cast_create_obj(), cast_create_town_portal(), cast_curse(), cast_destruction(), cast_detection(), cast_earth_to_dust(), cast_heal(), cast_identify(), cast_invisible(), cast_item_curse_or_curse(), cast_light(), cast_polymorph(), cast_raise_dead_spell(), cast_smite_spell(), cast_transfer(), cast_wonder(), cast_word_of_recall(), caster_level(), Settings::casting_time, obj::casting_time, change_skill(), obj::contr, create_archetype(), create_aura(), create_bomb(), determine_god(), dimension_door(), dispel_rune(), draw_ext_info(), draw_ext_info_format(), draw_magic_map(), pl::encumbrance, FABS, find_random_spell_in_ob(), find_skill_by_name(), fire_arch_from_position(), fire_bolt(), fire_swarm(), FIREWALL, FLAG_ALIVE, FLAG_CONFUSED, FLAG_MONSTER, FLAG_WIZ, FLAG_WIZCAST, freearr_x, freearr_y, get_cleric_chance(), get_map_flags(), liv::grace, handle_spell_confusion(), obj::level, llevError, LOG(), magic_wall(), obj::map, MAX, MAX_BUF, liv::maxgrace, min_casting_level(), mood_change(), MSG_TYPE_APPLY, MSG_TYPE_APPLY_ERROR, MSG_TYPE_SKILL, MSG_TYPE_SKILL_FAILURE, MSG_TYPE_SKILL_MISSING, MSG_TYPE_SPELL, MSG_TYPE_SPELL_ERROR, MSG_TYPE_SPELL_FAILURE, MSG_TYPE_SPELL_INFO, obj::name, NDI_UNIQUE, object_get_owner(), P_NO_CLERIC, P_NO_MAGIC, obj::path_attuned, obj::path_denied, obj::path_repelled, PATH_TIME_MULT, perceive_self(), pets_summon_golem(), pets_summon_object(), play_sound_map(), play_sound_player_only(), PLAYER, POTION, prayer_failure(), PREFER_HIGH, PREFER_LOW, probe(), QUERY_FLAG, query_name(), random_roll(), range_golem, range_magic, range_misc, range_none, recharge(), remove_curse(), rndm(), ROD, RUNE, SCROLL, settings, pl::shoottype, obj::skill, SOUND_TYPE_SPELL, liv::sp, SP_ALCHEMY, SP_ANIMATE_WEAPON, SP_AURA, SP_BLESS, SP_BOLT, SP_BOMB, SP_BULLET, SP_CAUSE_DISEASE, SP_CHANGE_ABILITY, SP_CHANGE_MANA, SP_CHANGE_MAP_LIGHT, SP_CHARGING, SP_CONE, SP_CONSECRATE, SP_CREATE_FOOD, SP_CREATE_MISSILE, SP_CURSE, SP_DESTRUCTION, SP_DETECTION, SP_DIMENSION_DOOR, SP_DISPEL_RUNE, SP_EARTH_TO_DUST, SP_ELEM_SHIELD, SP_FAERY_FIRE, SP_HEALING, SP_IDENTIFY, SP_INVISIBLE, SP_ITEM_CURSE_BLESS, SP_level_spellpoint_cost(), SP_LIGHT, SP_MAGIC_MAPPING, SP_MAGIC_MISSILE, SP_MAGIC_WALL, SP_MAKE_MARK, SP_MOOD_CHANGE, SP_MOVING_BALL, SP_PERCEIVE_SELF, SP_POLYMORPH, SP_PROBE, SP_RAISE_DEAD, SP_REMOVE_CURSE, SP_RUNE, SP_SMITE, SP_SUMMON_GOLEM, SP_SUMMON_MONSTER, SP_SWARM, SP_TOWN_PORTAL, SP_WONDER, SP_WORD_OF_RECALL, obj::speed, obj::speed_left, SPELL, obj::spell, spell_consume_items(), spell_effect(), spell_failure(), Settings::spell_failure_effects, SPELL_GRACE, SPELL_MANA, obj::spellarg, obj::stats, strdup_local, obj::subtype, TRUE, obj::type, WAND, liv::Wis, write_mark(), write_rune(), obj::x, and obj::y.

Referenced by altar_type_move_on(), cast_dust(), cast_wonder(), cfapi_object_cast(), command_cast_spell(), fire(), fire_misc_object(), monster_cast_spell(), monster_use_range(), move_firewall(), potion_type_apply(), scroll_type_apply(), spring_trap(), and START_TEST().

Here is the caller graph for this function:

int caster_level ( const object caster,
const object spell 
)

This function returns the effective level the spell is being cast at.

Note that I changed the repelled/attuned bonus to 2 from 5. This is because the new code compares casting_level against min_caster_level, so the difference is effectively 4

Parameters
casterperson casting the spell.
spellspell object.
Returns
adjusted level.

Definition at line 233 of file spell_util.c.

References obj::contr, pl::last_skill_ob, obj::level, NUM_SKILLS, obj::path_attuned, obj::path_repelled, PLAYER, obj::skill, and obj::type.

Referenced by animate_weapon(), cast_cause_disease(), cast_cone(), cast_consecrate(), cast_create_town_portal(), cast_detection(), cast_polymorph(), cast_raise_dead_spell(), cast_smite_spell(), cast_spell(), cast_transfer(), create_aura(), fire_arch_from_position(), fire_swarm(), magic_wall(), mood_change(), pets_summon_golem(), pets_summon_object(), remove_curse(), SP_level_dam_adjust(), SP_level_duration_adjust(), SP_level_range_adjust(), SP_level_spellpoint_cost(), SP_level_wc_adjust(), and write_rune().

Here is the caller graph for this function:

void check_spell_expiry ( object spell)

Checks if player should be warned of soon expiring spell.

Should be called at each move of the spell. Will use key stored by store_spell_expiry(). If the spell effect/force isn't in a player's inventory, won't do anything.

Parameters
spellforce or spell whose effects will expire.

Definition at line 2031 of file spell_util.c.

References draw_ext_info_format(), obj::duration, obj::env, MSG_TYPE_SPELL, MSG_TYPE_SPELL_INFO, obj::name, NDI_NAVY, NDI_UNIQUE, object_get_value(), PLAYER, and obj::type.

Referenced by move_aura(), and remove_force().

Here is the call graph for this function:

Here is the caller graph for this function:

object* check_spell_known ( object op,
const char *  name 
)

Checks to see if player knows the spell.

If the name is the same as an existing spell, we presume they know it.

Parameters
opobject we're looking into.
namespell name. Doesn't need to be a shared string.
Returns
1 if op knows the spell, 0 if it don't.

Definition at line 435 of file spell_util.c.

References object_find_by_type_and_name(), and SPELL.

Referenced by cfapi_object_check_spell(), command_learn_spell_or_prayer(), do_forget_spell(), do_learn_spell(), dragon_ability_gain(), god_intervention(), and spellbook_type_apply().

Here is the call graph for this function:

Here is the caller graph for this function:

void check_spells ( void  )

It goes through the spells looking for any obvious errors.

This was most useful in debugging when re-doing all the spells to catch simple errors. To use it all the time will result in it spitting out messages that aren't really errors.

Definition at line 109 of file spell_util.c.

References archt::clone, find_archetype(), first_archetype, llevDebug, llevError, LOG(), archt::name, archt::next, NUM_SKILLS, obj::skill, skill_names, SPELL, spell_mapping, and obj::type.

Here is the call graph for this function:

void drain_rod_charge ( object rod)

Drain charges from a rod.

Parameters
rodrod to drain.

Definition at line 819 of file spell_util.c.

References liv::hp, obj::inv, SP_level_spellpoint_cost(), SPELL_HIGHEST, and obj::stats.

Referenced by fire_misc_object(), and monster_use_range().

Here is the call graph for this function:

Here is the caller graph for this function:

void drain_wand_charge ( object wand)

Drains a charge from a wand.

Handles animation fix, and player update if required.

Parameters
wandwand to drain. Must be of type WAND.

Definition at line 829 of file spell_util.c.

References obj::arch, CLEAR_FLAG, archt::clone, esrv_update_item(), obj::face, FLAG_ANIMATE, liv::food, object_get_player_container(), object_update_speed(), obj::speed, obj::stats, obj::type, UPD_ANIM, and WAND.

Referenced by fire_misc_object(), and monster_use_range().

Here is the call graph for this function:

Here is the caller graph for this function:

void dump_spells ( void  )

Dumps all the spells - now also dumps skill associated with the spell.

not sure what this would be used for, as the data seems pretty minimal, but easy enough to keep around.

Definition at line 146 of file spell_util.c.

References archt::clone, first_archetype, obj::level, obj::name, archt::name, archt::next, obj::other_arch, obj::path_attuned, obj::skill, SPELL, and obj::type.

Referenced by init_beforeplay().

Here is the caller graph for this function:

object* find_random_spell_in_ob ( object ob,
const char *  skill 
)

This returns a random spell from 'ob'.

If skill is set, then the spell must be of this skill, it can be NULL in which case all matching spells are used.

Parameters
obobject to find spells in.
skillskill the spell should match, NULL if can match any spell.
Returns
random spell, or NULL if none found.
Todo:
change skill to sstring.

Definition at line 48 of file spell_util.c.

References FOR_INV_FINISH, FOR_INV_PREPARE, RANDOM, and SPELL.

Referenced by cast_spell(), and write_scroll().

Here is the caller graph for this function:

object* find_target_for_friendly_spell ( object op,
int  dir 
)

This function is commonly used to find a friendly target for spells such as heal or protection or armour.

Parameters
opwhat is looking for the target (which can be a player).
dirdirection we are looking in.
Returns
object found, or NULL if no good object.

Definition at line 856 of file spell_util.c.

References obj::above, obj::below, FLAG_MONSTER, FOR_MAP_FINISH, FOR_MAP_PREPARE, freearr_x, freearr_y, get_map_flags(), GET_MAP_OB, obj::inv, obj::map, object_get_owner(), P_OUT_OF_MAP, PLAYER, QUERY_FLAG, RUNE, TRANSPORT, obj::type, obj::x, and obj::y.

Referenced by cast_bless(), cast_change_ability(), and cast_heal().

Here is the call graph for this function:

Here is the caller graph for this function:

int fire_arch_from_position ( object op,
object caster,
int16_t  x,
int16_t  y,
int  dir,
object spell 
)

Fires an archetype.

Note
it uses op->map for the map for these coordinates, which is probably a really bad idea.
Parameters
opperson firing the object.
casterobject casting the spell.
x
ywhere to fire the spell.
dirdirection to fire in.
spellspell that is being fired. It uses other_arch for the archetype to fire.
Returns
0 on failure, 1 on success.
Todo:
check the note?
Note
fire_bullet() has been merged into fire_arch_from_position()

Definition at line 672 of file spell_util.c.

References absdir(), add_refcount(), arch_to_object(), AT_GODPOWER, AT_HOLYWORD, obj::attacktype, caster_level(), check_bullet(), liv::dam, obj::dam_modifier, obj::direction, DIRX, DIRY, draw_ext_info(), obj::duration, FLAG_REFLECTING, liv::food, get_map_flags(), GET_MAP_MOVE_BLOCK, liv::hp, obj::level, llevError, LOG(), obj::map, liv::maxhp, MSG_TYPE_SPELL, MSG_TYPE_SPELL_ERROR, obj::name, NDI_UNIQUE, ob_process(), OB_TYPE_MOVE_BLOCK, object_copy_owner(), object_free_drop_inventory(), object_get_owner(), object_insert_in_map_at(), object_set_owner(), object_update_turn_face(), obj::other_arch, P_OUT_OF_MAP, PLAYER, QUERY_FLAG, RANDOM, obj::range, set_spell_skill(), obj::slaying, SP_BULLET, SP_level_dam_adjust(), SP_level_duration_adjust(), SP_level_range_adjust(), SP_MAGIC_MISSILE, SP_MOVING_BALL, SPELL, obj::stats, obj::subtype, tailor_god_spell(), obj::type, obj::x, and obj::y.

Referenced by alchemy_failure_effect(), cast_spell(), and move_swarm_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

static void handle_spell_confusion ( object op)
static

This does a random effect for op, which tried to cast a spell in a confused state.

Note that random spell casting is handled in cast_spell itself.

Used for spell casting when confused.

Parameters
opplayer for which to produce a random effect.

Definition at line 1336 of file spell_util.c.

References RANDOM, swap_random_stats(), and transmute_item_to_flower().

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

object* lookup_spell_by_name ( object op,
const char *  spname 
)

Look at object 'op' and see if they know the spell spname.

This is pretty close to check_spell_known above, but it uses a looser matching mechanism.

Parameters
opobject we're searching the inventory.
spnamepartial spell name.
Returns
matching spell object, or NULL. If we match multiple spells but don't get an exact match, we also return NULL.

Definition at line 451 of file spell_util.c.

References FOR_INV_FINISH, FOR_INV_PREPARE, llevError, LOG(), and SPELL.

Referenced by command_cast_spell(), and command_forget_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

int min_casting_level ( const object caster,
const object spell 
)

This function takes a caster and spell and presents the effective level the caster needs to be to cast the spell.

Basically, it just adjusts the spell->level with attuned/repelled spellpaths.

Parameters
casterperson casting the spell.
spellspell object.
Returns
adjusted level.

Definition at line 203 of file spell_util.c.

References obj::level, MAX, obj::path_attuned, obj::path_denied, and obj::path_repelled.

Referenced by cast_spell(), SP_level_dam_adjust(), SP_level_duration_adjust(), SP_level_range_adjust(), and SP_level_wc_adjust().

Here is the caller graph for this function:

int ok_to_put_more ( mapstruct m,
int16_t  x,
int16_t  y,
object op,
uint32_t  immune_stop 
)

Returns true if it is ok to put spell op on the space/may provided.

Parameters
m
x
ycoordinates to test.
opspell to test for.
immune_stopbasically the attacktype of the spell (why passed as a different value, not sure of). If immune_stop has the AT_MAGIC bit set, and there is a counterwall on the space, the object doesn't get placed. if immune_stop does not have AT_MAGIC, then counterwalls do not effect the spell.
Returns
1 if we can add op, 0 else.

Definition at line 571 of file spell_util.c.

References ARROW, AT_COUNTERSPELL, AT_MAGIC, BOW, FLAG_MONSTER, FOR_MAP_FINISH, FOR_MAP_PREPARE, get_map_flags(), GET_MAP_MOVE_BLOCK, GOLEM, liv::maxhp, OB_SPELL_TAG_MATCH, OB_TYPE_MOVE_BLOCK, P_OUT_OF_MAP, PLAYER, QUERY_FLAG, Statistics::spell_suppressions, SPELL_TAG_SIZE, obj::spell_tags, statistics, obj::stats, obj::subtype, obj::type, and WEAPON.

Referenced by explosion(), and move_cone().

Here is the call graph for this function:

Here is the caller graph for this function:

static void prayer_failure ( object op,
int  failure,
int  power 
)
static

Called when a player fails at casting a prayer.

Parameters
opplayer.
failurebasically how much grace they had.
powerhow much grace the spell would normally take to cast.

Definition at line 1102 of file spell_util.c.

References cast_cone(), cast_magic_storm(), confuse_living(), create_archetype(), determine_god(), draw_ext_info(), draw_ext_info_format(), GOD_POWER, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, NDI_UNIQUE, object_free_drop_inventory(), paralyze_living(), and SPELL_WONDER.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

static int put_a_monster ( object op,
const char *  monstername 
)
static

Puts a monster named monstername near by op.

This creates the treasures for the monsters, and also deals with multipart monsters properly.

Parameters
opvictim.
monsternamemonster's archetype name.
Returns
1 if a monster was put, 0 else (no free space around the spot or invalid monster name).
Todo:
there is a multipart-aware archetype conversion function, use it.

Definition at line 981 of file spell_util.c.

References arch_to_object(), archt::clone, create_archetype(), create_treasure(), mapdef::difficulty, find_archetype(), freearr_x, freearr_y, GT_INVISIBLE, obj::head, obj::map, obj::more, archt::more, object_find_first_free_spot(), object_insert_in_map_at(), obj::randomitems, obj::x, and obj::y.

Referenced by summon_hostile_monsters().

Here is the call graph for this function:

Here is the caller graph for this function:

int reflwall ( mapstruct m,
int  x,
int  y,
object sp_op 
)

Decides weither the (spell-)object sp_op will be reflected from the given mapsquare.

Returns 1 if true.

(Note that for living creatures there is a small chance that reflect_spell fails.)

Caller should be sure it passes us valid map coordinates eg, updated for tiled maps.

Parameters
m
x
yposition of the object to test.
sp_opspell object to test.
Returns
1 if reflected, 0 else.

Definition at line 511 of file spell_util.c.

References FLAG_ALIVE, FLAG_REFL_SPELL, FOR_MAP_FINISH, FOR_MAP_PREPARE, obj::level, OUT_OF_REAL_MAP, QUERY_FLAG, and rndm().

Referenced by move_bolt(), and move_bullet().

Here is the call graph for this function:

Here is the caller graph for this function:

void regenerate_rod ( object rod)

Regenerates a rod's charges.

Parameters
rodrod to regenerate.

Definition at line 804 of file spell_util.c.

References liv::hp, liv::maxhp, and obj::stats.

Referenced by legacy_ob_process().

Here is the caller graph for this function:

void rod_adjust ( object rod)

Adjusts rod attributes.

This function must be called after a new rod has been created.

Parameters
rodthe rod to update

Definition at line 2062 of file spell_util.c.

References liv::hp, obj::inv, obj::level, MAX, liv::maxhp, SP_level_spellpoint_cost(), SPELL_HIGHEST, obj::stats, and obj::value.

Here is the call graph for this function:

void set_spell_skill ( object op,
object caster,
object spob,
object dest 
)

Utility function to assign the correct skill when casting.

Relatively simple function that gets used a lot. Basically, it sets up the skill pointer for the spell being cast. If op is really casting the spell, then the skill is whatever skill the spell requires. if instead caster (rod, horn, wand, etc) is casting the skill, then they get exp for the skill that you need to use for that object (use magic device).

Parameters
opobject casting the spell.
casterobject used to cast the spell (rod, wand, ...).
spobspell object.
destobject to set the skill for.

Definition at line 94 of file spell_util.c.

References add_refcount(), FREE_AND_CLEAR_STR, and obj::skill.

Referenced by animate_weapon(), cast_cause_disease(), cast_cone(), cast_smite_spell(), create_aura(), create_bomb(), fire_arch_from_position(), fire_bolt(), fire_swarm(), magic_wall(), mood_change(), pets_summon_golem(), pets_summon_object(), and write_rune().

Here is the call graph for this function:

Here is the caller graph for this function:

void shuffle_attack ( object op,
int  change_face 
)

This routine shuffles the attack of op to one of the ones in the list.

It does this at random. It also chooses a face appropriate to the attack that is being committed by that square at the moment.

right now it's being used by color spray and create pool of chaos.

This could really be a better implementation - the faces and attacktypes above are hardcoded, which is never good. The faces refer to faces in the animation sequence. Not sure how to do better - but not having it hardcoded would be nice.

I also fixed a bug here in that attacktype was |= - to me, that would be that it would quickly get all attacktypes, which probably wasn't the intent. MSW 2003-06-03

Parameters
opobject to change.
change_faceif set, also changes the face, else only changes the attacktype.

Definition at line 1081 of file spell_util.c.

References AT_MAGIC, ATTACKS, Chaos_Attacks::attacktype, obj::attacktype, rndm(), and SET_ANIMATION.

Referenced by hit_map().

Here is the call graph for this function:

Here is the caller graph for this function:

int SP_level_dam_adjust ( const object caster,
const object spob 
)

Returns adjusted damage based on the caster.

Parameters
casterwho is casting.
spobspell we are adjusting.
Returns
adjusted damage.

Definition at line 328 of file spell_util.c.

References caster_level(), obj::dam_modifier, and min_casting_level().

Referenced by alchemy(), animate_weapon(), append_spell(), cast_cause_disease(), cast_change_ability(), cast_cone(), cast_create_missile(), cast_destruction(), cast_identify(), cast_light(), cast_smite_spell(), cast_transfer(), create_aura(), create_bomb(), esrv_update_spells(), fire_arch_from_position(), fire_bolt(), magic_wall(), CREMainWindow::onReportSpellDamage(), pets_summon_golem(), pets_summon_object(), and recharge().

Here is the call graph for this function:

Here is the caller graph for this function:

int SP_level_duration_adjust ( const object caster,
const object spob 
)

Adjust the duration of the spell based on level.

This is basically the same as SP_level_dam_adjust() above, but instead looks at the level_modifier value.

Parameters
casterwho is casting.
spobspell we are adjusting.
Returns
adjusted duration.

Definition at line 353 of file spell_util.c.

References caster_level(), obj::duration_modifier, and min_casting_level().

Referenced by alchemy(), animate_weapon(), cast_bless(), cast_cause_disease(), cast_change_ability(), cast_cone(), cast_create_food(), cast_create_missile(), cast_curse(), cast_destruction(), cast_invisible(), cast_light(), cast_word_of_recall(), create_aura(), create_bomb(), fire_arch_from_position(), fire_bolt(), fire_swarm(), magic_wall(), and pets_summon_golem().

Here is the call graph for this function:

Here is the caller graph for this function:

int SP_level_range_adjust ( const object caster,
const object spob 
)

Adjust the range of the spell based on level.

This is basically the same as SP_level_dam_adjust() above, but instead looks at the level_modifier value.

Parameters
casterwho is casting.
spobspell we are adjusting.
Returns
adjusted range.

Definition at line 379 of file spell_util.c.

References caster_level(), min_casting_level(), and obj::range_modifier.

Referenced by animate_weapon(), cast_cause_disease(), cast_cone(), cast_destruction(), cast_detection(), cast_earth_to_dust(), cast_light(), cast_polymorph(), cast_smite_spell(), create_bomb(), dimension_door(), fire_arch_from_position(), fire_bolt(), magic_wall(), mood_change(), pets_summon_golem(), and probe().

Here is the call graph for this function:

Here is the caller graph for this function:

int16_t SP_level_spellpoint_cost ( object caster,
object spell,
int  flags 
)

Scales the spellpoint cost of a spell by it's increased effectiveness.

Some of the lower level spells become incredibly vicious at high levels. Very cheap mass destruction. This function is intended to keep the sp cost related to the effectiveness.

Note that it is now possible for a spell to cost both grace and mana. In that case, we return which ever value is higher.

Parameters
casterwhat is casting the spell.
spellspell object.
flagsone of Spell/grace points.
Returns
sp/mana points cost.

Definition at line 277 of file spell_util.c.

References caster_level(), liv::grace, obj::level, llevError, LOG(), MAX, liv::maxgrace, liv::maxsp, PATH_SP_MULT, settings, liv::sp, SPELL_GRACE, SPELL_HIGHEST, SPELL_MANA, Settings::spellpoint_level_depend, obj::stats, and TRUE.

Referenced by append_spell(), cast_spell(), drain_rod_charge(), esrv_update_spells(), fire_misc_object(), monster_cast_spell(), CREMainWindow::onReportSpellDamage(), rod_adjust(), show_matching_spells(), write_rune(), and write_scroll().

Here is the call graph for this function:

Here is the caller graph for this function:

int SP_level_wc_adjust ( const object caster,
const object spob 
)

Returns adjusted wc based on the caster and the spell.

Parameters
casterwho is casting.
spobspell we are adjusting.
Returns
adjusted wc (positive is best).

Definition at line 403 of file spell_util.c.

References caster_level(), min_casting_level(), and object_get_value().

Referenced by pets_summon_golem().

Here is the call graph for this function:

Here is the caller graph for this function:

static int spell_consume_items ( object op,
const object spell_ob 
)
static

Check if the player attempting to cast a spell has the required items, and eat those.

Will warn of insufficient resources if failure. Only eats if all items are found, else don't do anything.

Parameters
opwho is casting.
spell_obspell being cast.
Returns
0 if some items were missing, and warn player, 1 if all if ok.

Definition at line 1355 of file spell_util.c.

References draw_ext_info_format(), FOR_INV_FINISH, FOR_INV_PREPARE, MAX_BUF, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, NDI_UNIQUE, object_decrease_nrof(), object_get_value(), PLAYER, snprintf, split_string(), strdup_local, and obj::type.

Referenced by cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

void spell_effect ( object spob,
int  x,
int  y,
mapstruct map,
object originator 
)

Inserts into map a spell effect based on other_arch.

Parameters
spobspell object to insert object from.
x
y
mapcoordinates to put the effect at.
originatorwhat causes the effect to be inserted. Can be NULL.

Definition at line 183 of file spell_util.c.

References arch_to_object(), object_insert_in_map_at(), and obj::other_arch.

Referenced by cast_identify(), and cast_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

void spell_failure ( object op,
int  failure,
int  power,
object skill 
)

Handles the various effects for differing degrees of failure badness.

Parameters
opplayer that failed.
failurerandom value of how badly you failed.
powerhow many spellpoints you'd normally need for the spell.
skillskill needed to cast the spell.

Definition at line 1153 of file spell_util.c.

References AT_INTERNAL, cast_cone(), confuse_living(), obj::count, create_archetype(), liv::dam, draw_ext_info(), FALSE, get_map_flags(), hit_player(), isqrt(), obj::level, LOOSE_MANA, obj::map, liv::maxhp, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, NDI_UNIQUE, object_free_drop_inventory(), object_insert_in_map_at(), P_NO_MAGIC, paralyze_living(), obj::range, settings, Settings::spell_failure_effects, SPELL_WONDER, 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 spell_find_dir ( mapstruct m,
int  x,
int  y,
object exclude 
)

Search what direction a spell should go in, first the center square then some close squares in the given map at the given coordinates for live objects.

It will not consider the object given as exclude (= caster) among possible live objects. If the caster is a player, the spell will go after monsters/generators only. If not, the spell will hunt players only.

Exception is player on a battleground, who will be targeted unless excluded.

Parameters
m
x
ywhere to search from.
excludewhat object to avoid. Can be NULL, in which case all bets are off.
Returns
direction toward the first/closest live object if it finds any, otherwise -1.

Definition at line 929 of file spell_util.c.

References obj::above, can_see_monsterP(), FLAG_GENERATOR, FLAG_MONSTER, freearr_x, freearr_y, freedir, get_map_flags(), GET_MAP_OB, get_search_arr(), HEAD, op_on_battleground(), P_BLOCKSVIEW, P_OUT_OF_MAP, PLAYER, QUERY_FLAG, SIZEOFFREE, and obj::type.

Referenced by move_ball_spell(), and move_missile().

Here is the call graph for this function:

Here is the caller graph for this function:

void store_spell_expiry ( object spell)

Stores in the spell when to warn player of expiration.

Parameters
spellspell we're considering.

Definition at line 2006 of file spell_util.c.

References obj::duration, object_set_value(), and snprintf.

Referenced by cast_bless(), cast_change_ability(), create_aura(), and potion_type_apply().

Here is the call graph for this function:

Here is the caller graph for this function:

int summon_hostile_monsters ( object op,
int  n,
const char *  monstername 
)

Summons hostile monsters and places them in nearby squares.

Note
this is not used by any spells (summon evil monsters use to call this, but best I can tell, that spell/ability was never used. This is however used by various failures on the players part (alchemy, reincarnation, etc)
Parameters
opthe summoner.
nnumber of monsters.
monsternamename of the monster to summon, should be a valid archetype.
Returns
number of monsters actually put on the map.

Definition at line 1047 of file spell_util.c.

References put_a_monster().

Referenced by alchemy_failure_effect(), and cast_raise_dead_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

static void swap_random_stats ( object op)
static

Randomly swaps 2 stats of op.

Swapping is merely a FORCE inserted into op's inventory.

Used for spell casting when confused.

Parameters
opplayer who is the victim.

Definition at line 1301 of file spell_util.c.

References change_abil(), create_archetype(), draw_ext_info_format(), obj::duration, fix_object(), FLAG_APPLIED, FORCE_NAME, get_attr_value(), MSG_TYPE_VICTIM, MSG_TYPE_VICTIM_SPELL, NDI_UNIQUE, NUM_STATS, object_insert_in_ob(), object_update_speed(), RANDOM, rndm(), set_attr_value(), SET_FLAG, obj::speed, and obj::stats.

Referenced by handle_spell_confusion().

Here is the call graph for this function:

Here is the caller graph for this function:

static void transmute_item_to_flower ( object op)
static

This transforms one random item of op to a flower.

Only some items are considered, mostly magical ones.

Transformed item is put in a force in a flower, weights are adjusted.

See remove_force() in server/time.c to see object removal.

Parameters
opplayer who is the victim.

Definition at line 1233 of file spell_util.c.

References AP_IGNORE_CURSE, AP_NOPRINT, AP_UNAPPLY, apply_manual(), obj::below, can_be_transmuted_to_flower(), obj::contr, create_archetype(), draw_ext_info_format(), obj::duration, esrv_del_item(), esrv_send_item(), FLAG_APPLIED, FOR_INV_FINISH, FOR_INV_PREPARE, FORCE_NAME, FORCE_TRANSFORMED_ITEM, HUGE_BUF, MSG_TYPE_ITEM, MSG_TYPE_ITEM_CHANGE, NDI_UNIQUE, obj::nrof, object_insert_in_ob(), object_remove(), object_update_speed(), QUERY_FLAG, query_short_name(), rndm(), obj::speed, obj::subtype, and obj::weight.

Referenced by handle_spell_confusion().

Here is the call graph for this function:

Here is the caller graph for this function:

Variable Documentation

const char* const spell_mapping[]

Referenced by check_spells().