/*********************************************************************** * 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; }