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