#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
#ifndef WINDOWS
#include <sys/time.h>
#endif
/* Fetch a new character from the free list or memory, clear it, then return it */
CHAR_DATA *
new_char (void)
{
CHAR_DATA *ch;
if (char_free == NULL)
{
ch = mem_alloc (sizeof (*ch));
}
else
{
ch = char_free;
char_free = char_free->next;
remove_from_fighting_list (ch);
}
bzero (ch, sizeof (*ch));
ch->data_type = K_CHAR;
clear_data (ch);
return ch;
}
REALCHAR_DATA *
new_pc (void)
{
REALCHAR_DATA *pcdata;
if (pcdata_free == NULL)
{
pcdata = mem_alloc (sizeof (*pcdata));
}
else
{
pcdata = pcdata_free;
pcdata_free = pcdata_free->next;
}
bzero (pcdata, sizeof (*pcdata));
pcdata->data_type = K_PC;
clear_data (pcdata);
return pcdata;
}
void
clear_data (void *thing)
{
CHAR_DATA *ch;
REALCHAR_DATA *pcdata;
SINGLE_OBJECT *obj;
char *t = thing;
if (thing == NULL)
return;
if (*t == K_CHAR || *t == 50)
{
ch = (CHAR_DATA *) thing;
ch->desc = NULL;
remove_from_fighting_list (ch);
ch->ced = NULL;
ch->in_room = NULL;
ch->gen_next = NULL;
ch->data_type = K_CHAR;
ch->armor = 100;
ch->position = POSITION_STANDING;
ch->next_fighting = NULL;
ch->exp = 0;
ch->height = -1;
ch->special = 0;
ch->pIndexData = NULL;
ch->affected = NULL;
ch->timer = -1;
ch->wait = 0;
ch->affected_by = 0;
ch->more_affected_by = 0;
ch->act = 0;
ch->copper = 0;
ch->gold = 0;
ch->position = POSITION_STANDING;
ch->carrying = NULL;
ch->hold1 = NULL;
ch->hold2 = NULL;
ch->hitroll = 0;
ch->damroll = 0;
ch->hit = 20;
ch->max_hit = 20;
ch->move = 70;
ch->max_move = 70;
}
else if (*t == K_PC)
{
int k;
CHANNEL *c;
pcdata = (REALCHAR_DATA *) thing;
pcdata->cursor = 0;
for (k = 0; k < 20; k++)
pcdata->pet_temp[k] = 0;
for (k = 0; k < 20; k++)
pcdata->pet_move[k] = 0;
for (k = 0; k < 20; k++)
pcdata->pet_hps[k] = 0;
pcdata->show_lev = TRUE;
free_string (pcdata->name);
pcdata->name = NULL;
if (pcdata->oldgrep != NULL)
{
free_string (pcdata->oldgrep);
pcdata->oldgrep = NULL;
}
free_string (pcdata->short_descr);
pcdata->short_descr = &str_empty[0];
free_string (pcdata->long_descr);
pcdata->long_descr = &str_empty[0];
free_string (pcdata->description);
pcdata->description = &str_empty[0];
pcdata->chan_ignore = 0;
c = chan_first;
for (k = 0; k < 30; k++)
{
strcpy (pcdata->chan_color[k], c->color);
if (c->next != NULL)
c = c->next;
}
pcdata->transport_quest = 0;
pcdata->cool_skills = 0;
pcdata->security = 9;
pcdata->learn = 1;
pcdata->created = current_time;
pcdata->pray_points = 0;
pcdata->practice = 1;
pcdata->logon = current_time;
pcdata->played = 0;
pcdata->wizinvis = 0;
pcdata->colors[COLOR_CHAT] = 14;
pcdata->colors[COLOR_YELL] = 12;
pcdata->colors[COLOR_CLANTALK] = 10;
pcdata->colors[COLOR_IMMTALK] = 11;
pcdata->colors[COLOR_GODTALK] = 12;
pcdata->colors[COLOR_SAY] = 15;
pcdata->colors[COLOR_TELL] = 10;
pcdata->rprompt = NULL;
pcdata->pwd = &str_empty[0];
pcdata->rpwd = &str_empty[0];
pcdata->beamin = &str_empty[0];
pcdata->beamout = &str_empty[0];
pcdata->title = &str_empty[0];
for (k = 0; k < NUM_STATS; k++)
{
pcdata->stat[k] = 12;
pcdata->stat_mod[k] = 0;
}
pcdata->temp = NULL;
pcdata->totalkills = 0;
pcdata->killpoints = 0;
pcdata->deaths = 0;
pcdata->resist_summon = 0;
pcdata->plus_hide = 0;
pcdata->plus_sneak = 0;
pcdata->plus_kick = 0;
pcdata->armor[0] = 0;
pcdata->armor[1] = 0;
pcdata->armor[2] = 0;
pcdata->armor[3] = 0;
pcdata->clan = -1;
pcdata->clan2 = -1;
pcdata->n_mana = 0;
pcdata->x = 5;
pcdata->y = 10;
pcdata->n_max_mana = 0;
pcdata->warpoints = 0;
pcdata->total_wps = 0;
pcdata->pklevels = 0;
pcdata->pkhelpers = 0;
pcdata->hard_pkills = 0;
pcdata->warmth = 0;
pcdata->pkills = 0;
pcdata->pkilled = 0;
pcdata->pkers = 0;
pcdata->challenge_on = TRUE;
pcdata->remort_times = 0;
pcdata->arena_msg = TRUE;
pcdata->challenged = FALSE;
pcdata->challenge_time = 0;
pcdata->challenged_by = NULL;
pcdata->tickcounts = 0;
pcdata->auction_count = 0;
pcdata->email[0] = '\0';
pcdata->new_exp = FALSE;
pcdata->no_spam = 0;
pcdata->bgf = FALSE;
pcdata->questflag = 0;
pcdata->nat_armor = 100;
pcdata->nat_abilities = 0;
pcdata->guilds = 0;
pcdata->no_quit_pk = 0; /* JRAJRA */
pcdata->number_pets = 0;
pcdata->pagelen = 24;
pcdata->condition[COND_THIRST] = 48;
pcdata->condition[COND_FULL] = 48;
pcdata->condition[COND_DRUNK] = 0;
pcdata->bank = 0;
pcdata->quiet = 0;
pcdata->online_spot = NULL;
pcdata->light = 0;
pcdata->command_objs = 0;
pcdata->mana_shield_strength = 0;
pcdata->elemental_alignment = 0;
pcdata->tmp_con = 0;
pcdata->tmp_dex = 0;
pcdata->tmp_str = 0;
pcdata->tmp_int = 0;
pcdata->tmp_wis = 0;
pcdata->perm_con = 0;
pcdata->perm_dex = 0;
pcdata->perm_str = 0;
pcdata->perm_int = 0;
pcdata->perm_wis = 0;
for (k = 0; k < 4; k++)
pcdata->guarded_by[k] = NULL;
pcdata->guarding = NULL;
for (k = 0; k < MAXST; k++)
{
pcdata->storage[k] = NULL;
}
for (k = 0; k < MAX_IGNORE; k++)
{
pcdata->ignore[k] = NULL;
}
for (k = 0; k < MAX_SCRIPT_FLAGS; k++)
if (pcdata->script_flags[k])
{
free_string (pcdata->script_flags[k]);
pcdata->script_flags[k] = NULL;
}
for (k = 0; k < MAX_TROPHY; k++)
{
pcdata->trophy_name[k][0] = '\0';
pcdata->trophy_times[k] = 0;
pcdata->trophy_level[k] = 0;
}
for (k = 0; k < MAXALIAS; k++)
{
pcdata->alias[k] = NULL;
pcdata->aliasname[k] = NULL;
}
for (k = 0; k < SKILL_COUNT; k++)
pcdata->learned[k] = -100;
pcdata->stance = 0;
}
else if (*t == K_OBJ)
{
obj = (SINGLE_OBJECT *) thing;
obj->in_room = NULL;
obj->wear_loc = WEAR_NONE;
obj->boat = NULL;
obj->contains = NULL;
obj->in_obj = NULL;
obj->more = NULL;
obj->in_room = NULL;
obj->carried_by = NULL;
obj->size = 0;
obj->boat = NULL;
obj->short_descr = NULL;
obj->description = NULL;
obj->timer = -1;
obj->cost = 0;
}
return;
}
void
free_it (void *thing)
{
CHAR_DATA *this;
SINGLE_OBJECT *prev;
SINGLE_OBJECT *obj;
REALCHAR_DATA *pcdata;
char *t = thing;
if (thing == NULL)
return;
if (*t == 50)
return;
if (*t == K_CHAR)
{
CHAR_DATA *dbl;
SINGLE_OBJECT *eobj;
SINGLE_OBJECT *obj_next;
AFFECT_DATA *paf;
AFFECT_DATA *paf_next;
DESCRIPTOR_DATA *d;
this = (CHAR_DATA *) thing;
MARK_CHAR_DEBUG ("free_it", this);
if (IS_MOB (this))
remove_from_aggro_list (this);
remove_from_fighting_list (this);
if (this->desc)
{
this->desc->character = NULL;
}
this->desc = NULL;
if (this == char_list)
char_list = this->next;
else
{
for (dbl = char_list; dbl != NULL; dbl = dbl->next)
{
if (dbl->next == this)
{
dbl->next = this->next;
break;
}
}
}
for (d = descriptor_list; d != NULL; d = d->next)
{
if (d->character && d->connected == CON_PEDITOR &&
this == (CHAR_DATA *) d->pEdit)
return;
}
if (IS_MOB (this))
remove_from_aggro_list (this);
remove_from_fighting_list (this);
if (this->ced)
free_ced (this);
this->ced = NULL;
if (this->in_room)
char_from_room (this);
for (eobj = this->carrying; eobj != NULL; eobj = obj_next)
{
obj_next = eobj->next_content;
free_it (eobj);
}
for (paf = this->affected; paf != NULL; paf = paf_next)
{
paf_next = paf->next;
affect_remove (this, paf);
}
clear_fgt (this);
/* if ( IS_MOB(this) && this->npcdata != NULL )
{
this->npcdata->next = npcdata_free;
npcdata_free = this->npcdata;
}
this->npcdata=NULL; */
if (IS_PLAYER (this) && this->pcdata && this->pcdata != &base_pc)
{
free_it (this->pcdata);
}
this->special|=ISMOB;
this->desc=NULL;
this->pcdata = &base_pc;
this->next = char_free;
char_free = this;
this->data_type = 50;
/*free_m(this); */
}
else if (*t == K_PC)
{
int i;
pcdata = (REALCHAR_DATA *) thing;
if (pcdata == &base_pc)
return;
MARK_DEBUG ("free_it:pcdata");
if (pcdata->challenged_by != NULL)
{
free_string (pcdata->challenged_by);
pcdata->challenged_by = NULL;
}
for (i = 0; i < MAX_IGNORE; i++)
{
if (pcdata->ignore[i])
{
free_string (pcdata->ignore[i]);
}
pcdata->ignore[i] = NULL;
}
pcdata->bank = 0;
for (i = 0; i < MAXST; i++)
{
if (pcdata->storage[i] != NULL)
{
free_it (pcdata->storage[i]);
}
pcdata->storage[i] = NULL;
}
if (pcdata->challenged_by != NULL)
free_string (pcdata->challenged_by);
pcdata->challenged_by = NULL;
if (pcdata->rprompt != NULL)
free_string (pcdata->rprompt);
pcdata->rprompt = NULL;
if (pcdata->rpwd != NULL)
free_string(pcdata->rpwd);
pcdata->rpwd = NULL;
if (pcdata->pwd != NULL)
free_string (pcdata->pwd);
pcdata->pwd = NULL;
if (pcdata->beamin != NULL)
free_string (pcdata->beamin);
pcdata->beamin = NULL;
if (pcdata->beamout != NULL)
free_string (pcdata->beamout);
pcdata->beamout = NULL;
if (pcdata->title != NULL)
free_string (pcdata->title);
pcdata->title = NULL;
pcdata->guarding = NULL;
for (i = 0; i < 4; i++)
pcdata->guarded_by[i] = NULL;
for (i = 0; i < 4; i++)
pcdata->armor[i] = NULL;
/* --------------------- */
/* Init last tells array */
/* --------------------- */
for (i = 0; i < 15; i++)
{
if (pcdata->last_tells[i])
{
free (pcdata->last_tells[i]);
pcdata->last_tells[i] = NULL;
}
}
/* ----------------------- */
/* Init last tells counter */
/* ----------------------- */
pcdata->tell_counter = 0;
/* --------------------------- */
/* Init last group tells array */
/* --------------------------- */
for (i = 0; i < 15;i++)
{
if(pcdata->last_gtells[i])
{
free(pcdata->last_gtells[i]);
pcdata->last_gtells[i] = NULL;
}
}
/* ---------------------------- */
/* Init last group tell counter */
/* ---------------------------- */
pcdata->gtell_counter = 0;
/* --------------------------- */
/* Init last clan tells array */
/* --------------------------- */
for (i = 0; i < 15; i++)
{
if(pcdata->last_ctells[i])
{
free(pcdata->last_ctells[i]);
pcdata->last_ctells[i] = NULL;
}
}
/* ---------------------------- */
/* Init last clan tell counter */
/* ---------------------------- */
pcdata->ctell_counter = 0;
for (i = 0; i < MAXALIAS; i++)
{
if (pcdata->alias[i] != NULL
&& pcdata->aliasname[i] != NULL)
{
free_string (pcdata->alias[i]);
free_string (pcdata->aliasname[i]);
pcdata->alias[i] = NULL;
pcdata->aliasname[i] = NULL;
}
}
pcdata->next = pcdata_free;
pcdata_free = pcdata;
}
else if (*t == K_OBJ)
{
SCRIPT_INFO *inf;
SCRIPT_INFO *inf_next;
SINGLE_OBJECT *obj_content;
SINGLE_OBJECT *obj_next;
obj = (SINGLE_OBJECT *) thing;
MARK_DEBUG ("free_it:object");
for (inf = info_list; inf != NULL; inf = inf_next)
{
inf_next = inf->next;
if (inf->obj == obj)
{
end_script (inf);
}
}
if (obj->in_obj != NULL)
{
obj_from (obj);
free_it (obj);
return;
}
else if (obj->in_room != NULL)
obj_from (obj);
else if (obj->carried_by != NULL)
{
if (obj->wear_loc != -1)
unequip_char (obj->carried_by, obj);
obj_from (obj);
}
if (obj->contains)
for (obj_content = obj->contains; obj_content; obj_content = obj_next)
{
obj_next = obj_content->next_content;
free_it (obj->contains);
}
if (object_list == obj)
{
object_list = obj->next;
}
else
{
for (prev = object_list; prev && prev != NULL; prev = prev->next)
if (prev->next == obj)
{
prev->next = obj->next;
break;
}
}
obj->boat = NULL;
if (obj->short_descr != NULL)
{
free_string (obj->short_descr);
obj->short_descr = NULL;
}
if (obj->description != NULL)
{
free_string (obj->description);
obj->description = NULL;
}
if (obj->more)
{
free_m (obj->more);
obj->more = NULL;
}
--obj->pIndexData->count;
if (obj->affected != NULL)
{
AFFECT_DATA *paf;
AFFECT_DATA *paf_next;
for (paf = obj->affected; paf != NULL; paf = paf_next)
{
paf_next = paf->next;
free_affect(paf);
}
obj->affected = NULL;
}
obj->next = obj_free;
obj_free = obj;
/*free_m(obj); */
}
return;
}
/*void add_to_mob_in_area_list(CHAR_DATA *mob, AREA_DATA *area) {
CHAR_DATA *c;
if (!area || !mob) return;
for (c=mobs_in_area[area->vnum];c!=NULL;c=c->next_in_area) {
if (c==mob) return;
}
mob->next_in_area = mobs_in_area[area->vnum];
mobs_in_area[area->vnum]=mob;
return;
}
void remove_from_mob_in_area_list(CHAR_DATA *mob, AREA_DATA *area) {
CHAR_DATA *c;
if (!mob || !area) return;
for (c=mobs_in_area[area->vnum];c!=NULL;c=c->next_in_area) {
if (c->next_in_area==mob) {
c->next_in_area=mob->next_in_area;
mob->next_in_area=NULL;
return;
}
}
return;
}
int count_mob_vnums_in_area(int vnum, AREA_DATA *area)
{
int i=0;
CHAR_DATA *c;
if (!area) return 0;
for (c=mobs_in_area[area->vnum];c!=NULL;c=c->next_in_area) {
if (IS_MOB(c) && c->pIndexData->vnum==vnum) i++;
}
return i;
}
*/