/*This class was created by Kasai for use on Dark Skies originally. */ #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_evolve (CHAR_DATA * ch, char *argument) { int cost; char buf[MSL]; if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } cost = ch->pcdata->powers[ZOM_LEVEL] * 1000; if (ch->pcdata->powers[ZOM_LEVEL] >= ZOM_WIGHT) { stc ("You have already perfected your body.\n\r", ch); return; } if (cost > ch->pcdata->powers[ZOM_FLESH]) { sprintf (buf, "You do not have enough flesh points. You need %d more.\n\r", cost - ch->pcdata->powers[ZOM_FLESH]); stc (buf, ch); return; } ch->pcdata->powers[ZOM_FLESH] -= cost; ch->pcdata->powers[ZOM_LEVEL] += 1; switch (ch->pcdata->powers[ZOM_LEVEL]) { default: do_evolve (ch, ""); return; break; case 2: stc ("Rotting flesh covers your bare bones in sinewy strands. You are now a wretch.\n\r", ch); stc ("#0Your bones can now become armor.\n\r", ch); stc ("#0Your eyes can now see death itself.\n\r", ch); stc ("#0You may destroy the soul of your victim.#n\n\r", ch); break; case 3: stc ("The flesh covering your body grows thicker and tougher, covering all of your exposed bones. You are now a Zombie.\n\r", ch); SET_BIT (ch->pcdata->powers[ZOM_ACTIVE], ZOM_DECAY); SET_BIT (ch->pcdata->powers[ZOM_ACTIVE], ZOM_ARISE); stc ("#0Your body exudes an aura of decay.\n\r", ch); stc ("#0Your body can move at the brink of death.\n\r", ch); stc ("#0You can ignite the fumes in corpses.#n\n\r", ch); break; case 4: stc ("Your flesh darkens and your eyes burn red. You are now a Minion.\n\r", ch); stc ("#0Claws grow where your fingers once were.\n\r", ch); SET_BIT (ch->pcdata->powers[ZOM_ACTIVE], ZOM_CLAWS); stc ("#0You gain control over your regenative powers.\n\r", ch); stc ("#0Your body can spawn the bodies of those you have devoured.#n\n\r", ch); break; case 5: stc ("Your senses increase, and you hear the souls of the damned screaming.\n\r", ch); SET_BIT (ch->pcdata->powers[ZOM_ACTIVE], ZOM_PLAGUE); SET_BIT (ch->pcdata->powers[ZOM_ACTIVE], ZOM_TOUGH); stc ("#0Your skin has grown tough and resiliant.\n\r", ch); stc ("#0Deadly plagues trail in your wake.\n\r", ch); stc ("#0You can command the lesser undead.#n\n\r", ch); break; case 6: stc ("Your strength grows and your flesh begins to swirl about your body. You are now a Forsaken.\n\r", ch); stc ("#0Your flesh can assimilate the bodies of the dead.\n\r", ch); stc ("#0Your flesh can absorb the dead and regenerate with them.\n\r", ch); stc ("#0You have the power to use the bodies you have assimilated.#n\n\r", ch); break; case 7: stc ("Your body turns as black as night, and you gain mastery over the plains of death.\n\r", ch); stc ("#0You can walk through the plain of shadows.\n\r", ch); stc ("#0You can hide yourself from the eye.\n\r", ch); stc ("#0You can send off noxious fumes.\n\r", ch); stc ("#0You can walk through the ethereal plain.#n\n\r", ch); break; } } void do_satiate (CHAR_DATA * ch, char *argument) { OBJ_DATA *corpse; OBJ_DATA *c_next; OBJ_DATA *obj; OBJ_DATA *obj_next; char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } for (corpse = ch->in_room->contents; corpse != NULL; corpse = c_next) { c_next = corpse->next_content; if ((corpse->item_type != ITEM_CORPSE_NPC && corpse->item_type != ITEM_CORPSE_PC) || corpse->pIndexData->vnum == 25) continue; ch->pcdata->powers[ZOM_FLESH] += 2; if(global_cp) ch->pcdata->powers[ZOM_FLESH] += 4; act ("$n absorbs a corpse.", ch, NULL, NULL, TO_ROOM); if(!global_cp) sprintf (buf, "You gain #r2#n flesh point.\n\r"); else sprintf (buf, "You gain #r4#n flesh point.\n\r"); send_to_char (buf, ch); for (obj = corpse->contains; obj; obj = obj_next) { obj_next = obj->next_content; obj_from_obj (obj); obj_to_room (obj, ch->in_room); } if (corpse != NULL) extract_obj (corpse); } return; } void do_gravespawn (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->position == POS_STANDING) { send_to_char ("You dig yourself into the healing moist soils of the earth.\n\r", ch); act ("$n digs themselves into the healing moist soils.", ch, NULL, NULL, TO_ROOM); ch->position = POS_MEDITATING; } else { stc ("You must be standing.\n\r", ch); return; } } void do_zombiesight (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (!IS_SET (ch->affected_by, AFF_SHADOWSIGHT)) { stc ("You can see through the shadows and the dark.\n\r", ch); SET_BIT (ch->affected_by, AFF_SHADOWSIGHT); } else { stc ("You can no longer see through the shadows and the dark.\n\r", ch); REMOVE_BIT (ch->affected_by, AFF_SHADOWSIGHT); } } void do_fleshportal (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; ROOM_INDEX_DATA *location; CHAR_DATA *victim; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { send_to_char ("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ZOM_LEVEL] < 2) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } if ((victim = get_char_world (ch, arg)) == NULL) { send_to_char ("Who do you wish to fleshportal to?\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_IMMUNE(victim, IMM_TRAVEL ) && !ragnarok && victim->fight_timer == 0) { send_to_char("He doesnt want you near him!\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; } location = victim->in_room; if (ch->move < 500) { send_to_char ("You don't have the strength.\n\r", ch); return; } act ("You enter a portal made from flesh.", ch, NULL, NULL, TO_CHAR); act ("$n grows a portal of flesh from their body and enters it.", ch, NULL, NULL, TO_ROOM); char_from_room (ch); char_to_room (ch, location); do_look (ch, "auto"); if (victim->fight_timer > 0) WAIT_STATE (ch, 8); act ("You exit your fleshportal by $N.", ch, NULL, victim, TO_CHAR); act ("$n appears from a portal of flesh.", ch, NULL, NULL, TO_ROOM); return; } void do_shatter (CHAR_DATA * ch, char *argument) { char buf[MSL]; int damage; int damage2; int oldl; CHAR_DATA *victim; if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->fighting == NULL || IS_NPC ((victim = ch->fighting))) { stc ("Only against players in combat!\n\r", ch); return; } if (number_range (1,3) > 1) { stc ("You failed!\n\r", ch); WAIT_STATE (ch, 12); return; } damage = number_range (1000, 5000); ch->hit -= damage; damage2 = damage *2; victim->hit -= damage2; sprintf (buf, "You burst into a pile of bones as your enemy attacks to avoid them! [#R%d#n]\n\r", damage); stc (buf, ch); sprintf (buf, "%s bursts into a pile of bones from your attack! [#7%d#n]\n\r", ch->pcdata->switchname, damage2); stc (buf, victim); hurt_person (ch, ch, damage); hurt_person (ch, victim, damage); oldl = ch->level; ch->level = 12; do_peace (ch, ""); ch->level = oldl; WAIT_STATE (ch, 12); WAIT_STATE (victim, 15); } void do_deathvision (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ZOM_LEVEL] < 2) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } if (!IS_SET (ch->newbits2, NEW2_DEATHSENSE)) { stc ("You can see the auras of life and death.\n\r", ch); SET_BIT (ch->newbits2, NEW2_DEATHSENSE); SET_BIT (ch->act, PLR_HOLYLIGHT); } else { stc ("You can no longer see the auras of life and death.\n\r", ch); REMOVE_BIT (ch->newbits2, NEW2_DEATHSENSE); REMOVE_BIT (ch->act, PLR_HOLYLIGHT); } } void do_relinquish (CHAR_DATA * ch, char *argument) { char arg[MSL]; int sn; CHAR_DATA *victim; int level; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ZOM_LEVEL] < 2) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } if (arg[0] == '\0') { stc ("Desanc whom?\n\r", ch); return; } if (ch->fighting != NULL) { stc ("You can only use this power to start combat.\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { stc ("They are not here.\n\r", ch); return; } if(victim == ch) { stc("not on yourself dummy",ch); return; } if (is_safe (ch, victim)) return; if (number_range (1,3) == 1) { stc ("You failed to Desanct!\n\r", ch); WAIT_STATE (ch, 6); return; } act ("$n cackles with glee as he destroys the hold of god from your body.\n\r", ch, NULL, victim, TO_VICT); act ("$n cackles with glee as he destroys the hold of god from $N's body.\n\r", ch, NULL, victim, TO_ROOM); act ("You cackles with glee as you destroy the hold of god from $N's body.\n\r", ch, NULL, victim, TO_CHAR); sn = skill_lookup ("desanct"); level = 25; (*skill_table[sn].spell_fun) (sn, level, ch, victim); set_fighting (ch, victim); set_fighting (victim, ch); if (!IS_NPC (victim)) ch->combat = victim; WAIT_STATE (ch, 18); } void do_explosion (CHAR_DATA * ch, char *argument) { OBJ_DATA *corpse; int dam; CHAR_DATA *vch; CHAR_DATA *vch_next; char arg[MSL]; char buf[MSL]; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ZOM_LEVEL] < 3) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } if (arg[0] == '\0') { stc ("Destroy which corpses?\n\r", ch); return; } if ((corpse = get_obj_room (ch, arg)) == NULL) { stc ("That corpse isnt here.\n\r", ch); return; } if (corpse->item_type != ITEM_CORPSE_NPC) { stc ("Only on mobile corpses.\n\r", ch); return; } sprintf (buf, "%s ignites the gases within %s!", ch->pcdata->switchname, corpse->short_descr); act (buf, ch, NULL, NULL, TO_ROOM); act (buf, ch, NULL, NULL, TO_CHAR); for (vch = ch->in_room->people; vch != NULL; vch = vch_next) { vch_next = vch->next_in_room; if (can_see (ch, vch)) if (IS_NPC (vch)) { dam = 2500 * ch->pcdata->powers[ZOM_LEVEL]; dam = number_range (dam * .5, dam * .9); sprintf (buf, "The firestorm rolls over %s!#r [#R%d#r]#n\n\r", vch->name, dam); send_to_char (buf, ch); set_fighting (vch, ch); hurt_person (ch, vch, dam); } } WAIT_STATE (ch, 12); if (corpse != NULL) extract_obj (corpse); } void do_regrow (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ZOM_LEVEL] < 4) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } if (ch->pcdata->powers[ZOM_FLESH] < 100) { stc ("You need 100 flesh points to do this!\n\r", ch); return; } act ("$n regrows all of their lost limbs.", ch, NULL, NULL, TO_ROOM); act ("You regrow all of your lost limbs.", ch, NULL, NULL, TO_CHAR); ch->loc_hp[0] = 0; ch->loc_hp[1] = 0; ch->loc_hp[2] = 0; ch->loc_hp[3] = 0; ch->loc_hp[4] = 0; ch->loc_hp[5] = 0; ch->loc_hp[6] = 0; WAIT_STATE (ch, 6); ch->pcdata->powers[ZOM_FLESH] -= 100; } void do_spawn (CHAR_DATA * ch, char *argument) { int i = 0; OBJ_DATA *corpse; if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ZOM_LEVEL] < 4) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } if (ch->pcdata->powers[ZOM_FLESH] < 10) { stc ("You need 10 flesh points to do this!\n\r", ch); return; } act ("$n spawns forth a group of corpses from $s skin.\n\r", ch, NULL, NULL, TO_ROOM); act ("You spawn forth a group of corpses from your skin.\n\r", ch, NULL, NULL, TO_CHAR); for (i = 0; i < 3; i += 1) { corpse = create_object (get_obj_index (25), 0); corpse->timer = number_range (2, 3); corpse->value[2] = 1000; SET_BIT (corpse->quest, QUEST_ZOMBIE); if (IS_AFFECTED (ch, AFF_SHADOWPLANE)) SET_BIT (corpse->extra_flags, ITEM_SHADOWPLANE); obj_to_room (corpse, ch->in_room); } WAIT_STATE (ch, 4); return; } void do_infest (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MSL]; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ZOM_LEVEL] < 5) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } if (arg[0] == '\0') { if (ch->fighting == NULL) { stc ("Infest who?\n\r", ch); return; } victim = ch->fighting; if (IS_SET (victim->newbits2, NEW2_INFEST)) { stc ("They are already infested.\n\r", ch); return; } if (IS_NPC (victim)) { stc ("Not on mobs.\n\r", ch); return; } SET_BIT (victim->newbits2, NEW2_INFEST); act ("$n calls forth a hoard of zombies to restrain $N!", ch, NULL, victim, TO_ROOM); act ("$n calls forth a hoard of zombies to restrain you!", ch, NULL, victim, TO_VICT); act ("You call forth a hoard of zombies to restrain $N!", ch, NULL, victim, TO_CHAR); } else { if ((victim = get_char_room (ch, arg)) == NULL) { stc ("Infest who?\n\r", ch); return; } if ((victim->fighting != NULL) && (victim->fighting->name != ch->name)) { if ((victim->pcdata->kingdom == 0) || (ch->pcdata->kingdom == 0)) { stc ("They are fighting someone else.", ch); return; } } if (IS_SET (victim->newbits2, NEW2_INFEST)) { stc ("They are already infested.\n\r", ch); return; } if (IS_NPC (victim)) { stc ("Not on mobs.\n\r", ch); return; } SET_BIT (victim->newbits2, NEW2_INFEST); act ("$n calls forth a hoard of zombies to restrain $N!", ch, NULL, victim, TO_ROOM); act ("$n calls forth a hoard of zombies to restrain you!", ch, NULL, victim, TO_VICT); act ("You call forth a hoard of zombies to restrain $N!", ch, NULL, victim, TO_CHAR); } } void do_assimilate (CHAR_DATA * ch, char *argument) { OBJ_DATA *corpse; char arg[MSL]; char buf[MSL]; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ZOM_LEVEL] < 6) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } if (arg[0] == '\0') { stc ("Assimilate which corpse?\n\r", ch); return; } if ((corpse = get_obj_room (ch, arg)) == NULL) { stc ("That corpse isnt here.\n\r", ch); return; } if (corpse->item_type != ITEM_CORPSE_NPC) { stc ("Only on mobile corpses.\n\r", ch); return; } sprintf (buf, "%s absorbs %s!", ch->pcdata->switchname, corpse->short_descr); act (buf, ch, NULL, NULL, TO_ROOM); act (buf, ch, NULL, NULL, TO_CHAR); WAIT_STATE (ch, 12); ch->hit += number_range (7500, 8000); if (ch->hit > ch->max_hit) ch->hit = ch->max_hit; if (corpse != NULL) extract_obj (corpse); } void do_store (CHAR_DATA * ch, char *argument) { OBJ_DATA *corpse; char arg[MSL]; char buf[MSL]; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ZOM_LEVEL] < 6) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } if (ch->pcdata->powers[ZOM_ASSIM] > (ch->tier + 1) * 5) { stc ("Your body can hold no more corpses.\n\r", ch); return; } if (arg[0] == '\0') { stc ("Store which corpse?\n\r", ch); return; } if ((corpse = get_obj_room (ch, arg)) == NULL) { stc ("That corpse isnt here.\n\r", ch); return; } if (corpse->item_type != ITEM_CORPSE_NPC) { stc ("Only on mobile corpses.\n\r", ch); return; } sprintf (buf, "%s stores %s inside of $mself!", ch->pcdata->switchname, corpse->short_descr); act (buf, ch, NULL, NULL, TO_ROOM); act (buf, ch, NULL, NULL, TO_CHAR); WAIT_STATE (ch, 4); ch->pcdata->powers[ZOM_ASSIM] += 1; if (corpse != NULL) extract_obj (corpse); } void do_forsake (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MSL]; // char buf[MSL]; int i; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ZOM_LEVEL] < 6) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } if (arg[0] == '\0' && ch->fighting == NULL) { stc ("Forsake whom?\n\r", ch); return; } if (arg[0] != '\0') { if ((victim = get_char_room (ch, arg)) == NULL) { stc ("They are not here.\n\r", ch); return; } } else { if ((victim = ch->fighting) == NULL) { stc ("Forsake whom?\n\r", ch); return; } } if (victim == ch) { stc ("Are you stupid?\n\r", ch); return; } stc ("Their life is forfeit...\n\r", ch); for (i = 0; i < ch->pcdata->powers[ZOM_ASSIM]; i += 1) { one_hit (ch, victim, -1, 0); } ch->pcdata->powers[ZOM_ASSIM] = 0; return; } void do_shed (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (has_timer (ch)) return; if (ch->pcdata->powers[ZOM_LEVEL] < 7) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } if (!IS_SET (ch->affected_by, AFF_ETHEREAL)) { stc ("Your spirit now roams freely.\n\r", ch); SET_BIT (ch->affected_by, AFF_ETHEREAL); } else { stc ("You grow yourself a body from the earth.\n\r", ch); REMOVE_BIT (ch->affected_by, AFF_ETHEREAL); } WAIT_STATE (ch, 6); } void do_haunt (CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ZOM_LEVEL] < 7) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } if (!IS_IMMUNE (ch, IMM_SHIELDED)) { send_to_char ("Spirits haunt you, protecting you from other's scrying eyes.\n\r", ch); SET_BIT (ch->immune, IMM_SHIELDED); return; } send_to_char ("You banish your protecting spirits.\n\r", ch); REMOVE_BIT (ch->immune, IMM_SHIELDED); } void do_noxious (CHAR_DATA * ch, char *argument) { CHAR_DATA *ich; int stun; if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { stc ("Huh?\n\r", ch); return; } if (ch->pcdata->powers[ZOM_LEVEL] < 7) { stc ("You are not a strong enough zombie for this.\n\r", ch); return; } act ("$n releases noxious fumes!", ch, NULL, NULL, TO_ROOM); act ("You release noxious fumes!", ch, NULL, NULL, TO_CHAR); for (ich = ch->in_room->people; ich != NULL; ich = ich->next_in_room) { if (ich == ch || ich->trust > 6) continue; if (IS_NPC (ich)) continue; stun = FALSE; if (IS_SET (ich->newbits2, NEW2_HAUNT)) { REMOVE_BIT (ich->newbits2, NEW2_HAUNT); stun = TRUE; } if (IS_SET (ich->act, PLR_WIZINVIS)) { REMOVE_BIT (ich->act, PLR_WIZINVIS); stun = TRUE; } if (IS_SET (ich->act, AFF_HIDE)) { REMOVE_BIT (ich->act, AFF_HIDE); stun = TRUE; } if (IS_SET (ich->affected_by, AFF_SHIFT)) { REMOVE_BIT (ich->affected_by, AFF_SHIFT); stun = TRUE; } if (IS_SET (ich->extra, EXTRA_EARTHMELD)) { REMOVE_BIT (ich->extra, EXTRA_EARTHMELD); stun = TRUE; } if (!IS_AFFECTED (ch, AFF_SHADOWPLANE) && IS_AFFECTED (ich, AFF_SHADOWPLANE)) { REMOVE_BIT (ich->affected_by, AFF_SHADOWPLANE); stun = TRUE; } if (IS_AFFECTED (ich, AFF_PEACE)) { REMOVE_BIT (ich->affected_by, AFF_PEACE); stun = TRUE; } if (IS_AFFECTED (ich, AFF_ETHEREAL)) { REMOVE_BIT (ich->affected_by, AFF_ETHEREAL); stun = TRUE; } if (IS_SET (ich->newbits2, NEW2_SPECTER)) { REMOVE_BIT (ich->newbits2, NEW2_SPECTER); stun = TRUE; } if (IS_SET (ich->newbits2, NEW2_HIDE)) { REMOVE_BIT (ich->newbits2, NEW2_HIDE); stun = TRUE; } if (IS_CLASS (ich, CLASS_VAMPIRE) && IS_SET (ich->polyaff, POLY_MIST)) { do_change (ich, "human"); stun = TRUE; } if ((IS_CLASS (ich, CLASS_DROW)) && IS_SET (ich->newbits, NEW_DARKNESS)) { REMOVE_BIT (ich->newbits, NEW_DARKNESS); REMOVE_BIT (ich->in_room->room_flags, ROOM_TOTAL_DARKNESS); stun = TRUE; } if (stun == TRUE) { WAIT_STATE (ich, 16); act ("$n is stunned by the noxious fumes and becomes visibile!", ich, NULL, NULL, TO_ROOM); act ("You are stunned by the noxious fumes and become visibile!", ich, NULL, NULL, TO_CHAR); } } } void do_zomscry (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; ROOM_INDEX_DATA *chroom; ROOM_INDEX_DATA *victimroom; char arg[MAX_INPUT_LENGTH]; argument = one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_ZOMBIE)) { send_to_char ("Huh?\n\r", ch); return; } if (arg[0] == '\0') { send_to_char ("Scry on whom?\n\r", ch); return; } if ((victim = get_char_world (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if(ch->in_room != NULL && IS_SET(ch->in_room->room_flags, ROOM_ASTRAL)){ stc("Not in an astral room.\n\r",ch); return; } chroom = ch->in_room; victimroom = victim->in_room; char_from_room (ch); char_to_room (ch, victimroom); if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && (!IS_AFFECTED (victim, AFF_SHADOWPLANE))) { REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE); do_look (ch, "auto"); SET_BIT (ch->affected_by, AFF_SHADOWPLANE); } else if (!IS_AFFECTED (ch, AFF_SHADOWPLANE) && (IS_AFFECTED (victim, AFF_SHADOWPLANE))) { SET_BIT (ch->affected_by, AFF_SHADOWPLANE); do_look (ch, "auto"); REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE); } else do_look (ch, "auto"); char_from_room (ch); char_to_room (ch, chroom); return; } void do_fleshbond(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; char arg[MIL]; char arg2[MIL]; char buf[MSL]; int tamount = 0; argument = one_argument(argument,arg); argument = one_argument(argument,arg2); if(IS_NPC(ch)) return; if(!IS_CLASS(ch,CLASS_ZOMBIE)){ stc("Huh?\n\r",ch); return; } if( (victim = get_char_room(ch,arg)) == NULL){ stc("Who do you wish to transfer power to?\n\r",ch); return; } if( IS_NPC(victim)){ stc("On an NPC?\n\r",ch); return; } if( !IS_CLASS(victim,CLASS_ZOMBIE)){ stc("They are not a Zombie.\n\r",ch); return; } if( arg2[0] == '\0'){ stc("How much power will you transfer? (1-1000000)\n\r",ch); return; } if( (tamount = atoi(arg2)) < 1 || tamount > 1000000){ stc("You can only transfer 1 to 1,000,000 points of flesh.\n\r",ch); return; } if( (ch->pcdata->powers[ZOM_FLESH] - tamount) < 0){ stc("You do not have enough power to do that.\n\r",ch); return; } sprintf(buf,"You transfer %d points of energy to %s.\n\r",tamount,victim->pcdata->switchname); stc(buf,ch); sprintf(buf,"%s transfers %d points of energy to you.\n\r",ch->pcdata->switchname,tamount); stc(buf,victim); ch->pcdata->powers[ZOM_FLESH] -= tamount; victim->pcdata->powers[ZOM_FLESH] += tamount; stc(buf,ch); stc(buf,victim); }