/**************************************************************************/
// magic_ja.cpp - spells/skills written by Jarren
/***************************************************************************
* The Dawn of Time v1.69r (c)1997-2004 Michael Garratt *
* >> A number of people have contributed to the Dawn codebase, with the *
* majority of code written by Michael Garratt - www.dawnoftime.org *
* >> To use this source code, you must fully comply with the dawn license *
* in licenses.txt... In particular, you may not remove this copyright *
* notice. *
**************************************************************************/
#include "include.h"
#include "magic.h"
// Local functions
DECLARE_DO_FUN( do_look );
/*helper prototypes*/
void char_from_room ( char_data *ch );
void char_to_room ( char_data *ch, ROOM_INDEX_DATA *pRoomIndex );
bool check_cold_shield(int level, char_data *ch, char_data *victim);
bool check_fire_shield(int level, char_data *ch, char_data *victim);
bool check_skin( char_data *ch, char_data *victim);
bool check_strength( int level, char_data *ch, char_data *victim, bool& half );
bool is_aff_fire_shield( char_data *ch, char_data *victim );
bool is_aff_cold_shield( char_data *ch, char_data *victim );
void landchar(char_data *ch);
/**************************************************************************/
SPRESULT spell_blink( int, int level, char_data *ch, void *vo, int )
{
int door = *(int *)vo; // the direction number (preparsed by cast)
EXIT_DATA *pexit;
bool nopass = false;
// can't blink out of combat
if ( ch->fighting )
{
ch->println( "You can't focus your mind enough to cast the spell." );
return NO_MANA;
}
// figure out the chance of blink going psyco
int number = 0, steps = 0, spaz = 0, spaz_chance;
int spaz_mod = ( level/20) + (get_skill(ch, gsn_blink)/20);
spaz_chance = spaz_mod*100;
if ( !IS_NPC( ch )) {
if(ch->pcdata->tired >= 20)
spaz_chance = spaz_chance/(2*spaz_mod);
if(ch->pcdata->tired < 20 && ch->pcdata->tired > 16)
spaz_chance = spaz_chance/(spaz_mod+2);
}
spaz = number_range(1, spaz_chance);
// number of rooms they are moving - how far they are going
number = number_range(1, level/8);
// dont let them blink thru nopass doors
if ( ch->in_room->exit[door] && IS_SET(ch->in_room->exit[door]->exit_info,EX_NOPASS)){
ch->println( "You attempt to blink in that direction but fail." );
return NO_MANA;
};
// start the blink
ch->println( "You feel yourself fold into another dimension and whisk away." );
act("$n blinks out of existance.",ch,NULL,NULL,TO_ROOM);
// while they can move in the direction let them continue
ROOM_INDEX_DATA *was_in_room=NULL;
ROOM_INDEX_DATA *to_room = ch->in_room;
for(pexit=ch->in_room->exit[door]; pexit; pexit = to_room->exit[door])
{
was_in_room = to_room;
to_room = pexit->u1.to_room;
ch->mana -= 15;
steps++;
if ( IS_SET(pexit->exit_info,EX_NOPASS))
{
ch->println( "You suddenly pop back into your realm and are sent sprawling!" );
act("$n suddenly pops into existance and clumsily crashes down.",ch,NULL,NULL,TO_ROOM);
ch->hit -= 5*steps;
char_from_room(ch);
char_to_room(ch, was_in_room);
ch->position = POS_RESTING;
landchar( ch );
do_look(ch, "auto");
return NO_MANA;
}
if(!can_see_room(ch,to_room)
|| IS_SET(to_room->room_flags, ROOM_SAFE)
|| IS_SET(to_room->room_flags, ROOM_PRIVATE)
|| IS_SET(to_room->room_flags, ROOM_SOLITARY)
|| IS_SET(to_room->room_flags, ROOM_NO_RECALL)
|| IS_SET(to_room->room_flags, ROOM_NOSCRY)
|| IS_SET(to_room->room_flags, ROOM_ANTIMAGIC)
|| IS_SET(to_room->area->area_flags, AREA_NOSCRY)
|| IS_SET(to_room->area->area_flags, AREA_NOGATEINTO)
|| IS_SET(to_room->room_flags, ROOM_NO_RECALL)
)
{
ch->println( "You suddenly pop back into your realm and are sent sprawling!" );
act("$n suddenly pops into existance and clumsily crashes down.",ch,NULL,NULL,TO_ROOM);
ch->hit -= 5*steps;
char_from_room(ch);
char_to_room(ch, was_in_room);
ch->position = POS_RESTING;
landchar( ch );
do_look(ch, "auto");
return NO_MANA;
}
if(to_room->clan && ch->clan != to_room->clan)
{
ch->println( "You suddenly pop back into your realm and are sent sprawling!" );
act("$n suddenly pops into existance and clumsily crashes down.",ch,NULL,NULL,TO_ROOM);
ch->hit -= 5*steps;
char_from_room(ch);
char_to_room(ch, was_in_room);
ch->position = POS_RESTING;
landchar( ch );
do_look(ch, "auto");
return NO_MANA;
}
if (--number<1) break;
if ( ch->mana < 15)
{
ch->println( "You suddenly pop back into your realm and are sent sprawling!" );
act("$n suddenly pops into existance and clumsily crashes down.",ch,NULL,NULL,TO_ROOM);
ch->hit -= 2*steps;
char_from_room(ch);
char_to_room(ch, to_room);
ch->position = POS_RESTING;
landchar( ch );
do_look(ch, "auto");
return NO_MANA;
}
}
if(spaz <= 3)
{
ch->wrapln( "You feel like you're spinning out of control. Pain starts to wash over your body as you feel like you are going to ripped apart." );
WAIT_STATE(ch, 8);
number = 40 - steps;
for(; pexit; pexit = to_room->exit[door])
{
was_in_room = to_room;
to_room = pexit->u1.to_room;
steps++;
number--;
if (number == 0) break;
if ( IS_SET(pexit->exit_info,EX_NOPASS))
{
nopass = true;
break;
}
if(ch->mana < 15)
ch->mana = 0;
else
ch->mana -= 15;
}
ch->hit = 3*ch->hit/4;
}
char_from_room(ch);
if ( nopass ){
char_to_room( ch, was_in_room );
}else{
char_to_room(ch, to_room);
}
if(number > 0){
ch->println( "You slam into something blunt and fall onto the floor!" );
act("$n suddenly pops into existance and clumsily crashes down.",ch,NULL,NULL,TO_ROOM);
ch->hit -= 2*steps;
landchar(ch);
ch->position = POS_RESTING;
}else{
ch->println( "You suddenly find yourself in a different place." );
act("$n suddenly pops into existance.",ch,NULL,NULL,TO_ROOM);
}
do_look(ch, "auto");
return NO_MANA;
}
/**************************************************************************/
SPRESULT spell_low_area_attack( int sn, int level, char_data *ch, void *,int )
{
char_data *vch;
char_data *vch_next;
int dam = level;
for ( vch = ch->in_room->people; vch; vch = vch_next )
{
vch_next=vch->next_in_room;
if ( vch->in_room == NULL )
continue;
if ( vch->in_room == ch->in_room )
{
if ( vch != ch && !is_safe_spell(ch,vch,true))
damage_spell( ch, vch, saves_spell( level, vch, DAMTYPE( sn ))
? dam / 2 : dam, sn, DAMTYPE(sn),true);
continue;
}
}
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_mid_area_attack( int sn, int level, char_data *ch, void *,int )
{
char_data *vch;
char_data *vch_next;
int dam = dice( 3, 5);
for ( vch = ch->in_room->people; vch; vch = vch_next )
{
vch_next=vch->next_in_room;
if ( vch->in_room == NULL )
continue;
if ( vch->in_room == ch->in_room )
{
if ( vch != ch && !is_safe_spell(ch,vch,true))
damage_spell( ch, vch, saves_spell( level, vch, DAMTYPE( sn ))
? dam / 2 : dam, sn, DAMTYPE(sn),true);
continue;
}
}
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_high_area_attack( int sn, int level, char_data *ch, void *,int )
{
char_data *vch;
char_data *vch_next;
int dam = dice( 5, 8);
for ( vch = ch->in_room->people; vch; vch = vch_next )
{
vch_next=vch->next_in_room;
if ( vch->in_room == NULL )
continue;
if ( vch->in_room == ch->in_room )
{
if ( vch != ch && !is_safe_spell(ch,vch,true))
damage_spell( ch, vch, saves_spell( level, vch, DAMTYPE( sn ))
? dam / 2 : dam, sn, DAMTYPE(sn),true);
continue;
}
}
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_rocky_skin( int sn, int level, char_data *ch, void *vo,int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
if(check_skin( ch, victim ))
return HALF_MANA;
int aff_mod = number_range(30, 40);
aff_mod += level/10;
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_AC;
af.modifier = -aff_mod;
af.bitvector = 0;
affect_to_char( victim, &af );
act( "$n's skin becomes rock hard!", victim, NULL, NULL, TO_ROOM );
victim->println( "Your skin becomes rock hard!" );
af.where = WHERE_VULN;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = VULN_ACID;
affect_to_char( victim, &af );
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_tough_skin( int sn, int level, char_data *ch, void *vo,int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
if(check_skin( ch, victim ))
return HALF_MANA;
int aff_mod = number_range(20, 40);
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_AC;
af.modifier = -aff_mod;
af.bitvector = 0;
affect_to_char( victim, &af );
act( "$n's skin looks much tougher now.", victim, NULL, NULL, TO_ROOM );
victim->println( "You feel you skin become leathery and tough." );
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_iron_skin( int sn, int level, char_data *ch, void *vo,int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
if(check_skin( ch, victim ))
return HALF_MANA;
int aff_mod = number_range(30, 40);
aff_mod += level/6;
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_AC;
af.modifier = -aff_mod;
af.bitvector = 0;
affect_to_char( victim, &af );
act( "$n's skin becomes hard as iron!", victim, NULL, NULL, TO_ROOM );
victim->println( "Your skin becomes hard as iron!" );
af.where = WHERE_VULN;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = VULN_LIGHTNING;
affect_to_char( victim, &af );
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_magical_vestment( int sn, int level, char_data *ch, void *vo,int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
int aff_mod = number_range(25, 40);
aff_mod += level/8;
if ( is_affected(victim, sn ) )
{
if (victim == ch){
ch->println( "You are already protected by a cloak of magic." );
}else{
ch->println( "They are already protected by a cloak of magic." );
}
return HALF_MANA;
}
if ( is_affected( ch, gsn_blessed_garments ) )
{
if (victim == ch){
ch->println( "You are already protected by blessed clothing." );
}else{
ch->println( "They are already protected by a cloak of magic." );
}
return HALF_MANA;
}
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_AC;
af.modifier = -aff_mod;
af.bitvector = 0;
affect_to_char( victim, &af );
act( "$n is surrounded by a cloak of magic.", victim, NULL, NULL, TO_ROOM );
victim->println( "You are surrounded by a cloak of magic." );
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_blessed_garments( int sn, int level, char_data *ch, void *vo,int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
int aff_mod = number_range(20, 40);
if ( is_affected( victim, sn ))
{
if (victim == ch){
ch->println( "You are already clothed with righteousness." );
}else{
ch->println( "They are already protected by a cloak of magic." );
}
return HALF_MANA;
}
if ( is_affected( ch, gsn_magical_vestment ) )
{
if (victim == ch){
ch->println( "You are already protected by magical clothing." );
}else{
ch->println( "They are already protected by a cloak of magic." );
}
return HALF_MANA;
}
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_AC;
af.modifier = -aff_mod;
af.bitvector = 0;
affect_to_char( victim, &af );
victim->println( "You feel as though you are clothed with righteousness." );
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_cyclone( int sn, int level, char_data *ch, void *vo, int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
if ( is_affected( victim, sn ) )
{
if (victim == ch)
ch->println( "You are already protected by the power of a cyclone." );
else
act("$N is already protected by the power of the cyclone.",ch,NULL,victim,TO_CHAR);
return HALF_MANA;
}
if ( is_affected( victim, gsn_wind_shield ) )
{
if (victim == ch)
ch->println( "The winds are protecting you as much as they can." );
else
act("$N is already protected by the winds.",ch,NULL,victim,TO_CHAR);
return HALF_MANA;
}
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
af.duration = ch->level/10;
af.modifier = (level+6)/-2;
af.location = APPLY_AC;
af.bitvector = 0;
affect_to_char( victim, &af );
victim->println( "You are enveloped within the eye of a cyclone." );
act("A roaring twister envelops $n.",victim,NULL,NULL,TO_ROOM);
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_shelter( int sn, int level, char_data *ch, void *vo,int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
if ( is_affected( victim, sn ) )
{
if (victim == ch)
ch->println( "You are already sheltered from harm." );
else
act("$N is already sheltered.",ch,NULL,victim,TO_CHAR);
return HALF_MANA;
}
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
af.duration = 8 + level;
af.location = APPLY_AC;
af.modifier = -20;
af.bitvector = 0;
affect_to_char( victim, &af );
act( "$n is sheltered from harm.", victim, NULL, NULL, TO_ROOM );
victim->println( "You are sheltered from harm." );
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_oak_shield( int sn, int level, char_data *ch, void *vo, int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
if ( is_affected( victim, sn ) )
{
if (victim == ch)
ch->println( "You already have a shield of oak." );
else
act("$N already has a shield of oak.",ch,NULL,victim,TO_CHAR);
return HALF_MANA;
}
if ( is_affected( victim, gsn_shield ))
{
if (victim == ch)
ch->println( "You already have a shield spell on you." );
else
act("$N is already protected by a shield spell.",ch,NULL,victim,TO_CHAR);
return HALF_MANA;
}
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
af.duration = 24;
af.modifier = -25;
af.location = APPLY_AC;
af.bitvector = 0;
affect_to_char( victim, &af );
victim->println( "A shield of oak forms around you." );
if ( ch != victim )
act("$N is protected by your oak shield.",ch,NULL,victim,TO_CHAR);
return HALF_MANA;
}
/**************************************************************************/
SPRESULT spell_ogre_strength(int sn,int level,char_data *ch,void *vo,int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
bool half = false;
if(check_strength(level, ch, victim, half))
return FULL_MANA;
if(half)
return HALF_MANA;
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_ST;
af.modifier = 1 + level/6;
af.bitvector = 0;
affect_to_char( victim, &af );
victim->println( "Your muscles surge with heightened power!" );
act("$n's muscles surge with heightened power.",victim,NULL,NULL,TO_ROOM);
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_dragon_strength(int sn,int level,char_data *ch,void *vo,int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
bool half = false;
if(check_strength(level, ch, victim, half))
return FULL_MANA;
if(half)
return HALF_MANA;
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
af.duration = level;
af.location = APPLY_ST;
af.modifier = 1 + level/4;
af.bitvector = 0;
affect_to_char( victim, &af );
victim->println( "Your muscles surge with heightened power!" );
act("$n's muscles surge with heightened power.",victim,NULL,NULL,TO_ROOM);
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_fiery_armour( int sn, int level, char_data *ch, void *vo,int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
if ( is_aff_fire_shield( ch, victim ))
return HALF_MANA;
else if ( check_cold_shield(level, ch, victim))
return FULL_MANA;
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
if (victim == ch)
af.duration = level/5;
else
af.duration = level/10;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( victim, &af );
af.where = WHERE_RESIST;
af.bitvector = RES_COLD;
affect_to_char( victim, &af );
af.where = WHERE_VULN;
af.bitvector = VULN_FIRE;
affect_to_char( victim, &af );
victim->println( "You become armoured with fire." );
act("$n becomes armoured with fire.",victim,NULL,NULL,TO_ROOM);
if ( ch != victim )
ch->println( "Ok." );
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_wall_of_fire( int sn, int level, char_data *ch, void *vo,int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
if ( is_aff_fire_shield( ch, victim ))
return HALF_MANA;
else if ( check_cold_shield(level, ch, victim))
return FULL_MANA;
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
if (victim == ch)
af.duration = level/5;
else
af.duration = level/10;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( victim, &af );
af.where = WHERE_RESIST;
af.bitvector = RES_COLD;
affect_to_char( victim, &af );
af.where = WHERE_VULN;
af.bitvector = VULN_FIRE;
victim->println( "You are surrounded by a wall of fire." );
act("$n is surrounded by a wall of fire.",victim,NULL,NULL,TO_ROOM);
if ( ch != victim )
ch->println( "Ok." );
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_icy_armour( int sn, int level, char_data *ch, void *vo,int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
if ( is_aff_cold_shield( ch, victim ))
return HALF_MANA;
else if ( check_fire_shield(level, ch, victim))
return FULL_MANA;
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
if (victim == ch)
af.duration = level/5;
else
af.duration = level/10;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( victim, &af );
af.where = WHERE_RESIST;
af.bitvector = RES_FIRE;
affect_to_char( victim, &af );
af.where = WHERE_VULN;
af.bitvector = VULN_COLD;
affect_to_char( victim, &af );
victim->println( "You become armoured with ice." );
act("$n becomes armoured with ice.",victim,NULL,NULL,TO_ROOM);
if ( ch != victim )
ch->println( "Ok." );
return FULL_MANA;
}
/**************************************************************************/
SPRESULT spell_wall_of_ice( int sn, int level, char_data *ch, void *vo,int )
{
char_data *victim = (char_data *) vo;
AFFECT_DATA af;
if ( is_aff_cold_shield( ch, victim ))
return HALF_MANA;
else if ( check_fire_shield(level, ch, victim))
return FULL_MANA;
af.where = WHERE_AFFECTS;
af.type = sn;
af.level = level;
if (victim == ch)
af.duration = level/5;
else
af.duration = level/10;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( victim, &af );
af.where = WHERE_RESIST;
af.bitvector = RES_FIRE;
affect_to_char( victim, &af );
af.where = WHERE_VULN;
af.bitvector = VULN_COLD;
victim->println( "You are surrounded by a wall of ice." );
act("$n is surrounded by a wall of ice.",victim,NULL,NULL,TO_ROOM);
if ( ch != victim )
ch->println( "Ok." );
return FULL_MANA;
}
/**************************************************************************/
// helper function for fire/cold shield type spells
bool is_aff_fire_shield( char_data *ch, char_data *victim )
{
if ( is_affected( victim, gsn_fire_shield ))
{
if (victim == ch)
ch->println( "You already have a fire shield." );
else
act("$N already has a shield of fire.",ch,NULL,victim,TO_CHAR);
return true;
}
if ( is_affected( victim, gsn_wall_of_fire ))
{
if (victim == ch)
ch->println( "You are already surrounded by fire." );
else
act("$N is already surrounded by fire.",ch,NULL,victim,TO_CHAR);
return true;
}
if ( is_affected( victim, gsn_fiery_armour ))
{
if (victim == ch)
ch->println( "You already have armour of fire." );
else
act("$N already has armour of fire.",ch,NULL,victim,TO_CHAR);
return true;
}
else
return false;
}
/**************************************************************************/
// helper function for fire/cold shield type spells
bool is_aff_cold_shield( char_data *ch, char_data *victim )
{
if ( is_affected( victim, gsn_chill_shield ))
{
if (victim == ch)
ch->println( "You already have a chill shield." );
else
act("$N already has a shield of icy magic.",ch,NULL,victim,TO_CHAR);
return true;
}
if ( is_affected( victim, gsn_wall_of_ice ))
{
if (victim == ch)
ch->println( "You're already surrounded by ice." );
else
act("$N is already surrounded by ice.",ch,NULL,victim,TO_CHAR);
return true;
}
if ( is_affected( victim, gsn_icy_armour ))
{
if (victim == ch)
ch->println( "You already have armour of ice." );
else
act("$N already has armour of ice.",ch,NULL,victim,TO_CHAR);
return true;
}
else
return false;
}
/**************************************************************************/
// helper function for fire/cold shield type spells
bool check_cold_shield(int level, char_data *ch, char_data *victim)
{
if (is_affected(victim, gsn_icy_armour ))
{
if (check_dispel(level,victim, gsn_icy_armour ))
{
act( "$n's armour of ice melts away.", victim, NULL, NULL, TO_ROOM );
return true;
}
ch->println( "Spell failed." );
return true;
}
else if (is_affected(victim, gsn_chill_shield ))
{
if (check_dispel(level,victim, gsn_chill_shield ))
{
act( "$n's chill shield is destroyed.", victim, NULL, NULL, TO_ROOM );
return true;
}
ch->println( "Spell failed." );
return true;
}
else if (is_affected(victim, gsn_wall_of_ice ))
{
if (check_dispel(level,victim, gsn_wall_of_ice ))
{
act( "$n's wall of ice melts away.", victim, NULL, NULL, TO_ROOM );
return true;
}
ch->println( "Spell failed." );
return true;
}
else
return false;
}
/**************************************************************************/
// helper function for fire/cold shield type spells
bool check_fire_shield(int level, char_data *ch, char_data *victim)
{
if (is_affected(victim, gsn_fire_shield ))
{
if (check_dispel(level,victim, gsn_fire_shield ))
{
act( "$n's fire shield is quelled.", victim, NULL, NULL, TO_ROOM );
return true;
}
ch->println( "Spell failed." );
return true;
}
else if (is_affected(victim, gsn_fiery_armour ))
{
if (check_dispel(level,victim, gsn_fiery_armour ))
{
act( "$n's armour of fire is quelled.", victim, NULL, NULL, TO_ROOM );
return true;
}
ch->println( "Spell failed." );
return true;
}
else if (is_affected(victim, gsn_wall_of_fire ))
{
if (check_dispel(level,victim, gsn_wall_of_fire ))
{
act( "$n's wall of fire is destroyed.", victim, NULL, NULL, TO_ROOM );
return true;
}
ch->println( "Spell failed." );
return true;
}
else
return false;
}
/**************************************************************************/
// helper func for skin spells
bool check_skin( char_data *ch, char_data *victim)
{
if( is_affected( victim, gsn_iron_skin )
|| is_affected( victim, gsn_barkskin )
|| is_affected( victim, gsn_rocky_skin )
|| is_affected( victim, gsn_tough_skin )
|| is_affected( victim, gsn_stone_skin ))
{
if (victim == ch)
ch->println( "Your skin has already been altered." );
else
act("$N's skin has already been altered.",ch,NULL,victim,TO_CHAR);
return true;
}
else
return false;
}
/**************************************************************************/
// helper func for strength spells
bool check_strength( int level, char_data *ch, char_data *victim, bool& half )
{
if( is_affected( victim, gsn_weaken ))
{
if( check_dispel( level, victim, gsn_weaken ))
{
act( "Your magic unravels a spell on $N.", ch, NULL, victim, TO_CHAR );
return true;
}
else
{
ch->println( "You failed." );
return true;
}
}
if ( is_affected( victim, gsn_giant_strength )
|| is_affected( victim, gsn_ogre_strength )
|| is_affected( victim, gsn_dragon_strength ))
{
if (victim == ch)
ch->println( "Your strength has already been heightened." );
else
act("$N's strength has already been heightened.",ch,NULL,victim,TO_CHAR);
half = true;
return false;
}
return false;
}
/**************************************************************************/
SPRESULT spell_create_bouquet( int , int , char_data *ch, void *,int )
{
OBJ_DATA *rose;
if (get_obj_index(OBJ_VNUM_ROSE)){
rose = create_object(get_obj_index(OBJ_VNUM_ROSE));
replace_string(rose->description,
"A bouquet of red roses sparkling with natures bloom lies here." );
replace_string(rose->short_descr,
"a bouquet of beautiful red roses" );
replace_string(rose->name, "bouquet red roses" );
replace_string(rose->material, "flowers" );
rose->wear_flags = OBJWEAR_TAKE + OBJWEAR_HOLD;
rose->item_type = ITEM_TRASH;
rose->extra_flags = OBJEXTRA_GLOW + OBJEXTRA_BLESS + OBJEXTRA_NO_DEGRADE;
act("$n has created a bouquet of beautiful red roses!",ch,rose,NULL,TO_ROOM);
ch->println( "You create a bouquet of beautiful red roses!" );
obj_to_char(rose,ch);
}else{
ch->println( "BUG: No available object in spell_create_bouquet - please report to code!" );
return NO_MANA;
}
return FULL_MANA;
}
/**************************************************************************/