/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /********************************************* * Elemental, another class by Xrakisis * *********************************************/ #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" void do_elemshift (CHAR_DATA *ch, char *argument) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; one_argument( argument, arg); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_ELEMENTAL)) { send_to_char("Elemental Only?\n\r",ch); return; } if (ch->pcdata->powers[ELEMENTAL_FIRE] < 5 ) { send_to_char("#7You need level #R5 #7in each element to use #RElemshift#7!#n\n\r",ch); return; } if (ch->pcdata->powers[ELEMENTAL_AIR] < 5 ) { send_to_char("#7You need level #R5 #7in each element to use #RElemshift#7!#n\n\r",ch); return; } if (ch->pcdata->powers[ELEMENTAL_WATER] < 5 ) { send_to_char("#7You need level #R5 #7in each element to use #RElemshift#7!#n\n\r",ch); return; } if (ch->pcdata->powers[ELEMENTAL_EARTH] < 5 ) { send_to_char("#7You need level #R5 #7in each element to use #RElemshift#7!#n\n\r",ch); return; } if (arg[0] == '\0') { send_to_char("#7Which #RElemental #7form? #7[#RFire#7-#CAir#7-#LWater#7-#oEarth#7-#YMortal#7]#n\n\r", ch); return; } if (!str_cmp(arg,"fire")) { if (IS_SET(ch->affected_by, AFF_POLYMORPH)) { send_to_char("#7You're already in a #RELEMENTAL #7form#7!#n\n\r",ch); return; } if (ch->mana < 10000) { send_to_char("#7You don't have enough #Rmana#7.#n\n\r",ch); return; } act( "You become ingulfed in #RF#Yl#Ra#Ym#Re#Ys#n.", ch, NULL, NULL, TO_CHAR); act( "$n's Becomes a #7Human #YT#Ro#Yr#Rc#Yh#n.", ch, NULL, NULL, TO_ROOM ); ch->pcdata->powers[ELEM_FORMS]=FIRE_FORM; SET_BIT(ch->affected_by, AFF_POLYMORPH); ch->hitroll += 400; ch->damroll += 400; ch->armor -= 200; ch->mana -= 10000; sprintf(buf, "%s The #RF#Yi#Rr#Ye#n Elemental", ch->name); free_string(ch->morph); ch->morph = str_dup(buf); return; } else if (!str_cmp(arg,"water")) { if (IS_SET(ch->affected_by, AFF_POLYMORPH)) { send_to_char("#7You're already in a #RELEMENTAL #7form#7!#n\n\r",ch); return; } if (ch->mana < 1000) { send_to_char("#7You don't have enough #Rmana#7.#n\n\r",ch); return; } act( "Your skin is covered with #7Ice #lCrystals#n.", ch, NULL, NULL, TO_CHAR); act( "$n's skin becomes covered with #7Ice #lcrystals#n.", ch, NULL, NULL, TO_ROOM ); ch->pcdata->powers[ELEM_FORMS]=WATER_FORM; SET_BIT(ch->affected_by, AFF_POLYMORPH); ch->hitroll += 300; ch->damroll += 300; ch->mana -= 10000; sprintf(buf, "%s The #lWater#n Elemental", ch->name); free_string(ch->morph); ch->morph = str_dup(buf); return; } else if (!str_cmp(arg,"air")) { if (IS_SET(ch->affected_by, AFF_POLYMORPH)) { send_to_char("#7You're already in a #RELEMENTAL #7form#7!#n\n\r",ch); return; } if (ch->mana < 10000) { send_to_char("#7You don't have enough #Rmana#7.#n\n\r",ch); return; } act( "You becomes a thin #LM#7i#Ls#7t#n.", ch, NULL, NULL, TO_CHAR); act( "$n's Becomes a thin #LM#7i#Ls#7t#n.", ch, NULL, NULL, TO_ROOM ); ch->pcdata->powers[ELEM_FORMS]=AIR_FORM; SET_BIT(ch->affected_by, AFF_POLYMORPH); ch->hitroll += 200; ch->damroll += 200; ch->armor -= 200; ch->mana -= 10000; sprintf(buf, "%s The #7Air#n Elemental", ch->name); free_string(ch->morph); ch->morph = str_dup(buf); return; } else if (!str_cmp(arg,"earth")) { if (IS_SET(ch->affected_by, AFF_POLYMORPH)) { send_to_char("#7You're already in a #RELEMENTAL #7form#7!#n\n\r",ch); return; } if (ch->mana < 10000) { send_to_char("#7You don't have enough #Rmana#7.#n\n\r",ch); return; } act( "Your Skin turns to Hard #GE#garth#n.", ch, NULL, NULL, TO_CHAR); act( "$n's skin turns to Hard #GE#garth#n.", ch, NULL, NULL, TO_ROOM ); ch->pcdata->powers[ELEM_FORMS]=EARTH_FORM; SET_BIT(ch->affected_by, AFF_POLYMORPH); ch->hitroll += 500; ch->damroll += 500; ch->armor -= 500; ch->mana -= 10000; sprintf(buf, "%s The #GE#garth#n Elemental", ch->name); free_string(ch->morph); ch->morph = str_dup(buf); return; } else if (!str_cmp(arg,"mortal")) { if (!IS_SET(ch->affected_by, AFF_POLYMORPH)) { send_to_char("#7Your already in #RMortal #7form.#n\n\r",ch); return; } if (IS_SET(ch->pcdata->powers[ELEM_FORMS], FIRE_FORM)) { ch->hitroll -= 400; ch->damroll -= 400; ch->armor += 200; } else if (IS_SET(ch->pcdata->powers[ELEM_FORMS], AIR_FORM)) { ch->hitroll -= 200; ch->damroll -= 200; ch->armor += 200; } else if (IS_SET(ch->pcdata->powers[ELEM_FORMS], WATER_FORM)) { ch->hitroll -= 300; ch->damroll -= 300; } else if (IS_SET(ch->pcdata->powers[ELEM_FORMS], EARTH_FORM)) { ch->hitroll -= 500; ch->damroll -= 500; ch->armor += 500; } ch->pcdata->powers[ELEM_FORMS]=0; REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); send_to_char("#7You return to your #RMortal #7form.#n\n\r",ch); act("#7$n returns to $s #RMortal #7form.#n\n\r",ch,NULL,NULL,TO_ROOM); free_string(ch->morph); ch->morph=str_dup(""); return; } else { send_to_char("#7That is not a valid form.#n\n\r",ch); return; } } void do_solidify(CHAR_DATA *ch,char *argument) { if (IS_NPC(ch)) return; if (!IS_CLASS(ch,CLASS_ELEMENTAL)) { send_to_char("Huh?\n\r",ch); return; } if (!IS_SET(ch->newbits, NEW_SKIN)) { send_to_char("Your Earthen Skin Hardens.\n\r",ch); ch->armor -= 100 ; SET_BIT(ch->newbits, NEW_SKIN); return; } else if (IS_SET(ch->newbits, NEW_SKIN)) { send_to_char("Your Earthen Skin Softens.\n\r",ch); ch->armor += 100; REMOVE_BIT(ch->newbits,NEW_SKIN); return; } return; } void do_enflame( CHAR_DATA *ch, char *argument ) { if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_ELEMENTAL)) { send_to_char("Huh?\n\r",ch); return; } if (ch->pcdata->powers[ELEMENTAL_FIRE] < 5) { send_to_char("You Need 5 in fire to use enflame.\n\r",ch); return; } if (IS_SET(ch->pcdata->powers[ELEMENTAL_POWERS], ELEMENTAL_ENFLAME)) { REMOVE_BIT(ch->pcdata->powers[ELEMENTAL_POWERS], ELEMENTAL_ENFLAME); act("You Will No Longer Enflame.", ch, NULL, NULL, TO_CHAR); act("$n's Will No Longer Enflame.", ch, NULL, NULL, TO_ROOM); return; } SET_BIT(ch->pcdata->powers[ELEMENTAL_POWERS], ELEMENTAL_ENFLAME); act("#CYou Will Now Use Your FIRE to Seek Retribution.#n", ch, NULL, NULL, TO_CHAR); act("$n Will now use $s Fire to seek RETRIBUTION.", ch, NULL, NULL, TO_ROOM); return; } void do_magma( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; int dam; if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_ELEMENTAL)) { send_to_char("Huh?\n\r",ch); return; } if (ch->pcdata->powers[ELEMENTAL_FIRE] < 3 ) { send_to_char("You need level 3 in Fire to use MAGMA.\n\r",ch); return; } if ( ( victim = get_char_room( ch, NULL, arg ) ) == NULL ) { if (ch->fighting == NULL) { send_to_char( "They aren't here.\n\r", ch ); return; } else victim = ch->fighting; } WAIT_STATE( ch, 12 ); if (!IS_NPC(victim)) dam = number_range(4000,8000); else dam = number_range(15000,25000); sprintf(buf,"Your Magma strikes $N with DEVESTATING FORCE! [%d]\n\r",dam); act(buf,ch,NULL,victim,TO_CHAR); sprintf(buf,"$n's Magma strikes you with DEVESTATING FORCE! [%d]\n\r",dam); act(buf,ch,NULL,victim,TO_VICT); sprintf(buf,"$n's Magma strikes $N with DEVESTATING FORCE! [%d]\n\r",dam); act(buf,ch,NULL,victim,TO_NOTVICT); hurt_person(ch,victim, dam); return; } void do_naturesfury (CHAR_DATA *ch, char *argument) { // char arg1[MAX_STRING_LENGTH]; // char arg2[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; char buf1[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char buf3[MAX_STRING_LENGTH]; CHAR_DATA *victim; // AFFECT_DATA af; // int i, dam, count, sn; int dam; int red_magic = ch->spl[RED_MAGIC]; int blue_magic = ch->spl[BLUE_MAGIC]; int green_magic = ch->spl[GREEN_MAGIC]; int purple_magic = ch->spl[PURPLE_MAGIC]; int yellow_magic = ch->spl[YELLOW_MAGIC]; // int fire = ch->pcdata->powers[ELEMENTAL_FIRE]; // int water = ch->pcdata->powers[ELEMENTAL_WATER]; // int air = ch->pcdata->powers[ELEMENTAL_AIR]; // int earth = ch->pcdata->powers[ELEMENTAL_EARTH]; int magic_power = ch->spl[RED_MAGIC] + ch->spl[BLUE_MAGIC] + ch->spl[GREEN_MAGIC] + ch->spl[PURPLE_MAGIC] + ch->spl[YELLOW_MAGIC]; // int elem_power = ch->pcdata->powers[ELEMENTAL_EARTH] + ch->pcdata->powers[ELEMENTAL_FIRRE] /// argument=one_argument(argument,arg1); // strcpy(arg2,argument); one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_ELEMENTAL)) { send_to_char("Huh?\n\r",ch); return; } // if (arg1[0] == '\0') // { // send_to_char("Syntax : chant <bless/curse/damage/heal> <target>.\n\r", ch); // return; // } if (IS_ITEMAFF(ch, ITEMA_AFFENTROPY)) { magic_power +=100; red_magic +=20; yellow_magic +=20; purple_magic +=20; green_magic +=20; blue_magic +=20; } /* if (ch->pcdata->powers[POWER_TICK] > 0) { send_to_char("You cannot use Naturefury yet..\n\r",ch); return; } */ // if (!str_cmp(arg1, "damage")) // { // if (arg2[0] == '\0' && ch->fighting != NULL) victim = ch->fighting; if (ch->pcdata->powers[ELEMENTAL_FIRE] < 3) { send_to_char("You need to get Fire up to 3 to use this.\n\r",ch); return; } if (ch->pcdata->powers[ELEMENTAL_EARTH] < 3) { send_to_char("You need to get Earth up to 3 to use this.\n\r",ch); return; } if (ch->pcdata->powers[ELEMENTAL_AIR] < 3) { send_to_char("You need to get Air up to 3 to use this.\n\r",ch); return; } if (ch->pcdata->powers[ELEMENTAL_WATER] < 3) { send_to_char("You need to get Water up to 3 to use this.\n\r",ch); return; } if ((victim = get_char_room(ch, NULL, arg)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if (victim == ch) { send_to_char("You really don't want to hurt yourself.\n\r", ch ); return; } if (is_safe(ch, victim)) return; if (victim->position == POS_DEAD || ch->in_room != victim->in_room) return; if (IS_AFFECTED(ch, AFF_PEACE)) REMOVE_BIT(ch->affected_by, AFF_PEACE); if (victim->position > POS_STUNNED) { if (victim->fighting == NULL) set_fighting(victim, ch, TRUE); if (ch->fighting == NULL) set_fighting(ch, victim, TRUE); } WAIT_STATE(ch,8); dam = number_range(red_magic*10, red_magic*15); // was 10 and 15 dam += char_damroll(ch); dam = cap_dam(ch,victim,dam); dam = dam * 8; if (!IS_NPC(victim)) { if (IS_CLASS(ch, CLASS_ELEMENTAL) && dam > 10) dam = number_range(2000,4500); if (dam > 1000) dam = number_range(4500,6500); // 45 and 65 // ch->pcdata->powers[POWER_TICK] = 2; } sprintf(buf1,"$n calls upon the forces of Nature to use #rFIRE#n to destroy $N [#C%d#n]" , dam); sprintf(buf2,"You call for the forces of Nature to use #rFIRE#n to destroy $N [#C%d#n]" , dam); sprintf(buf3,"$n calls for the forces of Nature to use#rFIRE#n to destroy you [#C%d#n]" , dam); act(buf1,ch,NULL,victim, TO_NOTVICT); act(buf2,ch,NULL,victim, TO_CHAR); act(buf3,ch,NULL,victim, TO_VICT); hurt_person(ch, victim, dam); if (victim->position == POS_DEAD || ch->in_room != victim->in_room) return; dam = number_range(blue_magic*4, blue_magic*5); // 4 and 5 dam += char_damroll(ch); dam = cap_dam(ch,victim,dam); if (!IS_NPC(victim)) { if (IS_CLASS(ch, CLASS_ELEMENTAL) && dam > 600) dam = number_range(2000,4500); if (dam > 1000) dam = number_range(3500,5500); } sprintf(buf1,"$n calls up the power of #GEARTH#n to attack $N with boulders [#C%d#n]" , dam); sprintf(buf2,"You call upon the power of #GEARTH to attack $N with boulders [#C%d#n]" , dam); sprintf(buf3,"$n calls upon the power of #GEARTH to attack you with boulders [#C%d#n]" , dam); act(buf1,ch,NULL,victim, TO_NOTVICT); act(buf2,ch,NULL,victim, TO_CHAR); act(buf3,ch,NULL,victim, TO_VICT); hurt_person(ch, victim, dam); if (victim->position == POS_DEAD || ch->in_room != victim->in_room) return; dam = number_range(green_magic*10, green_magic*15); dam += char_damroll(ch); dam = cap_dam(ch,victim,dam); dam = dam * 8; if (!IS_NPC(victim)) { if (IS_CLASS(ch, CLASS_ELEMENTAL) && dam > 600) dam = number_range(2000,5500); if (dam > 1000) dam = number_range(2500,4500); } sprintf(buf1,"$n calls for forth the power of #7AIR#n to strike $N [#C%d#n]" , dam); sprintf(buf2,"You call forth the power of #7AIR#n to strike $N [#C%d#n]" , dam); sprintf(buf3,"$n calls forth the power of #7AIR#n to strike You with DEVESTATING FORCE! [#C%d#n]" , dam); act(buf1,ch,NULL,victim, TO_NOTVICT); act(buf2,ch,NULL,victim, TO_CHAR); act(buf3,ch,NULL,victim, TO_VICT); hurt_person(ch, victim, dam); if (victim->position == POS_DEAD || ch->in_room != victim->in_room) return; dam = number_range(purple_magic*10, purple_magic*15); dam += char_damroll(ch); dam = cap_dam(ch,victim,dam); dam = dam * 8; if (!IS_NPC(victim)) { if (IS_CLASS(ch, CLASS_ELEMENTAL) && dam > 600) dam = number_range(2000,4500); if (dam > 1000) dam = number_range(4500,6500); } sprintf(buf1,"$n calls for forth the power of #lWATER#n to strike $N [#C%d#n]" , dam); sprintf(buf2,"You call forth the power of #lWATER#n to strike $N [#C%d#n]" , dam); sprintf(buf3,"$n calls forth the power of #lWATER#n ATONOMIZING You! [#C%d#n]" , dam); act(buf1,ch,NULL,victim, TO_NOTVICT); act(buf2,ch,NULL,victim, TO_CHAR); act(buf3,ch,NULL,victim, TO_VICT); hurt_person(ch, victim, dam); if (victim->position == POS_DEAD || ch->in_room != victim->in_room) return; dam = number_range(yellow_magic*10, yellow_magic*15); dam += char_damroll(ch); dam = cap_dam(ch,victim,dam); dam = dam * 8; // ch->pcdata->powers[POWER_TICK] = 2; return; } void do_disperce ( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; argument = one_argument(argument, arg); if (!IS_CLASS(ch, CLASS_ELEMENTAL)) { send_to_char("Only Elementals May Disperce.\n\r",ch); return; } if (ch->move < 600) { stc("You do not have enough vitality to do that!\n\r",ch); return; } if (arg[0] == '\0') { send_to_char( "Travel to Who?\n\r", ch ); return; } if ( ( victim = get_char_world( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if( victim == ch ) { stc ( "Not to yourself.\n\r",ch); return; } if( IS_SET(victim->in_room->room_flags, ROOM_ASTRAL)) { stc( "You can't find it's room.\n\r",ch); return; } if( IS_SET(ch->in_room->room_flags, ROOM_ASTRAL)) { stc( "Your room is not connected to the astral plane.\n\r",ch); return; } if (!IS_NPC(victim) && !IS_IMMUNE(victim,IMM_SUMMON) ) { send_to_char("They don't want you near them!\n\r",ch); return; } if ( room_is_private(victim->in_room ) ) { send_to_char( "That room is private right now.\n\r", ch ); return; } if (victim->in_room->vnum == ch->in_room->vnum) { send_to_char("But you're already there!\n\r",ch); return; } char_from_room(ch); char_to_room(ch,victim->in_room); do_look(ch, "auto"); if (IS_NPC(victim)) { sprintf(buf,"You Disperce into particles to travel to %s!\n\r",victim->short_descr); send_to_char(buf, ch); } if (!IS_NPC(victim)) { sprintf(buf,"Disperces into particles to travel to %s!\n\r",victim->name); send_to_char(buf, ch); } act("You see $n slowly solidify infront of you.\n\r",ch,NULL,NULL,TO_ROOM); ch->move -= 600; return; } void do_enfold( CHAR_DATA *ch, char *argument ) { if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_ELEMENTAL)) { send_to_char("Only Elementals may use ENFOLD.\n\r",ch); return; } if (ch->pcdata->powers[ELEMENTAL_AIR] < 3) { send_to_char("You Need At Least 3 In Air to do this.\n\r",ch); return; } if (IS_SET(ch->pcdata->powers[ELEMENTAL_POWERS], ELEMENTAL_ENFOLD)) { REMOVE_BIT(ch->pcdata->powers[ELEMENTAL_POWERS], ELEMENTAL_ENFOLD); send_to_char("Your Air Particles return to your body allowing people to escape.\n\r",ch); return; } else { send_to_char("You release air particles to keep your enemys from fleeing.\n\r",ch); SET_BIT(ch->pcdata->powers[ELEMENTAL_POWERS], ELEMENTAL_ENFOLD); return; } } void do_hydro(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; if (!IS_CLASS(ch, CLASS_ELEMENTAL)) { send_to_char("Huh.\n\r",ch); return; } /* if(is_safe(ch,victim) == TRUE) { stc("#0Not in a safe room dumbass#R.#n\n\r",ch); return; } */ if (ch->pcdata->powers[ELEMENTAL_WATER] < 3 ) { send_to_char("You need level 3 in WATER to use Hydro.\n\r",ch); return; } if (argument[0] == '\0') { stc("Who do you wish to unstance?\n\r", ch); return; } if ( ( victim = get_char_room(ch, NULL, argument) ) == NULL) { stc("They aren't here.\n\r", ch); return; } WAIT_STATE(ch, 12); if ( number_range(1,3) <= 2 ) { WAIT_STATE(ch, 4); do_say(ch,"#rEat Shit and Die!#n"); do_stance(victim, ""); set_fighting(ch, victim, TRUE); } } void do_evaporate( CHAR_DATA *ch, char *argument ) { if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_ELEMENTAL) ) { send_to_char("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ELEMENTAL_WATER] < 5) { send_to_char("You need level 5 in water to evaporate.\n\r", ch); return; } if (ch->move < 1000) { send_to_char("You don't have 1000 move to activate your power.\n\r", ch); return; } if (ch->fight_timer >0) { send_to_char("Not until your fight timer expires.\n\r", ch ); return; } if (!IS_SET(ch->pcdata->powers[ELEM_FORMS], WATER_FORM)) { stc("You can only evaporate in Water Form!!\n\r", ch ); return; } if ( IS_SET(ch->act, AFF_HIDE) ) { REMOVE_BIT(ch->act, AFF_HIDE); act( "$n reforms from a cloud of mist.", ch, NULL, NULL, TO_ROOM ); send_to_char( "You reform from a cloud of mist.\n\r", ch ); } else { act( "$n evaporates into mist.", ch, NULL, NULL, TO_ROOM ); send_to_char( "You evaporate into mist.\n\r", ch ); ch->move -= 1000; SET_BIT(ch->act, AFF_HIDE); } return; }