/***********************************************************************
* The wraith class file was written completly by Danlas *
* This C written code is copyright of the Angels of Apocalypse *
* And is not to be sold by any individual without permission of the *
* owner. If any questions arrise about the wraith class please *
* contact me at danlas70@hotmail.com *
***********************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "player.h"
#include "wraith.h"
const char * arcanoi_name [11] =
{
"Argos", "Castigate",
"Embody", "Lifeweb",
"Fatalism", "Moliate",
"Inhabit", "Outrage",
"Keening", "Pandemonium",
"Puppetry"
};
bool is_wraith( CHAR_DATA *ch )
{
if ( IS_NPC(ch) ) return FALSE;
if ( IS_CLASS(ch, CLASS_WRAITH))
return TRUE;
else
return FALSE;
}
bool can_travel(CHAR_DATA *ch, CHAR_DATA *victim)
{
if (IS_IMMORTAL(victim))
{
send_to_char("If they wanted your presence they'd command it.\n\r",ch);
return FALSE;
}
if (!IS_NPC(victim) && IS_SET(victim->immune, IMM_SUMMON) && victim->fight_timer > 0 )
{
stc("They dont currently require your presense,\n\r", ch);
return FALSE;
}
if (IS_NPC(victim) && victim->level > 150)
{
stc("They are too powerful!\n\r", ch);
return FALSE;
}
if (victim->in_room == ch->in_room)
{
send_to_char("But you're already there!\n\r",ch);
return FALSE;
}
return TRUE;
}
bool can_travel_obj(CHAR_DATA *ch, OBJ_DATA *obj)
{
if (obj->in_room == NULL)
{
stc("It is not in a room....\n\r",ch);
return FALSE;
}
if ( IS_SET(obj->quest, QUEST_ARTIFACT) || IS_SET(obj->quest, ITEM_EQUEST)
|| IS_SET(obj->quest, QUEST_RELIC) )
{
act("You attempt to jump to $p, but it is unlocatable.",ch,obj,NULL,TO_CHAR);
return FALSE;
}
return TRUE;
}
void do_sellbody( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_IMMUNE(ch, IMM_WRAITH))
{
send_to_char( "You now allow a wraith to slay your humanly body.\n\r", ch );
SET_BIT(ch->immune, IMM_WRAITH);
return;
}
send_to_char( "Wraiths can no longer take your human body.\n\r", ch );
REMOVE_BIT(ch->immune, IMM_WRAITH);
return;
}
void do_fetter( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg [MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if ( !IS_CLASS(ch, CLASS_WRAITH) || ch->pcdata->stats[UNI_GEN] > 2)
{
send_to_char("Huh?\n\r", ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Slay whom?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "Not on NPC's.\n\r", ch );
return;
}
if ( IS_IMMORTAL(victim) )
{
send_to_char( "Not on Immortals's.\n\r", ch );
return;
}
if ( ch == victim )
{
send_to_char( "You have no body to slay.\n\r", ch );
return;
}
if (IS_CLASS(victim, CLASS_WRAITH))
{
send_to_char( "They have no body to slay.\n\r", ch );
return;
}
if ( victim->level != LEVEL_AVATAR && !IS_IMMORTAL(victim) )
{
send_to_char( "You can only slay those not strong enough to resist death.\n\r", ch );
return;
}
if (victim->class != 0)
{
send_to_char("They have already chosen their path.\n\r", ch );
return;
}
if (!IS_IMMUNE(victim,IMM_WRAITH))
{
send_to_char( "They do not allow you to slay their human body.\n\r", ch );
return;
}
if (ch->exp < 100000)
{
send_to_char("You cannot afford the 100000 exp required to slay them.\n\r",ch);
return;
}
if (victim->exp < 100000)
{
send_to_char("They cannot afford the 100000 exp required to be slayed.\n\r",ch);
return;
}
ch->exp -= 100000;
victim->exp -= 100000;
act("You slay the body of $N and they become a wraith.", ch, NULL, victim, TO_CHAR);
act("$n slays $N, making them a wraith.", ch, NULL, victim, TO_NOTVICT);
act("$n slays your body and you become a wraith.", ch, NULL, victim, TO_VICT);
victim->class = CLASS_WRAITH;
send_to_char( "You are now a wraith.\n\r", victim );
free_string(victim->lord);
free_string(victim->clan);
victim->clan = str_dup(ch->clan);
victim->lord = str_dup(ch->name);
victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
save_char_obj(ch);
save_char_obj(victim);
return;
}
void do_manifest( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if ( IS_NPC(ch)) return;
if ( !IS_CLASS( ch, CLASS_WRAITH ) )
{
send_to_char( "You do not have the ability to manifest.\n\r", ch);
return;
}
if (ch->position == POS_FIGHTING)
{
stc("Not while fighting!\n\r", ch);
return;
}
if ( !IS_WRATED( ch, WRAT_DEATHPLANE) && IS_CLASS( ch, CLASS_WRAITH ) )
{
send_to_char( "You dissipate back into the realm of the dead.\n\r", ch );
SET_BIT( ch->wbits, WRAT_DEATHPLANE );
return;
}
else if ( IS_WRATED( ch, WRAT_DEATHPLANE ) && IS_CLASS( ch, CLASS_WRAITH ) )
{
send_to_char( "You fade into the realm of the living.\n\r", ch );
REMOVE_BIT( ch->wbits, WRAT_DEATHPLANE );
if ( IS_SET( ch->wbits, WRAT_ENSHROUD ) )
REMOVE_BIT( ch->wbits, WRAT_ENSHROUD );
return;
}
}
void do_arcanoi( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int cost,disc;
cost = 0;
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_WRAITH))
{
send_to_char( "Gibberish, nothing but gibberish.", ch );
return;
}
if ( arg1[0] == '\0' )
{
stc( "#y++++++======------<<>><<>><<>><<>>#C Arcanoi #y<<>><<>><<>><<>>------======++++++#n\n\r", ch );
sprintf( buf,"#y[*-*] #CArgos #y[#e%s%s%s%s%s#y] #CEmbody #y[#e%s%s%s%s%s#y] #CFatalism #y[#e%s%s%s%s%s#y] #y[*-*]#n\n\r",
ch->arcanoi[WARGO] >= 1 ? "*" : " ",
ch->arcanoi[WARGO] >= 2 ? "*" : " ",
ch->arcanoi[WARGO] >= 3 ? "*" : " ",
ch->arcanoi[WARGO] >= 4 ? "*" : " ",
ch->arcanoi[WARGO] >= 5 ? "*" : " ",
ch->arcanoi[WBODY] >= 1 ? "*" : " ",
ch->arcanoi[WBODY] >= 2 ? "*" : " ",
ch->arcanoi[WBODY] >= 3 ? "*" : " ",
ch->arcanoi[WBODY] >= 4 ? "*" : " ",
ch->arcanoi[WBODY] >= 5 ? "*" : " ",
ch->arcanoi[WFATL] >= 1 ? "*" : " ",
ch->arcanoi[WFATL] >= 2 ? "*" : " ",
ch->arcanoi[WFATL] >= 3 ? "*" : " ",
ch->arcanoi[WFATL] >= 4 ? "*" : " ",
ch->arcanoi[WFATL] >= 5 ? "*" : " " );
send_to_char( buf, ch );
sprintf( buf, "#y[*-*] #CInhabit#y [#e%s%s%s%s%s#y] #CKeening #y[#e%s%s%s%s%s#y] #CLifeweb #y[#e%s%s%s%s%s#y] #CMoliate#y [#e%s%s%s%s%s#y] [*-*]\n\r",
ch->arcanoi[WINHB] >= 1 ? "*" : " ",
ch->arcanoi[WINHB] >= 2 ? "*" : " ",
ch->arcanoi[WINHB] >= 3 ? "*" : " ",
ch->arcanoi[WINHB] >= 4 ? "*" : " ",
ch->arcanoi[WINHB] >= 5 ? "*" : " ",
ch->arcanoi[WKEEN] >= 1 ? "*" : " ",
ch->arcanoi[WKEEN] >= 2 ? "*" : " ",
ch->arcanoi[WKEEN] >= 3 ? "*" : " ",
ch->arcanoi[WKEEN] >= 4 ? "*" : " ",
ch->arcanoi[WKEEN] >= 5 ? "*" : " ",
ch->arcanoi[WLIFE] >= 1 ? "*" : " ",
ch->arcanoi[WLIFE] >= 2 ? "*" : " ",
ch->arcanoi[WLIFE] >= 3 ? "*" : " ",
ch->arcanoi[WLIFE] >= 4 ? "*" : " ",
ch->arcanoi[WLIFE] >= 5 ? "*" : " ",
ch->arcanoi[WMATE] >= 1 ? "*" : " ",
ch->arcanoi[WMATE] >= 2 ? "*" : " ",
ch->arcanoi[WMATE] >= 3 ? "*" : " ",
ch->arcanoi[WMATE] >= 4 ? "*" : " ",
ch->arcanoi[WMATE] >= 5 ? "*" : " " );
send_to_char( buf, ch );
sprintf( buf, "#y[*-*] #COutrage#y[#e%s%s%s%s%s#y] #CPandemonium#y[#e%s%s%s%s%s#y] [*-*]#n\n\r",
ch->arcanoi[WRAGE] >= 1 ? "*" : " ",
ch->arcanoi[WRAGE] >= 2 ? "*" : " ",
ch->arcanoi[WRAGE] >= 3 ? "*" : " ",
ch->arcanoi[WRAGE] >= 4 ? "*" : " ",
ch->arcanoi[WRAGE] >= 5 ? "*" : " ",
ch->arcanoi[WPAND] >= 1 ? "*" : " ",
ch->arcanoi[WPAND] >= 2 ? "*" : " ",
ch->arcanoi[WPAND] >= 3 ? "*" : " ",
ch->arcanoi[WPAND] >= 4 ? "*" : " ",
ch->arcanoi[WPAND] >= 5 ? "*" : " " );
send_to_char( buf, ch );
stc( "#y++++++======------<<>><<>><<>><<>>---------<<>><<>><<>><<>>------======++++++#n\n\r", ch );
return;
}
if ( arg2[0] == '\0' )
{
if ( !str_prefix( arg1, "Argos" ) )
{
if (ch->arcanoi[WARGO] == 0)
{
stc( "You know nothing of this.\n\r", ch );
return;
}
if (ch->arcanoi[WARGO] >= 1)
{
divide_to_char(ch);
centre_text( "Arcanoi Argos",ch);
divide_to_char(ch);
centre_text("Enshroud",ch);
}
if (ch->arcanoi[WARGO] >= 2)
centre_text("Shadow Wings",ch);
if (ch->arcanoi[WARGO] >= 3)
centre_text("Flickering",ch);
if (ch->arcanoi[WARGO] >= 4)
centre_text("Jump",ch);
if (ch->arcanoi[WARGO] >= 5)
centre_text("Oubliette",ch);
divide_to_char(ch);
return;
}
if (!str_prefix( arg1, "Embody" ) )
{
divide_to_char(ch);
centre_text( "Arcanoi Embody",ch);
divide_to_char(ch);
if (ch->arcanoi[WBODY] == 0)
stc("Upkeep in the material plane costs you 250 move and 300 hp.\n\r", ch );
if (ch->arcanoi[WBODY] == 1)
stc("Upkeep in the material plane costs you 200 move and 200 hp.\n\r",ch);
if (ch->arcanoi[WBODY] == 2)
stc("Upkeep in the material plane costs you 175 move and 150 hp.\n\r",ch);
if (ch->arcanoi[WBODY] == 3)
stc("Upkeep in the material plane costs you 150 move and 100 hp.\n\r",ch);
if (ch->arcanoi[WBODY] == 4)
stc("Upkeep in the material plane costs you 100 move and 50 hp.\n\r",ch);
if (ch->arcanoi[WBODY] == 5)
stc("Upkeep in the material plane costs you 50 move and 25 hp.\n\r",ch);
divide_to_char(ch);
return;
}
if (!str_prefix( arg1, "Fatalism" ) )
{
divide_to_char(ch);
centre_text( "Arcanoi Fatalism",ch);
divide_to_char(ch);
centre_text( "Hitroll and Damroll Bonus", ch);
if (ch->arcanoi[WFATL] == 0)
centre_text("0", ch );
if (ch->arcanoi[WFATL] == 1)
centre_text("50",ch);
if (ch->arcanoi[WFATL] == 2)
centre_text("100",ch);
if (ch->arcanoi[WFATL] == 3)
centre_text("250",ch);
if (ch->arcanoi[WFATL] == 4)
centre_text("500",ch);
if (ch->arcanoi[WFATL] == 5)
centre_text("600",ch);
divide_to_char(ch);
return;
}
if (!str_prefix( arg1, "Inhabit" ) )
{
if (ch->arcanoi[WINHB] == 0)
{
stc( "You know nothing of this.\n\r", ch );
return;
}
if (ch->arcanoi[WINHB] >= 1)
{
divide_to_char(ch);
centre_text( "Arcanoi Inhabit",ch);
divide_to_char(ch);
centre_text("Sense Grimlin",ch);
}
if (ch->arcanoi[WINHB] >= 2)
centre_text("Gremlinize",ch);
if (ch->arcanoi[WINHB] >= 3)
centre_text("Empower",ch);
if (ch->arcanoi[WINHB] >= 4)
centre_text("Shellride",ch);
if (ch->arcanoi[WINHB] >= 5)
centre_text("Surge",ch);
divide_to_char(ch);
return;
}
if (!str_prefix( arg1, "Keening" ) )
{
if (ch->arcanoi[WKEEN] == 0)
{
stc( "You know nothing of this.\n\r", ch );
return;
}
if (ch->arcanoi[WKEEN] >= 1)
{
divide_to_char(ch);
centre_text( "Arcanoi of Keening",ch);
divide_to_char(ch);
centre_text("Dirge",ch);
}
if (ch->arcanoi[WKEEN] >= 2)
centre_text("Ballad",ch);
if (ch->arcanoi[WKEEN] >= 3)
centre_text("Requiem",ch);
if (ch->arcanoi[WKEEN] >= 4)
centre_text("Lullaby",ch);
if (ch->arcanoi[WKEEN] >= 5)
centre_text("Crescendo",ch);
divide_to_char(ch);
return;
}
if (!str_prefix( arg1, "Lifeweb" ) )
{
if (ch->arcanoi[WLIFE] == 0)
{
stc( "You know nothing of this.\n\r", ch );
return;
}
if (ch->arcanoi[WLIFE] >= 1)
{
divide_to_char(ch);
centre_text( "Arcanoi Lifeweb",ch);
divide_to_char(ch);
centre_text("Cut Strand",ch);
}
if (ch->arcanoi[WLIFE] >= 2)
centre_text("Web Sense",ch);
if (ch->arcanoi[WLIFE] >= 3)
centre_text("Splice Strand",ch);
if (ch->arcanoi[WLIFE] >= 4)
centre_text("Dead Sight",ch);
if (ch->arcanoi[WLIFE] >= 5)
centre_text("Soul Pact",ch);
divide_to_char(ch);
return;
}
if (!str_prefix( arg1, "Moliate" ) )
{
if (ch->arcanoi[WMATE] == 0)
{
stc( "You know nothing of this.\n\r", ch );
return;
}
if (ch->arcanoi[WMATE] >= 1)
{
divide_to_char(ch);
centre_text( "Arcanoi Moliate",ch);
divide_to_char(ch);
centre_text("Imitate",ch);
}
if (ch->arcanoi[WMATE] >= 2)
centre_text("Sculpt",ch);
if (ch->arcanoi[WMATE] >= 3)
centre_text("Martialry",ch);
if (ch->arcanoi[WMATE] >= 4)
centre_text("Rend",ch);
if (ch->arcanoi[WMATE] >= 5)
centre_text("Bodyshape",ch);
divide_to_char(ch);
return;
}
if (!str_prefix( arg1, "Outrage" ) )
{
divide_to_char(ch);
centre_text( "Arcanoi Outrage",ch);
divide_to_char(ch);
if (ch->arcanoi[WRAGE] == 0)
centre_text("Damcap Bonus: 0", ch );
if (ch->arcanoi[WRAGE] == 1)
centre_text("Damcap Bonus: 500",ch);
if (ch->arcanoi[WRAGE] == 2)
centre_text("Damcap Bonus: 750",ch);
if (ch->arcanoi[WRAGE] == 3)
centre_text("Damcap Bonus: 1250",ch);
if (ch->arcanoi[WRAGE] == 4)
centre_text("Damcap Bonus: 1500",ch);
if (ch->arcanoi[WRAGE] == 5)
centre_text("Damcap Bonus: 2000",ch);
divide_to_char(ch);
return;
}
if (!str_prefix( arg1, "Pandemonium" ) )
{
if (ch->arcanoi[WPAND] == 0)
{
stc( "You know nothing of this.\n\r", ch );
return;
}
if (ch->arcanoi[WPAND] >= 1)
{
divide_to_char(ch);
centre_text( "Arcanoi Pandemonium",ch);
divide_to_char(ch);
centre_text("Weirdness",ch);
}
if (ch->arcanoi[WPAND] >= 2)
centre_text("Befuddlement",ch);
if (ch->arcanoi[WPAND] >= 3)
centre_text("Foul Humor",ch);
if (ch->arcanoi[WPAND] >= 4)
centre_text("Tempest Fugit",ch);
if (ch->arcanoi[WPAND] >= 5)
centre_text("Phenomenon",ch);
divide_to_char(ch);
return;
}
}
if ( !str_cmp( arg2, "learn" ) )
{
if (!str_prefix( arg1, "Argos" ) )
disc = WARGO;
else if (!str_prefix( arg1, "Embody" ) )
disc = WBODY;
else if (!str_prefix(arg1, "Fatalism" ) )
disc = WFATL;
else if (!str_prefix( arg1, "Inhabit" ) )
disc = WINHB;
else if (!str_prefix(arg1, "Keening" ) )
disc = WKEEN;
else if (!str_prefix( arg1, "Lifeweb" ) )
disc = WLIFE;
else if (!str_prefix(arg1, "Moliate" ) )
disc = WMATE;
else if (!str_prefix( arg1, "Outrage" ) )
disc = WRAGE;
else if (!str_prefix(arg1, "Pandemonium" ) )
disc = WPAND;
else
{
stc( "You must select from the following arcanoi:\n\r Argos, Embody, Fatalism, Inhabit, Keening, Lifeweb, Moliate, Outrage or Pandemonium.\n\r", ch);
return;
}
}
else
{
do_arcanoi(ch, "" );
return;
}
cost = ( (ch->arcanoi[disc] + 1) * 10 );
if (ch->arcanoi[disc] >= 5 )
{
stc( "You know everything about that arcanoi.\n\r", ch );
return;
}
if (ch->practice < cost)
{
sprintf( buf, "You need %d primal to learn that.\n\r", cost );
stc( buf, ch );
return;
}
ch->practice -= cost;
ch->arcanoi[disc]++;
stc( "You knowledge in the arcanoi increases.\n\r", ch );
return;
}
void do_shadowwings( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_WRAITH))
{
stc( "Huh?\n\r", ch );
return;
}
if (ch->arcanoi[WARGO] < 2 )
{
stc("You are not skilled enough to use this.\n\r", ch);
return;
}
if (IS_SET( ch->wbits, WRAT_SWINGS))
{
stc("Your shadow wings fade, then dissapear.\n\r", ch);
REMOVE_BIT( ch->affected_by, AFF_FLYING);
REMOVE_BIT( ch->wbits, WRAT_SWINGS);
return;
}
stc("Shadows emant from you, forming wings on your back.\n\r",ch);
SET_BIT(ch->affected_by, AFF_FLYING);
SET_BIT(ch->wbits, WRAT_SWINGS);
return;
}
void do_requiem( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_WRAITH))
{
stc("Huh?\n\r",ch);
return;
}
if ( ch->arcanoi[WKEEN] < 3 )
{
stc("You do not have the power to use requiem.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
stc("Whom do you wish to mortally wound?\n\r",ch);
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if (!IS_NPC(victim))
{
stc("You cannot target other players.\n\r",ch);
return;
}
if ( victim->level > ( ch->max_hit / 94 ) )
{
stc("You failed.\n\r",ch);
return;
}
stc( "You sing a deadly requiem.\n\r",ch);
victim->hit = 1;
WAIT_STATE(ch, 23);
return;
}
void do_oubilette( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_WRAITH))
{
stc("Huh?\n\r", ch);
return;
}
if ( ch->arcanoi[WARGO] < 5 )
{
stc("You are not skilled enough to use this.\n\r", ch);
return;
}
if (!IS_SET(ch->wbits, WRAT_DEATHPLANE))
{
stc("You must be in the death plane to pull others into it.\n\r", ch);
return;
}
if ( arg[0] == '\0' )
{
stc("Who do you wish to send to the death plane?\n\r", ch);
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
stc("Just use manifest.\n\r",ch);
return;
}
if ( victim->level < 3 )
{
stc("Pick on someone more powerful.\n\r",ch);
return;
}
if (IS_SET( victim->wbits, WRAT_DEATHPLANE ) )
{
stc("You release them from the plane of death.\n\r",ch);
stc("You are released from the plane of the dead.\n\r",victim);
REMOVE_BIT( victim->wbits, WRAT_DEATHPLANE );
return;
}
stc("You pull them into the plane of death.\n\r",ch);
stc("You are pulled into the plane of death.\n\r",victim);
SET_BIT( victim->wbits, WRAT_DEATHPLANE );
return;
}
void do_bodyshape( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch,CLASS_WRAITH))
{
stc("Huh?\n\r",ch);
return;
}
if (ch->arcanoi[WMATE] < 5)
{
stc("You do not know how to do this.\n\r",ch);
return;
}
if ( ch->fighting != NULL)
{
stc("Not while fighting!\n\r",ch);
return;
}
if ( ch->hit == ch->max_hit && ch->mana == ch->max_mana && ch->move == ch->max_move )
{
stc("You are in perfect condition.\n\r",ch);
return;
}
stc("You heal your bodyshape.\n\r",ch);
ch->hit += 1200;
ch->mana += 1000;
ch->move += 1000;
if ( ch->hit > ch->max_hit )
ch->hit = ch->max_hit;
if ( ch->mana > ch->max_mana )
ch->mana = ch->max_mana;
if ( ch->move > ch->max_move )
ch->move = ch->max_move;
update_pos(ch);
WAIT_STATE( ch, 23 );
return;
}
void do_ballad( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch,CLASS_WRAITH))
{
stc("Huh?\n\r",ch);
return;
}
if (ch->arcanoi[WKEEN] < 2 )
{
stc("You do not know how to do this.\n\r",ch);
return;
}
if (IS_SET(ch->wbits, WRAT_BALLAD))
{
stc("You remove the power of the ballad from yourself.\n\r",ch);
REMOVE_BIT( ch->wbits, WRAT_BALLAD);
return;
}
stc("You sing a wondrous ballad.\n\r",ch);
SET_BIT( ch->wbits, WRAT_BALLAD );
return;
}
void do_soulpact( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if ( !IS_CLASS(ch,CLASS_WRAITH))
{
stc("Huh?\n\r",ch);
return;
}
if (ch->arcanoi[WLIFE] < 5 )
{
stc("You do not know how to do this.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
stc("Whom do you wish to grant a soul pact?\n\r",ch);
return;
}
if ( (victim = get_char_room( ch, arg)) == NULL )
{
stc("They aren't here.\n\r",ch);
return;
}
if ( ch == victim )
{
stc("You cannot use this on yourself.\n\r",ch);
return;
}
if (IS_NPC(victim))
{
stc("You must target other players.\n\r",ch);
return;
}
if (victim->hit > 0 )
{
stc("They must be weaker to do this.\n\r", ch);
return;
}
stc("You heal them at your own cost...\n\r",ch);
act("$n heals you, their strength withering as they do.\n\r", ch, NULL, victim, TO_VICT );
free_string( victim->pcdata->soulpacted );
victim->pcdata->soulpacted = str_dup( ch->name );
victim->hit = victim->max_hit;
ch->hit = -10;
ch->mana = 0;
ch->move = 0;
update_pos( ch );
update_pos( victim );
return;
}
void do_sensegrimlin( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_CLASS( ch, CLASS_WRAITH ))
{
stc("Huh?\n\r",ch);
return;
}
if (ch->arcanoi[WINHB] < 1 )
{
stc("You do not have the power to do that.\n\r",ch);
return;
}
if (IS_SET( ch->wbits, WRAT_SENSE))
{
stc("You no longer sense other wraiths.\n\r",ch);
REMOVE_BIT( ch->wbits, WRAT_SENSE);
return;
}
stc("You can now see other wraiths.\n\r",ch);
SET_BIT( ch->wbits, WRAT_SENSE);
return;
}
void do_enshroud( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch,CLASS_WRAITH))
{
stc("Huh?\n\r",ch);
return;
}
if ( ch->arcanoi[WARGO] < 1 )
{
stc("You do not know how to hide yourself in the plane of death.\n\r",ch);
return;
}
if ( ch->fight_timer > 0 )
{
stc("Not with a fight timer.\n\r", ch);
return;
}
if ( ch->position == POS_FIGHTING )
{
stc("Not while fighting!\n\r",ch);
return;
}
if ( !IS_SET( ch->wbits, WRAT_DEATHPLANE ))
{
stc("You can only hide yourself in the death plane.\n\r",ch);
return;
}
if ( IS_SET( ch->wbits, WRAT_ENSHROUD ) )
{
stc("You are now visible to mortal eyes.\n\r",ch);
REMOVE_BIT( ch->wbits, WRAT_ENSHROUD);
return;
}
stc("You fade out of existance.\n\r",ch);
SET_BIT( ch->wbits, WRAT_ENSHROUD );
return;
}
void do_wflicker( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
if ( IS_NPC(ch) )
return;
argument = one_argument (argument, arg);
if (!IS_CLASS(ch, CLASS_WRAITH))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Flicker to whom?\n\r", ch );
return;
}
if ( ch->arcanoi[WARGO] < 3 )
{
send_to_char("You do not have the power to do this.\n\r",ch);
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( IS_NPC(victim) && !can_travel(ch,victim))
{
send_to_char("You cannot flicker to them.\n\r", ch );
return;
}
if ( !IS_NPC(victim) && ( !can_travel(ch,victim) && str_cmp(victim->pcdata->soulpacted, ch->name)))
{
send_to_char("They are in their castle.\n\r", ch);
stc("If only you controlled part of their soul...\n\r", ch);
return;
}
/*
if ( can_travel(ch,victim) && (IS_NPC(victim) || victim->pcdata->soulpacted != NULL || (str_cmp(victim->pcdata->soulpacted, ch->name
))))
{
send_to_char( "They are in their castle.\n\r", ch);
send_to_char("If only you controlled part of their soul...\n\r", ch );
return;
}
*/
if (ch == victim)
{
send_to_char("But you're already at yourself!\n\r",ch);
return;
}
if (victim->in_room == ch->in_room)
{
send_to_char("But you're already there!\n\r",ch);
return;
}
if (IS_IMMORTAL( victim ) )
{
send_to_char("Not to archangels.",ch);
return;
}
if (!IS_NPC(victim) && !str_cmp(victim->pcdata->soulpacted, ch->name))
{
free_string( victim->pcdata->soulpacted );
}
act("$n flickers into the darkness.\n\r", ch, NULL, victim, TO_NOTVICT );
char_from_room(ch);
char_to_room(ch,victim->in_room);
act("The shadows flicker and $n appears.\n\r", ch, NULL, victim, TO_NOTVICT );
stc( "You flicker into the room.\n\r", ch );
do_look(ch,"auto");
return;
}
void do_jump( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
char arg1[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg1);
if ( IS_NPC(ch) ) return;
if ( ch->arcanoi[WARGO] < 4 )
{
stc("You do not have the power to do this.\n\r", ch );
return;
}
if ( arg1[0] == '\0' )
{
stc("What object do you want to attempt to jump to?\n\r",ch);
return;
}
if ( ( obj = get_obj_world( ch, arg1 ) ) == NULL )
{
stc("You concentrate deeply on foreign planes, but can find no such object.\n\r",ch);
return;
}
if ( obj->in_obj != 0 )
{
act("You attempt to jump to $p, but it is contained.\n\r" ,ch,obj,NULL,TO_CHAR);
return;
}
if ( obj->in_room == NULL )
{
act("You attempt to jump to $p, but it seems to be possessed by another.",ch,obj,NULL,TO_CHAR);
return;
}
if (!can_travel_obj(ch,obj))
{
return;
}
stc("You jump to the object.\n\r", ch );
act("$n flickers and fades out of sight.",ch,obj,NULL,TO_ROOM);
char_from_room(ch);
char_to_room( ch, obj->in_room );
act("$n leaps into the room.",ch,obj, NULL, TO_ROOM );
do_look( ch, "auto" );
return;
}
void do_lullaby( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if ( !IS_CLASS( ch, CLASS_WRAITH ))
{
stc("Huh?\n\r", ch );
return;
}
if ( ch->arcanoi[WKEEN] < 4 )
{
stc("You do not have that power yet.\n\r", ch );
return;
}
if ( arg[0] == '\0' )
{
stc("Whom do you wish to sing a lullaby to?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if ( ch == victim )
{
send_to_char( "Not on yourself!\n\r", ch );
return;
}
if ( ch->position == POS_FIGHTING )
{
send_to_char( "Not while fighting!\n\r", ch );
return;
}
if (victim->position == POS_FIGHTING )
{
stc("Not during a fight!\n\r", ch);
return;
}
stc("You sing a wondrous lullaby and they fall asleep.\n\r", ch );
stc("You hear a lullaby and quickly doze off...\n\r", victim );
victim->position = POS_SLEEPING;
WAIT_STATE( ch, 60 );
WAIT_STATE( victim, 11 );
return;
}
void do_dirge( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_NPC(ch) && !IS_CLASS( ch, CLASS_WRAITH ))
{
stc("Huh?\n\r", ch );
return;
}
if (!IS_NPC(ch) && ch->arcanoi[WKEEN] < 1 )
{
stc("You do not have the ability to do this yet.", ch );
return;
}
if ( arg[0] == '\0' )
{
stc("Whom do you wish to dirge?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if ( ch == victim )
{
send_to_char( "Not on yourself!\n\r", ch );
return;
}
if ( ch->position == POS_FIGHTING && !IS_NPC(ch))
{
send_to_char( "Not while fighting!\n\r", ch );
return;
}
/*
if (ch->mana < ch->max_mana && !IS_NPC(ch))
{
stc("You require more magic for this skill!\n\r",ch);
return;
}
*/ if ( victim->dirgetimer > 0 )
{
send_to_char("But they are already full of sorrow.\n\r", ch );
return;
}
if (is_safe( ch, victim )) return;
stc("You sing a wondrous dirge, filling their heart with sorrow.\n\r", ch );
victim->dirgetimer += ch->arcanoi[WKEEN];
if ( IS_NPC(ch)) victim->dirgetimer += 5;
sprintf( buf, "%s sings a wondrous dirge, and fills your heart with sorrow.\n\r", ch->name );
stc( buf, victim );
stc("You are temporarily frozen.\n\r", victim );
WAIT_STATE(victim,75 / (7 - ch->arcanoi[WKEEN]));
//ch->mana = 0;
return;
}
void do_severstrand( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_CLASS( ch, CLASS_WRAITH ))
{
stc("Huh?\n\r", ch );
return;
}
if ( ch->arcanoi[WLIFE] < 4 )
{
stc("You don't have the power to do that.\n\r", ch );
return;
}
if ( IS_SET( ch->wbits, WRAT_SEVERED ))
{
stc("The strand that composes your life can now be read.\n\r", ch );
REMOVE_BIT( ch->wbits, WRAT_SEVERED );
return;
}
SET_BIT( ch->wbits, WRAT_SEVERED );
stc("You cut the strand that composes your life from the mortal realm.", ch );
return;
}
void do_crescendo( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
int damage;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if ( !IS_CLASS( ch, CLASS_WRAITH ))
{
stc("Huh?\n\r", ch );
return;
}
if ( ch->arcanoi[WKEEN] < 5 )
{
stc("You do not have this power yet.\n\r", ch );
return;
}
if ( arg[0] == '\0' )
{
stc("Whom do you wish to sing a crescendo to?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if ( ch == victim )
{
send_to_char( "Not on yourself!\n\r", ch );
return;
}
if ( is_safe(ch, victim ))
return;
damage = (( ch->damroll * 2 ) * ch->arcanoi[WKEEN] );
if ( damage > 6500 )
damage = 6500;
sprintf( buf, "#rYour shrieking crescendo tears #g%s. #n[#g%d#n]\n\r",
victim->name,
damage );
stc( buf, ch );
sprintf( buf, "#g%s's #rshrieking crescendo tears you. #n[#r%d#n]\n\r",
ch->name,
damage );
stc( buf, victim );
victim->hit -= damage;
multi_hit( ch, victim, TYPE_UNDEFINED );
WAIT_STATE( ch, 24 );
return;
}
void do_weirdness(CHAR_DATA *ch, char *argument)
{
DESCRIPTOR_DATA *d;
CHAR_DATA *victim;
CHAR_DATA *ach;
char arg[MAX_INPUT_LENGTH];
int sn;
int level;
int spelltype;
argument = one_argument( argument, arg );
if ( IS_NPC( ch ) ) return;
if (!IS_CLASS(ch, CLASS_WRAITH) )
{
stc("Huh?\n\r", ch);
return;
}
if ( ch->arcanoi[WPAND] < 1 )
{
send_to_char("You require Pandemonium 1 to use weirdness\n\r", ch);
return;
}
if ( arg[0] == '\0' && ch->fighting == NULL )
{
send_to_char( "Who do you wish to use weirdness on?\n\r", ch );
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
}
if ( ch == victim )
{
send_to_char( "You are weird enough. Freak.\n\r", ch );
return;
}
if ( is_safe( ch, victim ) )
return;
if ( IS_ITEMAFF( victim, ITEMA_ICESHIELD ) )
{
send_to_char( "You failed.\n\r", ch );
return;
}
if ( ( sn = skill_lookup( "chill touch" ) ) < 0 )
{
send_to_char( "Bugged, please inform an Imp.\n\r", ch );
return;
}
for( d = first_descriptor ; d != NULL ; d = d->next )
{
if ( d->connected != CON_PLAYING ) continue;
if ( ( ach = d->character ) == NULL ) continue;
if ( ch->in_room == NULL || ach->in_room == NULL ) continue;
if ( ach->in_room->area != ch->in_room->area ) continue;
if ( ach == ch )
send_to_char( "You cackle gleefully.\n\r", ch );
else if ( ach->in_room == ch->in_room )
act( "$n cackles gleefully, you suddnely feel cold .", ch, NULL, victim, TO_ROOM );
else
send_to_char( "The air suddenly freezes.\n\r", ch );
}
spelltype = skill_table[sn].target;
level = ch->spl[spelltype] * 5;
(*skill_table[sn].spell_fun) ( sn, level, ch, victim );
WAIT_STATE( ch, 6 );
WAIT_STATE( victim, 12);
return;
}
void do_befuddlement( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_CLASS( ch, CLASS_WRAITH ))
{
stc("Huh?\n\r", ch );
return;
}
if ( ch->arcanoi[WPAND] < 2 )
{
stc("You cannot do this yet.\n\r", ch );
return;
}
if ( arg[0] == '\0' )
{
stc("Befuddle who?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if ( ch == victim )
{
stc("Are you good at confusing yourself?\n\r", ch );
return;
}
if ( ch->position != POS_FIGHTING && victim->position != POS_FIGHTING )
{
stc("You must be fighting them to use this.\n\r", ch );
return;
}
if ( is_safe( ch, victim ))
return;
stc("You try to confuse your opponent and make them flee.\n\r", ch );
sprintf( buf, "%s is confusing you!.\n\r", ch->name );
stc( buf, victim );
do_flee( victim, "" );
do_flee( victim, "" );
WAIT_STATE( ch, 7 );
WAIT_STATE( victim, 11 );
return;
}
void do_sculpt( CHAR_DATA *ch, char *argument )
{
char arg[MIL];
OBJ_DATA *obj;
argument = one_argument(argument, arg);
if ( IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_WRAITH ))
{
stc("Huh?\n\r", ch);
return;
}
if ( ch->arcanoi[WMATE] < 2 )
{
stc("You do not have the power to do this.\n\r", ch );
return;
}
if (arg[0] == '\0')
{
stc("Sculpt what?\n\r", ch);
stc("\tWraith's Touch (touch) (60 Primal)\n\r", ch);
stc("\tDeath's Brush (brush) (750 Primal and 100 million exp)\n\r", ch);
return;
}
if (!str_cmp(arg, "brush") )
{
if (ch->practice < 750)
{
stc("That costs 750 primal\n\r", ch);
return;
}
if (ch->exp < 100000000)
{
stc("That costs 100 million exp!\n\r", ch);
return;
}
ch->practice -= 750;
ch->exp -= 100000000;
obj = create_object(get_obj_index(29689 ), 0);
obj->level = 60;
if (obj->questmaker != NULL) free_string(obj->questmaker);
obj->questmaker = str_dup(ch->name);
obj_to_char(obj,ch);
act("$p appears in your hand.", ch, obj, NULL, TO_CHAR);
act("$p appears in $n's hand.", ch, obj, NULL, TO_ROOM);
return;
}
else if (!str_cmp(arg, "touch"))
{
if (ch->practice < 60)
{
stc("That costs 60 primal!\n\r", ch);
return;
}
ch->practice -= 60;
obj = create_object(get_obj_index( 29690 ), 0);
obj->level = 60;
obj->value[3] = 5;
if (obj->questmaker != NULL) free_string(obj->questmaker);
obj->questmaker = str_dup(ch->name);
obj_to_char(obj,ch);
act("$p appears in your hand.", ch, obj, NULL, TO_CHAR);
act("$p appears in $n's hand.", ch, obj, NULL, TO_ROOM);
return;
}
else
{ do_sculpt(ch, "");
return;
}
return;
}
void do_martialry (CHAR_DATA * ch, char *argument)
{
char arg1[MAX_INPUT_LENGTH];
smash_tilde (argument);
argument = one_argument (argument, arg1);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WRAITH))
{
send_to_char ("Huh?\n\r", ch);
return;
}
if (ch->arcanoi[WMATE] < 3)
{
send_to_char ("You need level 3 in Moliate to use Martialry.\n\r", ch);
return;
}
if (arg1[0] == '\0')
{
send_to_char ("Syntax: martialry <modification>\n\r", ch);
send_to_char ("Horns, Head, Exoskeleton, Tail\n\r", ch);
return;
}
/*
* Set something.
*/
if (!str_cmp (arg1, "horns"))
{
if (!IS_VAMPAFF (ch, VAM_HORNS))
{
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_HORNS);
send_to_char ("You pull a set of horns out of your head.\n\r", ch);
act ("$n pulls a set of horns from his head!\n\r", ch, NULL, NULL,
TO_ROOM);
return;
}
if (IS_VAMPAFF (ch, VAM_HORNS))
{
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_HORNS);
send_to_char ("You push your horns back into your head.\n\r", ch);
act ("$n pushes $n's horns back into $n head.\n\r", ch, NULL, NULL,
TO_ROOM);
stc ("You are no longer horny.\n\r", ch);
return;
}
}
if (!str_cmp (arg1, "exoskeleton"))
{
if (!IS_VAMPAFF (ch, VAM_EXOSKELETON))
{
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_EXOSKELETON);
send_to_char ("Your skin is covered by a hard exoskeleton.\n\r", ch);
act ("$n's skin is covered by a hard exoskeleton!\n\r", ch, NULL,
NULL, TO_ROOM);
return;
}
if (IS_VAMPAFF (ch, VAM_EXOSKELETON))
{
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_EXOSKELETON);
send_to_char
("Your exoskeleton slowly disappears under your skin.\n\r", ch);
act ("$n's hard exoskeleton disappears under $s skin.\n\r", ch, NULL,
NULL, TO_ROOM);
return;
}
}
if (!str_cmp (arg1, "tail"))
{
if (!IS_VAMPAFF (ch, VAM_TAIL))
{
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_TAIL);
send_to_char
("Your spine extends out into a long, pointed tail.\n\r", ch);
act ("$n's spine extends to form a long pointed tail!\n\r", ch, NULL,
NULL, TO_ROOM);
return;
}
if (IS_VAMPAFF (ch, VAM_TAIL))
{
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_TAIL);
send_to_char ("Your tail slowly retracts into your spine.\n\r", ch);
act ("$n's tail shrinks and vanishes into $s spine.\n\r", ch, NULL,
NULL, TO_ROOM);
return;
}
}
if (!str_cmp (arg1, "head"))
{
if (!IS_VAMPAFF (ch, VAM_HEAD))
{
SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_HEAD);
send_to_char ("Your head transforms into that of a fierce lion.\n\r",
ch);
act ("$n's head transforms into that of a fierce lion!\n\r", ch,
NULL, NULL, TO_ROOM);
return;
}
if (IS_VAMPAFF (ch, VAM_HEAD))
{
REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_HEAD);
send_to_char ("Your head slowly resumes it's normal form.\n\r", ch);
act ("$n's head resumes its normal form.\n\r", ch, NULL, NULL,
TO_ROOM);
return;
}
}
/*
* Generate usage message.
*/
do_martialry (ch, "");
return;
}
void do_gremlinize( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
OBJ_DATA *obj;
CHAR_DATA *mount;
sprintf(buf,"%s: Oswitch %s",ch->name,argument);
if (ch->level < NO_WATCH) do_watching(ch,buf);
one_argument( argument, arg );
if ( IS_NPC(ch) )
return;
if (!IS_CLASS( ch, CLASS_WRAITH ))
{
stc("Huh?\n\r", ch );
return;
}
if ( ch->arcanoi[WINHB] < 2 )
{
stc("You do not have this power yet.\n\r", ch );
return;
}
if ( IS_EXTRA(ch, EXTRA_OSWITCH))
{
sprintf(buf,"%s: Oreturn",ch->name);
if (ch->level < NO_WATCH) do_watching(ch,buf);
if ( ( obj = ch->pcdata->chobj ) != NULL ) obj->chobj = NULL;
ch->pcdata->chobj = NULL;
REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
REMOVE_BIT(ch->extra, EXTRA_OSWITCH);
if (IS_HEAD(ch,LOST_HEAD)) REMOVE_BIT(ch->loc_hp[0], LOST_HEAD);
free_string(ch->morph);
ch->morph = str_dup("");
char_from_room(ch);
char_to_room(ch,get_room_index(ROOM_VNUM_ALTAR));
send_to_char( "Ok.\n\r", ch );
return;
}
if ( ch->fight_timer > 0 )
{
stc("Not with a fight timer!\n\r", ch );
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Switch into what?\n\r", ch );
return;
}
if ( IS_EXTRA(ch, EXTRA_OSWITCH) || IS_HEAD(ch,LOST_HEAD) )
{
send_to_char( "You are already oswitched.\n\r", ch );
return;
}
if ( IS_AFFECTED(ch, AFF_POLYMORPH) )
{
send_to_char( "Not while polymorphed.\n\r", ch );
return;
}
if ( IS_NPC(ch) || IS_EXTRA(ch,EXTRA_SWITCH) )
{
send_to_char( "Not while switched.\n\r", ch );
return;
}
if ( ( obj = get_obj_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if (strlen(obj->questowner) > 2)
{
stc("Not on that object!\n\r", ch);
return;
}
if ( obj->chobj != NULL )
{
send_to_char( "Object in use.\n\r", ch );
return;
}
if ( (mount = ch->mount) != NULL) do_dismount(ch,"");
obj->chobj = ch;
ch->pcdata->chobj = obj;
SET_BIT(ch->affected_by, AFF_POLYMORPH);
SET_BIT(ch->extra, EXTRA_OSWITCH);
free_string(ch->morph);
ch->morph = str_dup(obj->short_descr);
send_to_char( "Ok.\n\r", ch );
return;
}
void do_wempower( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
AFFECT_DATA *paf;
if (IS_NPC(ch)) return;
if (!IS_CLASS( ch, CLASS_WRAITH ))
{
stc("Huh?\n\r", ch );
return;
}
if ( ch->arcanoi[WINHB] < 3 )
{
stc("You do not have that power yet.\n\r", ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char( "Empower which object?\n\r", ch );
return;
}
if ( ( obj = get_obj_carry( ch, argument ) ) == NULL )
{
send_to_char( "You don't have that.\n\r", ch );
return;
}
if (IS_SET( obj->quest, QUEST_ENCHANTED ))
{
stc("This item has already been empowered.\n\r", ch );
return;
}
if ( ch->practice < 40 )
{
stc("This requires 40 primal.\n\r", ch );
return;
}
if (!IS_SET( obj->quest, QUEST_ENCHANTED ))
{
if ( affect_free == NULL )
{
paf = alloc_perm( sizeof(*paf) );
}
else
{
paf = affect_free;
affect_free = affect_free->next;
}
// paf->type = sn;
paf->duration = -1;
paf->location = APPLY_HITROLL;
paf->modifier = 5;
paf->bitvector = 0;
paf->next = obj->affected;
obj->affected = paf;
if ( affect_free == NULL )
{
paf = alloc_perm( sizeof(*paf) );
}
else
{
paf = affect_free;
affect_free = affect_free->next;
}
// paf->type = sn;
paf->duration = -1;
paf->location = APPLY_DAMROLL;
paf->modifier = 5;
paf->bitvector = 0;
paf->next = obj->affected;
obj->affected = paf;
act("You create a #0dark aura#n around $p.", ch,obj, NULL, TO_CHAR);
act("$n creates a #0dark aura#n around $p.", ch,obj, NULL, TO_ROOM);
ch->practice -= 40;
SET_BIT( obj->quest, QUEST_ENCHANTED );
return;
}
}
void do_imitate( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_WRAITH))
{
stc("Huh?\n\r", ch);
return;
}
if ( ch->arcanoi[WMATE] < 1 )
{
stc("You cannot use this skill yet.\n\r", ch );
return;
}
if ( arg[0] == '\0' && IS_SET( ch->affected_by, AFF_POLYMORPH) )
{
stc("You shift back into your normal form.\n\r", ch );
REMOVE_BIT( ch->affected_by, AFF_POLYMORPH );
ch->morph = NULL;
return;
}
else if ( arg[0] == '\0' )
{
stc("Imitate who?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if ( !IS_NPC(victim))
{
stc("You can only imitate NPCs.\n\r", ch );
return;
}
stc("You have transformed!\n\r", ch );
free_string( ch->morph );
SET_BIT(ch->affected_by, AFF_POLYMORPH);
ch->morph = str_dup( victim->short_descr );
return;
}
void do_tempestfugit( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if (!IS_CLASS( ch, CLASS_WRAITH ))
{
stc("Huh?\n\r", ch );
return;
}
if (ch->arcanoi[WPAND] < 1 )
{
stc("You are not able to use this power yet.\n\r", ch );
return;
}
if (arg[0] == '\0' )
{
stc("Whom do you want to distract?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They are not here.\n\r", ch );
return;
}
if ( ch == victim )
{
stc("That would show your meager intelligence.\n\r", ch );
return;
}
act("Your tempest slows $N!\n\r",ch,NULL,victim,TO_CHAR);
act("$n uses his tempest powers and slows you.\n\r",ch,NULL,victim,TO_VICT);
WAIT_STATE( victim, 21 );
WAIT_STATE( ch, 9 );
return;
}
void do_foulhumor(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
CHAR_DATA *mob;
char arg[MIL];
char buf[MSL];
argument = one_argument(argument, arg);
if (!IS_NPC(ch) && !IS_CLASS(ch, CLASS_WRAITH))
{
stc( "Huh?\n\r", ch );
return;
}
if (!IS_NPC(ch) && ch->arcanoi[WPAND] < 1 )
{
stc("You are not skilled enough to use this.\n\r", ch);
return;
}
if (arg[0] == '\0' )
{
stc("Whom do you want your vermin to attack?\n\r",ch);
return;
}
if ( ch->position != POS_FIGHTING )
{
stc("You must be fighting to summon vermin!\n\r",ch);
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
stc("That would be interesting.\n\r",ch);
return;
}
if (ch->fighting == victim)
{
mob=create_mobile( get_mob_index( 30001) );
mob->level =ch->max_hit / 100;
if (ch->max_hit < 200000 )
{
mob->hit = ch->max_hit;
mob->max_hit = ch->max_hit;
mob->hitroll = 1000;
mob->damroll = 1000;
mob->armor = -700;
}
else if ( ch->max_hit >= 200000 && ch->max_hit < 500000 )
{
mob->hit = ch->max_hit * 2;
mob->max_hit = ch->max_hit * 2;
mob->hitroll = 3500;
mob->damroll = 3500;
mob->armor = -2000;
}
else if (ch->max_hit >= 500000 && ch->max_hit < 1000000 )
{
mob->hit = ch->max_hit * 3;
mob->max_hit = ch->max_hit * 3;
mob->hitroll = 7000;
mob->damroll = 7000;
mob->armor = -3500;
}
else if (ch->max_hit >= 1000000 )
{
mob->hit = ch->max_hit * 4;
mob->max_hit = ch->max_hit * 4;
mob->hitroll = 10000;
mob->damroll = 10000;
mob->armor = -6000;
}
SET_BIT(mob->act, ACT_NOEXP);
free_string(mob->name);
mob->name =str_dup("gremlin");
free_string(mob->short_descr);
mob->short_descr = str_dup("a small gremlin");
free_string(mob->long_descr);
mob->long_descr = str_dup("a small gremlin, attacks you with its large claws");
char_to_room( mob, ch->in_room );
stc("A gremlin steps out of the darkness and bows to your will.\n\r", ch );
act("A gremlin steps out of the shadows and attacks $N!\n\r",ch,NULL,victim,TO_ROOM);
sprintf(buf, "%s", victim->name);
multi_hit(mob,victim,TYPE_UNDEFINED);
WAIT_STATE(ch, 48);
return;
}
else
{
stc("You are not fighting them!\n\r", ch);
return;
}
}
void do_surge( CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
OBJ_DATA *obj;
char arg[MIL];
char buf[MSL];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_WRAITH) && !IS_IMMORTAL(ch))
{
stc("Huh?\n\r",ch);
return;
}
if ( ch->arcanoi[WINHB] < 5 && !IS_IMMORTAL(ch))
{
stc("You do not have the power to use surge.\n\r",ch);
return;
}
if ( arg[0] == '\0' )
{
stc("Who do you want to send a surge through?\n\r",ch);
return;
}
if ( ( obj = get_obj_room( ch, arg ) ) == NULL )
{
stc("I do not see that object anywhere.\n\r",ch);
return;
}
if (obj->chobj == NULL )
{
stc("But this item is not possessed!\n\r",ch);
return;
}
victim = obj->chobj;
if ( ( obj = victim->pcdata->chobj ) != NULL ) obj->chobj = NULL;
victim->pcdata->chobj = NULL;
if (victim->pcdata->obj_vnum == 29662 ||
victim->pcdata->obj_vnum == 29663 ||
victim->pcdata->obj_vnum == 30055 )
{
extract_obj(obj);
}
victim->pcdata->obj_vnum = 0;
REMOVE_BIT(victim->affected_by, AFF_POLYMORPH);
REMOVE_BIT(victim->extra, EXTRA_OSWITCH);
free_string(ch->morph);
ch->morph = str_dup("");
sprintf(buf,"You send a surge through %s, returning them to human form.\n\r", victim->name );
stc(buf,ch);
stc("You feel a surge as you are returned to your human form!\n\r", victim);
return;
}
void do_shellride(CHAR_DATA *ch, char *argument)
{
OBJ_DATA *obj;
OBJ_DATA *container;
char arg[MIL];
argument = one_argument(argument, arg);
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_WRAITH))
{
stc("Huh?\n\r",ch);
return;
}
if ( ch->arcanoi[WINHB] < 4 )
{
stc("You do not have the power to use shellride.\n\r",ch);
return;
}
if (arg[0] == '\0')
{
stc("Which container do you want to hop in to?\n\r", ch);
return;
}
if ( ( container = get_obj_room( ch, arg ) ) == NULL )
{
stc("I do not see that object anywhere.\n\r",ch);
return;
}
if ( ( obj = ch->pcdata->chobj ) == NULL )
{
send_to_char("You are not an object.\n\r",ch);
return;
}
if ( obj->chobj == NULL || obj->chobj != ch )
{
send_to_char("You are not an object.\n\r",ch);
return;
}
if (ch->pcdata->chobj == NULL )
{
stc("You must be an object to ride in a container!\n\r", ch);
return;
}
if (container->item_type != ITEM_CONTAINER &&
container->item_type != ITEM_CORPSE_NPC &&
container->item_type != ITEM_CORPSE_PC)
{
send_to_char("You cannot leap into that sort of object.\n\r",ch );
return;
}
act("$p leap into $P.",ch,obj,container,TO_CHAR);
act("$p leaps into $P.",ch,obj,container,TO_ROOM);
obj_from_room(obj);
obj_to_obj(obj,container);
return;
}
void do_wraithpowers (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_WRAITH))
{
do_rand_typo (ch);
return;
}
stc ("#e+-------------------------------------------------------------------------------#n\n\r", ch);
cent_to_char ("#w+- Wraith Powers -+#n", ch);
stc ("#e+-------------------------------------------------------------------------------#n\n\r", ch);
stc (" Argos: ", ch);
if (ch->arcanoi[WARGO] == 0)
{
stc( "You know nothing of this.\n\r", ch );
return;
}
if (ch->arcanoi[WARGO] >= 1)
{
stc("Enshroud ", ch);
}
if (ch->arcanoi[WARGO] >= 2)
{
stc("Shadow Wings ",ch);
}
if (ch->arcanoi[WARGO] >= 3)
{
stc("Flickering ",ch);
}
if (ch->arcanoi[WARGO] >= 4)
{
stc("Jump ",ch);
}
if (ch->arcanoi[WARGO] >= 5)
{
stc("Oubliette",ch);
}
stc ("\n\r Embody: ", ch);
if (ch->arcanoi[WBODY] == 0)
{
stc("Upkeep in the material plane costs you 250 move and 300 hp.\n\r", ch );
return;
}
if (ch->arcanoi[WBODY] == 1)
{
stc("Upkeep in the material plane costs you 200 move and 200 hp.\n\r",ch);
return;
}
if (ch->arcanoi[WBODY] == 2)
{
stc("Upkeep in the material plane costs you 175 move and 150 hp.\n\r",ch);
return;
}
if (ch->arcanoi[WBODY] == 3)
{
stc("Upkeep in the material plane costs you 150 move and 100 hp.\n\r",ch);
return;
}
if (ch->arcanoi[WBODY] == 4)
{
stc("Upkeep in the material plane costs you 100 move and 50 hp.\n\r",ch);
return;
}
if (ch->arcanoi[WBODY] == 5)
{
stc("Upkeep in the material plane costs you 50 move and 25 hp.\n\r",ch);
return;
}
stc ("\n\r Fatalism: ", ch);
if (ch->arcanoi[WFATL] == 0)
{
stc("Hitroll and Damroll bonus 0.\n\r", ch );
return;
}
if (ch->arcanoi[WFATL] == 1)
{
stc("Hitroll and Damroll bonus 50.\n\r", ch );
return;
}
if (ch->arcanoi[WFATL] == 2)
{
stc("Hitroll and Damroll bonus 100.\n\r", ch );
return;
}
if (ch->arcanoi[WFATL] == 3)
{
stc("Hitroll and Damroll bonus 250.\n\r", ch );
return;
}
if (ch->arcanoi[WFATL] == 4)
{
stc("Hitroll and Damroll bonus 500.\n\r", ch );
return;
}
if (ch->arcanoi[WFATL] == 5)
{
stc("Hitroll and Damroll bonus 600.\n\r", ch );
return;
}
stc ("#e\n\r+-------------------------------------------------------------------------------#n\n\r", ch);
return;
}