#include <sys/types.h>
// ARC: commenting this out since its not used
//#include <crypt.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
bool inventory=FALSE;
void
do_showloot (CHAR_DATA * ch, char *argy)
{
CHAR_DATA *fch;
DEFINE_COMMAND ("showloot", do_showloot, POSITION_DEAD, 0, LOG_NORMAL, "This command shows what is currently in your inventory.")
send_to_char("You show off your inventory to the room.\n\r", ch);
WAIT_STATE(ch, 60);
for (fch = ch->in_room->more->people; fch != NULL; fch = fch->next_in_room)
{
if (ch->pcdata->alignment == fch->pcdata->alignment)
show_list_to_char(ch->carrying, fch, TRUE, TRUE);
}
return;
} // END SHOWLOOT
void
do_where (CHAR_DATA * ch, char *argy)
{
char buf[STD_LENGTH];
char arg[SML_LENGTH];
CHAR_DATA *victim;
DESCRIPTOR_DATA *d;
bool found;
DEFINE_COMMAND ("where", do_where, POSITION_RESTING, 0, LOG_NORMAL, "This command shows you characters nearby, and what area you are in.")
one_argy (argy, arg);
if (!pow.allow_where)
{
send_to_char ("Huh?\n\r", ch);
return;
} if (IS_MOB (ch))
return;
sprintf (buf, "You are in \x1B[1m%s\x1B[0m, built by \x1B[1;31m",
ch->in_room->area->name);
send_to_char (buf, ch);
if (LEVEL (ch) > 100 && LEVEL (ch) < 110)
return;
if (words (ch->in_room->area->builders) == 0)
{
send_to_char ("\x1B[0man anonymous builder.\n\r", ch);
}
else if (words (ch->in_room->area->builders) == 1)
{
sprintf (buf, "%s\x1B[0m.\n\r", ch->in_room->area->builders);
send_to_char (buf, ch);
}
else if (words (ch->in_room->area->builders) == 2)
{
sprintf (buf, "%s\x1B[0m and \x1B[1;31m%s\x1B[0m.\n\r",
first (ch->in_room->area->builders),
ch->in_room->area->builders +
strlen (first (ch->in_room->area->builders)) + 1);
send_to_char (buf, ch);
}
else if (words (ch->in_room->area->builders) == 3)
{
sprintf (buf, "%s\x1B[0m, \x1B[1;31m%s\x1B[0m, and \x1B[1;31m%s\x1B[0m.\n\r",
first (ch->in_room->area->builders),
first (ch->in_room->area->builders + strlen (first (ch->in_room->area->builders)) + 1),
first (ch->in_room->area->builders +
strlen (first (ch->in_room->area->builders)) +
1 +
strlen (ch->in_room->area->builders + strlen (first (ch->in_room->area->builders)) + 1) + 1));
send_to_char (buf, ch);
}
send_to_char ("Players near you:\n\r", ch);
found = FALSE;
for (d = descriptor_list; d; d = d->next)
{
if ((victim = d->character) != NULL
&& IS_PLAYER (victim)
&& victim->in_room != NULL
&& can_see (ch, victim) &&
(!DIFF_ALIGN(ch, victim)|| LEVEL(ch) > 100))
{
if (LEVEL (ch) >= 100)
{
sprintf (buf, "%-28s %s [%d]\n\r", NAME (victim), victim->in_room->name, victim->in_room->vnum);
send_to_char (buf, ch);
}
else if (d->connected == CON_PLAYING)
{
if ((victim->in_room->area == ch->in_room->area) &&
victim != ch && !DIFF_ALIGN(ch, victim))
{
found = TRUE;
sprintf (buf, "%-28s %s\n\r", NAME (victim), victim->in_room->name);
}
else
buf[0] = '\0';
send_to_char (buf, ch);
}
}
}
if (!found)
send_to_char ("No one else can be found.\n\r", ch);
return;
}
/*
Scan_direction scans up to three rooms away, or until a mob is found
in the direction passed.
*/
void
scan_direction (CHAR_DATA * ch, int dir)
{
EXIT_DATA *pexit;
ROOM_DATA *troom;
CHAR_DATA *mob;
char final[STD_LENGTH];
char buf[STD_LENGTH];
bool fMultiple;
int n = 0, max_iteration;
hugebuf_o[0] = '\0';
final[0] = '\0';
max_iteration = 3;
pexit = ch->in_room->exit[dir];
if (pexit == NULL || (ROOM_DATA *) pexit->to_room == NULL)
return;
troom = (ROOM_DATA *) pexit->to_room;
if (troom != NULL && (!pexit->d_info || (!IS_SET (pexit->d_info->exit_info, EX_CLOSED))) && room_is_dark (troom) && !IS_AFFECTED (ch, AFF_INFRARED))
{
if (troom->more && troom->more->people != NULL)
{
sprintf (buf, "You can make out some motion to the %s.\n\r", dir_name[URANGE (0, dir, MAX_DIR - 1)]);
send_to_char (buf, ch);
}
return;
}
#ifndef NEW_WORLD
if (troom != NULL && !(room_is_dark (troom) && !IS_AFFECTED (ch, AFF_INFRARED)))
{
if (troom->more && troom->more->people != NULL && troom->more->people->ced && troom->more->people->ced->in_boat != NULL)
{
sprintf (buf, "You can make out some sort of boat to the %s.\n\r", dir_name[URANGE (0, dir, MAX_DIR - 1)]);
send_to_char (buf, ch);
return;
}
}
#endif
n = 0;
while ((pexit != NULL) && (n < max_iteration) &&
((ROOM_DATA *) pexit->to_room != NULL) && (!pexit->d_info || (!IS_SET (pexit->d_info->exit_info, EX_CLOSED)
&& pexit->d_info->exit_info != 1)))
{
fMultiple = FALSE;
troom = (ROOM_DATA *) pexit->to_room;
if (troom != NULL && troom->more && troom->more->people != NULL)
{
int cnnt;
cnnt = 0;
for (mob = troom->more->people; mob != NULL; mob = mob->next_in_room)
{
if (!can_see_nextdoor (ch, mob) || !can_see (ch, mob))
continue;
cnnt++;
if (cnnt > 1 && mob->next_in_room == NULL && ((
mob != troom->more->people) || (
troom->more->people->next_in_room != NULL && mob != troom->more->people->next_in_room)))
{
fMultiple = TRUE;
sprintf (buf, " and %s", rNAME (mob, ch));
}
else if (mob->next_in_room != NULL && can_see_nextdoor (ch, mob)
&& mob->next_in_room->next_in_room != NULL)
sprintf (buf, "%s, ", rNAME (mob, ch));
else
sprintf (buf, "%s", rNAME (mob, ch));
strcat (final, buf);
}
if (cnnt > 0)
{
sprintf (buf, " %s %s \x1B[1;37m%s\x1B[0m from here.\n\r", fMultiple ? "are" : "is",
dist_name[URANGE (0, n, 7)],
dir_name[URANGE (0, dir, MAX_DIR - 1)]);
strcat (final, buf);
}
if (final[0] != '\0')
{
final[0] = UPPER (final[0]);
strcpy (hugebuf_o, final);
send_to_char (hugebuf_o, ch);
}
final[0] = '\0';
return;
}
pexit = troom->exit[dir];
n++;
}
return;
}
void
scan_direction2 (CHAR_DATA * ch, int dir, int followers)
{
EXIT_DATA *pexit;
ROOM_DATA *troom;
ROOM_DATA *curr_room;
CHAR_DATA *viewer;
char buff[100];
int max_iteration = 2;
int n = 0;
bool seen = FALSE;
if (ch->in_room)
curr_room = ch->in_room;
else
return;
for (n = 0; n < max_iteration; n++)
{
pexit = curr_room->exit[dir];
if (pexit == NULL || (troom =(ROOM_DATA *) pexit->to_room) == NULL)
return;
if (!pexit->d_info || (!IS_SET (pexit->d_info->exit_info, EX_CLOSED)))
{
if (troom->more && troom->more->people != NULL)
{
for (viewer = troom->more->people; viewer != NULL; viewer =viewer->next_in_room)
{
buff[0] = '\0';
if (IS_MOB(viewer)) continue;
if (!DIFF_ALIGN(ch, viewer)) continue;
// ARC: no timers associated with neuts
if (ALIGN(ch) == 0 || ALIGN(viewer) == 0 && !IN_BATTLE(ch)) continue;
if (viewer->pcdata->no_quit_pk < 2)
viewer->pcdata->no_quit_pk = 2;
if (ch->pcdata->no_quit_pk < 2)
ch->pcdata->no_quit_pk = 2;
if (!IS_SET(viewer->pcdata->act2, PLR_AUTOSCAN))
continue;
if(viewer->pcdata->learned[gsn_sixth_sense] < 50)
continue;
if ((ch->pcdata->wizinvis > LEVEL(viewer))
|| IS_AFFECTED(viewer, AFF_BLIND))
continue;
/* Similar to can_see */
if ((room_is_dark(ch->in_room) && !IS_AFFECTED(viewer, AFF_INFRARED))
|| (IS_AFFECTED(ch, AFF_INVISIBLE) && !IS_AFFECTED(viewer, AFF_DETECT_INVIS))
|| (IS_AFFECTED(ch, AFF_HIDE) && !IS_AFFECTED(viewer, AFF_DETECT_HIDDEN))
|| (weather_info.sky == SKY_FOGGY)
|| (IS_AFFECTED_EXTRA(ch, AFF_CHAMELEON) && !IS_AFFECTED_EXTRA(ch, AFF_DET_CHAMELEON)))
sprintf(buff, "Something arrives ");
else
sprintf(buff,"%s arrives ", rNAME(ch, viewer));
switch (n)
{
default:
strcat(buff, "very far ");
break;
case 0:
strcat(buff, "close by ");
break;
case 1:
strcat(buff, "off ");
break;
case 2:
strcat(buff, "far ");
break;
}
switch (dir)
{
case 0:
strcat(buff, "to the south");
break;
case 1:
strcat(buff, "to the west");
break;
case 2:
strcat(buff, "to the north");
break;
case 3:
strcat(buff, "to the east");
break;
case 4:
strcat(buff, "down below");
break;
case 5:
strcat(buff, "up above");
break;
}
if (followers > 0)
{
char buf[30];
sprintf(buf, " with %d followers", followers);
strcat(buff, buf);
}
strcat(buff, "./n/r");
seen = TRUE;
send_to_char(buff, viewer);
}
}
}
if (seen) return;
curr_room = troom;
}
}
void
show_list_to_char (SINGLE_OBJECT * list, CHAR_DATA * ch, bool fShort, bool fShowNothing)
{
#ifdef NEW_WORLD
char buf[STD_LENGTH];
char prgpstrShow[200][150];
int prgnShow[200];
char pstrShow[150];
#else
char buf[STD_LENGTH];
char prgpstrShow[200][STD_LENGTH]; //ARC: fixed array size
int prgnShow[200];
char pstrShow[STD_LENGTH]; //ARC: fixed array size
#endif
SINGLE_OBJECT *obj;
int nShow;
int iShow;
int count;
bool fCombine;
count = 0;
bzero (&prgpstrShow, sizeof (prgpstrShow));
bzero (&prgnShow, sizeof (prgnShow));
bzero (&pstrShow, sizeof (pstrShow));
if (list == NULL)
return;
nShow = 0;
for (obj = list; obj && obj != NULL; obj = obj->next_content)
{
#ifndef NEW_WORLD
if (ch->ced && ch->ced->in_boat == obj)
continue;
#endif
if (obj->wear_loc == WEAR_NONE && can_see_obj (ch, obj)
&& ((!IS_SET (obj->extra_flags, ITEM_UNSEEN) &&
!IS_SET (obj->pIndexData->extra_flags, ITEM_UNSEEN))
|| IS_SET (ch->act, PLR_HOLYLIGHT)))
{
strcpy (pstrShow, format_obj_to (obj, ch, fShort));
fCombine = FALSE;
if (IS_MOB (ch) || IS_SET (ch->pcdata->act2, PLR_COMBINE))
{
for (iShow = nShow - 1; iShow >= 0; iShow--)
{
if (!strcmp (prgpstrShow[iShow], pstrShow))
{
prgnShow[iShow]++;
fCombine = TRUE;
break;
}
}
}
if (!fCombine)
{
strcpy (prgpstrShow[nShow], pstrShow);
prgnShow[nShow] = 1;
nShow++;
if (nShow >= 200)
{
fprintf (stderr, "Error. nShow>=200. Ch: %s.\n", NAME (ch));
return;
}
}
}
}
for (iShow = 0; iShow < nShow; iShow++)
{
if (IS_MOB (ch) || IS_SET (ch->pcdata->act2, PLR_COMBINE))
{
if (prgnShow[iShow] != 1)
{
sprintf (buf, "[x%d] ", prgnShow[iShow]);
send_to_char (buf, ch);
}
}
send_to_char (prgpstrShow[iShow], ch);
if (fShort)
send_to_char ("\x1B[0m", ch);
}
if (fShowNothing && nShow == 0)
{
if (IS_MOB (ch) || IS_SET (ch->pcdata->act2, PLR_COMBINE))
send_to_char ("Nothing.\n\r", ch);
}
return;
}
void show_char_to_char (CHAR_DATA * list, CHAR_DATA * ch)
{
CHAR_DATA *rch;
for (rch = list; rch != NULL; rch = rch->next_in_room)
{
if (rch == ch)
continue;
show_char_to_char_0 (rch, ch);
}
return;
}
void
show_char_to_char_0 (CHAR_DATA * victim, CHAR_DATA * ch)
{
char buf[STD_LENGTH * 5];
char to_show[STD_LENGTH * 5];
bool tflag;
bool fll = FALSE;
bool rcselect;
buf[0] = '\0';
rcselect = FALSE;
tflag = FALSE;
to_show[0]='\0';
buf[0]='\0';
if (!can_see (ch, victim))
return;
if (ch == victim) return;
if (MOUNTED_BY (victim) != NULL
&& victim->fgt->mounted_by->in_room == ch->in_room
&& MOUNTED_BY (victim) == ch)
{
act ("\x1B[1;37mYou are riding $N.\x1B[0m", ch, NULL, victim, TO_CHAR_SPAM);
return;
}
if (IS_PLAYER (victim) && victim->desc == NULL)
strcat (buf, "\x1B[1;34m>LINKLESS< \x1B[0m");
if (IS_PLAYER (victim))
send_to_char ("\x1B[1;35m", ch);
else
send_to_char ("\x1B[1;36m", ch);
to_show[0] = '\0';
if (IS_PLAYER (ch) && IS_PLAYER (victim) && DIFF_ALIGN(ch, victim))
{
strcpy (to_show, rNAME (victim, ch));
rcselect = TRUE;
}
if (MOUNTED_BY (victim) != NULL)
return;
if (!rcselect)
{
if (victim->position == POSITION_STANDING && RIDING (victim) == NULL
&& LD (victim) && LD (victim)[0] != '\0' && IS_MOB(victim))
{
strcpy (to_show, LD (victim));
tflag = FALSE;
}
else
{
strcpy (to_show, PERS (victim, ch));
tflag = TRUE;
}
}
if (IS_PLAYER (ch) && (ch->pcdata->no_spam == 2 || ch->pcdata->no_spam == 1) && !tflag)
{
if (to_show[strlen (to_show) - 1] == '\n')
to_show[strlen (to_show) - 1] = '\0';
if (to_show[strlen (to_show) - 2] == '\r')
to_show[strlen (to_show) - 3] = '\0';
if (to_show[strlen (to_show) - 2] == '\n')
to_show[strlen (to_show) - 2] = '\0';
if (to_show[strlen (to_show) - 3] == '\r')
to_show[strlen (to_show) - 4] = '\0';
if (to_show[strlen (to_show) - 3] == '\n')
to_show[strlen (to_show) - 3] = '\0';
if (to_show[strlen (to_show) - 1] == '\r')
to_show[strlen (to_show) - 2] = '\0';
// if (IS_AFFECTED (victim, AFF_CHARM))
// strcat (to_show, " \x1B[1;32m(>> Undead <<)\x1B[0m");
if (victim->is_undead == TRUE)
strcat (to_show, " \x1B[1;32m(>> Undead <<)\x1B[0m");
if (IS_AFFECTED (victim, AFF_INVISIBLE))
strcat (to_show, "\x1B[1;36m (\x1B[0;36mInvis\x1B[1;36m)\x1B[0m");
if (IS_AFFECTED (victim, AFF_HIDE))
strcat (to_show, "\x1B[1;30m (Hidden)\x1B[0m");
if (IS_AFFECTED (victim, AFF_SANCTUARY))
strcat (to_show, "\x1B[0;37m (\x1B[1;37mSanctuary\x1B[0;37m)");
if (IS_AFFECTED_EXTRA (victim, AFF_FIRESHIELD))
strcat (to_show, "\x1B[0;31m (\x1b[1;31mFireshield\x1b[0;31m)\x1b[0;37m");
if (IS_AFFECTED (victim, AFF_FAERIE_FIRE))
strcat (to_show, "\x1B[1;35m (Outlined)\x1B[0m");
if (IS_AFFECTED_EXTRA (victim, AFF_MANASHIELD))
strcat (to_show, " \x1b[0;36m(\x1b[1;36mMana Shield\x1b[0;36m)\x1B[0m");
if (IS_AFFECTED (victim, AFF_FLYING))
{
if ((IS_MOB(victim) && (victim->pIndexData->mobtype == MOB_BIRD || victim->pIndexData->mobtype == MOB_DRAGON)) || (IS_PLAYER(victim) && IS_SET(race_info[victim->pcdata->race].affect_bits, AFF_FLYING)))
strcat (to_show, "\x1B[0;1;35m (Flying)\x1B[0m");
else
strcat (to_show, "\x1B[0;1;35m (Flying)\x1B[0m");
}
strcat (buf, to_show);
strcat (buf, "\n\r");
send_to_char (buf, ch);
return;
}
strcat (buf, to_show);
if (tflag || rcselect)
{
buf[0] = UPPER (buf[0]);
/* ARC: removing this showing of titles in room...
looks ugly, useless and gives room for visual abuse
if (IS_PLAYER (victim) && !IS_SET (ch->pcdata->act2, PLR_BRIEF)
&& !rcselect &&
strlen (victim->pcdata->title) < 39)
{
strcat (buf, " ");
strcat (buf, victim->pcdata->title);
}
*/
if (RIDING (victim) != NULL && victim->fgt->riding->in_room == victim->in_room)
{
char buf2[STD_LENGTH];
sprintf (buf2, " is here, riding %s.", PERS (RIDING (victim), ch));
strcat (buf, buf2);
}
else
{
strcat (buf, " is");
switch (victim->position)
{
case POSITION_DEAD:
strcat (buf, " DEAD!!");
break;
case POSITION_MORTAL:
strcat (buf, " mortally wounded.");
break;
case POSITION_INCAP:
strcat (buf, " incapacitated.");
break;
case POSITION_STUNNED:
strcat (buf, " lying here, stunned.");
break;
case POSITION_SLEEPING:
strcat (buf, " asleep here.");
break;
case POSITION_BASHED:
strcat (buf, " on the ground, bashed.\n\r");
break;
case POSITION_MEDITATING:
strcat (buf, " meditating here.");
break;
case POSITION_SEARCHING:
strcat (buf, " searching for something here.");
break;
case POSITION_CASTING:
strcat(buf, " casting a spell.");
break;
case POSITION_FALLING:
strcat (buf, " falling to the ground!");
break;
case POSITION_RESTING:
strcat (buf, " resting here.");
break;
case POSITION_STANDING:
strcat (buf, " here.");
break;
case POSITION_FIGHTING:
strcat (buf, " here, fighting ");
if (FIGHTING (victim) == NULL)
strcat (buf, "thin air??\n\r");
else if (FIGHTING (victim) == ch)
strcat (buf, "you!\n\r");
else if (FIGHTING (victim) && victim->in_room == victim->fgt->fighting->in_room)
{
strcat (buf, rNAME (FIGHTING (victim), ch));
strcat (buf, ".\n\r");
}
else
strcat (buf, "someone who left??\n\r");
break;
case POSITION_GROUNDFIGHTING:
strcat (buf, " fighting on the ground with ");
if (FIGHTING (victim) == NULL)
strcat (buf, "thin air??\n\r");
else if (FIGHTING (victim) == ch)
strcat (buf, "YOU!\n\r");
else if (FIGHTING (victim) && victim->in_room == victim->fgt->fighting->in_room)
{
strcat (buf, rNAME (FIGHTING (victim), ch));
strcat (buf, ".\n\r");
}
else
strcat (buf, "someone who left??\n\r");
break;
}
}
}
if (victim->position != POSITION_FIGHTING &&
victim->position != POSITION_GROUNDFIGHTING && victim->position != POSITION_BASHED)
{
if (IS_PLAYER (ch) && (ch->pcdata->no_spam == 2 || ch->pcdata->no_spam == 1))
{
strcpy (to_show, buf);
if (IS_AFFECTED (victim, AFF_CHARM))
strcat (to_show, " \x1B[1;32m(>> Undead <<)\x1B[0m");
if (IS_AFFECTED (victim, AFF_INVISIBLE))
strcat (to_show, "\x1B[1;36m (\x1B[0;36mInvis\x1B[1;36m)\x1B[0m");
if (IS_AFFECTED (victim, AFF_HIDE))
strcat (to_show, "\x1B[1;30m (Hidden)\x1B[0m");
if (IS_AFFECTED (victim, AFF_SANCTUARY))
strcat (to_show, "\x1B[0;37m (\x1B[1;37mSanctuary\x1B[0;37m)");
if (IS_AFFECTED_EXTRA (victim, AFF_FIRESHIELD))
strcat (to_show, "\x1B[0;31m (\x1b[1;31mFireshield\x1b[0;31m)\x1b[0;37m");
if (IS_AFFECTED (victim, AFF_FAERIE_FIRE))
strcat (to_show, "\x1B[1;35m (Outlined)\x1B[0m");
if (IS_AFFECTED (victim, AFF_FLYING))
{
if ((IS_MOB(victim) && (victim->pIndexData->mobtype == MOB_BIRD || victim->pIndexData->mobtype == MOB_DRAGON)) || (IS_PLAYER(victim) && IS_SET(race_info[victim->pcdata->race].affect_bits, AFF_FLYING)))
strcat (to_show, "\x1B[0;1;35m (Flying)\x1B[0m");
else
strcat (to_show, "\x1B[0;1;35m (Flying)\x1B[0m");
}
strcat (to_show, "\n\r");
send_to_char (to_show, ch);
return;
}
}
send_to_char (buf, ch);
if (IS_PLAYER (ch) && ch->pcdata->no_spam == 0)
{
if (victim->position != POSITION_FIGHTING && victim->position != POSITION_BASHED &&
victim->position != POSITION_GROUNDFIGHTING &&
(tflag || rcselect) && (!fll))
send_to_char ("\n\r", ch);
if (IS_AFFECTED (victim, AFF_CHARM))
act ("\x1B[1;32m...$N is >> Undead <<.\x1B[0m", ch, NULL, victim, TO_CHAR);
if (IS_AFFECTED (victim, AFF_INVISIBLE) && IS_AFFECTED (victim, AFF_HIDE))
act ("\x1B[1;36m...$N is \x1B[0;36minvisible\x1B[1;36m and \x1B[1;30mhidden\x1B[1;36m.\x1B[0m", ch, NULL, victim, TO_CHAR);
else
{
if (IS_AFFECTED (victim, AFF_INVISIBLE))
act ("\x1B[1;36m...$N is \x1B[0;36minvisible\x1B[1;36m.\x1B[0m", ch, NULL, victim, TO_CHAR);
if (IS_AFFECTED (victim, AFF_HIDE))
act ("\x1B[1;30m...$N is hidden.\x1B[0m", ch, NULL, victim, TO_CHAR);
}
if (IS_AFFECTED (victim, AFF_SANCTUARY))
act ("\x1B[0;1m...$N is protected by a \x1B[1mbright\x1B[0;1m aura!\x1B[0m", ch, NULL, victim, TO_CHAR);
if (IS_AFFECTED_EXTRA(victim, AFF_FIRESHIELD))
act ("$4...$N is protected by a shroud of $B$4Fire$R$4!$R$7", ch, NULL, victim, TO_CHAR);
if (IS_AFFECTED (victim, AFF_FAERIE_FIRE))
act ("\x1B[1;35m...$N's body is outlined for easy targeting!\x1B[0m", ch, NULL, victim, TO_CHAR);
if (IS_AFFECTED_EXTRA(victim, AFF_MANASHIELD))
act ("$3...$N is $1p$Br$R$3o$Bt$7e$3c$R$3t$B$1e$R$1d$R by a $B$0m$R$7a$Bn$0a$R $1s$B$0h$R$7i$Be$R$7l$1d$R!", ch, NULL, victim, TO_CHAR);
if (IS_AFFECTED (victim, AFF_FLYING))
{
if (IS_MOB(victim))
{
if(victim->pIndexData->mobtype == MOB_BIRD || victim->pIndexData->mobtype == MOB_DRAGON)
act ("\x1B[0;1;35m...$N is flying around here.\x1B[0m", ch, NULL, victim, TO_CHAR);
else
act ("\x1B[0;1;35m...$N is flying around here.\x1B[0m", ch, NULL, victim, TO_CHAR);
}
else
{
if (IS_SET(race_info[victim->pcdata->race].affect_bits, AFF_FLYING))
act ("\x1B[0;1;35m...$N is flying in the air.\x1B[0m", ch, NULL, victim, TO_CHAR);
else
act ("\x1B[0;1;35m...$N is flying in the air.\x1B[0m", ch,
NULL, victim, TO_CHAR);
}
}
return;
}
return;
}
void
show_char_to_char_1 (CHAR_DATA * victim, CHAR_DATA * ch)
{
char buf[STD_LENGTH];
SINGLE_OBJECT *obj;
int iWear;
int percent, percent2;
bool found;
if (IS_PLAYER (ch) && IS_PLAYER (victim))
{
send_to_char (victim->pcdata->name, ch);
if (LEVEL (victim) < 10)
send_to_char (" is a experienced of the \x1B[1m", ch);
else if (LEVEL (victim) < 25)
send_to_char (" is a member of the \x1B[1m", ch);
else if (LEVEL (victim) < 45)
send_to_char (" is well-respected amongst the \x1B[1m", ch);
else if (LEVEL (victim) < 70)
send_to_char (" is a hero amongst the \x1B[1m", ch);
else if (LEVEL (victim) < 75)
send_to_char (" is a legend amongst the \x1B[1m", ch);
else if (LEVEL (victim) < 80)
send_to_char (" is a avatar amongst the \x1B[1m", ch);
else if (LEVEL (victim) < 90)
send_to_char (" is a warlord amongst the \x1b[1m", ch);
else if (LEVEL (victim) < 91)
send_to_char (" is a warlord amongst the \x1b[1m", ch);
else
send_to_char (" is an Immortal who belongs to the \x1B[1m", ch);
send_to_char (race_info[victim->pcdata->race].name, ch);
send_to_char ("\x1B[0m race.\n\r", ch);
}
if (victim == ch)
{
sprintf (buf, "You are %d\' %d\" tall.", ch->height / 12, ch->height % 12);
}
else
{
sprintf (buf, "$E is");
if (ch->height > victim->height)
strcat (buf, " shorter than you.");
else if (ch->height < victim->height)
strcat (buf, " taller than you.");
else
strcat (buf, " the same height as you.");
}
act (buf, ch, NULL, victim, TO_CHAR);
if (DSC(victim) && DSC (victim)[0] != '\0' && !FIGHTING(ch))
{
send_to_char (DSC (victim), ch);
}
else
{
act ("You don't see anything special about $M.", ch, NULL, victim, TO_CHAR);
}
if (victim->max_hit > 0)
percent = (100 * victim->hit) / victim->max_hit;
else
percent = 0;
if (victim->max_move > 0)
percent2 = (100 * victim->move) / victim->max_move;
else
percent2 = 0;
send_to_char ("\n\r", ch);
if (percent > 100)
percent = 100;
if (percent2 > 100)
percent2 = 100;
if (percent2 < 1) percent2=1;
strcpy (buf, PERS (victim, ch));
if (percent > 0)
sprintf (buf, " %s %s and looks %s.\n\r", capitalize (PERS (victim, ch)),
percent_ded[percent/10],
percent_tired[percent2 / 10]);
else
sprintf (buf, " %s is \x1B[34mmortally wounded\x1B[0m.\n\r",
capitalize (PERS (victim, ch)));
send_to_char (buf, ch);
{
found = FALSE;
for (iWear = 0; iWear < MAX_WEAR; iWear++)
{
if ((obj = get_eq_char (victim, iWear)) != NULL
&& can_see_obj (ch, obj))
{
if (!found)
{
send_to_char ("\n\r", ch);
act ("$N is using:", ch, NULL, victim, TO_CHAR);
found = TRUE;
}
send_to_char (where_name[iWear], ch);
send_to_char (format_obj_to (obj, ch, TRUE), ch);
send_to_char ("\x1B[0m", ch);
}
}
}
if (victim != ch
&& ((IS_PLAYER (ch) && number_percent () < ch->pcdata->learned[gsn_peek]) || IS_IMMORTAL (ch)))
{
send_to_char ("\n\rYou peek at the inventory:\n\r", ch);
if (tally_coins (victim) > 0)
{
char tttt[500];
sprintf (tttt, "%s coins.\n\r", name_amount (tally_coins (victim)));
send_to_char (tttt, ch);
}
show_list_to_char (victim->carrying, ch, TRUE, FALSE);
if (number_range (1, 500) == 23)
skill_gain (ch, gsn_peek, FALSE);
}
return;
}
bool
check_blind (CHAR_DATA * ch)
{
if (IS_PLAYER (ch) && IS_SET (ch->act, PLR_HOLYLIGHT))
return TRUE;
if (IS_AFFECTED (ch, AFF_BLIND))
{
send_to_char ("\x1B[33mYou can't see a thing!\x1B[0m\n\r", ch);
return FALSE;
}
return TRUE;
}
void
do_glance (CHAR_DATA * ch, char *argy)
{
char buf[STD_LENGTH];
CHAR_DATA *victim;
int percent, percent2;
DEFINE_COMMAND ("glance", do_glance, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to glance at the condition of a player or mob.")
if (ch->position < POSITION_SLEEPING)
{
send_to_char ("\x1B[1mYou can't see anything but stars!\x1B[0m\n\r", ch);
return;
}
if (ch->position == POSITION_SLEEPING)
{
send_to_char ("\x1B[1;30mYou can't see anything, you're sleeping!\x1B[0m\n\r", ch);
return;
}
if (!check_blind (ch))
return;
if (IS_PLAYER (ch)
&& !IS_SET (ch->act, PLR_HOLYLIGHT)
&& (room_is_dark (ch->in_room) && !IS_AFFECTED (ch, AFF_INFRARED)))
{
send_to_char ("\x1B[1;30mIt is pitch black ... \x1B[0m\n\r", ch);
if (ch->in_room && ch->in_room->more) show_char_to_char (ch->in_room->more->people, ch);
return;
}
if ((victim = get_char_room (ch, argy)) != NULL)
{
if (victim->max_hit > 0)
percent = (100 * victim->hit) / victim->max_hit;
else
percent = -1;
if (victim->max_move > 0)
percent2 = (100 * victim->move) / victim->max_move;
else
percent2 = 0;
if (percent > 100)
percent = 100;
if (percent2 > 100)
percent2 = 100;
if (percent2 < 1) percent2=1;
strcpy (buf, PERS (victim, ch));
if (percent > 0)
sprintf (buf, "%s %s and looks %s.\n\r", capitalize (PERS (victim, ch)),
percent_ded[percent / 10],
percent_tired[percent2 / 10]);
else
sprintf (buf, " %s is \x1B[34mmortally wounded\x1B[0m.\n\r",
capitalize (PERS (victim, ch)));
send_to_char (buf, ch);
}
return;
}
/*
do_scan looks in all directions for mobs/players
This uses a char boolean ch->scanning
*/
void
do_scan (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("scan", do_scan, POSITION_RESTING, 0, LOG_NEVER, "This command allows you to scan your surroundings and find players/creatures that are nearby.")
check_ced (ch);
if (IS_PLAYER(ch) && !str_cmp(argy, "refresh") && !IS_AFFECTED(ch,
AFF_BLIND) && IS_AFFECTED(ch, AFF_INFRARED) && IS_SET(ch->pcdata->act2,
PLR_MAPPING))
{
char buf[SML_LENGTH];
sprintf(buf, "\x1b[%d;%dr", MAP_HEIGHT, ch->pcdata->pagelen);
send_to_char(buf, ch);
ch->pcdata->x = MAP_WIDTH/2;
ch->pcdata->y = MAP_HEIGHT/2;
small_map(ch);
sprintf(buf, "\x1B[%d;1f", ch->pcdata->pagelen);
send_to_char(buf, ch);
WAIT_STATE(ch, PULSE_VIOLENCE);
return;
}
ch->ced->scanning = TRUE;
send_to_char ("You scan all four directions around you:\n\r\n\r", ch);
do_look (ch, "n");
do_look (ch, "e");
do_look (ch, "s");
do_look (ch, "w");
do_look (ch, "u");
do_look (ch, "d");
ch->ced->scanning = FALSE;
return;
}
void
do_silentscan (CHAR_DATA * ch, int followers)
{
return;
if (IS_MOB(ch)) return;
check_ced(ch);
ch->ced->scanning = TRUE;
scan_direction2 (ch, 0, followers);
scan_direction2 (ch, 1, followers);
scan_direction2 (ch, 2, followers);
scan_direction2 (ch, 3, followers);
/* scan_direction2 (ch, 4, followers);
scan_direction2 (ch, 5, followers);*/
ch->ced->scanning = FALSE;
return;
}
int
GET_DAMROLL (CHAR_DATA * ch)
{
return (ch->damroll + add_damroll (ch) + str_app[get_curr_str(ch)].dam);
}
int
GET_HITROLL (CHAR_DATA * ch)
{
return (ch->hitroll + add_hitroll (ch) + (get_curr_dex(ch)*3/2));
}
int
add_damroll (CHAR_DATA * ch)
{
return 0;
return 0;
if (ch->in_room->sector_type >= SECT_CAVE || IS_SET(ch->in_room->room_flags, ROOM_UNDERGROUND))
return 4;
if (IS_SET (ch->in_room->room_flags, ROOM_INDOORS))
return 2;
if (weather_info.sunlight > SUN_DARK)
{
if (weather_info.sky > SKY_CLOUDLESS)
return -2;
else
return -7;
}
return 4;
}
int
add_hitroll (CHAR_DATA * ch)
{
return 0;
if (ch->in_room->sector_type >= SECT_CAVE || IS_SET(ch->in_room->room_flags, ROOM_UNDERGROUND))
return 8;
if (IS_SET (ch->in_room->room_flags, ROOM_INDOORS))
return 4;
if (weather_info.sunlight > SUN_DARK)
{
if (weather_info.sky > SKY_CLOUDLESS)
return -5;
else
return -13;
}
return 8;
}
void
do_look (CHAR_DATA * ch, char *argy)
{
char buf[STD_LENGTH];
char arg1[SML_LENGTH];
char arg2[SML_LENGTH];
char buff[SML_LENGTH];
EXIT_DATA *pexit;
CHAR_DATA *victim;
SINGLE_OBJECT *obj;
char *pdesc;
int door;
int count, number;
DEFINE_COMMAND ("look", do_look, POSITION_RESTING, 0, LOG_NORMAL, "This command enables you to look at your surroundings, at or in an object, or in a direction.")
/*Handles message boards if the character likes READ instead of NOTE */
if (!ch->in_room) {
fprintf(stderr,"%s null room: look.\n",NAME(ch));
return;
}
if (argy != '\0' && is_number (argy))
{
char buffie[25];
sprintf (buffie, "read %d", atoi (argy));
do_note (ch, buffie);
return;
}
if (IS_PLAYER (ch) && (!str_cmp (argy, "at board") || !str_cmp (argy, "board")))
{
do_note (ch, "list");
return;
}
buf[0] = '\0';
if (ch->position < POSITION_SLEEPING)
{
send_to_char ("\x1B[1mYou can't see anything but stars!\x1B[0m\n\r", ch);
return;
}
if (ch->position == POSITION_SLEEPING)
{
send_to_char ("\x1B[1;30mYou can't see anything, you're sleeping!\x1B[0m\n\r", ch);
return;
}
if (!check_blind (ch))
return;
if (weather_info.sky == SKY_FOGGY
&& number_bits (2) != 0
&& IS_OUTSIDE (ch)
&& !IS_SET (ch->act, PLR_HOLYLIGHT) && !IS_AFFECTED_EXTRA(ch, AFF_DET_FOG))
{
send_to_char ("It's hard to see through this fog.\n\r", ch);
return;
}
argy = one_argy (argy, arg1);
if (str_cmp (arg1, "in") && str_cmp (arg1, "i") && str_cmp (arg1, "inside"))
while (str_cmp (arg1, "in") && argy != "" && argy[0] != '\0')
argy = one_argy (argy, arg1);
argy = one_argy (argy, arg2);
while (argy != "" && argy[0] != '\0')
argy = one_argy (argy, arg2);
if (!str_cmp (arg1, "n") ||
!str_cmp (arg1, "w") ||
!str_cmp (arg1, "e") ||
!str_cmp (arg1, "s") ||
!str_cmp (arg1, "north") ||
!str_cmp (arg1, "south") ||
!str_cmp (arg1, "east") ||
!str_cmp (arg1, "west") ||
!str_cmp (arg1, "up") ||
!str_cmp (arg1, "down") ||
!str_cmp (arg1, "u") ||
!str_cmp (arg1, "d"))
goto lookdirection;
if (IS_PLAYER (ch)
&& !IS_SET (ch->act, PLR_HOLYLIGHT)
&& room_is_dark (ch->in_room) && !IS_AFFECTED (ch, AFF_INFRARED))
{
send_to_char ("\x1B[1;30mIt is pitch black ... \x1B[0m\n\r", ch);
return;
}
if (arg1[0] == '\0' || !str_cmp (arg1, "auto"))
{
sprintf(buff, "\x1b[1;37m%s \x1b[1;34m[%s%s\x1b[1;34m/", show_room_name (ch, ch->in_room->name), sectors[ch->in_room->sector_type].color, sectors[ch->in_room->sector_type].name_seen);
if (ch->in_room->sector_type >= SECT_CAVE||IS_SET(ch->in_room->room_flags, ROOM_UNDERGROUND))
strcat (buff, "\x1b[1;30mUnderground\x1b[34m]\x1b[0;37m\n\r");
else if (IS_SET (ch->in_room->room_flags, ROOM_INDOORS))
strcat (buff, "\x1b[0;33mIndoors\x1b[34m]\x1b[0;37m\n\r");
else if (weather_info.sunlight > SUN_DARK)
{
if (weather_info.sky > SKY_CLOUDLESS)
{
switch (weather_info.sky)
{
case SKY_RAINING:
strcat (buff, "Raining]\x1b[0;37m\n\r");
break;
case SKY_FOGGY:
strcat (buff, "\x1b[0;36mFoggy\x1b[34m]\x1b[0;37m\n\r");
break;
case SKY_LIGHTNING:
strcat (buff, "\x1b[1;33mLi\x1b[0;33mghtni\x1b[1;33mng\x1b[34m]\x1b[0;37m\n\r");
break;
case SKY_CLOUDY:
strcat (buff, "\x1b[0;37mOvercast\x1b[34m]\x1b[0;37m\n\r");
break;
}
}
else if (ch->in_room->shade)
strcat (buff, "\x1b[30mShaded\x1b[34m]\x1b[0;37m\n\r");
else
{
switch (weather_info.sunlight)
{
case SUN_RISE:
strcat (buff, "\x1b[31mSunrise\x1b[34m]\x1b[0;37m\n\r");
break;
case SUN_MORNING:
strcat (buff, "\x1b[33mMorning\x1b[34m]\x1b[0;37m\n\r");
break;
case SUN_MIDDAY:
strcat (buff, "\x1b[33mMidday\x1b[34m]\x1b[0;37m\n\r");
break;
case SUN_AFTERNOON:
strcat (buff, "\x1b[33mAfternoon\x1b[34m]\x1b[0;37m\n\r");
break;
case SUN_EVENING:
strcat (buff, "\x1b[33mEvening\x1b[34m]\x1b[0;37m\n\r");
break;
case SUN_SET:
strcat (buff, "\x1b[31mSunset\x1b[34m]\x1b[0;37m\n\r");
break;
}
}
}
else
{
if (weather_info.sky == SKY_LIGHTNING)
strcat(buff, "\x1b[33mLightning\x1b[34m/\x1b[30mNight\x1b[34m]\x1b[0;37m\n\r");
else if (weather_info.sky == SKY_RAINING)
strcat (buff, "Raining/\x1b[30mNight\x1b[34m]\x1b[0;37m\n\r");
else
strcat (buff, "\x1b[30mNight\x1b[34m]\x1b[0;37m\n\r");
}
send_to_char(buff, ch);
if (arg1[0] == '\0' || (IS_PLAYER (ch) &&
!IS_SET (ch->pcdata->act2, PLR_BRIEF)))
send_to_char (ch->in_room->description, ch);
if (IS_PLAYER (ch) && IS_SET (ch->pcdata->act2, PLR_AUTOEXIT))
{
ansi_color (BOLD, ch);
ansi_color (BLUE, ch);
do_exits (ch, "auto");
ansi_color (NTEXT, ch);
}
if(ch->in_room->blood > 0)
{
int i;
char bufg[1000];
char buff[100];
sprintf(bufg, "\x1b[0;31m");
for (i = 0; i < 6; i++)
{
if (IS_SET(ch->in_room->blood, blood_number[i]))
{
sprintf(buff, "There is a trail of blood leading \x1b[1;31m%s\x1b[0;31m.\n\r", dir_name[i]);
strcat(bufg, buff);
}
}
strcat(bufg, "\x1b[0;37m");
send_to_char(bufg, ch);
}
if (ch->in_room->more->contents)
{
ansi_color (NTEXT, ch);
ansi_color (CYAN, ch);
}
if (ch->in_room->more->gold > 0 || ch->in_room->more->copper > 0)
{
char bufff[500];
if (ch->in_room->more->gold > 0 && ch->in_room->more->copper == 0)
{
sprintf (bufff, "\x1B[37;0mThere %s %d \x1B[1;33mgold\x1B[37;0m coin%s here.\x1B[37;0m\n\r",
(ch->in_room->more->gold > 1 ? "are" : "is"), ch->in_room->more->gold,
(ch->in_room->more->gold > 1 ? "s" : ""));
}
else if (ch->in_room->more->gold == 0 && ch->in_room->more->copper > 0)
{
sprintf (bufff, "\x1B[37;0mThere %s %d \x1B[33;0mcopper\x1B[37;0m coin%s here.\x1B[37;0m\n\r",
(ch->in_room->more->copper > 1 ? "are" : "is"), ch->in_room->more->copper,
(ch->in_room->more->copper > 1 ? "s" : ""));
}
else if (ch->in_room->more->gold > 0 && ch->in_room->more->copper > 0)
{
sprintf (bufff, "\x1B[37;0mThere %s %d \x1B[1;33mgold\x1B[37;0m coin%s and %d \x1B[33;0mcopper\x1B[37;0m coin%s here.\x1B[37;0m\n\r",
(ch->in_room->more->gold > 1 ? "are" : "is"), ch->in_room->more->gold,
(ch->in_room->more->gold > 1 ? "s" : ""), ch->in_room->more->copper,
(ch->in_room->more->copper > 1 ? "s" : ""));
}
send_to_char (bufff, ch);
}
show_list_to_char (ch->in_room->more->contents, ch, FALSE, FALSE);
show_char_to_char (ch->in_room->more->people, ch);
if (arg1[0]=='\0' || (ch->in_room && ch->in_room->more &&
(ch->in_room->more->contents || ch->in_room->more->people!=ch ||
ch->in_room->more->people->next_in_room))) {
send_to_char ("\x1B[37;0m", ch);
}
return;
}
if (!str_cmp (arg1, "i") || !str_cmp (arg1, "in") || !str_cmp (arg1, "inside"))
{
/* 'look in' */
if (arg2[0] == '\0')
{
send_to_char ("Look in what?\n\r", ch);
return;
}
if ((obj = get_obj_here (ch, arg2, SEARCH_INV_FIRST)) == NULL)
{
send_to_char ("You do not see that here.\n\r", ch);
return;
}
switch (obj->pIndexData->item_type)
{
default:
send_to_char ("That is not a container.\n\r", ch);
break;
case ITEM_LIGHT:
{
I_LIGHT *light = (I_LIGHT *) obj->more;
if (obj->carried_by && obj->wear_loc == WEAR_NONE)
send_to_char ("(In Inventory) ", ch);
if (obj->carried_by && obj->wear_loc != WEAR_NONE)
send_to_char ("(Equipped) ", ch);
if (!obj->carried_by)
send_to_char ("(On the Ground) ", ch);
if (light->max_light != 0)
{
int percent = PERCENTAGE (light->light_now, light->max_light);
if (light->light_now <= 0)
{
send_to_char ("It is empty.\n\r", ch);
break;
}
else
{
sprintf (buf, "It's %s of fuel.\n\r",
percent < 10 ? "almost empty" :
percent < 40 ? "less than half full" :
percent < 60 ? "half full" :
percent < 90 ? "more than half" : "full");
send_to_char (buf, ch);
}
}
else
send_to_char ("It contains nothing.\n\r", ch);
break;
}
case ITEM_DRINK_CON:
{
I_DRINK *dr = (I_DRINK *) obj->more;
if (obj->carried_by && obj->wear_loc == WEAR_NONE)
send_to_char ("(In Inventory) ", ch);
if (obj->carried_by && obj->wear_loc != WEAR_NONE)
send_to_char ("(Equipped) ", ch);
if (!obj->carried_by)
send_to_char ("(On the Ground) ", ch);
if (dr->liquid_now <= 0)
{
send_to_char ("It is empty.\n\r", ch);
break;
}
else
{
int percent = PERCENTAGE (dr->liquid_now, dr->max_liquid);
if (dr->liquid_type == -1)
{
if (obj->carried_by && obj->wear_loc == WEAR_NONE)
send_to_char ("(In Inventory) ", ch);
if (obj->carried_by && obj->wear_loc != WEAR_NONE)
send_to_char ("(Equipped) ", ch);
if (!obj->carried_by)
send_to_char ("(On the Ground) ", ch);
sprintf (buf, "It's %s of lamp oil.\n\r",
percent < 10 ? "almost empty" :
percent < 40 ? "less than half full" :
percent < 60 ? "half full" :
percent < 70 ? "more than half full" :
"full");
}
else
{
if (obj->carried_by && obj->wear_loc == WEAR_NONE)
send_to_char ("(In Inventory) ", ch);
if (obj->carried_by && obj->wear_loc != WEAR_NONE)
send_to_char ("(Equipped) ", ch);
if (!obj->carried_by)
send_to_char ("(On the Ground) ", ch);
sprintf (buf, "\x1b[0;36mIt's %s of a %s liquid.\x1b[0;37m\n\r",
percent < 10 ? "almost empty" :
percent < 40 ? "less than half full" :
percent < 60 ? "half full" :
percent < 70 ? "more than half full" :
"full",
(dr->liquid_type > 12 ? "ERROR!!" : liq_table[dr->liquid_type].liq_color));
if (percent <= 0)
sprintf (buf, "It's empty.\n\r");
}
send_to_char (buf, ch);
}
break;
}
case ITEM_CONTAINER:
case ITEM_CORPSE_NPC:
case ITEM_CORPSE_PC:
{
I_CONTAINER *con = (I_CONTAINER *) obj->more;
if (obj->carried_by && obj->wear_loc == WEAR_NONE)
send_to_char ("(In Inventory) ", ch);
if (obj->carried_by && obj->wear_loc != WEAR_NONE)
send_to_char ("(Equipped) ", ch);
if (!obj->carried_by)
send_to_char ("(On the Ground) ", ch);
if (IS_SET (con->flags, CONT_CLOSED))
{
send_to_char ("It is closed.\n\r", ch);
break;
}
if (LEVEL (ch) > 109)
{
print_reasons (ch, obj);
}
act ("$p\x1B[0m contains:", ch, obj, NULL, TO_CHAR);
if (con->money > 0)
{
char ttu[500];
sprintf (ttu, "%s coins.\n\r", name_amount (con->money));
send_to_char (ttu, ch);
}
show_list_to_char (obj->contains, ch, TRUE, TRUE);
break;
}
}
return;
}
if ((victim = get_char_room (ch, arg1)) != NULL)
{
show_char_to_char_1 (victim, ch);
if (IS_MOB (victim) && (FIGHTING (victim) == NULL) &&
IS_SET (victim->act, ACT_ATTITUDE) && can_see (victim, ch) &&
IS_AWAKE (victim))
{
do_say (victim, "How dare you look at me! You will die!");
multi_hit (victim, ch, TYPE_UNDEFINED);
}
return;
}
count = number_argy (arg1, arg2);
number = 0;
for (obj = ch->carrying; obj && obj != NULL; obj = obj->next_content)
{
if (can_see_obj (ch, obj))
{
if (is_name (arg2, obj->pIndexData->name))
{
if (++number != count)
continue;
send_to_char ("(This object is in your inventory)\n\r", ch);
if (obj->pIndexData->value[10] != 0)
{
char buf[500];
int i=0;
bool prev=FALSE;
send_to_char ("This item requires the training of the following guilds: \x1B[1;37m", ch);
for (i = 0; str_cmp(guild_data[i].what_you_type,"end_of_list");i ++)
{
if (IS_SET(obj->pIndexData->value[10], guild_data[i].mob_guildmaster_bit))
{
if (prev)
send_to_char("\x1B[0;37m,\x1B[1;37m", ch);
sprintf (buf, guild_data[i].what_you_see);
send_to_char (buf, ch);
prev = TRUE;
}
}
send_to_char ("\x1B[0;37m.\n\r", ch);
}
pdesc = get_extra_descr (arg1, obj->pIndexData->extra_descr);
if (!pdesc && obj->pIndexData->extra_descr && (!str_cmp(obj->pIndexData->name,arg1) ||
!str_cmp(obj->pIndexData->name,arg2)))
pdesc=obj->pIndexData->extra_descr->description;
if (pdesc != NULL)
{
page_to_char (wordwrap(pdesc,79), ch);
}
else
if (pdesc==NULL)
act ("You see nothing special about $p.", ch, obj, ch, TO_CHAR);
return;
}
}
}
for (obj = ch->carrying; obj && obj != NULL; obj = obj->next_content)
{
if (can_see_obj (ch, obj))
{
if (is_approx_name (arg2, obj->pIndexData->name))
{
if (++number != count)
continue;
send_to_char ("(This object is in your inventory)\n\r", ch);
pdesc = get_extra_descr (arg1, obj->pIndexData->extra_descr);
if (pdesc != NULL)
{
page_to_char (pdesc, ch);
return;
}
act ("You see nothing special about $p.", ch, obj, ch, TO_CHAR);
return;
}
}
}
number = 0;
for (obj = ch->in_room->more->contents; obj && obj != NULL; obj = obj->next_content)
{
if (can_see_obj (ch, obj) && !(IS_SET(obj->extra_flags,
ITEM_UNSEEN) && !IS_SET(ch->act, PLR_HOLYLIGHT)))
{
if (is_name (arg2, obj->pIndexData->name))
{
if (++number != count)
continue;
send_to_char ("(This object is in the room)\n\r", ch);
pdesc = get_extra_descr (arg1, obj->pIndexData->extra_descr);
if (pdesc != NULL)
{
page_to_char (pdesc, ch);
return;
}
act ("You don't see anything special about $p.", ch, obj, ch, TO_CHAR);
return;
}
}
}
for (obj = ch->in_room->more->contents; obj && obj != NULL; obj = obj->next_content)
{
if (can_see_obj (ch, obj) && !(IS_SET(obj->extra_flags,
ITEM_UNSEEN) && !IS_SET(ch->act, PLR_HOLYLIGHT)))
{
if (is_approx_name (arg2, obj->pIndexData->name))
{
if (++number != count)
continue;
send_to_char ("(This object is in the room)\n\r", ch);
pdesc = get_extra_descr (arg1, obj->pIndexData->extra_descr);
if (pdesc != NULL)
{
page_to_char (pdesc, ch);
return;
}
act ("You don't see anything special about $p.", ch, obj, ch, TO_CHAR);
return;
}
}
}
pdesc = NULL;
if (ch->in_room->more)
pdesc = get_extra_descr (arg1, ch->in_room->more->extra_descr);
if (pdesc != NULL)
{
page_to_char (pdesc, ch);
return;
}
send_to_char ("You do not see that here.\n\r", ch);
return;
lookdirection:
if (!str_cmp (arg1, "n") || !str_cmp (arg1, "north"))
door = 0;
else if (!str_cmp (arg1, "e") || !str_cmp (arg1, "east"))
door = 1;
else if (!str_cmp (arg1, "s") || !str_cmp (arg1, "south"))
door = 2;
else if (!str_cmp (arg1, "w") || !str_cmp (arg1, "west"))
door = 3;
else if (!str_cmp (arg1, "u") || !str_cmp (arg1, "up"))
door = 4;
else if (!str_cmp (arg1, "d") || !str_cmp (arg1, "down"))
door = 5;
else
{
send_to_char ("You can't look that way.\n\r", ch);
return;
}
/* 'look direction' */
if ((pexit = ch->in_room->exit[door]) == NULL)
{
if (!ch->ced || !ch->ced->scanning)
send_to_char ("You do not see anything in that direction.\n\r", ch);
return;
}
if (!ch->ced || !ch->ced->scanning)
{
if (pexit->d_info && pexit->d_info->str < 0)
{
send_to_char ("There used to be a door there, but now it's just rubble.\n\r",
ch);
goto doscan;
}
if (pexit->d_info && pexit->d_info->description != NULL && pexit->d_info->description[0] != '\0')
{
char *t;
char ed[20];
int ct = 0;
for (t = pexit->d_info->description; *t != '\0' && ct < 20; t++)
{
if (*t != '\n' && *t != '\r')
{
ed[ct] = *t;
ct++;
}
}
ed[ct] = '\0';
if (is_number (ed))
{
int lvnum;
ROOM_DATA *lr;
lvnum = atoi (ed);
if ((lr = get_room_index (lvnum)) != NULL)
{
char ttt[200];
send_to_char ("You look and see........\n\r", ch);
sprintf (ttt, "%d look", lvnum);
do_at (ch, ttt);
}
}
else
send_to_char (pexit->d_info->description, ch);
}
else
send_to_char ("You do not see anything in that direction.\n\r", ch);
if ((ROOM_DATA *) pexit->to_room == NULL)
return;
if (pexit->d_info && pexit->d_info->keyword != NULL
&& pexit->d_info->keyword[0] != '\0'
&& pexit->d_info->keyword[0] != ' ')
{
}
/*end if sc->scanning */
if (pexit->d_info && IS_SET (pexit->d_info->exit_info, EX_HIDDEN) && IS_SET (pexit->d_info->exit_info, EX_CLOSED))
{
return;
}
if (!ch->ced || !ch->ced->scanning)
{
if (pexit->d_info && IS_SET (pexit->d_info->exit_info, EX_CLOSED) && pexit->d_info->keyword != NULL && pexit->d_info->keyword[0] != '\0')
{
act ("The $T\x1B[0m is closed.", ch, NULL, pexit->d_info->keyword, TO_CHAR);
if (!str_cmp ("door", pexit->d_info->keyword) || !str_prefix ("door", pexit->d_info->keyword)
|| !str_suffix ("door", pexit->d_info->keyword))
{
if (pexit->d_info->str > 50)
send_to_char ("The door looks impenetrable!\n\r", ch);
else if (pexit->d_info->str > 40)
send_to_char ("The door looks very solid!\n\r", ch);
else if (pexit->d_info->str > 30)
send_to_char ("The door could hold up pretty well.\n\r", ch);
else if (pexit->d_info->str > 20)
send_to_char ("It wouldn't take a big man long to break.\n\r", ch);
else if (pexit->d_info->str > 10)
send_to_char ("What could this thing keep out?!\n\r", ch);
else
send_to_char ("You call that a door?!?!\n\r", ch);
return;
}
}
else if (pexit->d_info && IS_SET (pexit->d_info->exit_info, EX_ISDOOR) && pexit->d_info->keyword != NULL && pexit->d_info->keyword[0] != '\0')
{
act ("The $T\x1B[0m is open.", ch, NULL, pexit->d_info->keyword, TO_CHAR);
act ("As you peer for signs of life, you find that you cannot make out any\n\rlifeforms due to the limited line of sight behind the open $T.", ch, NULL, pexit->d_info->keyword, TO_CHAR);
return;
}
}
else
{
if (pexit && (ROOM_DATA *) pexit->to_room != NULL)
scan_direction (ch, door);
return;
}
}
/*end if !ch->scanning */
doscan:
if ((ROOM_DATA *) pexit->to_room != NULL)
scan_direction (ch, door);
return;
}
void
do_examine (CHAR_DATA * ch, char *argy)
{
char buf[STD_LENGTH];
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
DEFINE_COMMAND ("examine", do_examine, POSITION_RESTING, 0, LOG_NORMAL, "This command first looks at an object, then looks in the object.")
one_argy (argy, arg);
if (arg[0] == '\0')
{
send_to_char ("Examine what?\n\r", ch);
return;
}
if ((obj = get_obj_wear (ch, arg)) != NULL)
{
do_look (ch, obj->pIndexData->name);
switch (obj->pIndexData->item_type)
{
default:
break;
case ITEM_LIGHT:
{
I_LIGHT *light = (I_LIGHT *) obj->more;
if (light->max_light != 0)
{
int percent = PERCENTAGE (light->light_now, light->max_light);
sprintf (buf, "\n\r%s\x1B[0m %s %s\n\r",
capitalize (OOSTR (obj, short_descr)),
is_are (OOSTR (obj, short_descr)),
!IS_LIT (obj) ? "extinguished." :
percent < 10 ? "flickering and sputtering." :
percent < 20 ? "flickering." :
percent < 30 ? "flickering slightly." :
percent < 40 ? "providing ample light." :
"glowing brightly.");
send_to_char (buf, ch);
}
break;
}
case ITEM_GEM:
{
I_GEM *gem = (I_GEM *) obj->more;
if (gem->mana_now)
{
int percent;
percent = gem->mana_now;
sprintf (buf, "\n\r%s\x1B[0m %s\n\r",
capitalize (OOSTR (obj, short_descr)),
percent < 10 ? "is nearly drained." :
percent < 30 ? "glows softly." :
percent < 50 ? "glows with moderate energy." :
percent < 70 ? "glows brightly." :
percent < 90 ? "blinds you with its intense glow." :
percent < 110 ? "radiates with a powerful energy." :
"glows with an amazing white light.");
send_to_char (buf, ch);
return;
}
break;
}
case ITEM_CONTAINER:
{
I_CONTAINER *con = (I_CONTAINER *)obj->more;
if (IS_SET(con->flags, CONT_HASTRAP) && IS_PLAYER(ch) &&
number_range(1,140) <ch->pcdata->learned[gsn_locate_trap])
{
send_to_char("That container appears to be trapped.\n\r", ch);
return;
}
send_to_char ("(Equipped) You look inside and see:\n\r", ch);
sprintf (buf, "in %s", arg);
do_look (ch, buf);
}
break;
case ITEM_DRINK_CON:
case ITEM_CORPSE_NPC:
case ITEM_CORPSE_PC:
send_to_char ("(Equipped) You look inside and see:\n\r", ch);
sprintf (buf, "in %s", arg);
do_look (ch, buf);
}
return;
}
if ((obj = get_obj_here (ch, arg, SEARCH_INV_FIRST)) != NULL)
{
do_look (ch, obj->pIndexData->name);
switch (obj->pIndexData->item_type)
{
default:
break;
case ITEM_DRINK_CON:
case ITEM_CORPSE_NPC:
case ITEM_CORPSE_PC:
if (obj->carried_by)
send_to_char ("\x1B[37;0m(In Inventory) You look inside and see:\n\r", ch);
else
send_to_char ("\x1B[37;0m(On the Ground) You look inside and see:\n\r", ch);
sprintf (buf, "in %s", arg);
do_look (ch, buf);
break;
case ITEM_CONTAINER:
{
I_CONTAINER *con = (I_CONTAINER *)obj->more;
if (IS_SET(con->flags, CONT_HASTRAP) && IS_PLAYER(ch) &&
number_range(1,140) <ch->pcdata->learned[gsn_locate_trap])
{
send_to_char("That container appears to be trapped.\n\r", ch);
return;
}
if (obj->carried_by)
send_to_char ("\x1B[37;0m(In Inventory) You look inside and see:\n\r", ch);
else
send_to_char ("\x1B[37;0m(On the Ground) You look inside and see:\n\r", ch);
sprintf (buf, "in %s", arg);
do_look (ch, buf);
break;
}
}
return;
}
do_look (ch, arg);
return;
}
void
do_dir (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("dir", do_dir, POSITION_RESTING, 0, LOG_NORMAL, "See 'exits'.")
do_exits (ch, argy);
return;
}
void
do_exits (CHAR_DATA * ch, char *argy)
{
extern char *const dir_name[];
char buf[STD_LENGTH];
char buf1[50];
EXIT_DATA *pexit;
bool found;
bool fAuto;
int door;
ROOM_DATA *troom;
DEFINE_COMMAND ("exits", do_exits, POSITION_RESTING, 0, LOG_NORMAL, "This displays the available exit directions. It may not show doors or unaccessable exits.")
buf[0] = '\0';
fAuto = !str_cmp (argy, "auto");
if (!check_blind (ch))
return;
strcpy (buf, fAuto ? "\r \x1b[1;34m[Exits:" : "Obvious exits:\x1b[0;37m\n\r");
found = FALSE;
for (door = 0; door <= 5; door++)
{
if ((pexit = ch->in_room->exit[door]) != NULL
&& (troom = (ROOM_DATA *) pexit->to_room) != NULL)
{
if (fAuto)
{
switch(troom->sector_type)
{
case SECT_AIR:
case SECT_CLOUDS:
{
char buf1[50];
if (IS_AFFECTED (ch, AFF_FLYING) || IS_SET (ch->act, PLR_HOLYWALK))
{
sprintf (buf1, " <%s>", dir_name[door]);
found = TRUE;
strcat (buf, buf1);
}
else if (IS_SET (troom->room_flags2, ROOM2_FALLSFAST))
{
sprintf(buf1, " %s", dir_name[door]);
found = TRUE;
strcat (buf, buf1);
}
}
break;
case SECT_WATER_SWIM:
case SECT_WATER_NOSWIM:
{
sprintf (buf1, " /%s\\", dir_name[door]);
found = TRUE;
strcat (buf, buf1);
}
break;
case SECT_UNDERWATER:
{
if (IS_AFFECTED (ch, AFF_BREATH_WATER) || IS_SET (ch->act, PLR_HOLYWALK) || IS_SET(ch->act, PLR_HAS_SCUBA))
{
if (pexit->d_info && IS_SET (pexit->d_info->exit_info, EX_CLOSED) && IS_SET(pexit->d_info->exit_info, EX_ISDOOR))
sprintf (buf1, " {[%s]}", dir_name[door]);
else
sprintf (buf1, " {%s}", dir_name[door]);
found = TRUE;
strcat (buf, buf1);
}
}
break;
default:
if (pexit->d_info &&
IS_SET (pexit->d_info->exit_info, EX_ISDOOR) &&
IS_SET(pexit->d_info->exit_info, EX_CLOSED))
{
if (IS_SET(pexit->d_info->exit_info, EX_HIDDEN))
{
if (IS_SET(ch->act, PLR_HOLYLIGHT))
{
found = TRUE;
sprintf (buf1, " (%s)", dir_name[door]);
strcat (buf, buf1);
}
}
else
{
found = TRUE;
sprintf (buf1, " [%s]", dir_name[door]);
strcat (buf, buf1);
}
}
else
{
sprintf(buf1, " %s", dir_name[door]);
found = TRUE;
strcat (buf, buf1);
}
break;
}
}
else
{
if (!pexit->d_info
|| !IS_SET (pexit->d_info->exit_info, EX_CLOSED)
|| IS_SET (ch->act, PLR_HOLYLIGHT))
{
found = TRUE;
sprintf (buf + strlen (buf), "%-5s - %s\n\r", capitalize (dir_name[door]), (!IS_SET (ch->act, PLR_HOLYLIGHT) && room_is_dark (troom)) ? "Too dark to tell" : (show_room_name (ch, (troom->name))));
}
}
}
}
if (!found)
strcat (buf, fAuto ? " none" : "None.\n\r");
if (fAuto)
strcat (buf, "]\n\r");
send_to_char (buf, ch);
return;
}
void
do_purse (CHAR_DATA * ch, char *argy)
{
char buffy[500];
int found;
DEFINE_COMMAND ("purse", do_purse, POSITION_SLEEPING, 0, LOG_NORMAL, "This command shows a convenient display of the coins you are carrying, and those in your bank.")
sprintf (buffy, "You have \x1B[1;37m%ld\x1B[0m coins in the bank.\n\r", ch->pcdata->bank);
send_to_char (buffy, ch);
send_to_char ("\n\r", ch);
if (!ch->gold && !ch->copper)
{
send_to_char ("You are carrying no coins on your person.\n\r", ch);
return;
}
if (ch->gold > 0)
{
found = 1;
sprintf (buffy, "%d \x1B[1;33mgold\x1B[37;0m coins.\n\r", ch->gold);
send_to_char (buffy, ch);
}
if (ch->copper > 0)
{
found = 1;
sprintf (buffy, "%d \x1B[33;0mcopper\x1B[37;0m coins.\n\r", ch->copper);
send_to_char (buffy, ch);
}
return;
}
void
do_inventory (CHAR_DATA * ch, char *argy)
{
char buffy[1000];
int found;
DEFINE_COMMAND ("inventory", do_inventory, POSITION_DEAD, 0, LOG_NORMAL, "This command shows what is currently in your inventory.")
inventory=TRUE;
send_to_char ("You are carrying:\n\r", ch);
found = 0;
if (ch->gold > 0)
{
found = 1;
sprintf (buffy, "%d \x1B[1;33mgold\x1B[37;0m coins.\n\r", ch->gold);
send_to_char (buffy, ch);
}
if (ch->copper > 0)
{
found = 1;
sprintf (buffy, "%d \x1B[33;0mcopper\x1B[37;0m coins.\n\r", ch->copper);
send_to_char (buffy, ch);
}
show_list_to_char (ch->carrying, ch, TRUE, TRUE);
if (!found && ch->carrying == NULL)
send_to_char (" Nothing.\n\r", ch);
return;
}
void
do_vequipment (CHAR_DATA * ch, char *argy)
{
SINGLE_OBJECT *obj;
int iWear;
bool found;
DEFINE_COMMAND ("vequipment", do_vequipment, POSITION_DEAD, 0, LOG_NORMAL, "This command shows what objects you currently are wearing/have equipped.")
send_to_char ("You are using:\n\r", ch);
found = FALSE;
for (iWear = 0; iWear < MAX_WEAR; iWear++)
{
if ((obj = get_eq_char (ch, iWear)) == NULL)
continue;
send_to_char (where_name[iWear], ch);
if (can_see_obj (ch, obj))
{
send_to_char (format_obj_to (obj, ch, TRUE), ch);
send_to_char ("\x1B[0m", ch);
}
else
{
send_to_char ("\x1B[1;30msomething\x1B[0m.\n\r", ch);
}
found = TRUE;
}
if (!found)
send_to_char (" Nothing.\n\r", ch);
return;
}
void
do_equipment (CHAR_DATA * ch, char *argy)
{
SINGLE_OBJECT *obj;
int iWear;
bool found;
DEFINE_COMMAND ("equipment", do_equipment, POSITION_DEAD, 0, LOG_NORMAL, "This command shows what objects you currently are wearing/have equipped.")
send_to_char ("You are using:\n\r", ch);
found = FALSE;
for (iWear = 0; iWear < MAX_WEAR; iWear++)
{
if ((obj = get_eq_char (ch, iWear)) == NULL)
continue;
send_to_char (where_name[iWear], ch);
if (can_see_obj (ch, obj))
{
send_to_char (format_obj_to (obj, ch, TRUE), ch);
send_to_char ("\x1B[0m", ch);
}
else
{
send_to_char ("\x1B[1;30msomething\x1B[0m.\n\r", ch);
}
found = TRUE;
}
if (!found)
send_to_char (" Nothing.\n\r", ch);
return;
}
void
do_report (CHAR_DATA * ch, char *argy)
{
char buf[SML_LENGTH];
DEFINE_COMMAND ("report", do_report, POSITION_SLEEPING, 0, LOG_NORMAL, "This command reports your condition to the room you're in. It works while asleep as well.")
sprintf (buf, "You report: <%s and I'm %s.> I am also \x1b[0;36ml\x1b[1;36meve\x1b[0;36ml\x1B[37;0m \x1B[1;37m%d\x1B[0;37m, have \x1B[1;31m%ld\x1B[37;0m \x1b[0;31mw\x1b[1;31marpoint\x1b[0;31ms\x1B[37;0m, and \x1b[1;36m%d\x1b[0;37m \x1b[1;36mr\x1b[0;36memort\x1b[1;36ms\x1B[37;0m.",
STRING_HITS (ch), STRING_MOVES (ch),
ch->pcdata->level, ch->pcdata->warpoints, ch->pcdata->remort_times);
send_to_char (buf, ch);
sprintf (buf, "$n reports: <%s and I'm %s.> I am also \x1b[0;36ml\x1b[1;36meve\x1b[0;36ml\x1B[37;0m \x1B[1;37m%d\x1B[0;37m, have \x1B[1;31m%ld\x1B[37;0m \x1b[0;31mw\x1b[1;31marpoint\x1b[0;31ms\x1B[37;0m, and \x1b[1;36m%d\x1b[0;37m \x1b[1;36mr\x1b[0;36memort\x1b[1;36ms\x1B[37;0m.",
STRING_HITS (ch), STRING_MOVES
(ch), ch->pcdata->level, ch->pcdata->warpoints, ch->pcdata->remort_times);
act (buf, ch, NULL, NULL, TO_ROOM);
return;
}
void
do_password (CHAR_DATA * ch, char *argy)
{
char arg1[SML_LENGTH];
char arg2[SML_LENGTH];
char *pArg;
char *pwdnew;
char *p;
char cEnd;
DEFINE_COMMAND ("password", do_password, POSITION_DEAD, 0, LOG_NEVER, "This command allows you to change your password.")
if (IS_MOB (ch))
return;
/*
* Can't use one_argy here because it smashes case.
* So we just steal all its code. Bleagh.
*/
pArg = arg1;
while (isspace (*argy))
argy++;
cEnd = ' ';
if (*argy == '\'' || *argy == '"')
cEnd = *argy++;
while (*argy != '\0')
{
if (*argy == cEnd)
{
argy++;
break;
}
*pArg++ = *argy++;
}
*pArg = '\0';
pArg = arg2;
while (isspace (*argy))
argy++;
cEnd = ' ';
if (*argy == '\'' || *argy == '"')
cEnd = *argy++;
while (*argy != '\0')
{
if (*argy == cEnd)
{
argy++;
break;
}
*pArg++ = *argy++;
}
*pArg = '\0';
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char ("Syntax: password <old> <new>.\n\r", ch);
return;
}
if (strcmp (arg1, ch->pcdata->pwd) &&
strcmp(arg1, ch->pcdata->rpwd))
{
WAIT_STATE (ch, 40);
send_to_char ("Wrong password. Wait 10 seconds.\n\r", ch);
return;
}
if (strlen (arg2) < 5)
{
send_to_char (
"New password must be at least five characters long.\n\r", ch);
return;
}
/*
* No tilde allowed because of player file format.
*/
pwdnew = (arg2, ch->pcdata->name);
for (p = pwdnew; *p != '\0'; p++)
{
if (*p == '~')
{
send_to_char (
"New password not acceptable, try again.\n\r", ch);
return;
}
}
if (ch->pcdata->pwd != NULL)
{
free_string (ch->pcdata->pwd);
}
ch->pcdata->pwd = str_dup (pwdnew);
if (ch->pcdata->rpwd)
free_string(ch->pcdata->rpwd);
ch->pcdata->rpwd = str_dup(arg2);
save_char_obj (ch);
send_to_char ("Ok.\n\r", ch);
return;
}
/*void do_channels( CHAR_DATA *ch, char *argy )
{
char arg[SML_LENGTH];
DEFINE_COMMAND("channels",do_channels,POSITION_DEAD,0,LOG_NORMAL,"This command allows you to toggle channels on/off using channel -name or channel +name.")
one_argy( argy, arg );
if ( arg[0] == '\0' )
{
if ( IS_PLAYER(ch) && IS_SET(ch->act, PLR_SILENCE) )
{
send_to_char( "You are silenced.\n\r", ch );
return;
}
send_to_char( "\x1B[1;33m\n\rChannels:\x1B[37;0m\n\r\n\r", ch );
#ifdef GLOBAL_GOSSIP
send_to_char( !IS_SET(ch->pcdata->deaf, CHANNEL_AUCTION)
? "\x1B[1;37m*\x1B[0mAUCTION - You are listening to the auction channel.\n\r"
: " auction - You are ignoring the auction channel.\n\r",
ch );
#endif
send_to_char( !IS_SET(ch->pcdata->deaf, CHANNEL_NOTIFY)
? "\x1B[1;37m*\x1B[0mNOTIFY - You are listening to the game event notification channel.\n\r"
: " notify - You are ignoring the game event notification channel.\n\r",
ch );
send_to_char( !IS_SET(ch->pcdata->deaf, CHANNEL_CHAT)
? "\x1B[1;37m*\x1B[0mCHAT - You are listening to the chat channel.\n\r"
: " chat - You are ignoring the chat channel.\n\r",
ch );
if ( LEVEL(ch)>=100 )
{
send_to_char( !IS_SET(ch->pcdata->deaf, CHANNEL_IMMTALK)
? "\x1B[1;37m*\x1B[0mIMMTALK - You are listening to immortal talk.\n\r"
: " immtalk - You are ignoring immortal talk.\n\r",
ch );
}
if (clan_number(ch)>0)
{
send_to_char( !IS_SET(ch->pcdata->deaf, CHANNEL_CLANTALK)
? "\x1B[1;37m*\x1B[0mCLANTALK - You are listening to clan telepathy.\n\r"
: " clantalk - You are ignoring clan telepathy.\n\r",
ch );
}
send_to_char( !IS_SET(ch->pcdata->deaf, CHANNEL_YELL)
? "\x1B[1;37m*\x1B[0mYELL - You are listening to yells/gossips.\n\r"
: " yell - You are ignoring yells.\n\r",
ch );
}
else
{
bool fClear;
int bit;
if ( arg[0] == '+' ) fClear = TRUE;
else if ( arg[0] == '-' ) fClear = FALSE;
else
{
send_to_char( "Channels -channel or +channel?\n\r", ch );
return;
}
if ( !str_cmp( arg+1, "chat" ) ) bit = CHANNEL_CHAT;
else if ( !str_cmp( arg+1, "immtalk" ) ) bit = CHANNEL_IMMTALK;
else if ( !str_cmp( arg+1, "auction" ) ) bit = CHANNEL_AUCTION;
else if ( !str_cmp( arg+1, "clantalk" ) ) bit = CHANNEL_CLANTALK;
else if ( !str_cmp( arg+1, "notify" ) ) bit = CHANNEL_NOTIFY;
else if ( !str_cmp( arg+1, "yell" ) ) bit = CHANNEL_YELL;
else
{
send_to_char( "Set or clear which channel?\n\r", ch );
return;
}
if ( fClear )
{
char buf[50];
REMOVE_BIT (ch->pcdata->deaf, bit);
sprintf(buf,"You now are aware of %ss.\n\r",arg+1);
send_to_char(buf,ch);
}
else
{
char buf[50];
SET_BIT (ch->pcdata->deaf, bit);
sprintf(buf,"You now ignore %ss.\n\r",arg+1);
send_to_char(buf,ch);
}
}
return;
}
*/
void
do_actual_search (CHAR_DATA * ch, char *argy)
{
char buf[STD_LENGTH];
SINGLE_OBJECT *obj;
CHAR_DATA *oo;
char arg1[STD_LENGTH];
short door;
int found = 0;
door = -1;
if (IS_MOB (ch))
return;
NEW_POSITION(ch, POSITION_STANDING);
sprintf (buf, "You search the room, but find nothing.\n\r");
if (argy[0] != '\0')
strcpy (arg1, argy);
if (!str_cmp (arg1, "n") || !str_cmp (arg1, "north"))
door = 0;
else if (!str_cmp (arg1, "e") || !str_cmp (arg1, "east"))
door = 1;
else if (!str_cmp (arg1, "s") || !str_cmp (arg1, "south"))
door = 2;
else if (!str_cmp (arg1, "w") || !str_cmp (arg1, "west"))
door = 3;
else if (!str_cmp (arg1, "u") || !str_cmp (arg1, "up"))
door = 4;
else if (!str_cmp (arg1, "d") || !str_cmp (arg1, "down"))
door = 5;
if (door >= 0)
{
/* 'look direction' */
if ((ch->in_room->exit[door]) == NULL)
{
send_to_char ("You see nothing special in that direction.\n\r", ch);
return;
}
if(ch->in_room->exit[door]->d_info && IS_SET(ch->in_room->exit[door]->d_info->exit_info, EX_HASTRAP) && number_range(1,150) < ch->pcdata->learned[gsn_locate_trap])
{
send_to_char("You have detected a trap!\n\r", ch);
}
if (!ch->in_room->exit[door]->d_info || ch->in_room->exit[door]->d_info->keyword == NULL || ch->in_room->exit[door]->d_info->keyword[0] == '\0')
{
send_to_char ("You see nothing special in that direction.\n\r", ch);
return;
}
if (ch->in_room->exit[door]->d_info && !IS_SET (ch->in_room->exit[door]->d_info->exit_info, EX_HIDDEN))
{
arg1[1] = '\0';
do_look (ch, arg1);
return;
}
if (ch->in_room->exit[door]->d_info && ch->in_room->exit[door]->d_info->keyword != NULL && ch->in_room->exit[door]->d_info->keyword[0] != '\0')
if (number_range (0, 120) < UMAX (8, ch->pcdata->learned[gsn_search])
|| dice (1, 500) == 149)
{
sprintf (buf, "You discovered a hidden %s!\n\r", ch->in_room->exit[door]->d_info->keyword);
send_to_char (buf, ch);
return;
}
else
{
sprintf (buf, "You see nothing special in that direction.\n\r");
send_to_char (buf, ch);
return;
}
return;
}
for (obj = ch->in_room->more->contents; obj != NULL; obj = obj->next_content)
{
if (number_range (0, 120) < UMAX (8, ch->pcdata->learned[gsn_search])
&& IS_SET (obj->extra_flags, ITEM_UNSEEN)
&& IS_SET (obj->pIndexData->wear_flags, ITEM_TAKE))
{
sprintf (buf, "You search the room and find %s.\n\r",
OOSTR (obj, short_descr));
send_to_char (buf, ch);
REMOVE_BIT (obj->extra_flags, ITEM_UNSEEN);
get_obj (ch, obj, NULL, FALSE);
skill_gain (ch, gsn_search, FALSE);
found = 1;
return;
}
}
for (door = 0; door < 5; door++)
{
if (number_range (0, 120) > UMAX (15, ch->pcdata->learned[gsn_search] + 10))
continue;
if (ch->in_room->exit[door] != NULL && ch->in_room->exit[door]->d_info && IS_SET (ch->in_room->exit[door]->d_info->exit_info, EX_HIDDEN))
{
send_to_char ("You seem to notice something strange; an exit might be hidden here.\n\r", ch);
send_to_char ("It might be wise to search <direction> to try to find the hidden exit.\n\r", ch);
return;
}
}
for (oo = ch->in_room->more->people; oo != NULL; oo = oo->next_in_room)
if (number_range (0, 120) < UMAX (8, ch->pcdata->learned[gsn_search]))
{
if (IS_AFFECTED (oo, AFF_HIDE) && number_range (1, 2) == 2)
{
act ("$n search the room and finds $N!", ch, NULL, oo, TO_NOTVICT);
act ("You search the room and find $N!", ch, NULL, oo, TO_CHAR);
act ("$n searches the room and finds your hiding spot!", ch, NULL, oo, TO_VICT);
REMOVE_BIT (oo->affected_by, AFF_HIDE);
return;
}
}
if (!found)
send_to_char (buf, ch);
return;
}
void
do_search (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("search", do_search, POSITION_STANDING, 0, LOG_NORMAL, "This command lets you search <direction> or search the room for players and/or hidden obejcts.")
if (IS_MOB (ch))
return;
if (RIDING (ch) != NULL)
{
send_to_char ("You cannot search while riding!\n\r", ch);
return;
}
if (ch->position == POSITION_SEARCHING)
{
send_to_char ("You're already doing a search!\n\r", ch);
return;
}
send_to_char ("You begin to search...\n\r", ch);
act ("$n looks as if $e is searching for something...", ch, NULL, ch, TO_ROOM);
ch->pcdata->tickcounts = 9;
if (strlen (argy) > 30)
return;
check_temp (ch);
if (argy[0] != '\0')
strcpy (ch->pcdata->temp->temp_string, argy);
if (argy[0] == '\0')
ch->pcdata->temp->temp_string[0] = '\0';
NEW_POSITION(ch, POSITION_SEARCHING);
return;
}