#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "merc.h"
void do_chaossurge(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
int dam;
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_SPHERE(ch, SPHERE_CHAOS))
{
send_to_char("#0This is a Chaos Sphere Ability#n\n\r", ch);
return;
}
if ((victim = get_char_room(ch, arg)) == NULL)
{
send_to_char("They are not here.\n\r", ch);
return;
}
if (IS_NPC(victim))
{
send_to_char("Not on mobiles.\n\r", ch);
return;
}
if (is_safe(ch, victim))
return;
if (victim == ch)
{
send_to_char("That doesn't seem like a good idea.\n\r", ch);
return;
}
if (victim->alignment < -500)
{
send_to_char("They are too evil, you cannot affect them.\n\r",
ch);
return;
}
if (victim->alignment > 500)
dam = 5000;
else if (victim->alignment > 0)
dam = 2500;
else
dam = 1000;
printf(buf, "You let chaos envelope $N and $E is hurt [%d]", dam);
act(buf, ch, NULL, victim, TO_CHAR);
printf(buf,
"$n points a wicked finger at you and chaos strikes your mind! [%d]",
dam);
act(buf, ch, NULL, victim, TO_VICT);
printf(buf, "$n strikes $N down with a burst of pure #RCHAOS!#n.");
act(buf, ch, NULL, victim, TO_NOTVICT);
hurt_person(ch, victim, dam);
WAIT_STATE(ch, 12);
return;
}
void do_chaosgate(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
ROOM_INDEX_DATA *location;
CHAR_DATA *victim;
int random_room;
one_argument(argument, arg);
if (IS_NPC(ch))
return;
if ((victim = get_char_world(ch, arg)) == NULL)
{
send_to_char("Chaosgate to whom?\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) && !IS_NPC(victim))
{
send_to_char("I don't think they want you to do that.\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("Your room is not connected to the astral plane.\n\r",
ch);
return;
}
if (ch->move < 1000)
{
send_to_char
("You don't have the move to open a chaosgate.\n\r",
ch);
return;
}
if (number_range(1, 15) != 1)
location = victim->in_room;
else
{
send_to_char("Something went wrong.\n\r", ch);
for (;;)
{
random_room = number_range(1000, 65535);
location = get_room_index(random_room);
if (location != NULL)
if ( !IS_SET
(location->room_flags, ROOM_PRIVATE)
// !IS_SET(location->room_flags,
// ROOM_SOLITARY)
&& !IS_SET(location->room_flags,
ROOM_NO_TELEPORT))
break;
}
}
act("You open a gate made from pure chaos and steps into it.", ch,
NULL, NULL, TO_CHAR);
act("$n opens a gate of pure chaos and steps into it.", ch, NULL,
NULL, TO_ROOM);
ch->move -= 1000;
char_from_room(ch);
char_to_room(ch, location);
do_look(ch, "auto");
act("You step out of the gate.", ch, NULL, NULL, TO_CHAR);
act("A gate appears from out of nowhere and $n steps out of it.", ch,
NULL, NULL, TO_ROOM);
return;
}
void do_chaosmagic(CHAR_DATA * ch, char *argument)
{
char arg[MAX_STRING_LENGTH];
CHAR_DATA *victim;
int sn, randnum, level;
argument = one_argument(argument, arg);
level = ch->spl[RED_MAGIC] / 4;
if (IS_NPC(ch))
return;
if (!IS_SPHERE(ch, SPHERE_CHAOS))
{
send_to_char("#0You need the chaos sphere for this.#n\n\r", ch);
return;
}
if (ch->mana < 1500)
{
send_to_char("You need more mana.\n\r", ch);
return;
}
if (ch->in_room != NULL)
{
if (IS_SET(ch->in_room->room_flags, ROOM_SAFE))
{
send_to_char
("You cannot invoke the forces of chaos in a safe room.\n\r",
ch);
return;
}
}
if (arg[0] == '\0' && ch->fighting != NULL)
victim = ch->fighting;
else if ((victim = get_char_room(ch, arg)) == NULL)
{
send_to_char("They are not here.\n\r", ch);
return;
}
randnum = number_range(1, 12);
if (randnum == 1)
sn = skill_lookup("spirit kiss");
else if (randnum == 2)
sn = skill_lookup("desanct");
else if (randnum == 3)
sn = skill_lookup("imp heal");
else if (randnum == 4)
sn = skill_lookup("imp fireball");
else if (randnum == 5)
sn = skill_lookup("imp faerie fire");
else if (randnum == 6)
sn = skill_lookup("imp teleport");
else if (randnum == 7)
sn = skill_lookup("change sex");
else if (randnum == 8)
sn = skill_lookup("shield");
else if (randnum == 9)
sn = skill_lookup("readaura");
else if (randnum == 10)
sn = skill_lookup("earthquake");
else if (randnum == 11)
sn = skill_lookup("gate");
else if (randnum == 12)
sn = skill_lookup("dispel magic");
else
sn = 0;
if (sn > 0)
(*skill_table[sn].spell_fun) (sn, level, ch, victim);
ch->mana -= 1500;
WAIT_STATE(ch, 6);
return;
}
void do_chaosshield(CHAR_DATA * ch, char *argument)
{
if (IS_NPC(ch))
return;
if (!IS_SPHERE(ch, SPHERE_CHAOS))
{
send_to_char("#0This is a Chaos Sphere Ability#n\n\r", ch);
return;
}
if (!IS_IMMUNE(ch, IMM_SHIELD2))
{
send_to_char
("You shield your aura from those around you.\n\r",
ch);
SET_BIT(ch->immune, IMM_SHIELD2);
return;
}
send_to_char("You stop shielding your aura.\n\r", ch);
REMOVE_BIT(ch->immune, IMM_SHIELD2);
return;
}
void do_chaos(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
AFFECT_DATA af;
int chaos, dam;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_SPHERE(ch, SPHERE_CHAOS))
{
send_to_char("#0This is a Chaos Sphere Ability#n\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char("#RCast chaos orb on whom?\n\r", ch);
return;
}
if ((victim = get_char_room(ch, arg)) == NULL)
{
send_to_char("They are not here.\n\r", ch);
return;
}
if (is_safe(ch, victim))
{
stc("You cannot attack them.\n\r", ch);
return;
}
if (ch->mana < 5000)
{
stc("You do not ave the required 5000 mana.\n\r", ch);
return;
}
chaos = number_range(1, 9);
act("#r$n#0 begins chanting dark words, summoning forth a sphere of #rc#lh#pa#go#cs#0 to hurl at #r$N!#n", ch, NULL, victim, TO_NOTVICT);
printf(buf,
"#0You summon forth a perfect sphere of #rc#lh#pa#go#cs#0 and hurl it at #r$N!#n\n\r");
act(buf, ch, NULL, victim, TO_CHAR);
printf(buf,
"#r$n#0 summons forth a perfect sphere of #rc#lh#pa#go#cs#0 and hurls it at you!#n\n\r");
act(buf, ch, NULL, victim, TO_VICT);
if (chaos == 1 || chaos == 6)
{
stc("The sphere explodes in a shower of #Ggreen bubbles#n.\n\r", victim);
stc("Your sphere explodes in a shower of #Ggreen bubbles#n.\n\r", ch);
if (IS_AFFECTED(victim, AFF_POISON))
return;
af.type = gsn_poison;
af.duration = chaos * 10;
af.location = APPLY_STR;
af.modifier = 0 - number_range(3, 8);
af.bitvector = AFF_POISON;
affect_join(victim, &af);
WAIT_STATE(victim, number_range(5, 20));
send_to_char("#GYou are poisoned!#n\n\r", victim);
}
else if (chaos == 2 || chaos == 7)
{
stc("The sphere explodes, forming a #yyellow haze#n.\n\r",
victim);
stc("Your sphere explodes, forming a #yyellow haze#n.\n\r",
ch);
if (IS_AFFECTED(victim, AFF_BLIND))
{
af.type = gsn_blindness;
af.location = APPLY_HITROLL;
af.modifier = -750;
af.duration = chaos * 10;
af.bitvector = AFF_BLIND;
affect_to_char(victim, &af);
WAIT_STATE(victim, number_range(5, 15));
send_to_char("#yYou are blinded!#n\n\r", victim);
}
else
{
stc("They are already blinded.\n\r", ch);
}
}
else if (chaos == 3 || chaos == 8)
{
stc("The sphere explodes in a shower of #Rred flames#n.\n\r",
victim);
stc("Your sphere explodes in a shower of #Rred flames#n.\n\r",
ch);
WAIT_STATE(victim, number_range(5, 20));
SET_BIT(victim->affected_by, AFF_FLAMING);
}
else if (chaos == 4 || chaos == 9)
{
dam = number_range(7500, 15000);
printf(buf,
"The sphere explodes in a scattering of #Lblue sparks#n. #R[#y%d#R]#n\n\r",
dam);
stc(buf, victim);
printf(buf,
"Your sphere explodes in a scattering of #Lblue sparks#n. #R[#y%d#R]#n\n\r",
dam);
stc(buf, ch);
WAIT_STATE(victim, number_range(5, 8));
hurt_person(ch, victim, dam);
}
else if (chaos == 5)
{
stc("The sphere dissipates before it hits you#n.\n\r",
victim);
stc("Your dissipates shortly after casting#n.\n\r", ch);
}
WAIT_STATE(ch, 4);
ch->mana -= 5000;
if (victim->hit < -10)
victim->hit = -10;
return;
}