/***************************************************************************
* God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock *
* *
* Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little *
* This mud is NOT to be copied in whole or in part, or to be run without *
* the permission of Matthew Little. Nobody else has permission to *
* authorise the use of this code. *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#include <unistd.h>
#include <stdarg.h>
#include <limits.h>
#include "merc.h"
/****************************************************************************
* Gargoyles (C) Macademus July 2000 All Rights Reserved. *
* Coded for Legend of Chrystancia: godwars.net 6500. *
****************************************************************************/
/* Gargoyle Learn Power Command */
void do_endowment (CHAR_DATA * ch, char *argument)
{
char arg[MIL];
char arg2[MIL];
char buf[MSL];
argument = one_argument (argument, arg);
argument = one_argument (argument, arg2);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_GARGOYLE))
{
do_rand_typo (ch);
return;
}
if (arg[0] == '\0' && arg2[0] == '\0')
{
sprintf (buf,
" Sol ( %d ) Fidelis ( %d ) Fortitude ( %d )\n\r",
ch->pcdata->powers[GAR_SOL], ch->pcdata->powers[GAR_FIDEL],
ch->pcdata->powers[GAR_FOR]);
stc (buf, ch);
sprintf (buf, " Potence ( %d ) Visceratika ( %d )\n\r",
ch->pcdata->powers[GAR_POT], ch->pcdata->powers[GAR_VIS]);
stc (buf, ch);
}
if (!str_cmp (arg2, "learn") || !str_cmp (arg2, "improve"))
{
int improve;
int cost;
int max = 6;
if (!str_cmp (arg, "sol"))
improve = GAR_SOL;
else if (!str_cmp (arg, "fidelis"))
improve = GAR_FIDEL;
else if (!str_cmp (arg, "fortitude"))
improve = GAR_FOR;
else if (!str_cmp (arg, "visceratika"))
improve = GAR_VIS;
else if (!str_cmp (arg, "potene"))
improve = GAR_POT;
else
{
do_endowment (ch, "");
return;
}
cost = (ch->pcdata->powers[improve] + 1) * 10;
arg[0] = UPPER (arg[0]);
if (ch->pcdata->powers[improve] >= max)
{
sprintf (buf,
"You have already gained all of the %s Endowments.\n\r",
arg);
send_to_char (buf, ch);
return;
}
if (cost > ch->practice)
{
sprintf (buf,
"It costs you %d primal to learn a new %s Endowment.\n\r",
cost, arg);
send_to_char (buf, ch);
return;
}
ch->pcdata->powers[improve] += 1;
ch->practice -= cost;
sprintf (buf, "You have learned a new %s Endowment.\n\r", arg);
send_to_char (buf, ch);
return;
}
}
/* Sol Endowment
* The Light of God
** Veil of Shadows
*** Color of the Chameleon
**** Flesh of Molten Rock
***** Shade of Mirrors
****** Sun walk
******* Body of the Sun
******** Defiance of Apollo
*/
void do_lightofgod (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_GARGOYLE))
{
do_rand_typo (ch);
return;
}
if (ch->in_room == NULL)
{
do_rand_typo (ch);
return;
}
if (ch->pcdata->powers[GAR_SOL] < 1)
{
stc ("You need to learn level 1 Sol to use this power\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char ("Who do you want to blind?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("They are not here.\n\r", ch);
return;
}
if (victim->position != POS_FIGHTING && victim->hit < victim->max_hit)
{
send_to_char ("Nothing happens.\n\r", ch);
return;
}
if (is_safe (ch, victim))
return;
act ("$n eyes shine brightly.", ch, NULL, NULL, TO_ROOM);
stop_fighting (victim, TRUE);
update_pos (victim);
if (victim->position > POS_STUNNED)
victim->position = POS_STUNNED;
if (IS_NPC (victim))
do_kill (victim, ch->name);
WAIT_STATE (ch, 24);
return;
}
void do_vielshadow (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_GARGOYLE))
{
do_rand_typo (ch);
return;
}
if (ch->pcdata->powers[GAR_SOL] < 2)
{
stc ("You need to learn level 2 of Sol to use this power\n\r", ch);
return;
}
if (ch->in_room == NULL)
{
send_to_char ("Nothing happens.\n\r", ch);
return;
}
if (IS_SET (ch->more, MORE_DARKNESS))
{
REMOVE_BIT (ch->more, MORE_DARKNESS);
REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS);
send_to_char ("You banish the shadows from the room\n\r", ch);
act ("A look of concentration crosses $n's face.", ch, NULL, NULL,
TO_ROOM);
act ("$n banishes the darkness from the room!", ch, NULL, NULL,
TO_ROOM);
// ch->pcdata->darkness = 60;
return;
}
if (IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS))
{
send_to_char ("The room is already in darkness.\n\r", ch);
return;
}
/*
if (ch->pcdata->darkness > 0)
{
if (ch->pcdata->darkness > 1)
sprintf(buf,"You cannot call upon the Shroud of Night for another %d seconds.\n\r",ch->pcdata->darkness);
else
sprintf(buf,"You cannot call upon the Shroud of Night for another 1 second.\n\r");
send_to_char(buf,ch);
return;
}
*/
SET_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS);
SET_BIT (ch->more, MORE_DARKNESS);
// ch->pcdata->darkness = 60;
send_to_char ("You call forth your viel of shadows\n\r", ch);
act ("A look of concentration crosses $n's face.", ch, NULL, NULL,
TO_ROOM);
act ("The room is filled with a viel of shadows", ch, NULL, NULL, TO_ROOM);
return;
}
void do_chameleon (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_GARGOYLE))
{
do_rand_typo (ch);
return;
}
if (ch->pcdata->powers[GAR_SOL] < 3)
{
stc ("You need to learn level 3 of sol to use this power\n\r", ch);
return;
}
if (IS_SET (ch->act, PLR_WIZINVIS))
{
REMOVE_BIT (ch->act, PLR_WIZINVIS);
send_to_char ("You slowly fade into existance.\n\r", ch);
act ("The light bends and $n slowly appears.", ch, NULL, NULL, TO_ROOM);
}
else
{
send_to_char ("You slowly fade out of existance.\n\r", ch);
act ("The light bends and $n slowly fades out of existance.", ch, NULL,
NULL, TO_ROOM);
SET_BIT (ch->act, PLR_WIZINVIS);
}
return;
}
void do_fleshofmoltenrock (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_GARGOYLE))
{
do_rand_typo (ch);
return;
}
if (ch->pcdata->powers[GAR_SOL] < 4)
{
stc ("You need to learn level 4 of soul to use this power\n\r", ch);
return;
}
if (IS_SET (ch->more, MORE_FLESH))
{
REMOVE_BIT (ch->more, MORE_FLESH);
stc ("Your flesh reverts to normal.\n\r", ch);
act ("$n's flesh slowly hardens as it cools down.", ch, NULL, NULL,
TO_ROOM);
}
else
{
send_to_char ("Your flesh turns to molten rock.\n\r", ch);
act ("$n's flesh starts bubbling as it turns to molton rock.", ch, NULL,
NULL, TO_ROOM);
SET_BIT (ch->more, MORE_FLESH);
}
return;
}
void do_shademirror (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
CHAR_DATA *original;
OBJ_DATA *obj;
OBJ_DATA *obj2;
char arg[MAX_INPUT_LENGTH];
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_GARGOYLE))
{
do_rand_typo (ch);
return;
}
if (IS_SET (ch->flag2, AFF2_CHALLENGED)
|| IS_SET (ch->flag2, AFF2_CHALLENGER))
{
send_to_char ("Not while in the arena!\n\r", ch);
return;
}
if (ch->pcdata->powers[GAR_SOL] < 5)
{
stc ("You need to learn level 4 of sol to use this power.\n\r", ch);
return;
}
if (ch->pcdata->followers > 4)
{
send_to_char ("Nothing happens.\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char ("Who do you wish to Form an Illusion of?\n\r", ch);
return;
}
if ((original = get_char_room (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (original->level > 200 || IS_IMMORTAL (original))
{
send_to_char ("Nothing happens.\n\r", ch);
return;
}
ch->pcdata->followers++;
victim = create_mobile (get_mob_index (MOB_VNUM_GUARDIAN));
char_to_room (victim, get_room_index (ROOM_VNUM_DISCONNECTION));
free_string (victim->lord);
victim->lord = str_dup (ch->name);
free_string (victim->name);
victim->name = str_dup (original->name);
free_string (victim->short_descr);
if (IS_NPC (original))
victim->short_descr = str_dup (original->short_descr);
else
victim->short_descr = str_dup (original->name);
free_string (victim->long_descr);
if (IS_NPC (original))
victim->long_descr = str_dup (original->long_descr);
else
victim->long_descr = str_dup ("");
if (strlen (original->description) > 1)
{
free_string (victim->description);
victim->description = str_dup (original->description);
}
SET_BIT (victim->act, ACT_NOPARTS);
SET_BIT (victim->act, ACT_NOEXP);
{
OBJ_DATA *obj_next;
for (obj = original->carrying; obj != NULL; obj = obj_next)
{
obj_next = obj->next_content;
if (obj->wear_loc != WEAR_NONE)
{
if ((obj2 = create_object (obj->pIndexData, 0)) != NULL)
{
SET_BIT (obj2->extra_flags, ITEM_VANISH);
obj_to_char (obj2, victim);
wear_obj (victim, obj2, obj->wear_loc);
}
}
}
}
if (IS_NPC (original))
victim->level = original->level;
else
victim->level = 50;
victim->hit = original->hit;
victim->max_hit = original->max_hit;
victim->mana = original->mana;
victim->max_mana = original->max_mana;
victim->move = original->move;
victim->max_move = original->max_move;
victim->hitroll = char_hitroll (original);
victim->damroll = char_damroll (original);
victim->armor = char_ac (original);
char_from_room (victim);
char_to_room (victim, original->in_room);
send_to_char ("A mirror image of you shimmers into existance.\n\r",
original);
act ("A mirror image of $n appears in the room.", original, NULL, NULL,
TO_ROOM);
return;
}
void do_sunwalk (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (!IS_CLASS (ch, CLASS_GARGOYLE))
{
do_rand_typo (ch);
return;
}
if (ch->fight_timer > 0)
{
send_to_char ("Not until your fight timer expires.\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char ("Who do you wish to sunwalk to?\n\r", ch);
return;
}
if (ch->pcdata->powers[GAR_SOL] < 6)
{
stc ("You need level 5 sol to use this power.\n\r", ch);
return;
}
if ((victim = get_char_world (ch, arg)) == NULL
|| victim == ch
|| victim->in_room == NULL
|| ch->in_room == NULL || (!IS_NPC (victim)) || victim->level > (250))
{
send_to_char ("Nothing happens.\n\r", ch);
return;
}
if (victim->in_room == ch->in_room)
{
send_to_char ("But you are already there!\n\r", ch);
return;
}
if (IS_SET (victim->in_room->room_flags, ROOM_SAFE)
|| IS_SET (victim->in_room->room_flags, ROOM_PRIVATE)
|| IS_SET (victim->in_room->room_flags, ROOM_SOLITARY)
|| IS_SET (victim->in_room->room_flags, ROOM_NO_RECALL)
|| victim->position != POS_STANDING
|| (!IS_NPC (victim) && !IS_IMMUNE (victim, IMM_SUMMON)))
{
send_to_char ("You are unable to focus on their location.\n\r", ch);
return;
}
send_to_char ("You step into the suns rays.\n\r", ch);
act ("$n steps into the suns rays and vanishes from sight.", ch, NULL,
NULL, TO_ROOM);
char_from_room (ch);
char_to_room (ch, victim->in_room);
do_look (ch, "");
send_to_char ("You step out of the suns rays.\n\r", ch);
act ("$N steps from the rays of the sun.", victim, NULL, ch, TO_CHAR);
act ("$N steps from the rays of the sun.", victim, NULL, ch, TO_ROOM);
return;
}
/* Fidelis Endowment
* Breath of God
** Fear of God
*** Speach of Babylon
**** Blood of Christ
***** Lazuras Touch
****** Penance Glare
******* Trumpets of Gabriel
*/
void do_gbreath (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int dam, sn;
one_argument (argument, arg);
if (IS_NPC (ch))
return;
if ((sn = skill_lookup ("god breath")) < 0)
{
send_to_char ("Bah! bug let Macademus know.\n\r", ch);
return;
}
if (!IS_CLASS (ch, CLASS_GARGOYLE))
{
do_rand_typo (ch);
return;
}
if (ch->pcdata->powers[GAR_FIDEL] < 1)
{
stc ("You need to learn Fidelis 1 before using this power.\n\r", ch);
return;
}
if (arg[0] == '\0' && ch->fighting == NULL)
{
send_to_char ("Who do you wish to use Breath of God on?\n\r", ch);
return;
}
if ((victim = ch->fighting) == NULL)
{
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
}
if (is_safe (ch, victim))
return;
dam = number_range (750, 1250);
if (!IS_AWAKE (victim))
dam *= 2;
damage (ch, victim, dam, gsn_gbreath);
WAIT_STATE (ch, 6);
return;
}