#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
AFFECT_DATA *affect_free = NULL;
RESET_DATA *reset_free = NULL;
SCRIPT_DATA *script_free = NULL;
VARIABLE_DATA *variable_free = NULL;
int total_fgt = 0;
void affect_modify (CHAR_DATA * ch, AFFECT_DATA * paf, bool fAdd, short flaggy);
extern char *ans_uppercase (const char *txt);
FGT *
new_fgt (void)
{
FGT *f;
total_fgt++;
f = mem_alloc (sizeof (*f));
f->ears = 2;
f->pos_x=0;
f->pos_y=0;
f->combat_delay_count = -1;
f->next_command=NULL;
return f;
}
void
clear_fgt (CHAR_DATA * ch)
{
if (ch->fgt)
{
if (ch->fgt->hunting)
free_string (ch->fgt->hunting);
if (ch->fgt->next_command) {
free(ch->fgt->next_command);
ch->fgt->next_command=NULL;
}
}
if (ch->fgt)
{
free (ch->fgt);
total_fgt--;
}
ch->fgt = NULL;
return;
}
void
check_fgt (CHAR_DATA * ch)
{
if (!ch->fgt)
ch->fgt = new_fgt ();
return;
}
void
do_coins (CHAR_DATA * ch, char *argy)
{
int coinage;
DEFINE_COMMAND ("coins", do_coins, POSITION_DEAD, 100, LOG_ALWAYS, "Creates the specified amount of coins.")
if (!is_number (argy) || argy[0] == '\0')
{
return;
}
coinage = atoi (argy);
if (coinage > 0 && coinage < 1000000)
create_amount (coinage, ch, NULL, NULL);
return;
}
void
no_spam (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("nospam", no_spam, POSITION_DEAD, 0, LOG_NORMAL, "Toggles between levels of spam.")
if (IS_PLAYER (ch))
{
ch->pcdata->no_spam = 1;
send_to_char ("NoSpam mode ENABLED.\n\r", ch);
send_to_char ("NOTE: You can toggle through the modes using the SPAM command.\n\r", ch);
}
return;
}
void
add_to_aggro_list (CHAR_DATA * ch)
{
CHAR_DATA *c;
if (IS_SET (ch->special, IS_IN_AGGRO_LIST))
return;
for (c = aggro_check; c != NULL; c = c->gen_next)
{
if (c == ch)
return;
}
ch->gen_next = aggro_check;
aggro_check = ch;
SET_BIT (ch->special, IS_IN_AGGRO_LIST);
return;
}
void
spam (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("spam", spam, POSITION_DEAD, 0, LOG_NORMAL, "Turns on nospam mode.")
if (IS_MOB (ch))
return;
if (ch->pcdata->no_spam == 0)
{
send_to_char ("Moderate SPAM mode enabled.\n\r", ch);
ch->pcdata->no_spam = 2;
return;
}
else if (ch->pcdata->no_spam == 1)
{
send_to_char ("FULL SPAM mode enabled.\n\r", ch);
ch->pcdata->no_spam = 0;
return;
}
else
send_to_char ("NO SPAM mode enabled.\n\r", ch);
ch->pcdata->no_spam = 1;
return;
}
int
get_race_look (char *argy)
{
int i;
for (i = 0; i < RACE_COUNT; i++)
{
if (!str_prefix (argy, race_info[i].name))
return (1 << i);
}
if (!str_cmp (argy, "alien"))
return RC_EVILRACE;
if (!str_cmp (argy, evil))
return RC_EVILRACE;
if (!str_cmp (argy, good))
return RC_GOODRACE;
return 0;
}
/*
* Retrieve a character's age.
*/
int
get_age (CHAR_DATA * ch)
{
return 18 + (((ch->pcdata->played / 2) + (((int) (current_time - ch->pcdata->logon)) / 2)) / 7200) / 4;
}
/*
* Retrieve character's current strength.
*/
int
get_curr_str (CHAR_DATA * ch)
{
int max;
int workspace;
max = 30;
if (IS_MOB (ch))
return number_range (15, 29);
workspace = ch->pcdata->perm_str + ch->pcdata->mod_str;
if (pow.penalize_evil_in_sun && ch->in_room && IS_EVIL (ch))
{
if (IN_SUN (ch))
workspace -= 2;
}
return URANGE (3, workspace, max);
}
/*
* Retrieve character's current intelligence.
*/
int
get_curr_int (CHAR_DATA * ch)
{
int max;
int i;
max = 30;
if (IS_MOB (ch))
return number_range (15, 27);
i = URANGE (3, ch->pcdata->perm_int + ch->pcdata->mod_int, max);
if (HAS_HEAD_BRAIN_IMPLANT (ch))
i += 2;
return i;
}
/*
* Retrieve character's current wisdom.
*/
int
get_curr_wis (CHAR_DATA * ch)
{
int max;
max = 30;
if (IS_MOB (ch))
return number_range (15, 24);
else
return URANGE (3, ch->pcdata->perm_wis + ch->pcdata->mod_wis, max);
}
/*
* Retrieve character's current dexterity.
*/
int
get_curr_dex (CHAR_DATA * ch)
{
int max;
int workspace;
max = 30;
if (IS_MOB (ch))
return number_range (15, 24);
workspace = ch->pcdata->perm_dex + ch->pcdata->mod_dex;
if (pow.penalize_evil_in_sun && ch->in_room && IS_EVIL (ch))
{
if (IN_SUN (ch))
workspace -= 3;
}
return URANGE (3, workspace, max);
}
int
get_curr_con (CHAR_DATA * ch)
{
int max;
max = 30;
if (IS_MOB (ch))
return number_range (15, 24);
else
return URANGE (3, ch->pcdata->perm_con + ch->pcdata->mod_con, max);
}
bool
is_name (const char *str, char *namelist)
{
char name[SML_LENGTH];
if (!str_cmp (str, namelist))
return TRUE;
for (;;)
{
if (namelist == NULL)
return FALSE;
if (!str_cmp(str,namelist)) return TRUE;
namelist = one_argy (namelist, name);
if (name[0] == '\0')
return FALSE;
if (!str_cmp (str, name))
return TRUE;
}
return FALSE;
}
bool
is_approx_name (const char *str, char *namelist)
{
char name[SML_LENGTH];
if (!str_cmp (str, namelist))
return TRUE;
for (;;)
{
if (namelist == NULL)
return FALSE;
namelist = one_argy (namelist, name);
if (name[0] == '\0')
return FALSE;
if (!str_cmp (str, name))
return TRUE;
if (strlen (str) > 1 && !str_prefix (str, name))
return TRUE;
}
return FALSE;
}
void
affect_modify (CHAR_DATA * ch, AFFECT_DATA * paf, bool fAdd, short flaggy)
{
int mod;
mod = paf->modifier;
if (fAdd)
{
SET_BIT (ch->affected_by, paf->bitvector);
SET_BIT (ch->more_affected_by, paf->bitvector2);
}
else
{
REMOVE_BIT (ch->affected_by, paf->bitvector);
REMOVE_BIT (ch->more_affected_by, paf->bitvector2);
mod = 0 - mod;
}
if (IS_MOB (ch))
{
switch (paf->location)
{
default:
bug ("Affect_modify: unknown location %d.", paf->location);
return;
case APPLY_NONE:
break;
if (flaggy == 0)
{
case APPLY_STR:
break;
case APPLY_DEX:
break;
case APPLY_INT:
break;
case APPLY_WIS:
break;
case APPLY_CON:
break;
}
if (flaggy == 0)
{
case APPLY_HIT:
ch->max_hit += mod;
break;
case APPLY_MOVE:
ch->max_move += mod;
break;
}
case APPLY_AC:
ch->armor += mod;
break;
case APPLY_HITROLL:
ch->hitroll += mod;
break;
case APPLY_DAMROLL:
ch->damroll += mod;
break;
case APPLY_SAVING_THROW:
if (IS_PLAYER (ch))
ch->pcdata->saving_throw += mod;
break;
case APPLY_RESIST_SUMMON:
if (IS_PLAYER (ch))
ch->pcdata->resist_summon += mod;
break;
case APPLY_KICK_DAMAGE:
if (IS_PLAYER (ch))
ch->pcdata->plus_kick += mod;
break;
case APPLY_SNEAK:
if (IS_PLAYER (ch))
ch->pcdata->plus_sneak += mod;
break;
case APPLY_HIDE:
if (IS_PLAYER (ch))
ch->pcdata->plus_hide += mod;
break;
}
return;
}
switch (paf->location)
{
default:
bug ("Affect_modify: unknown location %d.", paf->location);
return;
case APPLY_NONE:
break;
case APPLY_STR:
if (flaggy != 1)
ch->pcdata->mod_str += mod;
break;
case APPLY_DEX:
if (flaggy != 1)
ch->pcdata->mod_dex += mod;
break;
case APPLY_INT:
if (flaggy != 1)
ch->pcdata->mod_int += mod;
break;
case APPLY_WIS:
if (flaggy != 1)
ch->pcdata->mod_wis += mod;
break;
case APPLY_CON:
if (flaggy != 1)
ch->pcdata->mod_con += mod;
break;
case APPLY_HIT:
if (flaggy != 1)
ch->max_hit += mod;
break;
case APPLY_MOVE:
if (flaggy != 1)
ch->max_move += mod;
break;
case APPLY_AC:
ch->armor += mod;
break;
case APPLY_HITROLL:
ch->hitroll += mod;
break;
case APPLY_DAMROLL:
ch->damroll += mod;
break;
case APPLY_SAVING_THROW:
if (IS_PLAYER (ch))
ch->pcdata->saving_throw += mod;
break;
case APPLY_RESIST_SUMMON:
if (IS_PLAYER (ch))
ch->pcdata->resist_summon += mod;
break;
case APPLY_KICK_DAMAGE:
if (IS_PLAYER (ch))
ch->pcdata->plus_kick += mod;
break;
case APPLY_SNEAK:
if (IS_PLAYER (ch))
ch->pcdata->plus_sneak += mod;
break;
case APPLY_HIDE:
if (IS_PLAYER (ch))
ch->pcdata->plus_hide += mod;
break;
}
if (IS_PLAYER (ch))
{
ch->affected_by |= ch->pcdata->nat_abilities;
ch->affected_by |= race_info[ch->pcdata->race].affect_bits;
FIXIT(ch)
}
return;
}
void
affect_to_char (CHAR_DATA * ch, AFFECT_DATA * paf)
{
AFFECT_DATA *paf_new;
if (IS_PLAYER (ch) && (IN_BATTLE (ch) || CHALLENGE (ch) == 10) && paf->type != gsn_sneak)
return;
if (IS_PLAYER (ch) && (IS_SET (paf->bitvector, AFF_POISON) || paf->type == gsn_poison) && race_info[ch->pcdata->race].poison_immunity)
{
send_to_char ("You are immune to poison; you resist the effect!\n\r", ch);
return;
}
if (IS_PLAYER (ch) && (IS_SET (paf->bitvector, AFF_PLAGUE) || paf->type == gsn_plague) && race_info[ch->pcdata->race].plague_immunity)
{
send_to_char ("You are immune to plague; you resist the effect!\n\r", ch);
return;
}
if (affect_free == NULL)
{
paf_new = mem_alloc (sizeof (*paf_new));
}
else
{
paf_new = affect_free;
affect_free = affect_free->next;
}
*paf_new = *paf;
paf_new->next = ch->affected;
ch->affected = paf_new;
affect_modify (ch, paf_new, TRUE, 0);
return;
}
void
affect_remove (CHAR_DATA * ch, AFFECT_DATA * paf)
{
if (ch->affected == NULL)
{
bug ("Affect_remove: no affect.", 0);
return;
}
affect_modify (ch, paf, FALSE, 0);
if (paf == ch->affected)
{
ch->affected = paf->next;
}
else
{
AFFECT_DATA *prev;
for (prev = ch->affected; prev != NULL; prev = (!prev->next ? NULL : prev->next))
{
if (prev->next == paf)
{
prev->next = paf->next;
break;
}
}
if (prev == NULL)
{
bug ("Affect_remove: can't find paf.", 0);
return;
}
}
paf->next = affect_free;
affect_free = paf->next;
return;
}
void
strip_all_affects (CHAR_DATA * ch)
{
AFFECT_DATA *paf;
AFFECT_DATA *paf_next;
for (paf = ch->affected; paf != NULL; paf = paf_next)
{
paf_next = paf->next;
affect_remove (ch, paf);
}
ch->affected_by = 0;
ch->more_affected_by = 0;
if (IS_PLAYER (ch))
{
ch->affected_by |= ch->pcdata->nat_abilities;
ch->affected_by |= race_info[ch->pcdata->race].affect_bits;
FIXIT(ch)
}
return;
}
void
affect_strip_bits (CHAR_DATA * ch, int bits)
{
AFFECT_DATA *paf;
AFFECT_DATA *paf_next;
for (paf = ch->affected; paf != NULL; paf = paf_next)
{
if (!paf->next)
paf_next = NULL;
else
paf_next = paf->next;
if (IS_SET (paf->bitvector, bits))
affect_remove (ch, paf);
}
if (IS_PLAYER (ch))
{
ch->affected_by |= ch->pcdata->nat_abilities;
ch->affected_by |= race_info[ch->pcdata->race].affect_bits;
FIXIT(ch)
}
return;
}
void
affect_strip (CHAR_DATA * ch, int sn)
{
AFFECT_DATA *paf;
AFFECT_DATA *paf_next;
if (sn < 0)
return;
for (paf = ch->affected; paf != NULL; paf = paf_next)
{
if (!paf->next)
paf_next = NULL;
else
paf_next = paf->next;
if (paf->type == sn)
affect_remove (ch, paf);
}
if (IS_PLAYER (ch))
{
ch->affected_by |= ch->pcdata->nat_abilities;
ch->affected_by |= race_info[ch->pcdata->race].affect_bits;
FIXIT(ch)
}
return;
}
bool
is_affected (CHAR_DATA * ch, int sn)
{
AFFECT_DATA *paf;
for (paf = ch->affected; paf != NULL; paf = paf->next)
{
if (paf->type == sn)
return TRUE;
}
return FALSE;
}
bool
is_affectedt (CHAR_DATA * ch, int bits)
{
AFFECT_DATA *paf;
for (paf = ch->affected; paf != NULL; paf = paf->next)
{
if (IS_SET (paf->bitvector, bits))
return TRUE;
}
return FALSE;
}
void
affect_join (CHAR_DATA * ch, AFFECT_DATA * paf)
{
AFFECT_DATA *paf_old;
bool found;
if (paf->type < 0)
return;
if (IS_PLAYER (ch) && (IN_BATTLE (ch) || CHALLENGE (ch) == 10))
return;
found = FALSE;
for (paf_old = ch->affected; paf_old != NULL; paf_old = paf_old->next)
{
if (paf_old->type == paf->type)
{
paf->duration += paf_old->duration;
paf->modifier += paf_old->modifier;
affect_remove (ch, paf_old);
break;
}
}
affect_to_char (ch, paf);
return;
}
void
remove_from_fighting_list (CHAR_DATA * ch)
{
CHAR_DATA *c;
if (IS_SET (ch->special, IS_IN_FIGHTING_LIST))
REMOVE_BIT (ch->special, IS_IN_FIGHTING_LIST);
if (ch == f_first)
{
f_first = ch->next_fighting;
ch->next_fighting = NULL;
return;
}
for (c = f_first; c != NULL; c = c->next_fighting)
{
if (c->next_fighting == ch)
{
c->next_fighting = ch->next_fighting;
ch->next_fighting = NULL;
return;
}
}
return;
}
void
add_to_fighting_list (CHAR_DATA * ch)
{
CHAR_DATA *c;
CHAR_DATA *cn;
if (IS_SET (ch->special, IS_IN_FIGHTING_LIST))
return;
for (c = f_first; c != NULL; c = cn)
{
cn = c->next_fighting;
if (c == ch)
{
fprintf (stderr, "Found %s already in fighting list without bit set!\n", NAME (c));
return;
}
}
ch->next_fighting = f_first;
f_first = ch;
SET_BIT (ch->special, IS_IN_FIGHTING_LIST);
return;
}
void
remove_from_aggro_list (CHAR_DATA * ch)
{
CHAR_DATA *c;
if (IS_SET (ch->special, IS_IN_AGGRO_LIST))
{
REMOVE_BIT (ch->special, IS_IN_AGGRO_LIST);
}
if (ch == aggro_check)
{
aggro_check = ch->gen_next;
ch->gen_next = NULL;
}
else
for (c = aggro_check; c != NULL; c = c->gen_next)
{
if (ch == c->gen_next)
{
c->gen_next = ch->gen_next;
ch->gen_next = NULL;
return;
}
}
return;
}
#define XPOS(ch) ((ch)->pcdata->transport_quest%80)
#define YPOS(ch) ((ch)->pcdata->transport_quest/80)
void
char_from_room (CHAR_DATA * ch)
{
CHAR_DATA *c;
DESCRIPTOR_DATA *d;
int x, y;
int can_see_to_min_x;
int can_see_to_min_y;
int can_see_to_max_x;
int can_see_to_max_y;
SINGLE_OBJECT *obj;
CHAR_DATA *pir;
int kk = 0;
int iWear;
if (ch->in_room == NULL)
{
return;
}
check_room_more (ch->in_room);
for (obj = ch->carrying; obj != NULL; obj = obj->next_content)
{
if (obj->wear_loc != WEAR_NONE
&& obj->pIndexData->item_type == ITEM_LIGHT
&& IS_LIT (obj)
&& ch->in_room->light > 0)
--ch->in_room->light;
}
if (ch->in_room->more->pcs>0) {
CHAR_DATA *t;
for (t=ch->in_room->more->people; t; t=t->next_in_room) {
if (t==ch) continue;
if (IS_JAVA(t)) {
java_remove_mob_stuff(t,ch);
}
}
}
#ifdef MAP_MOBS
if (1)
{
#else
if (IS_PLAYER (ch))
{
#endif
char bb[150];
if (!(ch->in_room && ch->in_room->x == 0 && ch->in_room->y == 0 && ch->in_room->z == 0 &&
ch->in_room->vnum != 1508))
{
if (IS_SET (ch->pcdata->act3, ACT3_MAPPING) && !IS_SET (ch->pcdata->act3, ACT3_DISABLED))
{
if ((ch->pcdata->resist_summon == -10 || ch->pcdata->resist_summon == -15))
{
noibm = ch->pcdata->noibm;
kk = ch->pcdata->kk;
mb = ch->pcdata->mb;
dbs = ch->pcdata->dbs;
if (IS_JAVA(ch)) {
if (ch->in_room->more->linked_to)
display_room_mark (ch, ch->in_room->more->linked_to, ch->pcdata->transport_quest % 80, ch->pcdata->transport_quest / 80, 0, FALSE, FALSE);
else
display_room_mark (ch, ch->in_room, ch->pcdata->transport_quest % 80, ch->pcdata->transport_quest / 80, 0, FALSE, FALSE);
} else {
if (ch->in_room->more->linked_to)
display_room_mark (ch, ch->in_room->more->linked_to, ch->pcdata->transport_quest % 80, ch->pcdata->transport_quest / 80, 0, TRUE, FALSE);
else
display_room_mark (ch, ch->in_room, ch->pcdata->transport_quest % 80, ch->pcdata->transport_quest / 80, 0, TRUE, FALSE);
}
if (!IS_JAVA(ch)) {
gotoxy (ch, 1, ch->pcdata->pagelen);
send_to_char ("\x1B[37;0m", ch);
}
}
}
for (d = descriptor_list; d != NULL; d = d->next)
{
x = 0;
y = 0;
if ((c = d->character) == NULL)
continue;
#ifdef MAP_MOBS
if (IS_MOB (ch) && !VIEW_MOBS (c))
continue;
#endif
if (!c->in_room)
continue;
if (ch == c)
continue;
if (!can_see (c, ch) || not_is_same_align (c, ch))
continue;
if (!IS_SET (c->pcdata->act3, ACT3_MAPPING) || IS_SET (c->pcdata->act3, ACT3_DISABLED))
continue;
if (IS_JAVA(c)) {
can_see_to_min_x = (XPOS (c) - 4) / 2;
can_see_to_max_x = (24 - XPOS (c)) / 2;
can_see_to_min_y = (YPOS (c) - 1);
can_see_to_max_y = (8 - YPOS (c));
} else {
can_see_to_min_x = (XPOS (c) - 4) / 2;
can_see_to_max_x = (20 - XPOS (c)) / 2;
can_see_to_min_y = (YPOS (c) - 1);
can_see_to_max_y = (7 - YPOS (c));
}
if (c->in_room->x - can_see_to_min_x > ch->in_room->x)
continue;
if (c->in_room->x + can_see_to_max_x < ch->in_room->x)
continue;
if (c->in_room->y + can_see_to_min_y < ch->in_room->y)
continue;
if (c->in_room->y - can_see_to_max_y > ch->in_room->y)
continue;
if (c->in_room->z != ch->in_room->z ||
c->in_room == ch->in_room)
continue;
x = (ch->in_room->x - c->in_room->x);
y = (c->in_room->y - ch->in_room->y);
x *= 2;
x += XPOS (c);
y += YPOS (c);
if (IS_JAVA(c)) {
display_room_mark(c,ch->in_room,x,y,1,TRUE, IS_MOB(ch));
} else {
sprintf (bb, "%c%c%s%s%c%c", '\x1B', '7',
display_room_mark_direct (c, ch->in_room, x, y, 1, TRUE, IS_MOB (ch)),
"\x1B[37;0m",
'\x1B', '8');
write_to_descriptor (d->descriptor, bb, 0);
}
c->timer = -5;
}
}
}
if (ch == ch->in_room->more->people)
{
ch->in_room->more->people = ch->next_in_room;
if (IS_PLAYER (ch))
{
ch->in_room->area->nplayer--;
if (ch->in_room->more->pcs != 31999)
ch->in_room->more->pcs--;
}
}
else
{
CHAR_DATA *prev;
for (prev = ch->in_room->more->people; prev; prev = prev->next_in_room)
{
if (prev->next_in_room == ch)
{
prev->next_in_room = ch->next_in_room;
if (IS_PLAYER (ch))
{
ch->in_room->area->nplayer--;
if (ch->in_room->more->pcs != 31999)
ch->in_room->more->pcs--;
/*End IS_PLAYER below */
}
break;
}
}
if (prev == NULL)
{
/* bug( "Char_from_room: ch not found.", 0 ); */
ch->in_room = NULL;
ch->next_in_room = NULL;
return;
}
}
if (IS_MOB (ch) && ch->in_room->more->pcs == 0)
remove_from_aggro_list (ch);
if (IS_PLAYER (ch))
{
for (pir = ch->in_room->more->people; pir != NULL; pir = pir->next_in_room)
{
if (ch->in_room->more->pcs == 0)
{
remove_from_aggro_list (pir);
}
if (IS_MOB (pir) && IS_AFFECTED (pir, AFF_CHARM) && MASTER (pir) == ch)
{
while (ch->pcdata->pet_temp[kk] != 0)
kk++;
ch->pcdata->pet_temp[kk] = pir->pIndexData->vnum;
ch->pcdata->pet_hps[kk] = pir->hit;
ch->pcdata->pet_move[kk] = pir->move;
}
}
}
if (FIGHTING(ch)) {
CHAR_DATA *vch;
for (vch=char_list; vch!=NULL; vch=vch->next) {
if (FIGHTING(vch)==ch) {
vch->fgt->fighting=NULL;
vch->position=POSITION_STANDING;
}
}
ch->fgt->fighting=NULL;
ch->position=POSITION_STANDING;
}
check_clear_more (ch->in_room);
ch->in_room = NULL;
ch->next_in_room = NULL;
return;
}
void
check_stats (CHAR_DATA * ch)
{
if (ch->pcdata->perm_str > race_info[ch->pcdata->race].limits[0])
ch->pcdata->perm_str = race_info[ch->pcdata->race].limits[0];
if (ch->pcdata->perm_int > race_info[ch->pcdata->race].limits[1])
ch->pcdata->perm_int = race_info[ch->pcdata->race].limits[1];
if (ch->pcdata->perm_wis > race_info[ch->pcdata->race].limits[2])
ch->pcdata->perm_wis = race_info[ch->pcdata->race].limits[2];
if (ch->pcdata->perm_dex > race_info[ch->pcdata->race].limits[3])
ch->pcdata->perm_dex = race_info[ch->pcdata->race].limits[3];
if (ch->pcdata->perm_con > race_info[ch->pcdata->race].limits[4])
ch->pcdata->perm_con = race_info[ch->pcdata->race].limits[4];
return;
}
#define INDOORS_MAP(ch) ( ((ch)->in_room->more && (ch)->in_room->more->linked_to) ? IS_SET((ch)->in_room->more->linked_to->room_flags,ROOM_INDOORS) : IS_SET((ch)->in_room->room_flags,ROOM_INDOORS) )
void
char_to_room (CHAR_DATA * ch, ROOM_DATA * oneroom)
{
SINGLE_OBJECT *obj;
int can_see_to_min_x;
int can_see_to_min_y;
int can_see_to_max_x;
int can_see_to_max_y;
CHAR_DATA *c;
int x, y;
DESCRIPTOR_DATA *d;
bool neww;
int iWear;
neww = FALSE;
check_room_more (oneroom);
if (IS_SET(oneroom->room_flags,ROOM_INDOORS) && IS_AFFECTED(ch,AFF_FLYING)) {
send_to_char("You cannot fly while indoors.\n\r",ch);
do_land(ch,"");
}
if (ch->in_room)
{
char_from_room (ch);
}
if (oneroom && oneroom->area && oneroom->area->open != 0 && IS_PLAYER (ch) && ch->pcdata->level > 100 && ch->pcdata->level < 105)
{
send_to_char ("You have no reasons to be in an open area...\n\r", ch);
send_to_char ("If you are a god, you may check out characters using the snoop\n\r", ch);
send_to_char ("command. Please stay in your zone or another closed area.\n\r", ch);
if (orn)
{
char bf[500];
sprintf (bf, "%s tried to go to a closed area, and is now in room #3.\n", NAME (ch));
send_to_char (bf, orn);
}
if (LEVEL(ch)<100) oneroom = get_room_index (3); else
oneroom = get_room_index (2);
check_room_more (oneroom);
}
else if (oneroom->area->open == 0 && IS_PLAYER (ch) && ch->pcdata->level < 101)
{
send_to_char ("You may not go to unopened areas. Sorry!\n\r", ch);
if (orn)
{
char bf[500];
sprintf (bf, "%s tried to go to a closed area, and is now in room #3.\n", NAME (ch));
send_to_char (bf, orn);
}
oneroom = get_room_index (3);
check_room_more (oneroom);
}
if (IS_PLAYER (ch) && !IS_SET (ch->act, PLR_HOLYWALK))
{
if (oneroom->vnum == 100 || oneroom->vnum == 99)
{
DESCRIPTION_DATA *ded;
char *cp;
char kw[500];
char argo[200];
ch->affected_by |= ch->pcdata->nat_abilities;
ch->affected_by |= race_info[ch->pcdata->race].affect_bits;
FIXIT(ch)
natural_mana (ch);
upd_mana (ch);
for (ded = oneroom->more->extra_descr; ded != NULL; ded = ded->next)
{
if (!ded->keyword || ded->keyword[0] == '\0')
continue;
strcpy (kw, ded->keyword);
cp = one_argy (kw, argo);
if (is_number (argo) && is_number (cp))
{
int racenum;
int roomvn;
ROOM_DATA *nr;
racenum = atoi (argo);
roomvn = atoi (cp);
if (racenum >= 0 && racenum <= RACE_COUNT &&
racenum == ch->pcdata->race && (nr = get_room_index (roomvn)) != NULL &&
nr->vnum != 100 && nr->vnum != 99)
{
char_to_room (ch, nr);
return;
}
}
}
}
}
if (IS_PLAYER (ch) && ch->in_room && ch->in_room->more)
{
CHAR_DATA *d;
for (d = ch->in_room->more->people; d != NULL; d = d->next_in_room)
{
if (IS_MOB (d))
{
add_to_aggro_list (d);
}
if (d == ch)
{
ch->in_room = oneroom;
return;
}
}
}
if (IS_PLAYER (ch) && oneroom && oneroom->more)
{
CHAR_DATA *d;
for (d = oneroom->more->people; d != NULL; d = d->next_in_room)
{
if (IS_MOB (d))
add_to_aggro_list (d);
if (d == ch)
{
fprintf (stderr, "UGH!\n");
ch->in_room = oneroom;
return;
}
}
}
check_room_more (oneroom);
if (oneroom == NULL)
{
bug ("Char_to_room: NULL.", 0);
return;
}
ch->in_room = oneroom;
if (IS_PLAYER (ch))
{
int kk;
if (!IS_JAVA(ch) && IS_SET (ch->pcdata->act3, ACT3_MAPPING) && IS_SET (ch->pcdata->act3, ACT3_DISABLED) &&
!INDOORS_MAP (ch))
{
REMOVE_BIT (ch->pcdata->act3, ACT3_MAPPING);
REMOVE_BIT (ch->pcdata->act3, ACT3_DISABLED);
do_drawmort (ch, "");
}
else if (!IS_JAVA(ch) && IS_SET (ch->pcdata->act3, ACT3_MAPPING) && !IS_SET (ch->pcdata->act3, ACT3_DISABLED) &&
INDOORS_MAP (ch) /*IS_SET(ch->in_room->room_flags,ROOM_INDOORS) */ )
{
SET_BIT (ch->pcdata->act3, ACT3_DISABLED);
do_clear (ch, "");
SET_BIT (ch->pcdata->act3, ACT3_MAPPING);
}
if (pet_flag)
for (kk = 0; kk < 20; kk++)
ch->pcdata->pet_temp[kk] = 0;
ch->in_room->area->nplayer++;
if (ch->in_room->more->pcs != 31999)
ch->in_room->more->pcs++;
}
if (IS_MOB (ch) && ch->in_room->more->pcs > 0)
add_to_aggro_list (ch);
if (oneroom->more->people != ch)
ch->next_in_room = oneroom->more->people;
oneroom->more->people = ch;
if (oneroom->vnum >= BATTLEGROUND_START_VNUM && oneroom->vnum <= BATTLEGROUND_END_VNUM)
{
check_fgt (ch);
ch->fgt->in_battle = TRUE;
}
else
{
if (ch->fgt)
{
ch->fgt->in_battle = FALSE;
ch->fgt->wasroomtwo = oneroom->vnum;
}
}
#ifdef WALKTHRU_CREATION
if (IS_PLAYER (ch))
{
if (ch->in_room->vnum > 410 && ch->in_room->vnum < 500)
{
if (ch->in_room->vnum == 450)
{
ch->pcdata->nat_abilities = 0;
ch->affected_by = 0;
ch->pcdata->perm_str = number_range (13, 15);
ch->pcdata->perm_int = number_range (13, 14);
ch->pcdata->perm_con = number_range (13, 15);
ch->pcdata->perm_dex = number_range (12, 15);
ch->pcdata->perm_wis = number_range (12, 14);
ch->pcdata->perm_str += race_info[ch->pcdata->race].bonus[0];
ch->pcdata->perm_int += race_info[ch->pcdata->race].bonus[1];
ch->pcdata->perm_wis += race_info[ch->pcdata->race].bonus[2];
ch->pcdata->perm_dex += race_info[ch->pcdata->race].bonus[3];
ch->pcdata->perm_con += race_info[ch->pcdata->race].bonus[4];
check_stats (ch);
}
if (ch->in_room->vnum == 452)
{
conv_race (ch);
ch->pcdata->perm_str += 1;
ch->pcdata->perm_dex += number_range (1, 3);
ch->pcdata->perm_con += 1;
check_stats (ch);
}
if (ch->in_room->vnum == 460)
{
conv_race (ch);
ch->pcdata->perm_str += number_range (2, 4);
ch->pcdata->perm_wis += 1;
ch->pcdata->perm_dex += number_range (2, 4);
ch->pcdata->perm_con += number_range (2, 4);
gain_exp (ch, 700);
ch->max_move += 1;
ch->move += 1;
ch->max_hit += 3;
ch->hit += 3;
ch->pcdata->learned[gsn_slashing] = 10;
ch->pcdata->learned[gsn_parry] = 7;
ch->pcdata->learned[gsn_pierce] = 6;
check_stats (ch);
}
if (ch->in_room->vnum == 464)
{
ch->pcdata->perm_str += 1;
ch->pcdata->perm_dex += number_range (1, 2);
ch->max_move += 6;
ch->move += 6;
gain_exp (ch, 200);
ch->pcdata->perm_con += number_range (1, 4);
check_stats (ch);
}
if (ch->in_room->vnum == 465)
{
ch->pcdata->perm_str += 2;
ch->pcdata->perm_con += 2;
ch->max_hit += 2;
ch->hit += 2;
check_stats (ch);
}
if (ch->in_room->vnum == 461)
{
ch->max_move += 4;
ch->move += 4;
gain_exp (ch, 600);
ch->pcdata->perm_str += number_range (1, 2);
ch->pcdata->perm_wis += 2;
ch->pcdata->perm_int += 1;
ch->pcdata->perm_dex += number_range (3, 4);
ch->pcdata->perm_con += number_range (2, 4);
ch->pcdata->learned[gsn_sneak] = 8;
ch->pcdata->learned[gsn_pierce] = 9;
ch->pcdata->learned[gsn_slashing] = 6;
check_stats (ch);
}
if (ch->in_room->vnum == 453)
{
conv_race (ch);
ch->pcdata->perm_int += 1;
ch->pcdata->perm_dex += number_range (1, 2);
ch->pcdata->perm_wis += 2;
gain_exp (ch, 350);
ch->pcdata->learned[gsn_search] = 5;
ch->pcdata->learned[gsn_enhanced_damage] = 5;
check_stats (ch);
}
if (ch->in_room->vnum == 458)
{
/*if (number_range(1,3)==2) ch->pcdata->nat_abilities|=AFF_INFRARED; */
gain_exp (ch, 300);
ch->pcdata->perm_str += 2;
ch->pcdata->perm_con += number_range (1, 3);
ch->pcdata->perm_wis += 1;
ch->pcdata->perm_int += 1;
ch->pcdata->perm_dex += 1;
ch->max_hit += 2;
ch->hit += 2;
ch->max_move += 1;
ch->move += 1;
check_stats (ch);
}
if (ch->in_room->vnum == 459)
{
gain_exp (ch, 450);
ch->pcdata->perm_wis += 3;
ch->pcdata->perm_int += number_range (1, 3);
ch->pcdata->perm_str += 1;
if (number_range (1, 2) == 2)
ch->pcdata->perm_con += 1;
check_stats (ch);
}
if (ch->in_room->vnum == 467)
{
gain_exp (ch, 700);
ch->pcdata->perm_wis += number_range (2, 5);
ch->pcdata->perm_int += number_range (1, 2);
ch->pcdata->perm_str += number_range (1, 2);
ch->pcdata->perm_dex += number_range (1, 2);
check_stats (ch);
}
if (ch->in_room->vnum == 468)
{
gain_exp (ch, 500);
ch->pcdata->perm_int += number_range (1, 5);
ch->pcdata->perm_wis += number_range (1, 5);
ch->pcdata->perm_str += number_range (1, 5);
ch->pcdata->perm_con += number_range (1, 4);
ch->pcdata->perm_dex -= 2;
check_stats (ch);
}
if (ch->in_room->vnum == 497)
{
conv_race (ch);
ch->hit += 1;
ch->max_hit += 1;
check_stats (ch);
}
if (ch->in_room->vnum == 498)
{
conv_race (ch);
ch->move += 1;
ch->max_move += 1;
check_stats (ch);
}
if (ch->in_room->vnum == 469)
{
gain_exp (ch, 450);
ch->pcdata->perm_str += number_range (2, 6);
ch->pcdata->perm_con += number_range (2, 6);
ch->pcdata->perm_dex += 2;
check_stats (ch);
}
if (ch->in_room->vnum == 482)
{
ch->pcdata->perm_str += number_range (1, 3);
ch->pcdata->perm_con += number_range (1, 2);
ch->hit += 2;
ch->max_hit += 2;
check_stats (ch);
}
if (ch->in_room->vnum == 481)
{
ch->pcdata->perm_int += number_range (1, 3);
ch->pcdata->perm_wis += number_range (1, 2);
ch->pcdata->perm_dex += 1;
check_stats (ch);
}
if (ch->in_room->vnum == 457)
{
ch->pcdata->perm_str += number_range (1, 5);
ch->pcdata->perm_con += number_range (1, 3);
ch->pcdata->perm_dex += number_range (1, 3);
ch->max_move += 1;
gain_exp (ch, 250);
ch->move += 1;
check_stats (ch);
}
if (ch->in_room->vnum == 483)
{
ch->pcdata->perm_con += number_range (1, 4);
ch->pcdata->perm_dex += number_range (1, 4);
ch->max_hit += 2;
ch->hit -= 2;
gain_exp (ch, 300);
check_stats (ch);
}
if (ch->in_room->vnum == 484)
{
ch->pcdata->perm_int += number_range (1, 2);
ch->pcdata->perm_str += number_range (1, 2);
ch->pcdata->perm_dex += number_range (1, 2);
ch->max_move += 1;
ch->move += 1;
gain_exp (ch, 450);
check_stats (ch);
}
if (ch->in_room->vnum == 485)
{
ch->pcdata->perm_wis += number_range (1, 3);
ch->pcdata->perm_str += 1;
ch->pcdata->perm_dex += 1;
ch->max_hit += 2;
ch->hit += 2;
conv_race (ch);
check_stats (ch);
}
if (ch->in_room->vnum == 486)
{
ch->pcdata->perm_dex += number_range (1, 3);
ch->pcdata->perm_str += 1;
ch->pcdata->perm_con += 1;
ch->max_move += 1;
ch->move += 1;
conv_race (ch);
check_stats (ch);
}
if (ch->in_room->vnum == 488)
{
ch->pcdata->perm_con += number_range (1, 2);
ch->max_hit += 2;
ch->hit += 2;
gain_exp (ch, 550);
ch->pcdata->perm_dex += 1;
conv_race (ch);
check_stats (ch);
}
if (ch->in_room->vnum == 487)
{
ch->pcdata->perm_wis += number_range (1, 2);
ch->pcdata->perm_int += number_range (1, 2);
ch->pcdata->perm_dex += 1;
gain_exp (ch, 300);
conv_race (ch);
check_stats (ch);
}
if (ch->in_room->vnum == 466)
{
gain_exp (ch, 100);
ch->pcdata->perm_wis += number_range (1, 3);
ch->pcdata->perm_int += number_range (2, 4);
ch->pcdata->perm_dex += 1;
check_stats (ch);
}
if (ch->in_room->vnum == 492)
{
ch->pcdata->perm_con += 1;
ch->pcdata->perm_wis += number_range (1, 3);
ch->pcdata->perm_int += number_range (1, 2);
check_stats (ch);
}
if (ch->in_room->vnum == 491)
{
ch->pcdata->perm_str += number_range (1, 2);
if (number_range (1, 2) == 2)
ch->pcdata->perm_con += 1;
ch->pcdata->perm_dex += 1;
check_stats (ch);
}
if (ch->in_room->vnum == 494)
{
ch->pcdata->perm_wis += number_range (1, 3);
ch->pcdata->perm_int += number_range (1, 3);
conv_race (ch);
gain_exp (ch, 650);
check_stats (ch);
}
if (ch->in_room->vnum == 493)
{
gain_exp (ch, 320);
ch->pcdata->perm_str += number_range (1, 3);
ch->pcdata->perm_con += number_range (1, 3);
ch->pcdata->perm_dex += number_range (1, 2);
ch->pcdata->perm_int -= 2;
ch->pcdata->learned[gsn_slashing] = 22;
conv_race (ch);
check_stats (ch);
}
if (ch->in_room->vnum == 476)
{
gain_exp (ch, 400);
ch->pcdata->perm_str += number_range (1, 3);
ch->pcdata->perm_con += number_range (1, 2);
ch->pcdata->perm_dex += 1;
ch->max_hit += 2;
ch->hit += 2;
/*if (number_range(1,2)==2) ch->pcdata->nat_abilities|=AFF_INFRARED; */
check_stats (ch);
}
if (ch->in_room->vnum == 475)
{
gain_exp (ch, 200);
ch->pcdata->perm_str += 2;
ch->pcdata->perm_con += number_range (1, 2);
ch->pcdata->perm_dex += 2;
ch->pcdata->perm_int += 2;
ch->pcdata->perm_wis += 1;
check_stats (ch);
}
if (ch->in_room->vnum == 479)
{
ch->pcdata->perm_str += number_range (1, 3);
ch->pcdata->perm_con += number_range (2, 3);
ch->max_hit += 2;
ch->hit += 2;
check_stats (ch);
}
if (ch->in_room->vnum == 480)
{
ch->pcdata->perm_int += number_range (1, 2);
ch->pcdata->perm_wis += number_range (2, 3);
ch->pcdata->perm_dex += 1;
check_stats (ch);
}
if (ch->in_room->vnum == 477)
{
conv_race (ch);
ch->pcdata->perm_str += number_range (1, 3);
ch->pcdata->perm_con += number_range (1, 3);
ch->pcdata->perm_dex += number_range (1, 3);
check_stats (ch);
}
if (ch->in_room->vnum == 478)
{
conv_race (ch);
ch->pcdata->perm_int += 1;
ch->pcdata->perm_wis += number_range (2, 4);
ch->pcdata->perm_dex += 1;
check_stats (ch);
}
if (ch->in_room->vnum == 496)
{
ch->pcdata->perm_int += number_range (1, 2);
ch->pcdata->perm_con += number_range (1, 2);
ch->max_hit += 1;
ch->hit += 1;
ch->max_move += 1;
ch->move += 1;
conv_race (ch);
check_stats (ch);
}
if (ch->in_room->vnum == 495)
{
ch->pcdata->perm_str += number_range (1, 3);
ch->pcdata->perm_con += number_range (1, 4);
gain_exp (ch, 410);
ch->max_hit += 2;
ch->hit += 2;
ch->pcdata->learned[gsn_slashing] = 18;
conv_race (ch);
check_stats (ch);
}
}
}
#endif
for (obj = ch->carrying; obj != NULL; obj = obj->next_content)
{
if (obj->wear_loc != WEAR_NONE && obj->pIndexData->values_2[8] > 0 &&
IS_PLAYER (ch) && !FIGHTING (ch) && ch->position == POSITION_STANDING &&
number_range (1, 1000) < obj->pIndexData->values_2[8] &&
ch->in_room && ch->in_room->more)
{
CHAR_DATA *ir;
for (ir = ch->in_room->more->people; ir != NULL; ir = ir->next_in_room)
{
if (IS_MOB (ir))
{
send_to_char ("You feel an evil energy surging through you, compelling you to go wild!\n\r", ch);
do_kill (ch, ir->pIndexData->name);
goto yy;
}
}
yy:
if (ch) {};
}
if (obj->wear_loc != WEAR_NONE && obj->pIndexData->item_type == ITEM_LIGHT
&& IS_LIT (obj))
{
++ch->in_room->light;
}
}
check_room_more (ch->in_room);
if (ch->in_room->more->pcs>0) {
CHAR_DATA *t;
for (t=ch->in_room->more->people; t; t=t->next_in_room) {
if (t==ch) continue;
if (IS_JAVA(t)) {
java_add_mob_window(t,ch);
}
}
}
#ifdef MAP_MOBS
if (1)
{
#else
if (IS_PLAYER (ch))
{
#endif
char bb[500];
if (!(ch->in_room && ch->in_room->x == 0 && ch->in_room->y == 0 && ch->in_room->z == 0 &&
ch->in_room->vnum != 1508))
{
if (IS_SET (ch->pcdata->act3, ACT3_MAPPING) && !IS_SET (ch->pcdata->act3, ACT3_DISABLED))
{
#ifdef NEW_WORLD
if (ch->pcdata->resist_summon == -10 || ch->pcdata->resist_summon == -15)
{
if (IS_JAVA(ch)) {
if (ch->in_room->more->linked_to)
display_room_mark (ch, ch->in_room->more->linked_to, ch->pcdata->transport_quest % 80, ch->pcdata->transport_quest / 80, -1, FALSE, FALSE);
else
display_room_mark (ch, ch->in_room, ch->pcdata->transport_quest % 80, ch->pcdata->transport_quest / 80, -1, FALSE, FALSE);
} else {
if (ch->in_room->more->linked_to)
display_room_mark (ch, ch->in_room->more->linked_to, ch->pcdata->transport_quest % 80, ch->pcdata->transport_quest / 80, -1, FALSE, FALSE);
else
display_room_mark (ch, ch->in_room, ch->pcdata->transport_quest % 80, ch->pcdata->transport_quest / 80, -1, FALSE, FALSE);
}
noibm = FALSE;
kk = FALSE;
mb = FALSE;
dbs = FALSE;
if (!IS_JAVA(ch)) {
gotoxy (ch, 1, ch->pcdata->pagelen);
send_to_char ("\x1B[37;0m", ch);
}
}
#endif
}
for (d = descriptor_list; d != NULL; d = d->next)
{
x = 0;
y = 0;
if ((c = d->character) == NULL)
continue;
#ifdef MAP_MOBS
if (IS_MOB (ch) && !VIEW_MOBS (c))
continue;
#endif
if (!c->in_room)
continue;
if (!can_see (c, ch) || not_is_same_align (c, ch))
continue;
if (!IS_SET (c->pcdata->act3, ACT3_MAPPING) || IS_SET (c->pcdata->act3, ACT3_DISABLED))
continue;
if (IS_JAVA(ch)) {
can_see_to_min_x = (XPOS (c) - 4) / 2;
can_see_to_max_x = (24 - XPOS (c)) / 2;
can_see_to_min_y = (YPOS (c) - 1);
can_see_to_max_y = (8 - YPOS (c));
} else {
can_see_to_min_x = (XPOS (c) - 4) / 2;
can_see_to_max_x = (20 - XPOS (c)) / 2;
can_see_to_min_y = (YPOS (c) - 1);
can_see_to_max_y = (7 - YPOS (c));
}
if (c->in_room->x - can_see_to_min_x > ch->in_room->x)
continue;
if (c->in_room->x + can_see_to_max_x < ch->in_room->x)
continue;
if (c->in_room->y + can_see_to_min_y < ch->in_room->y)
continue;
if (c->in_room->y - can_see_to_max_y > ch->in_room->y)
continue;
if (c->in_room->z != ch->in_room->z ||
c->in_room == ch->in_room)
continue;
x = (ch->in_room->x - c->in_room->x);
y = (c->in_room->y - ch->in_room->y);
x *= 2;
x += XPOS (c);
y += YPOS (c);
if (IS_JAVA(c)) {
display_room_mark(c,ch->in_room,x,y,1,FALSE, IS_MOB(ch));
} else {
sprintf (bb, "%c%c%s%s%c%c", '\x1B', '7',
display_room_mark_direct (c, ch->in_room, x, y, 1, FALSE, IS_MOB (ch)),
"\x1B[37;0m",
'\x1B', '8');
write_to_descriptor (d->descriptor, bb, 0);
}
c->timer = -5;
}
}
}
return;
}
void
u_char_to_room (CHAR_DATA * ch, ROOM_DATA * oneroom)
{
SINGLE_OBJECT *obj;
int iWear;
check_room_more (oneroom);
if (oneroom == NULL)
{
bug ("Char_to_room: NULL.", 0);
return;
}
ch->in_room = oneroom;
if (oneroom->more->people != ch)
ch->next_in_room = oneroom->more->people;
oneroom->more->people = ch;
if (oneroom->vnum >= BATTLEGROUND_START_VNUM && oneroom->vnum <= BATTLEGROUND_END_VNUM)
{
check_fgt (ch);
ch->fgt->in_battle = TRUE;
}
else
{
if (ch->fgt)
{
ch->fgt->in_battle = FALSE;
ch->fgt->wasroomtwo = oneroom->vnum;
}
}
if (IS_PLAYER (ch))
{
ch->in_room->area->nplayer++;
if (ch->in_room->more->pcs != 31999)
ch->in_room->more->pcs++;
}
for (iWear = WEAR_NONE + 1; iWear < MAX_WEAR; iWear++)
{
if ((obj = get_eq_char (ch, iWear)) != NULL
&& obj->pIndexData->item_type == ITEM_LIGHT
&& IS_LIT (obj))
++ch->in_room->light;
}
return;
}
int
apply_ac (SINGLE_OBJECT * obj, int iWear)
{
int damaged;
I_ARMOR *r;
return 0;
if (obj->pIndexData->item_type != ITEM_ARMOR)
return 0;
r = (I_ARMOR *) obj->more;
if (r->max_condition > 0)
{
damaged = ((((r->condition_now * 100) / (r->max_condition)) * r->slash_rating) / 100);
}
else
damaged = r->slash_rating;
switch (iWear)
{
case WEAR_SHOULDER_R:
return damaged;
case WEAR_SHOULDER_L:
return damaged;
case WEAR_BODY:
return 3 * damaged;
case WEAR_HEAD:
return 2 * damaged;
case WEAR_LEGS:
return 2 * damaged;
case WEAR_FEET:
return damaged;
case WEAR_HANDS:
return damaged;
case WEAR_ARMS:
return damaged;
case WEAR_SHIELD:
return damaged;
case WEAR_FINGER_L:
return damaged;
case WEAR_FINGER_R:
return damaged;
case WEAR_NECK_1:
return damaged;
case WEAR_NECK_2:
return damaged;
case WEAR_ABOUT:
return 2 * damaged;
case WEAR_WAIST:
return damaged;
case WEAR_WRIST_L:
return damaged;
case WEAR_WRIST_R:
return damaged;
case WEAR_HOLD_1:
case WEAR_HOLD_2:
return 0;
case WEAR_FACE:
return damaged;
case WEAR_FLOATING:
return damaged;
case WEAR_EAR_1:
return damaged;
case WEAR_EAR_2:
return damaged;
case WEAR_ANKLE_1:
return damaged;
case WEAR_ANKLE_2:
return damaged;
}
return 0;
}
SINGLE_OBJECT *
get_item_held (CHAR_DATA * ch, int itype)
{
SINGLE_OBJECT *obj;
if ((obj = get_eq_char (ch, WEAR_HOLD_1)) != NULL
&& obj->pIndexData->item_type == itype)
return obj;
if ((obj = get_eq_char (ch, WEAR_HOLD_2)) != NULL
&& obj->pIndexData->item_type == itype)
return obj;
return NULL;
}
SINGLE_OBJECT *
get_eq_char (CHAR_DATA * ch, int iWear)
{
SINGLE_OBJECT *obj;
for (obj = ch->carrying; obj != NULL; obj = ((!obj->next_content) ? NULL : obj->next_content))
{
if (obj->wear_loc == iWear)
return obj;
}
return NULL;
}
/*
* Equip a char with an obj.
*/
void
equip_char (CHAR_DATA * ch, SINGLE_OBJECT * obj, int iWear)
{
AFFECT_DATA *paf;
int bitty;
if (get_eq_char (ch, iWear) != NULL)
{
fprintf (stderr, "Error, check char %s... already equipped.\n", NAME (ch));
bug ("Equip_char: already equipped (%d).", iWear);
return;
}
if ((IS_OBJ_STAT (obj, ITEM_ANTI_EVIL) && IS_EVIL (ch))
|| (IS_OBJ_STAT (obj, ITEM_ANTI_GOOD) && IS_GOOD (ch))
|| (IS_OBJ_STAT (obj, ITEM_ANTI_NEUTRAL) && IS_NEUTRAL (ch)))
{
if (!IS_IMMORTAL (ch))
{
act ("You are zapped by $p and drop it.", ch, obj, NULL, TO_CHAR);
act ("$n is zapped by $p and drops it.", ch, obj, NULL, TO_ROOM);
obj_from (obj);
obj_to (obj, ch->in_room);
return;
}
}
if (obj->pIndexData->item_type == ITEM_ARMOR)
{
if (obj->size < 1)
SET_OBJ_SIZE (ch, obj);
if (!OBJ_FITS (obj, ch))
{
char tmpb[1000];
bool plural;
plural = (obj->pIndexData->short_descr[strlen (obj->pIndexData->short_descr) - 1] == 's');
if (OBJ_TOO_BIG (obj, ch))
{
if (IS_JAVA(ch)) {
char buf[500];
sprintf(buf,"%c%c",(char)23,(char)67);
write_to_buffer(ch->desc,buf,0);
} else {
sprintf (tmpb, "%s\x1B[37;0m %s too big and just fall%s off!\n\r",
capitalize (obj->pIndexData->short_descr),
(plural ? "are" : "is"),
(plural ? "" : "s"));
send_to_char (tmpb, ch);
}
}
else
{
if (IS_JAVA(ch)) {
char buf[500];
sprintf(buf,"%c%c",(char)23,(char)68);
write_to_buffer(ch->desc,buf,0);
} else {
sprintf (tmpb, "%s\x1B[37;0m %s too small for you to wear!\n\r",
capitalize (obj->pIndexData->short_descr),
(plural ? "are" : "is"));
send_to_char (tmpb, ch);
}
}
return;
}
}
ch->armor -= apply_ac (obj, iWear);
obj->wear_loc = iWear;
if (obj->pIndexData->item_type == ITEM_GEM)
{
act ("As you hold $p in your hand, its energy drains.", ch, obj, NULL, TO_CHAR);
act ("...You slowly start to feel the gem get used to your hand and it begins", ch, obj, NULL, TO_CHAR);
act ("to power up for use. Use the examine command to check it's power.", ch, obj, NULL, TO_CHAR);
/* if (ch->pcdata->n_mana<0) ch->pcdata->n_mana += ((I_GEM *) obj->more)->mana_now;
if (((I_GEM *) obj->more)->mana_now<0) {
((I_GEM *) obj->more)->mana_now+=ch->pcdata->n_mana;
}*/
((I_GEM *) obj->more)->mana_now = 0;
ch->pcdata->n_mana = 0;
upd_mana (ch);
}
if (IS_JAVA(ch)) {
java_remove_obj_inv(ch,obj);
}
bitty = 0;
if (!IS_AFFECTED (ch, AFF_FLYING))
bitty = 1;
for (paf = obj->pIndexData->affected; paf != NULL; paf = ((!paf->next) ? NULL : paf->next))
affect_modify (ch, paf, TRUE, 0);
if (IS_AFFECTED (ch, AFF_FLYING) && bitty == 1)
REMOVE_BIT (ch->affected_by, AFF_FLYING);
if (obj->pIndexData->item_type == ITEM_LIGHT
&& IS_LIT (obj)
&& ch->in_room != NULL)
++ch->in_room->light;
if (ch->move > ch->max_move)
ch->move = ch->max_move;
return;
}
int
hand_empty (CHAR_DATA * ch)
{
if (get_eq_char (ch, WEAR_HOLD_1) == NULL)
return WEAR_HOLD_1;
if (get_eq_char (ch, WEAR_HOLD_2) == NULL)
return WEAR_HOLD_2;
return WEAR_NONE;
}
int
belt_empty (CHAR_DATA * ch)
{
if (get_eq_char (ch, WEAR_WAIST) == NULL)
return WEAR_NONE;
if (get_eq_char (ch, WEAR_BELT_1) == NULL)
return WEAR_BELT_1;
if (get_eq_char (ch, WEAR_BELT_2) == NULL)
return WEAR_BELT_2;
return WEAR_NONE;
}
bool
unequip_char (CHAR_DATA * ch, SINGLE_OBJECT * obj)
{
AFFECT_DATA *paf;
if (obj->wear_loc != WEAR_BELT_1 && obj->wear_loc != WEAR_BELT_2 &&
obj->wear_loc != WEAR_BELT_3)
{
for (paf = obj->pIndexData->affected; paf != NULL; paf = ((!paf->next) ? NULL : paf->next))
affect_modify (ch, paf, FALSE, 0);
}
ch->armor += apply_ac (obj, obj->wear_loc);
obj->wear_loc = -1;
if (IS_PLAYER(ch)) {
int amt;
if (obj->pIndexData->item_type==ITEM_GEM) {
if (((I_GEM *) obj->more)->mana_now < 0) {
amt=UMIN((0-((I_GEM *) obj->more)->mana_now),ch->pcdata->n_mana);
((I_GEM *) obj->more)->mana_now+=amt;
ch->pcdata->n_mana-=amt;
}
}
}
if (IS_JAVA(ch)) {
java_add_obj_inv_window(ch,obj);
}
if (obj->pIndexData->item_type == ITEM_LIGHT && IS_LIT (obj) && ch->in_room != NULL
&& ch->in_room->light > 0)
--ch->in_room->light;
return TRUE;
}
int
count_obj_list (OBJ_PROTOTYPE * pObjIndex, SINGLE_OBJECT * list)
{
SINGLE_OBJECT *obj;
int nMatch;
nMatch = 0;
for (obj = list; obj != NULL; obj = ((!obj->next_content) ? NULL : obj->next_content))
{
if (obj->next_content && obj == obj->next_content)
{
fprintf (stderr, "Endless object pointers called in count_obj_list\n");
exit (15);
}
if (obj->pIndexData == pObjIndex)
nMatch++;
}
return nMatch;
}
void
extract_char (CHAR_DATA * ch, bool fPull)
{
CHAR_DATA *wch;
SINGLE_OBJECT *obj;
SINGLE_OBJECT *obj_next;
ROOM_DATA *ir;
DESCRIPTOR_DATA *d;
MARK_CHAR_DEBUG("Extract_char",ch)
remove_from_combat_field_yes(ch);
MARK_CHAR_DEBUG("E_char_combat_field",ch)
if (fPull && NAME (ch) && !str_cmp (NAME (ch), "Orin"))
orn = NULL;
if (fPull && NAME (ch) && !str_cmp (NAME (ch), "Smack"))
smack = NULL;
if (fPull && NAME (ch) && !str_cmp (NAME (ch), "Palio"))
palio = NULL;
if (TRUE /*IS_MOB(ch) */ )
clear_tracks (ch);
#ifndef NEW_WORLD
if (ch->ced && ch->ced->in_boat != NULL)
{
char_from_boat (ch, ch->ced->in_boat);
}
#endif
if (fPull)
die_follower (ch);
ir = ch->in_room;
if (ch->in_room)
stop_fighting (ch, TRUE);
if (ch->in_room)
char_from_room (ch);
if (RIDING (ch) != NULL)
{
check_fgt (ch->fgt->riding);
ch->fgt->riding->fgt->mounted_by = NULL;
ch->fgt->riding = NULL;
}
if (MOUNTED_BY (ch) != NULL)
{
check_fgt (ch->fgt->mounted_by);
ch->fgt->mounted_by->fgt->riding = NULL;
ch->fgt->mounted_by = NULL;
}
if (IS_PLAYER (ch) && ch->desc != NULL && ch->desc->original != NULL)
do_return (ch, "");
if (fPull)
{
SCRIPT_INFO *si;
SCRIPT_INFO *si_next;
for (si = info_list; si != NULL; si = si_next)
{
si_next = si->next;
if (si->current == ch || si->mob == ch)
{
end_script (si);
}
}
for (wch = char_list; wch != NULL; wch = wch->next)
{
if (MASTER (wch) == ch)
wch->fgt->master = NULL;
if (LEADER (wch) == ch)
wch->fgt->leader = NULL;
if (RIDING (wch) == ch)
wch->fgt->riding = NULL;
if (MOUNTED_BY (wch) == ch)
wch->fgt->mounted_by = NULL;
if (wch->ced && wch->ced->reply == ch)
wch->ced->reply = NULL;
}
if (ch == char_list)
{
char_list = ch->next;
ch->next = NULL;
}
else
{
CHAR_DATA *prev;
for (prev = char_list; prev != NULL; prev = prev->next)
{
if (prev->next == ch)
{
prev->next = ch->next;
break;
}
}
if (prev == NULL)
{
fprintf(stderr,"Character placement temp error #1: Char not found in list: %s\n",NAME(ch));
/* ch->next = NULL;*/
/* free_it (ch);*/
return;
}
}
}
if (fPull && IS_PLAYER (ch))
{
for (d = descriptor_list; d != NULL; d = d->next)
{
if (d->character && d->connected == CON_PEDITOR &&
ch == (CHAR_DATA *) d->pEdit)
{
ch->in_room = ir;
return;
}
}
}
if (fPull)
{
if (ch == debugger)
debugger = NULL;
for (obj = ch->carrying; obj != NULL; obj = obj_next)
{
obj_next = obj->next_content;
free_it (obj);
}
}
if (IS_PLAYER (ch) && !fPull)
{
OBJ_PROTOTYPE *oid;
SINGLE_OBJECT *o;
#ifdef NEW_WORLD
if ((oid = get_obj_index (300)) != NULL)
{
o = create_object (oid, 1);
obj_to (o, ch);
}
if ((oid = get_obj_index (301)) != NULL)
{
o = create_object (oid, 1);
obj_to (o, ch);
}
if ((oid = get_obj_index (302)) != NULL)
{
o = create_object (oid, 1);
obj_to (o, ch);
}
if ((oid = get_obj_index (200)) != NULL)
{
o = create_object (oid, 1);
obj_to (o, ch);
}
#endif
ch->pcdata->condition[COND_FULL] = 55;
ch->pcdata->condition[COND_THIRST] = 55;
ch->pcdata->condition[COND_DRUNK] = 0;
}
if (!fPull)
{
strip_all_affects (ch);
if (IS_EVIL (ch))
char_to_room (ch, get_room_index (99));
if (!IS_EVIL (ch))
char_to_room (ch, get_room_index (100));
return;
}
if (IS_MOB (ch))
{
--ch->pIndexData->count;
}
if (IS_PLAYER (ch) && ch->desc)
ch->desc->character = NULL;
free_it (ch);
return;
}
CHAR_DATA *
get_char_room (CHAR_DATA * ch, char *argy)
{
static char arg[500];
CHAR_DATA *rch;
int RCLOOK;
int number;
/*char buf[50]; */
int count;
RCLOOK = 0;
arg[0] = '\0';
number = number_argy (argy, arg);
count = 0;
if (!ch->in_room)
return NULL;
if (!str_cmp (arg, "self"))
return ch;
if (!str_cmp (arg, "me"))
return ch;
RCLOOK = get_race_look (arg);
/*Mobs FIRST */
for (rch = ch->in_room->more->people; rch != NULL; rch = rch->next_in_room)
{
if (!rch->in_room)
continue;
if (IS_PLAYER (rch))
continue;
if (!can_see (ch, rch) || (!is_approx_name (arg, RNAME (rch)) &&
str_prefix (arg, RNAME (rch))))
continue;
if (++count == number)
return rch;
}
/*{
char buf[500];
sprintf(buf,"TEST: Found RACE flag %d in name.\n\r",RCLOOK);
send_to_char(buf,ch);
} */
if (RCLOOK != 0)
{
dummycall ();
for (rch = ch->in_room->more->people; rch != NULL; rch = rch->next_in_room)
{
if (!rch->in_room)
continue;
if (!can_see (ch, rch) || IS_MOB (rch) || IS_MOB (ch))
continue;
if (rch == ch)
continue;
if (!IS_SET (rch->pcdata->raceflag, RCLOOK))
continue;
if ((!IN_BATTLE (ch) && !IN_BATTLE (rch)) &&
((!IS_SET (ch->pcdata->raceflag, RC_EVILRACE) && !IS_SET (rch->pcdata->raceflag, RC_EVILRACE)) ||
(IS_SET (ch->pcdata->raceflag, RC_EVILRACE) && IS_SET (rch->pcdata->raceflag, RC_EVILRACE))
))
continue;
if (++count == number)
return rch;
}
}
{
for (rch = ch->in_room->more->people; rch != NULL; rch = rch->next_in_room)
{
if (!rch->in_room)
continue;
if (!can_see (ch, rch) || (!is_name (arg, RNAME (rch)) &&
str_prefix (arg, RNAME (rch))))
continue;
if (++count == number)
return rch;
}
}
return NULL;
}
/* Find a player in the world */
CHAR_DATA *
get_player_world (CHAR_DATA * ch, char *argy, bool need_see)
{
char arg[SML_LENGTH];
CHAR_DATA *wch;
DESCRIPTOR_DATA *dd;
int number;
int count;
if (!ch->in_room)
return NULL;
if ((wch = get_char_room (ch, argy)) != NULL)
return wch;
number = number_argy (argy, arg);
count = 0;
for (dd = descriptor_list; dd != NULL; dd = dd->next)
{
if (dd->character == NULL)
continue;
if (dd->connected > 0)
continue;
wch = dd->character;
if (!wch->in_room)
continue;
if ((need_see && !can_see (ch, wch)) || !is_approx_name (arg, RNAME (wch)) ||
(ch->in_room && wch->in_room && wch->in_room->area != ch->in_room->area))
continue;
if (++count == number)
return wch;
}
number = number_argy (argy, arg);
count = 0;
for (dd = descriptor_list; dd != NULL; dd = dd->next)
{
if (dd->character == NULL)
continue;
if (dd->connected > 0)
continue;
wch = dd->character;
if (!wch->in_room) continue;
if ((need_see && !can_see (ch, wch)) || !is_name (arg, RNAME (wch)))
continue;
if (++count == number)
return wch;
}
return NULL;
}
CHAR_DATA *
get_char_world (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
CHAR_DATA *wch;
int number;
int count;
if (!ch->in_room)
return NULL;
if ((wch = get_char_room (ch, argy)) != NULL)
return wch;
if ((wch = get_player_world (ch, argy, TRUE)) != NULL)
return wch;
number = number_argy (argy, arg);
count = 0;
number = number_argy (argy, arg);
count = 0;
for (wch = char_list; wch != NULL; wch = wch->next)
{
if (!wch->in_room)
continue;
if (wch->desc && wch->desc > 0)
continue;
if (!can_see (ch, wch) || !is_name (arg, RNAME (wch)))
continue;
if (++count == number)
return wch;
}
return NULL;
}
CHAR_DATA *
get_char_world_2 (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
CHAR_DATA *wch;
int number;
int count;
if (!ch->in_room)
return NULL;
if ((wch = get_char_room (ch, argy)) != NULL)
return wch;
if ((wch = get_player_world (ch, argy, FALSE)) != NULL)
return wch;
number = number_argy (argy, arg);
count = 0;
for (wch = char_list; wch != NULL; wch = wch->next)
{
if (!wch->in_room)
continue;
if (!is_name (arg, RNAME (wch)) &&
str_cmp (arg, NAME (wch)))
continue;
if (++count == number)
return wch;
}
return NULL;
}
SINGLE_OBJECT *
get_obj_type (OBJ_PROTOTYPE * pObjIndex)
{
SINGLE_OBJECT *obj;
for (obj = object_list; obj != NULL; obj = obj->next)
{
if (obj->pIndexData == pObjIndex)
return obj;
}
return NULL;
}
SINGLE_OBJECT *
get_obj_list (CHAR_DATA * ch, char *argy, SINGLE_OBJECT * list)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
int number;
int count;
number = number_argy (argy, arg);
count = 0;
for (obj = list; obj != NULL; obj = obj->next_content)
{
if (can_see_obj (ch, obj) && is_name (arg, obj->pIndexData->name))
{
if (++count == number)
return obj;
}
}
return NULL;
}
SINGLE_OBJECT *
get_obj_carry (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
int number;
int count;
number = number_argy (argy, arg);
count = 0;
for (obj = ch->carrying; obj != NULL; obj = obj->next_content)
{
if ((obj->wear_loc == WEAR_NONE)
&& (obj->pIndexData->item_type == ITEM_FOOD || obj->pIndexData->item_type == ITEM_PILL || can_see_obj (ch, obj))
&& is_name (arg, obj->pIndexData->name))
{
if (++count == number)
return obj;
}
}
for (obj = ch->carrying; obj != NULL; obj = obj->next_content)
{
if ((obj->wear_loc == WEAR_NONE)
&& (obj->pIndexData->item_type == ITEM_FOOD || obj->pIndexData->item_type == ITEM_PILL || can_see_obj (ch, obj))
&& is_approx_name (arg, obj->pIndexData->name))
{
if (++count == number)
return obj;
}
}
return NULL;
}
SINGLE_OBJECT *
get_obj_held (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
int number;
int count;
number = number_argy (argy, arg);
count = 0;
for (obj = ch->carrying; obj != NULL; obj = obj->next_content)
{
if ((obj->wear_loc == WEAR_HOLD_1 || obj->wear_loc == WEAR_HOLD_2)
&& can_see_obj (ch, obj)
&& is_name (arg, obj->pIndexData->name))
{
if (++count == number)
return obj;
}
}
for (obj = ch->carrying; obj != NULL; obj = obj->next_content)
{
if ((obj->wear_loc == WEAR_HOLD_1 || obj->wear_loc == WEAR_HOLD_2)
&& can_see_obj (ch, obj)
&& is_approx_name (arg, obj->pIndexData->name))
{
if (++count == number)
return obj;
}
}
return NULL;
}
SINGLE_OBJECT *
get_obj_wear (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
int number;
int count;
number = number_argy (argy, arg);
count = 0;
for (obj = ch->carrying; obj != NULL; obj = obj->next_content)
{
if (obj->wear_loc != WEAR_NONE
&& can_see_obj (ch, obj)
&& is_name (arg, obj->pIndexData->name))
{
if (++count == number)
return obj;
}
}
for (obj = ch->carrying; obj != NULL; obj = obj->next_content)
{
if (obj->wear_loc != WEAR_NONE
&& can_see_obj (ch, obj)
&& is_approx_name (arg, obj->pIndexData->name))
{
if (++count == number)
return obj;
}
}
return NULL;
}
SINGLE_OBJECT *
get_obj_inv (CHAR_DATA * ch, char *argy)
{
SINGLE_OBJECT *obj;
if ((obj = get_obj_carry (ch, argy)) != NULL)
return obj;
if ((obj = get_obj_wear (ch, argy)) != NULL)
return obj;
return NULL;
}
SINGLE_OBJECT *
get_obj_here (CHAR_DATA * ch, char *argy, int lookfirst)
{
SINGLE_OBJECT *obj;
check_room_more (ch->in_room);
if (lookfirst == SEARCH_ROOM_FIRST)
{
obj = get_obj_list (ch, argy, ch->in_room->more->contents);
if (obj != NULL)
return obj;
if ((obj = get_obj_inv (ch, argy)) != NULL)
return obj;
return NULL;
}
else if (lookfirst == SEARCH_INV_FIRST)
{
if ((obj = get_obj_inv (ch, argy)) != NULL)
return obj;
obj = get_obj_list (ch, argy, ch->in_room->more->contents);
if (obj != NULL)
return obj;
return NULL;
}
else
return NULL;
}
SINGLE_OBJECT *
get_obj_world (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
SINGLE_OBJECT *obj;
int number;
int count;
if ((obj = get_obj_here (ch, argy, SEARCH_ROOM_FIRST)) != NULL)
return obj;
number = number_argy (argy, arg);
count = 0;
for (obj = object_list; obj != NULL; obj = obj->next)
{
if (can_see_obj (ch, obj) && is_name (arg, obj->pIndexData->name))
{
if (++count == number)
return obj;
}
}
return NULL;
}
void
create_amount (int amount, CHAR_DATA * pMob, ROOM_DATA * pRoom,
SINGLE_OBJECT * pObj)
{
I_CONTAINER *c = NULL;
if (pObj && pObj->pIndexData->item_type != ITEM_CONTAINER &&
pObj->pIndexData->item_type != ITEM_CORPSE_NPC && pObj->pIndexData->item_type != ITEM_CORPSE_PC)
return;
if (pObj)
c = (I_CONTAINER *) pObj->more;
if (amount <= 0)
{
bug ("Create_amount: zero or negative money %d.", amount);
return;
}
if (amount == 1)
{
if (pMob)
pMob->copper++;
if (pObj)
c->money++;
if (pRoom)
{
check_room_more (pRoom);
pRoom->more->copper++;
}
}
else
{
if (pMob)
{
if (amount >= 100)
{
pMob->gold += (amount / 100);
amount %= 100;
}
if (amount >= 1)
{
pMob->copper += (amount);
}
}
else
{
if (pRoom)
{
check_room_more (pRoom);
if (amount >= 100)
{
pRoom->more->gold += (amount / 100);
amount %= 100;
}
if (amount >= 1)
{
pRoom->more->copper += (amount);
}
}
if (pObj)
c->money += amount;
}
}
return;
}
void
fix_amount (CHAR_DATA * ch)
{
int ii;
ii = (ch->gold * 100) + ch->copper;
ch->gold = 0;
ch->copper = 0;
if (ii > 0)
create_amount (ii, ch, NULL, NULL);
return;
}
int
tally_coins (CHAR_DATA * mob)
{
if (mob->gold < 0)
{
fix_amount (mob);
}
return ((mob->gold * 100) + (mob->copper));
}
char *
name_amount (int amount)
{
static char buf[STD_LENGTH];
char buf2[STD_LENGTH];
buf[0] = '\0';
buf2[0] = '\0';
if (amount >= 100)
{
sprintf (buf, "%d %s", amount / 100, "\x1B[33;1mgold\x1B[37;0m");
}
if (amount % 100 > 0)
{
sprintf (buf + strlen (buf), "%s%d %s", buf[0] != '\0' ? ", " : "",
amount % 100, "\x1B[33;0mcopper\x1B[37m");
}
if (buf[0] == '\0')
sprintf (buf, "nothing");
return buf;
}
char *
sub_coins (int amount, CHAR_DATA * ch)
{
static char ret_val[500];
int money = 0;
if (tally_coins (ch) < amount)
{
sprintf (ret_val, "nothing");
bug ("Sub_coins: ch doesn't have enough money (%d)", amount);
return ret_val;
}
if (tally_coins (ch) == amount)
{
ch->gold = 0;
ch->copper = 0;
sprintf (ret_val, "nothing");
return ret_val;
}
if (amount >= 100)
{
ch->gold -= (amount / 100);
amount %= 100;
}
if (amount >= 1)
{
ch->copper -= amount;
}
while (ch->gold < 0)
{
ch->copper -= 100;
ch->gold += 1;
}
while (ch->copper < 0)
{
ch->gold -= 1;
ch->copper += 100;
/*money+=100-(ch->copper); */
}
if (ch->gold < 0)
{
ch->gold = 0;
}
money = 0;
sprintf (ret_val, "%s", name_amount (money));
return ret_val;
}
int
get_obj_number (SINGLE_OBJECT * obj)
{
int number;
if (obj->pIndexData->item_type == ITEM_CONTAINER)
number = 0;
else
number = 1;
for (obj = obj->contains; obj != NULL; obj = obj->next_content)
{
number += get_obj_number (obj);
}
return number;
}
int
get_obj_weight (SINGLE_OBJECT * obj)
{
int weight;
weight = obj->pIndexData->weight;
for (obj = obj->contains; obj != NULL; obj = obj->next_content)
{
weight += get_obj_weight (obj);
}
return weight;
}
int
room_is_dark (ROOM_DATA * oneroom)
{
if (!oneroom || oneroom == NULL)
return FALSE;
if (oneroom->light > 0)
return FALSE;
if (IS_SET (oneroom->room_flags, ROOM_DARK))
return TRUE;
if (IS_SET (oneroom->room_flags, ROOM_INDOORS))
return FALSE;
if (oneroom->sector_type == SECT_INSIDE)
return FALSE;
if (weather_info.sunlight == SUN_RISE
|| weather_info.sunlight == SUN_LIGHT ||
weather_info.sunlight == SUN_SET)
return FALSE;
return TRUE;
}
bool
can_see (CHAR_DATA * ch, CHAR_DATA * victim)
{
/* Orin sees all */
if (IS_PLAYER (ch) && !str_cmp ("Orin", NAME (ch)))
return TRUE;
if (ch == victim)
return TRUE;
if (IS_PLAYER (victim)
&& victim->pcdata->wizinvis >= LEVEL (ch)
&& LEVEL (ch) < LEVEL (victim))
return FALSE;
if (IS_PLAYER (ch) && IS_SET (ch->act, PLR_HOLYLIGHT))
return TRUE;
if (IS_AFFECTED (ch, AFF_BLIND))
return FALSE;
if (IS_AFFECTED (victim, AFF_INVISIBLE)
&& !IS_AFFECTED (ch, AFF_DETECT_INVIS))
return FALSE;
if (IS_AFFECTED (victim, AFF_HIDE)
&& !IS_AFFECTED (ch, AFF_DETECT_HIDDEN)
&& FIGHTING (victim) == NULL)
return FALSE;
if (weather_info.sky == SKY_FOGGY && IS_PLAYER (ch)
&& number_bits (2) != 0)
return FALSE;
if (room_is_dark (ch->in_room) && !IS_AFFECTED (ch, AFF_INFRARED))
return FALSE;
return TRUE;
}
bool
can_see_nextdoor (CHAR_DATA * ch, CHAR_DATA * victim)
{
if (!ch || !victim)
return FALSE;
if (IS_PLAYER (ch) && !str_cmp ("Orin", NAME (ch)))
return TRUE;
if (ch == victim)
return TRUE;
if (IS_PLAYER (victim)
&& victim->pcdata->wizinvis >= ch->pcdata->level
)
return FALSE;
if (IS_PLAYER (ch) && IS_SET (ch->act, PLR_HOLYLIGHT))
return TRUE;
if (IS_AFFECTED (ch, AFF_BLIND))
return FALSE;
if (IS_AFFECTED (victim, AFF_INVISIBLE)
&& !IS_AFFECTED (ch, AFF_DETECT_INVIS))
return FALSE;
if (IS_AFFECTED (victim, AFF_HIDE)
&& !IS_AFFECTED (ch, AFF_DETECT_HIDDEN)
&& FIGHTING (victim) == NULL)
return FALSE;
if (weather_info.sky == SKY_FOGGY && IS_PLAYER (ch)
&& number_bits (2) != 0)
return FALSE;
if (room_is_dark (victim->in_room) && !IS_AFFECTED (ch, AFF_INFRARED)) /*This is the only change */
return FALSE;
return TRUE;
}
bool
can_see_obj (CHAR_DATA * ch, SINGLE_OBJECT * obj)
{
if (IS_PLAYER (ch) && IS_SET (ch->act, PLR_HOLYLIGHT))
return TRUE;
if (IS_AFFECTED (ch, AFF_BLIND))
return FALSE;
if (IS_SET (obj->pIndexData->extra_flags, ITEM_UNSEEN)
&& (IS_SET (obj->pIndexData->wear_flags, ITEM_TAKE)))
return FALSE;
if (obj->pIndexData->item_type == ITEM_LIGHT && IS_LIT (obj))
return TRUE;
if (obj->carried_by == ch)
return TRUE;
if (room_is_dark (ch->in_room) && !IS_AFFECTED (ch, AFF_INFRARED))
return FALSE;
if (IS_SET (obj->pIndexData->extra_flags, ITEM_INVIS)
&& !IS_AFFECTED (ch, AFF_DETECT_INVIS))
return FALSE;
return TRUE;
}
/*
* True if char can drop obj.
*/
bool
can_drop_obj (CHAR_DATA * ch, SINGLE_OBJECT * obj)
{
if (!obj)
return TRUE;
if (!IS_SET (obj->pIndexData->extra_flags, ITEM_NODROP))
return TRUE;
if (IS_PLAYER (ch) && ch->pcdata->level >= LEVEL_IMMORTAL)
return TRUE;
/*if ( NOT_WORN( obj ) )
return TRUE; */
return FALSE;
}
/*
* Return ascii name of a mob type.
*/
char *
mob_type_name (int mob_type)
{
static char retv[30];
switch (mob_type)
{
case MOB_HUMAN:
strcpy (retv, "humanoid");
break;
case MOB_ELF:
strcpy (retv, "elf");
break;
case MOB_DWARF:
strcpy (retv, "dwarf");
break;
case MOB_GNOME:
strcpy (retv, "gnome");
break;
case MOB_GIANT:
strcpy (retv, "giant");
break;
case MOB_DRAGON:
strcpy (retv, "dragon");
break;
case MOB_CANINE:
strcpy (retv, "canine");
break;
case MOB_RODENT:
strcpy (retv, "rodent");
break;
case MOB_INSECT:
strcpy (retv, "insect");
break;
case MOB_UNDEAD:
strcpy (retv, "undead");
break;
case MOB_GOLEM:
strcpy (retv, "golem");
break;
case MOB_DEMON:
strcpy (retv, "demon");
break;
case MOB_TROLL:
strcpy (retv, "troll");
break;
case MOB_BIRD:
strcpy (retv, "bird");
break;
case MOB_FISH:
strcpy (retv, "fish");
break;
case MOB_STATUE:
strcpy (retv, "statue");
break;
case MOB_FELINE:
strcpy (retv, "feline");
break;
case MOB_PLANT:
strcpy (retv, "plant");
break;
case MOB_GENERAL_ANIMAL:
strcpy (retv, "general");
break;
case MOB_FAERIE:
strcpy (retv, "faerie");
break;
case MOB_REPTILE:
strcpy (retv, "reptile");
break;
case MOB_GHOST:
strcpy (retv, "ghost");
break;
case MOB_LYCAN:
strcpy (retv, "werebeast");
break;
case MOB_NIGHT:
strcpy (retv, "nightbeast");
break;
case MOB_ORC:
strcpy (retv, "orc");
break;
case MOB_DARKELF:
strcpy (retv, "darkelf");
break;
case MOB_DUMMY:
strcpy (retv, "dummy");
break;
case MOB_OTHER:
strcpy (retv, "other");
break;
default:
strcpy (retv, "unknown");
break;
}
return retv;
}
/*
* Return ascii attack of a mob type.
*/
char *
mob_type_attack (int mob_type)
{
static char retv[30];
switch (mob_type)
{
case MOB_HUMAN:
strcpy (retv, "punch");
break;
case MOB_ELF:
strcpy (retv, "punch");
break;
case MOB_DWARF:
strcpy (retv, "punch");
break;
case MOB_GNOME:
strcpy (retv, "punch");
break;
case MOB_GIANT:
strcpy (retv, "punch");
break;
case MOB_DRAGON:
strcpy (retv, "claw");
break;
case MOB_CANINE:
strcpy (retv, "bite");
break;
case MOB_RODENT:
strcpy (retv, "bite");
break;
case MOB_INSECT:
strcpy (retv, "sting");
break;
case MOB_UNDEAD:
strcpy (retv, "touch");
break;
case MOB_GOLEM:
strcpy (retv, "slap");
break;
case MOB_DEMON:
strcpy (retv, "claw");
break;
case MOB_TROLL:
strcpy (retv, "claw");
break;
case MOB_BIRD:
strcpy (retv, "peck");
break;
case MOB_FISH:
strcpy (retv, "bite");
break;
case MOB_STATUE:
strcpy (retv, "punch");
break;
case MOB_FELINE:
strcpy (retv, "scratch");
break;
case MOB_PLANT:
strcpy (retv, "scratch");
break;
case MOB_GENERAL_ANIMAL:
strcpy (retv, "bite");
break;
case MOB_FAERIE:
strcpy (retv, "touch");
break;
case MOB_REPTILE:
strcpy (retv, "bite");
break;
case MOB_GHOST:
strcpy (retv, "grasp");
break;
case MOB_LYCAN:
strcpy (retv, "claw");
break;
case MOB_NIGHT:
strcpy (retv, "bite");
break;
case MOB_OTHER:
strcpy (retv, "scratch");
break;
case MOB_DUMMY:
strcpy (retv, "attack");
break;
default:
strcpy (retv, "punch");
break;
}
return retv;
}
/*
* Return ascii name of an item type.
*/
char *
item_type_name (int item_type)
{
static char retv[30];
switch (item_type)
{
case ITEM_LIGHT:
strcpy (retv, "light");
break;
case ITEM_SCROLL:
strcpy (retv, "scroll");
break;
case ITEM_WAND:
strcpy (retv, "wand");
break;
case ITEM_STAFF:
strcpy (retv, "staff");
break;
case ITEM_MAP:
strcpy (retv, "map");
break;
case ITEM_WEAPON:
strcpy (retv, "weapon");
break;
case ITEM_RANGED_WEAPON:
strcpy (retv, "ranged");
break;
case ITEM_AMMO:
strcpy (retv, "ammo");
break;
case ITEM_TREASURE:
strcpy (retv, "treasure");
break;
case ITEM_ARMOR:
strcpy (retv, "armor");
break;
case ITEM_POTION:
strcpy (retv, "potion");
break;
case ITEM_BOOK:
strcpy (retv, "book");
break;
case ITEM_FURNITURE:
strcpy (retv, "furniture");
break;
case ITEM_TRASH:
strcpy (retv, "trash");
break;
case ITEM_CONTAINER:
strcpy (retv, "container");
break;
case ITEM_THROWN:
strcpy (retv, "thrown");
break;
case ITEM_DRINK_CON:
strcpy (retv, "drink container");
break;
case ITEM_KEY:
strcpy (retv, "key");
break;
case ITEM_FOOD:
strcpy (retv, "food");
break;
case ITEM_GEM:
strcpy (retv, "gem");
break;
case ITEM_VEHICLE:
strcpy (retv, "vehicle");
break;
case ITEM_CORPSE_NPC:
strcpy (retv, "npc corpse");
break;
case ITEM_CORPSE_PC:
strcpy (retv, "pc corpse");
break;
case ITEM_FOUNTAIN:
strcpy (retv, "fountain");
break;
case ITEM_PILL:
strcpy (retv, "pill");
break;
case ITEM_TOOL:
strcpy (retv, "tool");
break;
case ITEM_LIST:
strcpy (retv, "list");
break;
case ITEM_BLOOD:
strcpy (retv, "blood");
break;
case ITEM_CLIMBABLE:
strcpy (retv, "climbable");
break;
case ITEM_SCALABLE:
strcpy (retv, "scalable");
break;
case ITEM_SCALE_DEV:
strcpy (retv, "scale_dev");
break;
case ITEM_BOAT:
strcpy (retv, "boat");
break;
case ITEM_REPELLANT:
strcpy (retv, "repellant");
break;
default:
strcpy (retv, "(unknown)");
break;
}
return retv;
}
int
mob_name_type (char *name)
{
if (!str_cmp (name, "human"))
return MOB_HUMAN;
if (!str_cmp (name, "elf"))
return MOB_ELF;
if (!str_cmp (name, "dwarf"))
return MOB_DWARF;
if (!str_cmp (name, "gnome"))
return MOB_GNOME;
if (!str_cmp (name, "giant"))
return MOB_GIANT;
if (!str_cmp (name, "dragon"))
return MOB_DRAGON;
if (!str_cmp (name, "canine"))
return MOB_CANINE;
if (!str_cmp (name, "rodent"))
return MOB_RODENT;
if (!str_cmp (name, "insect"))
return MOB_INSECT;
if (!str_cmp (name, "undead"))
return MOB_UNDEAD;
if (!str_cmp (name, "golem"))
return MOB_GOLEM;
if (!str_cmp (name, "demon"))
return MOB_DEMON;
if (!str_cmp (name, "troll"))
return MOB_TROLL;
if (!str_cmp (name, "bird"))
return MOB_BIRD;
if (!str_cmp (name, "fish"))
return MOB_FISH;
if (!str_cmp (name, "statue"))
return MOB_STATUE;
if (!str_cmp (name, "feline"))
return MOB_FELINE;
if (!str_cmp (name, "plant"))
return MOB_PLANT;
if (!str_cmp (name, "ghost"))
return MOB_GHOST;
if (!str_cmp (name, "werebeast"))
return MOB_LYCAN;
if (!str_cmp (name, "nightbeast"))
return MOB_NIGHT;
if (!str_cmp (name, "other"))
return MOB_OTHER;
if (!str_cmp (name, "general_animal"))
return MOB_GENERAL_ANIMAL;
if (!str_cmp (name, "faerie"))
return MOB_FAERIE;
if (!str_cmp (name, "reptile"))
return MOB_REPTILE;
if (!str_cmp (name, "orc"))
return MOB_ORC;
if (!str_cmp (name, "darkelf"))
return MOB_DARKELF;
if (!str_cmp (name, "dummy"))
return MOB_DUMMY;
return -1;
}
int
item_name_type (char *name)
{
if (!str_cmp (name, "light"))
return ITEM_LIGHT;
if (!str_cmp (name, "scroll"))
return ITEM_SCROLL;
if (!str_cmp (name, "wand"))
return ITEM_WAND;
if (!str_cmp (name, "staff"))
return ITEM_STAFF;
if (!str_cmp (name, "map"))
return ITEM_MAP;
if (!str_cmp (name, "boat"))
return ITEM_BOAT;
if (!str_cmp (name, "repellant"))
return ITEM_REPELLANT;
if (!str_cmp (name, "weapon"))
return ITEM_WEAPON;
if (!str_cmp (name, "ranged"))
return ITEM_RANGED_WEAPON;
if (!str_cmp (name, "ammo"))
return ITEM_AMMO;
if (!str_cmp (name, "treasure"))
return ITEM_TREASURE;
if (!str_cmp (name, "armor"))
return ITEM_ARMOR;
if (!str_cmp (name, "potion"))
return ITEM_POTION;
if (!str_cmp (name, "book"))
return ITEM_BOOK;
if (!str_cmp (name, "furniture"))
return ITEM_FURNITURE;
if (!str_cmp (name, "trash"))
return ITEM_TRASH;
if (!str_cmp (name, "container"))
return ITEM_CONTAINER;
if (!str_cmp (name, "thrown"))
return ITEM_THROWN;
if (!str_cmp (name, "drink"))
return ITEM_DRINK_CON;
if (!str_cmp (name, "key"))
return ITEM_KEY;
if (!str_cmp (name, "food"))
return ITEM_FOOD;
if (!str_cmp (name, "gem"))
return ITEM_GEM;
if (!str_cmp (name, "vehicle"))
return ITEM_VEHICLE;
if (!str_cmp (name, "corpse"))
return ITEM_CORPSE_NPC;
if (!str_cmp (name, "fountain"))
return ITEM_FOUNTAIN;
if (!str_cmp (name, "pill"))
return ITEM_PILL;
if (!str_cmp (name, "tool"))
return ITEM_TOOL;
if (!str_cmp (name, "list"))
return ITEM_LIST;
if (!str_cmp (name, "blood"))
return ITEM_BLOOD;
if (!str_cmp (name, "climbable"))
return ITEM_CLIMBABLE;
if (!str_cmp (name, "scalable"))
return ITEM_SCALABLE;
if (!str_cmp (name, "scale_dev"))
return ITEM_SCALE_DEV;
return 0;
}
/*
* Return ascii name of an affect location.
*/
char *
affect_loc_name (int location)
{
static char retv[30];
switch (location)
{
case APPLY_NONE:
strcpy (retv, "none");
break;
case APPLY_STR:
strcpy (retv, "strength");
break;
case APPLY_DEX:
strcpy (retv, "dexterity");
break;
case APPLY_INT:
strcpy (retv, "intelligence");
break;
case APPLY_WIS:
strcpy (retv, "wisdom");
break;
case APPLY_CON:
strcpy (retv, "constitution");
break;
case APPLY_HIT:
strcpy (retv, "hp");
break;
case APPLY_MOVE:
strcpy (retv, "moves");
break;
case APPLY_AC:
strcpy (retv, "armor class");
break;
case APPLY_HITROLL:
strcpy (retv, "hit roll");
break;
case APPLY_DAMROLL:
strcpy (retv, "damage roll");
break;
case APPLY_SAVING_THROW:
strcpy (retv, "saving throw");
break;
case APPLY_RESIST_SUMMON:
strcpy (retv, "resist summon");
break;
case APPLY_KICK_DAMAGE:
strcpy (retv, "kick damage");
break;
case APPLY_SNEAK:
strcpy (retv, "sneak bonus");
break;
case APPLY_HIDE:
strcpy (retv, "hide bonus");
break;
default:
strcpy (retv, "(unknown)");
break;
}
return retv;
}
int
affect_name_loc (char *name)
{
if (!str_cmp (name, "none"))
return APPLY_NONE;
if (!str_cmp (name, "strength"))
return APPLY_STR;
if (!str_cmp (name, "dexterity"))
return APPLY_DEX;
if (!str_cmp (name, "intelligence"))
return APPLY_INT;
if (!str_cmp (name, "wisdom"))
return APPLY_WIS;
if (!str_cmp (name, "constitution"))
return APPLY_CON;
if (!str_cmp (name, "hp"))
return APPLY_HIT;
if (!str_cmp (name, "move"))
return APPLY_MOVE;
if (!str_cmp (name, "ac"))
return APPLY_AC;
if (!str_cmp (name, "hit"))
return APPLY_HITROLL;
if (!str_cmp (name, "dam"))
return APPLY_DAMROLL;
if (!str_cmp (name, "saving_throw"))
return APPLY_SAVING_THROW;
if (!str_cmp (name, "resist_summon"))
return APPLY_RESIST_SUMMON;
if (!str_cmp (name, "kick_damage"))
return APPLY_KICK_DAMAGE;
if (!str_cmp (name, "hide_bonus"))
return APPLY_HIDE;
if (!str_cmp (name, "sneak_bonus"))
return APPLY_SNEAK;
return -99;
}
/*
* Return ascii name of an affect bit vector.
*/
char *
affect_bit_name (int vector)
{
static char buf[512];
int i;
buf[0] = '\0';
for (i = 0; str_cmp (affect_flagss[i].what_you_type, "end_of_list"); i++)
if (vector & affect_flagss[i].flagname)
strcat (buf, affect_flagss[i].how_it_appears);
return (buf[0] != '\0') ? buf + 1 : " ";
}
/*
* Return bit vector
*/
int
affect_name_bit (char *buf)
{
int i;
if (!str_cmp(buf,"flaglist")) {
for (i = 0; str_cmp (affect_flagss[i].what_you_type, "end_of_list"); i++) {
if (!affect_flagss[i].shown_in_help) continue;
sprintf(hugebuf_o+strlen(hugebuf_o),"%-10s: ",
affect_flagss[i].what_you_type);
strcat(hugebuf_o,affect_flagss[i].what_it_does);
}
}
for (i = 0; str_cmp (affect_flagss[i].what_you_type, "end_of_list"); i++)
if (!str_cmp (buf, affect_flagss[i].what_you_type))
return affect_flagss[i].flagname;
return 0;
}
char *
affect_bit_name_two (int vector)
{
static char buf[512];
int i;
buf[0] = '\0';
for (i = 0; str_cmp (affect_flags_2[i].what_you_type, "end_of_list"); i++)
if (vector & affect_flags_2[i].flagname)
strcat (buf, affect_flags_2[i].how_it_appears);
return (buf[0] != '\0') ? buf + 1 : " ";
}
/*
* Return bit vector
*/
int
affect_name_bit_two (char *buf)
{
int i;
if (!str_cmp(buf,"flaglist")) {
for (i = 0; str_cmp (affect_flags_2[i].what_you_type, "end_of_list"); i++) {
if (!affect_flags_2[i].shown_in_help) continue;
sprintf(hugebuf_o+strlen(hugebuf_o),"%-10s: ",
affect_flags_2[i].what_you_type);
strcat(hugebuf_o,affect_flags_2[i].what_it_does);
}
}
for (i = 0; str_cmp (affect_flags_2[i].what_you_type, "end_of_list"); i++)
if (!str_cmp (buf, affect_flags_2[i].what_you_type))
return affect_flags_2[i].flagname;
return 0;
}
/*
* Return ascii name of extra flags vector.
*/
char *
extra_bit_name (int extra_flags)
{
static char buf[512];
int i;
buf[0] = '\0';
for (i = 0; str_cmp (extra_flagss[i].what_you_type, "end_of_list"); i++)
if (extra_flags & extra_flagss[i].flagname)
strcat (buf, extra_flagss[i].how_it_appears);
return (buf[0] != '\0') ? buf + 1 : "none";
}
int
extra_name_bit (char *buf)
{
int i;
if (!str_cmp(buf,"flaglist")) {
for (i = 0; str_cmp (extra_flagss[i].what_you_type, "end_of_list"); i++) {
if (!extra_flagss[i].shown_in_help) continue;
sprintf(hugebuf_o+strlen(hugebuf_o),"%-10s: ",
extra_flagss[i].what_you_type);
strcat(hugebuf_o,extra_flagss[i].what_it_does);
}
}
for (i = 0; str_cmp (extra_flagss[i].what_you_type, "end_of_list"); i++)
if (!str_cmp (buf, extra_flagss[i].what_you_type))
return extra_flagss[i].flagname;
return 0;
}
/*
* Return ascii name of room flags vector.
*/
char *
room_bit_name (int room_flags)
{
static char buf[512];
int i;
buf[0] = '\0';
for (i = 0; str_cmp (room_flagss[i].what_you_type, "end_of_list"); i++)
if (room_flags & room_flagss[i].flagname)
strcat (buf, room_flagss[i].how_it_appears);
return (buf[0] != '\0') ? buf + 1 : "none";
}
int
room_name_bit (char *buf)
{
int i;
if (!str_cmp(buf,"flaglist")) {
for (i = 0; str_cmp (room_flagss[i].what_you_type, "end_of_list"); i++) {
if (!room_flagss[i].shown_in_help) continue;
sprintf(hugebuf_o+strlen(hugebuf_o),"%-10s: ",
room_flagss[i].what_you_type);
strcat(hugebuf_o,room_flagss[i].what_it_does);
}
}
for (i = 0; str_cmp (room_flagss[i].what_you_type, "end_of_list"); i++)
if (!str_cmp (buf, room_flagss[i].what_you_type))
return room_flagss[i].flagname;
return 0;
}
char *
race_bit_name (int rc)
{
static char buf[512];
char t[30];
int i;
buf[0] = '\0';
if (rc & RC_EVILRACE)
strcat (buf, " kevil");
if (rc & RC_GOODRACE)
strcat (buf, " kgood");
if (rc & RC_NEUTRALRACE)
strcat (buf, " kneutral");
for (i = 0; i < RACE_COUNT; i++)
if (rc & (1 << i))
{
sprintf (t, " k%s", race_info[i].name);
strcat (buf, t);
}
return (buf[0] != '\0') ? buf + 1 : " ";
}
char *
act_bit_name (int act)
{
static char buf[512];
int i;
buf[0] = '\0';
for (i = 0; str_cmp (act_1[i].what_you_type, "end_of_list"); i++)
if (act & act_1[i].flagname)
strcat (buf, act_1[i].how_it_appears);
return (buf[0] != '\0') ? buf + 1 : " ";
}
/* When using act3 bits, set their names to start with the number
3 so that you can use that to know which act field to set. */
char *
act3_bit_name (int act)
{
static char buf[512];
int i;
buf[0] = '\0';
for (i = 0; str_cmp (act_3[i].what_you_type, "end_of_list"); i++)
if (act & act_3[i].flagname)
strcat (buf, act_3[i].how_it_appears);
return (buf[0] != '\0') ? buf + 1 : " ";
}
char *
act4_bit_name (int act)
{
static char buf[512];
int i;
buf[0] = '\0';
for (i = 0; str_cmp (act_4[i].what_you_type, "end_of_list"); i++)
if (act & act_4[i].flagname)
strcat (buf, act_4[i].how_it_appears);
return (buf[0] != '\0') ? buf + 1 : " ";
}
char *
plr_bit_name (int act)
{
static char buf[512];
buf[0] = '\0';
if (act & PLR_HOLYLIGHT)
strcat (buf, " holylight");
if (act & PLR_HOLYPEACE)
strcat (buf, " holypeace");
if (act & PLR_LOG)
strcat (buf, " log");
if (act & PLR_DENY)
strcat (buf, " deny");
if (act & PLR_FREEZE)
strcat (buf, " freeze");
if (act & WIZ_NOTIFY)
strcat (buf, " notify");
return (buf[0] != '\0') ? buf + 1 : "none";
}
int
race_name_bit (char *buf)
{
int i;
buf++;
for (i = 0; i < RACE_COUNT; i++)
if (!str_cmp (buf, race_info[i].name))
return (1 << i);
if (!str_cmp (buf, "evil"))
return RC_EVILRACE;
if (!str_cmp (buf, "good"))
return RC_GOODRACE;
if (!str_cmp (buf, "neutral"))
return RC_NEUTRALRACE;
if (!str_cmp (buf, "all"))
return 0xFFFFFFFF;
if (!str_cmp (buf, "none"))
return 0;
return 0;
}
int
act_name_bit (char *buf)
{
int i;
if (!str_cmp(buf,"flaglist")) {
for (i = 0; str_cmp (act_1[i].what_you_type, "end_of_list"); i++) {
if (!act_1[i].shown_in_help) continue;
sprintf(hugebuf_o+strlen(hugebuf_o),"%-10s: ",
act_1[i].what_you_type);
strcat(hugebuf_o,act_1[i].what_it_does);
}
}
for (i = 0; str_cmp (act_1[i].what_you_type, "end_of_list"); i++)
if (!str_cmp (buf, act_1[i].what_you_type))
return act_1[i].flagname;
/* buf++;*/
if (!str_cmp(buf,"flaglist")) {
for (i = 0; str_cmp (act_3[i].what_you_type, "end_of_list"); i++) {
if (!act_3[i].shown_in_help) continue;
sprintf(hugebuf_o+strlen(hugebuf_o),"%-10s: ",
act_3[i].what_you_type);
strcat(hugebuf_o,act_3[i].what_it_does);
}
}
for (i = 0; str_cmp (act_3[i].what_you_type, "end_of_list"); i++)
if (!str_cmp (buf, act_3[i].what_you_type))
return act_3[i].flagname;
if (!str_cmp(buf,"flaglist")) {
for (i = 0; str_cmp (act_4[i].what_you_type, "end_of_list"); i++) {
if (!act_4[i].shown_in_help) continue;
sprintf(hugebuf_o+strlen(hugebuf_o),"%-10s: ",
act_4[i].what_you_type);
strcat(hugebuf_o,act_4[i].what_it_does);
}
}
for (i = 0; str_cmp (act_4[i].what_you_type, "end_of_list"); i++)
if (!str_cmp (buf, act_4[i].what_you_type))
return act_4[i].flagname;
return 0;
}
/*
* Returns the name of a wear bit.
*/
char *
wear_bit_name (int wear)
{
static char buf[512];
buf[0] = '\0';
if (wear & ITEM_TAKE)
strcat (buf, " take");
if (wear & ITEM_WEAR_FINGER)
strcat (buf, " finger");
if (wear & ITEM_WEAR_NECK)
strcat (buf, " neck");
if (wear & ITEM_WEAR_BODY)
strcat (buf, " body");
if (wear & ITEM_WEAR_HEAD)
strcat (buf, " head");
if (wear & ITEM_WEAR_LEGS)
strcat (buf, " legs");
if (wear & ITEM_WEAR_FEET)
strcat (buf, " feet");
if (wear & ITEM_WEAR_HANDS)
strcat (buf, " hands");
if (wear & ITEM_WEAR_ARMS)
strcat (buf, " arms");
if (wear & ITEM_WEAR_SHIELD)
strcat (buf, " shield");
if (wear & ITEM_WEAR_ABOUT)
strcat (buf, " about");
if (wear & ITEM_WEAR_WAIST)
strcat (buf, " waist");
if (wear & ITEM_WEAR_WRIST)
strcat (buf, " wrist");
if (wear & ITEM_WEAR_BELT)
strcat (buf, " belt");
if (wear & ITEM_WIELD)
strcat (buf, " wield");
if (wear & ITEM_HOLD)
strcat (buf, " hold");
if (wear & ITEM_WEAR_SHOULDER)
strcat (buf, " shoulder");
if (wear & ITEM_WEAR_FACE)
strcat (buf, " face");
if (wear & ITEM_FLOATING)
strcat (buf, " floating-nearby");
if (wear & ITEM_WEAR_EAR1)
strcat (buf, " earrings");
if (wear & ITEM_WEAR_ANKLE)
strcat (buf, " ankle");
return (buf[0] != '\0') ? buf + 1 : "none";
}
/*
* Returns the bit, given a certain name.
*/
int
wear_name_bit (char *buf)
{
if (!str_cmp (buf, "take"))
return ITEM_TAKE;
if (!str_cmp (buf, "finger"))
return ITEM_WEAR_FINGER;
if (!str_cmp (buf, "neck"))
return ITEM_WEAR_NECK;
if (!str_cmp (buf, "body"))
return ITEM_WEAR_BODY;
if (!str_cmp (buf, "head"))
return ITEM_WEAR_HEAD;
if (!str_cmp (buf, "legs"))
return ITEM_WEAR_LEGS;
if (!str_cmp (buf, "feet"))
return ITEM_WEAR_FEET;
if (!str_cmp (buf, "hands"))
return ITEM_WEAR_HANDS;
if (!str_cmp (buf, "arms"))
return ITEM_WEAR_ARMS;
if (!str_cmp (buf, "shield"))
return ITEM_WEAR_SHIELD;
if (!str_cmp (buf, "about"))
return ITEM_WEAR_ABOUT;
if (!str_cmp (buf, "waist"))
return ITEM_WEAR_WAIST;
if (!str_cmp (buf, "wrist"))
return ITEM_WEAR_WRIST;
if (!str_cmp (buf, "belt"))
return ITEM_WEAR_BELT;
if (!str_cmp (buf, "wield"))
return ITEM_WIELD;
if (!str_cmp (buf, "hold"))
return ITEM_HOLD;
if (!str_cmp (buf, "shoulder"))
return ITEM_WEAR_SHOULDER;
if (!str_cmp (buf, "face"))
return ITEM_WEAR_FACE;
if (!str_cmp (buf, "floating"))
return ITEM_FLOATING;
if (!str_cmp (buf, "ear"))
return ITEM_WEAR_EAR1;
if (!str_cmp (buf, "ankle"))
return ITEM_WEAR_ANKLE;
return 0;
}
/*
* Return ascii name of wear location.
*/
char *
wear_loc_name (int wearloc)
{
static char retv[35];
switch (wearloc)
{
default:
strcpy (retv, "unknown");
break;
case WEAR_NONE:
strcpy (retv, "none");
break;
case WEAR_FINGER_L:
strcpy (retv, "left finger");
break;
case WEAR_FINGER_R:
strcpy (retv, "right finger");
break;
case WEAR_NECK_1:
strcpy (retv, "neck (1)");
break;
case WEAR_NECK_2:
strcpy (retv, "neck (2)");
break;
case WEAR_BODY:
strcpy (retv, "body");
break;
case WEAR_HEAD:
strcpy (retv, "head");
break;
case WEAR_LEGS:
strcpy (retv, "legs");
break;
case WEAR_FEET:
strcpy (retv, "feet");
break;
case WEAR_HANDS:
strcpy (retv, "hands");
break;
case WEAR_ARMS:
strcpy (retv, "arms");
break;
case WEAR_SHIELD:
strcpy (retv, "shield");
break;
case WEAR_ABOUT:
strcpy (retv, "about");
break;
case WEAR_WAIST:
strcpy (retv, "waist");
break;
case WEAR_WRIST_L:
strcpy (retv, "left wrist");
break;
case WEAR_WRIST_R:
strcpy (retv, "right wrist");
break;
case WEAR_FLOATING:
strcpy (retv, "floating nearby");
break;
case WEAR_BELT_1:
strcpy (retv, "belt (1)");
break;
case WEAR_BELT_2:
strcpy (retv, "belt (2)");
break;
case WEAR_BELT_3:
strcpy (retv, "belt (3)");
break;
case WEAR_BELT_4:
strcpy (retv, "belt (4)");
break;
case WEAR_BELT_5:
strcpy (retv, "belt (5)");
break;
case WEAR_HOLD_1:
strcpy (retv, "hold primary");
break;
case WEAR_HOLD_2:
strcpy (retv, "hold secondary");
break;
case WEAR_SHOULDER_L:
strcpy (retv, "left shoulder");
break;
case WEAR_SHOULDER_R:
strcpy (retv, "right shoulder");
break;
case WEAR_FACE:
strcpy (retv, "face");
break;
case WEAR_EAR_1:
strcpy (retv, "right ear");
break;
case WEAR_EAR_2:
strcpy (retv, "left ear");
break;
case WEAR_ANKLE_1:
strcpy (retv, "right ankle");
break;
case WEAR_ANKLE_2:
strcpy (retv, "left ankle");
break;
case MAX_WEAR:
strcpy (retv, "max_wear");
break;
}
return retv;
}
int
wear_name_loc (char *buf)
{
if (is_number (buf))
{
return atoi (buf);
}
if (!str_cmp (buf, "lfinger"))
return WEAR_FINGER_L;
if (!str_cmp (buf, "rfinger"))
return WEAR_FINGER_R;
if (!str_cmp (buf, "neck1"))
return WEAR_NECK_1;
if (!str_cmp (buf, "neck2"))
return WEAR_NECK_2;
if (!str_cmp (buf, "body"))
return WEAR_BODY;
if (!str_cmp (buf, "head"))
return WEAR_HEAD;
if (!str_cmp (buf, "legs"))
return WEAR_LEGS;
if (!str_cmp (buf, "feet"))
return WEAR_FEET;
if (!str_cmp (buf, "hands"))
return WEAR_HANDS;
if (!str_cmp (buf, "arms"))
return WEAR_ARMS;
if (!str_cmp (buf, "shield"))
return WEAR_SHIELD;
if (!str_cmp (buf, "about"))
return WEAR_ABOUT;
if (!str_cmp (buf, "waist"))
return WEAR_WAIST;
if (!str_cmp (buf, "lwrist"))
return WEAR_WRIST_L;
if (!str_cmp (buf, "rwrist"))
return WEAR_WRIST_R;
if (!str_cmp (buf, "floating"))
return WEAR_FLOATING;
if (!str_cmp (buf, "belt1"))
return WEAR_BELT_1;
if (!str_cmp (buf, "belt2"))
return WEAR_BELT_2;
if (!str_cmp (buf, "belt3"))
return WEAR_BELT_3;
if (!str_cmp (buf, "belt4"))
return WEAR_BELT_4;
if (!str_cmp (buf, "belt5"))
return WEAR_BELT_5;
if (!str_cmp (buf, "hold1"))
return WEAR_HOLD_1;
if (!str_cmp (buf, "hold2"))
return WEAR_HOLD_2;
if (!str_cmp (buf, "lshoulder"))
return WEAR_SHOULDER_L;
if (!str_cmp (buf, "rshoulder"))
return WEAR_SHOULDER_R;
if (!str_cmp (buf, "face"))
return WEAR_FACE;
if (!str_cmp (buf, "ear1"))
return WEAR_EAR_1;
if (!str_cmp (buf, "ear2"))
return WEAR_EAR_2;
if (!str_cmp (buf, "ankle1"))
return WEAR_ANKLE_1;
if (!str_cmp (buf, "ankle2"))
return WEAR_ANKLE_2;
if (!str_cmp (buf, "max_wear"))
return MAX_WEAR;
return WEAR_NONE;
}
/*
* Sees if last char is 's' and returns 'is' or 'are' pending.
*/
char *
is_are (char *text)
{
while (*text != '\0')
{
text++;
}
text--;
if (*text == 's' || *text == 'S')
return "are";
else
return "is";
}
/*
* Get an extra description from a list.
*/
char *
get_extra_descr (const char *name, DESCRIPTION_DATA * ed)
{
for (; ed != NULL; ed = ed->next)
{
if (is_name (name, ed->keyword))
return ed->description;
}
return NULL;
}
bool
use_tool (SINGLE_OBJECT * obj, int bit)
{
I_TOOL *t;
if (obj == NULL
|| obj->pIndexData->item_type != ITEM_TOOL)
return FALSE;
t = (I_TOOL *) obj->more;
if (!IS_SET (t->tool_type, bit))
return FALSE;
if (t->uses <= 0)
return FALSE;
t->uses--;
return TRUE;
}
int
PERCENTAGE (int amount, int max)
{
if (max > 0)
return (amount * 100) / max;
return 100;
}
bool
find_str (char *str1, char *str2)
{
bool found;
int length;
char *str;
length = strlen (str2);
str = str2;
found = 0;
while (*str1 != '\0' && *str2 != '\0')
{
if (*str2 == *str1)
{
found++;
str2++;
}
else
{
found = 0;
str2 = str;
}
str1++;
}
if (found != length)
found = 0;
return found;
}