#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;
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->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)
{
//ARC: temporary bug fix until i figure out what the hell is causing ch null to come in
if(ch == NULL) return;
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, IMM_LEVEL, 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;
if (!str_cmp(argy, "enemy"))
return 100;
for (i = 0; i < RACE_COUNT; i++)
{
if (!str_prefix (argy, race_info[i].name))
return i;
}
for (i = 0; i <NUM_ALIGN; i++)
{
if (!str_prefix(argy, align_info[i].name))
return i+50;
}
return -1;
}
/*
* 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;
}
/* These 5 functions return the character's current stats. */
int
get_stat (CHAR_DATA *ch, int num)
{
if (IS_MOB(ch)) return 32;
return URANGE (3, (ch->pcdata->stat[num] + UMIN(2, ch->pcdata->stat_mod[num])), 36);
}
int
get_curr_str (CHAR_DATA * ch)
{
return get_stat (ch, STR) + align_info[ch->pcdata->alignment].bonus[0];
}
int
get_curr_int (CHAR_DATA * ch)
{
return get_stat (ch, INT) + align_info[ch->pcdata->alignment].bonus[1];
}
int
get_curr_dex (CHAR_DATA * ch)
{
return get_stat (ch, DEX) + align_info[ch->pcdata->alignment].bonus[3];
}
int
get_curr_wis (CHAR_DATA * ch)
{
return get_stat (ch, WIS) + align_info[ch->pcdata->alignment].bonus[2];
}
int
get_curr_con (CHAR_DATA * ch)
{
return get_stat (ch, CON) + align_info[ch->pcdata->alignment].bonus[4];
}
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 flagg)
{
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_PLAYER(ch))
{
switch (paf->location)
{
default:
bug ("Affect_modify: unknown location %d.", paf->location);
return;
case APPLY_NONE:
break;
case APPLY_STR:
if (flagg != 1)
ch->pcdata->stat_mod[STR] += mod;
break;
case APPLY_DEX:
if (flagg != 1)
ch->pcdata->stat_mod[DEX] += mod;
break;
case APPLY_INT:
if (flagg != 1)
ch->pcdata->stat_mod[INT] += mod;
break;
case APPLY_WIS:
if (flagg != 1)
ch->pcdata->stat_mod[WIS] += mod;
break;
case APPLY_CON:
if (flagg != 1)
ch->pcdata->stat_mod[CON] += mod;
break;
case APPLY_HIT:
if (flagg != 1)
ch->max_hit += mod;
break;
case APPLY_MOVE:
if (flagg != 1)
ch->max_move += mod;
break;
case APPLY_MANA:
ch->pcdata->n_max_mana += 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:
ch->pcdata->saving_throw += mod;
break;
case APPLY_RESIST_SUMMON:
ch->pcdata->resist_summon += mod;
break;
case APPLY_KICK_DAMAGE:
ch->pcdata->plus_kick += mod;
break;
case APPLY_SNEAK:
ch->pcdata->plus_sneak += mod;
break;
case APPLY_WARMTH:
ch->pcdata->warmth += mod;
break;
case APPLY_HIDE:
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;
ch->more_affected_by |= ch->pcdata->nat_abilities2;
ch->more_affected_by |= race_info[ch->pcdata->race].affect_bits2;
ch->affected_by |= align_info[ch->pcdata->alignment].affect_bits;
ch->more_affected_by |= align_info[ch->pcdata->alignment].affect_bits2;
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_MOB(ch) && (paf->type == gsn_blindness) &&
(IS_SET(ch->pIndexData->act3, ACT3_GUARD_DOOR) ||
IS_SET(ch->pIndexData->act3, ACT3_GUARD_DOOR_ALIGN)))
return; /* JRAJRA - Can't blind guarding mobs. */
if (IS_PLAYER (ch) && (IS_SET (paf->bitvector, AFF_POISON) || paf->type == gsn_poison) && (IS_AFFECTED_EXTRA(ch, AFF_PROT_POISON)))
{
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) && (IS_AFFECTED_EXTRA(ch, AFF_PROT_PLAGUE)))
{
send_to_char ("You are immune to plague; you resist the effect!\n\r", ch);
return;
}
if (IS_PLAYER (ch) && (IS_SET (paf->bitvector, AFF_BLIND) || paf->type == gsn_blindness) && (IS_AFFECTED_EXTRA(ch, AFF_PROT_BLIND)))
{
send_to_char ("You are immune to blindness; you resist the effect!\n\r", ch);
return;
}
if (IS_PLAYER (ch) && (IS_SET (paf->bitvector, AFF_CURSE) || paf->type == gsn_curse) && (IS_AFFECTED_EXTRA(ch, AFF_PROT_CURSE)))
{
send_to_char ("You are immune to curse; you resist the effect!\n\r", ch);
return;
}
if (IS_PLAYER (ch) && (IS_SET (paf->bitvector, AFF_PARALYZE) || paf->type == gsn_paralyze) && IS_AFFECTED_EXTRA(ch, AFF_PROT_PARALYZE))
{
send_to_char ("You are immune to paralysis; 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;
ch->more_affected_by |= ch->pcdata->nat_abilities2;
ch->more_affected_by |= race_info[ch->pcdata->race].affect_bits2;
ch->affected_by |= align_info[ch->pcdata->alignment].affect_bits;
ch->more_affected_by |= align_info[ch->pcdata->alignment].affect_bits2;
FIXIT(ch)
}
return;
}
void
affect_strip_bits2 (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->bitvector2, 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;
ch->more_affected_by |= ch->pcdata->nat_abilities2;
ch->more_affected_by |= race_info[ch->pcdata->race].affect_bits2;
ch->affected_by |= align_info[ch->pcdata->alignment].affect_bits;
ch->more_affected_by |= align_info[ch->pcdata->alignment].affect_bits2;
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;
ch->more_affected_by |= ch->pcdata->nat_abilities2;
ch->more_affected_by |= race_info[ch->pcdata->race].affect_bits2;
ch->affected_by |= align_info[ch->pcdata->alignment].affect_bits;
ch->more_affected_by |= align_info[ch->pcdata->alignment].affect_bits2;
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;
ch->more_affected_by |= ch->pcdata->nat_abilities2;
ch->more_affected_by |= race_info[ch->pcdata->race].affect_bits2;
ch->affected_by |= align_info[ch->pcdata->alignment].affect_bits;
ch->more_affected_by |= align_info[ch->pcdata->alignment].affect_bits2;
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;
}
void
char_from_room (CHAR_DATA * ch)
{
CHAR_DATA *pir;
int kk = 0;
if (!ch || ch->in_room == NULL)
{
return;
}
check_room_more (ch->in_room);
if (IS_PLAYER(ch))
{
ch->in_room->light -= ch->pcdata->light;
if (ch->in_room->light < 0)
ch->in_room->light = 0;
ch->in_room->area->nplayer--;
ch->in_room->more->pcs--;
}
else
{
if (IS_SET(ch->pIndexData->act4, ACT4_COMMANDSCRIPT))
ch->in_room->command_objs--;
if (ch->in_room->command_objs < 0)
ch->in_room->command_objs = 0;
}
if (ch == ch->in_room->more->people)
{
ch->in_room->more->people = ch->next_in_room;
}
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;
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)
{
int i;
if (IS_MOB(ch))
return;
for (i = 0; i < NUM_STATS; i++)
{
if (ch->pcdata->stat[i] > race_info[ch->pcdata->race].limits[i])
ch->pcdata->stat[i] = race_info[ch->pcdata->race].limits[i];
}
return;
}
void
char_to_room (CHAR_DATA * ch, ROOM_DATA * oneroom)
{
bool neww;
neww = FALSE;
check_room_more (oneroom);
if (!oneroom) oneroom = get_room_index(2);
if ((IS_SET(oneroom->room_flags,ROOM_INDOORS)
|| IS_SET(oneroom->room_flags,ROOM_UNDERGROUND) ||
(oneroom->sector_type >= SECT_CAVE)) &&
IS_AFFECTED(ch,AFF_FLYING) && (ch->height > INDOOR_FLY_HEIGHT))
{
send_to_char("You cannot fly while indoors.\n\r",ch);
do_land(ch,"");
}
if (ch->in_room)
{
char_from_room (ch);
}
if (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 (LEVEL(ch)<100) oneroom = get_room_index (100 + ALIGN(ch)); else
oneroom = get_room_index (2);
check_room_more (oneroom);
}
else
{
if (oneroom->area && 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);
oneroom = get_room_index (100+ALIGN(ch));
check_room_more (oneroom);
}
}
if (IS_PLAYER (ch) && !IS_SET (ch->act, PLR_HOLYWALK))
{
if (oneroom->vnum >= 100 && oneroom->vnum < (NUM_ALIGN-1+100))
{
DESCRIPTION_DATA *ded;
char *cp;
char kw[500];
char argo[SML_LENGTH];
ch->affected_by |= ch->pcdata->nat_abilities;
ch->affected_by |= race_info[ch->pcdata->race].affect_bits;
ch->more_affected_by |= ch->pcdata->nat_abilities2;
ch->more_affected_by |= race_info[ch->pcdata->race].affect_bits2;
ch->affected_by |= align_info[ch->pcdata->alignment].affect_bits;
ch->more_affected_by |= align_info[ch->pcdata->alignment].affect_bits2;
FIXIT(ch)
fix_char(ch);
natural_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 > (100+NUM_ALIGN-1)))
{
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 (pet_flag)
for (kk = 0; kk < 20; kk++)
ch->pcdata->pet_temp[kk] = 0;
ch->in_room->area->nplayer++;
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 + bg_multiplier) &&
oneroom->vnum <= (BATTLEGROUND_END_VNUM + bg_multiplier))
{
check_fgt (ch);
ch->fgt->in_battle = TRUE;
}
else
{
if (ch->fgt)
{
ch->fgt->in_battle = FALSE;
ch->fgt->wasroomtwo = oneroom->vnum;
}
}
if (oneroom->light < 0) oneroom->light = 0;
if (IS_PLAYER(ch) && ch->pcdata->light >= 0)
oneroom->light +=ch->pcdata->light;
else if (IS_MOB(ch))
{
if (IS_SET(ch->pIndexData->act4, ACT4_COMMANDSCRIPT))
ch->in_room->command_objs++;
}
if (IS_PLAYER(ch) && IS_SET(ch->pcdata->act2, PLR_MAPPING))
{
small_map(ch);
}
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 + bg_multiplier) &&
oneroom->vnum <= (BATTLEGROUND_END_VNUM + bg_multiplier))
{
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++;
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;
}
SINGLE_OBJECT *
get_item_held (CHAR_DATA * ch, int itype)
{
if (ch->hold1 != NULL && ch->hold1->pIndexData->item_type == itype)
return ch->hold1;
if (ch->hold2 != NULL && ch->hold2->pIndexData->item_type == itype)
return ch->hold2;
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;
} //Anti-Align eq added back in since it was removed for some reason... Kilith 05
if ((IS_OBJ_STAT (obj, ITEM_UNHOLY) && ch->pcdata->alignment != 1)
|| (IS_OBJ_STAT (obj, ITEM_HOLY) && ch->pcdata->alignment != 2))
{
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))
{
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
{
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;
}
}
obj->wear_loc = iWear;
if (iWear == WEAR_HOLD_1)
ch->hold1 = obj;
if (iWear == WEAR_HOLD_2)
ch->hold2 = obj;
if (IS_PLAYER(ch))
{
if(obj->pIndexData->item_type == ITEM_ARMOR)
{
I_ARMOR *r = (I_ARMOR *) obj->more;
if (r->max_condition == 0)
{
ch->pcdata->armor[0] += (r->protects_body);
ch->pcdata->armor[1] += (r->protects_head);
ch->pcdata->armor[2] += (r->protects_legs);
ch->pcdata->armor[3] += (r->protects_arms);
}
else
{
ch->pcdata->armor[2] += (r->protects_legs * r->condition_now) / (r->max_condition);
ch->pcdata->armor[0] += (r->protects_body * r->condition_now) / (r->max_condition);
ch->pcdata->armor[1] += (r->protects_head * r->condition_now) / (r->max_condition);
ch->pcdata->armor[3] += (r->protects_arms * r->condition_now) / (r->max_condition);
}
ch->pcdata->warmth += r->warmth;
if (ch->pcdata->warmth < 0)
ch->pcdata->warmth = 0;
}
if (iWear == WEAR_FEET)
SET_BIT(ch->act, PLR_HAS_SHOES);
if (iWear == WEAR_SHIELD)
SET_BIT(ch->act, PLR_HAS_SHIELD);
if (obj->pIndexData->item_type == ITEM_VEHICLE)
{
I_VEHICLE *veh = (I_VEHICLE *) obj->more;
if (veh->sector_use == SECT_SNOW && obj->wear_loc > WEAR_NONE)
SET_BIT(ch->act, PLR_HAS_SNOWSHOES);
if (veh->sector_use == SECT_UNDERWATER && obj->wear_loc > WEAR_NONE)
SET_BIT(ch->act, PLR_HAS_SCUBA);
if (veh->sector_use == SECT_MOUNTAIN && obj->wear_loc > WEAR_NONE)
SET_BIT(ch->act, PLR_HAS_MTN_BOOTS);
}
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;
}
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 (obj->affected != NULL)
for (paf = obj->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)
{
if(++ch->in_room->light < 0) ch->in_room->light = 0;
}
++ch->pcdata->light;
if (ch->move > ch->max_move)
ch->move = ch->max_move;
}
return;
}
int
hand_empty (CHAR_DATA * ch)
{
if (ch->hold1 == NULL)
return WEAR_HOLD_1;
if (ch->hold2 == 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;
int amt;
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);
for (paf = obj->affected; paf != NULL; paf = ((!paf->next) ? NULL : paf->next))
affect_modify (ch, paf, FALSE, 0);
}
if (obj->wear_loc == WEAR_HOLD_1)
ch->hold1 = NULL;
if (obj->wear_loc == WEAR_HOLD_2)
ch->hold2 = NULL;
if (IS_PLAYER(ch))
{
if (obj->wear_loc == WEAR_FEET)
REMOVE_BIT(ch->act, PLR_HAS_SHOES);
if (obj->wear_loc == WEAR_SHIELD)
REMOVE_BIT(ch->act, PLR_HAS_SHIELD);
if (obj->pIndexData->item_type == ITEM_VEHICLE)
{
I_VEHICLE *veh = (I_VEHICLE *) obj->more;
if (veh->sector_use == SECT_SNOW && obj->wear_loc > WEAR_NONE)
REMOVE_BIT(ch->act, PLR_HAS_SNOWSHOES);
if (veh->sector_use == SECT_UNDERWATER && obj->wear_loc > WEAR_NONE)
REMOVE_BIT(ch->act, PLR_HAS_SCUBA);
if (veh->sector_use == SECT_MOUNTAIN && obj->wear_loc > WEAR_NONE)
REMOVE_BIT(ch->act, PLR_HAS_MTN_BOOTS);
}
if(obj->pIndexData->item_type == ITEM_ARMOR)
{
I_ARMOR *r = (I_ARMOR *) obj->more;
if (r->max_condition == 0)
{
ch->pcdata->armor[0] -= (r->protects_body);
ch->pcdata->armor[1] -= (r->protects_head);
ch->pcdata->armor[2] -= (r->protects_legs);
ch->pcdata->armor[3] -= (r->protects_arms);
}
else
{
ch->pcdata->armor[2] -= (r->protects_legs * r->condition_now) / (r->max_condition);
ch->pcdata->armor[0] -= (r->protects_body * r->condition_now) / (r->max_condition);
ch->pcdata->armor[1] -= (r->protects_head * r->condition_now) / (r->max_condition);
ch->pcdata->armor[3] -= (r->protects_arms * r->condition_now) / (r->max_condition);
}
ch->pcdata->warmth -= r->warmth;
if (ch->pcdata->warmth < 0)
ch->pcdata->warmth = 0;
}
obj->wear_loc = -1;
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 (obj->pIndexData->item_type == ITEM_LIGHT && IS_LIT (obj))
{
if (ch->in_room != NULL)
{
if (--ch->in_room->light < 0)
ch->in_room->light = 0;
if(--ch->pcdata->light < 0)
ch->pcdata->light = 0;
}
}
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;
int i;
if (TRUE /*IS_MOB(ch) */ )
clear_tracks (ch);
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 (IS_PLAYER(ch))
{
if(ch->pcdata->guarding != NULL)
{
for(i = 0; i < 4; i++)
{
if(IS_PLAYER(ch->pcdata->guarding))
if (ch->pcdata->guarding->pcdata->guarded_by[i] == ch)
ch->pcdata->guarding->pcdata->guarded_by[i] = NULL;
}
ch->pcdata->guarding = NULL;
}
for (i = 0; i < 4; i++)
{
if(ch->pcdata->guarded_by[i] != NULL)
{
if (IS_PLAYER(ch->pcdata->guarded_by[i]))
ch->pcdata->guarded_by[i]->pcdata->guarding = NULL;
ch->pcdata->guarded_by[i] = NULL;
}
}
}
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)
{
ch->pcdata->condition[COND_FULL] = 55;
ch->pcdata->condition[COND_THIRST] = 55;
ch->pcdata->condition[COND_DRUNK] = 0;
}
if (!fPull)
{
strip_all_affects (ch);
char_to_room(ch, get_room_index(ch->pcdata->alignment+100));
WAIT_STATE(ch, 5*PULSE_VIOLENCE);
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;
if (ch == NULL || !ch->in_room) return NULL;
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;
}
if (RCLOOK != -1)
{
for (rch = ch->in_room->more->people; rch != NULL; rch = rch->next_in_room)
{
if (!rch->in_room)
continue;
if (LEVEL(rch) == MAX_LEVEL)
continue;
if (!can_see (ch, rch) || IS_MOB (rch) || IS_MOB (ch))
continue;
if (LEVEL(rch) == MAX_LEVEL)
continue;
if (rch == ch)
continue;
if (!DIFF_ALIGN(ch, rch))
continue;
// ARC: disassociate enemy keyword with neut
if (RCLOOK == 100 && (ALIGN (ch) == 0 || ALIGN (rch) == 0))
continue;
if (RCLOOK < 100)
{
if (RCLOOK >= 50)
{
if (ALIGN(rch) != (RCLOOK - 50))
continue;
}
else
{
if (rch->pcdata->race != RCLOOK)
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(arg[0] == '\0' && IS_PLAYER(rch))
continue;
if (++count == number)
return rch;
}
return NULL;
}
CHAR_DATA *
get_char_room_near (CHAR_DATA *ch, ROOM_DATA *in_room, int range, char * argy)
{
CHAR_DATA *rch = NULL;
if (!ch || !in_room)
return NULL;
return get_char_room_near2 (ch, in_room, range,argy, 9999);
}
CHAR_DATA *
get_char_room_near2 (CHAR_DATA * ch, ROOM_DATA *in_room, int range, char *argy, int direction)
{
static char arg[500];
char argg[SML_LENGTH];
CHAR_DATA *rch = NULL;
int RCLOOK = 0;
int number;
int count;
int door;
ROOM_DATA *troom;
EXIT_DATA *pexit;
bool people = FALSE;
if(in_room == NULL)
return NULL;
if (ch == NULL) return NULL;
if (range < 0) return NULL;
else range--;
arg[0] = '\0';
strcpy(argg, argy);
number = number_argy (argy, arg);
count = 0;
if (!str_cmp (arg, "self"))
{
return ch;
}
if (!str_cmp (arg, "me"))
{
return ch;
}
check_room_more(in_room);
RCLOOK = get_race_look(arg);
/*Mobs FIRST */
if (!in_room)
{
return NULL;
}
for (rch = in_room->more->people; rch != NULL; rch = rch->next_in_room)
{
people = TRUE;
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;
}
}
if (RCLOOK != -1)
{
for (rch = in_room->more->people; rch != NULL; rch = rch->next_in_room)
{
if (!can_see (ch, rch) || IS_MOB (rch))
continue;
if (LEVEL(rch) == MAX_LEVEL)
continue;
if (rch == ch)
continue;
if (!DIFF_ALIGN(ch, rch))
continue;
// ARC: disassociate enemy keyword with neut
if (RCLOOK == 100 && (ALIGN (ch) == 0 || ALIGN (rch) == 0))
continue;
if (RCLOOK < 100)
{
if (RCLOOK >= 50)
{
if (ALIGN(rch) != (RCLOOK - 50))
continue;
}
else
{
if (rch->pcdata->race != RCLOOK)
continue;
}
}
if (++count == number)
{
return rch;
}
}
}
for (rch = in_room->more->people; rch != NULL; rch = rch->next_in_room)
{
if (!can_see (ch, rch) || (!is_name (arg, RNAME (rch)) &&
str_prefix (arg, RNAME (rch))))
continue;
if(arg[0] == '\0' && IS_PLAYER(rch))
continue;
if (++count == number)
{
return rch;
}
}
if (direction == 9999)
{
for (door = 0; ((door < MAX_DIR)); door++)
{
if ((pexit = in_room->exit[door]) != NULL && (troom = in_room->exit[door]->to_room) != NULL && (!pexit->d_info || !IS_SET(pexit->d_info->exit_info, EX_CLOSED)))
{
if ((rch = get_char_room_near2 (ch, troom, range, argg, door)) != NULL)
return rch;
}
else
rch = NULL;
}
}
if (direction >= 0 && direction < MAX_DIR)
{
if (!people && (pexit = in_room->exit[direction]) != NULL && (troom = in_room->exit[direction]->to_room) != NULL && (!pexit->d_info || !IS_SET(pexit->d_info->exit_info, EX_CLOSED)))
{
if (( rch = get_char_room_near2 (ch, troom, range, argg, direction)) != NULL)
return rch;
}
else rch = NULL;
}
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 || !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;
}
ONLINE * /* JRAJRA - stuff to check the online list for people */
check_online (ONLINE *victim, char* argy)
{
bool found = FALSE;
ONLINE *online;
ONLINE *onlinenx;
int ll = 0;
for (online = been_online; onlinenx != NULL && !found ; online = onlinenx)
{
onlinenx = online->next;
ll++;
if (!str_cmp(online->name,argy))
{
found = TRUE;
break;
}
if (ll > 1000)
break;
}
if (!found)
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[1;33mgold\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 == NULL || oneroom->light > 0)
return FALSE;
if (oneroom->sector_type >= SECT_CAVE || IS_SET(oneroom->room_flags, ROOM_UNDERGROUND) || IS_SET (oneroom->room_flags, ROOM_DARK))
return TRUE;
if (IS_SET (oneroom->room_flags, ROOM_INDOORS) || oneroom->sector_type == SECT_INSIDE)
return FALSE;
if (oneroom->sector_type >= SECT_WOODS && oneroom->sector_type <= SECT_CANYON && weather_info.sky > SKY_RAINING)
return TRUE;
if (weather_info.sunlight > SUN_DARK)
return FALSE;
return TRUE;
}
bool
can_see (CHAR_DATA * ch, CHAR_DATA * victim)
{
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_EXTRA(victim, AFF_CHAMELEON) && !IS_AFFECTED_EXTRA(ch, AFF_DET_CHAMELEON))
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 && !IS_AFFECTED_EXTRA(ch, AFF_DET_FOG))
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 (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 && !IS_AFFECTED_EXTRA(ch, AFF_DET_FOG))
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_num)
{
static char retv[30];
if (mob_num >= 0 && mob_num < MAX_MOB_TYPE)
strcpy(retv, mob_type[mob_num]);
else
strcpy(retv, "unknown");
return retv;
}
/*
* Return ascii attack of a mob type.
*/
char *
mob_type_attack (int mob_type)
{
static char retv[30];
if (mob_type >= 0 && mob_type < MAX_MOB_TYPE)
strcpy(retv, mob_attack[mob_type]);
else
strcpy(retv, "punch");
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_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_HERB:
strcpy (retv, "herb");
break;
case ITEM_WOOD:
strcpy (retv, "wood");
break;
case ITEM_HIDE:
strcpy (retv, "hide");
break;
case ITEM_RAW:
strcpy (retv, "raw material");
break;
case ITEM_CLOTH:
strcpy (retv, "cloth");
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;
case ITEM_TRAP:
strcpy (retv, "trap");
break;
case ITEM_MINERAL:
strcpy (retv, "mineral");
break;
default:
strcpy (retv, "(unknown)");
break;
}
return retv;
}
int
mob_name_type (char *name)
{
int i;
for (i = 0; i < MAX_MOB_TYPE; i++)
{
if (!str_cmp(name, mob_type[i]))
return i;
}
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, "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, "herb"))
return ITEM_HERB;
if (!str_cmp (name, "ammo"))
return ITEM_AMMO;
if (!str_cmp (name, "wood"))
return ITEM_WOOD;
if (!str_cmp (name, "hide"))
return ITEM_HIDE;
if (!str_cmp (name, "raw"))
return ITEM_RAW;
if (!str_cmp (name, "cloth"))
return ITEM_CLOTH;
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;
if (!str_cmp (name, "trap"))
return ITEM_TRAP;
if (!str_cmp (name, "mineral"))
return ITEM_MINERAL;
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_MANA:
strcpy (retv, "mana");
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_WARMTH:
strcpy (retv, "warmth");
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, "mana"))
return APPLY_MANA;
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;
if (!str_cmp(name, "warmth"))
return APPLY_WARMTH;
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 *
augment_bit_name (int vector)
{
static char buf[512];
int i;
buf[0] = '\0';
for (i = 0; str_cmp (augment_flagss[i].what_you_type, "end_of_list"); i++)
if (vector & augment_flagss[i].flagname)
strcat (buf, augment_flagss[i].how_it_appears);
return (buf[0] != '\0') ? buf + 1 : " ";
}
/*
* Return bit vector
*/
int
augment_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 (!augment_flagss[i].shown_in_help) continue;
sprintf(hugebuf_o+strlen(hugebuf_o),"%-10s: ",
augment_flagss[i].what_you_type);
strcat(hugebuf_o,augment_flagss[i].what_it_does);
}
}
for (i = 0; str_cmp (augment_flagss[i].what_you_type, "end_of_list"); i++)
if (!str_cmp (buf, augment_flagss[i].what_you_type))
return augment_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;
}
char *
elemental_alignment_bit_name (int elemental_alignment)
{
static char buf[512];
bool prev = false;
int i;
buf[0] = '\0';
for (i = 0; str_cmp (elemental_alignment_flags[i].what_you_type, "end_of_list"); i++)
if (elemental_alignment & elemental_alignment_flags[i].flagname) {
if(prev) strcat(buf, ",");
strcat (buf, elemental_alignment_flags[i].how_it_appears);
prev = true;
}
return (buf[0] != '\0') ? buf + 1 : "none";
}
char *
item_guild_bit_name (int guild_flags)
{
static char buf[512];
int i;
buf[0] = '\0';
for (i = 0; str_cmp (item_guild_flags[i].what_you_type, "end_of_list"); i++)
if (guild_flags & item_guild_flags[i].flagname)
strcat (buf, item_guild_flags[i].how_it_appears);
return (buf[0] != '\0') ? buf + 1 : "none";
}
/*
* Return ascii name of extra flags vector.
*/
char *
extra_bit_name (long long extra_flags)
{
static char buf[512];
long long 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";
}
long long extra_name_bit (char *buf) {
long long 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;
}
int item_guild_bit (char *buf) {
int i;
if (!str_cmp(buf,"flaglist")) {
for (i = 0; str_cmp (item_guild_flags[i].what_you_type, "end_of_list"); i++) {
if (!item_guild_flags[i].shown_in_help) continue;
sprintf(hugebuf_o+strlen(hugebuf_o),"%-10s: ",
item_guild_flags[i].what_you_type);
strcat(hugebuf_o,item_guild_flags[i].what_it_does);
}
}
for (i = 0; str_cmp (item_guild_flags[i].what_you_type, "end_of_list"); i++)
if (!str_cmp (buf, item_guild_flags[i].what_you_type))
return item_guild_flags[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 *
room_bit_name2 (int room_flags)
{
static char buf[512];
int i;
buf[0] = '\0';
for (i = 0; str_cmp (room_flags2[i].what_you_type, "end_of_list"); i++)
if (room_flags & room_flags2[i].flagname)
strcat (buf, room_flags2[i].how_it_appears);
return (buf[0] != '\0') ? buf + 1 : "none";
}
int
room_name_bit2 (char *buf)
{
int i;
if (!str_cmp(buf,"flaglist")) {
for (i = 0; str_cmp (room_flags2[i].what_you_type, "end_of_list"); i++) {
if (!room_flags2[i].shown_in_help) continue;
sprintf(hugebuf_o+strlen(hugebuf_o),"%-10s: ",
room_flags2[i].what_you_type);
strcat(hugebuf_o,room_flags2[i].what_it_does);
}
}
for (i = 0; str_cmp (room_flags2[i].what_you_type, "end_of_list"); i++)
if (!str_cmp (buf, room_flags2[i].what_you_type))
return room_flags2[i].flagname;
return 0;
}
char *
race_bit_name (int rc)
{
static char buf[512];
char t[30];
int i;
buf[0] = '\0';
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");
if (act & PLR_SAME_SIDE_PK)
strcat (buf, " same_side_pk");
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, "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_TATTOO)
strcat (buf, " tattoo");
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_BACK)
strcat (buf, " back");
if (wear & ITEM_WEAR_EYES)
strcat (buf, " eyes");
if (wear & ITEM_WEAR_ELBOW)
strcat (buf, " elbow");
if (wear & ITEM_WEAR_KNEE)
strcat (buf, " knee");
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, "tattoo"))
return ITEM_WEAR_TATTOO;
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, "eyes"))
return ITEM_WEAR_EYES;
if (!str_cmp (buf, "knee"))
return ITEM_WEAR_KNEE;
if (!str_cmp (buf, "elbow"))
return ITEM_WEAR_ELBOW;
if (!str_cmp (buf, "back"))
return ITEM_WEAR_BACK;
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_1:
strcpy (retv, "left finger");
break;
case WEAR_FINGER_2:
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_TATTOO:
strcpy (retv, "tattoo");
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_1:
strcpy (retv, "left wrist");
break;
case WEAR_WRIST_2:
strcpy (retv, "right wrist");
break;
case WEAR_FLOATING_1:
strcpy (retv, "floating nearby");
break;
case WEAR_FLOATING_2:
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_1:
strcpy (retv, "left shoulder");
break;
case WEAR_SHOULDER_2:
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_1;
if (!str_cmp (buf, "rfinger"))
return WEAR_FINGER_2;
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, "tattoo"))
return WEAR_TATTOO;
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_1;
if (!str_cmp (buf, "rwrist"))
return WEAR_WRIST_2;
if (!str_cmp (buf, "floating1"))
return WEAR_FLOATING_1;
if (!str_cmp(buf, "floating2"))
return WEAR_FLOATING_2;
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_1;
if (!str_cmp (buf, "rshoulder"))
return WEAR_SHOULDER_2;
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 && max < 2000000)
return ((100 * amount)/max);
else
if (max > 0 && max < 2100000000)
return (int)(((float)(amount)*100.00)/(float)(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;
}