/* <(()Seeds of Hate: Swords & Sorcery Edition())> | | _\|::>< Draconian Class ><::|/_ | | |Class Tier Number: I| | | |Coder: Trent| | | *Draconian is an original class made for Seeds of Hate, Swords & Sorcery | | Edition! | | Please don't copy without permission and due credit! | | Thanks. | | -Trent, God of PaiN! (ASDF!) | X--------------------------------------------------------------------------------X */ /*************************************************************************** * _/ _/ * * _/_/_/ _/_/ _/_/_/ _/ _/_/ _/ _/ _/_/_/ * * _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ * * _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ * * _/ _/ _/ _/_/_/ _/ _/_/ _/_/_/ _/_/_/ * *************************************************************************** * Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius), * * Additional credits are in the help file CODECREDITS * * All Rights Reserved. * ***************************************************************************/ #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 "interp.h" #include "magic.h" void do_dragonrun(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_DRACONIAN)) { send_to_char("Huh?\n\r", ch); return; } if (arg[0] == '\0') { send_to_char("Run to whom?\n\r", ch); return; } if ((victim = get_char_world(ch, arg)) == NULL) { send_to_char("They are not of this world.\n\r", ch); return; } if (ch->move < 1000) { stc("The path escapes your senses as you lose control over your inner energies.\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(victim->act, ACT_NOTRAVEL)) { send_to_char("No Can Do.\n\r", ch); return; } if (IS_SET(ch->in_room->room_flags, ROOM_ASTRAL)) { stc("You cannot sense any paths leading from this room.\n\r", ch); return; } if (ch == victim) { send_to_char("But you're already at yourself!\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 (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON)) { send_to_char("They don't want you near them.\n\r", ch); return; } if (victim->in_room == ch->in_room) { send_to_char("But you're already there!\n\r", ch); return; } act("You run to $N.", ch, NULL, victim, TO_CHAR); act("$n runs off into the distance", ch, NULL, victim, TO_ROOM); char_from_room(ch); char_to_room(ch, victim->in_room); ch->move -= 1000; act("$n runs from over the hills to $N.", ch, NULL, victim, TO_NOTVICT); act("$n runs over the hills and up to you.", ch, NULL, victim, TO_VICT); do_look(ch, "auto"); return; } void do_dragonorb(CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DRACONIAN)) { send_to_char("Huh?\n\r", ch); return; } if (arg1[0] == '\0' && arg2[0] == '\0') { stc("#G _______\n\r", ch); stc("#G \\ #Y\\\\ #G)#Y\\ #rD#Rragon #rO#Rrbs\n\r", ch); stc("#G ) __#Y\\\\ ||\n\r", ch); stc("#G / #Y//#G_#Y/ |\n\r", ch); stc("#G_/ __#Y||#G_#Y|#g(__#Y |\n\r", ch); stc("#G \\ #Y\\\\#g_) #R`#g-\\#Y | /\n\r", ch); stc("#G ) #g/' /^^^ #P___ #Y/\n\r", ch); xprintf(buf, "#G /__ #g/ \\' #P/ #W*#P\\ #yY#Yellow: #R+#Y(#G%d#Y)#R+\n\r", ch->pcdata->powers[ORB_YELLOW]); stc(buf, ch); xprintf(buf, "#G / `\\ #g| \\ #G|#y-- #p| #P| #Y--- #gG#Green: #R+#Y(#G%d#Y)#R+\n\r", ch->pcdata->powers[ORB_GREEN]); stc(buf, ch); stc("#G |/#g\\ \\ \\_#G__#p\\,_,#P/\n\r", ch); stc("#G | #g\\ \\----#G---/' #Y\\\n\r", ch); stc("#g \\ \\ #Y| \\\n\r", ch); stc("#g #R) #g) | #Y|\n\r", ch); stc("#g \\/ / #Y|\n\r", ch); stc("#g / /\\\\\n\r", ch); stc("#g | (_)|\n\r", ch); stc("#g \\___/#n\n\r", ch); return; } if (arg2[0] == '\0') { if (!str_cmp(arg1, "yellow")) { stc("#oY#yellow Dragon Orb Powers#n\n\r", ch); if (ch->pcdata->powers[ORB_YELLOW] >= 1) stc("Fiery Eyes - Truesight.\n\r", ch); if (ch->pcdata->powers[ORB_YELLOW] >= 2) stc("Claws - Gain razor sharp claws.\n\r", ch); if (ch->pcdata->powers[ORB_YELLOW] >= 3) stc("Headbash - A ramming headbutt.\n\r", ch); if (ch->pcdata->powers[ORB_YELLOW] >= 4) stc("Alacrity - Increases speed.\n\r", ch); if (ch->pcdata->powers[ORB_YELLOW] >= 5) stc("Acid Blood - Turn your blood to acid!\n\r", ch); if (ch->pcdata->powers[ORB_YELLOW] >= 6) stc("Lizardform - Shift into draconian form!\n\r", ch); return; } else if (!str_cmp(arg1, "green")) { stc("#gG#Green Dragon Orb Powers#n#n\n\r", ch); if (ch->pcdata->powers[ORB_GREEN] >= 1) stc("Tail Lash - A dextrous tail attack.\n\r", ch); if (ch->pcdata->powers[ORB_GREEN] >= 2) stc("Venomspit - Spit venom into your opponent's eyes.\n\r", ch); if (ch->pcdata->powers[ORB_GREEN] >= 3) stc("Dragonmight - Embody a sliver of power of the true dragon.\n\r", ch); if (ch->pcdata->powers[ORB_GREEN] >= 4) stc("Scales - Grow hard, reflective scales onto your body.\n\r", ch); if (ch->pcdata->powers[ORB_GREEN] >= 5) stc("Gasbreath - A draconian breath weapon.\n\r", ch); if (ch->pcdata->powers[ORB_GREEN] >= 6) stc("Firebreath - A red dragon breath weapon.\n\r", ch); return; } else { stc("To view powers you've gained from an orb, type : dragonorb <yellow/green>\n\r", ch); stc("To learn powers, type: Dragonorb <yellow/green> Tap\n\r", ch); return; } } if (!str_cmp(arg2, "tap")) { int improve; int cost; int max; if (!str_cmp(arg1, "yellow")) { improve = ORB_YELLOW; max = 6; } else if (!str_cmp(arg1, "green")) { improve = ORB_GREEN; max = 6; } else { send_to_char ("#gS#Gyntax: #YDragonorb <yellow/green> Tap#n\n\r", ch); return; } cost = (ch->pcdata->powers[improve] + 1) * 1000000; arg1[0] = UPPER(arg1[0]); if (ch->pcdata->powers[improve] >= max) { xprintf(buf, "#GYou've tapped as much power from the #y%s #GDragon Orb as you can!#n\n\r", arg1); send_to_char(buf, ch); return; } if (cost > ch->exp) { xprintf(buf, "#GYou require #y%d #Gexp to tap the #y%s #GDragon Orb!#n\n\r", cost, arg1); send_to_char(buf, ch); return; } ch->pcdata->powers[improve] += 1; ch->exp -= cost; xprintf(buf, "#GYou successfully tap the energies from the #y%s #GDragon Orb!#n\n\r", arg1); send_to_char(buf, ch); } else send_to_char ("#gSyntax: #GDragonorb #y<yellow/green> #GTap.#n\n\r", ch); return; } void do_spikes(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int cost = 0; int spikes = 0; int urin = 0; int urin_counter = 0; int dam; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DRACONIAN)) { stc("Huh?\n\r", ch); return; } if (arg1[0] == '\0' && arg2[0] == '\0') { stc("#R+#Y------#G------#g---#G------#Y------#R+#n\n\r", ch); xprintf(buf, " #gY#Gou have #Y%d #Gspikes!#n\n\r", ch->pcdata->stats[DRACONIAN_SPIKES]); stc(buf, ch); stc("#R+#Y------#G------#g---#G------#Y------#R+#n\n\r", ch); return; } if (!str_cmp(arg1, "release")) { if (ch->fighting == NULL) { stc("Not unless fighting!\n\r", ch); return; } if (ch->pcdata->stats[DRACONIAN_SPIKES] < 1) { stc("You have no spikes to shoot!\n\r", ch); return; } victim = ch->fighting; dam = number_range(ch->pcdata->stats[DRACONIAN_SPIKES] * 20, ch->pcdata->stats[DRACONIAN_SPIKES] * 40); xprintf(buf, "#GYour spikes shoot from your body, #Rimpaling #y$N! #0[#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "#GA plethora of sharp spikes shoot from #y$n's #Gbody, #Rimpaling #Gyou! #0[#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_VICT); act("#g$n #Gshoots a plethora of sharp spikes from $s body at #y$N, #Rimpaling #Gthem!#n", ch, NULL, victim, TO_NOTVICT); hurt_person(ch, victim, dam); ch->pcdata->stats[DRACONIAN_SPIKES] = 0; return; } else if (!str_cmp(arg1, "grow")) { if (arg2[0] == '\0') { stc("#gSyntax: #Gspikes grow <amount>#n\n\r", ch); return; } if (ch->position <= POS_FIGHTING) { stc("You must be idle and standing to do this!\n\r", ch); return; } if (ch->fight_timer > 0) { stc("Not with a fight timer!\n\r", ch); return; } if (arg2[0] == '\0') { stc("#GHow many spikes do you wish to grow?#n\n\r", ch); return; } if (!is_number(arg2)) { stc("Please enter a numeric value between 1 and 200!\n\r", ch); return; } if (ch->pcdata->stats[DRACONIAN_SPIKES] >= 200) { stc("You cannot grow any more spikes!\n\r", ch); return; } if (is_number(arg2)) { spikes = atoi(arg2); cost = spikes * 10000; if (spikes > 200 || spikes < 1) { stc("Please enter a numeric value between 1 and 200!\n\r", ch); return; } for (urin = 0; urin < spikes; urin++) { if (ch->exp >= 10000 && ch->pcdata->stats[DRACONIAN_SPIKES] < 200) { ch->exp -= 10000; ch->pcdata->stats[DRACONIAN_SPIKES]++; urin_counter += 1; } } if (urin_counter == 0) { send_to_char ("You need more exp to gain any more spikes.\n\r", ch); } if (urin_counter == 1) { send_to_char("#GYou gain #y1 #Gspike.#n\n\r", ch); } if (urin_counter > 1) { xprintf(buf, "#GYou gain #y%d #Gspikes.#n\n\r", urin_counter); send_to_char(buf, ch); } return; } } else { stc("Syntax: spikes grow <amount>\n\r", ch); stc(" spikes release\n\r", ch); stc(" spikes\n\r", ch); return; } } void do_fieryeyes(CHAR_DATA * ch, char *argument) { if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DRACONIAN)) { send_to_char("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ORB_YELLOW] < 1) { stc("Huh?\n\r", ch); return; } if (IS_SET(ch->act, PLR_HOLYLIGHT)) { REMOVE_BIT(ch->act, PLR_HOLYLIGHT); send_to_char("Your vision re-adjusts to normal.\n\r", ch); } else { SET_BIT(ch->act, PLR_HOLYLIGHT); send_to_char("#RYour eyes burn with a hateful fire.#n\n\r", ch); } return; } void do_dclaws(CHAR_DATA * ch, char *argument) { if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DRACONIAN)) { send_to_char("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ORB_YELLOW] < 2) { stc("Huh?\n\r", ch); return; } if (IS_VAMPAFF(ch, VAM_CLAWS)) { send_to_char("#GYou retract your claws.#n\n\r", ch); act("#y$n #Gretracts #g$s #Gclaws.#n\n\r", ch, NULL, NULL, TO_ROOM); REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_CLAWS); return; } else { send_to_char ("#GRazor sharp claws extend from your fingers!#n\n\r", ch); act("#GRazor sharp claws extend from #y$n's #Gfingers.#n\n\r", ch, NULL, NULL, TO_ROOM); SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CLAWS); return; } } void do_headbash(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int dam; int stun; argument = one_argument(argument, arg); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DRACONIAN)) { stc("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ORB_YELLOW] < 3) { stc("Huh?\n\r", ch); return; } if ((victim = get_char_room(ch, NULL, arg)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (ch->fighting == NULL) { stc("You must be fighting to use this!\n\r", ch); return; } if (is_safe(ch, victim)) { stc("You can't attack them!\n\r", ch); return; } if (ch == victim) { send_to_char("Not on yourself.\n\r", ch); return; } if (ch->move < 500) { send_to_char("You don't have enough move.\n\r", ch); return; } stun = number_percent(); if (stun < 60) { dam = number_range(3000, 7000); xprintf(buf, "#GYou bash your head into #y$N's! #R*#yCraCk#R* #0[#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "#y$n #Gbashes $s head into yours! #R*#yCraCk#R* #0[#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_VICT); act("#g$n #Gbashes $s head into #y$N's! #R*#yCraCk#R*#n", ch, NULL, victim, TO_NOTVICT); hurt_person(ch, victim, dam); } else if (stun >= 60) { dam = number_range(4500, 7000); xprintf(buf, "#GYou bash your head into #Y$N's! #R*#YCraCk#R* #0[#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "#Y$n #Gbashes $s head into yours! #R*#YCraCk#R* #0[#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_VICT); act("#g$n #Gbashes $s head into #y$N's! #R*#YCraCk#R*#n", ch, NULL, victim, TO_NOTVICT); act("#y$N #Gkeels over and falls to the ground, #Rstunned!#n", ch, NULL, victim, TO_CHAR); act("#GYou keel over and fall to the ground, #Rstunned!#n", ch, NULL, victim, TO_VICT); act("#y$N #Gkeels over and falls to the ground, #Rstunned!#n", ch, NULL, victim, TO_NOTVICT); hurt_person(ch, victim, dam); stop_fighting(victim, TRUE); victim->position = POS_STUNNED; } ch->move -= 500; WAIT_STATE(ch, 12); } void do_acidblood(CHAR_DATA * ch, char *argument) { if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DRACONIAN)) { send_to_char("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ORB_YELLOW] < 5) { stc("Huh?\n\r", ch); return; } if (IS_SET(ch->newbits2, NEW2_ACIDBLOOD)) { stc("#0The deadly #Gacidity #0fades from your blood.#n\n\r", ch); REMOVE_BIT(ch->newbits2, NEW2_ACIDBLOOD); return; } stc("#0Your blood becomes #Gvile #0and terribly #Gacidic!#n\n\r", ch); SET_BIT(ch->newbits2, NEW2_ACIDBLOOD); WAIT_STATE(ch, 12); return; } void do_lizardform(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DRACONIAN)) { send_to_char("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ORB_YELLOW] < 6) { stc("Huh?\n\r", ch); return; } if (ch->move < 5000) { stc("You don't have the required 10000 move to use this!\n\r", ch); return; } if (ch->mana < 5000) { stc("You don't have the required 10000 mana to use this!\n\r", ch); return; } if (IS_POLYAFF(ch, POLY_LIZARDFORM)) { act("#gYou return to your human form.#n", ch, NULL, NULL, TO_CHAR); act("#Y$n #Greverts to $s normal form.#n", ch, NULL, NULL, TO_ROOM); REMOVE_BIT(ch->polyaff, POLY_LIZARDFORM); REMOVE_BIT(ch->affected_by, AFF_POLYMORPH); ch->hitroll -= 900; ch->damroll -= 900; ch->armor += 950; free_string(ch->morph); ch->morph = str_dup(""); return; } ch->move -= 5000; ch->mana -= 5000; stc("#GYou feel your skin begin to harden and grow cold!#n\n\r", ch); stc("#GYour snout extends, and razor sharp teeth grow from your gums!#n\n\r", ch); act("#GYou roar as you polymorph into a ferocious draconian lizard!!#n", ch, NULL, NULL, TO_CHAR); act("#y$n #Groars as they transform into a ferocious draconian lizard!#n", ch, NULL, NULL, TO_ROOM); ch->hitroll += 900; ch->damroll += 900; ch->armor -= 950; SET_BIT(ch->polyaff, POLY_LIZARDFORM); SET_BIT(ch->affected_by, AFF_POLYMORPH); if (ch->generation == 6) xprintf(buf, "#R%s#G, the scrawny lizard man#n", ch->pcdata->switchname); else if (ch->generation == 5) xprintf(buf, "#R%s#G, the muscular lizard man#n", ch->pcdata->switchname); else if (ch->generation == 4) xprintf(buf, "#R%s#G, the giant lizard#n", ch->pcdata->switchname); else if (ch->generation == 3) xprintf(buf, "#R%s#G, the vicious draconian#n", ch->pcdata->switchname); else xprintf(buf, "#R%s#G, the bloodthirsty draconian#n", ch->pcdata->switchname); free_string(ch->morph); ch->morph = str_dup(buf); WAIT_STATE(ch, 12); return; } void do_dtail(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_DRACONIAN)) { stc("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ORB_GREEN] < 1) { stc("Huh?\n\r", ch); return; } if ((victim = get_char_room(ch, NULL, arg)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (ch->fighting == NULL) { stc("You must be fighting to use this!\n\r", ch); return; } if (ch == victim) { send_to_char("Not on yourself.\n\r", ch); return; } if (is_safe(ch, victim)) { stc("You can't attack them!\n\r", ch); return; } if (ch->move < 500) { send_to_char("You don't have enough move.\n\r", ch); return; } if (number_range(1, 10) > 6) { act("#GYou sweep your tail at #Y$N!", ch, NULL, victim, TO_CHAR); act("#Y$n #Gsweeps $s tail at you!#n", ch, NULL, victim, TO_VICT); act("#g$n #Gsweeps $s tail at $Y$N#n", ch, NULL, victim, TO_NOTVICT); trip(ch, victim); } else { act("#GYou sweep your tail at #Y$N, #Gbut they jump over it!#n", ch, NULL, victim, TO_CHAR); act("#Y$n #Gsweeps $s tail at you, but you jump over it!#n", ch, NULL, victim, TO_VICT); act("#g$n #Gsweeps $s tail at #Y$N, #Gbut they jump over it!#n", ch, NULL, victim, TO_NOTVICT); } ch->move -= 500; WAIT_STATE(ch, 8); return; } void do_venomspit(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; AFFECT_DATA af; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int dam; argument = one_argument(argument, arg); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DRACONIAN)) { stc("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ORB_GREEN] < 2) { stc("Huh?\n\r", ch); return; } if ((victim = get_char_room(ch, NULL, arg)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (ch == victim) { send_to_char("Not on yourself.\n\r", ch); return; } if (is_safe(ch, victim)) { stc("You can't attack them!\n\r", ch); return; } if (ch->move < 1000) { send_to_char("You don't have the required 1000 move.\n\r", ch); return; } dam = number_range(ch->pcdata->powers[ORB_GREEN] * 200, ch->pcdata->powers[ORB_GREEN] * 600); xprintf(buf, "#0You spit a #Gvenomous substance #0at #R$N! #0[#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "#R$n #0spits a #Gvenomous substance #0at you! #0[#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_VICT); act("#R$n #0spits a #Gvenomous substance #0at #R$N!#n", ch, NULL, victim, TO_NOTVICT); hurt_person(ch, victim, dam); if (!IS_AFFECTED(victim, AFF_BLIND) && number_percent() > 60) { spell_blindness(skill_lookup("blindness"), ch->generation * 10, ch, victim); } if (!IS_AFFECTED(victim, AFF_POISON) && number_percent() > 50) { af.type = gsn_poison; af.duration = ch->generation * 10; af.location = APPLY_STR; af.modifier = 0 - number_range(1, 3); af.bitvector = AFF_POISON; affect_join(victim, &af); send_to_char("You feel very sick.\n\r", victim); if (!IS_NPC(victim)) xprintf(buf, "%s looks very sick as your poison takes affect.\n\r", victim->name); else xprintf(buf, "%s looks very sick as your poison takes affect.\n\r", victim->short_descr); send_to_char(buf, ch); } WAIT_STATE(ch, 12); if (ch->fighting != victim) ch->fighting = victim; ch->move -= 1000; return; } void do_dscales(CHAR_DATA * ch, char *argument) { if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DRACONIAN)) { send_to_char("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ORB_GREEN] < 4) { stc("Huh?\n\r", ch); return; } if (IS_SET(ch->newbits2, NEW2_SCALES)) { stc("#GYour scales #7shimmer and vanish.#n\n\r", ch); REMOVE_BIT(ch->newbits2, NEW2_SCALES); ch->armor += 650; return; } stc("#GYour skin #7shimmers, #Gand is coated in a thick layer of #Yglossy scales!#n\n\r", ch); SET_BIT(ch->newbits2, NEW2_SCALES); ch->armor -= 650; WAIT_STATE(ch, 12); return; } void do_gasbreath(CHAR_DATA * ch, char *argument) { CHAR_DATA *vch; CHAR_DATA *vch_next; char buf[MAX_STRING_LENGTH]; int dam; if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DRACONIAN)) { stc("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ORB_GREEN] < 5) { stc("Huh?\n\r", ch); return; } if (ch->move < 500) { stc("You have not the 250 move to use this!\n\r", ch); return; } act("You rear back your head and blow forth a powerful cloud of gas!", ch, NULL, NULL, TO_CHAR); act("$n rears back $s head and blows forth a powerful cloud of gas!", ch, NULL, NULL, TO_ROOM); dam = (ch->pcdata->powers[ORB_GREEN] * 300) + (ch->pcdata->powers[ORB_YELLOW] * 300) + number_range(100, 300); for (vch = ch->in_room->people; vch != NULL; vch = vch_next) { vch_next = vch->next_in_room; if (!can_see(ch, vch)) continue; if (!is_safe(ch, vch)) if (IS_NPC(ch) ? !IS_NPC(vch) : IS_NPC(vch)) { dam = ((ch->pcdata->powers[ORB_GREEN] * 300) + (ch->pcdata->powers[ORB_YELLOW] * 300) + number_range(-500, 100)); if (IS_AFFECTED(vch, AFF_SANCTUARY)) dam /= 2; xprintf(buf, "#0Your gasbreath overcomes #R%s! #0[#R%d#0]#n\n\r", vch->short_descr, dam); stc(buf, ch); if (vch->fighting != ch) set_fighting(vch, ch, 1); hurt_person(ch, vch, dam); } continue; } ch->move -= 250; WAIT_STATE(ch, 12); return; } void do_firebreath(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int dam; argument = one_argument(argument, arg); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DRACONIAN)) { stc("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ORB_GREEN] < 6) { stc("Huh?\n\r", ch); return; } if ((victim = get_char_room(ch, NULL, arg)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (ch == victim) { send_to_char("Not on yourself.\n\r", ch); return; } if (is_safe(ch, victim)) { stc("You can't shoot them!\n\r", ch); return; } if (ch->move < 5000) { send_to_char("You don't have the required 5000 move.\n\r", ch); return; } if (ch->mana < 5000) { stc("You don't have the required 5000 mana!\n\r", ch); return; } dam = number_range(ch->pcdata->powers[ORB_GREEN] * 500, ch->pcdata->powers[ORB_GREEN] * 1200); dam += number_range(500, 2000); if (IS_NPC(victim)) dam *= 2; xprintf(buf, "#gYou rear back your head and blow forth a huge ball of #Rf#Yl#Wa#Ym#Re #gat #G$N! #0[#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "#G$n #grears back $s head and blows forth a huge ball of #Rf#Yl#Wa#Ym#Re #gat you! #0[#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_VICT); act("#G$n #grears back $s head and blows forth a huge ball of #Rf#Yl#Wa#Ym#Re #gat #G$N!#n", ch, NULL, victim, TO_NOTVICT); if (!IS_AFFECTED(victim, AFF_FLAMING)) { SET_BIT(victim->affected_by, AFF_FLAMING); act("#r$N #Rcatches on #Yfire #Rand begins to burn!#n", ch, NULL, victim, TO_CHAR); act("#RYou catch on #Yfire #Rand begin to burn!#n", ch, NULL, victim, TO_VICT); act("#r$N #Rcatches on fire and begins to burn!#n", ch, NULL, victim, TO_NOTVICT); } if (ch->fighting != victim) set_fighting(ch, victim, 1); hurt_person(ch, victim, dam); ch->move -= 5000; ch->mana -= 5000; WAIT_STATE(ch, 15); return; } void do_deathstate(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; int state; argument = one_argument(argument, arg); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DRACONIAN)) { stc("Huh?\n\r", ch); return; } if (ch->exp < 500000) { stc("It costs 500,000 exp to set or change your deathstate!\n\r", ch); return; } if (arg[0] == '\0') { stc("#R+#y------#G------#g---#G------#y------#R+#n\n\r", ch); stc("#RYour art of self destruction:#n\n\r", ch); if (IS_SET(ch->pcdata->stats[1], DRACONIAN_PETRIFY)) stc("#7P#Wetrification#n\n\r", ch); else if (IS_SET(ch->pcdata->stats[1], DRACONIAN_ACIDBATH)) stc("#gA#Gcid #gB#Gath#n\n\r", ch); else if (IS_SET(ch->pcdata->stats[1], DRACONIAN_FLAMEDEATH)) stc("#RF#Ylaming #RD#Yeath#n\n\r", ch); else if (IS_SET(ch->pcdata->stats[1], DRACONIAN_CHLOROFORM)) stc("#GC#0hloroform #GE#0ffusion#n\n\r", ch); else { stc("#RYou have not yet set a deathstate!#n\n\r", ch); stc("#RSyntax: Deathstate <state>#n\n\r", ch); stc("#rStates: Petrify, Acid, Flame, Chloroform.#n\n\r", ch); } stc("#R+#y------#G------#g---#G------#y------#R+#n\n\r", ch); return; } if (!str_cmp(arg, "petrify")) state = DRACONIAN_PETRIFY; else if (!str_cmp(arg, "acid")) state = DRACONIAN_ACIDBATH; else if (!str_cmp(arg, "flame")) state = DRACONIAN_FLAMEDEATH; else if (!str_cmp(arg, "chloroform")) state = DRACONIAN_CHLOROFORM; else { stc("Syntax: Deathstate <petrify/acid/flame/chloroform>\n\r", ch); return; } if (IS_SET(ch->pcdata->stats[1], DRACONIAN_PETRIFY)) REMOVE_BIT(ch->pcdata->stats[1], DRACONIAN_PETRIFY); else if (IS_SET(ch->pcdata->stats[1], DRACONIAN_ACIDBATH)) REMOVE_BIT(ch->pcdata->stats[1], DRACONIAN_ACIDBATH); else if (IS_SET(ch->pcdata->stats[1], DRACONIAN_FLAMEDEATH)) REMOVE_BIT(ch->pcdata->stats[1], DRACONIAN_FLAMEDEATH); else if (IS_SET(ch->pcdata->stats[1], DRACONIAN_CHLOROFORM)) REMOVE_BIT(ch->pcdata->stats[1], DRACONIAN_CHLOROFORM); SET_BIT(ch->pcdata->stats[1], state); ch->exp -= 500000; stc("Deathstate set!\n\r", ch); return; } void draconian_death(CHAR_DATA * ch, CHAR_DATA * victim) { OBJ_DATA *damaged; OBJ_DATA *obj; CHAR_DATA *vch; CHAR_DATA *vch_next; AFFECT_DATA af; char buf[MAX_STRING_LENGTH]; int dam; //object damage int dam2; if (IS_NPC(victim)) return; if (!IS_CLASS(victim, CLASS_DRACONIAN)) return; //Acid Bath - hurts player and dmgs their eq. if (IS_SET(victim->pcdata->stats[1], DRACONIAN_ACIDBATH)) { dam = number_range(50, 99); dam2 = number_range(2000, 3000); xprintf(buf, "#G$N's #0body #REXPLODES, #0splashing #Ghot acid #0all over you! #0[#R%d#0]#n", dam2); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "#0Your body #REXPLODES, #0splashing #Ghot acid #0all over #G%s! #0[#R%d#0]#n\n\r", ch->pcdata->switchname, dam2); stc(buf, victim); act("#G$N's #0body #REXPLODES, #0splashing #Ghot acid #0all over #G$n!#n", ch, NULL, victim, TO_NOTVICT); if (is_safe(ch, victim)) { return; } else { hurt_person(victim, ch, dam2); } if ((damaged = get_eq_char(ch, WEAR_FACE)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_BODY)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_ABOUT)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_FEET)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_LEGS)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_HEAD)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_ARMS)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_HOLD)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_WIELD)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_HANDS)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_WRIST_L)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_WRIST_R)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_FINGER_L)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } if ((damaged = get_eq_char(ch, WEAR_FINGER_R)) != NULL && damaged->toughness > 0) { act("$p takes acid damage!", ch, damaged, NULL, TO_CHAR); damaged->condition -= dam; if (damaged->condition < 1) { act("$p disintegrates!", ch, damaged, NULL, TO_CHAR); act("$n gasps as $p disintegrates!", ch, damaged, NULL, TO_ROOM); obj_from_char(damaged); extract_obj(damaged); } } } //End of Acid Bath else if (IS_SET(victim->pcdata->stats[1], DRACONIAN_FLAMEDEATH)) //Flaming Death : Good dmg, fire affect. { dam = number_range(3000, 6000); xprintf(buf, "#R$N's #0body #rEX#RP#7LO#RD#rES #0in #Rf#Yl#Wam#Ye#Rs, #0searing your flesh! [#R%d#0]#n", dam); act(buf, ch, NULL, victim, TO_CHAR); xprintf(buf, "#0Your body #rEX#RP#7LO#RD#rES #0in #Rf#Yl#Wam#Ye#Rs, #0searing #R$n's #0flesh! [#R%d#0]#n", dam); stc(buf, victim); act("#R$N's #0body #rEX#RP#7LO#RD#rES #0in #Rf#Yl#Wam#Ye#Rs, #0searing #R$n's #0flesh!#n", ch, NULL, victim, TO_NOTVICT); hurt_person(victim, ch, dam); if (!IS_AFFECTED(ch, AFF_FLAMING)) { SET_BIT(ch->affected_by, AFF_FLAMING); stc("#RYou catch #Yfire!#n\n\r", ch); xprintf(buf, "#r%s #Rcatches #Yfire!#n\n\r", ch->pcdata->switchname); stc(buf, victim); } } else if (IS_SET(victim->pcdata->stats[1], DRACONIAN_PETRIFY)) //Petrify: ch loses wielded wpn, and is 'stunned' { act("#7$N's #0body turns to #7stone, #0petrifying you!", ch, NULL, victim, TO_CHAR); xprintf(buf, "#0Your body turns to #7stone, #0petrifying #W%s!#n\n\r", ch->pcdata->switchname); stc(buf, victim); act("#7$N's #0body turns to #7stone, #0petrifying #W$n!", ch, NULL, victim, TO_NOTVICT); WAIT_STATE(ch, 24); if ((obj = get_eq_char(ch, WEAR_WIELD)) != NULL) { act("#0Your weapon is wrenched from your hands as #7$N's #0corpse falls limp to the ground!#n", ch, NULL, victim, TO_CHAR); xprintf(buf, "#7%s's #0weapon is wrenched from their hands as your corpse falls limp to the ground!#n\n\r", ch->pcdata->switchname); stc(buf, victim); act("#7$n's #0weapon is wrenched from $s hands as $N's corpse falls limp to the ground!#n", ch, NULL, victim, TO_NOTVICT); obj_from_char(obj); obj_to_char(obj, victim); } } else if (IS_SET(victim->pcdata->stats[1], DRACONIAN_CHLOROFORM)) //Chloroform Effusion: gasses room and chance to stun/poison { act("#P$N's #0corpse releases a foul smelling cloud of #Pgas!#n", ch, NULL, victim, TO_CHAR); stc("#0Your corpse releases a foul smelling cloud of #Pgas!#n\n\r", victim); act("#P$N's #0corpse releases a foul smelling cloud of #Pgas#n!", ch, NULL, victim, TO_NOTVICT); for (vch = ch->in_room->people; vch != NULL; vch = vch_next) { vch_next = vch->next_in_room; if (!IS_NPC(vch) && vch != victim) { dam = number_range(1000, 3000); xprintf(buf, "#0Your #Pchloroform gas #0overcomes #R%s! #0[#R%d#0]#n\n\r", vch->pcdata->switchname, dam); stc(buf, victim); xprintf(buf, "#R%s's #Pchloroform gas #0overcomes you! #0[#R%d#0]#n\n\r", victim->pcdata->switchname, dam); stc(buf, vch); hurt_person(victim, vch, dam); if (!IS_AFFECTED(vch, AFF_POISON) && number_range(1, 3) > 2) { af.type = gsn_poison; af.duration = victim->generation * 10; af.location = APPLY_STR; af.modifier = 0 - number_range(1, 3); af.bitvector = AFF_POISON; affect_join(vch, &af); send_to_char ("You feel very sick.\n\r", victim); if (!IS_NPC(vch)) { xprintf(buf, "%s looks very sick as your poison takes affect.\n\r", vch->pcdata-> switchname); stc("#0You have been #Gpoisoned!#n\n\r", vch); } else xprintf(buf, "%s looks very sick as your poison takes affect.\n\r", vch->short_descr); send_to_char(buf, victim); } if (vch->position != POS_STUNNED && number_range(1, 3) < 2) { vch->position = POS_STUNNED; stc("#0You pass out from the stench!\n\r", vch); WAIT_STATE(vch, 12); } } } } return; }