/************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefiting. We hope that you share your changes too. What goes * * around, comes around. * *************************************************************************** * ROM 2.4 is copyright 1993-1998 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@hypercube.org) * * Gabrielle Taylor (gtaylor@hypercube.org) * * Brian Moore (zump@rom.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * *************************************************************************** * 1stMud ROM Derivative (c) 2001-2004 by Markanth * * http://www.firstmud.com/ <markanth@firstmud.com> * * By using this code you have agreed to follow the term of * * the 1stMud license in ../doc/1stMud/LICENSE * ***************************************************************************/ #include "merc.h" #include "recycle.h" #include "olc.h" #include "tables.h" #include "interp.h" Proto(void free_channel_history, (PcData *)); Proto(void init_channel_history, (PcData *)); BanData *new_ban(void) { BanData *Data; if (ban_free != NULL) { Data = ban_free; ban_free = ban_free->next; top_ban_free--; } else { Data = (BanData *) alloc_perm(sizeof(BanData)); } *Data = ban_zero; top_ban++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Validate(Data); return Data; } void free_ban(BanData * Data) { if (!IsValid(Data)) return; free_string(Data->name); top_ban--; Invalidate(Data); LinkSingle(Data, ban_free, next); top_ban_free++; } Descriptor *new_descriptor(void) { Descriptor *Data; if (descriptor_free != NULL) { Data = descriptor_free; descriptor_free = descriptor_free->next; top_descriptor_free--; } else { Data = (Descriptor *) alloc_perm(sizeof(Descriptor)); } *Data = descriptor_zero; top_descriptor++; Data->next = Data->prev = NULL; Data->connected = CON_GET_TERM; Data->showstr_head = NULL; Data->showstr_point = NULL; Data->run_buf = NULL; Data->run_head = NULL; Data->outsize = 2000; Data->scr_width = DEFAULT_SCR_WIDTH; Data->scr_height = DEFAULT_SCR_HEIGHT; Data->bytes_normal = 0; #ifndef DISABLE_MCCP Data->bytes_compressed = 0; Data->mccp_version = 0; #endif Data->editor = ED_NONE; Data->pEdit = NULL; alloc_mem(Data->outbuf, char, Data->outsize); Data->mxp.supports = &str_empty[0]; Data->mxp.mxp_ver = 0.0; Data->mxp.client_ver = 0.0; Data->mxp.style_ver = 0.0; Data->mxp.client = &str_empty[0]; Validate(Data); return Data; } void free_descriptor(Descriptor * Data) { if (!IsValid(Data)) return; free_string(Data->host); free_string(Data->showstr_head); free_mem(Data->outbuf); free_string(Data->mxp.supports); free_string(Data->mxp.client); top_descriptor--; Invalidate(Data); LinkSingle(Data, descriptor_free, next); top_descriptor_free++; } GenData *new_gen_data(void) { GenData *Data; if (gen_data_free != NULL) { Data = gen_data_free; gen_data_free = gen_data_free->next; top_gen_data_free--; } else { Data = (GenData *) alloc_perm(sizeof(GenData)); } *Data = gen_data_zero; top_gen_data++; Data->next = Data->prev = NULL; alloc_mem(Data->skill_chosen, bool, top_skill); alloc_mem(Data->group_chosen, bool, top_group); Data->rerolls = 1; Validate(Data); return Data; } void free_gen_data(GenData * Data) { if (!IsValid(Data)) return; free_mem(Data->skill_chosen); free_mem(Data->group_chosen); top_gen_data--; Invalidate(Data); LinkSingle(Data, gen_data_free, next); top_gen_data_free++; } ExDescrData *new_ed(void) { ExDescrData *Data; if (ed_free != NULL) { Data = ed_free; ed_free = ed_free->next; top_ed_free--; } else { Data = (ExDescrData *) alloc_perm(sizeof(ExDescrData)); } *Data = ed_zero; top_ed++; Data->next = Data->prev = NULL; Data->keyword = &str_empty[0]; Data->description = &str_empty[0]; Validate(Data); return Data; } void free_ed(ExDescrData * Data) { if (!IsValid(Data)) return; free_string(Data->keyword); free_string(Data->description); top_ed--; Invalidate(Data); LinkSingle(Data, ed_free, next); top_ed_free++; } AffectData *new_affect(void) { AffectData *Data; if (affect_free != NULL) { Data = affect_free; affect_free = affect_free->next; top_affect_free--; } else { Data = (AffectData *) alloc_perm(sizeof(AffectData)); } *Data = affect_zero; top_affect++; Data->next = Data->prev = NULL; Validate(Data); return Data; } void free_affect(AffectData * Data) { if (!IsValid(Data)) return; top_affect--; Invalidate(Data); LinkSingle(Data, affect_free, next); top_affect_free++; } ObjData *new_obj(void) { ObjData *Data; if (obj_free != NULL) { Data = obj_free; obj_free = obj_free->next; top_obj_free--; } else { Data = (ObjData *) alloc_perm(sizeof(ObjData)); } *Data = obj_zero; top_obj++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Data->short_descr = &str_empty[0]; Data->description = &str_empty[0]; Data->owner = &str_empty[0]; Validate(Data); return Data; } void free_obj(ObjData * Data) { AffectData *paf, *paf_next; ExDescrData *ed, *ed_next; if (!IsValid(Data)) return; for (paf = Data->affect_first; paf != NULL; paf = paf_next) { paf_next = paf->next; free_affect(paf); } Data->affect_first = NULL; for (ed = Data->ed_first; ed != NULL; ed = ed_next) { ed_next = ed->next; free_ed(ed); } Data->ed_first = Data->ed_last = NULL; free_string(Data->name); free_string(Data->description); free_string(Data->short_descr); free_string(Data->owner); top_obj--; Invalidate(Data); LinkSingle(Data, obj_free, next); top_obj_free++; } CharData *new_char(void) { CharData *Data; int i; if (char_free != NULL) { Data = char_free; char_free = char_free->next; top_char_free--; } else { Data = (CharData *) alloc_perm(sizeof(CharData)); } *Data = char_zero; top_char++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Data->short_descr = &str_empty[0]; Data->long_descr = &str_empty[0]; Data->description = &str_empty[0]; Data->prompt = &str_empty[0]; Data->gprompt = &str_empty[0]; Data->prefix = &str_empty[0]; Data->logon = current_time; Data->lines = 0; Data->columns = 0; Data->rank = 0; Data->deity = NULL; memset(Data->armor, 100, MAX_AC); Data->position = POS_STANDING; Data->hit = 20; Data->max_hit = 20; Data->mana = 100; Data->max_mana = 100; Data->move = 100; Data->max_move = 100; memset(Data->perm_stat, 13, STAT_MAX); memset(Data->mod_stat, 0, STAT_MAX); memset(Data->stance, 0, MAX_STANCE); Data->color_prefix = COLORCODE; for (i = 0; i < MAX_MCLASS; i++) Data->Class[i] = -1; Data->Class[CLASS_COUNT] = 0; Validate(Data); return Data; } void free_char(CharData * Data) { ObjData *obj, *obj_next; AffectData *paf, *paf_next; if (!IsValid(Data)) return; if (IsNPC(Data)) mobile_count--; for (obj = Data->carrying_first; obj != NULL; obj = obj_next) { obj_next = obj->next_content; extract_obj(obj); } for (paf = Data->affect_first; paf != NULL; paf = paf_next) { paf_next = paf->next; affect_remove(Data, paf); } free_string(Data->name); free_string(Data->short_descr); free_string(Data->long_descr); free_string(Data->description); free_string(Data->prompt); free_string(Data->gprompt); free_string(Data->prefix); free_pcdata(Data->pcdata); top_char--; Invalidate(Data); LinkSingle(Data, char_free, next); top_char_free++; } PcData *new_pcdata(void) { PcData *Data; int i; if (pcdata_free != NULL) { Data = pcdata_free; pcdata_free = pcdata_free->next; top_pcdata_free--; } else { Data = (PcData *) alloc_perm(sizeof(PcData)); } *Data = pcdata_zero; top_pcdata++; Data->next = Data->prev = NULL; for (i = 0; i < MAX_ALIAS; i++) { Data->alias[i] = &str_empty[0]; Data->alias_sub[i] = &str_empty[0]; } for (i = 0; i < MAX_BUDDY; i++) Data->buddies[i] = &str_empty[0]; for (i = 0; i < MAX_IGNORE; i++) { Data->ignore[i] = &str_empty[0]; Data->ignore_flags[i] = 0; } for (i = 0; i < MAX_BOARD; i++) Data->unsubscribed[i] = false; init_channel_history(Data); Data->buffer = new_buf(); alloc_mem(Data->learned, int, top_skill); alloc_mem(Data->group_known, bool, top_group); Data->str_ed_key = '/'; Data->clan = NULL; Data->invited = NULL; Data->confirm_delete = false; Data->board = &boards[DEFAULT_BOARD]; Data->pwd = &str_empty[0]; Data->webpass = &str_empty[0]; Data->email = &str_empty[0]; Data->bamfin = &str_empty[0]; Data->bamfout = &str_empty[0]; Data->title = &str_empty[0]; Data->pretit = &str_empty[0]; Data->who_descr = &str_empty[0]; Data->afk_msg = &str_empty[0]; memset(Data->condition, 48, COND_MAX); Data->condition[COND_DRUNK] = 0; memset(Data->gamestat, 0, MAX_GAMESTAT); memset(Data->timers, 0, MAX_TIMER); Data->timezone = -1; Data->prime_class = 0; Data->trivia = 0; Data->color_scheme = NULL; Data->colors = NULL; Validate(Data); return Data; } void free_pcdata(PcData * Data) { int alias, pos, ignore; NameList *nl, *nl_next; if (!IsValid(Data)) return; for (nl = Data->killer_first; nl != NULL; nl = nl_next) { nl_next = nl->next; free_namelist(nl); } free_string(Data->pwd); free_string(Data->bamfin); free_string(Data->bamfout); free_string(Data->title); free_string(Data->pretit); free_string(Data->who_descr); free_string(Data->webpass); free_string(Data->afk_msg); free_string(Data->email); free_buf(Data->buffer); free_mem(Data->learned); free_mem(Data->group_known); for (alias = 0; alias < MAX_ALIAS; alias++) { free_string(Data->alias[alias]); free_string(Data->alias_sub[alias]); } for (pos = 0; pos < MAX_BUDDY; pos++) free_string(Data->buddies[pos]); for (ignore = 0; ignore < MAX_IGNORE; ignore++) free_string(Data->ignore[ignore]); #ifndef DISABLE_I3 free_i3chardata(Data); #endif if (Data->colors != NULL) free_mem(Data->colors); free_channel_history(Data); top_pcdata--; Invalidate(Data); LinkSingle(Data, pcdata_free, next); top_pcdata_free++; } long last_pc_id; long last_mob_id; long get_pc_id(void) { int val; val = (current_time <= last_pc_id) ? last_pc_id + 1 : current_time; last_pc_id = val; return val; } long get_mob_id(void) { last_mob_id++; return last_mob_id; } Buffer *new_buf(void) { Buffer *Data; if (buf_free != NULL) { Data = buf_free; buf_free = buf_free->next; top_buf_free--; } else { Data = (Buffer *) alloc_perm(sizeof(Buffer)); } *Data = buf_zero; top_buf++; Data->next = Data->prev = NULL; Data->state = BUFFER_SAFE; Data->size = KILOBYTE; alloc_mem(Data->string, char, Data->size); Data->string[0] = '\0'; Validate(Data); return Data; } void free_buf(Buffer * Data) { if (!IsValid(Data)) return; free_mem(Data->string); Data->string = NULL; Data->size = 0; Data->state = BUFFER_FREED; top_buf--; Invalidate(Data); LinkSingle(Data, buf_free, next); top_buf_free++; } int bprint(Buffer * buffer, const char *string) { int ret_len, len; char *oldstr; if (!buffer || NullStr(string) || buffer->state == BUFFER_OVERFLOW) return 0; oldstr = buffer->string; len = strlen(buffer->string) + (ret_len = strlen(string)) + 1; if (len >= buffer->size) { alloc_mem(buffer->string, char, len); if (buffer->string == NULL) { buffer->state = BUFFER_OVERFLOW; bugf("buffer overflow %d", buffer->size); return -1; } buffer->size = len; strcpy(buffer->string, oldstr); free_mem(oldstr); } strcat(buffer->string, string); return ret_len; } int bprintf(Buffer * buffer, const char *messg, ...) { char buf[MPL]; va_list args; if (!buffer || NullStr(messg)) return 0; va_start(args, messg); vsnprintf(buf, sizeof(buf), messg, args); va_end(args); return bprint(buffer, buf); } int bprintlnf(Buffer * buffer, const char *messg, ...) { va_list args; char send_buf[MPL]; if (!buffer) return 0; send_buf[0] = NUL; if (!NullStr(messg)) { va_start(args, messg); vsnprintf(send_buf, sizeof(send_buf), messg, args); va_end(args); } strcat(send_buf, NEWLINE); return bprint(buffer, send_buf); } int bprintln(Buffer * buffer, const char *messg) { int len = 0; if (!buffer) return 0; if (!NullStr(messg)) len += bprint(buffer, messg); len += bprint(buffer, NEWLINE); return len; } void clear_buf(Buffer * buffer) { buffer->string[0] = NUL; buffer->state = BUFFER_SAFE; } char *buf_string(Buffer * buffer) { return buffer->string; } ProgList *new_prog_list(void) { ProgList *Data; if (prog_list_free != NULL) { Data = prog_list_free; prog_list_free = prog_list_free->next; top_prog_list_free--; } else { Data = (ProgList *) alloc_perm(sizeof(ProgList)); } *Data = prog_list_zero; top_prog_list++; Data->next = Data->prev = NULL; Validate(Data); return Data; } void free_prog_list(ProgList * Data) { if (!IsValid(Data)) return; top_prog_list--; Invalidate(Data); LinkSingle(Data, prog_list_free, next); top_prog_list_free++; } HelpData *new_help(void) { HelpData *Data; if (help_free != NULL) { Data = help_free; help_free = help_free->next; top_help_free--; } else { Data = (HelpData *) alloc_perm(sizeof(HelpData)); } *Data = help_zero; top_help++; Data->next = Data->prev = NULL; Data->keyword = &str_empty[0]; Data->text = &str_empty[0]; Validate(Data); return Data; } void free_help(HelpData * Data) { if (!IsValid(Data)) return; free_string(Data->keyword); free_string(Data->text); top_help--; Invalidate(Data); LinkSingle(Data, help_free, next); top_help_free++; } StatData *new_stat(void) { StatData *Data; if (stat_free != NULL) { Data = stat_free; stat_free = stat_free->next; top_stat_free--; } else { Data = (StatData *) alloc_perm(sizeof(StatData)); } *Data = stat_zero; top_stat++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Validate(Data); return Data; } void free_stat(StatData * Data) { if (!IsValid(Data)) return; free_string(Data->name); top_stat--; Invalidate(Data); LinkSingle(Data, stat_free, next); top_stat_free++; } CorpseData *new_corpse(void) { CorpseData *Data; if (corpse_free != NULL) { Data = corpse_free; corpse_free = corpse_free->next; top_corpse_free--; } else { Data = (CorpseData *) alloc_perm(sizeof(CorpseData)); } *Data = corpse_zero; top_corpse++; Data->next = Data->prev = NULL; Validate(Data); return Data; } void free_corpse(CorpseData * Data) { if (!IsValid(Data)) return; if (Data->corpse != NULL) { free_obj(Data->corpse); Data->corpse = NULL; } top_corpse--; Invalidate(Data); LinkSingle(Data, corpse_free, next); top_corpse_free++; } AuctionData *new_auction(void) { AuctionData *Data; if (auction_free != NULL) { Data = auction_free; auction_free = auction_free->next; top_auction_free--; } else { Data = (AuctionData *) alloc_perm(sizeof(AuctionData)); } *Data = auction_zero; top_auction++; Data->next = Data->prev = NULL; Validate(Data); return Data; } void free_auction(AuctionData * Data) { if (!IsValid(Data)) return; Data->high_bidder = NULL; Data->item = NULL; Data->owner = NULL; top_auction--; Invalidate(Data); LinkSingle(Data, auction_free, next); top_auction_free++; } WebpassData *new_wpwd(void) { WebpassData *Data; if (wpwd_free != NULL) { Data = wpwd_free; wpwd_free = wpwd_free->next; top_wpwd_free--; } else { Data = (WebpassData *) alloc_perm(sizeof(WebpassData)); } *Data = wpwd_zero; top_wpwd++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Data->passw = &str_empty[0]; Validate(Data); return Data; } void free_wpwd(WebpassData * Data) { if (!IsValid(Data)) return; free_string(Data->name); free_string(Data->passw); top_wpwd--; Invalidate(Data); LinkSingle(Data, wpwd_free, next); top_wpwd_free++; } RaceData *new_race(void) { RaceData *Data; if (race_free != NULL) { Data = race_free; race_free = race_free->next; top_race_free--; } else { Data = (RaceData *) alloc_perm(sizeof(RaceData)); } *Data = race_zero; top_race++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Data->description = &str_empty[0]; Data->pc_race = false; Data->act = 0; Data->aff = 0; Data->off = 0; Data->imm = 0; Data->res = 0; Data->vuln = 0; Data->form = 0; Data->parts = 0; set_array(Data->skills, &str_empty[0], MAX_RACE_SKILL); memset(Data->stats, 0, STAT_MAX); memset(Data->max_stats, 0, STAT_MAX); alloc_mem(Data->class_mult, int, top_class); Data->points = 0; Data->size = SIZE_MEDIUM; Validate(Data); return Data; } void free_race(RaceData * Data) { int x; if (!IsValid(Data)) return; free_string(Data->name); free_string(Data->description); for (x = 0; x < MAX_RACE_SKILL; x++) free_string(Data->skills[x]); free_mem(Data->class_mult); top_race--; Invalidate(Data); LinkSingle(Data, race_free, next); top_race_free++; } ClanMember *new_mbr(void) { ClanMember *Data; if (mbr_free != NULL) { Data = mbr_free; mbr_free = mbr_free->next; top_mbr_free--; } else { Data = (ClanMember *) alloc_perm(sizeof(ClanMember)); } *Data = mbr_zero; top_mbr++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Data->clan = NULL; Data->rank = 0; Validate(Data); return Data; } void free_mbr(ClanMember * Data) { if (!IsValid(Data)) return; free_string(Data->name); top_mbr--; Invalidate(Data); LinkSingle(Data, mbr_free, next); top_mbr_free++; } SocialData *new_social(void) { SocialData *Data; if (social_free != NULL) { Data = social_free; social_free = social_free->next; top_social_free--; } else { Data = (SocialData *) alloc_perm(sizeof(SocialData)); } *Data = social_zero; top_social++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Data->char_no_arg = &str_empty[0]; Data->others_no_arg = &str_empty[0]; Data->char_found = &str_empty[0]; Data->others_found = &str_empty[0]; Data->vict_found = &str_empty[0]; Data->char_not_found = &str_empty[0]; Data->char_auto = &str_empty[0]; Data->others_auto = &str_empty[0]; Validate(Data); return Data; } void free_social(SocialData * Data) { if (!IsValid(Data)) return; free_string(Data->name); free_string(Data->char_no_arg); free_string(Data->others_no_arg); free_string(Data->char_found); free_string(Data->others_found); free_string(Data->vict_found); free_string(Data->char_not_found); free_string(Data->char_auto); free_string(Data->others_auto); top_social--; Invalidate(Data); LinkSingle(Data, social_free, next); top_social_free++; } DeityData *new_deity(void) { DeityData *Data; if (deity_free != NULL) { Data = deity_free; deity_free = deity_free->next; top_deity_free--; } else { Data = (DeityData *) alloc_perm(sizeof(DeityData)); } *Data = deity_zero; top_deity++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Data->desc = &str_empty[0]; Data->skillname = &str_empty[0]; Data->ethos = ETHOS_TRUE_NEUTRAL; Validate(Data); return Data; } void free_deity(DeityData * Data) { if (!IsValid(Data)) return; free_string(Data->name); free_string(Data->desc); free_string(Data->skillname); top_deity--; Invalidate(Data); LinkSingle(Data, deity_free, next); top_deity_free++; } ClanData *new_clan(void) { ClanData *Data; int x; if (clan_free != NULL) { Data = clan_free; clan_free = clan_free->next; top_clan_free--; } else { Data = (ClanData *) alloc_perm(sizeof(ClanData)); } *Data = clan_zero; top_clan++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Data->who_name = &str_empty[0]; Data->description = &str_empty[0]; Data->ethos = ETHOS_TRUE_NEUTRAL; for (x = 0; x < MAX_RANK; x++) Data->rank[x].rankname = &str_empty[0]; Validate(Data); return Data; } void free_clan(ClanData * Data) { int x; if (!IsValid(Data)) return; free_string(Data->name); free_string(Data->who_name); free_string(Data->description); for (x = 0; x < MAX_RANK; x++) free_string(Data->rank[x].rankname); top_clan--; Invalidate(Data); LinkSingle(Data, clan_free, next); top_clan_free++; } CmdData *new_cmd(void) { CmdData *Data; if (cmd_free != NULL) { Data = cmd_free; cmd_free = cmd_free->next; top_cmd_free--; } else { Data = (CmdData *) alloc_perm(sizeof(CmdData)); } *Data = cmd_zero; top_cmd++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Data->do_fun = do_null; Data->level = 0; Data->position = POS_DEAD; Data->category = CMDCAT_NOSHOW; Data->log = LOG_NORMAL; Validate(Data); return Data; } void free_cmd(CmdData * Data) { if (!IsValid(Data)) return; free_string(Data->name); top_cmd--; Invalidate(Data); LinkSingle(Data, cmd_free, next); top_cmd_free++; } ResetData *new_reset(void) { ResetData *Data; if (reset_free != NULL) { Data = reset_free; reset_free = reset_free->next; top_reset_free--; } else { Data = (ResetData *) alloc_perm(sizeof(ResetData)); } *Data = reset_zero; top_reset++; Data->next = Data->prev = NULL; Data->command = 'X'; Data->arg1 = 0; Data->arg2 = 0; Data->arg3 = 0; Data->arg4 = 0; Validate(Data); return Data; } void free_reset(ResetData * Data) { if (!IsValid(Data)) return; top_reset--; Invalidate(Data); LinkSingle(Data, reset_free, next); top_reset_free++; } AreaData *new_area(void) { AreaData *Data; if (area_free != NULL) { Data = area_free; area_free = area_free->next; top_area_free--; } else { Data = (AreaData *) alloc_perm(sizeof(AreaData)); } *Data = area_zero; top_area++; Data->next = Data->prev = NULL; Data->name = str_dup("New area"); Data->area_flags = 0; Data->security = 9; Data->builders = str_dup("None"); Data->credits = &str_empty[0]; Data->lvl_comment = &str_empty[0]; Data->resetmsg = &str_empty[0]; Data->min_level = 0; Data->max_level = MAX_LEVEL; Data->version = 0; Data->min_vnum = 0; Data->max_vnum = 0; Data->weather.temp = 0; Data->weather.precip = 0; Data->weather.wind = 0; Data->weather.temp_vector = 0; Data->weather.precip_vector = 0; Data->weather.wind_vector = 0; Data->weather.climate_temp = 2; Data->weather.climate_precip = 2; Data->weather.climate_wind = 2; Data->weather.echo = &str_empty[0]; Data->weather.echo_color = &str_empty[0]; Data->age = 32; Data->nplayer = 0; Data->vnum = top_area; Data->sound = NULL; Data->empty = true; Data->file_name = str_dupf("area%d.are", Data->vnum); Data->clan = NULL; Validate(Data); return Data; } void free_area(AreaData * Data) { if (!IsValid(Data)) return; free_string(Data->name); free_string(Data->file_name); free_string(Data->builders); free_string(Data->lvl_comment); free_string(Data->credits); free_string(Data->resetmsg); top_area--; Invalidate(Data); LinkSingle(Data, area_free, next); top_area_free++; } ExitData *new_exit(void) { ExitData *Data; if (exit_free != NULL) { Data = exit_free; exit_free = exit_free->next; top_exit_free--; } else { Data = (ExitData *) alloc_perm(sizeof(ExitData)); } *Data = exit_zero; top_exit++; Data->next = Data->prev = NULL; Data->u1.to_room = NULL; Data->exit_info = 0; Data->key = 0; Data->keyword = &str_empty[0]; Data->description = &str_empty[0]; Data->rs_flags = 0; Validate(Data); return Data; } void free_exit(ExitData * Data) { if (!IsValid(Data)) return; free_string(Data->keyword); free_string(Data->description); top_exit--; Invalidate(Data); LinkSingle(Data, exit_free, next); top_exit_free++; } RoomIndex *new_room_index(void) { RoomIndex *Data; int door; if (room_index_free != NULL) { Data = room_index_free; room_index_free = room_index_free->next; top_room_index_free--; } else { Data = (RoomIndex *) alloc_perm(sizeof(RoomIndex)); } *Data = room_index_zero; top_room_index++; Data->next = Data->prev = NULL; Data->person_first = NULL; Data->content_first = NULL; Data->ed_first = NULL; Data->area = NULL; for (door = 0; door < MAX_DIR; door++) Data->exit[door] = NULL; Data->name = &str_empty[0]; Data->description = &str_empty[0]; Data->owner = &str_empty[0]; Data->vnum = 0; Data->room_flags = 0; Data->light = 0; Data->sector_type = SECT_NONE; Data->heal_rate = 100; Data->mana_rate = 100; Data->guild = -1; Validate(Data); return Data; } void free_room_index(RoomIndex * Data) { int door; ExDescrData *pExtra; ResetData *pReset; ProgList *rp; if (!IsValid(Data)) return; free_string(Data->name); free_string(Data->description); free_string(Data->owner); for (rp = Data->rprog_first; rp; rp = rp->next) free_prog_list(rp); for (door = 0; door < MAX_DIR; door++) if (Data->exit[door]) free_exit(Data->exit[door]); for (pExtra = Data->ed_first; pExtra; pExtra = pExtra->next) free_ed(pExtra); for (pReset = Data->reset_first; pReset; pReset = pReset->next) free_reset(pReset); top_room_index--; Invalidate(Data); LinkSingle(Data, room_index_free, next); top_room_index_free++; } ShopData *new_shop(void) { ShopData *Data; if (shop_free != NULL) { Data = shop_free; shop_free = shop_free->next; top_shop_free--; } else { Data = (ShopData *) alloc_perm(sizeof(ShopData)); } *Data = shop_zero; top_shop++; Data->next = Data->prev = NULL; Data->keeper = 0; memset(Data->buy_type, 0, MAX_TRADE); Data->profit_buy = 100; Data->profit_sell = 100; Data->open_hour = 0; Data->close_hour = 23; Validate(Data); return Data; } void free_shop(ShopData * Data) { if (!IsValid(Data)) return; top_shop--; Invalidate(Data); LinkSingle(Data, shop_free, next); top_shop_free++; } ObjIndex *new_obj_index(void) { ObjIndex *Data; if (obj_index_free != NULL) { Data = obj_index_free; obj_index_free = obj_index_free->next; top_obj_index_free--; } else { Data = (ObjIndex *) alloc_perm(sizeof(ObjIndex)); } *Data = obj_index_zero; top_obj_index++; Data->next = Data->prev = NULL; Data->ed_first = NULL; Data->affect_first = NULL; Data->area = NULL; Data->name = str_dup("no name"); Data->short_descr = str_dup("(no short description)"); Data->description = str_dup("(no description)"); Data->vnum = 0; Data->item_type = ITEM_TRASH; Data->extra_flags = 0; Data->wear_flags = 0; Data->count = 0; Data->weight = 0; Data->cost = 0; Data->material = str_dup("unknown"); Data->condition = 100; memset(Data->value, 0, 5); Data->new_format = true; Validate(Data); return Data; } void free_obj_index(ObjIndex * Data) { ExDescrData *pExtra; AffectData *pAf; ProgList *op; if (!IsValid(Data)) return; free_string(Data->name); free_string(Data->short_descr); free_string(Data->description); for (op = Data->oprog_first; op; op = op->next) free_prog_list(op); for (pAf = Data->affect_first; pAf; pAf = pAf->next) free_affect(pAf); for (pExtra = Data->ed_first; pExtra; pExtra = pExtra->next) free_ed(pExtra); top_obj_index--; Invalidate(Data); LinkSingle(Data, obj_index_free, next); top_obj_index_free++; } CharIndex *new_char_index(void) { CharIndex *Data; int i; if (char_index_free != NULL) { Data = char_index_free; char_index_free = char_index_free->next; top_char_index_free--; } else { Data = (CharIndex *) alloc_perm(sizeof(CharIndex)); } *Data = char_index_zero; top_char_index++; Data->next = Data->prev = NULL; Data->spec_fun = NULL; Data->pShop = NULL; Data->area = NULL; Data->player_name = str_dup("no name"); Data->short_descr = str_dup("(no short description)"); Data->long_descr = str_dup("(no long description)" NEWLINE); Data->description = &str_empty[0]; Data->vnum = 0; Data->count = 0; Data->kills = 0; Data->deaths = 0; Data->sex = SEX_NEUTRAL; Data->level = 0; Data->act = ACT_IS_NPC; Data->affected_by = 0; Data->alignment = 0; Data->hitroll = 0; Data->race = default_race; Data->form = 0; Data->parts = 0; Data->imm_flags = 0; Data->res_flags = 0; Data->vuln_flags = 0; Data->material = str_dup("unknown"); Data->off_flags = 0; Data->size = SIZE_MEDIUM; for (i = 0; i < MAX_AC; i++) Data->ac[i] = 0; for (i = 0; i < DICE_MAX; i++) { Data->hit[i] = 0; Data->mana[i] = 0; Data->damage[i] = 0; } Data->start_pos = POS_STANDING; Data->default_pos = POS_STANDING; Data->wealth = 0; Data->new_format = true; Validate(Data); return Data; } void free_char_index(CharIndex * Data) { ProgList *mp; if (!IsValid(Data)) return; free_string(Data->player_name); free_string(Data->short_descr); free_string(Data->long_descr); free_string(Data->description); for (mp = Data->mprog_first; mp; mp = mp->next) free_prog_list(mp); if (Data->pShop) free_shop(Data->pShop); top_char_index--; Invalidate(Data); LinkSingle(Data, char_index_free, next); top_char_index_free++; } ProgCode *new_mprog(void) { ProgCode *Data; if (mprog_free != NULL) { Data = mprog_free; mprog_free = mprog_free->next; top_mprog_free--; } else { Data = (ProgCode *) alloc_perm(sizeof(ProgCode)); } *Data = mprog_zero; top_mprog++; Data->next = Data->prev = NULL; Data->vnum = 0; Data->code = &str_empty[0]; Data->area = NULL; Validate(Data); return Data; } void free_mprog(ProgCode * Data) { if (!IsValid(Data)) return; free_string(Data->code); top_mprog--; Invalidate(Data); LinkSingle(Data, mprog_free, next); top_mprog_free++; } ProgCode *new_oprog(void) { ProgCode *Data; if (oprog_free != NULL) { Data = oprog_free; oprog_free = oprog_free->next; top_oprog_free--; } else { Data = (ProgCode *) alloc_perm(sizeof(ProgCode)); } *Data = oprog_zero; top_oprog++; Data->next = Data->prev = NULL; Data->vnum = 0; Data->code = &str_empty[0]; Data->area = NULL; Validate(Data); return Data; } void free_oprog(ProgCode * Data) { if (!IsValid(Data)) return; free_string(Data->code); top_oprog--; Invalidate(Data); LinkSingle(Data, oprog_free, next); top_oprog_free++; } ProgCode *new_rprog(void) { ProgCode *Data; if (rprog_free != NULL) { Data = rprog_free; rprog_free = rprog_free->next; top_rprog_free--; } else { Data = (ProgCode *) alloc_perm(sizeof(ProgCode)); } *Data = rprog_zero; top_rprog++; Data->next = Data->prev = NULL; Data->vnum = 0; Data->code = &str_empty[0]; Data->area = NULL; Validate(Data); return Data; } void free_rprog(ProgCode * Data) { if (!IsValid(Data)) return; free_string(Data->code); top_rprog--; Invalidate(Data); LinkSingle(Data, rprog_free, next); top_rprog_free++; } GqData *new_gqlist(void) { GqData *Data; if (gqlist_free != NULL) { Data = gqlist_free; gqlist_free = gqlist_free->next; top_gqlist_free--; } else { Data = (GqData *) alloc_perm(sizeof(GqData)); } *Data = gqlist_zero; top_gqlist++; Data->next = Data->prev = NULL; Validate(Data); return Data; } void free_gqlist(GqData * Data) { if (!IsValid(Data)) return; if (Data->gq_mobs) free_mem(Data->gq_mobs); if (Data->ch) Data->ch->gquest = NULL; top_gqlist--; Invalidate(Data); LinkSingle(Data, gqlist_free, next); top_gqlist_free++; } WarData *new_warlist(void) { WarData *Data; if (warlist_free != NULL) { Data = warlist_free; warlist_free = warlist_free->next; top_warlist_free--; } else { Data = (WarData *) alloc_perm(sizeof(WarData)); } *Data = warlist_zero; top_warlist++; Data->next = Data->prev = NULL; Validate(Data); return Data; } void free_warlist(WarData * Data) { if (!IsValid(Data)) return; if (Data->ch) { if (!IsNPC(Data->ch)) Data->ch->war = NULL; else extract_char(Data->ch, true); } top_warlist--; Invalidate(Data); LinkSingle(Data, warlist_free, next); top_warlist_free++; } DisabledData *new_disabled(void) { DisabledData *Data; if (disabled_free != NULL) { Data = disabled_free; disabled_free = disabled_free->next; top_disabled_free--; } else { Data = (DisabledData *) alloc_perm(sizeof(DisabledData)); } *Data = disabled_zero; top_disabled++; Data->next = Data->prev = NULL; Data->disabled_by = &str_empty[0]; Data->disabled_for = &str_empty[0]; Validate(Data); return Data; } void free_disabled(DisabledData * Data) { if (!IsValid(Data)) return; free_string(Data->disabled_by); free_string(Data->disabled_for); top_disabled--; Invalidate(Data); LinkSingle(Data, disabled_free, next); top_disabled_free++; } #ifdef STFILEIO stFile *new_stfile(void) { stFile *Data; if (stfile_free != NULL) { Data = stfile_free; stfile_free = stfile_free->next; top_stfile_free--; } else { Data = (stFile *) alloc_perm(sizeof(stFile)); } *Data = stfile_zero; top_stfile++; Data->next = Data->prev = NULL; Data->str = NULL; Data->file = &str_empty[0]; #if !defined WIN32 && !defined __CYGWIN__ Data->temp = &str_empty[0]; #endif Data->stream = NULL; Data->mode = &str_empty[0]; Validate(Data); return Data; } void free_stfile(stFile * Data) { if (!IsValid(Data)) return; #if !defined WIN32 && !defined __CYGWIN__ free_string(Data->temp); #endif free_string(Data->mode); if (Data->str != NULL) free_mem(Data->str); if (Data->stream) file_close(Data->stream); free_string(Data->file); top_stfile--; Invalidate(Data); LinkSingle(Data, stfile_free, next); top_stfile_free++; } #endif void free_note(NoteData * Data) { if (!IsValid(Data)) return; free_string(Data->sender); free_string(Data->to_list); free_string(Data->subject); free_string(Data->date); free_string(Data->text); free_string(Data->reply_text); free_string(Data->email_addr); free_string(Data->reply_addr); top_note--; Invalidate(Data); LinkSingle(Data, note_free, next); top_note_free++; } NoteData *new_note(void) { NoteData *Data; if (note_free != NULL) { Data = note_free; note_free = note_free->next; top_note_free--; } else { Data = (NoteData *) alloc_perm(sizeof(NoteData)); } *Data = note_zero; top_note++; Data->next = Data->prev = NULL; Data->sender = NULL; Data->expire = 0; Data->to_list = NULL; Data->subject = NULL; Data->date = NULL; Data->date_stamp = 0; Data->text = NULL; Data->email_addr = NULL; Data->reply_text = NULL; Data->reply_addr = NULL; Validate(Data); return Data; } #ifndef DISABLE_WEBSRV WebDescriptor *new_webdesc(void) { WebDescriptor *Data; if (webdesc_free != NULL) { Data = webdesc_free; webdesc_free = webdesc_free->next; top_webdesc_free--; } else { Data = (WebDescriptor *) alloc_perm(sizeof(WebDescriptor)); } *Data = webdesc_zero; top_webdesc++; Data->next = Data->prev = NULL; Data->request[0] = NUL; Validate(Data); return Data; } void free_webdesc(WebDescriptor * Data) { if (!IsValid(Data)) return; Data->request[0] = NUL; top_webdesc--; Invalidate(Data); LinkSingle(Data, webdesc_free, next); top_webdesc_free++; } #endif MspData *new_msp(void) { MspData *Data; if (msp_free != NULL) { Data = msp_free; msp_free = msp_free->next; top_msp_free--; } else { Data = (MspData *) alloc_perm(sizeof(MspData)); } *Data = msp_zero; top_msp++; Data->next = Data->prev = NULL; Data->file = &str_empty[0]; Data->url = &str_empty[0]; Data->type = MSP_NONE; Data->volume = 100; Data->loop = 1; Data->priority = 50; Data->restart = false; Validate(Data); return Data; } void free_msp(MspData * Data) { if (!IsValid(Data)) return; free_string(Data->file); free_string(Data->url); top_msp--; Invalidate(Data); LinkSingle(Data, msp_free, next); top_msp_free++; } Column *new_column(void) { Column *Data; if (column_free != NULL) { Data = column_free; column_free = column_free->next; top_column_free--; } else { Data = (Column *) alloc_perm(sizeof(Column)); } *Data = column_zero; top_column++; Data->next = Data->prev = NULL; Validate(Data); return Data; } void free_column(Column * Data) { if (!IsValid(Data)) return; top_column--; Invalidate(Data); LinkSingle(Data, column_free, next); top_column_free++; } NameProfile *new_name_profile(void) { NameProfile *Data; int i; if (name_profile_free != NULL) { Data = name_profile_free; name_profile_free = name_profile_free->next; top_name_profile_free--; } else { Data = (NameProfile *) alloc_perm(sizeof(NameProfile)); } *Data = name_profile_zero; top_name_profile++; Data->next = Data->prev = NULL; Data->title = &str_empty[0]; for (i = 0; i < MAX_PARTS; i++) { Data->part[i] = &str_empty[0]; Data->part_count[i] = 0; } Validate(Data); return Data; } void free_name_profile(NameProfile * Data) { int i; if (!IsValid(Data)) return; top_name_profile--; free_string(Data->title); for (i = 0; i < MAX_PARTS; i++) free_string(Data->part[i]); Invalidate(Data); LinkSingle(Data, name_profile_free, next); top_name_profile_free++; } NameList *new_namelist(void) { NameList *Data; if (namelist_free != NULL) { Data = namelist_free; namelist_free = namelist_free->next; top_namelist_free--; } else { Data = (NameList *) alloc_perm(sizeof(NameList)); } *Data = namelist_zero; top_namelist++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Validate(Data); return Data; } void free_namelist(NameList * Data) { if (!IsValid(Data)) return; top_namelist--; free_string(Data->name); Invalidate(Data); LinkSingle(Data, namelist_free, next); top_namelist_free++; } WizData *new_wiz(void) { WizData *Data; if (wiz_free != NULL) { Data = wiz_free; wiz_free = wiz_free->next; top_wiz_free--; } else { Data = (WizData *) alloc_perm(sizeof(WizData)); } *Data = wiz_zero; top_wiz++; Data->next = Data->prev = NULL; Data->name = &str_empty[0]; Data->email = &str_empty[0]; Data->jobs = &str_empty[0]; Validate(Data); return Data; } void free_wiz(WizData * Data) { if (!IsValid(Data)) return; top_wiz--; free_string(Data->name); free_string(Data->email); free_string(Data->jobs); Invalidate(Data); LinkSingle(Data, wiz_free, next); top_wiz_free++; } ColorTemplate *new_color_template(void) { ColorTemplate *Data; if (color_template_free != NULL) { Data = color_template_free; color_template_free = color_template_free->next; top_color_template_free--; } else { Data = (ColorTemplate *) alloc_perm(sizeof(ColorTemplate)); } *Data = color_template_zero; top_color_template++; Data->name = &str_empty[0]; Data->description = &str_empty[0]; Data->colors = NULL; Validate(Data); return Data; } void free_color_template(ColorTemplate * Data) { if (!IsValid(Data)) return; free_string(Data->name); free_string(Data->description); if (Data->colors != NULL) free_mem(Data->colors); top_color_template--; Invalidate(Data); LinkSingle(Data, color_template_free, next); top_color_template_free++; }