/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/***************************************************************************
* _/ _/ *
* _/_/_/ _/_/ _/_/_/ _/ _/_/ _/ _/ _/_/_/ *
* _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ *
* _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ *
* _/ _/ _/ _/_/_/ _/ _/_/ _/_/_/ _/_/_/ *
***************************************************************************
* Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius), *
* Additional credits are in the help file CODECREDITS *
* All Rights Reserved. *
***************************************************************************/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "interp.h"
void horn args((CHAR_DATA * ch));
char *const dir_name[] = {
"north", "east", "south", "west", "up", "down"
};
const sh_int rev_dir[] = {
2, 3, 0, 1, 5, 4
};
const sh_int movement_loss[SECT_MAX] = {
1, 2, 2, 3, 4, 6, 4, 1, 6, 10, 6
};
/*
* Local functions.
*/
int find_door args((CHAR_DATA * ch, char *arg));
bool has_key args((CHAR_DATA * ch, int key));
int count_imms args((CHAR_DATA * ch));
bool check_track args((CHAR_DATA * ch, int direction));
void add_tracks args((CHAR_DATA * ch, int direction));
void drow_hate args((CHAR_DATA * ch));
void move_char(CHAR_DATA * ch, int door)
{
CHAR_DATA *fch;
CHAR_DATA *fch_next;
CHAR_DATA *mount;
ROOM_INDEX_DATA *in_room;
ROOM_INDEX_DATA *to_room;
OBJ_DATA *obj;
EXIT_DATA *pexit;
DESCRIPTOR_DATA *d;
char buf[MAX_STRING_LENGTH];
char poly[MAX_STRING_LENGTH];
char mount2[MAX_INPUT_LENGTH];
char leave[20];
int revdoor;
bool bad_wall = FALSE;
if (door < 0 || door > 5)
{
bug("Do_move: bad door %d.", door);
return;
}
/*
* Exit trigger, if activated, bail out. Only PCs are triggered.
*/
if (!IS_NPC(ch)
&& (p_exit_trigger(ch, door, PRG_MPROG)
|| p_exit_trigger(ch, door, PRG_OPROG)
|| p_exit_trigger(ch, door, PRG_RPROG)))
return;
in_room = ch->in_room;
if (!in_room)
{
bug("Move_char : ch not in any room.", 0);
return;
}
if ((pexit = in_room->exit[door]) == NULL
|| (to_room = pexit->to_room) == NULL)
{
send_to_char("Alas, you cannot go that way.\n\r", ch);
return;
}
if (!IS_NPC(ch) && IS_CLASS(ch, CLASS_DROID)
&& IS_SET(ch->newbits, NEW_CUBEFORM))
{
if (!IS_SET
(ch->pcdata->powers[DROID_IMPLANTS], IMPLANT_LARVAFEET)
|| ch->fighting)
{
send_to_char
("Battlestations don't go anywhere, they stand still and fight.\n\r",
ch);
return;
}
WAIT_STATE(ch, 4);
send_to_char("Chrss..chrss...chrrrr...shh...\n\r", ch);
}
if (door == DIR_NORTH
&& ((obj = get_obj_list(ch, "walln", ch->in_room->contents)) !=
NULL
|| (obj =
get_obj_list(ch, "walls", to_room->contents)) != NULL))
bad_wall = TRUE;
if (door == DIR_SOUTH
&& ((obj = get_obj_list(ch, "walls", ch->in_room->contents)) !=
NULL
|| (obj =
get_obj_list(ch, "walln", to_room->contents)) != NULL))
bad_wall = TRUE;
if (door == DIR_EAST
&& ((obj = get_obj_list(ch, "walle", ch->in_room->contents)) !=
NULL
|| (obj =
get_obj_list(ch, "wallw", to_room->contents)) != NULL))
bad_wall = TRUE;
if (door == DIR_WEST
&& ((obj = get_obj_list(ch, "wallw", ch->in_room->contents)) !=
NULL
|| (obj =
get_obj_list(ch, "walle", to_room->contents)) != NULL))
bad_wall = TRUE;
if (door == DIR_UP
&& ((obj = get_obj_list(ch, "wallu", ch->in_room->contents)) !=
NULL
|| (obj =
get_obj_list(ch, "walld", to_room->contents)) != NULL))
bad_wall = TRUE;
if (door == DIR_DOWN
&& ((obj = get_obj_list(ch, "walld", ch->in_room->contents)) !=
NULL
|| (obj =
get_obj_list(ch, "wallu", to_room->contents)) != NULL))
bad_wall = TRUE;
if (bad_wall)
{
send_to_char("You are unable to pass the wall.\n\r", ch);
return;
}
if (IS_SET(pexit->exit_info, EX_CLOSED)
&& (!IS_AFFECTED(ch, AFF_PASS_DOOR)
|| IS_SET(pexit->exit_info, EX_NOPASS))
&& !IS_AFFECTED(ch, AFF_ETHEREAL) && !IS_IMMORTAL(ch)
&& !IS_AFFECTED(ch, AFF_SHADOWPLANE))
{
if (!IS_NPC(ch) && IS_CLASS(ch, CLASS_WEREWOLF) &&
ch->power[DISC_WERE_BOAR] > 0
&& !IS_SET(pexit->exit_info, EX_PRISMATIC_WALL))
{
act("You smash open the $d.", ch, NULL,
pexit->keyword, TO_CHAR);
act("$n smashes open the $d.", ch, NULL,
pexit->keyword, TO_ROOM);
REMOVE_BIT(pexit->exit_info, EX_CLOSED);
}
else
{
act("The $d is closed.", ch, NULL, pexit->keyword,
TO_CHAR);
return;
}
}
if (IS_SET(pexit->exit_info, EX_PRISMATIC_WALL)
&& IS_SET(pexit->exit_info, EX_CLOSED))
{
stc("The prismatic wall prevents movement through this closed exit.\n\r", ch);
return;
}
if (IS_AFFECTED(ch, AFF_CHARM)
&& ch->master != NULL && in_room == ch->master->in_room)
{
send_to_char("What? And leave your beloved master?\n\r", ch);
return;
}
if (IS_NPC(ch) && (mount = ch->mount) != NULL
&& IS_SET(ch->mounted, IS_MOUNT))
{
send_to_char
("You better wait for instructions from your rider.\n\r",
ch);
return;
}
if (room_is_private(to_room))
{
if (IS_NPC(ch) || ch->trust < MAX_LEVEL)
{
send_to_char("That room is private right now.\n\r",
ch);
return;
}
else
send_to_char
("That room is private (Access granted).\n\r",
ch);
}
if ((IS_LEG_L(ch, BROKEN_LEG) || IS_LEG_L(ch, LOST_LEG)) &&
(IS_LEG_R(ch, BROKEN_LEG) || IS_LEG_R(ch, LOST_LEG)) &&
(IS_ARM_L(ch, BROKEN_ARM) || IS_ARM_L(ch, LOST_ARM) ||
get_eq_char(ch, WEAR_HOLD) != NULL) &&
(IS_ARM_R(ch, BROKEN_ARM) || IS_ARM_R(ch, LOST_ARM) ||
get_eq_char(ch, WEAR_WIELD) != NULL))
{
send_to_char
("You need at least one free arm to drag yourself with.\n\r",
ch);
return;
}
else if (IS_BODY(ch, BROKEN_SPINE) &&
(IS_ARM_L(ch, BROKEN_ARM) || IS_ARM_L(ch, LOST_ARM) ||
get_eq_char(ch, WEAR_HOLD) != NULL) &&
(IS_ARM_R(ch, BROKEN_ARM) || IS_ARM_R(ch, LOST_ARM) ||
get_eq_char(ch, WEAR_WIELD) != NULL))
{
send_to_char("You cannot move with a broken spine.\n\r", ch);
return;
}
if (!IS_NPC(ch))
{
int move;
if (in_room->sector_type == SECT_AIR
|| to_room->sector_type == SECT_AIR)
{
if (!IS_AFFECTED(ch, AFF_FLYING) &&
(!IS_NPC(ch) && (!IS_CLASS(ch, CLASS_DROW) ||
!IS_SET(ch->pcdata->powers[1], DPOWER_LEVITATION)))
&& (!IS_NPC(ch) && !IS_VAMPAFF(ch, VAM_FLYING)
&& (!IS_NPC(ch)
&& !IS_DEMAFF(ch, DEM_UNFOLDED)))
&& !((mount = ch->mount) != NULL
&& IS_SET(ch->mounted, IS_RIDING)
&& IS_AFFECTED(mount, AFF_FLYING)))
{
send_to_char("You can't fly.\n\r", ch);
return;
}
}
if (in_room->sector_type == SECT_WATER_NOSWIM
|| to_room->sector_type == SECT_WATER_NOSWIM)
{
//OBJ_DATA *obj;
bool found;
/*
* Look for a boat.
*/
found = FALSE;
if (!IS_NPC(ch) && IS_CLASS(ch, CLASS_VAMPIRE))
{
if (IS_VAMPAFF(ch, VAM_FLYING))
found = TRUE;
else if (IS_POLYAFF(ch, POLY_SERPENT))
found = TRUE;
else if (IS_AFFECTED(ch, AFF_SHADOWPLANE))
found = TRUE;
else if ((mount = ch->mount) != NULL
&& IS_SET(ch->mounted, IS_RIDING)
&& IS_AFFECTED(mount, AFF_FLYING))
found = TRUE;
else
{
send_to_char
("You are unable to cross running water.\n\r",
ch);
return;
}
}
if (IS_AFFECTED(ch, AFF_FLYING))
found = TRUE;
else if (!IS_NPC(ch) && IS_DEMAFF(ch, DEM_UNFOLDED))
found = TRUE;
else if (!IS_NPC(ch) && (IS_CLASS(ch, CLASS_DROW) && IS_SET(ch->pcdata->powers[1], DPOWER_LEVITATION)))
found = TRUE;
if (!found)
{
for (obj = ch->carrying; obj != NULL;
obj = obj->next_content)
{
if (obj->item_type == ITEM_BOAT)
{
found = TRUE;
break;
}
}
if (!found)
{
send_to_char
("You need a boat to go there.\n\r",
ch);
return;
}
}
}
else if (!IS_AFFECTED(ch, AFF_FLYING)
&& IS_POLYAFF(ch, POLY_FISH))
{
bool from_ok = FALSE;
bool to_ok = FALSE;
if (in_room->sector_type == SECT_WATER_NOSWIM)
from_ok = TRUE;
if (in_room->sector_type == SECT_WATER_SWIM)
from_ok = TRUE;
if (to_room->sector_type == SECT_WATER_NOSWIM)
to_ok = TRUE;
if (to_room->sector_type == SECT_WATER_SWIM)
to_ok = TRUE;
if (!from_ok || !to_ok)
{
send_to_char("You cannot cross land.\n\r",
ch);
return;
}
}
move = movement_loss[UMIN(SECT_MAX - 1, in_room->sector_type)]
+
movement_loss[UMIN
(SECT_MAX - 1, to_room->sector_type)];
if (IS_HERO(ch))
move = 0;
if (ch->move <= 0)
{
send_to_char("You are too Exhausted.\n\r", ch);
return;
}
if (IS_SET(ch->mounted, IS_RIDING)
&& (ch->move < move || ch->move < 1))
{
send_to_char("You are too exhausted.\n\r", ch);
return;
}
if (IS_SET(pexit->exit_info, EX_IRON_WALL)
&& !IS_AFFECTED(ch, AFF_PASS_DOOR))
{
send_to_char
("A towering wall of iron blocks your path.\n\r",
ch);
act("$n's path is blocked by the wall of iron.", ch,
NULL, NULL, TO_ROOM);
return;
}
if (IS_SET(pexit->exit_info, EX_MUSHROOM_WALL))
{
send_to_char("The mushrooms block your path.\n\r",
ch);
return;
}
if (IS_SET(pexit->exit_info, EX_ICE_WALL)
&& ch->power[DISC_DAEM_GELU] < 5)
{
send_to_char
("A huge wall of ice blocks your way.\n\r",
ch);
return;
}
if (IS_SET(pexit->exit_info, EX_FIRE_WALL) && ch->class == 0)
{
act("$n bursts through the wall of fire.", ch, NULL,
NULL, TO_ROOM);
send_to_char
("You jump through the flames and are unaffected.\n\r",
ch);
}
else if (IS_SET(pexit->exit_info, EX_FIRE_WALL)
&& ch->class != 0 && !IS_NPC(ch) && ch->level > 2)
{
act("$n bursts through the wall of fire.", ch, NULL,
NULL, TO_ROOM);
send_to_char("You jump through the flames.\n\r", ch);
ch->hit -= dice(6, 50);
stc("The flames sear your flesh.\n\r", ch);
}
if (IS_SET(pexit->exit_info, EX_SWORD_WALL) && ch->class == 0)
{
act("$n bursts through the wall of swords.", ch, NULL,
NULL, TO_ROOM);
send_to_char
("You jump through the swords and are unaffected.\n\r",
ch);
}
else if (IS_SET(pexit->exit_info, EX_SWORD_WALL)
&& ch->class != 0 && !IS_NPC(ch) && ch->level > 2)
{
act("$n jumps through the wall of swords.", ch, NULL,
NULL, TO_ROOM);
send_to_char("You jump through the swords.\n\r", ch);
send_to_char("Aaaaaaaaarghhhhhhh! That hurt!\n\r",
ch);
ch->hit -= dice(6, 70);
}
if (IS_SET(pexit->exit_info, EX_ASH_WALL))
{
send_to_char
("You scream in agony as the wall of ash rips apart your life force.\n\r",
ch);
act("$n screams in agony as the wall of ash rips $s life force apart.", ch, NULL, NULL, TO_ROOM);
ch->hit /= 2;
ch->move /= 2;
}
if(IS_SET(pexit->exit_info, EX_SHIN_WALL) && !IS_CLASS(ch,CLASS_SHINOBI)){
stc("The shurikens tear through your flesh!\n\r",ch);
act("$n's flesh is torn by the shuriken wall!",ch,NULL,NULL,TO_ROOM);
ch->hit *= .9;
}
WAIT_STATE(ch, 1);
if (!IS_SET(ch->mounted, IS_RIDING))
ch->move -= move;
}
/*
* Check for mount message - KaVir
*/
if ((mount = ch->mount) != NULL && ch->mounted == IS_RIDING)
{
if (IS_NPC(mount))
xprintf(mount2, " on %s.", mount->short_descr);
else
xprintf(mount2, " on %s.", mount->name);
}
else
xprintf(mount2, ".");
if (IS_HEAD(ch, LOST_HEAD) || IS_EXTRA(ch, EXTRA_OSWITCH))
xprintf(leave, "rolls");
else if (IS_AFFECTED(ch, AFF_ETHEREAL))
xprintf(leave, "floats");
else if (ch->in_room->sector_type == SECT_WATER_SWIM)
xprintf(leave, "swims");
else if (IS_SET(ch->polyaff, POLY_SERPENT))
xprintf(leave, "slithers");
else if (IS_SET(ch->polyaff, POLY_WOLF))
xprintf(leave, "stalks");
else if (IS_SET(ch->polyaff, POLY_FROG))
xprintf(leave, "hops");
else if (IS_SET(ch->polyaff, POLY_FISH))
xprintf(leave, "swims");
else if (!IS_NPC(ch) && IS_DEMAFF(ch, DEM_UNFOLDED))
xprintf(leave, "flies");
else if (IS_BODY(ch, BROKEN_SPINE))
xprintf(leave, "drags $mself");
else if (IS_LEG_L(ch, LOST_LEG) && IS_LEG_R(ch, LOST_LEG))
xprintf(leave, "drags $mself");
else if ((IS_LEG_L(ch, BROKEN_LEG) || IS_LEG_L(ch, LOST_LEG)
|| IS_LEG_L(ch, LOST_FOOT)) && (IS_LEG_R(ch, BROKEN_LEG)
|| IS_LEG_R(ch, LOST_LEG)
|| IS_LEG_R(ch, LOST_FOOT)))
xprintf(leave, "crawls");
else if (ch->hit < (ch->max_hit / 4))
xprintf(leave, "crawls");
else if ((IS_LEG_R(ch, LOST_LEG) || IS_LEG_R(ch, LOST_FOOT)) &&
(!IS_LEG_L(ch, BROKEN_LEG) && !IS_LEG_L(ch, LOST_LEG) &&
!IS_LEG_L(ch, LOST_FOOT)))
xprintf(leave, "hops");
else if ((IS_LEG_L(ch, LOST_LEG) || IS_LEG_L(ch, LOST_FOOT)) &&
(!IS_LEG_R(ch, BROKEN_LEG) && !IS_LEG_R(ch, LOST_LEG) &&
!IS_LEG_R(ch, LOST_FOOT)))
xprintf(leave, "hops");
else if ((IS_LEG_L(ch, BROKEN_LEG) || IS_LEG_L(ch, LOST_FOOT)) &&
(!IS_LEG_R(ch, BROKEN_LEG) && !IS_LEG_R(ch, LOST_LEG) &&
!IS_LEG_R(ch, LOST_FOOT)))
xprintf(leave, "limps");
else if ((IS_LEG_R(ch, BROKEN_LEG) || IS_LEG_R(ch, LOST_FOOT)) &&
(!IS_LEG_L(ch, BROKEN_LEG) && !IS_LEG_L(ch, LOST_LEG) &&
!IS_LEG_L(ch, LOST_FOOT)))
xprintf(leave, "limps");
else if (ch->hit < (ch->max_hit / 3))
xprintf(leave, "limps");
else if (ch->hit < (ch->max_hit / 2))
xprintf(leave, "staggers");
else if (!IS_NPC(ch))
{
if (ch->pcdata->condition[COND_DRUNK] > 10)
xprintf(leave, "staggers");
else
xprintf(leave, "walks");
}
else
xprintf(leave, "walks");
if (!IS_NPC(ch) && ch->stance[0] != -1)
do_stance(ch, "");
for (d = descriptor_list; d != NULL; d = d->next)
{
CHAR_DATA *victim;
if ((victim = d->character) == NULL)
continue;
if (ch->in_room == NULL || victim->in_room == NULL)
continue;
if (ch == victim || ch->in_room != victim->in_room)
continue;
if (d->connected != CON_PLAYING || !can_see(ch, victim))
continue;
if (!IS_NPC(ch) && !IS_AFFECTED(ch, AFF_SNEAK)
&& IS_AFFECTED(ch, AFF_POLYMORPH) && (IS_NPC(ch)
|| !IS_SET(ch->act,
PLR_WIZINVIS))
&& can_see(victim, ch))
{
if (((mount = ch->mount) != NULL
&& ch->mounted == IS_RIDING
&& IS_AFFECTED(mount, AFF_FLYING))
|| IS_AFFECTED(ch, AFF_FLYING) || (!IS_NPC(ch)
&&
IS_VAMPAFF(ch,
VAM_FLYING)))
xprintf(poly, "%s flies $T%s", ch->morph,
mount2);
else if ((mount = ch->mount) != NULL
&& ch->mounted == IS_RIDING)
xprintf(poly, "%s rides $T%s", ch->morph,
mount2);
else
xprintf(poly, "%s %s $T%s", ch->morph, leave,
mount2);
act(poly, victim, NULL, dir_name[door], TO_CHAR);
}
else if (!IS_AFFECTED(ch, AFF_SNEAK)
&& (IS_NPC(ch) || !IS_SET(ch->act, PLR_WIZINVIS))
&& can_see(victim, ch))
{
if (((mount = ch->mount) != NULL
&& ch->mounted == IS_RIDING
&& IS_AFFECTED(mount, AFF_FLYING))
|| IS_AFFECTED(ch, AFF_FLYING) || (!IS_NPC(ch)
&&
IS_VAMPAFF(ch,
VAM_FLYING)))
xprintf(poly, "$n flies %s%s", dir_name[door],
mount2);
else if ((mount = ch->mount) != NULL
&& ch->mounted == IS_RIDING)
xprintf(poly, "$n rides %s%s", dir_name[door],
mount2);
else
xprintf(poly, "$n %s %s%s", leave,
dir_name[door], mount2);
act(poly, ch, NULL, victim, TO_VICT);
}
}
char_from_room(ch);
char_to_room(ch, to_room);
if (door == 0)
{
revdoor = 2;
xprintf(buf, "the south");
}
else if (door == 1)
{
revdoor = 3;
xprintf(buf, "the west");
}
else if (door == 2)
{
revdoor = 0;
xprintf(buf, "the north");
}
else if (door == 3)
{
revdoor = 1;
xprintf(buf, "the east");
}
else if (door == 4)
{
revdoor = 5;
xprintf(buf, "below");
}
else
{
revdoor = 4;
xprintf(buf, "above");
}
for (d = descriptor_list; d != NULL; d = d->next)
{
CHAR_DATA *victim;
if ((victim = d->character) == NULL)
continue;
if (ch->in_room == NULL || victim->in_room == NULL)
continue;
if (ch == victim || ch->in_room != victim->in_room)
continue;
if (d->connected != CON_PLAYING || !can_see(ch, victim))
continue;
if (!IS_NPC(ch) && !IS_AFFECTED(ch, AFF_SNEAK)
&& IS_AFFECTED(ch, AFF_POLYMORPH) && (IS_NPC(ch)
|| !IS_SET(ch->act,
PLR_WIZINVIS))
&& can_see(victim, ch))
{
if (((mount = ch->mount) != NULL
&& ch->mounted == IS_RIDING
&& IS_AFFECTED(mount, AFF_FLYING))
|| IS_AFFECTED(ch, AFF_FLYING) || (!IS_NPC(ch)
&&
IS_VAMPAFF(ch,
VAM_FLYING)))
xprintf(poly, "%s flies in from %s%s",
ch->morph, buf, mount2);
else if ((mount = ch->mount) != NULL
&& ch->mounted == IS_RIDING)
xprintf(poly, "%s rides in from %s%s",
ch->morph, buf, mount2);
else
xprintf(poly, "%s %s in from %s%s", ch->morph,
leave, buf, mount2);
act(poly, ch, NULL, victim, TO_VICT);
}
else if (!IS_AFFECTED(ch, AFF_SNEAK) && can_see(victim, ch)
&& (IS_NPC(ch) || !IS_SET(ch->act, PLR_WIZINVIS)))
{
if (((mount = ch->mount) != NULL
&& ch->mounted == IS_RIDING
&& IS_AFFECTED(mount, AFF_FLYING))
|| IS_AFFECTED(ch, AFF_FLYING) || (!IS_NPC(ch)
&&
IS_VAMPAFF(ch,
VAM_FLYING)))
xprintf(poly, "$n flies in from %s%s", buf,
mount2);
else if ((mount = ch->mount) != NULL
&& ch->mounted == IS_RIDING)
xprintf(poly, "$n rides in from %s%s", buf,
mount2);
else
xprintf(poly, "$n %s in from %s%s", leave,
buf, mount2);
act(poly, ch, NULL, victim, TO_VICT);
}
}
do_look(ch, "auto");
for (fch = in_room->people; fch != NULL; fch = fch_next)
{
fch_next = fch->next_in_room;
if ((mount = fch->mount) != NULL && mount == ch
&& IS_SET(fch->mounted, IS_MOUNT))
{
act("$N digs $S heels into you.", fch, NULL, ch,
TO_CHAR);
char_from_room(fch);
char_to_room(fch, ch->in_room);
}
if (fch->master == ch && fch->position == POS_STANDING
&& fch->in_room != ch->in_room)
{
act("You follow $N.", fch, NULL, ch, TO_CHAR);
move_char(fch, door);
}
}
/*
* If someone is following the char, these triggers get activated
* for the followers before the char, but it's safer this way...
*/
if (IS_NPC(ch) && HAS_TRIGGER_MOB(ch, TRIG_ENTRY))
p_percent_trigger(ch, NULL, NULL, NULL, NULL, NULL,
TRIG_ENTRY);
if (!IS_NPC(ch))
{
p_greet_trigger(ch, PRG_MPROG);
p_greet_trigger(ch, PRG_OPROG);
p_greet_trigger(ch, PRG_RPROG);
}
room_text(ch, ">enter<");
return;
}
void do_north(CHAR_DATA * ch, char *argument)
{
ROOM_INDEX_DATA *in_room;
if (IS_AFFECTED(ch, AFF_WEBBED))
{
send_to_char
("You are unable to move with all this sticky webbing on.\n\r",
ch);
return;
}
if (IS_AFFECTED2(ch, AFF2_THORNS))
{
send_to_char
("Not while being rooted to the ground by brambles and thorns.\n\r",
ch);
return;
}
in_room = ch->in_room;
move_char(ch, DIR_NORTH);
if (!IS_NPC(ch) && ch->in_room != in_room)
{
ROOM_INDEX_DATA *old_room;
old_room = ch->in_room;
char_from_room(ch);
char_to_room(ch, in_room);
add_tracks(ch, DIR_NORTH);
char_from_room(ch);
char_to_room(ch, old_room);
}
drow_hate(ch);
return;
}
void do_east(CHAR_DATA * ch, char *argument)
{
ROOM_INDEX_DATA *in_room;
if (IS_AFFECTED(ch, AFF_WEBBED))
{
send_to_char
("You are unable to move with all this sticky webbing on.\n\r",
ch);
return;
}
if (IS_AFFECTED2(ch, AFF2_THORNS))
{
send_to_char
("Not while being rooted to the ground by brambles and thorns.\n\r",
ch);
return;
}
in_room = ch->in_room;
move_char(ch, DIR_EAST);
if (!IS_NPC(ch) && ch->in_room != in_room)
{
ROOM_INDEX_DATA *old_room;
old_room = ch->in_room;
char_from_room(ch);
char_to_room(ch, in_room);
add_tracks(ch, DIR_EAST);
char_from_room(ch);
char_to_room(ch, old_room);
}
drow_hate(ch);
return;
}
void do_south(CHAR_DATA * ch, char *argument)
{
ROOM_INDEX_DATA *in_room;
if (IS_AFFECTED(ch, AFF_WEBBED))
{
send_to_char
("You are unable to move with all this sticky webbing on.\n\r",
ch);
return;
}
if (IS_AFFECTED2(ch, AFF2_THORNS))
{
send_to_char
("Not while being rooted to the ground by brambles and thorns.\n\r",
ch);
return;
}
in_room = ch->in_room;
move_char(ch, DIR_SOUTH);
if (!IS_NPC(ch) && ch->in_room != in_room)
{
ROOM_INDEX_DATA *old_room;
old_room = ch->in_room;
char_from_room(ch);
char_to_room(ch, in_room);
add_tracks(ch, DIR_SOUTH);
char_from_room(ch);
char_to_room(ch, old_room);
}
drow_hate(ch);
return;
}
void do_west(CHAR_DATA * ch, char *argument)
{
ROOM_INDEX_DATA *in_room;
if (IS_AFFECTED(ch, AFF_WEBBED))
{
send_to_char
("You are unable to move with all this sticky webbing on.\n\r",
ch);
return;
}
if (IS_AFFECTED2(ch, AFF2_THORNS))
{
send_to_char
("Not while being rooted to the ground by brambles and thorns.\n\r",
ch);
return;
}
in_room = ch->in_room;
move_char(ch, DIR_WEST);
if (!IS_NPC(ch) && ch->in_room != in_room)
{
ROOM_INDEX_DATA *old_room;
old_room = ch->in_room;
char_from_room(ch);
char_to_room(ch, in_room);
add_tracks(ch, DIR_WEST);
char_from_room(ch);
char_to_room(ch, old_room);
}
drow_hate(ch);
return;
}
void do_up(CHAR_DATA * ch, char *argument)
{
ROOM_INDEX_DATA *in_room;
if (IS_AFFECTED(ch, AFF_WEBBED))
{
send_to_char
("You are unable to move with all this sticky webbing on.\n\r",
ch);
return;
}
if (IS_AFFECTED2(ch, AFF2_THORNS))
{
send_to_char
("Not while being rooted to the ground by brambles and thorns.\n\r",
ch);
return;
}
in_room = ch->in_room;
move_char(ch, DIR_UP);
if (!IS_NPC(ch) && ch->in_room != in_room)
{
ROOM_INDEX_DATA *old_room;
old_room = ch->in_room;
char_from_room(ch);
char_to_room(ch, in_room);
add_tracks(ch, DIR_UP);
char_from_room(ch);
char_to_room(ch, old_room);
}
/*
if (!IS_NPC(ch) && ch->in_room != in_room) add_tracks( ch, DIR_DOWN );
*/
drow_hate(ch);
return;
}
void do_down(CHAR_DATA * ch, char *argument)
{
ROOM_INDEX_DATA *in_room;
if (IS_AFFECTED(ch, AFF_WEBBED))
{
send_to_char
("You are unable to move with all this sticky webbing on.\n\r",
ch);
return;
}
if (IS_AFFECTED2(ch, AFF2_THORNS))
{
send_to_char
("Not while being rooted to the ground by brambles and thorns.\n\r",
ch);
return;
}
in_room = ch->in_room;
move_char(ch, DIR_DOWN);
if (!IS_NPC(ch) && ch->in_room != in_room)
{
ROOM_INDEX_DATA *old_room;
old_room = ch->in_room;
char_from_room(ch);
char_to_room(ch, in_room);
add_tracks(ch, DIR_DOWN);
char_from_room(ch);
char_to_room(ch, old_room);
}
/*
if (!IS_NPC(ch) && ch->in_room != in_room) add_tracks( ch, DIR_UP );
*/
drow_hate(ch);
return;
}
int find_door(CHAR_DATA * ch, char *arg)
{
EXIT_DATA *pexit;
int door;
if (!str_cmp(arg, "n") || !str_cmp(arg, "north"))
door = 0;
else if (!str_cmp(arg, "e") || !str_cmp(arg, "east"))
door = 1;
else if (!str_cmp(arg, "s") || !str_cmp(arg, "south"))
door = 2;
else if (!str_cmp(arg, "w") || !str_cmp(arg, "west"))
door = 3;
else if (!str_cmp(arg, "u") || !str_cmp(arg, "up"))
door = 4;
else if (!str_cmp(arg, "d") || !str_cmp(arg, "down"))
door = 5;
else
{
for (door = 0; door <= 5; door++)
{
if ((pexit = ch->in_room->exit[door]) != NULL
&& IS_SET(pexit->exit_info, EX_ISDOOR)
&& pexit->keyword != NULL
&& is_name(arg, pexit->keyword))
return door;
}
act("I see no $T here.", ch, NULL, arg, TO_CHAR);
return -1;
}
if ((pexit = ch->in_room->exit[door]) == NULL)
{
act("I see no door $T here.", ch, NULL, arg, TO_CHAR);
return -1;
}
if (!IS_SET(pexit->exit_info, EX_ISDOOR))
{
send_to_char("You can't do that.\n\r", ch);
return -1;
}
return door;
}
/* random room generation procedure */
ROOM_INDEX_DATA *get_random_room(CHAR_DATA * ch)
{
ROOM_INDEX_DATA *room;
for (;;)
{
room = get_room_index(number_range(0, 100000));
if (room != NULL)
if (!IS_SET(room->room_flags, ROOM_PRIVATE)
&& !IS_SET(room->room_flags, ROOM_SOLITARY)
&& !IS_SET(room->room_flags, ROOM_SAFE))
break;
}
return room;
}
ROOM_INDEX_DATA *get_rand_room()
{
ROOM_INDEX_DATA *room;
for (;;)
{
room = get_room_index(number_range(1000, 85000));
if (room != NULL)
if (!IS_SET(room->room_flags, ROOM_PRIVATE)
&& !IS_SET(room->room_flags, ROOM_ASTRAL)
&& !IS_SET(room->room_flags, ROOM_SOLITARY)
&& !IS_SET(room->room_flags, ROOM_SAFE))
break;
}
return room;
}
ROOM_INDEX_DATA *get_treemeld_room()
{
ROOM_INDEX_DATA *room;
for (;;)
{
room = get_room_index(number_range(0, 100000));
if (room != NULL && room->sector_type == SECT_FOREST)
break;
}
return room;
}
ROOM_INDEX_DATA *get_rand_room_by_sect(int sect)
{
ROOM_INDEX_DATA *room;
for (;;)
{
room = get_room_index(number_range(0, 100000));
if (room != NULL && room->sector_type == sect)
break;
}
return room;
}
/* Designed for the portal spell, but can also have other uses...KaVir
* V0 = Where the portal will take you.
* V1 = Number of uses (0 is infinate).
* V2 = if 2, cannot be entered.
* V3 = The room the portal is currently in.
*/
void do_enter(CHAR_DATA * ch, char *argument)
{
ROOM_INDEX_DATA *pRoomIndex;
ROOM_INDEX_DATA *location;
char arg[MAX_INPUT_LENGTH];
char poly[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
OBJ_DATA *portal;
OBJ_DATA *portal_next;
CHAR_DATA *mount;
CHAR_DATA *gch;
CHAR_DATA *gch_next;
bool found;
argument = one_argument(argument, arg);
if (ch->in_room != NULL)
{
if (IS_SET(ch->in_room->room_flags, ROOM_ASTRAL))
{
send_to_char
("The portal cannot function in an astral room.\n\r",
ch);
return;
}
}
if (arg[0] == '\0')
{
send_to_char("Enter what?\n\r", ch);
return;
}
obj = get_obj_list(ch, arg, ch->in_room->contents);
if (obj == NULL)
{
act("I see no $T here.", ch, NULL, arg, TO_CHAR);
return;
}
if (obj->item_type != ITEM_PORTAL && obj->item_type != ITEM_WGATE)
{
act("You cannot enter that.", ch, NULL, arg, TO_CHAR);
return;
}
if (IS_AFFECTED(ch, AFF_SHADOWPLANE)
&& !IS_SET(obj->extra_flags, ITEM_SHADOWPLANE))
{
send_to_char("You are too insubstantual.\n\r", ch);
return;
}
else if (!IS_AFFECTED(ch, AFF_SHADOWPLANE) &&
IS_SET(obj->extra_flags, ITEM_SHADOWPLANE))
{
send_to_char("It is too insubstantual.\n\r", ch);
return;
}
if (obj->item_type == ITEM_PORTAL)
{
if (obj->value[2] == 2 || obj->value[2] == 3)
{
act("It seems to be closed.", ch, NULL, arg, TO_CHAR);
return;
}
pRoomIndex = get_room_index(obj->value[0]);
location = ch->in_room;
if (pRoomIndex == NULL)
{
act("You are unable to enter.", ch, NULL, arg,
TO_CHAR);
return;
}
act("You step into $p.", ch, obj, NULL, TO_CHAR);
if (!IS_NPC(ch) && IS_AFFECTED(ch, AFF_POLYMORPH))
xprintf(poly, "%s steps into $p.", ch->morph);
else
xprintf(poly, "$n steps into $p.");
act(poly, ch, obj, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, pRoomIndex);
if (!IS_NPC(ch) && IS_AFFECTED(ch, AFF_POLYMORPH))
xprintf(poly, "%s steps out of $p.", ch->morph);
else
xprintf(poly, "$n steps out of $p.");
act(poly, ch, obj, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, location);
if (obj->value[1] != 0)
{
obj->value[1] = obj->value[1] - 1;
if (obj->value[1] < 1)
{
act("$p vanishes.", ch, obj, NULL, TO_CHAR);
act("$p vanishes.", ch, obj, NULL, TO_ROOM);
extract_obj(obj);
}
}
char_from_room(ch);
char_to_room(ch, pRoomIndex);
found = FALSE;
for (portal = ch->in_room->contents; portal != NULL;
portal = portal_next)
{
portal_next = portal->next_content;
if ((obj->value[0] == portal->value[3])
&& (obj->value[3] == portal->value[0]))
{
found = TRUE;
if (IS_AFFECTED(ch, AFF_SHADOWPLANE) &&
!IS_SET(portal->extra_flags,
ITEM_SHADOWPLANE))
{
REMOVE_BIT(ch->affected_by,
AFF_SHADOWPLANE);
break;
}
else if (!IS_AFFECTED(ch, AFF_SHADOWPLANE) &&
IS_SET(portal->extra_flags,
ITEM_SHADOWPLANE))
{
SET_BIT(ch->affected_by,
AFF_SHADOWPLANE);
break;
}
if (portal->value[1] != 0)
{
portal->value[1] =
portal->value[1] - 1;
if (portal->value[1] < 1)
{
act("$p vanishes.", ch,
portal, NULL, TO_CHAR);
act("$p vanishes.", ch,
portal, NULL, TO_ROOM);
extract_obj(portal);
}
}
}
}
do_look(ch, "auto");
if ((mount = ch->mount) != NULL)
{
char_from_room(mount);
char_to_room(mount, ch->in_room);
}
for (gch = location->people; gch; gch = gch_next)
{
gch_next = gch->next_in_room;
if (gch->master == ch && gch->position == POS_STANDING
&& gch->in_room != ch->in_room)
{
act("You follow $N.", gch, NULL, ch, TO_CHAR);
do_enter(gch, arg);
}
}
return;
}
else
{
pRoomIndex = get_room_index(obj->value[0]);
location = ch->in_room;
if (pRoomIndex == NULL)
{
act("You are unable to enter.", ch, NULL, arg,
TO_CHAR);
return;
}
act("You step into $p.", ch, obj, NULL, TO_CHAR);
if (!IS_NPC(ch) && IS_AFFECTED(ch, AFF_POLYMORPH))
xprintf(poly, "%s steps into $p.", ch->morph);
else
xprintf(poly, "$n steps into $p.");
act(poly, ch, obj, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, pRoomIndex);
if (!IS_NPC(ch) && IS_AFFECTED(ch, AFF_POLYMORPH))
xprintf(poly, "%s steps out of $p.", ch->morph);
else
xprintf(poly, "$n steps out of $p.");
act(poly, ch, obj, NULL, TO_ROOM);
for (portal = ch->in_room->contents; portal != NULL;
portal = portal_next)
{
portal_next = portal->next_content;
if ((obj->value[0] == portal->value[3])
&& (obj->value[3] == portal->value[0]))
{
found = TRUE;
if (IS_AFFECTED(ch, AFF_SHADOWPLANE) &&
!IS_SET(portal->extra_flags,
ITEM_SHADOWPLANE))
{
REMOVE_BIT(ch->affected_by,
AFF_SHADOWPLANE);
break;
}
else if (!IS_AFFECTED(ch, AFF_SHADOWPLANE) &&
IS_SET(portal->extra_flags,
ITEM_SHADOWPLANE))
{
SET_BIT(ch->affected_by,
AFF_SHADOWPLANE);
break;
}
}
}
do_look(ch, "auto");
if ((mount = ch->mount) == NULL)
return;
char_from_room(mount);
char_to_room(mount, ch->in_room);
//mob progs
/*
* If someone is following the char, these triggers get activated
* for the followers before the char, but it's safer this way...
*/
if (IS_NPC(ch) && HAS_TRIGGER_MOB(ch, TRIG_ENTRY))
p_percent_trigger(ch, NULL, NULL, NULL, NULL, NULL,
TRIG_ENTRY);
if (!IS_NPC(ch))
{
p_greet_trigger(ch, PRG_MPROG);
p_greet_trigger(ch, PRG_OPROG);
p_greet_trigger(ch, PRG_RPROG);
}
return;
}
}
void do_open(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
int door;
one_argument(argument, arg);
if (arg[0] == '\0')
{
send_to_char("Open what?\n\r", ch);
return;
}
if ((obj = get_obj_here(ch, NULL, arg)) != NULL)
{
/*
* 'open object'
*/
if (obj->item_type != ITEM_CONTAINER
&& obj->item_type != ITEM_BOOK)
{
send_to_char("That's not a container.\n\r", ch);
return;
}
if (!IS_SET(obj->value[1], CONT_CLOSED))
{
send_to_char("It's already open.\n\r", ch);
return;
}
if (!IS_SET(obj->value[1], CONT_CLOSEABLE)
&& obj->item_type != ITEM_BOOK)
{
send_to_char("You can't do that.\n\r", ch);
return;
}
if (IS_SET(obj->value[1], CONT_LOCKED))
{
send_to_char("It's locked.\n\r", ch);
return;
}
REMOVE_BIT(obj->value[1], CONT_CLOSED);
send_to_char("Ok.\n\r", ch);
act("$n opens $p.", ch, obj, NULL, TO_ROOM);
return;
}
if ((door = find_door(ch, arg)) >= 0)
{
/*
* 'open door'
*/
ROOM_INDEX_DATA *to_room;
EXIT_DATA *pexit;
EXIT_DATA *pexit_rev;
pexit = ch->in_room->exit[door];
if (!IS_SET(pexit->exit_info, EX_CLOSED))
{
send_to_char("It's already open.\n\r", ch);
return;
}
if (IS_SET(pexit->exit_info, EX_LOCKED))
{
send_to_char("It's locked.\n\r", ch);
return;
}
REMOVE_BIT(pexit->exit_info, EX_CLOSED);
act("$n opens the $d.", ch, NULL, pexit->keyword, TO_ROOM);
send_to_char("Ok.\n\r", ch);
/*
* open the other side
*/
if ((to_room = pexit->to_room) != NULL
&& (pexit_rev = to_room->exit[rev_dir[door]]) != NULL
&& pexit_rev->to_room == ch->in_room)
{
CHAR_DATA *rch;
REMOVE_BIT(pexit_rev->exit_info, EX_CLOSED);
for (rch = to_room->people; rch != NULL;
rch = rch->next_in_room)
act("The $d opens.", rch, NULL,
pexit_rev->keyword, TO_CHAR);
}
}
return;
}
void do_close(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
int door;
one_argument(argument, arg);
if (arg[0] == '\0')
{
send_to_char("Close what?\n\r", ch);
return;
}
if ((obj = get_obj_here(ch, NULL, arg)) != NULL)
{
/*
* 'close object'
*/
if (obj->item_type != ITEM_CONTAINER
&& obj->item_type != ITEM_BOOK)
{
send_to_char("That's not a container.\n\r", ch);
return;
}
if (IS_SET(obj->value[1], CONT_CLOSED))
{
send_to_char("It's already closed.\n\r", ch);
return;
}
if (!IS_SET(obj->value[1], CONT_CLOSEABLE)
&& obj->item_type != ITEM_BOOK)
{
send_to_char("You can't do that.\n\r", ch);
return;
}
SET_BIT(obj->value[1], CONT_CLOSED);
if (obj->item_type == ITEM_BOOK)
obj->value[2] = 0;
send_to_char("Ok.\n\r", ch);
act("$n closes $p.", ch, obj, NULL, TO_ROOM);
return;
}
if ((door = find_door(ch, arg)) >= 0)
{
/*
* 'close door'
*/
ROOM_INDEX_DATA *to_room;
EXIT_DATA *pexit;
EXIT_DATA *pexit_rev;
pexit = ch->in_room->exit[door];
if (IS_SET(pexit->exit_info, EX_CLOSED))
{
send_to_char("It's already closed.\n\r", ch);
return;
}
SET_BIT(pexit->exit_info, EX_CLOSED);
act("$n closes the $d.", ch, NULL, pexit->keyword, TO_ROOM);
send_to_char("Ok.\n\r", ch);
/*
* close the other side
*/
if ((to_room = pexit->to_room) != NULL
&& (pexit_rev = to_room->exit[rev_dir[door]]) != 0
&& pexit_rev->to_room == ch->in_room)
{
CHAR_DATA *rch;
SET_BIT(pexit_rev->exit_info, EX_CLOSED);
for (rch = to_room->people; rch != NULL;
rch = rch->next_in_room)
act("The $d closes.", rch, NULL,
pexit_rev->keyword, TO_CHAR);
}
}
return;
}
void do_turn(CHAR_DATA * ch, char *argument)
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
int value = 0;
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char("Syntax: Turn <book> <forward/back>.\n\r", ch);
return;
}
if (is_number(arg2))
value = atoi(arg2);
if ((obj = get_obj_here(ch, NULL, arg1)) == NULL)
{
send_to_char("You don't have that book.\n\r", ch);
return;
}
if (obj->item_type != ITEM_BOOK)
{
send_to_char("That's not a book.\n\r", ch);
return;
}
if (IS_SET(obj->value[1], CONT_CLOSED))
{
send_to_char("First you should open it.\n\r", ch);
return;
}
if (!str_cmp(arg2, "f") || !str_cmp(arg2, "forward"))
{
if (obj->value[2] >= obj->value[3])
{
send_to_char
("But you are already at the end of the book.\n\r",
ch);
return;
}
obj->value[2] += 1;
act("You flip forward a page in $p.", ch, obj, NULL, TO_CHAR);
act("$n flips forward a page in $p.", ch, obj, NULL, TO_ROOM);
}
else if (!str_cmp(arg2, "b") || !str_cmp(arg2, "backward"))
{
if (obj->value[2] <= 0)
{
send_to_char
("But you are already at the beginning of the book.\n\r",
ch);
return;
}
obj->value[2] -= 1;
act("You flip backward a page in $p.", ch, obj, NULL,
TO_CHAR);
act("$n flips backward a page in $p.", ch, obj, NULL,
TO_ROOM);
}
else if (is_number(arg2) && value >= 0 && value <= obj->value[3])
{
if (value == obj->value[2])
{
act("$p is already open at that page.", ch, obj, NULL,
TO_CHAR);
return;
}
else if (value < obj->value[2])
{
act("You flip backwards through $p.", ch, obj, NULL,
TO_CHAR);
act("$n flips backwards through $p.", ch, obj, NULL,
TO_ROOM);
}
else
{
act("You flip forwards through $p.", ch, obj, NULL,
TO_CHAR);
act("$n flips forwards through $p.", ch, obj, NULL,
TO_ROOM);
}
obj->value[2] = value;
}
else
send_to_char
("Do you wish to turn forward or backward a page?\n\r",
ch);
return;
}
bool has_key(CHAR_DATA * ch, int key)
{
OBJ_DATA *obj;
for (obj = ch->carrying; obj != NULL; obj = obj->next_content)
{
if (obj->pIndexData->vnum == key)
return TRUE;
}
return FALSE;
}
void do_lock(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
int door;
one_argument(argument, arg);
if (arg[0] == '\0')
{
send_to_char("Lock what?\n\r", ch);
return;
}
if ((obj = get_obj_here(ch, NULL, arg)) != NULL)
{
/*
* 'lock object'
*/
if (obj->item_type != ITEM_CONTAINER)
{
send_to_char("That's not a container.\n\r", ch);
return;
}
if (!IS_SET(obj->value[1], CONT_CLOSED))
{
send_to_char("It's not closed.\n\r", ch);
return;
}
if (obj->value[2] < 0)
{
send_to_char("It can't be locked.\n\r", ch);
return;
}
if (!has_key(ch, obj->value[2]))
{
send_to_char("You lack the key.\n\r", ch);
return;
}
if (IS_SET(obj->value[1], CONT_LOCKED))
{
send_to_char("It's already locked.\n\r", ch);
return;
}
SET_BIT(obj->value[1], CONT_LOCKED);
send_to_char("*Click*\n\r", ch);
act("$n locks $p.", ch, obj, NULL, TO_ROOM);
return;
}
if ((door = find_door(ch, arg)) >= 0)
{
/*
* 'lock door'
*/
ROOM_INDEX_DATA *to_room;
EXIT_DATA *pexit;
EXIT_DATA *pexit_rev;
pexit = ch->in_room->exit[door];
if (!IS_SET(pexit->exit_info, EX_CLOSED))
{
send_to_char("It's not closed.\n\r", ch);
return;
}
if (pexit->key < 0)
{
send_to_char("It can't be locked.\n\r", ch);
return;
}
if (!has_key(ch, pexit->key))
{
send_to_char("You lack the key.\n\r", ch);
return;
}
if (IS_SET(pexit->exit_info, EX_LOCKED))
{
send_to_char("It's already locked.\n\r", ch);
return;
}
SET_BIT(pexit->exit_info, EX_LOCKED);
send_to_char("*Click*\n\r", ch);
act("$n locks the $d.", ch, NULL, pexit->keyword, TO_ROOM);
/*
* lock the other side
*/
if ((to_room = pexit->to_room) != NULL
&& (pexit_rev = to_room->exit[rev_dir[door]]) != 0
&& pexit_rev->to_room == ch->in_room)
{
SET_BIT(pexit_rev->exit_info, EX_LOCKED);
}
}
return;
}
void do_unlock(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
int door;
one_argument(argument, arg);
if (arg[0] == '\0')
{
send_to_char("Unlock what?\n\r", ch);
return;
}
if ((obj = get_obj_here(ch, NULL, arg)) != NULL)
{
/*
* 'unlock object'
*/
if (obj->item_type != ITEM_CONTAINER)
{
send_to_char("That's not a container.\n\r", ch);
return;
}
if (!IS_SET(obj->value[1], CONT_CLOSED))
{
send_to_char("It's not closed.\n\r", ch);
return;
}
if (obj->value[2] < 0)
{
send_to_char("It can't be unlocked.\n\r", ch);
return;
}
if (!has_key(ch, obj->value[2]))
{
send_to_char("You lack the key.\n\r", ch);
return;
}
if (!IS_SET(obj->value[1], CONT_LOCKED))
{
send_to_char("It's already unlocked.\n\r", ch);
return;
}
REMOVE_BIT(obj->value[1], CONT_LOCKED);
send_to_char("*Click*\n\r", ch);
act("$n unlocks $p.", ch, obj, NULL, TO_ROOM);
return;
}
if ((door = find_door(ch, arg)) >= 0)
{
/*
* 'unlock door'
*/
ROOM_INDEX_DATA *to_room;
EXIT_DATA *pexit;
EXIT_DATA *pexit_rev;
pexit = ch->in_room->exit[door];
if (!IS_SET(pexit->exit_info, EX_CLOSED))
{
send_to_char("It's not closed.\n\r", ch);
return;
}
if (pexit->key < 0)
{
send_to_char("It can't be unlocked.\n\r", ch);
return;
}
if (!has_key(ch, pexit->key))
{
send_to_char("You lack the key.\n\r", ch);
return;
}
if (!IS_SET(pexit->exit_info, EX_LOCKED))
{
send_to_char("It's already unlocked.\n\r", ch);
return;
}
REMOVE_BIT(pexit->exit_info, EX_LOCKED);
send_to_char("*Click*\n\r", ch);
act("$n unlocks the $d.", ch, NULL, pexit->keyword, TO_ROOM);
/*
* unlock the other side
*/
if ((to_room = pexit->to_room) != NULL
&& (pexit_rev = to_room->exit[rev_dir[door]]) != NULL
&& pexit_rev->to_room == ch->in_room)
{
REMOVE_BIT(pexit_rev->exit_info, EX_LOCKED);
}
}
return;
}
void do_pick(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *gch;
OBJ_DATA *obj;
int door;
one_argument(argument, arg);
if (arg[0] == '\0')
{
send_to_char("Pick what?\n\r", ch);
return;
}
WAIT_STATE(ch, skill_table[gsn_pick_lock].beats);
/*
* look for guards
*/
for (gch = ch->in_room->people; gch; gch = gch->next_in_room)
{
if (IS_NPC(gch) && IS_AWAKE(gch)
&& ch->level + 5 < gch->level)
{
act("$N is standing too close to the lock.",
ch, NULL, gch, TO_CHAR);
return;
}
}
if (!IS_NPC(ch)
&& number_percent() > ch->pcdata->learned[gsn_pick_lock])
{
send_to_char("You failed.\n\r", ch);
return;
}
if ((obj = get_obj_here(ch, NULL, arg)) != NULL)
{
/*
* 'pick object'
*/
if (obj->item_type != ITEM_CONTAINER)
{
send_to_char("That's not a container.\n\r", ch);
return;
}
if (!IS_SET(obj->value[1], CONT_CLOSED))
{
send_to_char("It's not closed.\n\r", ch);
return;
}
if (obj->value[2] < 0)
{
send_to_char("It can't be unlocked.\n\r", ch);
return;
}
if (!IS_SET(obj->value[1], CONT_LOCKED))
{
send_to_char("It's already unlocked.\n\r", ch);
return;
}
if (IS_SET(obj->value[1], CONT_PICKPROOF))
{
send_to_char("You failed.\n\r", ch);
return;
}
REMOVE_BIT(obj->value[1], CONT_LOCKED);
send_to_char("*Click*\n\r", ch);
act("$n picks $p.", ch, obj, NULL, TO_ROOM);
return;
}
if ((door = find_door(ch, arg)) >= 0)
{
/*
* 'pick door'
*/
ROOM_INDEX_DATA *to_room;
EXIT_DATA *pexit;
EXIT_DATA *pexit_rev;
pexit = ch->in_room->exit[door];
if (!IS_SET(pexit->exit_info, EX_CLOSED))
{
send_to_char("It's not closed.\n\r", ch);
return;
}
if (pexit->key < 0)
{
send_to_char("It can't be picked.\n\r", ch);
return;
}
if (!IS_SET(pexit->exit_info, EX_LOCKED))
{
send_to_char("It's already unlocked.\n\r", ch);
return;
}
if (IS_SET(pexit->exit_info, EX_PICKPROOF))
{
send_to_char("You failed.\n\r", ch);
return;
}
REMOVE_BIT(pexit->exit_info, EX_LOCKED);
send_to_char("*Click*\n\r", ch);
act("$n picks the $d.", ch, NULL, pexit->keyword, TO_ROOM);
/*
* pick the other side
*/
if ((to_room = pexit->to_room) != NULL
&& (pexit_rev = to_room->exit[rev_dir[door]]) != NULL
&& pexit_rev->to_room == ch->in_room)
{
REMOVE_BIT(pexit_rev->exit_info, EX_LOCKED);
}
}
return;
}
void do_stand(CHAR_DATA * ch, char *argument)
{
//OBJ_DATA *obj = NULL;
switch (ch->position)
{
case POS_SLEEPING:
if (IS_AFFECTED(ch, AFF_SLEEP))
{
send_to_char("You can't wake up!\n\r", ch);
return;
}
send_to_char("You wake and stand up.\n\r", ch);
act("$n wakes and stands up.", ch, NULL, NULL, TO_ROOM);
ch->position = POS_STANDING;
break;
case POS_RESTING:
case POS_SITTING:
send_to_char("You stand up.\n\r", ch);
act("$n stands up.", ch, NULL, NULL, TO_ROOM);
ch->position = POS_STANDING;
break;
case POS_MEDITATING:
send_to_char("You uncross your legs and stand up.\n\r", ch);
act("$n uncrosses $s legs and stands up.", ch, NULL, NULL,
TO_ROOM);
ch->position = POS_STANDING;
break;
case POS_STANDING:
send_to_char("You are already standing.\n\r", ch);
break;
case POS_FIGHTING:
send_to_char("You are already fighting!\n\r", ch);
break;
}
//if ( HAS_TRIGGER_OBJ( obj, TRIG_SIT ) )
//p_percent_trigger( NULL, obj, NULL, ch, NULL, NULL, TRIG_SIT );
return;
}
/*
void do_rest( CHAR_DATA *ch, char *argument )
{
switch ( ch->position )
{
case POS_SLEEPING:
send_to_char( "You are already sleeping.\n\r", ch );
break;
case POS_RESTING:
send_to_char( "You are already resting.\n\r", ch );
break;
case POS_MEDITATING:
case POS_SITTING:
case POS_STANDING:
send_to_char( "You rest.\n\r", ch );
act( "$n rests.", ch, NULL, NULL, TO_ROOM );
ch->position = POS_RESTING;
break;
case POS_FIGHTING:
send_to_char( "You are already fighting!\n\r", ch );
break;
}
return;
}
*/
void do_rest(CHAR_DATA * ch, char *argument)
{
OBJ_DATA *obj = NULL;
if (IS_AFFECTED(ch, AFF_SLEEP)) /* magical sleep. can't rest. */
{
send_to_char("You are asleep and cannot wake up!\n\r", ch);
return;
}
if (ch->position == POS_FIGHTING)
{
send_to_char("Maybe you should finish this fight first!\n\r",
ch);
return;
}
/*
* okay, now that we know we can rest, find an object to rest on
*/
if (argument[0] != '\0')
{
obj = get_obj_list(ch, argument, ch->in_room->contents);
if (obj == NULL)
{
send_to_char("You don't see that here.\n\r", ch);
return;
}
}
else
obj = ch->on;
if (obj != NULL)
{
if (!IS_SET(obj->item_type, ITEM_FURNITURE)
|| (!IS_SET(obj->value[2], REST_ON)
&& !IS_SET(obj->value[2], REST_IN)
&& !IS_SET(obj->value[2], REST_AT)))
{
send_to_char("You can't rest on that.\n\r", ch);
return;
}
if (obj != NULL && ch->on != obj
&& count_users(obj) >= obj->value[0])
{
act("There's no more room on $p.", ch, obj, NULL,
TO_CHAR);
return;
}
ch->on = obj;
if (HAS_TRIGGER_OBJ(obj, TRIG_SIT))
p_percent_trigger(NULL, obj, NULL, ch, NULL, NULL,
TRIG_SIT);
}
switch (ch->position)
{
case POS_SLEEPING:
send_to_char("You wake up and roll over to rest.\n\r", ch);
act("$n wakes up, then rolls over to rest.", ch, NULL, NULL,
TO_ROOM);
ch->position = POS_RESTING;
do_look(ch, "auto");
break;
case POS_RESTING:
send_to_char("You are already resting.\n\r", ch);
break;
case POS_STANDING:
if (obj == NULL)
{
send_to_char("You sit down and rest.\n\r", ch);
act("$n sits down and rests.", ch, NULL, NULL,
TO_ROOM);
}
else if (IS_SET(obj->value[2], REST_AT))
{
act("You sit down at $p and rest.", ch, obj, NULL,
TO_CHAR);
act("$n sits down at $p and rests.", ch, obj, NULL,
TO_ROOM);
}
else if (IS_SET(obj->value[2], REST_ON))
{
act("You sit on $p and rest.", ch, obj, NULL,
TO_CHAR);
act("$n sits on $p and rests.", ch, obj, NULL,
TO_ROOM);
}
else
{
act("You rest in $p.", ch, obj, NULL, TO_CHAR);
act("$n rests in $p.", ch, obj, NULL, TO_ROOM);
}
ch->position = POS_RESTING;
break;
case POS_SITTING:
if (obj == NULL)
{
send_to_char("You rest.\n\r", ch);
act("$n rests.", ch, NULL, NULL, TO_ROOM);
}
else if (IS_SET(obj->value[2], REST_AT))
{
act("You rest at $p.", ch, obj, NULL, TO_CHAR);
act("$n rests at $p.", ch, obj, NULL, TO_ROOM);
}
else if (IS_SET(obj->value[2], REST_ON))
{
act("You rest on $p.", ch, obj, NULL, TO_CHAR);
act("$n rests on $p.", ch, obj, NULL, TO_ROOM);
}
else
{
act("You rest in $p.", ch, obj, NULL, TO_CHAR);
act("$n rests in $p.", ch, obj, NULL, TO_ROOM);
}
ch->position = POS_RESTING;
break;
}
return;
}
/*
void do_sit( CHAR_DATA *ch, char *argument )
{
switch ( ch->position )
{
case POS_SLEEPING:
send_to_char( "You are already sleeping.\n\r", ch );
break;
case POS_RESTING:
send_to_char( "You are already resting.\n\r", ch );
break;
case POS_MEDITATING:
send_to_char( "You are already meditating.\n\r", ch );
break;
case POS_SITTING:
send_to_char( "You are already sitting.\n\r", ch );
break;
case POS_STANDING:
send_to_char( "You sit down.\n\r", ch );
act( "$n sits down.", ch, NULL, NULL, TO_ROOM );
ch->position = POS_SITTING;
break;
case POS_FIGHTING:
send_to_char( "You are already fighting!\n\r", ch );
break;
}
//if ( HAS_TRIGGER_OBJ( obj, TRIG_SIT ) )
//p_percent_trigger( NULL, OBJ, NULL, ch, NULL, NULL, TRIG_SIT );
return;
}
*/
void do_sit(CHAR_DATA * ch, char *argument)
{
OBJ_DATA *obj = NULL;
if (IS_AFFECTED(ch, AFF_SLEEP)) /* magical sleep. can't rest. */
{
send_to_char("You are asleep and cannot wake up!\n\r", ch);
return;
}
if (ch->position == POS_FIGHTING)
{
send_to_char("Maybe you should finish this fight first!\n\r",
ch);
return;
}
/*
* okay, now that we know we can sit, find an object to sit on
*/
if (argument[0] != '\0')
{
obj = get_obj_list(ch, argument, ch->in_room->contents);
if (obj == NULL)
{
send_to_char("You don't see that here.\n\r", ch);
return;
}
}
else
obj = ch->on;
if (obj != NULL)
{
if (!IS_SET(obj->item_type, ITEM_FURNITURE)
|| (!IS_SET(obj->value[2], SIT_ON)
&& !IS_SET(obj->value[2], SIT_IN)
&& !IS_SET(obj->value[2], SIT_AT)))
{
send_to_char("You can't sit on that.\n\r", ch);
return;
}
if (obj != NULL && ch->on != obj
&& count_users(obj) >= obj->value[0])
{
act("There's no more room on $p.", ch, obj, NULL,
TO_CHAR);
return;
}
ch->on = obj;
if (HAS_TRIGGER_OBJ(obj, TRIG_SIT))
{
p_percent_trigger(NULL, obj, NULL, ch, NULL, NULL,
TRIG_SIT);
}
}
switch (ch->position)
{
case POS_SLEEPING:
send_to_char("You wake and sit up.\n\r", ch);
act("$n wakes and sits up.", ch, NULL, NULL, TO_ROOM);
ch->position = POS_SITTING;
do_look(ch, "auto");
break;
case POS_SITTING:
send_to_char("You are already sitting.\n\r", ch);
break;
case POS_STANDING:
if (obj == NULL)
{
send_to_char("You sit down.\n\r", ch);
act("$n sits down.", ch, NULL, NULL, TO_ROOM);
}
else if (IS_SET(obj->value[2], SIT_AT))
{
act("You sit down at $p.", ch, obj, NULL, TO_CHAR);
act("$n sits down at $p.", ch, obj, NULL, TO_ROOM);
}
else if (IS_SET(obj->value[2], SIT_ON))
{
act("You sit on $p.", ch, obj, NULL, TO_CHAR);
act("$n sits on $p.", ch, obj, NULL, TO_ROOM);
}
else
{
act("You sit in $p.", ch, obj, NULL, TO_CHAR);
act("$n sits in $p.", ch, obj, NULL, TO_ROOM);
}
ch->position = POS_SITTING;
break;
case POS_RESTING:
if (obj == NULL)
{
send_to_char("You sit up.\n\r", ch);
act("$n sits up.", ch, NULL, NULL, TO_ROOM);
}
else if (IS_SET(obj->value[2], REST_AT))
{
act("You sit up at $p.", ch, obj, NULL, TO_CHAR);
act("$n sits up at $p.", ch, obj, NULL, TO_ROOM);
}
else if (IS_SET(obj->value[2], REST_ON))
{
act("You rest on $p.", ch, obj, NULL, TO_CHAR);
act("$n rests on $p.", ch, obj, NULL, TO_ROOM);
}
else
{
act("You rest in $p.", ch, obj, NULL, TO_CHAR);
act("$n rests in $p.", ch, obj, NULL, TO_ROOM);
}
ch->position = POS_RESTING;
break;
}
return;
}
void do_sleep(CHAR_DATA * ch, char *argument)
{
OBJ_DATA *obj = NULL;
switch (ch->position)
{
case POS_MORTAL:
send_to_char
("You give up on life, and go to sleep forever.\n\r",
ch);
break;
case POS_INCAP:
case POS_STUNNED:
case POS_DEAD:
send_to_char("You are hurt far too badly for that.\n\r", ch);
break;
case POS_SLEEPING:
send_to_char("You are already sleeping.\n\r", ch);
break;
case POS_RESTING:
case POS_SITTING:
case POS_STANDING:
if (argument[0] == '\0' && ch->on == NULL)
{
send_to_char("You go to sleep.\n\r", ch);
act("$n goes to sleep.", ch, NULL, NULL, TO_ROOM);
ch->position = POS_SLEEPING;
}
else /* find an object and sleep on it */
{
if (argument[0] == '\0')
obj = ch->on;
else
obj = get_obj_list(ch, argument,
ch->in_room->contents);
if (obj == NULL)
{
send_to_char("You don't see that here.\n\r",
ch);
return;
}
if (obj->item_type != ITEM_FURNITURE
|| (!IS_SET(obj->value[2], SLEEP_ON)
&& !IS_SET(obj->value[2], SLEEP_IN)
&& !IS_SET(obj->value[2], SLEEP_AT)))
{
send_to_char("You can't sleep on that!\n\r",
ch);
return;
}
if (ch->on != obj
&& count_users(obj) >= obj->value[0])
{
act("There is no room on $p for you.", ch,
obj, NULL, TO_CHAR);
return;
}
ch->on = obj;
if (HAS_TRIGGER_OBJ(obj, TRIG_SIT))
p_percent_trigger(NULL, obj, NULL, ch, NULL,
NULL, TRIG_SIT);
if (IS_SET(obj->value[2], SLEEP_AT))
{
act("You go to sleep at $p.", ch, obj, NULL,
TO_CHAR);
act("$n goes to sleep at $p.", ch, obj, NULL,
TO_ROOM);
}
else if (IS_SET(obj->value[2], SLEEP_ON))
{
act("You go to sleep on $p.", ch, obj, NULL,
TO_CHAR);
act("$n goes to sleep on $p.", ch, obj, NULL,
TO_ROOM);
}
else
{
act("You go to sleep in $p.", ch, obj, NULL,
TO_CHAR);
act("$n goes to sleep in $p.", ch, obj, NULL,
TO_ROOM);
}
ch->position = POS_SLEEPING;
}
break;
case POS_FIGHTING:
send_to_char("Yeah right! You'd get slaughtered!\n\r", ch);
break;
}
return;
}
void do_wake(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument(argument, arg);
if (arg[0] == '\0')
{
do_stand(ch, argument);
return;
}
if (!IS_AWAKE(ch))
{
send_to_char("You are asleep yourself!\n\r", ch);
return;
}
if ((victim = get_char_room(ch, NULL, arg)) == NULL)
{
send_to_char("They aren't here.\n\r", ch);
return;
}
// Chars who are AWAKE by the macro's definition may still be unwakeable, and
// will now get a better error msg. Someone who is mortally wounded isn't "already awake".
if (victim->position < POS_SLEEPING)
{
act("$N can't be woken up.", ch, NULL, victim, TO_CHAR);
return;
}
if (IS_AWAKE(victim))
{
act("$N is already awake.", ch, NULL, victim, TO_CHAR);
return;
}
if (IS_AFFECTED(victim, AFF_SLEEP))
{
act("You can't wake $M!", ch, NULL, victim, TO_CHAR);
return;
}
victim->position = POS_STANDING;
victim->on = NULL;
act("You wake $M.", ch, NULL, victim, TO_CHAR);
act("$n wakes you.", ch, NULL, victim, TO_VICT);
do_look(ch, "auto");
return;
}
void do_meditate(CHAR_DATA * ch, char *argument)
{
OBJ_DATA *obj = NULL;
if (IS_NPC(ch)
|| (!IS_CLASS(ch, CLASS_MAGE) && !IS_CLASS(ch, CLASS_MONK)
&& !IS_CLASS(ch, CLASS_FAE) && !IS_CLASS(ch, CLASS_NINJA)
&& !IS_CLASS(ch, CLASS_DROW) && !IS_CLASS(ch, CLASS_LICH)
&& !IS_CLASS(ch, CLASS_ZOMBIE) && !IS_CLASS(ch, CLASS_SHINOBI)))
{
send_to_char
("You are unable to attain the correct state of mind.\n\r",
ch);
return;
}
obj = ch->on;
if (obj != NULL)
{
send_to_char("You can't mediate on furniture.\n\r", ch);
return;
}
if (IS_CLASS(ch, CLASS_FAE) && ch->power[DISC_FAE_ARCANE] < 2)
{
send_to_char("You don't know how to do that yet.\n\r", ch);
return;
}
switch (ch->position)
{
case POS_SLEEPING:
send_to_char("You are already sleeping.\n\r", ch);
break;
case POS_RESTING:
send_to_char("You are already resting.\n\r", ch);
break;
case POS_MEDITATING:
send_to_char("You are already meditating.\n\r", ch);
break;
case POS_SITTING:
send_to_char("You cross your legs and start meditating.\n\r",
ch);
act("$n crosses $s legs and starts meditating.", ch, NULL,
NULL, TO_ROOM);
ch->position = POS_MEDITATING;
break;
case POS_STANDING:
send_to_char
("You sit down, cross your legs and start meditating.\n\r",
ch);
act("$n sits down, crosses $s legs and starts meditating.",
ch, NULL, NULL, TO_ROOM);
ch->position = POS_MEDITATING;
break;
case POS_FIGHTING:
send_to_char("You are already fighting!\n\r", ch);
break;
}
return;
}
void do_healing(CHAR_DATA * ch, char *argument)
{
if (IS_NPC(ch)
|| (!IS_CLASS(ch, CLASS_VAMPIRE)
&& ch->power[DISC_VAMP_PROT] < 8))
{
send_to_char
("You are unable to assume a state of healing.\n\r",
ch);
return;
}
switch (ch->position)
{
case POS_SLEEPING:
send_to_char("You are already sleeping.\n\r", ch);
break;
case POS_RESTING:
send_to_char("You are already resting.\n\r", ch);
break;
case POS_MEDITATING:
send_to_char("You are already in a healing position.\n\r",
ch);
break;
case POS_SITTING:
send_to_char
("You close your eyes and become completely relaxed.\n\r",
ch);
act("$n closes $m eyes and looks completely relaxed.", ch,
NULL, NULL, TO_ROOM);
ch->position = POS_MEDITATING;
break;
case POS_STANDING:
send_to_char
("You close your eyes and become completely relaxed.\n\r",
ch);
act("$n closes $m eyes and looks completely relaxed.", ch,
NULL, NULL, TO_ROOM);
ch->position = POS_MEDITATING;
break;
case POS_FIGHTING:
send_to_char("You are already fighting!\n\r", ch);
break;
}
return;
}
/*
void do_sleep( CHAR_DATA *ch, char *argument )
{
switch ( ch->position )
{
case POS_SLEEPING:
send_to_char( "You are already sleeping.\n\r", ch );
break;
case POS_SITTING:
case POS_MEDITATING:
case POS_RESTING:
case POS_STANDING:
send_to_char( "You sleep.\n\r", ch );
act( "$n sleeps.", ch, NULL, NULL, TO_ROOM );
ch->position = POS_SLEEPING;
break;
case POS_FIGHTING:
send_to_char( "You are already fighting!\n\r", ch );
break;
}
//if ( HAS_TRIGGER_OBJ( obj, TRIG_SIT ) )
//p_percent_trigger( NULL, obj, NULL, ch, NULL, NULL, TRIG_SIT );
return;
}
*/
/*
void do_wake( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{ do_stand( ch, argument ); return; }
if ( !IS_AWAKE(ch) )
{ send_to_char( "You are asleep yourself!\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 ( IS_AWAKE(victim) )
{ act( "$N is already awake.", ch, NULL, victim, TO_CHAR ); return; }
if ( IS_AFFECTED(victim, AFF_SLEEP))
{ act( "You can't wake $M!", ch, NULL, victim, TO_CHAR ); return; }
if (victim->position < POS_SLEEPING)
{ act( "$E doesn't respond!", ch, NULL, victim, TO_CHAR ); return; }
act( "You wake $M.", ch, NULL, victim, TO_CHAR );
act( "$n wakes you.", ch, NULL, victim, TO_VICT );
victim->position = POS_STANDING;
return;
}
*/
void do_sneak(CHAR_DATA * ch, char *argument)
{
AFFECT_DATA af;
send_to_char("You attempt to move silently.\n\r", ch);
affect_strip(ch, gsn_sneak);
if (IS_NPC(ch) || number_percent() < ch->pcdata->learned[gsn_sneak])
{
af.type = gsn_sneak;
af.duration = ch->level;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_SNEAK;
affect_to_char(ch, &af);
}
return;
}
void do_hide(CHAR_DATA * ch, char *argument)
{
send_to_char("You attempt to hide.\n\r", ch);
if (IS_AFFECTED(ch, AFF_HIDE))
REMOVE_BIT(ch->affected_by, AFF_HIDE);
if (IS_NPC(ch) || number_percent() < ch->pcdata->learned[gsn_hide])
SET_BIT(ch->affected_by, AFF_HIDE);
return;
}
/*
* Contributed by Alander.
*/
void do_visible(CHAR_DATA * ch, char *argument)
{
affect_strip(ch, gsn_invis);
affect_strip(ch, gsn_mass_invis);
affect_strip(ch, gsn_sneak);
REMOVE_BIT(ch->affected_by, AFF_HIDE);
REMOVE_BIT(ch->affected_by, AFF_INVISIBLE);
REMOVE_BIT(ch->affected_by, AFF_SNEAK);
send_to_char("Ok.\n\r", ch);
return;
}
void do_unpolymorph(CHAR_DATA * ch, char *argument)
{
if (!is_affected(ch, gsn_polymorph))
{
send_to_char("But you are not polymorphed!\n\r", ch);
return;
}
act("$n's body begins to distort.", ch, NULL, NULL, TO_ROOM);
affect_strip(ch, gsn_polymorph);
act("$n resumes $s normal form.", ch, NULL, NULL, TO_ROOM);
send_to_char("You resume your normal form.\n\r", ch);
return;
}
void do_recall(CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *mount;
ROOM_INDEX_DATA *location;
if (IS_NPC(ch))
return;
act("$n's body flickers with green energy.", ch, NULL, NULL, TO_ROOM);
act("Your body flickers with green energy.", ch, NULL, NULL, TO_CHAR);
if ((location = get_room_index(ch->home)) == NULL)
{
send_to_char("You are completely lost.\n\r", ch);
return;
}
if (ch->in_room == location)
return;
if (IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL)
|| IS_AFFECTED(ch, AFF_CURSE))
{
send_to_char("You are unable to recall.\n\r", ch);
return;
}
if (IS_SET(ch->in_room->room_flags, ROOM_NO_CHANT))
{
send_to_char
("You are unable to chant, its a no chant room.\n\r",
ch);
return;
}
if (IS_SET(ch->flag2, AFF_TOTALBLIND))
{
stc("You are unable to recall.\n\r", ch);
return;
}
if ((victim = ch->fighting) != NULL)
{
if (number_bits(1) == 0)
{
WAIT_STATE(ch, 4);
xprintf(buf, "You failed!\n\r");
send_to_char(buf, ch);
return;
}
xprintf(buf, "You recall from combat!\n\r");
send_to_char(buf, ch);
stop_fighting(ch, TRUE);
}
act("$n disappears.", ch, NULL, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, location);
act("$n appears in the room.", ch, NULL, NULL, TO_ROOM);
do_look(ch, "auto");
if ((mount = ch->mount) == NULL)
return;
char_from_room(mount);
char_to_room(mount, ch->in_room);
return;
}
void do_crecall(CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *mount;
ROOM_INDEX_DATA *location;
if (IS_NPC(ch))
return;
if (ch->class == 0)
{
stc("Think about it...\n\r", ch);
return;
}
act("$n's body flickers with red energy.", ch, NULL, NULL, TO_ROOM);
act("Your body flickers with red energy.", ch, NULL, NULL, TO_CHAR);
if (IS_CLASS(ch, CLASS_ANGEL))
location = get_room_index(ROOM_VNUM_ANGEL_HOME);
else if (IS_CLASS(ch, CLASS_LICH))
location = get_room_index(ROOM_VNUM_LICH_HOME);
else if (IS_CLASS(ch, CLASS_TANARRI))
location = get_room_index(ROOM_VNUM_TAN_HOME);
else if (IS_CLASS(ch, CLASS_CYBORG))
location = get_room_index(ROOM_VNUM_DROID_HOME);
else if (IS_CLASS(ch, CLASS_SAMURAI))
location = get_room_index(ROOM_VNUM_SAM_HOME);
else if (IS_CLASS(ch, CLASS_UNDEAD_KNIGHT))
location = get_room_index(ROOM_VNUM_UK_HOME);
else if (IS_CLASS(ch, CLASS_VAMPIRE))
location = get_room_index(ROOM_VNUM_VAMP_HOME);
else if (IS_CLASS(ch, CLASS_NINJA))
location = get_room_index(ROOM_VNUM_NINJA_HOME);
else if (IS_CLASS(ch, CLASS_MAGE))
location = get_room_index(ROOM_VNUM_MAGE_HOME);
else if (IS_CLASS(ch, CLASS_WEREWOLF))
location = get_room_index(ROOM_VNUM_WW_HOME);
else if (IS_CLASS(ch, CLASS_MONK))
location = get_room_index(ROOM_VNUM_MONK_HOME);
else if (IS_CLASS(ch, CLASS_THIEF))
location = get_room_index(ROOM_VNUM_THIEF_HOME);
else if (IS_CLASS(ch, CLASS_DRACONIAN))
location = get_room_index(ROOM_VNUM_DRAC_HOME);
else if (IS_CLASS(ch, CLASS_SKYBLADE))
location = get_room_index(ROOM_VNUM_SKY_HOME);
else if (IS_CLASS(ch, CLASS_GHOUL))
location = get_room_index(ROOM_VNUM_GHOUL_HOME);
else if (IS_CLASS(ch, CLASS_DEMON))
location = get_room_index(ROOM_VNUM_DEMON_HOME);
else if (IS_CLASS(ch, CLASS_JEDI))
location = get_room_index(ROOM_VNUM_JEDI_HOME);
else if (IS_CLASS(ch, CLASS_SHADOW))
location = get_room_index(ROOM_VNUM_SHADOW_HOME);
else if (IS_CLASS(ch, CLASS_SHAPESHIFTER))
location = get_room_index(ROOM_VNUM_SHIFTER_HOME);
else if (IS_CLASS(ch, CLASS_DROW))
location = get_room_index(ROOM_VNUM_DROW_HOME);
else if (IS_CLASS(ch, CLASS_PRIEST))
location = get_room_index(ROOM_VNUM_PRIEST_HOME);
else if (IS_CLASS(ch, CLASS_FAE))
location = get_room_index(ROOM_VNUM_FAE_HOME);
else if (IS_CLASS(ch, CLASS_DRONE))
location = get_room_index(ROOM_VNUM_DRONE_HOME);
else if (IS_CLASS(ch, CLASS_HOBBIT))
location = get_room_index(ROOM_VNUM_HOBBIT_HOME);
else if (IS_CLASS(ch, CLASS_GIANT))
location = get_room_index(ROOM_VNUM_GIANT_HOME);
else if (IS_CLASS(ch, CLASS_ELEMENTAL))
location = get_room_index(ROOM_VNUM_ELEMENTAL_HOME);
else if (IS_CLASS(ch, CLASS_PALADIN))
location = get_room_index(ROOM_VNUM_PALADIN_HOME);
else if (IS_CLASS(ch, CLASS_BLADE_MASTER))
location = get_room_index(ROOM_VNUM_BLADE_HOME);
else
{
send_to_char("Your crecall is broken, tell Zarius\n\r", ch);
return;
}
if (ch->in_room == location)
return;
if (IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL)
|| IS_AFFECTED(ch, AFF_CURSE))
{
send_to_char("You are unable to crecall.\n\r", ch);
return;
}
if ((victim = ch->fighting) != NULL)
{
if (number_bits(1) == 0)
{
WAIT_STATE(ch, 4);
xprintf(buf, "You failed!\n\r");
send_to_char(buf, ch);
return;
}
xprintf(buf, "You crecall from combat!\n\r");
send_to_char(buf, ch);
stop_fighting(ch, TRUE);
}
act("$n disappears.", ch, NULL, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, location);
act("$n appears in the room.", ch, NULL, NULL, TO_ROOM);
do_look(ch, "auto");
if ((mount = ch->mount) == NULL)
return;
char_from_room(mount);
char_to_room(mount, ch->in_room);
return;
}
void do_home(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (arg[0] == '\0' || str_cmp(arg, "here"))
{
send_to_char
("If you wish this to be your room, you must type 'home here'.\n\r",
ch);
return;
}
if (ch->in_room->vnum == ch->home)
{
send_to_char("But this is already your home!\n\r", ch);
return;
}
if (IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) ||
IS_SET(ch->in_room->room_flags, ROOM_ASTRAL)
|| IS_SET(ch->in_room->area->areabits, AREA_BIT_NOHOME)
|| IS_SET(ch->in_room->room_flags, ROOM_SAFE))
{
send_to_char
("You are unable to make this room your home.\n\r",
ch);
return;
}
if (ch->in_room->vnum == 3001)
{
send_to_char
("You are unable to make this room your home.\n\r",
ch);
return;
}
ch->home = ch->in_room->vnum;
send_to_char("This room is now your home.\n\r", ch);
return;
}
void do_escape(CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
ROOM_INDEX_DATA *location;
if (IS_NPC(ch) || !IS_HERO(ch))
return;
if (ch->position >= POS_SLEEPING)
{
send_to_char("You can only do this if you are dying.\n\r",
ch);
return;
}
if ((location = get_room_index(ROOM_VNUM_ESCAPE)) == NULL)
{
send_to_char("You are completely lost.\n\r", ch);
return;
}
if (ch->in_room != NULL)
{
if (IS_SET(ch->in_room->room_flags, ROOM_ARENA))
{
send_to_char("No silly.\n\r", ch);
return;
}
}
if (in_fortress(ch))
{
send_to_char("Theres nowhere to run.\n\r", ch);
return;
}
if (ch->in_room == location)
return;
ch->move = 0;
ch->mana = 0;
act("$n fades out of existance.", ch, NULL, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, location);
act("$n fades into existance.", ch, NULL, NULL, TO_ROOM);
do_look(ch, "auto");
xprintf(buf,
"%s has escaped #Gdefenceless#n, easy kill for the quick.",
ch->pcdata->switchname);
ch->combat = NULL;
do_info(ch, buf);
if (IS_SET(ch->newbits, NEW_DARKNESS))
{
REMOVE_BIT(ch->newbits, NEW_DARKNESS);
if (ch->in_room != NULL)
if (IS_SET
(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS))
REMOVE_BIT(ch->in_room->room_flags,
ROOM_TOTAL_DARKNESS);
return;
}
return;
}
int disc_points_needed(CHAR_DATA * ch)
{
if (IS_NPC(ch))
return 1;
return (ch->power[ch->pcdata->disc_research] + 1) * 10;
}
void gain_disc_points(CHAR_DATA * ch, int points)
{
if (IS_NPC(ch))
return;
if (ch->pcdata->disc_points == 666)
return;
if (ch->pcdata->disc_research == -1)
return;
ch->pcdata->disc_points += points;
if (ch->pcdata->disc_points < 0)
{
ch->pcdata->disc_points = 0;
return;
}
if (ch->pcdata->disc_points >= disc_points_needed(ch))
{
ch->pcdata->disc_points = 999;
WAIT_STATE(ch, 6);
stc("#BYou have finished researching your discipline.\n\r",
ch);
stc("You may now use the 'train' command.#n\n\r", ch);
return;
}
}
void do_research(CHAR_DATA * ch, char *argument)
{
int i;
int needed;
int maxlevel;
char buf[MAX_STRING_LENGTH];
maxlevel = 0;
if (IS_CLASS(ch, CLASS_VAMPIRE))
{
if (ch->pcdata->rank == AGE_CHILDE
|| ch->pcdata->rank == AGE_NEONATE)
maxlevel = 5;
else if (ch->pcdata->rank == AGE_ANCILLA)
maxlevel = 7;
else if (ch->pcdata->rank == AGE_ELDER)
maxlevel = 9;
else
maxlevel = 10;
}
else if (IS_CLASS(ch, CLASS_FAE))
{
maxlevel = 2;
if (ch->pcdata->powers[FAE_PLASMA] > 3)
maxlevel++;
if (ch->pcdata->powers[FAE_MATTER] > 3)
maxlevel++;
if (ch->pcdata->powers[FAE_ENERGY] > 3)
maxlevel++;
if (ch->pcdata->powers[FAE_WILL] > 3)
maxlevel++;
if (ch->pcdata->powers[FAE_PLASMA] > 7)
maxlevel++;
if (ch->pcdata->powers[FAE_MATTER] > 7)
maxlevel++;
if (ch->pcdata->powers[FAE_ENERGY] > 7)
maxlevel++;
if (ch->pcdata->powers[FAE_WILL] > 7)
maxlevel++;
}
else
maxlevel = 10;
if (IS_NPC(ch))
return;
if (!str_cmp(argument, "cancel"))
{
if (ch->pcdata->disc_research == -1)
{
stc("You are not currently researching a discipline.\n\r", ch);
return;
}
stc("You stop your research.\n\r", ch);
ch->pcdata->disc_research = -1;
ch->pcdata->disc_points = 0;
return;
}
if (argument[0] == '\0')
{
stc("What do you wish to research.\n\r", ch);
return;
}
if (ch->pcdata->disc_research != -1)
{
stc("You are already researching a discipline.\n\r", ch);
stc("Type 'research cancel' to stop.\n\r", ch);
return;
}
for (i = 1; i < MAX_DISCIPLINES; i++)
{
if (discipline[i][0] != '\0'
&& !str_prefix(argument, discipline[i]))
{
needed = ((ch->power[i] - 5) * 10);
if (ch->power[i] < 0)
{
stc("You don't know any disciplines of that name.\n\r", ch);
return;
}
if (IS_CLASS(ch, CLASS_VAMPIRE)
&& ch->power[i] >= maxlevel)
{
stc("You need to age more before progressing in this discipline.\n\r", ch);
return;
}
if (IS_CLASS(ch, CLASS_FAE)
&& ch->power[i] >= maxlevel)
{
stc("You are not ready to go beyond that level yet.\n\r", ch);
return;
}
if (ch->power[i] >= 10)
{
stc("You have reached full mastery of this discipline.\n\r", ch);
return;
}
xprintf(buf, "You begin your research into %s.\n\r",
discipline[i]);
stc(buf, ch);
ch->pcdata->disc_points = 0;
ch->pcdata->disc_research = i;
return;
}
}
stc("You don't know any disciplines of that name.\n\r", ch);
}
const char *wwgift[MAX_GIFTS] = {
"",
"Homid", "Metis",
"Lupus", "Ragabash",
"Theurge", "Philodox",
"Galliard", "Ahroun",
"Black Furies", "Bone Gnawers",
"Children of Gaia", "Fianna",
"Get of Fenris", "Glass Walkers",
"Red Talons", "Shadow Lords",
"Silent Striders", "Silver Fangs",
"Stargazers", "Uktena",
"Wendigo"
};
const char *discipline[MAX_DISCIPLINES] = {
"", "nature",
"celerity", "fortitude",
"obtenebration", "presence",
"quietus", "thaumaturgy",
"auspex", "dominate",
"obfuscate", "potence",
"protean", "serpentis",
"vicissitude", "daimoinon",
"animalism", "arcane",
/* Werewolf */
"bear", "lynx",
"boar", "owl",
"spider", "wolf",
"hawk", "mantis",
"raptor", "luna",
"pain", "congregation",
/* Daemon */
"hellfire", "attack",
"temptation", "morphosis",
"corruption", "geluge",
"discord", "nether",
"immunae", "chimerstry",
"thanatosis", "obeah",
"necromancy", "melpominee",
/* Drow */
"groundhog", "rodent",
"arachnid", "jellyfish",
"chameleon", "bat",
"crustation", "raven",
"pirana"
};
void do_disciplines(CHAR_DATA * ch, char *argument)
{
char buf[MAX_INPUT_LENGTH];
char buf2[MAX_INPUT_LENGTH];
int loop;
int percent = 0, i;
int indent = 0;
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_WEREWOLF) && !IS_CLASS(ch, CLASS_VAMPIRE)
&& !IS_CLASS(ch, CLASS_DEMON) && !IS_CLASS(ch, CLASS_FAE))
{
send_to_char("Huh.\n\r", ch);
return;
}
if (IS_CLASS(ch, CLASS_WEREWOLF))
xprintf(buf, "#0---===#W[ #RGuardians #W]#0===---#n");
else
xprintf(buf, "#0---===#W[ #RDisciplines #W]#0===---#n");
cent_to_char(buf, ch);
send_to_char("\n\r", ch);
for (loop = 1; loop < MAX_DISCIPLINES; loop++)
{
if (discipline[loop][0] != '\0'
&& strlen(discipline[loop]) != 0 && ch->power[loop] >= 0)
{
xprintf_2(buf2, "%s", discipline[loop]);
buf2[0] = UPPER(buf2[0]);
xprintf(buf, " #0%-14s#B: #w%-2d#n",
buf2, ch->power[loop]);
send_to_char(buf, ch);
indent++;
if (indent == 3)
{
stc("\n\r", ch);
indent = 0;
}
}
}
if (indent != 0)
stc("\n\r", ch);
/*
* This tells them if they are currently researching
*/
if (ch->pcdata->disc_research < 0)
{
send_to_char("\n\r", ch);
divide6_to_char(ch);
return;
}
if (ch->power[ch->pcdata->disc_research] < 0)
{
send_to_char("\n\r", ch);
divide6_to_char(ch);
return;
}
if (ch->pcdata->disc_points == 999)
{
stc("\n\r", ch);
xprintf(buf, "You have finished researching %s.",
discipline[ch->pcdata->disc_research]);
cent_to_char(buf, ch);
stc("\n\r", ch);
divide6_to_char(ch);
return;
}
if (ch->pcdata->disc_research < MAX_DISCIPLINES)
{
send_to_char("\n\r", ch);
xprintf(buf, "You are currently researching %s.",
discipline[ch->pcdata->disc_research]);
cent_to_char(buf, ch);
}
percent = ch->pcdata->disc_points * 40 / disc_points_needed(ch);
xprintf(buf, "-[#R");
for (i = 0; i < percent; i++)
strcat(buf, "*");
for (i = percent; i < 40; i++)
strcat(buf, " ");
strcat(buf, "#n]-");
cent_to_char(buf, ch);
}
void do_relearn(CHAR_DATA * ch, char *argument)
{
char arg1[MAX_STRING_LENGTH];
argument = one_argument(argument, arg1);
if (IS_NPC(ch))
return;
if (!str_cmp(arg1, "slash") || !str_cmp(arg1, "slice"))
{
if (IS_IMMUNE(ch, IMM_SLASH))
{
REMOVE_BIT(ch->immune, IMM_SLASH);
send_to_char
("You forget Slash & Slice resistances.\n\r",
ch);
return;
}
}
if (!strcmp(arg1, "stab") || !str_cmp(arg1, "pierce"))
{
if (IS_IMMUNE(ch, IMM_STAB))
{
REMOVE_BIT(ch->immune, IMM_STAB);
send_to_char
("You forget Stab & Pierce resistances.\n\r",
ch);
return;
}
}
if (!strcmp(arg1, "smash") || !str_cmp(arg1, "pound")
|| !str_cmp(arg1, "blast") || !str_cmp(arg1, "crush"))
{
if (IS_IMMUNE(ch, IMM_SMASH))
{
REMOVE_BIT(ch->immune, IMM_SMASH);
send_to_char
("You forget Pound, Blast & Crush resistances.\n\r",
ch);
return;
}
}
if (!strcmp(arg1, "beast") || !str_cmp(arg1, "claw")
|| !str_cmp(arg1, "bite"))
{
if (IS_IMMUNE(ch, IMM_ANIMAL))
{
REMOVE_BIT(ch->immune, IMM_ANIMAL);
send_to_char
("You forget Claw & Bite resistances.\n\r",
ch);
return;
}
}
if (!strcmp(arg1, "grab") || !str_cmp(arg1, "grep")
|| !str_cmp(arg1, "whip") || !str_cmp(arg1, "suck"))
{
if (IS_IMMUNE(ch, IMM_MISC))
{
REMOVE_BIT(ch->immune, IMM_MISC);
send_to_char
("You forget Grep, Whip & Suck resistances.\n\r",
ch);
return;
}
}
if (!strcmp(arg1, "charm"))
{
if (IS_IMMUNE(ch, IMM_CHARM))
{
REMOVE_BIT(ch->immune, IMM_CHARM);
send_to_char("You forget Charm immunity.\n\r", ch);
return;
}
}
if (!strcmp(arg1, "heat"))
{
if (IS_IMMUNE(ch, IMM_HEAT))
{
REMOVE_BIT(ch->immune, IMM_HEAT);
send_to_char("You forget Heat immunity.\n\r", ch);
return;
}
}
if (!strcmp(arg1, "cold"))
{
if (IS_IMMUNE(ch, IMM_COLD))
{
REMOVE_BIT(ch->immune, IMM_COLD);
send_to_char("You forget Cold immunity.\n\r", ch);
return;
}
}
if (!strcmp(arg1, "lightning"))
{
if (IS_IMMUNE(ch, IMM_LIGHTNING))
{
REMOVE_BIT(ch->immune, IMM_LIGHTNING);
send_to_char("You forget Lightning immunity.\n\r",
ch);
return;
}
}
if (!strcmp(arg1, "acid"))
{
if (IS_IMMUNE(ch, IMM_ACID))
{
REMOVE_BIT(ch->immune, IMM_ACID);
send_to_char("You forget Acid immunity.\n\r", ch);
return;
}
}
if (!strcmp(arg1, "cold"))
{
if (IS_IMMUNE(ch, IMM_COLD))
{
REMOVE_BIT(ch->immune, IMM_COLD);
send_to_char("You forget Cold immunity.\n\r", ch);
return;
}
}
if (!strcmp(arg1, "drain"))
{
if (IS_IMMUNE(ch, IMM_DRAIN))
{
REMOVE_BIT(ch->immune, IMM_DRAIN);
send_to_char("You forget Drain immunity.\n\r", ch);
return;
}
}
if (!strcmp(arg1, "voodoo"))
{
if (IS_IMMUNE(ch, IMM_VOODOO))
{
REMOVE_BIT(ch->immune, IMM_VOODOO);
send_to_char("You forget Voodoo immunity.\n\r", ch);
return;
}
}
if (!strcmp(arg1, "hurl"))
{
if (IS_IMMUNE(ch, IMM_HURL))
{
REMOVE_BIT(ch->immune, IMM_HURL);
send_to_char("You forget Hurl immunity.\n\r", ch);
return;
}
}
if (!strcmp(arg1, "backstab"))
{
if (IS_IMMUNE(ch, IMM_BACKSTAB))
{
REMOVE_BIT(ch->immune, IMM_BACKSTAB);
send_to_char("You forget Backstab immunity.\n\r", ch);
return;
}
}
if (!strcmp(arg1, "kick"))
{
if (IS_IMMUNE(ch, IMM_KICK))
{
REMOVE_BIT(ch->immune, IMM_KICK);
send_to_char("You forget Kick immunity.\n\r", ch);
return;
}
}
if (!strcmp(arg1, "disarm"))
{
if (IS_IMMUNE(ch, IMM_DISARM))
{
REMOVE_BIT(ch->immune, IMM_DISARM);
send_to_char("You forget Disarm immunity.\n\r", ch);
return;
}
}
if (!strcmp(arg1, "steal"))
{
if (IS_IMMUNE(ch, IMM_STEAL))
{
REMOVE_BIT(ch->immune, IMM_STEAL);
send_to_char("You forget Steal immunity.\n\r", ch);
return;
}
}
else
{
send_to_char
("Command: relearn an already learned immunity/resistance.\n\r",
ch);
return;
}
}
void do_train(CHAR_DATA * ch, char *argument)
{
char arg1[MAX_STRING_LENGTH];
char arg2[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
sh_int *pAbility = NULL;
char *pOutput = NULL;
int cost;
int magic;
int immcost;
int primal;
int silver;
int gnosis;
int ancilla;
int methuselah;
int lamagra;
int trueblood;
int elder;
int beast;
int belt1;
int belt2;
int belt3;
int belt4;
int belt5;
int belt6;
int belt7;
int belt8;
int belt9;
int belt10;
int max_stat = 100;
bool last = TRUE;
bool is_ok = FALSE;
int loop;
int pow;
int cmax = 200;
int permstat;
int rank_xp = 50000000 * ch->pRank;
int rank_bones = 8000 * ch->pRank;
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if (IS_NPC(ch))
return;
switch (ch->class)
{
default:
cmax = 200;
break;
case CLASS_LICH:
cmax = 320;
break;
case CLASS_MAGE:
cmax = 240;
break;
}
if (IS_CLASS(ch, CLASS_SAMURAI)
|| IS_RACE(ch, RACE_ARCHDEMON)
|| IS_RACE(ch, RACE_ARCHANGEL))
permstat = 110;
else
permstat = 100;
if( !str_cmp( arg1, "rank" ) ) {
if( ch->pRank >= MAX_RANKING ) {
send_to_char( "Already Maximum Rank.\n\r", ch );
return;
}
if( ch->exp < rank_xp ) {
sprintf( buf, "Not enough Experience points, you need %d more.\n\r", ( rank_xp - ch->exp ) );
send_to_char( buf, ch );
return;
}
if( ch->bones < rank_bones ) {
sprintf( buf, "Not enough bones, you need %d more.\n\r", ( rank_bones - ch->bones ) );
send_to_char( buf, ch );
return;
}
ch->bones -= rank_bones;
ch->exp -= rank_xp;
ch->pRank++;
sprintf( buf, "You are now known as %s %s", getCurrRanking( ch, ch->pRank ), ch->pcdata->switchname );
stc( buf,ch );
return;
}
if (IS_CLASS(ch, CLASS_HOBBIT) && !IS_NPC(ch))
{
if (!str_cmp(arg1, "combatskills")
&& ch->pcdata->powers[HOBBIT_COMBAT] < 5)
{
if (ch->exp < 10000000)
{
send_to_char
("You don't have the 10 mill exp.\n\r",
ch);
return;
}
ch->exp -= 10000000;
ch->pcdata->powers[HOBBIT_COMBAT]++;
send_to_char("Ok.\n\r", ch);
return;
}
}
if (IS_CLASS(ch, CLASS_TANARRI) && !IS_NPC(ch))
{
if (!str_cmp(arg1, "fodder") && ch->pcdata->rank == 0)
{
if (ch->exp < 10000000)
{
send_to_char("You don't have the exp.\n\r",
ch);
return;
}
ch->exp -= 10000000;
ch->pcdata->rank++;
xprintf(buf, "%s is now fodder in the Blood Wars!",
ch->pcdata->switchname);
do_info(ch, buf);
return;
}
if (!str_cmp(arg1, "fighter") && ch->pcdata->rank == 1)
{
if (ch->pcdata->powers[TANARRI_POWER_COUNTER] < 3)
{
send_to_char
("You still haven't gotten all powers, FODDER!\n\r",
ch);
return;
}
if (ch->exp < 20000000)
{
send_to_char("You don't have the exp.\n\r",
ch);
return;
}
ch->exp -= 20000000;
ch->pcdata->rank++;
xprintf(buf, "%s is now a fighter in the Blood Wars!",
ch->pcdata->switchname);
do_info(ch, buf);
return;
}
if (!str_cmp(arg1, "elite") && ch->pcdata->rank == 2)
{
if (ch->pcdata->powers[TANARRI_POWER_COUNTER] < 6)
{
send_to_char
("You still haven't gotten all powers, FIGHTER!\n\r",
ch);
return;
}
if (ch->exp < 40000000)
{
send_to_char("You don't have the exp.\n\r",
ch);
return;
}
ch->exp -= 40000000;
ch->pcdata->rank++;
xprintf(buf,
"%s is now an elite warrior in the Blood Wars!",
ch->pcdata->switchname);
do_info(ch, buf);
return;
}
if (!str_cmp(arg1, "captain") && ch->pcdata->rank == 3)
{
if (ch->pcdata->powers[TANARRI_POWER_COUNTER] < 9)
{
send_to_char
("You still haven't gotten all powers, SOLDIER!\n\r",
ch);
return;
}
if (ch->exp < 80000000)
{
send_to_char("You don't have the exp.\n\r",
ch);
return;
}
ch->exp -= 80000000;
ch->pcdata->rank++;
xprintf(buf, "%s is now a captain in the Blood Wars!",
ch->pcdata->switchname);
do_info(ch, buf);
return;
}
if (!str_cmp(arg1, "warlord") && ch->pcdata->rank == 4)
{
if (ch->pcdata->powers[TANARRI_POWER_COUNTER] < 12)
{
send_to_char
("You still haven't gotten all powers, CAPTAIN!\n\r",
ch);
return;
}
if (ch->exp < 160000000)
{
send_to_char("You don't have the exp.\n\r",
ch);
return;
}
ch->exp -= 160000000;
ch->pcdata->rank++;
xprintf(buf, "%s is now a warlord in the Blood Wars!",
ch->pcdata->switchname);
do_info(ch, buf);
return;
}
if (!str_cmp(arg1, "balor") && ch->pcdata->rank == 5)
{
if (ch->pcdata->powers[TANARRI_POWER_COUNTER] < 15)
{
send_to_char
("You still haven't gotten all powers, MR. WARLORD!\n\r",
ch);
return;
}
if (ch->exp < 320000000)
{
send_to_char("You don't have the exp.\n\r",
ch);
return;
}
ch->exp -= 320000000;
ch->pcdata->rank++;
xprintf(buf, "%s is now a Tanar'ri Balor!",
ch->pcdata->switchname);
do_info(ch, buf);
return;
}
}
if (!str_cmp(arg1,"earth"))
{
if (!IS_CLASS(ch, CLASS_ELEMENTAL) || ch->pcdata->powers[ELEMENTAL_EARTH] > 4)
{
do_train(ch,"");
return;
}
if (ch->exp < (ch->pcdata->powers[ELEMENTAL_EARTH]+1)*10000000)
{
send_to_char("You don't have enought exp.\n\r",ch);
return;
}
ch->pcdata->powers[ELEMENTAL_EARTH]++;
ch->exp -= ch->pcdata->powers[ELEMENTAL_EARTH]*10000000;
send_to_char("Ok.\n\r",ch);
return;
}
if (!str_cmp(arg1,"air"))
{
if (!IS_CLASS(ch, CLASS_ELEMENTAL) || ch->pcdata->powers[ELEMENTAL_AIR] > 4)
{
do_train(ch,"");
return;
}
if (ch->exp < (ch->pcdata->powers[ELEMENTAL_AIR]+1)*10000000)
{
send_to_char("You don't have enought exp.\n\r",ch);
return;
}
ch->pcdata->powers[ELEMENTAL_AIR]++;
ch->exp -= ch->pcdata->powers[ELEMENTAL_AIR]*10000000;
send_to_char("Ok.\n\r",ch);
return;
}
if (!str_cmp(arg1,"water"))
{
if (!IS_CLASS(ch, CLASS_ELEMENTAL) || ch->pcdata->powers[ELEMENTAL_WATER] > 4)
{
do_train(ch,"");
return;
}
if (ch->exp < (ch->pcdata->powers[ELEMENTAL_WATER]+1)*10000000)
{
send_to_char("You don't have enought exp.\n\r",ch);
return;
}
ch->pcdata->powers[ELEMENTAL_WATER]++;
ch->exp -= ch->pcdata->powers[ELEMENTAL_WATER]*10000000;
send_to_char("Ok.\n\r",ch);
return;
}
if (!str_cmp(arg1,"fire"))
{
if (!IS_CLASS(ch, CLASS_ELEMENTAL) || ch->pcdata->powers[ELEMENTAL_FIRE] > 4)
{
do_train(ch,"");
return;
}
if (ch->exp < (ch->pcdata->powers[ELEMENTAL_FIRE]+1)*10000000)
{
send_to_char("You don't have enought exp.\n\r",ch);
return;
}
ch->pcdata->powers[ELEMENTAL_FIRE]++;
ch->exp -= ch->pcdata->powers[ELEMENTAL_FIRE]*10000000;
send_to_char("Ok.\n\r",ch);
return;
}
if (!str_cmp(arg1, "justice"))
{
if (!IS_CLASS(ch, CLASS_ANGEL)
|| ch->pcdata->powers[ANGEL_JUSTICE] > 4)
{
do_train(ch, "");
return;
}
if (ch->exp <
(ch->pcdata->powers[ANGEL_JUSTICE] + 1) * 10000000)
{
send_to_char("You don't have enought exp.\n\r", ch);
return;
}
ch->pcdata->powers[ANGEL_JUSTICE]++;
ch->exp -= ch->pcdata->powers[ANGEL_JUSTICE] * 10000000;
send_to_char("Ok.\n\r", ch);
return;
}
if (!str_cmp(arg1, "love"))
{
if (!IS_CLASS(ch, CLASS_ANGEL)
|| ch->pcdata->powers[ANGEL_LOVE] > 4)
{
do_train(ch, "");
return;
}
if (ch->exp < (ch->pcdata->powers[ANGEL_LOVE] + 1) * 10000000)
{
send_to_char("You don't have enought exp.\n\r", ch);
return;
}
ch->pcdata->powers[ANGEL_LOVE]++;
ch->exp -= ch->pcdata->powers[ANGEL_LOVE] * 10000000;
send_to_char("Ok.\n\r", ch);
return;
}
if (!str_cmp(arg1, "harmony"))
{
if (!IS_CLASS(ch, CLASS_ANGEL)
|| ch->pcdata->powers[ANGEL_HARMONY] > 4)
{
do_train(ch, "");
return;
}
if (ch->exp <
(ch->pcdata->powers[ANGEL_HARMONY] + 1) * 10000000)
{
send_to_char("You don't have enought exp.\n\r", ch);
return;
}
ch->pcdata->powers[ANGEL_HARMONY]++;
ch->exp -= ch->pcdata->powers[ANGEL_HARMONY] * 10000000;
send_to_char("Ok.\n\r", ch);
return;
}
if (!str_cmp(arg1, "peace"))
{
if (!IS_CLASS(ch, CLASS_ANGEL)
|| ch->pcdata->powers[ANGEL_PEACE] > 4)
{
do_train(ch, "");
return;
}
if (ch->exp <
(ch->pcdata->powers[ANGEL_PEACE] + 1) * 10000000)
{
send_to_char("You don't have enought exp.\n\r", ch);
return;
}
ch->pcdata->powers[ANGEL_PEACE]++;
ch->exp -= ch->pcdata->powers[ANGEL_PEACE] * 10000000;
send_to_char("Ok.\n\r", ch);
return;
}
if (!str_cmp(arg1, "primal"))
{
int amount = 0;
int urin = 0;
int urin_counter = 0;
if (!is_number(arg2) && strcmp(arg2, "all"))
{
send_to_char("Please enter a numeric value.\n\r", ch);
return;
}
if (is_number(arg2))
{
amount = atoi(arg2);
if (amount < 1 || amount > 500)
{
send_to_char
("Please enter a value between 1 and 500.\n\r",
ch);
return;
}
}
else
{
amount = 100000;
}
for (urin = 0; urin < amount; urin++)
{
if (ch->exp >= (ch->practice + 1) * 500)
{
ch->practice++;
ch->exp -= ch->practice * 500;
urin_counter++;
}
}
if (urin_counter == 0)
{
send_to_char
("You need more exp to gain any primal.\n\r",
ch);
}
if (urin_counter == 1)
{
send_to_char("You gain 1 primal.\n\r", ch);
}
if (urin_counter > 1)
{
xprintf(buf, "You gain %d primal.\n\r", urin_counter);
send_to_char(buf, ch);
}
return;
}
if (!str_cmp(arg1, "purple"))
{
int amount = 0;
int urin = 0;
int urin_counter = 0;
if (ch->spl[0] >= cmax)
{
send_to_char
("You've reached the class spell level max.\n\r",
ch);
return;
}
if (!is_number(arg2) && strcmp(arg2, "all"))
{
send_to_char
("Please enter a numeric value or use 'all'.\n\r",
ch);
return;
}
if (is_number(arg2))
{
amount = atoi(arg2);
if (amount < 1 || amount > (cmax - ch->spl[0]))
{
xprintf(buf,
"Please enter a value between 1 and %d.\n\r",
cmax - ch->spl[0]);
send_to_char(buf, ch);
return;
}
}
else
amount = 10000;
for (urin = 0; urin < amount; urin++)
{
if (ch->bones >= UMAX((ch->spl[0] * 2), 1)
&& ch->spl[0] < cmax)
{
ch->spl[0]++;
ch->bones -= ch->spl[0] * 2;
urin_counter++;
}
else
{
send_to_char
("You cannot afford this the upgrade\n\r",
ch);
return;
}
}
if (urin_counter == 0)
send_to_char
("You need more bones to gain any more spell level.\n\r",
ch);
else if (urin_counter == 1)
send_to_char("You gain 1 point of purple.\n\r", ch);
else
{
xprintf(buf,
"You gain %d points of purple spell level.\n\r",
urin_counter);
send_to_char(buf, ch);
}
return;
}
if (!str_cmp(arg1, "blue"))
{
int amount = 0;
int urin = 0;
int urin_counter = 0;
if (ch->spl[2] >= cmax)
{
send_to_char
("You've reached the class spell level max.\n\r",
ch);
return;
}
if (!is_number(arg2) && strcmp(arg2, "all"))
{
send_to_char
("Please enter a numeric value or use 'all'.\n\r",
ch);
return;
}
if (is_number(arg2))
{
amount = atoi(arg2);
if (amount < 1 || amount > (cmax - ch->spl[2]))
{
xprintf(buf,
"Please enter a value between 1 and %d.\n\r",
cmax - ch->spl[2]);
send_to_char(buf, ch);
return;
}
}
else
amount = 10000;
for (urin = 0; urin < amount; urin++)
{
if (ch->bones >= UMAX((ch->spl[2] * 2), 1)
&& ch->spl[2] < cmax)
{
ch->spl[2]++;
ch->bones -= ch->spl[2] * 2;
urin_counter++;
}
else
{
send_to_char
("You cannot afford this the upgrade\n\r",
ch);
return;
}
}
if (urin_counter == 0)
send_to_char
("You need more bones to gain any more spell level.\n\r",
ch);
else if (urin_counter == 1)
send_to_char("You gain 1 point of blue.\n\r", ch);
else
{
xprintf(buf,
"You gain %d points of blue spell level.\n\r",
urin_counter);
send_to_char(buf, ch);
}
return;
}
if (!str_cmp(arg1, "red"))
{
int amount = 0;
int urin = 0;
int urin_counter = 0;
if (ch->spl[1] >= cmax)
{
send_to_char
("You've reached the class spell level max.\n\r",
ch);
return;
}
if (!is_number(arg2) && strcmp(arg2, "all"))
{
send_to_char
("Please enter a numeric value or use 'all'.\n\r",
ch);
return;
}
if (is_number(arg2))
{
amount = atoi(arg2);
if (amount < 1 || amount > (cmax - ch->spl[1]))
{
xprintf(buf,
"Please enter a value between 1 and %d.\n\r",
cmax - ch->spl[2]);
send_to_char(buf, ch);
return;
}
}
else
amount = 10000;
for (urin = 0; urin < amount; urin++)
{
if (ch->bones >= UMAX((ch->spl[1] * 2), 1)
&& ch->spl[1] < cmax)
{
ch->spl[1]++;
ch->bones -= ch->spl[1] * 2;
urin_counter++;
}
else
{
send_to_char
("You cannot afford this the upgrade\n\r",
ch);
return;
}
}
if (urin_counter == 0)
send_to_char
("You need more bones to gain any more spell level.\n\r",
ch);
else if (urin_counter == 1)
send_to_char("You gain 1 point of red.\n\r", ch);
else
{
xprintf(buf,
"You gain %d points of red spell level.\n\r",
urin_counter);
send_to_char(buf, ch);
}
return;
}
if (!str_cmp(arg1, "green"))
{
int amount = 0;
int urin = 0;
int urin_counter = 0;
if (ch->spl[3] >= cmax)
{
send_to_char
("You've reached the class spell level max.\n\r",
ch);
return;
}
if (!is_number(arg2) && strcmp(arg2, "all"))
{
send_to_char
("Please enter a numeric value or use 'all'.\n\r",
ch);
return;
}
if (is_number(arg2))
{
amount = atoi(arg2);
if (amount < 1 || amount > (cmax - ch->spl[3]))
{
xprintf(buf,
"Please enter a value between 1 and %d.\n\r",
cmax - ch->spl[3]);
send_to_char(buf, ch);
return;
}
}
else
amount = 10000;
for (urin = 0; urin < amount; urin++)
{
if (ch->bones >= UMAX((ch->spl[3] * 2), 1)
&& ch->spl[3] < cmax)
{
ch->spl[3]++;
ch->bones -= ch->spl[3] * 2;
urin_counter++;
}
else
{
send_to_char
("You cannot afford this the upgrade\n\r",
ch);
return;
}
}
if (urin_counter == 0)
send_to_char
("You need more bones to gain any more spell level.\n\r",
ch);
else if (urin_counter == 1)
send_to_char("You gain 1 point of green.\n\r", ch);
else
{
xprintf(buf,
"You gain %d points of green spell level.\n\r",
urin_counter);
send_to_char(buf, ch);
}
return;
}
if (!str_cmp(arg1, "yellow"))
{
int amount = 0;
int urin = 0;
int urin_counter = 0;
if (ch->spl[4] >= cmax)
{
send_to_char
("You've reached the class spell level max.\n\r",
ch);
return;
}
if (!is_number(arg2) && strcmp(arg2, "all"))
{
send_to_char
("Please enter a numeric value or use 'all'.\n\r",
ch);
return;
}
if (is_number(arg2))
{
amount = atoi(arg2);
if (amount < 1 || amount > (cmax - ch->spl[4]))
{
xprintf(buf,
"Please enter a value between 1 and %d.\n\r",
cmax - ch->spl[4]);
send_to_char(buf, ch);
return;
}
}
else
amount = 10000;
for (urin = 0; urin < amount; urin++)
{
if (ch->bones >= UMAX((ch->spl[0] * 2), 1)
&& ch->spl[4] < cmax)
{
ch->spl[4]++;
ch->bones -= ch->spl[4] * 2;
urin_counter++;
}
else
{
send_to_char
("You cannot afford this the upgrade\n\r",
ch);
return;
}
}
if (urin_counter == 0)
send_to_char
("You need more bones to gain any more spell level.\n\r",
ch);
else if (urin_counter == 1)
send_to_char("You gain 1 point of yellow.\n\r", ch);
else
{
xprintf(buf,
"You gain %d points of yellow spell level.\n\r",
urin_counter);
send_to_char(buf, ch);
}
return;
}
if (!str_cmp(arg1, "hp"))
{
int amount = 0;
int urin = 0;
int urin_counter = 0;
int statcap = UMIN(300000, 100000 + 10000 * ch->race);
if (ch->max_hit >= statcap)
{
send_to_char("You've reached the statcap.\n\r", ch);
return;
}
if (!is_number(arg2) && strcmp(arg2, "all"))
{
send_to_char
("Please enter a numeric value or use 'all'.\n\r",
ch);
return;
}
if (is_number(arg2))
{
amount = atoi(arg2);
if (amount < 1 || amount > 4000)
{
send_to_char
("Please enter a value between 1 and 4000.\n\r",
ch);
return;
}
}
else
amount = 100000;
for (urin = 0; urin < amount; urin++)
{
if (ch->exp >= UMAX((ch->max_hit + 1), 1)
&& ch->max_hit < statcap)
{
ch->max_hit++;
ch->exp -= UMAX(ch->max_hit, 1);
urin_counter++;
}
}
if (urin_counter == 0)
send_to_char("You need more exp to gain any hps.\n\r",
ch);
else if (urin_counter == 1)
send_to_char("You gain 1 hp.\n\r", ch);
else
{
xprintf(buf, "You gain %d hps.\n\r", urin_counter);
send_to_char(buf, ch);
}
return;
}
if (!str_cmp(arg1, "move"))
{
int amount = 0;
int urin = 0;
int urin_counter = 0;
int statcap = UMIN(300000, 100000 + 10000 * ch->race);
if (ch->max_move >= statcap)
{
send_to_char("You've reached the statcap.\n\r", ch);
return;
}
if (!is_number(arg2) && strcmp(arg2, "all"))
{
send_to_char
("Please enter a numeric value or use 'all'.\n\r",
ch);
return;
}
if (is_number(arg2))
{
amount = atoi(arg2);
if (amount < 1 || amount > 4000)
{
send_to_char
("Please enter a value between 1 and 4000.\n\r",
ch);
return;
}
}
else
amount = 100000;
for (urin = 0; urin < amount; urin++)
{
if (ch->exp >= UMAX((ch->max_move + 1), 1)
&& ch->max_move < statcap)
{
ch->max_move++;
ch->exp -= UMAX(1, ch->max_move);
urin_counter++;
}
}
if (urin_counter == 0)
send_to_char
("You need more exp to gain more move.\n\r",
ch);
else if (urin_counter == 1)
send_to_char("You gain 1 move.\n\r", ch);
else
{
xprintf(buf, "You gain %d move.\n\r", urin_counter);
send_to_char(buf, ch);
}
return;
}
if (!str_cmp(arg1, "str"))
{
pOutput = "strength";
cost = figure_stat_cost(ch->pcdata->perm_str);
if (ch->pcdata->perm_str >= permstat)
{
send_to_char("Your all maxxed out there\n\r", ch);
return;
}
if (cost > ch->practice)
{
ch_printf(ch,
"It costs %d primal to raise your %s by one.\n\r",
cost, pOutput);
return;
}
ch->pcdata->perm_str++;
ch->practice -= cost;
ch_printf(ch, "You have raised your %s.\n\r", pOutput);
return;
}
if (!str_cmp(arg1, "int"))
{
pOutput = "intelligence";
cost = figure_stat_cost(ch->pcdata->perm_int);
if (ch->pcdata->perm_int >= permstat)
{
send_to_char("Your all maxxed out there\n\r", ch);
return;
}
if (cost > ch->practice)
{
ch_printf(ch,
"It costs %d primal to raise your %s by one.\n\r",
cost, pOutput);
return;
}
ch->pcdata->perm_int++;
ch->practice -= cost;
ch_printf(ch, "You have raised your %s.\n\r", pOutput);
return;
}
if (!str_cmp(arg1, "wis"))
{
pOutput = "wisdom";
cost = figure_stat_cost(ch->pcdata->perm_wis);
if (ch->pcdata->perm_wis >= permstat)
{
send_to_char("Your all maxxed out there\n\r", ch);
return;
}
if (cost > ch->practice)
{
ch_printf(ch,
"It costs %d primal to raise your %s by one.\n\r",
cost, pOutput);
return;
}
ch->pcdata->perm_wis++;
ch->practice -= cost;
ch_printf(ch, "You have raised your %s.\n\r", pOutput);
return;
}
if (!str_cmp(arg1, "dex"))
{
pOutput = "dexterity";
cost = figure_stat_cost(ch->pcdata->perm_dex);
if (ch->pcdata->perm_dex >= permstat)
{
send_to_char("Your all maxxed out there\n\r", ch);
return;
}
if (cost > ch->practice)
{
ch_printf(ch,
"It costs %d primal to raise your %s by one.\n\r",
cost, pOutput);
return;
}
ch->pcdata->perm_dex++;
ch->practice -= cost;
ch_printf(ch, "You have raised your %s.\n\r", pOutput);
return;
}
if (!str_cmp(arg1, "con"))
{
pOutput = "constitution";
cost = figure_stat_cost(ch->pcdata->perm_con);
if (ch->pcdata->perm_con >= permstat)
{
send_to_char("Your all maxxed out there\n\r", ch);
return;
}
if (cost > ch->practice)
{
ch_printf(ch,
"It costs %d primal to raise your %s by one.\n\r",
cost, pOutput);
return;
}
ch->pcdata->perm_con++;
ch->practice -= cost;
ch_printf(ch, "You have raised your %s.\n\r", pOutput);
return;
}
if (!str_cmp(arg1, "mana"))
{
int amount = 0;
int urin = 0;
int urin_counter = 0;
int statcap = UMIN(300000, 100000 + 10000 * ch->race);
if (ch->max_mana >= statcap)
{
send_to_char("You've reached the statcap.\n\r", ch);
return;
}
if (!is_number(arg2) && strcmp(arg2, "all"))
{
send_to_char
("Please enter a numeric value or use 'all'.\n\r",
ch);
return;
}
if (is_number(arg2))
{
amount = atoi(arg2);
if (amount < 1 || amount > 4000)
{
send_to_char
("Please enter a value between 1 and 4000.\n\r",
ch);
return;
}
}
else
amount = 100000;
for (urin = 0; urin < amount; urin++)
{
if (ch->exp >= UMAX((ch->max_mana + 1), 1)
&& ch->max_mana < statcap)
{
ch->max_mana++;
ch->exp -= UMAX(ch->max_mana, 1);
urin_counter++;
}
}
if (urin_counter == 0)
send_to_char
("You need more exp to gain any mana.\n\r",
ch);
else if (urin_counter == 1)
send_to_char("You gain 1 mana.\n\r", ch);
else
{
xprintf(buf, "You gain %d mana.\n\r", urin_counter);
send_to_char(buf, ch);
}
return;
}
if (IS_NPC(ch))
return;
if (arg1[0] == '\0')
{
xprintf(buf,
"#0You have #Y%2.0f #0experience points and #Y%d #0primal.#n\n\r",
ch->exp, ch->practice);
send_to_char(buf, ch);
xprintf(arg1, "foo");
}
if (!str_cmp(arg1, "str"))
is_ok = TRUE;
else if (!str_cmp(arg1, "int"))
is_ok = TRUE;
else if (!str_cmp(arg1, "wis"))
is_ok = TRUE;
else if (!str_cmp(arg1, "dex"))
is_ok = TRUE;
else if (!str_cmp(arg1, "con"))
is_ok = TRUE;
else if (!str_cmp(arg1, "hp"))
is_ok = TRUE;
else if (!str_cmp(arg1, "mana"))
is_ok = TRUE;
else if (!str_cmp(arg1, "move"))
is_ok = TRUE;
else if (!str_cmp(arg1, "slash") || !str_cmp(arg1, "smash") ||
!str_cmp(arg1, "beast") || !str_cmp(arg1, "grab") ||
!str_cmp(arg1, "heat") || !str_cmp(arg1, "cold")
|| !str_cmp(arg1, "lightning") || !str_cmp(arg1, "acid")
|| !str_cmp(arg1, "drain") || !str_cmp(arg1, "hurl")
|| !str_cmp(arg1, "backstab") || !str_cmp(arg1, "kick")
|| !str_cmp(arg1, "disarm") || !str_cmp(arg1, "steal")
|| !str_cmp(arg1, "stab"))
is_ok = TRUE;
else if (!str_cmp(arg1, "sunlight") && IS_CLASS(ch, CLASS_VAMPIRE))
is_ok = TRUE;
else if (!str_cmp(arg1, "ancilla") && IS_CLASS(ch, CLASS_VAMPIRE) &&
(ch->pcdata->rank == AGE_NEONATE))
is_ok = TRUE;
else if (!str_cmp(arg1, "ancilla") && IS_CLASS(ch, CLASS_VAMPIRE) &&
(ch->pcdata->rank == AGE_CHILDE))
is_ok = TRUE;
else if (!str_cmp(arg1, "silver") && IS_CLASS(ch, CLASS_WEREWOLF))
is_ok = TRUE;
else if (!str_cmp(arg1, "forging")
&& !IS_SET(ch->pcdata->jflags, JFLAG_KNOWS_FORGING))
is_ok = TRUE;
else if (!str_cmp(arg1, "gnosis") && (IS_CLASS(ch, CLASS_WEREWOLF)))
is_ok = TRUE;
else if (!str_cmp(arg1, "control") && IS_CLASS(ch, CLASS_VAMPIRE)
&& ch->beast > 0)
is_ok = TRUE;
else if (!str_cmp(arg1, "belt1") && IS_CLASS(ch, CLASS_NINJA)
&& (ch->pcdata->rank == 0))
is_ok = TRUE;
else if (!str_cmp(arg1, "belt2") && IS_CLASS(ch, CLASS_NINJA) &&
(ch->pcdata->rank == BELT_ONE))
is_ok = TRUE;
else if (!str_cmp(arg1, "belt3") && IS_CLASS(ch, CLASS_NINJA) &&
(ch->pcdata->rank == BELT_TWO))
is_ok = TRUE;
else if (!str_cmp(arg1, "belt4") && IS_CLASS(ch, CLASS_NINJA) &&
(ch->pcdata->rank == BELT_THREE))
is_ok = TRUE;
else if (!str_cmp(arg1, "belt5") && IS_CLASS(ch, CLASS_NINJA) &&
(ch->pcdata->rank == BELT_FOUR))
is_ok = TRUE;
else if (!str_cmp(arg1, "belt6") && IS_CLASS(ch, CLASS_NINJA) &&
(ch->pcdata->rank == BELT_FIVE))
is_ok = TRUE;
else if (!str_cmp(arg1, "belt7") && IS_CLASS(ch, CLASS_NINJA) &&
(ch->pcdata->rank == BELT_SIX))
is_ok = TRUE;
else if (!str_cmp(arg1, "belt8") && IS_CLASS(ch, CLASS_NINJA) &&
(ch->pcdata->rank == BELT_SEVEN))
is_ok = TRUE;
else if (!str_cmp(arg1, "belt9") && IS_CLASS(ch, CLASS_NINJA) &&
(ch->pcdata->rank == BELT_EIGHT))
is_ok = TRUE;
else if (!str_cmp(arg1, "belt10") && IS_CLASS(ch, CLASS_NINJA) &&
(ch->pcdata->rank == BELT_NINE))
is_ok = TRUE;
else if (!str_cmp(arg1, "elder") && IS_CLASS(ch, CLASS_VAMPIRE) &&
(ch->pcdata->rank == AGE_ANCILLA))
is_ok = TRUE;
else if (!str_cmp(arg1, "methuselah") && IS_CLASS(ch, CLASS_VAMPIRE)
&& (ch->pcdata->rank == AGE_ELDER))
is_ok = TRUE;
else if (!str_cmp(arg1, "lamagra") && IS_CLASS(ch, CLASS_VAMPIRE) &&
(ch->pcdata->rank == AGE_METHUSELAH))
is_ok = TRUE;
else if (!str_cmp(arg1, "trueblood") && IS_CLASS(ch, CLASS_VAMPIRE) &&
(ch->pcdata->rank == AGE_LA_MAGRA))
is_ok = TRUE;
else if (!str_cmp(arg1, "magic") && IS_CLASS(ch, CLASS_DROW))
is_ok = TRUE;
for (loop = 1; loop < MAX_DISCIPLINES; loop++)
{
if (!str_prefix(arg1, discipline[loop])
&& ch->power[loop] > -1 && str_cmp(arg1, "con"))
{
if (!IS_CREATOR(ch))
{
if (ch->pcdata->disc_research == -1)
{
stc("You haven't started researching a discipline yet.\n\r", ch);
return;
}
if (ch->pcdata->disc_points != 999)
{
stc("You haven't finished researching the discipline yet.\n\r", ch);
return;
}
if (loop != ch->pcdata->disc_research)
{
stc("You have not researched that discipline.\n\r", ch);
return;
}
}
ch->power[loop] += 1;
ch->pcdata->disc_research = -1;
ch->pcdata->disc_points = 0;
if (loop == DISC_DAEM_GELU)
{
if (ch->power[DISC_DAEM_GELU] == 5)
stc("Your skin takes on an icy hardness.\n\r", ch);
}
/*
* DAEMONIC ATTACK LEVELS 1 to 10
*/
if (loop == DISC_DAEM_ATTA)
{
pow = ch->power[DISC_DAEM_ATTA];
if (pow == 2)
{
SET_BIT(ch->pcdata->stats[UNI_AFF],
VAM_CLAWS);
send_to_char
("You grow a pair of wicked claws.\n\r",
ch);
act("$n grows a pair of wicked claws.\n\r", ch, NULL, NULL, TO_ROOM);
}
if (pow == 3)
{
SET_BIT(ch->pcdata->stats[UNI_AFF],
VAM_TAIL);
send_to_char
("Your spine extends into a long tail.\n\r",
ch);
act("$n's spine extends into a long tail.\n\r", ch, NULL, NULL, TO_ROOM);
}
if (pow == 4)
{
horn(ch);
}
if (pow == 5)
{
SET_BIT(ch->pcdata->stats[UNI_GEN],
VAM_WINGS);
send_to_char
("A pair of leathery wings grow out of your back.\n\r",
ch);
act("A pair of leathery wings grow out of $n's back.\n\r", ch, NULL, NULL, TO_ROOM);
}
}
send_to_char("Your mastery of ", ch);
send_to_char(discipline[loop], ch);
send_to_char(" increases.\n\r", ch);
return;
}
}
cost = 200;
immcost = count_imms(ch);
belt1 = 5000000;
belt2 = 10000000;
belt3 = 15000000;
belt4 = 20000000;
belt5 = 25000000;
belt6 = 30000000;
belt7 = 35000000;
belt8 = 40000000;
belt9 = 45000000;
belt10 = 50000000;
primal = (1 + ch->practice) * 500;
magic = (1 + ch->pcdata->stats[DROW_MAGIC]) * 100;
silver = (1 + ch->siltol) * 2500;
gnosis = (1 + ch->gnosis[GMAXIMUM]) * 250000;
if (ch->beast > 25)
beast = 5;
else if (ch->beast > 15)
beast = 10;
else if (ch->beast > 10)
beast = 15;
else if (ch->beast > 2)
beast = 20;
else
beast = 25;
ancilla = 1500000;
elder = 7500000;
methuselah = 15000000;
lamagra = 30000000;
trueblood = 60000000;
if (!str_cmp(arg1, "str"))
{
pAbility = &ch->pcdata->perm_str;
pOutput = "strength";
}
else if (!str_cmp(arg1, "int"))
{
pAbility = &ch->pcdata->perm_int;
pOutput = "intelligence";
}
else if (!str_cmp(arg1, "wis"))
{
pAbility = &ch->pcdata->perm_wis;
pOutput = "wisdom";
}
else if (!str_cmp(arg1, "dex"))
{
pAbility = &ch->pcdata->perm_dex;
pOutput = "dexterity";
}
else if (!str_cmp(arg1, "con"))
{
pAbility = &ch->pcdata->perm_con;
pOutput = "constitution";
}
else if (!str_cmp(arg1, "avatar") && (ch->level == 2))
{
if (ch->max_hit < 2000)
{
stc("You need 2000 hp to train avatar.\n\r", ch);
return;
}
do_clearstats2(ch, "");
if (ch->max_hit < 2000)
{
stc("You need 2000 hp to train avatar.\n\r", ch);
return;
}
ch->level = 3;
if (!ragnarok)
ch->pcdata->safe_counter = 10;
else
ch->pcdata->safe_counter = 3;
strip_aggression(ch);
act("You become an avatar!", ch, NULL, NULL, TO_CHAR);
if (IS_SET(ch->pcdata->jflags, JFLAG_SETAVATAR))
avatar_message(ch);
else
{
xprintf(buf, "%s has become an avatar!",
ch->pcdata->switchname);
avatar_info(buf);
}
if (!IS_NPC(ch) && IS_VAMPAFF(ch, VAM_MORTAL))
do_mortalvamp(ch, "");
return;
}
else if (!str_cmp(arg1, "magic") && IS_CLASS(ch, CLASS_DROW))
{
sh_int quiet_pointer = ch->pcdata->stats[DROW_MAGIC];
cost = magic;
pAbility = &quiet_pointer;
pOutput = "drow magic resistance";
}
else if (!str_cmp(arg1, "silver") && IS_CLASS(ch, CLASS_WEREWOLF))
{
sh_int quiet_pointer = ch->siltol; /* dirrent type of int */
cost = silver;
pAbility = &quiet_pointer;
pOutput = "tolerance to silver";
}
else if (!str_cmp(arg1, "gnosis") && IS_CLASS(ch, CLASS_WEREWOLF))
{
sh_int quiet_pointer = ch->gnosis[GMAXIMUM];
cost = gnosis;
pAbility = &quiet_pointer;
pOutput = "gnosis points";
}
else if (!str_cmp(arg1, "control") && IS_CLASS(ch, CLASS_VAMPIRE))
{
sh_int quiet_pointer = ch->beast;
cost = beast;
pAbility = &quiet_pointer;
pOutput = "control over your beast";
}
else if (!str_cmp(arg1, "ancilla") && IS_CLASS(ch, CLASS_VAMPIRE) &&
((ch->pcdata->rank == AGE_NEONATE)
|| (ch->pcdata->rank == AGE_CHILDE)))
{
if (ch->exp < ancilla)
{
send_to_char
("You need 1500000 exp to become ancilla!\n\r",
ch);
return;
}
ch->exp -= 1500000;
ch->pcdata->rank = AGE_ANCILLA;
xprintf(buf, "%s is now an Ancilla!", ch->name);
do_info(ch, buf);
send_to_char("You are now an Ancilla.\n\r", ch);
return;
}
else if (!str_cmp(arg1, "elder") && IS_CLASS(ch, CLASS_VAMPIRE) &&
(ch->pcdata->rank == AGE_ANCILLA))
{
if (ch->exp < elder)
{
send_to_char
("You need 7500000 exp to become an elder.\n\r",
ch);
return;
}
ch->exp -= 7500000;
ch->pcdata->rank = AGE_ELDER;
xprintf(buf, "%s is now an Elder!", ch->name);
do_info(ch, buf);
send_to_char("You are now an Elder!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "methuselah") && IS_CLASS(ch, CLASS_VAMPIRE)
&& (ch->pcdata->rank == AGE_ELDER))
{
if (ch->exp < methuselah)
{
send_to_char
("You need 15000000 exp to become Methuselah!\n\r",
ch);
return;
}
ch->exp -= 15000000;
ch->pcdata->rank = AGE_METHUSELAH;
xprintf(buf, "%s is now a Methuselah!", ch->name);
do_info(ch, buf);
send_to_char("You are now Methuselah!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "lamagra") && IS_CLASS(ch, CLASS_VAMPIRE)
&& (ch->pcdata->rank == AGE_METHUSELAH))
{
if (ch->exp < lamagra)
{
send_to_char
("You need 30000000 exp to become La Magra!\n\r",
ch);
return;
}
ch->exp -= 30000000;
ch->pcdata->rank = AGE_LA_MAGRA;
xprintf(buf, "%s is now a La Magra!", ch->name);
do_info(ch, buf);
send_to_char("You are now La Magra!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "trueblood") && IS_CLASS(ch, CLASS_VAMPIRE)
&& (ch->pcdata->rank == AGE_LA_MAGRA))
{
if (ch->exp < trueblood)
{
send_to_char
("You need 60000000 exp to become TrueBlood!\n\r",
ch);
return;
}
ch->exp -= 60000000;
ch->pcdata->rank = AGE_TRUEBLOOD;
xprintf(buf, "%s is now a TrueBlood!", ch->name);
do_info(ch, buf);
send_to_char("You are now TrueBlood!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "sunlight") && !IS_IMMUNE(ch, IMM_SUNLIGHT)
&& IS_CLASS(ch, CLASS_VAMPIRE))
{
if (ch->exp < 10000000)
{
send_to_char("You dont have enough experience.\n\r",
ch);
return;
}
ch->exp = ch->exp - 10000000;
SET_BIT(ch->immune, IMM_SUNLIGHT);
send_to_char("You are now immune to sunlight.\n\r", ch);
return;
}
//Training Forging
else if (!str_cmp(arg1, "forge")
&& !IS_SET(ch->pcdata->jflags, JFLAG_KNOWS_FORGING))
{
if (ch->exp < 10000000)
{
send_to_char("You dont have enough experience.\n\r",
ch);
return;
}
ch->exp = ch->exp - 10000000;
SET_BIT(ch->pcdata->jflags, JFLAG_KNOWS_FORGING);
send_to_char("You can now forge gems and hilts on items.\n\r",
ch);
return;
}
else if (!str_cmp(arg1, "belt1") && IS_CLASS(ch, CLASS_NINJA)
&& (ch->pcdata->rank < BELT_ONE))
{
if (ch->exp < belt1)
{
send_to_char
("You need 5000000 exp to start your traning!\n\r",
ch);
return;
}
ch->exp -= 5000000;
ch->pcdata->rank = BELT_ONE;
xprintf(buf, "%s has started martial arts studies!",
ch->name);
do_info(ch, buf);
send_to_char("You are now a first dan!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "belt2") && IS_CLASS(ch, CLASS_NINJA)
&& (ch->pcdata->rank == BELT_ONE))
{
if (ch->exp < belt2)
{
send_to_char
("You need 10000000 exp to advance your traning!\n\r",
ch);
return;
}
ch->exp -= 10000000;
ch->pcdata->rank = BELT_TWO;
xprintf(buf, "%s advances in their martial arts studies!",
ch->name);
do_info(ch, buf);
send_to_char("You are now a second dan!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "belt3") && IS_CLASS(ch, CLASS_NINJA)
&& (ch->pcdata->rank == BELT_TWO))
{
if (ch->exp < belt3)
{
send_to_char
("You need 15000000 exp to advance your traning!\n\r",
ch);
return;
}
ch->exp -= 15000000;
ch->pcdata->rank = BELT_THREE;
xprintf(buf, "%s advances in their martial arts studies!",
ch->name);
do_info(ch, buf);
send_to_char("You are now a third dan!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "belt4") && IS_CLASS(ch, CLASS_NINJA)
&& (ch->pcdata->rank == BELT_THREE))
{
if (ch->exp < belt4)
{
send_to_char
("You need 20000000 exp to advance your traning!\n\r",
ch);
return;
}
ch->exp -= 20000000;
ch->pcdata->rank = BELT_FOUR;
xprintf(buf, "%s advances in their martial arts studies!",
ch->name);
do_info(ch, buf);
send_to_char("You are now a fourth dan!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "belt5") && IS_CLASS(ch, CLASS_NINJA)
&& (ch->pcdata->rank == BELT_FOUR))
{
if (ch->exp < belt5)
{
send_to_char
("You need 25000000 exp to advance your traning!\n\r",
ch);
return;
}
ch->exp -= 25000000;
ch->pcdata->rank = BELT_FIVE;
xprintf(buf, "%s advances in their martial arts studies!",
ch->name);
do_info(ch, buf);
send_to_char("You are now a fifth dan!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "belt6") && IS_CLASS(ch, CLASS_NINJA)
&& (ch->pcdata->rank == BELT_FIVE))
{
if (ch->exp < belt6)
{
send_to_char
("You need 30000000 exp to advance your traning!\n\r",
ch);
return;
}
ch->exp -= 30000000;
ch->pcdata->rank = BELT_SIX;
xprintf(buf, "%s advances in their martial arts studies!",
ch->name);
do_info(ch, buf);
send_to_char("You are now a sixth dan!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "belt7") && IS_CLASS(ch, CLASS_NINJA)
&& (ch->pcdata->rank == BELT_SIX))
{
if (ch->exp < belt7)
{
send_to_char
("You need 35000000 exp to advance your traning!\n\r",
ch);
return;
}
ch->exp -= 35000000;
ch->pcdata->rank = BELT_SEVEN;
xprintf(buf, "%s advances in their martial arts studies!",
ch->name);
do_info(ch, buf);
send_to_char("You are now a seventh dan!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "belt8") && IS_CLASS(ch, CLASS_NINJA)
&& (ch->pcdata->rank == BELT_SEVEN))
{
if (ch->exp < belt8)
{
send_to_char
("You need 40000000 exp to advance your traning!\n\r",
ch);
return;
}
ch->exp -= 40000000;
ch->pcdata->rank = BELT_EIGHT;
xprintf(buf, "%s advances in their martial arts studies!",
ch->name);
do_info(ch, buf);
send_to_char("You are now an eigth dan!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "belt9") && IS_CLASS(ch, CLASS_NINJA)
&& (ch->pcdata->rank == BELT_EIGHT))
{
if (ch->exp < belt9)
{
send_to_char
("You need 45000000 exp to advance your traning!\n\r",
ch);
return;
}
ch->exp -= 45000000;
ch->pcdata->rank = BELT_NINE;
xprintf(buf, "%s advances in their martial arts studies!",
ch->name);
do_info(ch, buf);
send_to_char("You are now a ninth dan!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "belt10") && IS_CLASS(ch, CLASS_NINJA)
&& (ch->pcdata->rank == BELT_NINE))
{
if (ch->exp < belt10)
{
send_to_char
("You need 50000000 exp to complete your traning!\n\r",
ch);
return;
}
ch->exp -= 50000000;
ch->pcdata->rank = BELT_TEN;
xprintf(buf, "%s has completed their martial arts studies!",
ch->name);
do_info(ch, buf);
send_to_char("You are now a tenth dan!\n\r", ch);
return;
}
else if (!str_cmp(arg1, "slash") && !IS_IMMUNE(ch, IMM_SLASH))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_SLASH);
send_to_char
("You are now more resistant to slashing and slicing weapons.\n\r",
ch);
return;
}
else if (!str_cmp(arg1, "stab") && !IS_IMMUNE(ch, IMM_STAB))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_STAB);
send_to_char
("You are now more resistant to stabbing and piercing weapons.\n\r",
ch);
return;
}
else if (!str_cmp(arg1, "smash") && !IS_IMMUNE(ch, IMM_SMASH))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_SMASH);
send_to_char
("You are now more resistant to blasting, pounding and crushing weapons.\n\r",
ch);
return;
}
else if (!str_cmp(arg1, "beast") && !IS_IMMUNE(ch, IMM_ANIMAL))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_ANIMAL);
send_to_char
("You are now more resistant to claw and bite attacks.\n\r",
ch);
return;
}
else if (!str_cmp(arg1, "grab") && !IS_IMMUNE(ch, IMM_MISC))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_MISC);
send_to_char
("You are now more resistant to grepping, sucking and whipping weapons.\n\r",
ch);
return;
}
else if (!str_cmp(arg1, "charm") && !IS_IMMUNE(ch, IMM_CHARM))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_CHARM);
send_to_char("You are now immune to charm spells.\n\r", ch);
return;
}
else if (!str_cmp(arg1, "heat") && !IS_IMMUNE(ch, IMM_HEAT))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_HEAT);
send_to_char
("You are now immune to heat and fire spells.\n\r",
ch);
return;
}
else if (!str_cmp(arg1, "cold") && !IS_IMMUNE(ch, IMM_COLD))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_COLD);
send_to_char("You are now immune to cold spells.\n\r", ch);
return;
}
else if (!str_cmp(arg1, "lightning") && !IS_IMMUNE(ch, IMM_LIGHTNING))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_LIGHTNING);
send_to_char
("You are now immune to lightning and electrical spells.\n\r",
ch);
return;
}
else if (!str_cmp(arg1, "acid") && !IS_IMMUNE(ch, IMM_ACID))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_ACID);
send_to_char("You are now immune to acid spells.\n\r", ch);
return;
}
else if (!str_cmp(arg1, "drain") && !IS_IMMUNE(ch, IMM_DRAIN))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_DRAIN);
send_to_char
("You are now immune to the energy drain spell.\n\r",
ch);
return;
}
else if (!str_cmp(arg1, "voodoo") && !IS_IMMUNE(ch, IMM_VOODOO))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_VOODOO);
send_to_char("You are now immune to voodoo magic.\n\r", ch);
return;
}
else if (!str_cmp(arg1, "hurl") && !IS_IMMUNE(ch, IMM_HURL))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_HURL);
send_to_char("You are now immune to being hurled.\n\r", ch);
return;
}
else if (!str_cmp(arg1, "backstab") && !IS_IMMUNE(ch, IMM_BACKSTAB))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_BACKSTAB);
send_to_char("You are now immune to being backstabbed.\n\r",
ch);
return;
}
else if (!str_cmp(arg1, "kick") && !IS_IMMUNE(ch, IMM_KICK))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_KICK);
send_to_char("You are now immune to being kicked.\n\r", ch);
return;
}
else if (!str_cmp(arg1, "disarm") && !IS_IMMUNE(ch, IMM_DISARM))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_DISARM);
send_to_char("You are now immune to being disarmed.\n\r", ch);
return;
}
else if (!str_cmp(arg1, "steal") && !IS_IMMUNE(ch, IMM_STEAL))
{
if (ch->exp < immcost)
{
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
ch->exp = ch->exp - immcost;
SET_BIT(ch->immune, IMM_STEAL);
send_to_char("You are now immune to being stolen from.\n\r",
ch);
return;
}
else if (!str_cmp(arg1, "tier"))
{ //<--Top Bracket
if (ch->tier >= 10)
{
send_to_char("You are on the highest tier.\n\r", ch);
return;
}
if (ch->tier == 0)
{
int TKsNeeded = 10 - (ch->tks);
int StatusNeeded = 5 - (ch->race);
int HitNeeded = 25000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
if (TKsNeeded > 0 || StatusNeeded > 0
|| HitNeeded > 0)
{
stc("#ROne or more of your tiering requirement have not been met#n\n\r", ch);
return;
}
else
{
ch->tier += 1;
ch->tks = 0;
stc("#CCongratulations #Yon gaining a new tier!#n\n\r", ch);
xprintf(buf,
"#R%s #Chas just become a more #r-#R=P#YOW#7ER#YFU#RL=#r- #cG#Cod!!#n\n\r",
ch->name);
do_info(ch, buf);
return;
}
}
//Next One below
if (ch->tier == 1)
{
int TKsNeeded = 20 - (ch->tks);
int StatusNeeded = 10 - (ch->race);
int HitNeeded = 50000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
if (TKsNeeded > 0 || StatusNeeded > 0
|| HitNeeded > 0)
{
stc("#ROne or more of your tiering requirement have not been met#n\n\r", ch);
return;
}
else
{
ch->tier += 1;
ch->tks = 0;
stc("#CCongratulations #yon gaining a new tier!#n\n\r", ch);
xprintf(buf,
"#R%s #Chas just become a more #r-#R=P#yOW#7ER#yFU#RL=#r- #cG#Cod!!#n\n\r",
ch->name);
do_info(ch, buf);
return;
}
}
if (ch->tier == 2)
{
int TKsNeeded = 30 - (ch->tks);
int StatusNeeded = 15 - (ch->race);
int HitNeeded = 75000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
if (TKsNeeded > 0 || StatusNeeded > 0
|| HitNeeded > 0)
{
stc("#ROne or more of your tiering requirement have not been met#n\n\r", ch);
return;
}
else
{
ch->tier += 1;
ch->tks = 0;
stc("#CCongratulations #yon gaining a new tier!#n\n\r", ch);
xprintf(buf,
"#R%s #Chas just become a more #r-#R=P#yOW#7ER#yFU#RL=#r- #cG#Cod!!#n\n\r",
ch->name);
do_info(ch, buf);
return;
}
}
if (ch->tier == 3)
{
int TKsNeeded = 40 - (ch->tks);
int StatusNeeded = 20 - (ch->race);
int HitNeeded = 100000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
if (TKsNeeded > 0 || StatusNeeded > 0
|| HitNeeded > 0)
{
stc("#ROne or more of your tiering requirement have not been met#n\n\r", ch);
return;
}
else
{
ch->tier += 1;
ch->tks = 0;
stc("#CCongratulations #yon gaining a new tier!#n\n\r", ch);
xprintf(buf,
"#R%s #Chas just become a more #r-#R=P#yOW#7ER#yFU#RL=#r- #cG#Cod!!#n\n\r",
ch->name);
do_info(ch, buf);
return;
}
}
if (ch->tier == 4)
{
int TKsNeeded = 50 - (ch->tks);
int StatusNeeded = 25 - (ch->race);
int HitNeeded = 125000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
if (TKsNeeded > 0 || StatusNeeded > 0
|| HitNeeded > 0)
{
stc("#ROne or more of your tiering requirement have not been met#n\n\r", ch);
return;
}
else
{
ch->tier += 1;
ch->tks = 0;
stc("#CCongratulations #yon gaining a new tier!#n\n\r", ch);
xprintf(buf,
"#R%s #Chas just become a more #r-#R=P#yOW#7ER#yFU#RL=#r- #cG#Cod!!#n\n\r",
ch->name);
do_info(ch, buf);
return;
}
}
if (ch->tier == 5)
{
int TKsNeeded = 60 - (ch->tks);
int StatusNeeded = 30 - (ch->race);
int HitNeeded = 150000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
if (TKsNeeded > 0 || StatusNeeded > 0
|| HitNeeded > 0)
{
stc("#ROne or more of your tiering requirement have not been met#n\n\r", ch);
return;
}
else
{
ch->tier += 1;
ch->tks = 0;
stc("#CCongratulations #yon gaining a new tier!#n\n\r", ch);
xprintf(buf,
"#R%s #Chas just become a more #r-#R=P#yOW#7ER#yFU#RL=#r- #cG#Cod!!#n\n\r",
ch->name);
do_info(ch, buf);
return;
}
}
if (ch->tier == 6)
{
int TKsNeeded = 70 - (ch->tks);
int StatusNeeded = 35 - (ch->race);
int HitNeeded = 200000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
if (TKsNeeded > 0 || StatusNeeded > 0
|| HitNeeded > 0)
{
stc("#ROne or more of your tiering requirement have not been met#n\n\r", ch);
return;
}
else
{
ch->tier += 1;
ch->tks = 0;
stc("#CCongratulations #yon gaining a new tier!#n\n\r", ch);
xprintf(buf,
"#R%s #Chas just become a more #r-#R=P#yOW#7ER#yFU#RL=#r- #cG#Cod!!#n\n\r",
ch->name);
do_info(ch, buf);
return;
}
}
if (ch->tier == 7)
{
int TKsNeeded = 80 - (ch->tks);
int StatusNeeded = 40 - (ch->race);
int HitNeeded = 225000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
if (TKsNeeded > 0 || StatusNeeded > 0
|| HitNeeded > 0)
{
stc("#ROne or more of your tiering requirement have not been met#n\n\r", ch);
return;
}
else
{
ch->tier += 1;
ch->tks = 0;
stc("#CCongratulations #yon gaining a new tier!#n\n\r", ch);
xprintf(buf,
"#R%s #Chas just become a more #r-#R=P#yOW#7ER#yFU#RL=#r- #cG#Cod!!#n\n\r",
ch->name);
do_info(ch, buf);
return;
}
}
if (ch->tier == 8)
{
int TKsNeeded = 90 - (ch->tks);
int StatusNeeded = 45 - (ch->race);
int HitNeeded = 275000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
if (TKsNeeded > 0 || StatusNeeded > 0
|| HitNeeded > 0)
{
stc("#ROne or more of your tiering requirement have not been met#n\n\r", ch);
return;
}
else
{
ch->tier += 1;
ch->tks = 0;
stc("#CCongratulations #yon gaining a new tier!#n\n\r", ch);
xprintf(buf,
"#R%s #Chas just become a more #r-#R=P#yOW#7ER#yFU#RL=#r- #cG#Cod!!#n\n\r",
ch->name);
do_info(ch, buf);
return;
}
}
if (ch->tier == 9)
{
int TKsNeeded = 100 - (ch->tks);
int StatusNeeded = 50 - (ch->race);
int HitNeeded = 300000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
if (TKsNeeded > 0 || StatusNeeded > 0
|| HitNeeded > 0)
{
stc("#ROne or more of your tiering requirement have not been met#n\n\r", ch);
return;
}
else
{
ch->tier += 1;
ch->tks = 0;
stc("#CCongratulations #yon gaining a new tier!#n\n\r", ch);
xprintf(buf,
"#R%s #Chas just become a more #r-#R=P#yOW#7ER#yFU#RL=#r- #cG#Cod!!#n\n\r",
ch->name);
do_info(ch, buf);
return;
}
}
} //<
else
{
xprintf(buf, "#0You can train the following#w:#n\n\r");
send_to_char(buf, ch);
send_to_char("#0Stats#w:#W", ch);
if (ch->pcdata->perm_str < max_stat)
{
xprintf(buf, " #WStr#B(#C%dp#B)",
figure_stat_cost(ch->pcdata->perm_str));
stc(buf, ch);
}
if (ch->pcdata->perm_int < max_stat)
{
xprintf(buf, " #WInt#B(#C%dp#B)",
figure_stat_cost(ch->pcdata->perm_int));
stc(buf, ch);
}
if (ch->pcdata->perm_wis < max_stat)
{
xprintf(buf, " #WWis#B(#C%dp#B)",
figure_stat_cost(ch->pcdata->perm_wis));
stc(buf, ch);
}
if (ch->pcdata->perm_dex < max_stat)
{
xprintf(buf, " #WDex#B(#C%dp#B)",
figure_stat_cost(ch->pcdata->perm_dex));
stc(buf, ch);
}
if (ch->pcdata->perm_con < max_stat)
{
xprintf(buf, " #WCon#B(#C%dp#B)",
figure_stat_cost(ch->pcdata->perm_con));
stc(buf, ch);
}
if ((ch->pcdata->perm_str >= max_stat)
&& (ch->pcdata->perm_wis >= max_stat)
&& (ch->pcdata->perm_int >= max_stat)
&& (ch->pcdata->perm_dex >= max_stat)
&& (ch->pcdata->perm_con >= max_stat))
send_to_char(" #cNone left to train.#n\n\r", ch);
else
send_to_char("#n.\n\r", ch);
send_to_char("#0Spells#w:#W", ch);
if (ch->spl[0] < cmax)
{
stc(" #PPurple", ch);
}
if (ch->spl[2] < cmax)
{
stc(" #BBlue", ch);
}
if (ch->spl[1] < cmax)
{
stc(" #RRed", ch);
}
if (ch->spl[3] < cmax)
{
stc(" #GGreen", ch);
}
if (ch->spl[4] < cmax)
{
stc(" #YYellow", ch);
}
if ((ch->spl[0] >= cmax)
&& (ch->spl[1] >= cmax)
&& (ch->spl[2] >= cmax)
&& (ch->spl[3] >= cmax) && (ch->spl[4] >= cmax))
send_to_char(" #wNone left to train.#n\n\r", ch);
else
send_to_char("#n.\n\r", ch);
if (ch->tier == 0)
{
int TKsNeeded = 10 - (ch->tks);
int StatusNeeded = 5 - (ch->race);
int HitNeeded = 25000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
xprintf(buf,
"#RTier I: #DYou need #Y%d #Dmore Tier Kills, #Y%d #Dmore Status, and #Y%d #Dmore HP.#n\n\r",
TKsNeeded, StatusNeeded, HitNeeded);
stc(buf, ch);
}
if (ch->tier == 1)
{
int TKsNeeded = 20 - (ch->tks);
int StatusNeeded = 10 - (ch->race);
int HitNeeded = 50000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
xprintf(buf,
"#RTier II: #DYou need #Y%d #Dmore Tier Kills, #Y%d #Dmore Status, and #Y%d #Dmore HP.#n\n\r",
TKsNeeded, StatusNeeded, HitNeeded);
stc(buf, ch);
}
if (ch->tier == 2)
{
int TKsNeeded = 30 - (ch->tks);
int StatusNeeded = 15 - (ch->race);
int HitNeeded = 75000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
xprintf(buf,
"#RTier III: #DYou need #Y%d #Dmore Tier Kills, #Y%d #Dmore Status, and #Y%d #Dmore HP.#n\n\r",
TKsNeeded, StatusNeeded, HitNeeded);
stc(buf, ch);
}
if (ch->tier == 3)
{
int TKsNeeded = 40 - (ch->tks);
int StatusNeeded = 20 - (ch->race);
int HitNeeded = 100000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
xprintf(buf,
"#RTier IV: #DYou need #Y%d #Dmore Tier Kills, #Y%d #Dmore Status, and #Y%d #Dmore HP.#n\n\r",
TKsNeeded, StatusNeeded, HitNeeded);
stc(buf, ch);
}
if (ch->tier == 4)
{
int TKsNeeded = 50 - (ch->tks);
int StatusNeeded = 25 - (ch->race);
int HitNeeded = 125000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
xprintf(buf,
"#RTier V: #DYou need #Y%d #Dmore Tier Kills, #Y%d #Dmore Status, and #Y%d #Dmore HP.#n\n\r",
TKsNeeded, StatusNeeded, HitNeeded);
stc(buf, ch);
}
if (ch->tier == 5)
{
int TKsNeeded = 60 - (ch->tks);
int StatusNeeded = 30 - (ch->race);
int HitNeeded = 150000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
xprintf(buf,
"#RTier VI: #DYou need #Y%d #Dmore Tier Kills, #Y%d #Dmore Status, and #Y%d #Dmore HP.#n\n\r",
TKsNeeded, StatusNeeded, HitNeeded);
stc(buf, ch);
}
if (ch->tier == 6)
{
int TKsNeeded = 70 - (ch->tks);
int StatusNeeded = 35 - (ch->race);
int HitNeeded = 200000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
xprintf(buf,
"#RTier VII: #DYou need #Y%d #Dmore Tier Kills, #Y%d #Dmore Status, and #Y%d #Dmore HP.#n\n\r",
TKsNeeded, StatusNeeded, HitNeeded);
stc(buf, ch);
}
if (ch->tier == 7)
{
int TKsNeeded = 80 - (ch->tks);
int StatusNeeded = 40 - (ch->race);
int HitNeeded = 225000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
xprintf(buf,
"#RTier VIII: #DYou need #Y%d #Dmore Tier Kills, #Y%d #Dmore Status, and #Y%d #Dmore HP.#n\n\r",
TKsNeeded, StatusNeeded, HitNeeded);
stc(buf, ch);
}
if (ch->tier == 8)
{
int TKsNeeded = 90 - (ch->tks);
int StatusNeeded = 45 - (ch->race);
int HitNeeded = 275000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
xprintf(buf,
"#RTier IX: #DYou need #Y%d #Dmore Tier Kills, #Y%d #Dmore Status, and #Y%d #Dmore HP.#n\n\r",
TKsNeeded, StatusNeeded, HitNeeded);
stc(buf, ch);
}
if (ch->tier == 9)
{
int TKsNeeded = 100 - (ch->tks);
int StatusNeeded = 50 - (ch->race);
int HitNeeded = 300000 - (ch->max_hit);
if (TKsNeeded < 0)
TKsNeeded = 0;
if (StatusNeeded < 0)
StatusNeeded = 0;
if (HitNeeded < 0)
HitNeeded = 0;
xprintf(buf,
"#RTier X: #DYou need #Y%d #Dmore Tier Kills, #Y%d #Dmore Status, and #Y%d #Dmore HP.#n\n\r",
TKsNeeded, StatusNeeded, HitNeeded);
stc(buf, ch);
}
if (ch->level == 2 && ch->max_hit > 1999)
{
xprintf(buf, "#GBecome an avatar - free.#n\n\r");
send_to_char(buf, ch);
}
if (ch->max_hit < (300000))
{
xprintf(buf,
"#WHp #R- #Y%d #0exp per point.#n\n\r",
(ch->max_hit + 1));
send_to_char(buf, ch);
}
if (ch->max_mana < (300000))
{
xprintf(buf,
"#WMana #R- #Y%d #0exp per point.#n\n\r",
(ch->max_mana + 1));
send_to_char(buf, ch);
}
if (ch->max_move < (300000))
{
xprintf(buf,
"#WMove #R- #Y%d #0exp per point.#n\n\r",
(ch->max_move + 1));
send_to_char(buf, ch);
}
if (ch->practice < 4000)
{
xprintf(buf,
"#WPrimal #R- #Y%d #0exp per point of primal energy.#n\n\r",
(1 + ch->practice) * 500);
send_to_char(buf, ch);
}
/*Player Rank code*/
if( ch->pRank < MAX_RANKING )
{
sprintf( buf, "#7R#0ank#n - %d exp and %d bones.\n\r", rank_xp, rank_bones );
send_to_char( buf, ch );
}
if (!IS_SET(ch->pcdata->jflags, JFLAG_KNOWS_FORGING))
{
stc("#gForge Skill #R- #Y10,000,000 #gexperience.#n\n\r", ch);
}
if (IS_CLASS(ch, CLASS_ANGEL))
{
if (ch->pcdata->powers[ANGEL_JUSTICE] < 5)
{
xprintf(buf,
"Angel Justice : %d mill exp\n\r",
(ch->pcdata->powers[ANGEL_JUSTICE] +
1) * 10);
send_to_char(buf, ch);
}
if (ch->pcdata->powers[ANGEL_HARMONY] < 5)
{
xprintf(buf,
"Angel Harmony : %d mill exp\n\r",
(ch->pcdata->powers[ANGEL_HARMONY] +
1) * 10);
send_to_char(buf, ch);
}
if (ch->pcdata->powers[ANGEL_PEACE] < 5)
{
xprintf(buf,
"Angel Peace : %d mill exp\n\r",
(ch->pcdata->powers[ANGEL_PEACE] +
1) * 10);
send_to_char(buf, ch);
}
if (ch->pcdata->powers[ANGEL_LOVE] < 5)
{
xprintf(buf,
"Angel Love : %d mill exp\n\r",
(ch->pcdata->powers[ANGEL_LOVE] +
1) * 10);
send_to_char(buf, ch);
}
}
if (IS_CLASS(ch, CLASS_ELEMENTAL))
{
if (ch->pcdata->powers[ELEMENTAL_FIRE] < 5)
{
sprintf(buf,"Elemental Fire : %d mill exp\n\r", (ch->pcdata->powers[ELEMENTAL_FIRE]+1)*10);
send_to_char(buf,ch);
}
if (ch->pcdata->powers[ELEMENTAL_EARTH] < 5)
{
sprintf(buf,"Elemental Earth : %d mill exp\n\r", (ch->pcdata->powers[ELEMENTAL_EARTH]+1)*10);
send_to_char(buf,ch);
}
if (ch->pcdata->powers[ELEMENTAL_AIR] < 5)
{
sprintf(buf,"Elemental Air : %d mill exp\n\r", (ch->pcdata->powers[ELEMENTAL_AIR]+1)*10);
send_to_char(buf,ch);
}
if (ch->pcdata->powers[ELEMENTAL_WATER] < 5)
{
sprintf(buf,"Elemental Water : %d mill exp\n\r", (ch->pcdata->powers[ELEMENTAL_WATER]+1)*10);
send_to_char(buf,ch);
}
}
//if (ch->generation == 3) send_to_char ("#WGeneration #R: #w400 mill exp\n\r#n",ch);
//else if (ch->generation == 4) send_to_char ("#WGeneration #R: #w200 mill exp\n\r#n",ch);
//else if (ch->generation == 5) send_to_char ("#WGeneration #R: #w50 mill exp\n\r#n",ch);
//else if (ch->generation > 5) send_to_char ("#WGeneration #R: #w10 mill exp\n\r#n",ch);
if (IS_CLASS(ch, CLASS_TANARRI))
{
if (ch->pcdata->rank < TANARRI_FODDER)
send_to_char
("#RStatus#W-> #wFodder #R: #w10 mill exp#n\n\r",
ch);
else if (ch->pcdata->rank == TANARRI_FODDER)
send_to_char
("#RStatus#W-> #w Fighter #R: #w20 mill exp#n\n\r",
ch);
else if (ch->pcdata->rank == TANARRI_FIGHTER)
send_to_char
("#RStatus#W-> #w Elite #R: #w40 mill exp#n\n\r",
ch);
else if (ch->pcdata->rank == TANARRI_ELITE)
send_to_char
("#RStatus#W-> #w Captain #R: #w80 mill exp#n\n\r",
ch);
else if (ch->pcdata->rank == TANARRI_CAPTAIN)
send_to_char
("#RStatus#W-> #w Warlord #R: #w160 mill exp#n\n\r",
ch);
else if (ch->pcdata->rank == TANARRI_WARLORD)
send_to_char
("#RStatus#W-> #w Balor #R: #w320 mill exp#n\n\r",
ch);
}
if (IS_CLASS(ch, CLASS_VAMPIRE))
{
if (ch->pcdata->rank == AGE_CHILDE)
send_to_char("#0Age#R: Ancilla#n\n\r", ch);
else if (ch->pcdata->rank == AGE_NEONATE)
send_to_char("#0Age#R: Ancilla#n\n\r", ch);
else if (ch->pcdata->rank == AGE_ANCILLA)
send_to_char("#0Age#R: Elder#n\n\r", ch);
else if (ch->pcdata->rank == AGE_ELDER)
send_to_char("#0Age#R: Methuselah#n\n\r", ch);
else if (ch->pcdata->rank == AGE_METHUSELAH)
send_to_char("#0Age#R: LaMagra#n\n\r", ch);
else if (ch->pcdata->rank == AGE_LA_MAGRA)
send_to_char("#0Age#R: Trueblood#n\n\r", ch);
}
if (IS_CLASS(ch, CLASS_NINJA))
{
if (ch->pcdata->rank < BELT_ONE)
send_to_char("#0Studies#R: #wbelt1#n\n\r",
ch);
else if (ch->pcdata->rank == BELT_ONE)
send_to_char("#0Studies#R: #wbelt2#n\n\r",
ch);
else if (ch->pcdata->rank == BELT_TWO)
send_to_char("#0Studies#R: #wbelt3#n\n\r",
ch);
else if (ch->pcdata->rank == BELT_THREE)
send_to_char("#0Studies#R: #wbelt4#n\n\r",
ch);
else if (ch->pcdata->rank == BELT_FOUR)
send_to_char("#0Studies#R: #wbelt5#n\n\r",
ch);
else if (ch->pcdata->rank == BELT_FIVE)
send_to_char("#0Studies#R: #wbelt6#n\n\r",
ch);
else if (ch->pcdata->rank == BELT_SIX)
send_to_char("#0Studies#R: #wbelt7#n\n\r",
ch);
else if (ch->pcdata->rank == BELT_SEVEN)
send_to_char("#0Studies#R: #wbelt8#n\n\r",
ch);
else if (ch->pcdata->rank == BELT_EIGHT)
send_to_char("#0Studies#R: #wbelt9#n\n\r",
ch);
else if (ch->pcdata->rank == BELT_NINE)
send_to_char("#0Studies#R: #wbelt10#n\n\r",
ch);
}
if (IS_CLASS(ch, CLASS_VAMPIRE)
&& !IS_IMMUNE(ch, IMM_SUNLIGHT))
{
stc("#YImmunity to Sunlight #R- #Y10,000,000 #0experience.#n\n\r", ch);
}
if (ch->siltol < 100 && IS_CLASS(ch, CLASS_WEREWOLF))
{
xprintf(buf,
"#WSilver tolerance #R- #Y%d #0exp per point of tolerance.#n\n\r",
silver);
send_to_char(buf, ch);
}
if (ch->gnosis[GMAXIMUM] < 20
&& (IS_CLASS(ch, CLASS_WEREWOLF)))
{
xprintf(buf,
"#WGnosis Points #R- #Y%d #0exp per point of Gnosis.#n\n\r",
gnosis);
stc(buf, ch);
}
if (ch->beast > 0 && IS_CLASS(ch, CLASS_VAMPIRE))
{
xprintf(buf,
"#WBeast Control #R- #Y%d #0primal per point of Beast.#n\n\r",
beast);
stc(buf, ch);
}
if (ch->pcdata->stats[DROW_MAGIC] < 100
&& IS_CLASS(ch, CLASS_DROW))
{
xprintf(buf,
"#PMagic resistance #R- #Y%d #pdrow points per point of magic.#n\n\r",
magic);
send_to_char(buf, ch);
}
xprintf(buf,
"#WNatural resistances and immunities #R- #Y%d #0exp each.#n\n\r",
immcost);
send_to_char(buf, ch);
/*
* Weapon resistance affects
*/
send_to_char("#WWeapon resistances#R:", ch);
if (!IS_IMMUNE(ch, IMM_SLASH))
send_to_char(" #wSlash", ch);
if (!IS_IMMUNE(ch, IMM_STAB))
send_to_char(" #wStab", ch);
if (!IS_IMMUNE(ch, IMM_SMASH))
send_to_char(" #wSmash", ch);
if (!IS_IMMUNE(ch, IMM_ANIMAL))
send_to_char(" #wBeast", ch);
if (!IS_IMMUNE(ch, IMM_MISC))
send_to_char(" #wGrab", ch);
if (IS_IMMUNE(ch, IMM_SLASH) && IS_IMMUNE(ch, IMM_STAB) &&
IS_IMMUNE(ch, IMM_SMASH) && IS_IMMUNE(ch, IMM_ANIMAL) &&
IS_IMMUNE(ch, IMM_MISC))
send_to_char(" #wNone left to learn.#n\n\r", ch);
else
send_to_char(".#n\n\r", ch);
/*
* Spell immunity affects
*/
send_to_char("#WMagical immunities#R:", ch);
if (!IS_IMMUNE(ch, IMM_CHARM))
send_to_char(" #wCharm", ch);
if (!IS_IMMUNE(ch, IMM_HEAT))
send_to_char(" #wHeat", ch);
if (!IS_IMMUNE(ch, IMM_COLD))
send_to_char(" #wCold", ch);
if (!IS_IMMUNE(ch, IMM_LIGHTNING))
send_to_char(" #wLightning", ch);
if (!IS_IMMUNE(ch, IMM_ACID))
send_to_char(" #wAcid", ch);
if (!IS_IMMUNE(ch, IMM_DRAIN))
send_to_char(" #wDrain", ch);
if (!IS_IMMUNE(ch, IMM_VOODOO))
send_to_char(" #wVoodoo", ch);
if (IS_IMMUNE(ch, IMM_HEAT) &&
IS_IMMUNE(ch, IMM_COLD) && IS_IMMUNE(ch, IMM_LIGHTNING) &&
IS_IMMUNE(ch, IMM_ACID) &&
IS_IMMUNE(ch, IMM_DRAIN) && IS_IMMUNE(ch, IMM_VOODOO))
send_to_char(" #wNone left to learn.#n\n\r", ch);
else
send_to_char("#w.#n\n\r", ch);
/*
* Skill immunity affects
*/
send_to_char("#WSkill immunities#R:", ch);
if (!IS_IMMUNE(ch, IMM_HURL))
send_to_char(" #wHurl", ch);
if (!IS_IMMUNE(ch, IMM_BACKSTAB))
send_to_char(" #wBackstab", ch);
if (!IS_IMMUNE(ch, IMM_KICK))
send_to_char(" #wKick", ch);
if (!IS_IMMUNE(ch, IMM_DISARM))
send_to_char(" #wDisarm", ch);
if (!IS_IMMUNE(ch, IMM_STEAL))
send_to_char(" #wSteal", ch);
if (IS_IMMUNE(ch, IMM_HURL) && IS_IMMUNE(ch, IMM_BACKSTAB) &&
IS_IMMUNE(ch, IMM_KICK) && IS_IMMUNE(ch, IMM_DISARM) &&
IS_IMMUNE(ch, IMM_STEAL))
send_to_char(" #wNone left to learn.#n\n\r", ch);
else
send_to_char(".#n\n\r", ch);
return;
}
if ((*pAbility >= max_stat) && (!str_cmp(arg1, "str")))
{
if (last)
act("Your $T is already at maximum.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if ((*pAbility >= max_stat) && (!str_cmp(arg1, "int")))
{
if (last)
act("Your $T is already at maximum.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if ((*pAbility >= max_stat) && (!str_cmp(arg1, "wis")))
{
if (last)
act("Your $T is already at maximum.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if ((*pAbility >= max_stat) && (!str_cmp(arg1, "dex")))
{
if (last)
act("Your $T is already at maximum.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if ((*pAbility >= max_stat) && (!str_cmp(arg1, "con")))
{
if (last)
act("Your $T is already at maximum.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if ((*pAbility >= 15000) && (!str_cmp(arg1, "hp")))
{
if (last)
act("Your $T is already at maximum.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if ((*pAbility >= 15000) && (!str_cmp(arg1, "mana")))
{
if (last)
act("Your $T is already at maximum.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if ((*pAbility >= 15000) && (!str_cmp(arg1, "move")))
{
if (last)
act("Your $T is already at maximum.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if ((*pAbility >= 999) && (!str_cmp(arg1, "primal")))
{
if (last)
act("Your $T is already at maximum.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if ((*pAbility >= 100) && (!str_cmp(arg1, "magic")))
{
if (last)
act("Your $T is already at a maximum.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if ((*pAbility >= 20) && (!str_cmp(arg1, "gnosis")))
{
if (last)
act("Your $T is already at maximum.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if ((*pAbility <= 0) && (!str_cmp(arg1, "control")))
{
if (last)
act("You have already mastered your beast.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if ((*pAbility >= 100) && (!str_cmp(arg1, "silver")))
{
if (last)
act("Your $T is already at maximum.", ch, NULL,
pOutput, TO_CHAR);
return;
}
if (!strcmp(arg1, "control"))
{
if (cost > ch->practice)
{
send_to_char("You don't have enough primal.\n\r", ch);
return;
}
else
{
ch->practice -= cost;
ch->exp += cost;
}
}
if (cost < 1)
cost = 1;
if (cost > ch->pcdata->stats[DROW_POWER] && !str_cmp(arg1, "magic"))
{
if (last)
send_to_char
("You don't have enough drow power points.\n\r",
ch);
return;
}
else if (cost > ch->exp)
{
if (last)
send_to_char("You don't have enough exp.\n\r", ch);
return;
}
if (!str_cmp(arg1, "magic"))
ch->pcdata->stats[DROW_POWER] -= cost;
else
ch->exp -= cost;
if (!str_cmp(arg1, "silver"))
ch->siltol += 1;
else if (!str_cmp(arg1, "gnosis"))
{
ch->gnosis[GCURRENT]++;
ch->gnosis[GMAXIMUM]++;
}
else if (!str_cmp(arg1, "control"))
{
ch->beast--;
if (ch->beast < 0)
ch->beast = 0;
}
else if (!str_cmp(arg1, "magic"))
ch->pcdata->stats[DROW_MAGIC] += 1;
else if (str_cmp(arg1, "avatar"))
{
*pAbility += 1;
}
if (last)
act("Your $T increases!", ch, NULL, pOutput, TO_CHAR);
return;
}
void do_mount(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
argument = one_argument(argument, arg);
if (arg[0] == '\0')
{
send_to_char("Mount what?\n\r", ch);
return;
}
if (IS_AFFECTED(ch, AFF_POLYMORPH) && !IS_VAMPAFF(ch, VAM_DISGUISED))
{
send_to_char("You cannot ride in this form.\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("You cannot ride on your own back!\n\r", ch);
return;
}
if (ch->mounted > 0)
{
send_to_char("You are already riding.\n\r", ch);
return;
}
if (!IS_NPC(victim) && !IS_IMMORTAL(ch))
{
send_to_char("You cannot mount them.\n\r", ch);
return;
}
if (victim->mounted > 0)
{
send_to_char("You cannot mount them.\n\r", ch);
return;
}
if (IS_NPC(victim) && !IS_SET(victim->act, ACT_MOUNT)
&& !IS_IMMORTAL(ch))
{
send_to_char("You cannot mount them.\n\r", ch);
return;
}
if (victim->position < POS_STANDING)
{
if (victim->position < POS_SLEEPING)
act("$N is too badly hurt for that.", ch, NULL,
victim, TO_CHAR);
else if (victim->position == POS_SLEEPING)
act("First you better wake $m up.", ch, NULL, victim,
TO_CHAR);
else if (victim->position == POS_RESTING)
act("First $e better stand up.", ch, NULL, victim,
TO_CHAR);
else if (victim->position == POS_MEDITATING)
act("First $e better stand up.", ch, NULL, victim,
TO_CHAR);
else if (victim->position == POS_SITTING)
act("First $e better stand up.", ch, NULL, victim,
TO_CHAR);
else if (victim->position == POS_SLEEPING)
act("First you better wake $m up.", ch, NULL, victim,
TO_CHAR);
else if (victim->position == POS_FIGHTING)
act("Not while $e's fighting.", ch, NULL, victim,
TO_CHAR);
return;
}
if (!IS_NPC(ch) && ch->stance[0] != -1)
do_stance(ch, "");
ch->mounted = IS_RIDING;
victim->mounted = IS_MOUNT;
ch->mount = victim;
victim->mount = ch;
act("You clamber onto $N's back.", ch, NULL, victim, TO_CHAR);
act("$n clambers onto $N's back.", ch, NULL, victim, TO_ROOM);
return;
}
void do_dismount(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
if (IS_SET(ch->mounted, IS_RIDING))
{
if ((victim = ch->mount) == NULL)
{
ch->mounted = 0;
send_to_char("You stop riding the air.\n\r", ch);
return;
}
}
if (ch->mounted == 0)
{
send_to_char("But you are not riding!\n\r", ch);
return;
}
if ((victim = ch->mount) == NULL)
{
send_to_char("But you are not riding!\n\r", ch);
return;
}
act("You clamber off $N's back.", ch, NULL, victim, TO_CHAR);
act("$n clambers off $N's back.", ch, NULL, victim, TO_ROOM);
ch->mounted = IS_ON_FOOT;
victim->mounted = IS_ON_FOOT;
ch->mount = NULL;
victim->mount = NULL;
return;
}
void do_tie(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
ROOM_INDEX_DATA *location;
bool found = FALSE;
if (IS_NPC(ch))
return;
argument = one_argument(argument, arg);
if ((victim = get_char_room(ch, NULL, arg)) == NULL)
{
send_to_char("They aren't here.\n\r", ch);
return;
}
if (IS_NPC(victim))
{
send_to_char("You cannot tie a mob up!\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char("You cannot tie yourself up!\n\r", ch);
return;
}
if (IS_EXTRA(victim, TIED_UP))
{
send_to_char("But they are already tied up!\n\r", ch);
return;
}
if (victim->position > POS_STUNNED || victim->hit > 0)
{
send_to_char("You can only tie up a defenceless person.\n\r",
ch);
return;
}
if (victim->in_room != NULL)
{
if (IS_SET(victim->in_room->room_flags, ROOM_ARENA))
{
xprintf(buf, "#C%s #yhas been vanquished from the #Rarena#y by #C%s#n", victim->name, ch->name);
do_info(ch, buf);
victim->pcdata->alosses++;
if ((location = get_room_index(ROOM_VNUM_ALTAR)) == NULL)return;
char_from_room(victim);
char_to_room(victim, location);
victim->fight_timer = 0;
do_restore(victim, "self");
do_restore(ch, "self");
do_call(victim, "all");
/*
* Check for winner
*/
found = FALSE;
for (victim = char_list; victim != NULL;
victim = victim->next)
{
if (IS_NPC(victim))
continue;
if (victim->in_room != NULL &&
victim->in_room->area == ch->in_room->area
&& victim->pcdata->chobj == NULL
&& victim != ch)
{
found = TRUE;
}
}
if (!found)
{
xprintf(buf, "#C%s #yemerges victorious from the #Rarena#n", ch->name);
ch->pcdata->awins++;
do_info(ch, buf);
if ((location = get_room_index(ROOM_VNUM_ALTAR)) == NULL) return;
char_from_room(ch);
char_to_room(ch, location);
ch->fight_timer = 0;
do_restore(ch, "self");
current_arena = FALSE;
win_prize(ch);
if (tourney) update_bets(ch, NULL, TRUE);
}
return;
}
}
act("You quickly tie up $N.", ch, NULL, victim, TO_CHAR);
act("$n quickly ties up $N.", ch, NULL, victim, TO_ROOM);
send_to_char("You have been tied up!\n\r", victim);
SET_BIT(victim->extra, TIED_UP);
if (IS_SET(ch->pcdata->jflags, JFLAG_SETTIE))
tie_message(ch, victim);
else
{
xprintf(buf, "#P%s #Yhas been tied up by #R%s#n",
victim->name, ch->name);
do_info(ch, buf);
}
return;
}
void do_untie(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if ((victim = get_char_room(ch, NULL, arg)) == NULL)
{
send_to_char("They aren't here.\n\r", ch);
return;
}
if (!IS_EXTRA(victim, TIED_UP))
{
send_to_char("But they are not tied up!\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char("You cannot untie yourself!\n\r", ch);
return;
}
act("You quickly untie $N.", ch, NULL, victim, TO_CHAR);
act("$n quickly unties $N.", ch, NULL, victim, TO_NOTVICT);
act("$n quickly unties you.", ch, NULL, victim, TO_VICT);
REMOVE_BIT(victim->extra, TIED_UP);
return;
}
void do_gag(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if ((victim = get_char_room(ch, NULL, arg)) == NULL)
{
send_to_char("They aren't here.\n\r", ch);
return;
}
if (victim == ch && !IS_EXTRA(victim, GAGGED)
&& IS_EXTRA(victim, TIED_UP))
{
send_to_char("You cannot gag yourself!\n\r", ch);
return;
}
if (!IS_EXTRA(victim, TIED_UP) && !IS_EXTRA(victim, GAGGED))
{
send_to_char("You can only gag someone who is tied up!\n\r",
ch);
return;
}
if (!IS_EXTRA(victim, GAGGED))
{
act("You place a gag over $N's mouth.", ch, NULL, victim,
TO_CHAR);
act("$n places a gag over $N's mouth.", ch, NULL, victim,
TO_NOTVICT);
act("$n places a gag over your mouth.", ch, NULL, victim,
TO_VICT);
SET_BIT(victim->extra, GAGGED);
return;
}
if (ch == victim)
{
act("You remove the gag from your mouth.", ch, NULL, victim,
TO_CHAR);
act("$n removes the gag from $s mouth.", ch, NULL, victim,
TO_ROOM);
REMOVE_BIT(victim->extra, GAGGED);
return;
}
act("You remove the gag from $N's mouth.", ch, NULL, victim, TO_CHAR);
act("$n removes the gag from $N's mouth.", ch, NULL, victim,
TO_NOTVICT);
act("$n removes the gag from your mouth.", ch, NULL, victim, TO_VICT);
REMOVE_BIT(victim->extra, GAGGED);
return;
}
void do_blindfold(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if ((victim = get_char_room(ch, NULL, arg)) == NULL)
{
send_to_char("They aren't here.\n\r", ch);
return;
}
if (victim == ch && !IS_EXTRA(victim, BLINDFOLDED)
&& IS_EXTRA(victim, TIED_UP))
{
send_to_char("You cannot blindfold yourself!\n\r", ch);
return;
}
if (!IS_EXTRA(victim, TIED_UP) && !IS_EXTRA(victim, BLINDFOLDED))
{
send_to_char
("You can only blindfold someone who is tied up!\n\r",
ch);
return;
}
if (!IS_EXTRA(victim, BLINDFOLDED))
{
act("You place a blindfold over $N's eyes.", ch, NULL, victim,
TO_CHAR);
act("$n places a blindfold over $N's eyes.", ch, NULL, victim,
TO_NOTVICT);
act("$n places a blindfold over your eyes.", ch, NULL, victim,
TO_VICT);
SET_BIT(victim->extra, BLINDFOLDED);
return;
}
if (ch == victim)
{
act("You remove the blindfold from your eyes.", ch, NULL,
victim, TO_CHAR);
act("$n removes the blindfold from $s eyes.", ch, NULL,
victim, TO_ROOM);
REMOVE_BIT(victim->extra, BLINDFOLDED);
return;
}
act("You remove the blindfold from $N's eyes.", ch, NULL, victim,
TO_CHAR);
act("$n removes the blindfold from $N's eyes.", ch, NULL, victim,
TO_NOTVICT);
act("$n removes the blindfold from your eyes.", ch, NULL, victim,
TO_VICT);
REMOVE_BIT(victim->extra, BLINDFOLDED);
return;
}
int count_imms(CHAR_DATA * ch)
{
int count = 0;
if (IS_IMMUNE(ch, IMM_SLASH))
count += 1;
if (IS_IMMUNE(ch, IMM_STAB))
count += 1;
if (IS_IMMUNE(ch, IMM_SMASH))
count += 1;
if (IS_IMMUNE(ch, IMM_ANIMAL))
count += 1;
if (IS_IMMUNE(ch, IMM_MISC))
count += 1;
if (IS_IMMUNE(ch, IMM_CHARM))
count += 1;
if (IS_IMMUNE(ch, IMM_HEAT))
count += 1;
if (IS_IMMUNE(ch, IMM_COLD))
count += 1;
if (IS_IMMUNE(ch, IMM_LIGHTNING))
count += 1;
if (IS_IMMUNE(ch, IMM_ACID))
count += 1;
if (IS_IMMUNE(ch, IMM_SLEEP))
count += 1;
if (IS_IMMUNE(ch, IMM_DRAIN))
count += 1;
if (IS_IMMUNE(ch, IMM_VOODOO))
count += 1;
if (IS_IMMUNE(ch, IMM_HURL))
count += 1;
if (IS_IMMUNE(ch, IMM_BACKSTAB))
count += 1;
if (IS_IMMUNE(ch, IMM_KICK))
count += 1;
if (IS_IMMUNE(ch, IMM_DISARM))
count += 1;
if (IS_IMMUNE(ch, IMM_STEAL))
count += 1;
return ((count * 50000) + 10000);
}
void do_track(CHAR_DATA * ch, char *argument)
{
bool found = FALSE;
if (!IS_NPC(ch) && number_percent() > ch->pcdata->learned[gsn_track])
{
send_to_char
("You cannot sense any trails from this room.\n\r",
ch);
return;
}
if (check_track(ch, 0))
found = TRUE;
if (check_track(ch, 1))
found = TRUE;
if (check_track(ch, 2))
found = TRUE;
if (check_track(ch, 3))
found = TRUE;
if (check_track(ch, 4))
found = TRUE;
if (found == FALSE)
{
send_to_char
("You cannot sense any trails from this room.\n\r",
ch);
return;
}
act("$n carefully examines the ground for tracks.", ch, NULL, NULL,
TO_ROOM);
return;
}
void do_hunt(CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (arg[0] == '\0')
{
if (strlen(ch->hunting) > 1)
{
free_string(ch->hunting);
ch->hunting = str_dup("");
send_to_char("You stop hunting your prey.\n\r", ch);
}
else
send_to_char("Who do you wish to hunt?\n\r", ch);
return;
}
if (!str_cmp(arg, ch->name))
{
send_to_char("How can you hunt yourself?\n\r", ch);
return;
}
free_string(ch->hunting);
ch->hunting = str_dup(arg);
send_to_char("Ok.\n\r", ch);
return;
}
void check_hunt(CHAR_DATA * ch)
{
CHAR_DATA *victim;
bool found = FALSE;
int direction = 0;
ROOM_INDEX_DATA *in_room;
in_room = ch->in_room;
if (!IS_NPC(ch) && number_percent() > ch->pcdata->learned[gsn_track])
{
send_to_char
("You cannot sense any trails from this room.\n\r",
ch);
free_string(ch->hunting);
ch->hunting = str_dup("");
return;
}
if (check_track(ch, 0))
{
found = TRUE;
direction = ch->in_room->track_dir[0];
}
else if (check_track(ch, 1))
{
found = TRUE;
direction = ch->in_room->track_dir[1];
}
else if (check_track(ch, 2))
{
found = TRUE;
direction = ch->in_room->track_dir[2];
}
else if (check_track(ch, 3))
{
found = TRUE;
direction = ch->in_room->track_dir[3];
}
else if (check_track(ch, 4))
{
found = TRUE;
direction = ch->in_room->track_dir[4];
}
else if ((victim = get_char_room(ch, NULL, ch->hunting)) == NULL)
{
send_to_char
("You cannot sense any trails from this room.\n\r",
ch);
free_string(ch->hunting);
ch->hunting = str_dup("");
return;
}
if (strlen(ch->hunting) < 2)
return;
if ((victim = get_char_room(ch, NULL, ch->hunting)) != NULL)
return;
act("$n carefully examines the ground for tracks.", ch, NULL, NULL,
TO_ROOM);
move_char(ch, direction);
if (in_room == ch->in_room || victim != NULL)
{
free_string(ch->hunting);
ch->hunting = str_dup("");
}
return;
}
void add_tracks(CHAR_DATA * ch, int direction)
{
int loop;
if (IS_NPC(ch))
return;
if (IS_CLASS(ch, CLASS_WEREWOLF) && ch->power[DISC_WERE_LYNX] > 0)
return;
if (IS_CLASS(ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_SORA] >= 4)
return;
if (IS_CLASS(ch, CLASS_SHADOW)
&& IS_SET(ch->pcdata->powers[SHADOW_POWERS], NSHADOWS_SILENTWALK))
return;
if (IS_ITEMAFF(ch, ITEMA_STALKER))
return;
for (loop = 0; loop <= 4; loop++)
{
if (ch->in_room->track[loop] != NULL
&& !str_cmp(ch->in_room->track[loop], ch->name))
{
free_string(ch->in_room->track[loop]);
ch->in_room->track[loop] = str_dup("");
}
}
if (ch->in_room->track[0] != NULL
&& strlen(ch->in_room->track[0]) < 2)
{
free_string(ch->in_room->track[0]);
ch->in_room->track[0] = str_dup(ch->pcdata->switchname);
ch->in_room->track_dir[0] = direction;
}
else if (ch->in_room->track[1] != NULL
&& strlen(ch->in_room->track[1]) < 2)
{
free_string(ch->in_room->track[1]);
ch->in_room->track[1] = str_dup(ch->pcdata->switchname);
ch->in_room->track_dir[1] = direction;
}
else if (ch->in_room->track[2] != NULL
&& strlen(ch->in_room->track[2]) < 2)
{
free_string(ch->in_room->track[2]);
ch->in_room->track[2] = str_dup(ch->pcdata->switchname);
ch->in_room->track_dir[2] = direction;
}
else if (ch->in_room->track[3] != NULL
&& strlen(ch->in_room->track[3]) < 2)
{
free_string(ch->in_room->track[3]);
ch->in_room->track[3] = str_dup(ch->pcdata->switchname);
ch->in_room->track_dir[3] = direction;
}
else if (ch->in_room->track[4] != NULL
&& strlen(ch->in_room->track[4]) < 2)
{
free_string(ch->in_room->track[4]);
ch->in_room->track[4] = str_dup(ch->pcdata->switchname);
ch->in_room->track_dir[4] = direction;
}
else
{
free_string(ch->in_room->track[0]);
ch->in_room->track[0] = str_dup(ch->in_room->track[1]);
ch->in_room->track_dir[0] = ch->in_room->track_dir[1];
free_string(ch->in_room->track[1]);
ch->in_room->track[1] = str_dup(ch->in_room->track[2]);
ch->in_room->track_dir[1] = ch->in_room->track_dir[2];
free_string(ch->in_room->track[2]);
ch->in_room->track[2] = str_dup(ch->in_room->track[3]);
ch->in_room->track_dir[2] = ch->in_room->track_dir[3];
free_string(ch->in_room->track[3]);
ch->in_room->track[3] = str_dup(ch->in_room->track[4]);
ch->in_room->track_dir[3] = ch->in_room->track_dir[4];
free_string(ch->in_room->track[4]);
ch->in_room->track[4] = str_dup(ch->name);
ch->in_room->track_dir[4] = direction;
}
return;
}
bool check_track(CHAR_DATA * ch, int direction)
{
CHAR_DATA *victim;
char buf[MAX_INPUT_LENGTH];
char vict[MAX_INPUT_LENGTH];
int door;
if (ch->hunting != NULL)
strcpy(vict, ch->hunting);
else
return FALSE;
if (!str_cmp(ch->hunting, vict))
{
if ((victim = get_char_room(ch, NULL, vict)) != NULL)
{
act("You have found $N!", ch, NULL, victim, TO_CHAR);
free_string(ch->hunting);
ch->hunting = str_dup("");
return TRUE;
}
}
if (strlen(ch->in_room->track[direction]) < 2)
return FALSE;
if (!str_cmp(ch->in_room->track[direction], ch->name))
return FALSE;
if (strlen(ch->hunting) > 1
&& str_cmp(ch->in_room->track[direction], ch->hunting))
return FALSE;
door = ch->in_room->track_dir[direction];
xprintf(buf, "You sense the trail of %s leading $T from here.",
ch->in_room->track[direction]);
act(buf, ch, NULL, dir_name[door], TO_CHAR);
return TRUE;
}
void do_roll(CHAR_DATA * ch, char *argument)
{
OBJ_DATA *obj;
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
stc("Huh?\n\r", ch);
return;
}
if ((obj = ch->pcdata->chobj) == NULL)
{
send_to_char("Huh?\n\r", ch);
return;
}
if (obj->chobj == NULL || obj->chobj != ch)
{
send_to_char("Huh?\n\r", ch);
return;
}
if (obj->in_room == NULL)
{
send_to_char("You are unable to move.\n\r", ch);
return;
}
if (!str_cmp(arg, "n") || !str_cmp(arg, "north"))
do_north(ch, "");
else if (!str_cmp(arg, "s") || !str_cmp(arg, "south"))
do_south(ch, "");
else if (!str_cmp(arg, "e") || !str_cmp(arg, "east"))
do_east(ch, "");
else if (!str_cmp(arg, "w") || !str_cmp(arg, "west"))
do_west(ch, "");
else if (!str_cmp(arg, "u") || !str_cmp(arg, "up"))
do_up(ch, "");
else if (!str_cmp(arg, "d") || !str_cmp(arg, "down"))
do_down(ch, "");
else
{
send_to_char
("Do you wish to roll north, south, east, west, up or down?\n\r",
ch);
return;
}
obj_from_room(obj);
obj_to_room(obj, ch->in_room);
return;
}
void do_leap(CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
OBJ_DATA *container;
OBJ_DATA *obj;
char arg[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg);
if (IS_NPC(ch))
return;
if (!IS_CLASS(ch, CLASS_DEMON))
{
send_to_char("Huh?\n\r", ch);
return;
}
if ((obj = ch->pcdata->chobj) == NULL)
{
send_to_char("Huh?\n\r", ch);
return;
}
if (obj->chobj == NULL || obj->chobj != ch)
{
send_to_char("Huh?\n\r", ch);
return;
}
if (obj->in_room != NULL && arg[0] == '\0')
{
send_to_char("Where do you want to leap?\n\r", ch);
return;
}
if (obj->in_room != NULL)
{
if ((victim = get_char_room(ch, NULL, arg)) != NULL)
{
act("$p leaps into your hands.", victim, obj, NULL,
TO_CHAR);
act("$p leaps into $n's hands.", victim, obj, NULL,
TO_ROOM);
obj_from_room(obj);
obj_to_char(obj, victim);
return;
}
else if ((container = get_obj_room(ch, arg)) != NULL)
{
if (container->item_type != ITEM_CONTAINER &&
container->item_type != ITEM_CORPSE_NPC &&
container->item_type != ITEM_CORPSE_PC)
{
send_to_char
("You cannot leap into that sort of object.\n\r",
ch);
return;
}
act("$p leap into $P.", ch, obj, container, TO_CHAR);
act("$p leaps into $P.", ch, obj, container, TO_ROOM);
obj_from_room(obj);
obj_to_obj(obj, container);
return;
}
else
send_to_char("Nothing here by that name.\n\r", ch);
return;
}
if (obj->carried_by != NULL)
{
act("$p leaps from your hands.", obj->carried_by, obj, NULL,
TO_CHAR);
act("$p leaps from $n's hands.", obj->carried_by, obj, NULL,
TO_ROOM);
obj_from_char(obj);
obj_to_room(obj, ch->in_room);
return;
}
else if ((container = obj->in_obj) != NULL
&& container->in_room != NULL)
{
obj_from_obj(obj);
obj_to_room(obj, container->in_room);
char_from_room(ch);
char_to_room(ch, container->in_room);
act("$p leap from $P.", ch, obj, container, TO_CHAR);
act("$p leaps from $P.", ch, obj, container, TO_ROOM);
return;
}
if (obj->in_room != NULL)
send_to_char("You seem unable to leap anywhere.\n\r", ch);
else
send_to_char("You seem to be stuck!\n\r", ch);
return;
}
void drow_hate(CHAR_DATA * ch)
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
if (IS_NPC(ch))
return;
if (IS_CLASS(ch, CLASS_DROW) && !IS_SET(ch->newbits, NEW_DROWHATE))
return;
if (!IS_CLASS(ch, CLASS_DROW) && !IS_ITEMAFF(ch, ITEMA_MADNESS))
return;
if (number_percent() < 2)
{
for (vch = char_list; vch != NULL; vch = vch_next)
{
vch_next = vch->next;
if (ch == vch)
continue;
if (vch->in_room == NULL)
continue;
if (vch->in_room == ch->in_room)
{
send_to_char
("You scream out in hatred and attack!\n\r",
ch);
act("$n screams out in hatred and attacks!",
ch, NULL, vch, TO_ROOM);
SET_BIT(ch->pcdata->tempflag,
TEMP_AGGRESSIVE);
do_kill(ch, vch->name);
REMOVE_BIT(ch->pcdata->tempflag,
TEMP_AGGRESSIVE);
return;
}
}
}
return;
}
int figure_stat_cost(const int mStat)
{
int stat = mStat - 13;
if (stat < 10)
return 10;
else if (stat < 20)
return 30;
else if (stat < 30)
return 50;
else if (stat < 40)
return 70;
else if (stat < 50)
return 90;
else if (stat < 60)
return 120;
else if (stat < 70)
return 150;
else if (stat < 90)
return 170;
else
return 200;
return 200;
}