/**************************************************************************** * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame | \\._.// * * -----------------------------------------------------------| (0...0) * * SMAUG 1.0 (C) 1994, 1995, 1996, 1998 by Derek Snider | ).:.( * * -----------------------------------------------------------| {o o} * * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, | / ' ' \ * * Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek, |~'~.VxvxV.~'~* * Tricops and Fireblade | * * ------------------------------------------------------------------------ * * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * ------------------------------------------------------------------------ * * Database management module * ****************************************************************************/ #include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdarg.h> #include <string.h> #include <time.h> #include <sys/stat.h> #ifndef WIN32 #include <dirent.h> #else #define strcasecmp strcmp #endif #include "mud.h" extern int _filbuf args((FILE *)); #if defined(KEY) #undef KEY #endif void init_supermob(); #define KEY( literal, field, value ) \ if ( !str_cmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } /* * Globals. */ WIZENT *first_wiz; WIZENT *last_wiz; time_t last_restore_all_time = 0; HELP_DATA *first_help; HELP_DATA *last_help; HINDEX_DATA *first_hindex; HINDEX_DATA *last_hindex; HINDEX_DATA *first_fhindex; //First flat hindex HINDEX_DATA *last_fhindex; //Last flat hindex SHOP_DATA *first_shop; SHOP_DATA *last_shop; REPAIR_DATA *first_repair; REPAIR_DATA *last_repair; TELEPORT_DATA *first_teleport; TELEPORT_DATA *last_teleport; PROJECT_DATA *first_project; PROJECT_DATA *last_project; AUTHORIZE_DATA *first_authorized; AUTHORIZE_DATA *last_authorized; FORGE_DATA *first_forge; FORGE_DATA *last_forge; SLAB_DATA *first_slab; SLAB_DATA *last_slab; WBLOCK_DATA *first_wblock; WBLOCK_DATA *last_wblock; QMOB_DATA *first_qmob; QMOB_DATA *last_qmob; QOBJ_DATA *first_qobj; NPCRACE_DATA *first_npcrace; NPCRACE_DATA *last_npcrace; QOBJ_DATA *last_qobj; QUEST_DATA *first_quest; QUEST_DATA *last_quest; TRAP_DATA *first_trap; TRAP_DATA *last_trap; BARENA_DATA *first_barena; BARENA_DATA *last_barena; BIN_DATA *first_bin; BIN_DATA *last_bin; CMEMBER_DATA *first_clanmember; CMEMBER_DATA *last_clanmember; KMEMBER_DATA *first_kingdommember; KMEMBER_DATA *last_kingdommember; TORNADO_DATA *first_tornado; TORNADO_DATA *last_tornado; TRAINER_DATA *first_trainer; TRAINER_DATA *last_trainer; CONQUER_DATA *first_conquer; CONQUER_DATA *last_conquer; GEM_DATA *first_gem; GEM_DATA *last_gem; AGGRO_DATA *first_global_aggro; AGGRO_DATA *last_global_aggro; TRADE_DATA *first_trade; TRADE_DATA *last_trade; BOX_DATA *first_box; BOX_DATA *last_box; TRAINING_DATA *first_training; TRAINING_DATA *last_training; CHANNEL_HISTORY *first_channelhistory; CHANNEL_HISTORY *last_channelhistory; SHIP_DATA *first_ship; SHIP_DATA *last_ship; MARKET_DATA *first_market; MARKET_DATA *last_market; OBJ_DATA *extracted_obj_queue; EXTRACT_CHAR_DATA *extracted_char_queue; char bug_buf[2 * MIL]; CHAR_DATA *first_char; CHAR_DATA *last_char; /* Below are used for Wilderness Mobs only, they belong to both lists, just makes it easier to search for them --Xerves 04/00*/ CMAP_DATA *first_wilderchar; CMAP_DATA *last_wilderchar; OMAP_DATA *first_wilderobj; OMAP_DATA *last_wilderobj; char *help_greeting; char log_buf[2 * MIL]; OBJ_DATA *first_object; OBJ_DATA *last_object; TIME_INFO_DATA time_info; int max_npc_race; int rand_factor; int climate_factor; int max_vector; int cur_qobjs; int cur_qchars; int nummobsloaded; int numobjsloaded; int physicalobjects; int last_pkroom; bool serial_list[MAX_LOADED_MOBS]; int serialmobsloaded; //not quite the same as nummobsloaded, it has the ability to use past serials for "reset mobs" to reset mobs properly. MAP_INDEX_DATA *first_map; /* maps */ AUCTION_DATA *auction; /* auctions */ FILE *fpLOG; //2.1 skills sh_int gsn_combatart; sh_int gsn_weapon_axe; sh_int gsn_weapon_sword; sh_int gsn_weapon_polearm; sh_int gsn_weapon_blunt; sh_int gsn_weapon_staff; sh_int gsn_weapon_projectile; sh_int gsn_weapon_dagger; sh_int gsn_roar; sh_int gsn_bash; sh_int gsn_inhuman_strength; sh_int gsn_krundo_style; sh_int gsn_rwundo_style; sh_int gsn_krundi_style; sh_int gsn_rwundi_style; sh_int gsn_pincer; sh_int gsn_weaponbreak; sh_int gsn_powerslice; sh_int gsn_deshield; sh_int gsn_perfect_shot; sh_int gsn_drive; sh_int gsn_insult; sh_int gsn_draw_aggression; sh_int gsn_greater_draw_aggression; sh_int gsn_focus_aggression; sh_int gsn_greater_focus_aggression; sh_int gsn_weapon_twohanded; sh_int gsn_escapism; sh_int gsn_prawl; sh_int gsn_nightprawl; sh_int gsn_lightprawl; sh_int gsn_shadowfoot; sh_int gsn_strongfoot; sh_int gsn_swimming; sh_int gsn_retreat; sh_int gsn_gag; sh_int gsn_climbwall; sh_int gsn_vanish; sh_int gsn_begging; sh_int gsn_thiefeye; sh_int gsn_cutpurse; sh_int gsn_grab; sh_int gsn_haggling; sh_int gsn_swindling; sh_int gsn_assassinate; sh_int gsn_forage; sh_int gsn_kickdirt; sh_int gsn_weapon_daggerstudy; sh_int gsn_weapon_daggerstrike; sh_int gsn_startfire; sh_int gsn_featherfoot; sh_int gsn_cleansing; sh_int gsn_concentration; sh_int gsn_manafuse; sh_int gsn_fasting; sh_int gsn_nervepinch; sh_int gsn_featherback; sh_int gsn_manashot; sh_int gsn_manaburst; sh_int gsn_quickcombo; sh_int gsn_nervestrike; sh_int gsn_battle_knowledge; /* weaponry */ sh_int gsn_hit; /* thief */ sh_int gsn_detrap; sh_int gsn_backstab; sh_int gsn_circle; sh_int gsn_dodge; sh_int gsn_hide; sh_int gsn_peek; sh_int gsn_pick_lock; sh_int gsn_sneak; sh_int gsn_steal; sh_int gsn_gouge; sh_int gsn_poison_weapon; sh_int gsn_stalk; /* thief & warrior */ sh_int gsn_disarm; sh_int gsn_enhanced_damage; sh_int gsn_parry; sh_int gsn_rescue; sh_int gsn_dual_wield; sh_int gsn_stun; sh_int gsn_daze; sh_int gsn_bashdoor; sh_int gsn_grip; sh_int gsn_berserk; sh_int gsn_hitall; sh_int gsn_tumble; sh_int gsn_kick_back; sh_int gsn_deadly_accuracy; sh_int gsn_attack_frenzy; sh_int gsn_lore; sh_int gsn_critical; sh_int gsn_counter; sh_int gsn_shieldblock; sh_int gsn_repair; /* other */ sh_int gsn_unsheath; sh_int gsn_aid; sh_int gsn_track; sh_int gsn_search; sh_int gsn_dig;; sh_int gsn_scribe; sh_int gsn_brew; sh_int gsn_climb; sh_int gsn_cook; sh_int gsn_scan; sh_int gsn_slice; sh_int gsn_mountain_climb; sh_int gsn_study; sh_int gsn_manatap; /* Monk/Attack Skills */ sh_int gsn_roundhouse; sh_int gsn_spinkick; sh_int gsn_tornadokick; sh_int gsn_niburo; sh_int gsn_neckpinch; sh_int gsn_neckchop; sh_int gsn_neckrupture; sh_int gsn_emeru; sh_int gsn_elbowjab; sh_int gsn_elbowstab; sh_int gsn_elbowbreak; sh_int gsn_amberio; sh_int gsn_sidekick; sh_int gsn_kneestrike; sh_int gsn_kneecrusher; sh_int gsn_lembecu; sh_int gsn_blitz; sh_int gsn_spear; sh_int gsn_ribpuncture; sh_int gsn_timmuru; /* spells */ sh_int gsn_possess; sh_int gsn_aqua_breath; sh_int gsn_blindness; sh_int gsn_charm_person; sh_int gsn_curse; sh_int gsn_invis; sh_int gsn_mass_invis; sh_int gsn_poison; sh_int gsn_sleep; sh_int gsn_wizardeye; sh_int gsn_eye_of_god; sh_int gsn_summon_corpse; sh_int gsn_resurrection; sh_int gsn_greater_resurrection; sh_int gsn_lesser_resurrection; sh_int gsn_web; sh_int gsn_snare; sh_int gsn_revitalize_spirit; sh_int gsn_extradimensional_portal; sh_int gsn_holy_cleansing; //sh_int gsn_fireball; //sh_int gsn_chill_touch; //sh_int gsn_lightning_bolt; /* languages */ sh_int gsn_common; sh_int gsn_elven; sh_int gsn_dwarven; sh_int gsn_pixie; sh_int gsn_ogre; sh_int gsn_orcish; sh_int gsn_trollish; sh_int gsn_goblin; sh_int gsn_halfling; /* for searching */ sh_int gsn_first_spell; sh_int gsn_first_skill; sh_int gsn_first_weapon; sh_int gsn_first_tongue; sh_int gsn_top_sn; //For Battle sh_int gsn_balance; /* For styles? Trying to rebuild from some kind of accident here - Blod */ sh_int gsn_style_evasive; sh_int gsn_style_divine; sh_int gsn_style_wizardry; sh_int gsn_style_defensive; sh_int gsn_style_standard; sh_int gsn_style_aggressive; sh_int gsn_style_berserk; /* * Locals. */ MOB_INDEX_DATA *mob_index_hash[MAX_KEY_HASH]; OBJ_INDEX_DATA *obj_index_hash[MAX_KEY_HASH]; ROOM_INDEX_DATA *room_index_hash[MAX_KEY_HASH]; AREA_DATA *first_area; AREA_DATA *last_area; AREA_DATA *first_area_name; /*Used for alphanum. sort */ AREA_DATA *last_area_name; AREA_DATA *first_build; AREA_DATA *last_build; AREA_DATA *first_asort; AREA_DATA *last_asort; AREA_DATA *first_bsort; AREA_DATA *last_bsort; SYSTEM_DATA sysdata; int top_affect; int top_area; int top_ed; int top_exit; int top_help; int top_mob_index; int top_obj_index; int top_reset; int top_room; int top_shop; int top_repair; int top_vroom; int top_map_mob; sh_int res_rotation; /* * Semi-locals. */ bool fBootDb; FILE *fpArea; char strArea[MIL]; /* * Local booting procedures. */ void init_mm args((void)); void load_maps args((void)); /* Load in Overland Maps - Samson 8-1-99 */ void boot_log args((const char *str, ...)); void load_area args((FILE * fp)); void load_area_kingdom args((AREA_DATA * tarea, FILE * fp)); //no longer used, left for old area files void load_kowner args((AREA_DATA * tarea, FILE * fp)); void load_author args((AREA_DATA * tarea, FILE * fp)); void load_economy args((AREA_DATA * tarea, FILE * fp)); void load_resetmsg args((AREA_DATA * tarea, FILE * fp)); /* Rennard */ void load_flags args((AREA_DATA * tarea, FILE * fp)); void load_helps args((AREA_DATA * tarea, FILE * fp)); void load_mobiles args((AREA_DATA * tarea, FILE * fp)); void load_objects args((AREA_DATA * tarea, FILE * fp)); void load_projects args((void)); void load_resets args((AREA_DATA * tarea, FILE * fp)); void load_rooms args((AREA_DATA * tarea, FILE * fp)); void load_shops args((AREA_DATA * tarea, FILE * fp)); void load_repairs args((AREA_DATA * tarea, FILE * fp)); void load_specials args((AREA_DATA * tarea, FILE * fp)); void load_ranges args((AREA_DATA * tarea, FILE * fp)); void load_climate args((AREA_DATA * tarea, FILE * fp)); /* FB */ void load_buildlist args((void)); bool load_systemdata args((SYSTEM_DATA * sys)); void load_banlist args((void)); void load_version args((AREA_DATA * tarea, FILE * fp)); void load_watchlist args((void)); void load_reserved args((void)); void initialize_economy args((void)); void fix_exits args((void)); void sort_reserved args((RESERVE_DATA * pRes)); void init_area_weather args((void)); bool load_weatherdata args((void)); PROJECT_DATA *read_project args((char *filename, FILE * fp)); NOTE_DATA *read_log args((FILE * fp)); void save_sysdata args((SYSTEM_DATA sys)); /* * External booting function */ void load_corpses args((void)); void renumber_put_resets args((AREA_DATA * pArea)); /* * MUDprogram locals */ int mprog_name_to_type args((char *name)); MPROG_DATA *mprog_file_read args((char *f, MPROG_DATA * mprg, MOB_INDEX_DATA * pMobIndex)); /* int oprog_name_to_type args ( ( char* name ) ); */ MPROG_DATA *oprog_file_read args((char *f, MPROG_DATA * mprg, OBJ_INDEX_DATA * pObjIndex)); /* int rprog_name_to_type args ( ( char* name ) ); */ MPROG_DATA *rprog_file_read args((char *f, MPROG_DATA * mprg, ROOM_INDEX_DATA * pRoomIndex)); void load_mudprogs args((AREA_DATA * tarea, FILE * fp)); void load_objprogs args((AREA_DATA * tarea, FILE * fp)); void load_roomprogs args((AREA_DATA * tarea, FILE * fp)); void mprog_read_programs args((FILE * fp, MOB_INDEX_DATA * pMobIndex)); void oprog_read_programs args((FILE * fp, OBJ_INDEX_DATA * pObjIndex)); void rprog_read_programs args((FILE * fp, ROOM_INDEX_DATA * pRoomIndex)); void shutdown_mud(char *reason) { FILE *fp; if ((fp = fopen(SHUTDOWN_FILE, "a")) != NULL) { fprintf(fp, "%s\n", reason); fclose(fp); } } /* * Big mama top level function. */ void boot_db(bool fCopyOver) { sh_int wear; AREA_DATA *tarea; int x; show_hash(32); unlink(BOOTLOG_FILE); boot_log("---------------------[ Boot Log ]--------------------"); log_string("Loading commands"); load_commands(); log_string("Loading sysdata configuration..."); /* default values */ first_forge = NULL; last_forge = NULL; first_slab = NULL; last_slab = NULL; sysdata.read_all_mail = LEVEL_STAFF; sysdata.read_mail_free = LEVEL_IMMORTAL; sysdata.write_mail_free = LEVEL_IMMORTAL; sysdata.take_others_mail = LEVEL_STAFF; sysdata.imc_mail_vnum = 0; sysdata.muse_level = LEVEL_HI_IMM; sysdata.gem_vnum = 0; sysdata.lastaccountreset = time(0); sysdata.max_accounts = 15; sysdata.max_account_changes = 15; sysdata.think_level = LEVEL_HIGOD; sysdata.build_level = LEVEL_IMM; sysdata.log_level = LEVEL_LOG; sysdata.level_modify_proto = LEVEL_HI_IMM; sysdata.level_override_private = LEVEL_STAFF; sysdata.level_mset_player = LEVEL_HI_IMM; sysdata.stun_plr_vs_plr = 65; sysdata.stun_regular = 15; sysdata.gouge_nontank = 0; sysdata.gouge_plr_vs_plr = 0; sysdata.bash_nontank = 0; sysdata.bash_plr_vs_plr = 0; sysdata.timeout_login = 720; //3 minutes sysdata.timeout_notes = 2400; //10 minuts sysdata.timeout_idle = 4800; //20 minutes sysdata.dodge_mod = 2; sysdata.parry_mod = 2; sysdata.tumble_mod = 4; sysdata.top_pid = 0; sysdata.dam_plr_vs_plr = 100; sysdata.dam_plr_vs_mob = 100; sysdata.dam_mob_vs_plr = 100; sysdata.dam_mob_vs_mob = 100; sysdata.last_invtrap_uid = START_INV_TRAP; sysdata.last_trap_uid = 0; sysdata.level_getobjnotake = LEVEL_HI_IMM; sysdata.save_frequency = 20; /* minutes */ sysdata.bestow_dif = 5; sysdata.check_imm_host = 1; sysdata.morph_opt = 1; sysdata.save_pets = 0; sysdata.firstrun = 1; sysdata.accountemail = 0; sysdata.resetgame = 0; sysdata.save_flags = SV_DEATH | SV_PASSCHG | SV_AUTO | SV_PUT | SV_DROP | SV_GIVE | SV_AUCTION | SV_ZAPDROP | SV_IDLE; if (!load_systemdata(&sysdata)) { log_string("Not found. Creating new configuration."); sysdata.alltimemax = 0; sysdata.mud_name = str_dup("(Name not set)"); } if (sysdata.firstrun == 1) //Sets these times back if this is the first run { sysdata.lasttaxcheck = time(0); sysdata.lastpopcheck = time(0); sysdata.lastrescheck = time(0); sysdata.start_calender = time(0); sysdata.firstrun = 0; save_sysdata(sysdata); } log_string("Loading overland maps...."); load_maps(); log_string("Loading snow info...."); load_snow(); first_wblock = NULL; last_wblock = NULL; log_string("Loading WilderBlocks...."); load_wblock_data(); log_string("Loading socials"); load_socials(); log_string("Loading skill table"); load_skill_table(); sort_skill_table(); gsn_first_spell = 0; gsn_first_skill = 0; gsn_first_weapon = 0; gsn_first_tongue = 0; gsn_top_sn = top_sn; for (x = 0; x < top_sn; x++) if (!gsn_first_spell && skill_table[x]->type == SKILL_SPELL) gsn_first_spell = x; else if (!gsn_first_skill && skill_table[x]->type == SKILL_SKILL) gsn_first_skill = x; else if (!gsn_first_weapon && skill_table[x]->type == SKILL_WEAPON) gsn_first_weapon = x; else if (!gsn_first_tongue && skill_table[x]->type == SKILL_TONGUE) gsn_first_tongue = x; remap_slot_numbers(); /* must be after the sort */ log_string("Loading classes"); load_classes(); log_string("Loading races"); load_races(); // log_string("Loading Hall of Fame"); // load_hall_of_fame(); log_string("Loading herb table"); load_herb_table(); log_string("Loading tongues"); load_tongues(); log_string("Making wizlist"); make_wizlist(); log_string("Loading Forge Items"); load_forge_data(); log_string("Loading Slab Items"); load_slab_data(); log_string("Initializing request pipe"); init_request_pipe(); fBootDb = TRUE; nummobsloaded = 0; numobjsloaded = 0; serialmobsloaded = 0; physicalobjects = 0; max_npc_race = 0; global_drop_equip_message = 0; for (x = 0; x < MAX_LOADED_MOBS; x++) serial_list[x] = 0; sysdata.maxplayers = 0; first_object = NULL; last_object = NULL; first_char = NULL; last_char = NULL; first_ship = NULL; last_ship = NULL; first_market = NULL; last_market = NULL; first_wilderchar = NULL; last_wilderchar = NULL; first_area = NULL; first_area_name = NULL; /*Used for alphanum. sort */ last_area_name = NULL; last_area = NULL; first_bin = NULL; last_bin = NULL; first_tornado = NULL; last_tornado = NULL; first_build = NULL; last_area = NULL; first_shop = NULL; last_shop = NULL; first_repair = NULL; first_conquer = NULL; last_conquer = NULL; last_repair = NULL; first_teleport = NULL; last_teleport = NULL; first_asort = NULL; last_asort = NULL; first_trainer = NULL; last_trainer = NULL; first_gem = NULL; last_gem = NULL; first_global_aggro = NULL; last_global_aggro = NULL; first_trade = NULL; last_trade = NULL; first_box = NULL; last_box = NULL; first_training = NULL; last_training = NULL; extracted_obj_queue = NULL; extracted_char_queue = NULL; cur_qobjs = 0; cur_qchars = 0; res_rotation = 1; cur_char = NULL; cur_obj = 0; cur_obj_serial = 0; cur_char_died = FALSE; cur_obj_extracted = FALSE; cur_room = NULL; quitting_char = NULL; loading_char = NULL; saving_char = NULL; last_pkroom = 1; immortal_host_start = NULL; immortal_host_end = NULL; first_ban_class = NULL; last_ban_class = NULL; first_ban_race = NULL; last_ban_race = NULL; first_ban = NULL; last_ban = NULL; first_qmob = NULL; last_qmob = NULL; first_qobj = NULL; last_qobj = NULL; first_npcrace = NULL; last_npcrace = NULL; first_quest = NULL; last_quest = NULL; first_trap = NULL; last_trap = NULL; CREATE(auction, AUCTION_DATA, 1); auction->item = NULL; auction->hist_timer = 0; for (x = 0; x < AUCTION_MEM; x++) auction->history[x] = NULL; rand_factor = 2; climate_factor = 1; for (wear = 0; wear < MAX_WEAR; wear++) for (x = 0; x < MAX_LAYERS; x++) save_equipment[wear][x] = NULL; /* * Init random number generator. */ log_string("Initializing random number generator"); init_mm(); /* * Set time and weather. */ { log_string("Setting time and weather"); if (gethour() < 5) time_info.sunlight = SUN_DARK; else if (gethour() < 6) time_info.sunlight = SUN_RISE; else if (gethour() < 19) time_info.sunlight = SUN_LIGHT; else if (gethour() < 20) time_info.sunlight = SUN_SET; else time_info.sunlight = SUN_DARK; /* weather_info.change = 0; weather_info.mmhg = 960; if ( time_info.month >= 7 && time_info.month <=12 ) weather_info.mmhg += number_range( 1, 50 ); else weather_info.mmhg += number_range( 1, 80 ); if ( weather_info.mmhg <= 980 ) weather_info.sky = SKY_LIGHTNING; else if ( weather_info.mmhg <= 1000 ) weather_info.sky = SKY_RAINING; else if ( weather_info.mmhg <= 1020 ) weather_info.sky = SKY_CLOUDY; else weather_info.sky = SKY_CLOUDLESS; */ } /* * Assign gsn's for skills which need them. */ { log_string("Assigning gsn's"); ASSIGN_GSN(gsn_combatart, "combat art"); ASSIGN_GSN(gsn_weapon_axe, "axes"); ASSIGN_GSN(gsn_weapon_sword, "swords"); ASSIGN_GSN(gsn_weapon_polearm, "polearms"); ASSIGN_GSN(gsn_weapon_blunt, "blunt"); ASSIGN_GSN(gsn_weapon_staff, "staves"); ASSIGN_GSN(gsn_weapon_twohanded, "twohanded"); ASSIGN_GSN(gsn_weapon_projectile, "projectiles"); ASSIGN_GSN(gsn_weapon_dagger, "daggers"); ASSIGN_GSN(gsn_roar, "roar"); ASSIGN_GSN(gsn_battle_knowledge, "battle knowledge"); ASSIGN_GSN(gsn_bash, "bash"); ASSIGN_GSN(gsn_inhuman_strength, "inhuman strength"); ASSIGN_GSN(gsn_krundo_style, "krundo style"); ASSIGN_GSN(gsn_rwundo_style, "rwundo style"); ASSIGN_GSN(gsn_krundi_style, "krundi style"); ASSIGN_GSN(gsn_rwundi_style, "rwundi style"); ASSIGN_GSN(gsn_pincer, "pincer"); ASSIGN_GSN(gsn_weaponbreak, "weaponbreak"); ASSIGN_GSN(gsn_powerslice, "powerslice"); ASSIGN_GSN(gsn_deshield, "deshield"); ASSIGN_GSN(gsn_perfect_shot, "perfect shot"); ASSIGN_GSN(gsn_drive, "drive"); ASSIGN_GSN(gsn_insult, "taunt"); ASSIGN_GSN(gsn_draw_aggression, "draw aggression"); ASSIGN_GSN(gsn_greater_draw_aggression, "greater draw aggression"); ASSIGN_GSN(gsn_focus_aggression, "focus aggression"); ASSIGN_GSN(gsn_greater_focus_aggression, "greater focus aggression"); ASSIGN_GSN(gsn_escapism, "escapism"); ASSIGN_GSN(gsn_prawl, "prawl"); ASSIGN_GSN(gsn_nightprawl, "nightprawl"); ASSIGN_GSN(gsn_lightprawl, "lightprawl"); ASSIGN_GSN(gsn_shadowfoot, "shadowfoot"); ASSIGN_GSN(gsn_strongfoot, "strongfoot"); ASSIGN_GSN(gsn_swimming, "swimming"); ASSIGN_GSN(gsn_retreat, "retreat"); ASSIGN_GSN(gsn_gag, "gag"); ASSIGN_GSN(gsn_climbwall, "climbwall"); ASSIGN_GSN(gsn_vanish, "vanish"); ASSIGN_GSN(gsn_begging, "begging"); ASSIGN_GSN(gsn_thiefeye, "thiefeye"); ASSIGN_GSN(gsn_cutpurse, "cutpurse"); ASSIGN_GSN(gsn_grab, "grab"); ASSIGN_GSN(gsn_haggling, "haggling"); ASSIGN_GSN(gsn_swindling, "swindling"); ASSIGN_GSN(gsn_assassinate, "assassinate"); ASSIGN_GSN(gsn_forage, "forage"); ASSIGN_GSN(gsn_kickdirt, "kickdirt"); ASSIGN_GSN(gsn_weapon_daggerstudy, "daggerstudy"); ASSIGN_GSN(gsn_weapon_daggerstrike, "daggerstrike"); ASSIGN_GSN(gsn_startfire, "startfire"); ASSIGN_GSN(gsn_featherfoot, "featherfoot"); ASSIGN_GSN(gsn_cleansing, "cleansing"); ASSIGN_GSN(gsn_concentration, "concentration"); ASSIGN_GSN(gsn_manafuse, "manafuse"); ASSIGN_GSN(gsn_fasting, "fasting"); ASSIGN_GSN(gsn_nervepinch, "nervepinch"); ASSIGN_GSN(gsn_featherback, "featherback"); ASSIGN_GSN(gsn_manashot, "manashot"); ASSIGN_GSN(gsn_manaburst, "manaburst"); ASSIGN_GSN(gsn_quickcombo, "quickcombo"); ASSIGN_GSN(gsn_nervestrike, "nervestrike"); ASSIGN_GSN(gsn_style_evasive, "evasive style"); ASSIGN_GSN(gsn_style_divine, "divine style"); ASSIGN_GSN(gsn_style_wizardry, "wizardry style"); ASSIGN_GSN(gsn_style_defensive, "defensive style"); ASSIGN_GSN(gsn_style_standard, "standard style"); ASSIGN_GSN(gsn_style_aggressive, "aggressive style"); ASSIGN_GSN(gsn_style_berserk, "berserk style"); ASSIGN_GSN(gsn_hit, "hit"); ASSIGN_GSN(gsn_shieldblock, "shieldblock"); ASSIGN_GSN(gsn_repair, "repair"); ASSIGN_GSN(gsn_roundhouse, "roundhouse"); ASSIGN_GSN(gsn_spinkick, "spinkick"); ASSIGN_GSN(gsn_tornadokick, "tornadokick"); ASSIGN_GSN(gsn_niburo, "niburo"); ASSIGN_GSN(gsn_neckpinch, "neckpinch"); ASSIGN_GSN(gsn_neckchop, "neckchop"); ASSIGN_GSN(gsn_neckrupture, "neckrupture"); ASSIGN_GSN(gsn_emeru, "emeru"); ASSIGN_GSN(gsn_elbowjab, "elbowjab"); ASSIGN_GSN(gsn_elbowstab, "elbowstab"); ASSIGN_GSN(gsn_elbowbreak, "elbowbreak"); ASSIGN_GSN(gsn_amberio, "amberio"); ASSIGN_GSN(gsn_sidekick, "sidekick"); ASSIGN_GSN(gsn_kneestrike, "kneestrike"); ASSIGN_GSN(gsn_kneecrusher, "kneecrusher"); ASSIGN_GSN(gsn_lembecu, "lembecu"); ASSIGN_GSN(gsn_blitz, "blitz"); ASSIGN_GSN(gsn_spear, "spear"); ASSIGN_GSN(gsn_ribpuncture, "ribpuncture"); ASSIGN_GSN(gsn_timmuru, "timmuru"); ASSIGN_GSN(gsn_balance, "balance"); ASSIGN_GSN(gsn_unsheath, "unsheath"); ASSIGN_GSN(gsn_detrap, "detrap"); ASSIGN_GSN(gsn_backstab, "backstab"); ASSIGN_GSN(gsn_circle, "circle"); ASSIGN_GSN(gsn_tumble, "tumble"); ASSIGN_GSN(gsn_dodge, "dodge"); ASSIGN_GSN(gsn_hide, "hide"); ASSIGN_GSN(gsn_stalk, "stalk"); ASSIGN_GSN(gsn_peek, "peek"); ASSIGN_GSN(gsn_pick_lock, "pick lock"); ASSIGN_GSN(gsn_sneak, "sneak"); ASSIGN_GSN(gsn_steal, "steal"); ASSIGN_GSN(gsn_gouge, "gouge"); ASSIGN_GSN(gsn_poison_weapon, "poison weapon"); ASSIGN_GSN(gsn_disarm, "disarm"); ASSIGN_GSN(gsn_enhanced_damage, "enhanced damage"); ASSIGN_GSN(gsn_parry, "parry"); ASSIGN_GSN(gsn_rescue, "rescue"); ASSIGN_GSN(gsn_dual_wield, "dual wield"); ASSIGN_GSN(gsn_stun, "stun"); ASSIGN_GSN(gsn_daze, "daze"); ASSIGN_GSN(gsn_bashdoor, "doorbash"); ASSIGN_GSN(gsn_grip, "grip"); ASSIGN_GSN(gsn_berserk, "berserk"); ASSIGN_GSN(gsn_hitall, "hitall"); ASSIGN_GSN(gsn_kick_back, "kickback"); ASSIGN_GSN(gsn_deadly_accuracy, "deadly accuracy"); ASSIGN_GSN(gsn_attack_frenzy, "attack frenzy"); ASSIGN_GSN(gsn_lore, "lore"); ASSIGN_GSN(gsn_critical, "critical strike"); ASSIGN_GSN(gsn_counter, "counter attack"); ASSIGN_GSN(gsn_aid, "aid"); ASSIGN_GSN(gsn_track, "track"); ASSIGN_GSN(gsn_search, "search"); ASSIGN_GSN(gsn_manatap, "manatap"); ASSIGN_GSN(gsn_dig, "dig"); ASSIGN_GSN(gsn_scribe, "scribe"); ASSIGN_GSN(gsn_brew, "brew"); ASSIGN_GSN(gsn_climb, "climb"); ASSIGN_GSN(gsn_cook, "cook"); ASSIGN_GSN(gsn_scan, "scan"); ASSIGN_GSN(gsn_slice, "slice"); ASSIGN_GSN(gsn_summon_corpse, "summon corpse"); ASSIGN_GSN(gsn_resurrection, "resurrection"); ASSIGN_GSN(gsn_lesser_resurrection, "lesser resurrection"); ASSIGN_GSN(gsn_greater_resurrection, "greater resurrection"); ASSIGN_GSN(gsn_web, "web"); ASSIGN_GSN(gsn_snare, "snare"); ASSIGN_GSN(gsn_revitalize_spirit, "revitalize spirit"); ASSIGN_GSN(gsn_holy_cleansing, "holy cleansing"); ASSIGN_GSN(gsn_extradimensional_portal, "extradimensional portal"); // ASSIGN_GSN(gsn_fireball, "fireball"); ASSIGN_GSN(gsn_wizardeye, "wizardeye"); // ASSIGN_GSN(gsn_chill_touch, "chill touch"); // ASSIGN_GSN(gsn_lightning_bolt, "lightning bolt"); ASSIGN_GSN(gsn_eye_of_god, "eye of god"); ASSIGN_GSN(gsn_aqua_breath, "aqua breath"); ASSIGN_GSN(gsn_possess, "possess"); ASSIGN_GSN(gsn_blindness, "blindness"); ASSIGN_GSN(gsn_charm_person, "charm person"); ASSIGN_GSN(gsn_curse, "curse"); ASSIGN_GSN(gsn_invis, "invis"); ASSIGN_GSN(gsn_mass_invis, "mass invis"); ASSIGN_GSN(gsn_poison, "poison"); ASSIGN_GSN(gsn_mountain_climb, "mountain climbing"); ASSIGN_GSN(gsn_study, "study"); ASSIGN_GSN(gsn_sleep, "sleep"); ASSIGN_GSN(gsn_common, "common"); ASSIGN_GSN(gsn_elven, "elven"); ASSIGN_GSN(gsn_dwarven, "dwarven"); ASSIGN_GSN(gsn_pixie, "pixie"); ASSIGN_GSN(gsn_ogre, "ogre"); ASSIGN_GSN(gsn_orcish, "orcish"); ASSIGN_GSN(gsn_trollish, "trollese"); ASSIGN_GSN(gsn_goblin, "goblin"); ASSIGN_GSN(gsn_halfling, "halfling"); } log_string( "Loading DNS cache..." ); /* Samson 1-30-02 */ load_dns(); log_string("Reading in plane file..."); load_planes(); log_string("Loading in NPC Races..."); load_npcrace_file(); /* * Read in all the area files. */ { FILE *fpList; log_string("Reading in area files..."); if ((fpList = fopen(AREA_LIST, "r")) == NULL) { perror(AREA_LIST); shutdown_mud("Unable to open area list"); exit(1); } for (;;) { strcpy(strArea, fread_word(fpList)); if (strArea[0] == '$') break; load_area_file(last_area, strArea); } fclose(fpList); } for (tarea = first_area; tarea; tarea = tarea->next) { if (tarea->kingdom >= sysdata.max_kingdom || tarea->kingdom < 0) { tarea->kingdom = 0; tarea->kpid = 0; fold_area(tarea, tarea->filename, FALSE, 1); } if (tarea->kpid == 0 && tarea->kingdom > 0) { tarea->kpid = kingdom_table[tarea->kingdom]->kpid; fold_area(tarea, tarea->filename, FALSE, 1); } } log_string("Making sure rooms are planed..."); check_planes(NULL); /* * initialize supermob. * must be done before reset_area! * */ init_supermob(); /* * Has some bad memory bugs in it */ /* * Fix up exits. * Declare db booting over. * Reset all areas once. * Load up the notes file. */ { log_string("Fixing exits"); fix_exits(); fBootDb = FALSE; log_string("Initializing economy"); initialize_economy(); log_string("Loading Trap Data"); //Must be after the area content is loaded and before the resets are run load_trap_file(NULL); log_string("Resetting areas"); area_update(); log_string("Loading buildlist"); load_buildlist(); log_string("Loading kingdoms"); load_kingdoms(); log_string("Loading Portals"); load_portal_file(); log_string("Loading boards"); load_boards(); log_string("Loading Global Boards"); load_global_boards(); log_string("Loading Battle Descriptions"); fread_battle_descriptions(); log_string("Loading clans"); load_clans(); log_string("Loading councils"); load_deity(); log_string("Loading deities"); load_councils(); log_string("Loading watches"); load_watchlist(); log_string("Loading bans"); load_banlist(); log_string("Loading reserved names"); load_reserved(); log_string("Loading corpses"); load_corpses(); log_string("Loading Immortal Hosts"); log_string("Loading slay table"); /* Online slay table - Samson 8-3-98 */ load_slays(); load_imm_host(); log_string("Loading Projects"); load_projects(); log_string("Loading Conquer List"); load_conquer_file(); log_string("Loading Channel History"); read_channelhistory_file(); log_string("Loading Authorized List"); load_authlist(); log_string("Loading Trainers"); load_trainer_data(); log_string("Loading Treasure"); load_gem_data(); log_string("Loading Treasure Boxes"); load_box_data(); log_string("Loading Depositories"); load_kingdom_depo(); log_string("Loading Default Depositories"); load_default_depo(); log_string("Loading Battle Arena List"); load_barena_data(); log_string("Loading Wilderness Bin List"); load_bin_data(); log_string("Loading Trading List"); load_trade_file(); log_string("Loading Members List"); scan_players(); log_string("Loading Kingdom Chests"); load_kchest_file(); log_string("Loading Kingdom Military"); load_mlist_data(); log_string("Loading Extraction Mobiles"); load_extraction_data(); log_string("Loading Kingdom Buy List"); load_buykingdom_data(); log_string("Loading Training Data for Kingdoms"); fread_training_list(); log_string("Loading Quest Mobile List"); load_qmob_data(); log_string("Loading Quest Object List"); load_qobj_data(); log_string("Loading Quest Contents"); load_quest_contents(); log_string("Loading Quest Data"); load_quest_data(); log_string("Loading Ship Data"); load_ship_data(); log_string("Loading Market Data"); load_market_data(); /* Morphs MUST be loaded after class and race tables are set up --Shaddai */ log_string("Loading Morphs"); load_morphs(); MOBtrigger = TRUE; if (fCopyOver) { log_string("Running copyover_recover."); copyover_recover(); } } /* Initialize area weather data */ if (load_weatherdata() == FALSE) init_area_weather(); /* init_maps ( ); */ return; } /* * Load an 'area' header line. */ void load_area(FILE * fp) { AREA_DATA *pArea; CREATE(pArea, AREA_DATA, 1); pArea->first_reset = NULL; pArea->last_reset = NULL; pArea->name = fread_string_nohash(fp); pArea->author = STRALLOC("unknown"); pArea->filename = str_dup(strArea); pArea->age = 15; pArea->nplayer = 0; pArea->low_r_vnum = 0; pArea->low_o_vnum = 0; pArea->low_m_vnum = 0; pArea->hi_r_vnum = 0; pArea->hi_o_vnum = 0; pArea->hi_m_vnum = 0; pArea->low_soft_range = 0; pArea->hi_soft_range = MAX_LEVEL; pArea->low_hard_range = 0; pArea->hi_hard_range = MAX_LEVEL; pArea->kingdom = -1; area_version = 0; LINK(pArea, first_area, last_area, next, prev); top_area++; return; } /* Load the version number of the area file if none exists, then it * is set to version 0 when #AREA is read in which is why we check for * the #AREA here. --Shaddai */ void load_version(AREA_DATA * tarea, FILE * fp) { if (!tarea) { bug("Load_author: no #AREA seen yet."); if (fBootDb) { shutdown_mud("No #AREA"); exit(1); } else return; } area_version = fread_number(fp); return; } /* * Load an author section. Scryn 2/1/96 */ void load_author(AREA_DATA * tarea, FILE * fp) { if (!tarea) { bug("Load_author: no #AREA seen yet."); if (fBootDb) { shutdown_mud("No #AREA"); exit(1); } else return; } if (tarea->author) STRFREE(tarea->author); tarea->author = fread_string(fp); return; } void load_kowner(AREA_DATA * tarea, FILE * fp) { if (!tarea) { bug("Load_kowner: no #AREA seen yet."); if (fBootDb) { shutdown_mud("No #AREA"); exit(1); } else return; } if (tarea->kowner) STRFREE(tarea->kowner); tarea->kowner = fread_string(fp); return; } //no longer used, left for old area files void load_area_kingdom(AREA_DATA * tarea, FILE * fp) { int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12; char *ln; if (!tarea) { bug("Load_ranges: no #AREA seen yet."); shutdown_mud("No #AREA"); exit(1); } for (;;) { ln = fread_line(fp); if (ln[0] == '$') break; x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = x10 = x11 = x12 = 0; if (area_version < 41) sscanf(ln, "%d %d %d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9, &x10, &x11); else sscanf(ln, "%d %d %d %d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9, &x10, &x11, &x12); } tarea->res_tree = x1; tarea->res_corn = x2; tarea->res_grain = x3; tarea->res_iron = x4; tarea->res_gold = x5; tarea->res_stone = x6; tarea->gold = x7; tarea->salestax = x8; tarea->poptax = x9; tarea->death = x10; tarea->recall = x11; tarea->lasttaxchange = x12; if (tarea->recall <= 0) tarea->recall = ROOM_VNUM_TEMPLE; if (tarea->death <= 0) tarea->death = ROOM_VNUM_ALTAR; return; } /* * Load an economy section. Thoric */ void load_economy(AREA_DATA * tarea, FILE * fp) { if (!tarea) { bug("Load_economy: no #AREA seen yet."); if (fBootDb) { shutdown_mud("No #AREA"); exit(1); } else return; } tarea->high_economy = fread_number(fp); tarea->low_economy = fread_number(fp); if (area_version >= 25) tarea->population = fread_number(fp); return; } /* Reset Message Load, Rennard */ void load_resetmsg(AREA_DATA * tarea, FILE * fp) { if (!tarea) { bug("Load_resetmsg: no #AREA seen yet."); if (fBootDb) { shutdown_mud("No #AREA"); exit(1); } else return; } if (tarea->resetmsg) DISPOSE(tarea->resetmsg); tarea->resetmsg = fread_string_nohash(fp); return; } /* * Load area flags. Narn, Mar/96 */ void load_flags(AREA_DATA * tarea, FILE * fp) { char *ln; int x1, x2; if (!tarea) { bug("Load_flags: no #AREA seen yet."); if (fBootDb) { shutdown_mud("No #AREA"); exit(1); } else return; } ln = fread_line(fp); x1 = x2 = 0; sscanf(ln, "%d %d", &x1, &x2); tarea->flags = x1; tarea->reset_frequency = x2; if (x2) tarea->age = x2; return; } /* * Adds a help page to the list if it is not a duplicate of an existing page. * Page is insert-sorted by keyword. -Thoric * (The reason for sorting is to keep do_hlist looking nice) */ void add_help(HELP_DATA * pHelp) { HELP_DATA *tHelp; int match; for (tHelp = first_help; tHelp; tHelp = tHelp->next) if (pHelp->level == tHelp->level && strcmp(pHelp->keyword, tHelp->keyword) == 0) { bug("add_help: duplicate: %s. Deleting.", pHelp->keyword); STRFREE(pHelp->text); STRFREE(pHelp->keyword); DISPOSE(pHelp); return; } else if ((match = strcmp(pHelp->keyword[0] == '\'' ? pHelp->keyword + 1 : pHelp->keyword, tHelp->keyword[0] == '\'' ? tHelp->keyword + 1 : tHelp->keyword)) < 0 || (match == 0 && pHelp->level > tHelp->level)) { if (!tHelp->prev) first_help = pHelp; else tHelp->prev->next = pHelp; pHelp->prev = tHelp->prev; pHelp->next = tHelp; tHelp->prev = pHelp; break; } if (!tHelp) LINK(pHelp, first_help, last_help, next, prev); top_help++; } int parse_helpfile_index(FILE *fp, HELP_DATA *pHelp, char *argument) { HINDEX_DATA * hindex = NULL; HINDEX_DATA * hindex2; HINDEX_DATA *findex; HINDEX_NAME * hiname; HINDEX_POINTER *hpointer; HINDEX_IPOINTER *hipointer; HELP_DATA *help; char keyword[100]; char fullkeyword[200]; int value = 0; char *keystring; //if there is a file pointer, then it is being read from file, if not, it is being used in hset if (fp) { keystring = fread_string(fp); if (keystring[0] != '#') return 1; keystring++; //advance past the # sprintf(fullkeyword, "%s", keystring); keystring = one_argument(keystring, keyword); if (!str_cmp(keyword, "END")) return 0; } else { sprintf(fullkeyword, argument); keystring = argument; keystring = one_argument(keystring, keyword); } CREATE(hiname, HINDEX_NAME, 1); hiname->name = STRALLOC(fullkeyword); LINK(hiname, pHelp->first_iname, pHelp->last_iname, next, prev); if (!first_hindex) { CREATE(hindex, HINDEX_DATA, 1); hindex->keyword = STRALLOC(keyword); hindex->first_help = NULL; hindex->last_help = NULL; hindex->first_hindex = NULL; hindex->last_hindex = NULL; LINK(hindex, first_hindex, last_hindex, next, prev); LINK(hindex, first_fhindex, last_fhindex, fnext, fprev); } if (keystring[0] == '\0') //Only was one keyword, no need to start looping through the keywords { if (!hindex) { for (hindex = first_hindex; hindex; hindex = hindex->next) { if (!str_cmp(hindex->keyword, keyword)) break; } if (!hindex) { for (findex = first_fhindex; findex; findex = findex->fnext) { if (!str_cmp(findex->keyword, keyword)) break; } if (!findex) { CREATE(hindex, HINDEX_DATA, 1); hindex->keyword = STRALLOC(keyword); hindex->first_help = NULL; hindex->last_help = NULL; hindex->first_hindex = NULL; hindex->last_hindex = NULL; } else hindex = findex; LINK(hindex, first_hindex, last_hindex, next, prev); LINK(hindex, first_fhindex, last_fhindex, fnext, fprev); } } if (!hindex->first_help) { CREATE(hipointer, HINDEX_IPOINTER, 1); hipointer->pointer = pHelp; LINK(hipointer, hindex->first_help, hindex->last_help, next, prev); CREATE(hpointer, HINDEX_POINTER, 1); hpointer->pointer = hindex; LINK(hpointer, pHelp->first_hindex, pHelp->last_hindex, next, prev); } else { for (hipointer = hindex->first_help; hipointer; hipointer = hipointer->next) { help = hipointer->pointer; if (!str_cmp(pHelp->keyword, help->keyword)) // Same helpfile break; } if (!hipointer) { CREATE(hipointer, HINDEX_IPOINTER, 1); hipointer->pointer = pHelp; LINK(hipointer, hindex->first_help, hindex->last_help, next, prev); CREATE(hpointer, HINDEX_POINTER, 1); hpointer->pointer = hindex; LINK(hpointer, pHelp->first_hindex, pHelp->last_hindex, next, prev); } } if (argument) return 1; //another round... value = parse_helpfile_index(fp, pHelp, NULL); return value; //once it reaches a value it will loop back out and return that value } //Will never reach this loop unless there are more than 1 keyword..... for (hindex = first_hindex; hindex; hindex = hindex->next) { if (!hindex->next && str_cmp(keyword, hindex->keyword)) //don't want to break out of this loop just yet... { for (findex = first_fhindex; findex; findex = findex->fnext) { if (!str_cmp(findex->keyword, keyword)) break; } if (!findex) { CREATE(hindex2, HINDEX_DATA, 1); hindex2->keyword = STRALLOC(keyword); hindex2->first_help = NULL; hindex2->last_help = NULL; hindex2->first_hindex = NULL; hindex2->last_hindex = NULL; hindex2->first_top_hindex = NULL; hindex2->last_top_hindex = NULL; } else hindex2 = findex; LINK(hindex2, first_hindex, last_hindex, next, prev); LINK(hindex2, first_fhindex, last_fhindex, fnext, fprev); hindex = hindex2; } if (!str_cmp(keyword, hindex->keyword)) { for (;;) { keystring = one_argument(keystring, keyword); if (keyword[0] == '\0') { if (!hindex->first_help) { CREATE(hipointer, HINDEX_IPOINTER, 1); hipointer->pointer = pHelp; LINK(hipointer, hindex->first_help, hindex->last_help, next, prev); CREATE(hpointer, HINDEX_POINTER, 1); hpointer->pointer = hindex; LINK(hpointer, pHelp->first_hindex, pHelp->last_hindex, next, prev); } else { for (hipointer = hindex->first_help; hipointer; hipointer = hipointer->next) { help = hipointer->pointer; if (!str_cmp(pHelp->keyword, help->keyword)) // Same helpfile { break; } } if (!hipointer) { CREATE(hipointer, HINDEX_IPOINTER, 1); hipointer->pointer = pHelp; LINK(hipointer, hindex->first_help, hindex->last_help, next, prev); CREATE(hpointer, HINDEX_POINTER, 1); hpointer->pointer = hindex; LINK(hpointer, pHelp->first_hindex, pHelp->last_hindex, next, prev); } } break; } if (!hindex->first_hindex) { for (findex = first_fhindex; findex; findex = findex->fnext) { if (!str_cmp(findex->keyword, keyword)) break; } if (!findex) { CREATE(hindex2, HINDEX_DATA, 1); hindex2->keyword = STRALLOC(keyword); hindex2->first_help = NULL; hindex2->last_help = NULL; hindex2->first_hindex = NULL; hindex2->last_hindex = NULL; hindex2->first_top_hindex = NULL; hindex2->last_top_hindex = NULL; } else hindex2 = findex; LINK(hindex2, hindex->first_hindex, hindex->last_hindex, next, prev); LINK(hindex, hindex2->first_top_hindex, hindex2->last_top_hindex, tnext, tprev); LINK(hindex2, first_fhindex, last_fhindex, fnext, fprev); } for (hindex2 = hindex->first_hindex; hindex2; hindex2 = hindex2->next) { if (!str_cmp(keyword, hindex2->keyword)) break; } if (!hindex2) { for (findex = first_fhindex; findex; findex = findex->fnext) { if (!str_cmp(findex->keyword, keyword)) break; } if (!findex) { CREATE(hindex2, HINDEX_DATA, 1); hindex2->keyword = STRALLOC(keyword); hindex2->first_help = NULL; hindex2->last_help = NULL; hindex2->first_hindex = NULL; hindex2->last_hindex = NULL; hindex2->first_top_hindex = NULL; hindex2->last_top_hindex = NULL; } else hindex2 = findex; LINK(hindex2, hindex->first_hindex, hindex->last_hindex, next, prev); LINK(hindex, hindex2->first_top_hindex, hindex2->last_top_hindex, tnext, tprev); LINK(hindex2, first_fhindex, last_fhindex, fnext, fprev); } hindex = hindex2; //So this can go in an infinite loop theoretically } break; } } //another round... if (argument) return 1; value = parse_helpfile_index(fp, pHelp, NULL); return value; //once it reaches a value it will loop back out and return that value } /* * Load a help section. */ void load_helps(AREA_DATA * tarea, FILE * fp) { HELP_DATA *pHelp; for (;;) { CREATE(pHelp, HELP_DATA, 1); pHelp->first_hindex = NULL; pHelp->last_hindex = NULL; pHelp->level = fread_number(fp); pHelp->keyword = fread_string(fp); pHelp->first_iname = NULL; pHelp->last_hindex = NULL; if (pHelp->keyword[0] == '$') { STRFREE(pHelp->keyword); DISPOSE(pHelp); break; } //Parses and creates the helpfile index if (parse_helpfile_index(fp, pHelp, NULL) == 1) { bug("%s has no hindex, exiting!!!!!", pHelp->keyword); STRFREE(pHelp->keyword); DISPOSE(pHelp); exit(0); } pHelp->text = fread_string(fp); if (pHelp->keyword[0] == '\0') { STRFREE(pHelp->text); STRFREE(pHelp->keyword); DISPOSE(pHelp); continue; } if (!str_cmp(pHelp->keyword, "greeting")) help_greeting = pHelp->text; add_help(pHelp); } return; } /* * Add a character to the list of all characters -Thoric */ void add_char(CHAR_DATA * ch) { // CMAP_DATA *mch; LINK(ch, first_char, last_char, next, prev); /* if (IS_NPC(ch) && (ch->pIndexData->vnum >= OVERLAND_LOW_MOB && ch->pIndexData->vnum <= OVERLAND_HI_MOB)) { CREATE(mch, CMAP_DATA, 1); mch->mapch = ch; LINK( mch, first_wilderchar, last_wilderchar, next, prev ); top_map_mob++; } */ } /* * Load a mob section. */ void load_mobiles(AREA_DATA * tarea, FILE * fp) { MOB_INDEX_DATA *pMobIndex; char *ln; int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; int dummy; int toss; if (!tarea) { bug("Load_mobiles: no #AREA seen yet."); if (fBootDb) { shutdown_mud("No #AREA"); exit(1); } else return; } for (;;) { char buf[MSL]; sh_int vnum; char letter; int iHash; bool oldmob; bool tmpBootDb; letter = fread_letter(fp); if (letter != '#') { bug("Load_mobiles: # not found."); if (fBootDb) { shutdown_mud("# not found"); exit(1); } else return; } vnum = fread_number(fp); if (vnum == 0) break; tmpBootDb = fBootDb; fBootDb = FALSE; if (get_mob_index(vnum)) { if (tmpBootDb) { bug("Load_mobiles: vnum %d duplicated.", vnum); shutdown_mud("duplicate vnum"); exit(1); } else { pMobIndex = get_mob_index(vnum); sprintf(buf, "Cleaning mobile: %d", vnum); log_string_plus(buf, LOG_BUILD, sysdata.log_level); clean_mob(pMobIndex); oldmob = TRUE; } } else { oldmob = FALSE; CREATE(pMobIndex, MOB_INDEX_DATA, 1); } fBootDb = tmpBootDb; pMobIndex->vnum = vnum; if (fBootDb) { if (!tarea->low_m_vnum) tarea->low_m_vnum = vnum; if (vnum > tarea->hi_m_vnum) tarea->hi_m_vnum = vnum; } pMobIndex->player_name = fread_string(fp); pMobIndex->short_descr = fread_string(fp); pMobIndex->long_descr = fread_string(fp); pMobIndex->description = fread_string(fp); pMobIndex->long_descr[0] = UPPER(pMobIndex->long_descr[0]); pMobIndex->description[0] = UPPER(pMobIndex->description[0]); pMobIndex->act = fread_bitvector(fp); xSET_BIT(pMobIndex->act, ACT_IS_NPC); if (area_version >= 27) pMobIndex->miflags = fread_bitvector(fp); pMobIndex->affected_by = fread_bitvector(fp); pMobIndex->pShop = NULL; pMobIndex->rShop = NULL; pMobIndex->alignment = fread_number(fp); letter = fread_letter(fp); if (area_version < 32 || area_version > 33) { x1 = fread_number(fp); x1 = fread_number(fp); x1 = 0; pMobIndex->ac = fread_number(fp); } if (area_version >= 36) { pMobIndex->tohitbash = fread_number(fp); pMobIndex->tohitslash = fread_number(fp); pMobIndex->tohitstab = fread_number(fp); } pMobIndex->hitnodice = fread_number(fp); /* 'd' */ fread_letter(fp); pMobIndex->hitsizedice = fread_number(fp); /* '+' */ fread_letter(fp); pMobIndex->hitplus = fread_number(fp); pMobIndex->damnodice = fread_number(fp); /* 'd' */ fread_letter(fp); pMobIndex->damsizedice = fread_number(fp); /* '+' */ fread_letter(fp); pMobIndex->damplus = fread_number(fp); if (area_version > 17) toss = fread_number(fp); if (area_version >= 52) { pMobIndex->damaddlow = fread_number(fp); pMobIndex->damaddhi = fread_number(fp); } pMobIndex->gold = fread_number(fp); x1 = fread_number(fp); //use to be xp x1 = 0; /* pMobIndex->position = fread_number( fp ); */ pMobIndex->position = fread_number(fp); if (pMobIndex->position < 100) { switch (pMobIndex->position) { default: case 0: case 1: case 2: case 3: case 4: break; case 5: pMobIndex->position = 6; break; case 6: pMobIndex->position = 8; break; case 7: pMobIndex->position = 9; break; case 8: pMobIndex->position = 12; break; case 9: pMobIndex->position = 13; break; case 10: pMobIndex->position = 14; break; case 11: pMobIndex->position = 15; break; } } else { pMobIndex->position -= 100; } /* pMobIndex->defposition = fread_number( fp ); */ pMobIndex->defposition = fread_number(fp); if (pMobIndex->defposition < 100) { switch (pMobIndex->defposition) { default: case 0: case 1: case 2: case 3: case 4: break; case 5: pMobIndex->defposition = 6; break; case 6: pMobIndex->defposition = 8; break; case 7: pMobIndex->defposition = 9; break; case 8: pMobIndex->defposition = 12; break; case 9: pMobIndex->defposition = 13; break; case 10: pMobIndex->defposition = 14; break; case 11: pMobIndex->defposition = 15; break; } } else { pMobIndex->defposition -= 100; } /* * Back to meaningful values. */ pMobIndex->sex = fread_number(fp); if (letter != 'S' && letter != 'C') { bug("Load_mobiles: vnum %d: letter '%c' not S or C.", vnum, letter); shutdown_mud("bad mob data"); exit(1); } if (letter == 'C') /* Realms complex mob -Thoric */ { pMobIndex->perm_str = fread_number(fp); pMobIndex->perm_int = fread_number(fp); pMobIndex->perm_wis = fread_number(fp); pMobIndex->perm_dex = fread_number(fp); pMobIndex->perm_con = fread_number(fp); pMobIndex->perm_cha = fread_number(fp); pMobIndex->perm_lck = fread_number(fp); if (area_version >= 37) pMobIndex->perm_agi = fread_number(fp); pMobIndex->saving_poison_death = fread_number(fp); pMobIndex->saving_wand = fread_number(fp); pMobIndex->saving_para_petri = fread_number(fp); pMobIndex->saving_breath = fread_number(fp); pMobIndex->saving_spell_staff = fread_number(fp); ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = 0; sscanf(ln, "%d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7); pMobIndex->race = x1; // class was set to 0 pMobIndex->height = x3; pMobIndex->weight = x4; pMobIndex->speaks = 0; pMobIndex->speaking = 0; pMobIndex->perm_agi = x7; if (area_version >= 12) { pMobIndex->m1 = fread_number(fp); pMobIndex->m2 = fread_number(fp); pMobIndex->m3 = fread_number(fp); pMobIndex->m4 = fread_number(fp); pMobIndex->m5 = fread_number(fp); } if (area_version >= 13) { pMobIndex->m6 = fread_number(fp); } if (area_version >= 26) { pMobIndex->m7 = fread_number(fp); pMobIndex->m8 = fread_number(fp); pMobIndex->m9 = fread_number(fp); } if (area_version >= 15) { pMobIndex->cident = fread_number(fp); } if (area_version >= 45) { pMobIndex->m10 = fread_number(fp); pMobIndex->m11 = fread_number(fp); pMobIndex->m12 = fread_number(fp); } if (area_version >= 50) { ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = x10 = x11 = x12 = x13 = x14 = x15 = 0; sscanf(ln, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9, &x10, &x11, &x12, &x13, &x14, &x15); pMobIndex->apply_res_fire = (x1 == 0 ? 100 : x1); pMobIndex->apply_res_water = (x2 == 0 ? 100 : x2); pMobIndex->apply_res_air = (x3 == 0 ? 100 : x3); pMobIndex->apply_res_earth = (x4 == 0 ? 100 : x4); pMobIndex->apply_res_energy = (x5 == 0 ? 100 : x5); pMobIndex->apply_res_magic = (x6 == 0 ? 100 : x6); pMobIndex->apply_res_nonmagic = (x7 == 0 ? 100 : x7); pMobIndex->apply_res_blunt = (x8 == 0 ? 100 : x8); pMobIndex->apply_res_pierce = (x9 == 0 ? 100 : x9); pMobIndex->apply_res_slash = (x10 == 0 ? 100 : x10); pMobIndex->apply_res_poison = (x11 == 0 ? 100 : x11); pMobIndex->apply_res_paralysis = (x12 == 0 ? 100 : x12); pMobIndex->apply_res_holy = (x13 == 0 ? 100 : x13); pMobIndex->apply_res_unholy = (x14 == 0 ? 100 : x14); pMobIndex->apply_res_undead = (x15 == 0 ? 100 : x15); } if (!pMobIndex->speaks) pMobIndex->speaks = LANG_COMMON; if (!pMobIndex->speaking) pMobIndex->speaking = LANG_COMMON; #ifndef XBI ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = 0; if (area_version >= 29) sscanf(ln, "%d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9); else sscanf(ln, "%d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8); pMobIndex->hitroll = x1; pMobIndex->damroll = x2; pMobIndex->xflags = x3; pMobIndex->resistant = x4; pMobIndex->immune = x5; pMobIndex->susceptible = x6; if (area_version >= 29) { pMobIndex->elementb = x7; pMobIndex->attacks = x8; pMobIndex->defenses = x9; } else { pMobIndex->attacks = x7; pMobIndex->defenses = x8; } #else pMobIndex->hitroll = fread_number(fp); pMobIndex->damroll = fread_number(fp); pMobIndex->xflags = fread_number(fp); pMobIndex->resistant = fread_number(fp); pMobIndex->immune = fread_number(fp); pMobIndex->susceptible = fread_number(fp); if (area_version >= 29) { pMobIndex->elementb = fread_number(fp); pMobIndex->attacks = fread_bitvector(fp); pMobIndex->defenses = fread_bitvector(fp); } else { pMobIndex->attacks = fread_bitvector(fp); pMobIndex->defenses = fread_bitvector(fp); } #endif } else { pMobIndex->perm_str = 13; pMobIndex->perm_dex = 13; pMobIndex->perm_int = 13; pMobIndex->perm_wis = 13; pMobIndex->perm_cha = 13; pMobIndex->perm_con = 13; pMobIndex->perm_lck = 13; pMobIndex->perm_agi = 15; pMobIndex->race = 0; pMobIndex->xflags = 0; pMobIndex->resistant = 0; pMobIndex->immune = 0; pMobIndex->susceptible = 0; #ifdef XBI xCLEAR_BITS(pMobIndex->attacks); xCLEAR_BITS(pMobIndex->defenses); #else pMobIndex->attacks = 0; pMobIndex->defenses = 0; #endif } letter = fread_letter(fp); if (letter == 'M') dummy = fread_number(fp); else { dummy = MAX_MOB_COUNT; ungetc(letter, fp); } letter = fread_letter(fp); if (letter == '>') { ungetc(letter, fp); mprog_read_programs(fp, pMobIndex); } else ungetc(letter, fp); if (!oldmob) { iHash = vnum % MAX_KEY_HASH; pMobIndex->next = mob_index_hash[iHash]; mob_index_hash[iHash] = pMobIndex; top_mob_index++; } } return; } /* * Load an obj section. */ void load_objects(AREA_DATA * tarea, FILE * fp) { OBJ_INDEX_DATA *pObjIndex; char letter; char *ln; int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14; if (!tarea) { bug("Load_objects: no #AREA seen yet."); if (fBootDb) { shutdown_mud("No #AREA"); exit(1); } else return; } for (;;) { char buf[MSL]; int vnum; int iHash; bool tmpBootDb; bool oldobj; letter = fread_letter(fp); if (letter != '#') { bug("Load_objects: # not found."); if (fBootDb) { shutdown_mud("# not found"); exit(1); } else return; } vnum = fread_number(fp); if (vnum == 0) break; tmpBootDb = fBootDb; fBootDb = FALSE; if (get_obj_index(vnum)) { if (tmpBootDb) { bug("Load_objects: vnum %d duplicated.", vnum); shutdown_mud("duplicate vnum"); exit(1); } else { pObjIndex = get_obj_index(vnum); sprintf(buf, "Cleaning object: %d", vnum); log_string_plus(buf, LOG_BUILD, sysdata.log_level); clean_obj(pObjIndex); oldobj = TRUE; } } else { oldobj = FALSE; CREATE(pObjIndex, OBJ_INDEX_DATA, 1); } fBootDb = tmpBootDb; pObjIndex->vnum = vnum; if (fBootDb) { if (!tarea->low_o_vnum) tarea->low_o_vnum = vnum; if (vnum > tarea->hi_o_vnum) tarea->hi_o_vnum = vnum; } pObjIndex->name = fread_string(fp); pObjIndex->short_descr = fread_string(fp); pObjIndex->description = fread_string(fp); pObjIndex->action_desc = fread_string(fp); /* Commented out by Narn, Apr/96 to allow item short descs like Bonecrusher and Oblivion */ /*pObjIndex->short_descr[0] = LOWER(pObjIndex->short_descr[0]); */ pObjIndex->description[0] = UPPER(pObjIndex->description[0]); pObjIndex->item_type = fread_number(fp); pObjIndex->extra_flags = fread_bitvector(fp); ln = fread_line(fp); x1 = x2 = 0; sscanf(ln, "%d %d", &x1, &x2); pObjIndex->wear_flags = x1; pObjIndex->layers = x2; if (area_version < 22) { ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = 0; sscanf(ln, "%d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6); pObjIndex->value[0] = x1; pObjIndex->value[1] = x2; pObjIndex->value[2] = x3; pObjIndex->value[3] = x4; pObjIndex->value[4] = x5; pObjIndex->value[5] = x6; } else if (area_version < 30) { ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = 0; sscanf(ln, "%d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9); pObjIndex->value[0] = x1; pObjIndex->value[1] = x2; pObjIndex->value[2] = x3; pObjIndex->value[3] = x4; pObjIndex->value[4] = x5; pObjIndex->value[5] = x6; pObjIndex->value[6] = x7; pObjIndex->value[7] = x8; pObjIndex->value[8] = x9; } else if (area_version < 31) { ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = x10 = 0; sscanf(ln, "%d %d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9, &x10); pObjIndex->value[0] = x1; pObjIndex->value[1] = x2; pObjIndex->value[2] = x3; pObjIndex->value[3] = x4; pObjIndex->value[4] = x5; pObjIndex->value[5] = x6; pObjIndex->value[6] = x7; pObjIndex->value[7] = x8; pObjIndex->value[8] = x9; pObjIndex->value[9] = x10; } else if (area_version < 42) { ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = x10 = x11 = 0; sscanf(ln, "%d %d %d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9, &x10, &x11); pObjIndex->value[0] = x1; pObjIndex->value[1] = x2; pObjIndex->value[2] = x3; pObjIndex->value[3] = x4; pObjIndex->value[4] = x5; pObjIndex->value[5] = x6; pObjIndex->value[6] = x7; pObjIndex->value[7] = x8; pObjIndex->value[8] = x9; pObjIndex->value[9] = x10; pObjIndex->value[10] = x11; } else if (area_version < 46) { ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = x10 = x11 = x12 = 0; sscanf(ln, "%d %d %d %d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9, &x10, &x11, &x12); pObjIndex->value[0] = x1; pObjIndex->value[1] = x2; pObjIndex->value[2] = x3; pObjIndex->value[3] = x4; pObjIndex->value[4] = x5; pObjIndex->value[5] = x6; pObjIndex->value[6] = x7; pObjIndex->value[7] = x8; pObjIndex->value[8] = x9; pObjIndex->value[9] = x10; pObjIndex->value[10] = x11; pObjIndex->value[11] = x12; } else { ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = x10 = x11 = x12 = x13 = x14 = 0; sscanf(ln, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9, &x10, &x11, &x12, &x13, &x14); pObjIndex->value[0] = x1; pObjIndex->value[1] = x2; pObjIndex->value[2] = x3; pObjIndex->value[3] = x4; pObjIndex->value[4] = x5; pObjIndex->value[5] = x6; pObjIndex->value[6] = x7; pObjIndex->value[7] = x8; pObjIndex->value[8] = x9; pObjIndex->value[9] = x10; pObjIndex->value[10] = x11; pObjIndex->value[11] = x12; pObjIndex->value[12] = x13; pObjIndex->value[13] = x14; } if (area_version == 11 || area_version == 12) { ln = fread_line(fp); x1 = x2 = x3 = x4 = 0; sscanf(ln, "%d %d %d %d", &x1, &x2, &x3, &x4); pObjIndex->weight = x1; pObjIndex->weight = UMAX(1, pObjIndex->weight); pObjIndex->cost = x2; pObjIndex->rent = x3; /* unused */ pObjIndex->cvnum = x4; } else if (area_version >= 51) { float f1; ln = fread_line(fp); x1 = x2 = x3 = x4 = 0; sscanf(ln, "%f %d %d %d %d %d %d", &f1, &x2, &x3, &x4, &x5, &x6, &x7); pObjIndex->weight = f1; pObjIndex->weight = UMAX(.01, pObjIndex->weight); pObjIndex->cost = x2; pObjIndex->rent = x3; /* unused */ pObjIndex->cvnum = x4; pObjIndex->cident = x5; pObjIndex->sworthrestrict = x6; pObjIndex->imbueslots = x7; } else if (area_version >= 49) { float f1; ln = fread_line(fp); x1 = x2 = x3 = x4 = 0; sscanf(ln, "%f %d %d %d %d %d", &f1, &x2, &x3, &x4, &x5, &x6); pObjIndex->weight = f1; pObjIndex->weight = UMAX(.01, pObjIndex->weight); pObjIndex->cost = x2; pObjIndex->rent = x3; /* unused */ pObjIndex->cvnum = x4; pObjIndex->cident = x5; pObjIndex->sworthrestrict = x6; } else if (area_version >= 48) { float f1; ln = fread_line(fp); x1 = x2 = x3 = x4 = 0; sscanf(ln, "%f %d %d %d %d", &f1, &x2, &x3, &x4, &x5); pObjIndex->weight = f1; pObjIndex->weight = UMAX(.01, pObjIndex->weight); pObjIndex->cost = x2; pObjIndex->rent = x3; /* unused */ pObjIndex->cvnum = x4; pObjIndex->cident = x5; } else if (area_version > 12) { ln = fread_line(fp); x1 = x2 = x3 = x4 = 0; sscanf(ln, "%d %d %d %d %d", &x1, &x2, &x3, &x4, &x5); pObjIndex->weight = x1; pObjIndex->weight = UMAX(1, pObjIndex->weight); pObjIndex->cost = x2; pObjIndex->rent = x3; /* unused */ pObjIndex->cvnum = x4; pObjIndex->cident = x5; } /* I THINK THIS IS BROKEN, TAKE IT OUT? */ /* else if (area_version > 38) { ln = fread_line(fp); x1 = x2 = x3 = x4 = 0; sscanf(ln, "%d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6); pObjIndex->weight = x1; pObjIndex->weight = UMAX(1, pObjIndex->weight); pObjIndex->cost = x2; pObjIndex->bless_dur = x3; pObjIndex->rent = x4; pObjIndex->cvnum = x5; pObjIndex->cident = x6; }*/ else { ln = fread_line(fp); x1 = x2 = x3 == 0; sscanf(ln, "%d %d %d", &x1, &x2, &x3); pObjIndex->weight = x1; pObjIndex->weight = UMAX(1, pObjIndex->weight); pObjIndex->cost = x2; pObjIndex->rent = x3; /* unused */ } if (area_version >= 1) { switch (pObjIndex->item_type) { case ITEM_WEAPON: if (area_version >= 32) { pObjIndex->value[4] = skill_lookup(fread_word(fp)); } break; case ITEM_PILL: case ITEM_POTION: case ITEM_SCROLL: pObjIndex->value[1] = skill_lookup(fread_word(fp)); pObjIndex->value[2] = skill_lookup(fread_word(fp)); pObjIndex->value[3] = skill_lookup(fread_word(fp)); break; case ITEM_STAFF: case ITEM_WAND: pObjIndex->value[3] = skill_lookup(fread_word(fp)); break; case ITEM_SALVE: pObjIndex->value[4] = skill_lookup(fread_word(fp)); pObjIndex->value[5] = skill_lookup(fread_word(fp)); break; case ITEM_SPELLBOOK: pObjIndex->value[1] = skill_lookup(fread_word(fp)); break; case ITEM_SHEATH: pObjIndex->value[4] = skill_lookup(fread_word(fp)); break; case ITEM_TREASURE: if(xIS_SET(pObjIndex->extra_flags,ITEM_AFFREAG)) pObjIndex->value[1] = skill_lookup(fread_word(fp)); break; } } for (;;) { letter = fread_letter(fp); if (letter == 'A') { AFFECT_DATA *paf; CREATE(paf, AFFECT_DATA, 1); paf->type = -1; paf->duration = -1; paf->location = fread_number(fp); if (paf->location == APPLY_WEAPONSPELL || paf->location == APPLY_WEARSPELL || paf->location == APPLY_REMOVESPELL || paf->location == APPLY_STRIPSN || paf->location == APPLY_RECURRINGSPELL) paf->modifier = slot_lookup(fread_number(fp)); else paf->modifier = fread_number(fp); xCLEAR_BITS(paf->bitvector); if (area_version >= 53) paf->gemnum = fread_number(fp); LINK(paf, pObjIndex->first_affect, pObjIndex->last_affect, next, prev); top_affect++; } else if (letter == 'E') { EXTRA_DESCR_DATA *ed; CREATE(ed, EXTRA_DESCR_DATA, 1); ed->keyword = fread_string(fp); ed->description = fread_string(fp); LINK(ed, pObjIndex->first_extradesc, pObjIndex->last_extradesc, next, prev); top_ed++; } else if (letter == '>') { ungetc(letter, fp); oprog_read_programs(fp, pObjIndex); } else { ungetc(letter, fp); break; } } /* * Translate spell "slot numbers" to internal "skill numbers." */ if (area_version == 0) switch (pObjIndex->item_type) { case ITEM_PILL: case ITEM_POTION: case ITEM_SCROLL: pObjIndex->value[1] = slot_lookup(pObjIndex->value[1]); pObjIndex->value[2] = slot_lookup(pObjIndex->value[2]); pObjIndex->value[3] = slot_lookup(pObjIndex->value[3]); break; case ITEM_STAFF: case ITEM_WAND: pObjIndex->value[3] = slot_lookup(pObjIndex->value[3]); break; case ITEM_SALVE: pObjIndex->value[4] = slot_lookup(pObjIndex->value[4]); pObjIndex->value[5] = slot_lookup(pObjIndex->value[5]); break; case ITEM_SPELLBOOK: pObjIndex->value[1] = slot_lookup(pObjIndex->value[1]); break; case ITEM_SHEATH: pObjIndex->value[4] = slot_lookup(pObjIndex->value[4]); break; case ITEM_TREASURE: if(xIS_SET(pObjIndex->extra_flags,ITEM_AFFREAG)) pObjIndex->value[1] = slot_lookup(pObjIndex->value[1]); break; } if (!oldobj) { iHash = vnum % MAX_KEY_HASH; pObjIndex->next = obj_index_hash[iHash]; obj_index_hash[iHash] = pObjIndex; top_obj_index++; } } return; } /* * Load a reset section. */ void load_resets(AREA_DATA * tarea, FILE * fp) { char buf[MSL]; bool not01 = FALSE; int count = 0; if (!tarea) { bug("Load_resets: no #AREA seen yet."); if (fBootDb) { shutdown_mud("No #AREA"); exit(1); } else return; } if (tarea->first_reset) { if (fBootDb) { RESET_DATA *rtmp; bug("load_resets: WARNING: resets already exist for this area."); for (rtmp = tarea->first_reset; rtmp; rtmp = rtmp->next) ++count; } else { /* * Clean out the old resets */ sprintf(buf, "Cleaning resets: %s", tarea->name); log_string_plus(buf, LOG_BUILD, sysdata.log_level); clean_resets(tarea); } } for (;;) { ROOM_INDEX_DATA *pRoomIndex; EXIT_DATA *pexit; char letter; int extra, arg1, arg2, arg3, arg4, arg5, arg6, arg7, resetlast, resettime; if ((letter = fread_letter(fp)) == 'S') break; if (letter == '*') { fread_to_eol(fp); continue; } extra = fread_number(fp); arg1 = fread_number(fp); arg2 = fread_number(fp); if (letter == 'G') { if (area_version >= 33) arg3 = fread_number(fp); else arg3 = -1; } else { arg3 = (letter == 'R' || letter == 'A') ? 0 : fread_number(fp); } if (area_version == 20) { if (letter == 'M') { arg4 = fread_number(fp); arg5 = fread_number(fp); arg6 = fread_number(fp); } else { arg4 = -1; arg5 = -1; arg6 = -1; } } else if (area_version >= 21) { if (letter == 'O' || letter == 'M') { arg4 = fread_number(fp); arg5 = fread_number(fp); arg6 = fread_number(fp); } else { arg4 = -1; arg5 = -1; arg6 = -1; } } else { arg4 = -1; arg5 = -1; arg6 = -1; } if (area_version >= 33) { if (letter == 'O') { arg7 = fread_number(fp); } else { arg7 = -1; } } else { arg7 = -1; } if (area_version >= 35) { if (letter == 'P' || letter == 'E') { arg4 = fread_number(fp); } } if (area_version >= 43) { if (letter == 'G') arg4 = fread_number(fp); } //NOTE This has to be the last thing read unless you put any new values after resetlast and resettime if ((letter == 'P' || letter == 'E' || letter == 'O' || letter == 'M' || letter == 'G') && area_version >= 40) { resetlast = fread_number(fp); resettime = fread_number(fp); } else { resetlast = 0; resettime = 0; } fread_to_eol(fp); ++count; /* * Validate parameters. * We're calling the index functions for the side effect. */ switch (letter) { default: bug("Load_resets: bad command '%c'.", letter); if (fBootDb) boot_log("Load_resets: %s (%d) bad command '%c'.", tarea->filename, count, letter); return; case 'A': break; case 'M': if (get_mob_index(arg1) == NULL && fBootDb) boot_log("Load_resets: %s (%d) 'M': mobile %d doesn't exist.", tarea->filename, count, arg1); if (get_room_index(arg3) == NULL && fBootDb) boot_log("Load_resets: %s (%d) 'M': room %d doesn't exist.", tarea->filename, count, arg3); break; case 'O': if (get_obj_index(arg1) == NULL && fBootDb) boot_log("Load_resets: %s (%d) '%c': object %d doesn't exist.", tarea->filename, count, letter, arg1); if (get_room_index(arg3) == NULL && fBootDb) boot_log("Load_resets: %s (%d) '%c': room %d doesn't exist.", tarea->filename, count, letter, arg3); if (arg7 > 99 && get_obj_index(arg7) == NULL && fBootDb) boot_log("Load resets: %s (%d) '%c': ore %d doesn't exist.", tarea->filename, count, letter, arg7); break; case 'P': if (get_obj_index(arg1) == NULL && fBootDb) boot_log("Load_resets: %s (%d) '%c': object %d doesn't exist.", tarea->filename, count, letter, arg1); if (arg3 > 0) { if (get_obj_index(arg3) == NULL && fBootDb) boot_log("Load_resets: %s (%d) 'P': destination object %d doesn't exist.", tarea->filename, count, arg3); } else { if (extra > 1) not01 = TRUE; } if (arg4 > 99 && get_obj_index(arg4) == NULL && fBootDb) boot_log("Load resets: %s (%d) '%c': ore %d doesn't exist.", tarea->filename, count, letter, arg4); break; case 'G': if (get_obj_index(arg1) == NULL && fBootDb) boot_log("Load_resets: %s (%d) '%c': object %d doesn't exist.", tarea->filename, count, letter, arg1); if (arg3 > 99 && get_obj_index(arg3) == NULL && fBootDb) boot_log("Load resets: %s (%d) '%c': ore %d doesn't exist.", tarea->filename, count, letter, arg3); break; case 'E': if (get_obj_index(arg1) == NULL && fBootDb) boot_log("Load_resets: %s (%d) '%c': object %d doesn't exist.", tarea->filename, count, letter, arg1); if (arg4 > 99 && get_obj_index(arg4) == NULL && fBootDb) boot_log("Load resets: %s (%d) '%c': ore %d doesn't exist.", tarea->filename, count, letter, arg4); break; case 'T': break; case 'H': if (arg1 > 0) if (get_obj_index(arg1) == NULL && fBootDb) boot_log("Load_resets: %s (%d) 'H': object %d doesn't exist.", tarea->filename, count, arg1); break; case 'B': switch (arg2 & BIT_RESET_TYPE_MASK) { case BIT_RESET_DOOR: { int door; pRoomIndex = get_room_index(arg1); if (!pRoomIndex) { bug("Load_resets: 'B': room %d doesn't exist.", arg1); bug("Reset: %c %d %d %d %d", letter, extra, arg1, arg2, arg3); if (fBootDb) boot_log("Load_resets: %s (%d) 'B': room %d doesn't exist.", tarea->filename, count, arg1); } door = (arg2 & BIT_RESET_DOOR_MASK) >> BIT_RESET_DOOR_THRESHOLD; if (!(pexit = get_exit(pRoomIndex, door))) { bug("Load_resets: 'B': exit %d not door.", door); bug("Reset: %c %d %d %d %d", letter, extra, arg1, arg2, arg3); if (fBootDb) boot_log("Load_resets: %s (%d) 'B': exit %d not door.", tarea->filename, count, door); } } break; case BIT_RESET_ROOM: if (get_room_index(arg1) == NULL) { bug("Load_resets: 'B': room %d doesn't exist.", arg1); bug("Reset: %c %d %d %d %d", letter, extra, arg1, arg2, arg3); if (fBootDb) boot_log("Load_resets: %s (%d) 'B': room %d doesn't exist.", tarea->filename, count, arg1); } break; case BIT_RESET_OBJECT: if (arg1 > 0) if (get_obj_index(arg1) == NULL && fBootDb) boot_log("Load_resets: %s (%d) 'B': object %d doesn't exist.", tarea->filename, count, arg1); break; case BIT_RESET_MOBILE: if (arg1 > 0) if (get_mob_index(arg1) == NULL && fBootDb) boot_log("Load_resets: %s (%d) 'B': mobile %d doesn't exist.", tarea->filename, count, arg1); break; default: boot_log("Load_resets: %s (%d) 'B': bad type flag (%d).", tarea->filename, count, arg2 & BIT_RESET_TYPE_MASK); break; } break; case 'D': pRoomIndex = get_room_index(arg1); if (!pRoomIndex) { bug("Load_resets: 'D': room %d doesn't exist.", arg1); bug("Reset: %c %d %d %d %d", letter, extra, arg1, arg2, arg3); if (fBootDb) boot_log("Load_resets: %s (%d) 'D': room %d doesn't exist.", tarea->filename, count, arg1); break; } if (arg2 < 0 || arg2 > MAX_DIR + 1 || (pexit = get_exit(pRoomIndex, arg2)) == NULL || !IS_SET(pexit->exit_info, EX_ISDOOR)) { bug("Load_resets: 'D': exit %d not door.", arg2); bug("Reset: %c %d %d %d %d", letter, extra, arg1, arg2, arg3); if (fBootDb) boot_log("Load_resets: %s (%d) 'D': exit %d not door.", tarea->filename, count, arg2); } if (arg3 < 0 || arg3 > 2) { bug("Load_resets: 'D': bad 'locks': %d.", arg3); if (fBootDb) boot_log("Load_resets: %s (%d) 'D': bad 'locks': %d.", tarea->filename, count, arg3); } break; case 'R': pRoomIndex = get_room_index(arg1); if (!pRoomIndex && fBootDb) boot_log("Load_resets: %s (%d) 'R': room %d doesn't exist.", tarea->filename, count, arg1); if (arg2 < 0 || arg2 > 6) { bug("Load_resets: 'R': bad exit %d.", arg2); if (fBootDb) boot_log("Load_resets: %s (%d) 'R': bad exit %d.", tarea->filename, count, arg2); break; } break; } /* finally, add the reset */ add_reset(tarea, letter, extra, arg1, arg2, arg3, arg4, arg5, arg6, arg7, resetlast, resettime); } if (!not01) renumber_put_resets(tarea); return; } /* * Load a room section. */ void load_rooms(AREA_DATA * tarea, FILE * fp) { ROOM_INDEX_DATA *pRoomIndex; char buf[MSL]; char *ln; if (!tarea) { bug("Load_rooms: no #AREA seen yet."); shutdown_mud("No #AREA"); exit(1); } for (;;) { int vnum; char letter; int door; int iHash; bool tmpBootDb; bool oldroom; int x1, x2, x3, x4, x5, x6; letter = fread_letter(fp); if (letter != '#') { bug("Load_rooms: # not found."); if (fBootDb) { shutdown_mud("# not found"); exit(1); } else return; } vnum = fread_number(fp); if (vnum == 0) break; tmpBootDb = fBootDb; fBootDb = FALSE; if (get_room_index(vnum) != NULL) { if (tmpBootDb) { bug("Load_rooms: vnum %d duplicated.", vnum); shutdown_mud("duplicate vnum"); exit(1); } else { pRoomIndex = get_room_index(vnum); sprintf(buf, "Cleaning room: %d", vnum); log_string_plus(buf, LOG_BUILD, sysdata.log_level); clean_room(pRoomIndex); oldroom = TRUE; } } else { oldroom = FALSE; CREATE(pRoomIndex, ROOM_INDEX_DATA, 1); pRoomIndex->first_person = NULL; pRoomIndex->last_person = NULL; pRoomIndex->first_content = NULL; pRoomIndex->last_content = NULL; } fBootDb = tmpBootDb; pRoomIndex->area = tarea; pRoomIndex->vnum = vnum; pRoomIndex->first_extradesc = NULL; pRoomIndex->last_extradesc = NULL; if (fBootDb) { if (!tarea->low_r_vnum) tarea->low_r_vnum = vnum; if (vnum > tarea->hi_r_vnum) tarea->hi_r_vnum = vnum; } pRoomIndex->name = fread_string(fp); pRoomIndex->description = fread_string(fp); /* Area number fread_number( fp ); */ /* ln = fread_line( fp ); x1=x2=x3=x4=x5=x6=0; sscanf( ln, "%d %s %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6 ); pRoomIndex->room_flags = x2; pRoomIndex->sector_type = x3; pRoomIndex->tele_delay = x4; pRoomIndex->tele_vnum = x5; pRoomIndex->tunnel = x6; pRoomIndex->room_flags = fread_bitvector(fp); pRoomIndex->sector_type = fread_number( fp ); pRoomIndex->tele_delay = fread_number( fp ); pRoomIndex->tele_vnum = fread_number( fp ); pRoomIndex->tunnel = fread_number( fp ); */ if (area_version > 15) { pRoomIndex->room_flags = fread_bitvector(fp); ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = 0; sscanf(ln, "%d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6); pRoomIndex->sector_type = x2; pRoomIndex->tele_delay = x3; pRoomIndex->tele_vnum = x4; pRoomIndex->tunnel = x5; pRoomIndex->resource = x6; } else if (area_version > 13 && area_version < 16) { pRoomIndex->room_flags = fread_bitvector(fp); ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = 0; sscanf(ln, "%d %d %d %d %d", &x1, &x2, &x3, &x4, &x5); pRoomIndex->sector_type = x2; pRoomIndex->tele_delay = x3; pRoomIndex->tele_vnum = x4; pRoomIndex->tunnel = x5; } else /* Convert OLD BVs into new xBVs */ { char *oldflag = NULL; char oneflag[MIL]; int newvalue, oldvalue; x1 = x2 = x3 = x4 = x5 = x6 = 0; ln = fread_line(fp); sscanf(ln, "%d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6); oldvalue = x2; pRoomIndex->sector_type = x3; pRoomIndex->tele_delay = x4; pRoomIndex->tele_vnum = x5; pRoomIndex->tunnel = x6; oldflag = flag_string(oldvalue, r_flags); while (oldflag[0] != '\0') { oldflag = one_argument(oldflag, oneflag); newvalue = get_rflag(oneflag); if (newvalue < 0 || newvalue > MAX_BITS) { sprintf(log_buf, "Unknown room flag: %s", oneflag); log_string(log_buf); } else xSET_BIT(pRoomIndex->room_flags, newvalue); } } if (area_version > 16) { pRoomIndex->quad = fread_number(fp); } if (area_version > 37) { pRoomIndex->node_mana = fread_number(fp); } if (pRoomIndex->sector_type < 0 || pRoomIndex->sector_type == SECT_MAX) { bug("Fread_rooms: vnum %d has bad sector_type %d.", vnum, pRoomIndex->sector_type); pRoomIndex->sector_type = 1; } pRoomIndex->light = 0; pRoomIndex->first_exit = NULL; pRoomIndex->last_exit = NULL; for (;;) { letter = fread_letter(fp); if (letter == 'S') break; if (letter == 'D') { EXIT_DATA *pexit; int locks; door = fread_number(fp); if (door < 0 || door > 10) { bug("Fread_rooms: vnum %d has bad door number %d.", vnum, door); if (fBootDb) exit(1); } pexit = make_exit(pRoomIndex, NULL, door); pexit->description = fread_string(fp); pexit->keyword = fread_string(fp); pexit->exit_info = 0; ln = fread_line(fp); x1 = x2 = x3 = x4 = x5 = x6 = 0; sscanf(ln, "%d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6); locks = x1; pexit->key = x2; pexit->vnum = x3; pexit->vdir = door; pexit->distance = x4; pexit->pulltype = x5; pexit->pull = x6; if (area_version >= 19) { ln = fread_line(fp); x1 = x2 = 0; sscanf(ln, "%d %d", &x1, &x2); pexit->coord->x = x1; pexit->coord->y = x2; } switch (locks) { case 1: pexit->exit_info = EX_ISDOOR; break; case 2: pexit->exit_info = EX_ISDOOR | EX_PICKPROOF; break; default: pexit->exit_info = locks; } } else if (letter == 'E') { EXTRA_DESCR_DATA *ed; CREATE(ed, EXTRA_DESCR_DATA, 1); ed->keyword = fread_string(fp); ed->description = fread_string(fp); LINK(ed, pRoomIndex->first_extradesc, pRoomIndex->last_extradesc, next, prev); top_ed++; } else if (letter == 'M') /* maps */ { MAP_DATA *map; MAP_INDEX_DATA *map_index; int i, j; CREATE(map, MAP_DATA, 1); map->vnum = fread_number(fp); map->x = fread_number(fp); map->y = fread_number(fp); map->entry = fread_letter(fp); pRoomIndex->map = map; if ((map_index = get_map_index(map->vnum)) == NULL) { CREATE(map_index, MAP_INDEX_DATA, 1); map_index->vnum = map->vnum; map_index->next = first_map; first_map = map_index; for (i = 0; i < 49; i++) { for (j = 0; j < 79; j++) { map_index->map_of_vnums[i][j] = -1; /* map_index->map_of_ptrs[i][j] = NULL; */ } } } if ((map->y < 0) || (map->y > 48)) { bug("Map y coord out of range. Room %d\n\r", map->y); } if ((map->x < 0) || (map->x > 78)) { bug("Map x coord out of range. Room %d\n\r", map->x); } if ((map->x > 0) && (map->x < 80) && (map->y > 0) && (map->y < 48)) map_index->map_of_vnums[map->y][map->x] = pRoomIndex->vnum; } else if (letter == '>') { ungetc(letter, fp); rprog_read_programs(fp, pRoomIndex); } else { bug("Load_rooms: vnum %d has flag '%c' not 'DES'.", vnum, letter); shutdown_mud("Room flag not DES"); exit(1); } } if (!oldroom) { iHash = vnum % MAX_KEY_HASH; pRoomIndex->next = room_index_hash[iHash]; room_index_hash[iHash] = pRoomIndex; top_room++; } } return; } /* * Load a shop section. */ void load_shops(AREA_DATA * tarea, FILE * fp) { SHOP_DATA *pShop; for (;;) { MOB_INDEX_DATA *pMobIndex; int iTrade; CREATE(pShop, SHOP_DATA, 1); pShop->keeper = fread_number(fp); if (pShop->keeper == 0) { DISPOSE(pShop); break; } for (iTrade = 0; iTrade < MAX_TRADE; iTrade++) pShop->buy_type[iTrade] = fread_number(fp); pShop->profit_buy = fread_number(fp); pShop->profit_sell = fread_number(fp); pShop->profit_buy = URANGE(pShop->profit_sell + 5, pShop->profit_buy, 1000); pShop->profit_sell = URANGE(0, pShop->profit_sell, pShop->profit_buy - 5); pShop->open_hour = fread_number(fp); pShop->close_hour = fread_number(fp); fread_to_eol(fp); pMobIndex = get_mob_index(pShop->keeper); pMobIndex->pShop = pShop; if (!first_shop) first_shop = pShop; else last_shop->next = pShop; pShop->next = NULL; pShop->prev = last_shop; last_shop = pShop; top_shop++; } return; } /* * Load a repair shop section. -Thoric */ void load_repairs(AREA_DATA * tarea, FILE * fp) { REPAIR_DATA *rShop; for (;;) { MOB_INDEX_DATA *pMobIndex; int iFix; CREATE(rShop, REPAIR_DATA, 1); rShop->keeper = fread_number(fp); if (rShop->keeper == 0) { DISPOSE(rShop); break; } for (iFix = 0; iFix < MAX_FIX; iFix++) rShop->fix_type[iFix] = fread_number(fp); rShop->profit_fix = fread_number(fp); rShop->shop_type = fread_number(fp); rShop->open_hour = fread_number(fp); rShop->close_hour = fread_number(fp); fread_to_eol(fp); pMobIndex = get_mob_index(rShop->keeper); pMobIndex->rShop = rShop; if (!first_repair) first_repair = rShop; else last_repair->next = rShop; rShop->next = NULL; rShop->prev = last_repair; last_repair = rShop; top_repair++; } return; } /* * Load spec proc declarations. */ void load_specials(AREA_DATA * tarea, FILE * fp) { for (;;) { MOB_INDEX_DATA *pMobIndex; char letter; switch (letter = fread_letter(fp)) { default: bug("Load_specials: letter '%c' not *MS.", letter); exit(1); case 'S': return; case '*': break; case 'M': pMobIndex = get_mob_index(fread_number(fp)); pMobIndex->spec_fun = spec_lookup(fread_word(fp)); if (pMobIndex->spec_fun == 0) { bug("Load_specials: 'M': vnum %d.", pMobIndex->vnum); exit(1); } break; } fread_to_eol(fp); } } /* * Load soft / hard area ranges. */ void load_ranges(AREA_DATA * tarea, FILE * fp) { int x1, x2, x3, x4, x5, x6, x7, x8, x9; char *ln; if (!tarea) { bug("Load_ranges: no #AREA seen yet."); shutdown_mud("No #AREA"); exit(1); } for (;;) { ln = fread_line(fp); if (ln[0] == '$') break; x1 = x2 = x3 = x4 = x5 = x6 = x7 = x8 = x9 = 0; if (area_version >= 44) { sscanf(ln, "%d %d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9); } if (area_version >= 28) { sscanf(ln, "%d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8); } if (area_version >= 23) { sscanf(ln, "%d %d %d %d %d", &x1, &x2, &x3, &x4, &x5); } else { sscanf(ln, "%d %d %d %d", &x1, &x2, &x3, &x4); } tarea->low_soft_range = x1; tarea->hi_soft_range = x2; tarea->low_hard_range = x3; tarea->hi_hard_range = x4; if (area_version >= 23) { tarea->kingdom = x5; } if (area_version >= 28) { tarea->x = x6; tarea->y = x7; tarea->map = x8; } if (area_version >= 44) tarea->kpid = x9; } return; } /* * Load climate information for the area * Last modified: July 13, 1997 * Fireblade * REMOVED, left here for porting purposes, it just loads the old * numbers and saves as 0 for now -- Xerves */ void load_climate(AREA_DATA * tarea, FILE * fp) { int st1; if (!tarea) { bug("load_climate: no #AREA seen yet"); if (fBootDb) { shutdown_mud("No #AREA"); exit(1); } else return; } st1 = fread_number(fp); st1 = fread_number(fp); st1 = fread_number(fp); return; } /* * Go through all areas, and set up initial economy based on mob * levels and gold */ void initialize_economy(void) { AREA_DATA *tarea; MOB_INDEX_DATA *mob; int idx, gold, rng; for (tarea = first_area; tarea; tarea = tarea->next) { /* skip area if they already got some gold */ if (tarea->high_economy > 0 || tarea->low_economy > 10000) continue; rng = tarea->hi_soft_range - tarea->low_soft_range; if (rng) rng /= 2; else rng = 25; gold = rng * rng * 50000; boost_economy(tarea, gold); for (idx = tarea->low_m_vnum; idx < tarea->hi_m_vnum; idx++) if ((mob = get_mob_index(idx)) != NULL) boost_economy(tarea, mob->gold * 10); } } /* * Translate all room exits from virtual to real. * Has to be done after all rooms are read in. * Check for bad reverse exits. */ void fix_exits(void) { ROOM_INDEX_DATA *pRoomIndex; EXIT_DATA *pexit, *pexit_next, *rev_exit; int iHash; for (iHash = 0; iHash < MAX_KEY_HASH; iHash++) { for (pRoomIndex = room_index_hash[iHash]; pRoomIndex; pRoomIndex = pRoomIndex->next) { bool fexit; fexit = FALSE; for (pexit = pRoomIndex->first_exit; pexit; pexit = pexit_next) { pexit_next = pexit->next; pexit->rvnum = pRoomIndex->vnum; if (pexit->vnum <= 0 || (pexit->to_room = get_room_index(pexit->vnum)) == NULL) { if (fBootDb) boot_log("Fix_exits: room %d, exit %s leads to bad vnum (%d)", pRoomIndex->vnum, dir_name[pexit->vdir], pexit->vnum); bug("Deleting %s exit in room %d", dir_name[pexit->vdir], pRoomIndex->vnum); extract_exit(pRoomIndex, pexit); } else fexit = TRUE; } if (!fexit) xSET_BIT(pRoomIndex->room_flags, ROOM_NO_MOB); } } /* Set all the rexit pointers -Thoric */ for (iHash = 0; iHash < MAX_KEY_HASH; iHash++) { for (pRoomIndex = room_index_hash[iHash]; pRoomIndex; pRoomIndex = pRoomIndex->next) { for (pexit = pRoomIndex->first_exit; pexit; pexit = pexit->next) { if (pexit->to_room && !pexit->rexit) { rev_exit = get_exit_to(pexit->to_room, rev_dir[pexit->vdir], pRoomIndex->vnum); if (rev_exit) { pexit->rexit = rev_exit; rev_exit->rexit = pexit; } } } } } return; } /* * Get diku-compatable exit by number -Thoric */ EXIT_DATA *get_exit_number(ROOM_INDEX_DATA * room, int xit) { EXIT_DATA *pexit; int count; count = 0; for (pexit = room->first_exit; pexit; pexit = pexit->next) if (++count == xit) return pexit; return NULL; } /* * (prelude...) This is going to be fun... NOT! * (conclusion) QSort is f*cked! */ int exit_comp(EXIT_DATA ** xit1, EXIT_DATA ** xit2) { int d1, d2; d1 = (*xit1)->vdir; d2 = (*xit2)->vdir; if (d1 < d2) return -1; if (d1 > d2) return 1; return 0; } void sort_exits(ROOM_INDEX_DATA * room) { EXIT_DATA *pexit; /* *texit *//* Unused */ EXIT_DATA *exits[MAX_REXITS]; int x, nexits; nexits = 0; for (pexit = room->first_exit; pexit; pexit = pexit->next) { exits[nexits++] = pexit; if (nexits > MAX_REXITS) { bug("sort_exits: more than %d exits in room... fatal", nexits); return; } } qsort(&exits[0], nexits, sizeof(EXIT_DATA *), (int (*)(const void *, const void *)) exit_comp); for (x = 0; x < nexits; x++) { if (x > 0) exits[x]->prev = exits[x - 1]; else { exits[x]->prev = NULL; room->first_exit = exits[x]; } if (x >= (nexits - 1)) { exits[x]->next = NULL; room->last_exit = exits[x]; } else exits[x]->next = exits[x + 1]; } } void randomize_exits(ROOM_INDEX_DATA * room, sh_int maxdir) { EXIT_DATA *pexit; int nexits, /* maxd, */ d0, d1, count, door; /* Maxd unused */ int vdirs[MAX_REXITS]; nexits = 0; for (pexit = room->first_exit; pexit; pexit = pexit->next) vdirs[nexits++] = pexit->vdir; for (d0 = 0; d0 < nexits; d0++) { if (vdirs[d0] > maxdir) continue; count = 0; while (vdirs[(d1 = number_range(d0, nexits - 1))] > maxdir || ++count > 5) ; if (vdirs[d1] > maxdir) continue; door = vdirs[d0]; vdirs[d0] = vdirs[d1]; vdirs[d1] = door; } count = 0; for (pexit = room->first_exit; pexit; pexit = pexit->next) pexit->vdir = vdirs[count++]; sort_exits(room); } /* * Repopulate areas periodically. */ void area_update(void) { AREA_DATA *pArea; int vnum; for (pArea = first_area; pArea; pArea = pArea->next) { CHAR_DATA *pch; int reset_age = pArea->reset_frequency ? pArea->reset_frequency : 15; if ((reset_age == -1 && pArea->age == -1) || ++pArea->age < (reset_age - 1)) continue; /* * Check for PC's. */ if (pArea->nplayer > 0 && pArea->age == (reset_age - 1)) { char buf[MSL]; /* Rennard */ if (pArea->resetmsg) sprintf(buf, "%s\n\r", pArea->resetmsg); else strcpy(buf, "You hear some squeaking sounds...\n\r"); for (pch = first_char; pch; pch = pch->next) { if (!IS_NPC(pch) && IS_AWAKE(pch) && pch->in_room && pch->in_room->area == pArea) { set_char_color(AT_RESET, pch); send_to_char(buf, pch); } } } /* * Check age and reset. * Note: Mud Academy resets every 3 minutes (not 15). */ if (pArea->nplayer == 0 || pArea->age >= reset_age) { /* fprintf( stderr, "Resetting: %s\n", pArea->filename ); */ reset_area(pArea, 0); if (reset_age == -1) pArea->age = -1; else pArea->age = number_range(0, reset_age / 5); } for(vnum = pArea->low_r_vnum; vnum <= pArea->hi_r_vnum; vnum++) { CHAR_DATA *pch; ROOM_INDEX_DATA *room; char buf[MSL]; room = get_room_index(vnum); if(room == NULL) { continue; } if(xIS_SET(room->room_flags, ROOM_MANANODE)) { if(pArea->reset_frequency < 6) room->node_mana += 2; if(pArea->reset_frequency >= 6) room->node_mana += (pArea->reset_frequency / 3); fold_area(pArea, pArea->filename, FALSE, 1); if(room->node_mana <= 100) { strcpy(buf, "The air shimmers faintly for a second...\n\r"); } if(room->node_mana > 100 && room->node_mana <= 200) { strcpy(buf, "The air begins to shimmer faintly and does not fade...\n\r"); } if(room->node_mana > 200 && room->node_mana <= 300) { strcpy(buf, "The air shimmers, fades, and then begins to glow with a dim blue light...\n\r"); } if(room->node_mana > 300 && room->node_mana <= 400) { strcpy(buf, "The air shimmers with a dim blue light that seems to be increasing in intensity...\n\r"); } if(room->node_mana > 400 && room->node_mana <= 500) { strcpy(buf, "The air gives off a bright blue light which suddenly focuses into a myriad of tiny bright blue balls that flit around...\n\r"); } if(room->node_mana > 500 && room->node_mana <= 750) { strcpy(buf, "Tiny bolts of blue lightning arc through the air...\n\r"); } if(room->node_mana > 750 && room->node_mana <= 1000) { strcpy(buf, "The air is filled with rather large bolts of blue lightning...\n\r"); } if(room->node_mana > 1000 && room->node_mana <= 2000) { strcpy(buf, "Huge bolts of blue lightning arc slowly through the air...\n\r"); } if(room->node_mana > 2000 && room->node_mana <= 3000) { strcpy(buf, "Huge bolts of blue lightning arc through the air with increasing frequency...\n\r"); } if(room->node_mana > 3000 && room->node_mana <= 4000) { strcpy(buf, "Huge bolts of blue lightning arc through the air every few seconds...\n\r"); } if(room->node_mana > 4000 && room->node_mana <= 5000) { strcpy(buf, "Huge bolts of blue lightning arc contiuously through the air, reflecting off of eachother in all directions...\n\r"); } if(room->node_mana > 5000 && room->node_mana <= 10000) { strcpy(buf, "The air shimmers a deep blue and crackles uncontrollably...\n\r"); } if(room->node_mana > 10000) { strcpy(buf, "Suddenly a sense of power begins to emanate from the very air, and you can feel it throbbing in your ears and against your skin...\n\r"); } for(pch = first_char; pch; pch = pch->next) { if(!IS_NPC(pch) && IS_AWAKE(pch) && pch->in_room == room) { set_char_color(AT_MAGIC, pch); send_to_char(buf, pch); } } } } } return; } /* * Create an instance of a mobile. */ CHAR_DATA *create_mobile(MOB_INDEX_DATA * pMobIndex) { CHAR_DATA *mob; if (!pMobIndex) { bug("Create_mobile: NULL pMobIndex."); exit(1); } CREATE(mob, CHAR_DATA, 1); clear_char(mob); if (!mob->coord) CREATE(mob->coord, COORD_DATA, 1); mob->pIndexData = pMobIndex; mob->editor = NULL; mob->name = QUICKLINK(pMobIndex->player_name); mob->short_descr = QUICKLINK(pMobIndex->short_descr); mob->long_descr = QUICKLINK(pMobIndex->long_descr); mob->description = QUICKLINK(pMobIndex->description); mob->spec_fun = pMobIndex->spec_fun; mob->mpscriptpos = 0; mob->level = 0; mob->con_rarm = 1000; mob->con_larm = 1000; mob->con_rleg = 1000; mob->con_lleg = 1000; /* mob->level = number_fuzzy( pMobIndex->level ); */ mob->act = pMobIndex->act; mob->miflags = pMobIndex->miflags; mob->map = -1; mob->coord->x = -1; mob->coord->y = -1; mob->grip = GRIP_BASH; if (xIS_SET(mob->act, ACT_MOBINVIS)) mob->mobinvis = mob->level; mob->affected_by = pMobIndex->affected_by; mob->alignment = pMobIndex->alignment; mob->sex = pMobIndex->sex; /* * Bug fix from mailing list by stu (sprice@ihug.co.nz) * was: if ( !pMobIndex->ac ) */ if (!pMobIndex->hitnodice) mob->max_hit = 100; else mob->max_hit = pMobIndex->hitnodice * number_range(1, pMobIndex->hitsizedice) + pMobIndex->hitplus; mob->hit = mob->max_hit; mob->max_move = 1000; mob->move = mob->max_move; /* lets put things back the way they used to be! -Thoric */ mob->gold = pMobIndex->gold; mob->position = pMobIndex->position; mob->defposition = pMobIndex->defposition; mob->barenumdie = pMobIndex->damnodice; mob->baresizedie = pMobIndex->damsizedice; mob->armor = pMobIndex->ac; mob->mobthac0 = pMobIndex->mobthac0; mob->hitplus = pMobIndex->hitplus; mob->damplus = pMobIndex->damplus; mob->damaddlow = pMobIndex->damaddlow; mob->damaddhi = pMobIndex->damaddhi; mob->perm_str = pMobIndex->perm_str; mob->perm_dex = pMobIndex->perm_dex; mob->perm_wis = pMobIndex->perm_wis; mob->perm_int = pMobIndex->perm_int; mob->perm_con = pMobIndex->perm_con; mob->perm_cha = pMobIndex->perm_cha; mob->perm_lck = pMobIndex->perm_lck; mob->perm_agi = pMobIndex->perm_agi; /* Create a copy here for now, might be a security hazard though -- Xerves */ mob->m1 = pMobIndex->m1; mob->m2 = pMobIndex->m2; mob->m3 = pMobIndex->m3; mob->m4 = pMobIndex->m4; mob->m5 = pMobIndex->m5; mob->m6 = pMobIndex->m6; mob->m7 = pMobIndex->m7; mob->m8 = pMobIndex->m8; mob->m9 = pMobIndex->m9; mob->m10 = pMobIndex->m10; mob->m11 = pMobIndex->m11; mob->m12 = pMobIndex->m12; mob->apply_res_fire[0] = pMobIndex->apply_res_fire; mob->apply_res_water[0] = pMobIndex->apply_res_water; mob->apply_res_air[0] = pMobIndex->apply_res_air; mob->apply_res_earth[0] = pMobIndex->apply_res_earth; mob->apply_res_energy[0] = pMobIndex->apply_res_energy; mob->apply_res_magic[0] = pMobIndex->apply_res_magic; mob->apply_res_nonmagic[0] = pMobIndex->apply_res_nonmagic; mob->apply_res_blunt[0] = pMobIndex->apply_res_blunt; mob->apply_res_pierce[0] = pMobIndex->apply_res_pierce; mob->apply_res_slash[0] = pMobIndex->apply_res_slash; mob->apply_res_poison[0] = pMobIndex->apply_res_poison; mob->apply_res_paralysis[0] = pMobIndex->apply_res_paralysis; mob->apply_res_holy[0] = pMobIndex->apply_res_holy; mob->apply_res_unholy[0] = pMobIndex->apply_res_unholy; mob->apply_res_undead[0] = pMobIndex->apply_res_undead; mob->tohitbash = pMobIndex->tohitbash; mob->tohitslash = pMobIndex->tohitslash; mob->tohitstab = pMobIndex->tohitstab; mob->cident = pMobIndex->cident; mob->resx = -1; mob->resy = -1; mob->resmap = -1; mob->stx = -1; mob->sty = -1; mob->stmap = -1; mob->hitroll = pMobIndex->hitroll; mob->damroll = pMobIndex->damroll; mob->race = pMobIndex->race; mob->xflags = pMobIndex->xflags; mob->saving_poison_death = pMobIndex->saving_poison_death; mob->saving_wand = pMobIndex->saving_wand; mob->saving_para_petri = pMobIndex->saving_para_petri; mob->saving_breath = pMobIndex->saving_breath; mob->saving_spell_staff = pMobIndex->saving_spell_staff; mob->height = pMobIndex->height; mob->weight = pMobIndex->weight; mob->resistant = pMobIndex->resistant; mob->immune = pMobIndex->immune; mob->susceptible = pMobIndex->susceptible; mob->attacks = pMobIndex->attacks; mob->defenses = pMobIndex->defenses; mob->speaks = pMobIndex->speaks; mob->speaking = pMobIndex->speaking; if (mob->apply_res_fire[0] == 0 && mob->apply_res_water[0] && mob->apply_res_air[0] == 0 && mob->apply_res_earth[0] == 0 && mob->apply_res_energy[0] == 0 && mob->apply_res_magic[0] == 0 && mob->apply_res_nonmagic[0] == 0 && mob->apply_res_blunt[0] == 0 && mob->apply_res_pierce[0] == 0 && mob->apply_res_slash[0] == 0 && mob->apply_res_poison[0] == 0 && mob->apply_res_paralysis[0] == 0 && mob->apply_res_holy[0] == 0 && mob->apply_res_unholy[0] == 0 && mob->apply_res_undead[0] == 0) { mob->apply_res_fire[0] = 100; mob->apply_res_water[0] = 100; mob->apply_res_air[0] = 100; mob->apply_res_earth[0] = 100; mob->apply_res_energy[0] = 100; mob->apply_res_magic[0] = 100; mob->apply_res_nonmagic[0] = 100; mob->apply_res_blunt[0] = 100; mob->apply_res_pierce[0] = 100; mob->apply_res_slash[0] = 100; mob->apply_res_poison[0] = 100; mob->apply_res_paralysis[0] = 100; mob->apply_res_holy[0] = 100; mob->apply_res_unholy[0] = 100; mob->apply_res_undead[0] = 100; } /* * Perhaps add this to the index later --Shaddai */ xCLEAR_BITS(mob->no_affected_by); mob->no_resistant = 0; mob->no_immune = 0; mob->no_susceptible = 0; /* * Insert in list. */ add_char(mob); pMobIndex->count++; nummobsloaded++; serialmobsloaded++; mob->serial = serialmobsloaded; serial_list[mob->serial] = TRUE; if ((serialmobsloaded * 100 / MAX_LOADED_MOBS) >= 90) bug("Serialmobsloaded has reached %d, which is over 90 percent of the total of %d", serialmobsloaded, MAX_LOADED_MOBS); if (serialmobsloaded == MAX_LOADED_MOBS) { bug("Serialmobsloaded has reached the maximum value allowed, would suggest increasing MAX_LOADED_MOBS, till then, shutting down the mud!!!!"); exit(1); } return mob; } /* * Create an instance of an object. */ OBJ_DATA *create_object(OBJ_INDEX_DATA * pObjIndex, int level) { OBJ_DATA *obj; if (!pObjIndex) { bug("Create_object: NULL pObjIndex."); exit(1); } CREATE(obj, OBJ_DATA, 1); obj->pIndexData = pObjIndex; obj->in_room = NULL; obj->level = level; obj->wear_loc = -1; obj->count = 1; cur_obj_serial = UMAX((cur_obj_serial + 1) & (BV30 - 1), 1); obj->serial = obj->pIndexData->serial = cur_obj_serial; obj->name = QUICKLINK(pObjIndex->name); obj->short_descr = QUICKLINK(pObjIndex->short_descr); obj->description = QUICKLINK(pObjIndex->description); obj->action_desc = QUICKLINK(pObjIndex->action_desc); obj->item_type = pObjIndex->item_type; obj->extra_flags = pObjIndex->extra_flags; obj->wear_flags = pObjIndex->wear_flags; obj->value[0] = pObjIndex->value[0]; obj->value[1] = pObjIndex->value[1]; obj->value[2] = pObjIndex->value[2]; obj->value[3] = pObjIndex->value[3]; obj->value[4] = pObjIndex->value[4]; obj->value[5] = pObjIndex->value[5]; obj->value[6] = pObjIndex->value[6]; obj->value[7] = pObjIndex->value[7]; obj->value[8] = pObjIndex->value[8]; obj->value[9] = pObjIndex->value[9]; obj->value[10] = pObjIndex->value[10]; obj->value[11] = pObjIndex->value[11]; obj->value[12] = pObjIndex->value[12]; obj->value[13] = pObjIndex->value[13]; obj->weight = pObjIndex->weight; obj->cost = pObjIndex->cost; CREATE(obj->coord, COORD_DATA, 1); obj->coord->x = -1; obj->coord->y = -1; obj->map = -1; obj->cvnum = pObjIndex->cvnum; obj->cident = pObjIndex->cident; obj->sworthrestrict = pObjIndex->sworthrestrict; obj->imbueslots = pObjIndex->imbueslots; /* obj->cost = number_fuzzy( 10 ) * number_fuzzy( level ) * number_fuzzy( level ); */ /* * Mess with object properties. */ switch (obj->item_type) { default: bug("Read_object: vnum %d bad type.", pObjIndex->vnum); bug("------------------------> ", obj->item_type); break; case ITEM_LIGHT: case ITEM_TREASURE: case ITEM_FURNITURE: case ITEM_TRASH: case ITEM_CONTAINER: case ITEM_DRINK_CON: case ITEM_KEY: case ITEM_KEYRING: case ITEM_ODOR: case ITEM_HOLDRESOURCE: case ITEM_EXTRACTOBJ: case ITEM_SPELLBOOK: case ITEM_SHEATH: break; case ITEM_COOK: case ITEM_FOOD: /* * optional food condition (rotting food) -Thoric * value1 is the max condition of the food * value4 is the optional initial condition */ if (obj->value[4]) obj->timer = obj->value[4]; else obj->timer = obj->value[1]; break; case ITEM_BOAT: case ITEM_NOTEBOARD: case ITEM_CORPSE_NPC: case ITEM_CORPSE_PC: case ITEM_FOUNTAIN: case ITEM_BLOOD: case ITEM_BLOODSTAIN: case ITEM_SCRAPS: case ITEM_PIPE: case ITEM_HERB_CON: case ITEM_HERB: case ITEM_INCENSE: case ITEM_FIRE: case ITEM_BOOK: case ITEM_SWITCH: case ITEM_LEVER: case ITEM_PULLCHAIN: case ITEM_BUTTON: case ITEM_DIAL: case ITEM_RUNE: case ITEM_RUNEPOUCH: case ITEM_MATCH: case ITEM_TRAP: case ITEM_MAP: case ITEM_PORTAL: case ITEM_PAPER: case ITEM_PEN: case ITEM_TINDER: case ITEM_LOCKPICK: case ITEM_SPIKE: case ITEM_DISEASE: case ITEM_OIL: case ITEM_FUEL: case ITEM_QUIVER: case ITEM_PILL: case ITEM_SHOVEL: case ITEM_WAND: case ITEM_STAFF: case ITEM_MOUNTFOOD: case ITEM_ARMOR: case ITEM_REPAIR: case ITEM_MCLIMB: case ITEM_GAG: case ITEM_QTOKEN: case ITEM_FLINT: case ITEM_TRAPTOOL: case ITEM_TGEM: break; case ITEM_SCROLL: obj->value[0] = number_fuzzy(obj->value[0]); break; case ITEM_WEAPON: case ITEM_MISSILE_WEAPON: if (!obj->value[1] || !obj->value[2]) { obj->value[1] = 1; obj->value[2] = 2; } if (obj->value[0] == 0) obj->value[0] = INIT_ARMOR_CONDITION; if (obj->wear_loc > WEAR_NOCKED) obj->wear_loc = WEAR_NONE; break; case ITEM_PROJECTILE: if (!obj->value[1] || !obj->value[2]) { obj->value[1] = 1; obj->value[2] = 2; } if (obj->value[0] == 0) obj->value[0] = INIT_ARMOR_CONDITION; break; case ITEM_POTION: obj->value[0] = number_fuzzy(number_fuzzy(obj->value[0])); break; case ITEM_MONEY: obj->value[0] = obj->cost; if (obj->value[0] == 0) obj->value[0] = 1; break; } LINK(obj, first_object, last_object, next, prev); ++pObjIndex->count; ++numobjsloaded; ++physicalobjects; return obj; } /* * Clear a new character. */ void clear_char(CHAR_DATA * ch) { ch->editor = NULL; ch->hunting = NULL; ch->fearing = NULL; ch->hating = NULL; ch->name = NULL; ch->short_descr = NULL; ch->long_descr = NULL; ch->description = NULL; ch->tone = NULL; ch->movement = NULL; ch->next = NULL; ch->prev = NULL; ch->reply = NULL; ch->retell = NULL; ch->first_carrying = NULL; ch->last_carrying = NULL; ch->next_in_room = NULL; ch->prev_in_room = NULL; ch->fighting = NULL; ch->switched = NULL; ch->first_affect = NULL; ch->last_affect = NULL; ch->prev_cmd = NULL; /* maps */ ch->last_cmd = NULL; ch->dest_buf = NULL; ch->alloc_ptr = NULL; ch->spare_ptr = NULL; ch->mount = NULL; ch->morph = NULL; xCLEAR_BITS(ch->affected_by); ch->armor = 0; ch->position = POS_STANDING; ch->practice = 0; ch->hit = 20; ch->max_hit = 20; ch->mana = 100; ch->max_mana = 100; ch->move = 1000; ch->max_move = 1000; ch->height = 72; ch->weight = 180; ch->xflags = 0; ch->race = 0; ch->speaking = LANG_COMMON; ch->speaks = LANG_COMMON; ch->barenumdie = 1; ch->baresizedie = 4; ch->substate = 0; ch->tempnum = 0; ch->perm_str = 13; ch->perm_dex = 13; ch->perm_int = 13; ch->perm_wis = 13; ch->perm_cha = 13; ch->perm_con = 13; ch->perm_lck = 13; ch->perm_agi = 15; ch->apply_res_fire[0] = 100; ch->apply_res_water[0] = 100; ch->apply_res_air[0] = 100; ch->apply_res_earth[0] = 100; ch->apply_res_energy[0] = 100; ch->apply_res_magic[0] = 100; ch->apply_res_nonmagic[0] = 100; ch->apply_res_blunt[0] = 100; ch->apply_res_pierce[0] = 100; ch->apply_res_slash[0] = 100; ch->apply_res_poison[0] = 100; ch->apply_res_paralysis[0] = 100; ch->apply_res_holy[0] = 100; ch->apply_res_unholy[0] = 100; ch->apply_res_undead[0] = 100; ch->apply_res_fire[1] = 100; ch->apply_res_water[1] = 100; ch->apply_res_air[1] = 100; ch->apply_res_earth[1] = 100; ch->apply_res_energy[1] = 100; ch->apply_res_magic[1] = 100; ch->apply_res_nonmagic[1] = 100; ch->apply_res_blunt[1] = 100; ch->apply_res_pierce[1] = 100; ch->apply_res_slash[1] = 100; ch->apply_res_poison[1] = 100; ch->apply_res_paralysis[1] = 100; ch->apply_res_holy[1] = 100; ch->apply_res_unholy[1] = 100; ch->apply_res_undead[1] = 100; ch->apply_res_fire[2] = 100; ch->apply_res_water[2] = 100; ch->apply_res_air[2] = 100; ch->apply_res_earth[2] = 100; ch->apply_res_energy[2] = 100; ch->apply_res_magic[2] = 100; ch->apply_res_nonmagic[2] = 100; ch->apply_res_blunt[2] = 100; ch->apply_res_pierce[2] = 100; ch->apply_res_slash[2] = 100; ch->apply_res_poison[2] = 100; ch->apply_res_paralysis[2] = 100; ch->apply_res_holy[2] = 100; ch->apply_res_unholy[2] = 100; ch->apply_res_undead[2] = 100; ch->mod_str = 0; ch->mod_dex = 0; ch->mod_int = 0; ch->mod_wis = 0; ch->mod_cha = 0; ch->mod_con = 0; ch->mod_lck = 0; ch->mod_agi = 0; ch->mover = 0; CREATE(ch->coord, COORD_DATA, 1); /* Overland Map - Samson 7-31-99 */ ch->coord->x = -1; ch->coord->y = -1; ch->map = -1; return; } void free_runbuf(DESCRIPTOR_DATA * d) { if (d && d->run_buf) { DISPOSE(d->run_buf); d->run_buf = NULL; d->run_head = NULL; } return; } /* * Free a character. */ void free_char(CHAR_DATA * ch) { OBJ_DATA *obj; AFFECT_DATA *paf; TIMER *timer; MPROG_ACT_LIST *mpact, *mpact_next; NOTE_DATA *comments, *comments_next; AGGRO_DATA *aggro; AGGRO_DATA *naggro; if (!ch) { bug("Free_char: null ch!"); return; } if (ch->desc) bug("Free_char: char still has descriptor."); if (ch->morph) free_char_morph(ch->morph); while ((obj = ch->last_carrying) != NULL) extract_obj(obj); while ((paf = ch->last_affect) != NULL) affect_remove(ch, paf); while ((timer = ch->first_timer) != NULL) extract_timer(ch, timer); if (ch->editor) stop_editing(ch); STRFREE(ch->name); STRFREE(ch->short_descr); STRFREE(ch->long_descr); STRFREE(ch->description); if (ch->movement) STRFREE(ch->movement); if (ch->tone) STRFREE(ch->tone); stop_hunting(ch); stop_hating(ch); stop_fearing(ch); free_fight(ch); for (aggro = ch->first_aggro; aggro; aggro = naggro) { naggro = aggro->next; UNLINK(aggro, first_global_aggro, last_global_aggro, next_global, prev_global); UNLINK(aggro, ch->first_aggro, ch->last_aggro, next, prev); DISPOSE(aggro); } if (ch->pnote) free_note(ch->pnote); if (ch->coord) DISPOSE(ch->coord); if (ch->midata) { STRFREE(ch->midata->command); DISPOSE(ch->midata); } if (ch->pcdata) { IGNORE_DATA *temp, *next; /* free up memory allocated to stored ignored names */ for (temp = ch->pcdata->first_ignored; temp; temp = next) { next = temp->next; UNLINK(temp, ch->pcdata->first_ignored, ch->pcdata->last_ignored, next, prev); STRFREE(temp->name); DISPOSE(temp); } STRFREE(ch->pcdata->filename); STRFREE(ch->pcdata->deity_name); STRFREE(ch->pcdata->clan_name); STRFREE(ch->pcdata->council_name); if (ch->pcdata->pwd) DISPOSE(ch->pcdata->pwd); /* no hash */ if (ch->pcdata->autocommand) STRFREE(ch->pcdata->autocommand); DISPOSE(ch->pcdata->bamfin); /* no hash */ DISPOSE(ch->pcdata->bamfout); /* no hash */ DISPOSE(ch->pcdata->rank); STRFREE(ch->pcdata->title); if (ch->pcdata->bio) STRFREE(ch->pcdata->bio); if (ch->pcdata->rreply) DISPOSE(ch->pcdata->rreply); /* no hash */ if (ch->pcdata->rreply_name) DISPOSE(ch->pcdata->rreply_name); /* no hash */ DISPOSE(ch->pcdata->bestowments); /* no hash */ if (ch->pcdata->homepage) DISPOSE(ch->pcdata->homepage); /* no hash */ if (ch->pcdata->pretit) DISPOSE(ch->pcdata->pretit); /* no hash/Memory Leak -- Xerves */ if (ch->pcdata->email) DISPOSE(ch->pcdata->email); /* no hash */ STRFREE(ch->pcdata->authed_by); STRFREE(ch->pcdata->prompt); STRFREE(ch->pcdata->fprompt); if (ch->pcdata->helled_by) STRFREE(ch->pcdata->helled_by); if (ch->pcdata->subprompt) STRFREE(ch->pcdata->subprompt); free_aliases(ch); if (ch->pcdata->tell_history) { int i; for (i = 0; i < 26; i++) { if (ch->pcdata->tell_history[i]) STRFREE(ch->pcdata->tell_history[i]); } DISPOSE(ch->pcdata->tell_history); } if (ch->pcdata->ice_listen) DISPOSE(ch->pcdata->ice_listen); DISPOSE(ch->pcdata); } for (mpact = ch->mpact; mpact; mpact = mpact_next) { mpact_next = mpact->next; DISPOSE(mpact->buf); DISPOSE(mpact); } for (comments = ch->comments; comments; comments = comments_next) { comments_next = comments->next; STRFREE(comments->text); STRFREE(comments->to_list); STRFREE(comments->subject); STRFREE(comments->sender); STRFREE(comments->date); DISPOSE(comments); } DISPOSE(ch); return; } /* * Get an extra description from a list. */ char *get_extra_descr(const char *name, EXTRA_DESCR_DATA * ed) { for (; ed; ed = ed->next) if (is_name(name, ed->keyword)) return ed->description; return NULL; } /* * Translates mob virtual number to its mob index struct. * Hash table lookup. */ MOB_INDEX_DATA *get_mob_index(sh_int vnum) { MOB_INDEX_DATA *pMobIndex; if (vnum < 0) vnum = 0; for (pMobIndex = mob_index_hash[vnum % MAX_KEY_HASH]; pMobIndex; pMobIndex = pMobIndex->next) if (pMobIndex->vnum == vnum) return pMobIndex; if (fBootDb) bug("Get_mob_index: bad vnum %d.", vnum); return NULL; } /* * Translates obj virtual number to its obj index struct. * Hash table lookup. */ OBJ_INDEX_DATA *get_obj_index(int vnum) { OBJ_INDEX_DATA *pObjIndex; if (vnum < 0) vnum = 0; for (pObjIndex = obj_index_hash[vnum % MAX_KEY_HASH]; pObjIndex; pObjIndex = pObjIndex->next) if (pObjIndex->vnum == vnum) return pObjIndex; if (fBootDb) bug("Get_obj_index: bad vnum %d.", vnum); return NULL; } /* * Translates room virtual number to its room index struct. * Hash table lookup. */ ROOM_INDEX_DATA *get_room_index(int vnum) { ROOM_INDEX_DATA *pRoomIndex; if (vnum < 0) vnum = 0; for (pRoomIndex = room_index_hash[vnum % MAX_KEY_HASH]; pRoomIndex; pRoomIndex = pRoomIndex->next) if (pRoomIndex->vnum == vnum) return pRoomIndex; if (fBootDb) bug("Get_room_index: bad vnum %d.", vnum); return NULL; } /* * Added lots of EOF checks, as most of the file crashes are based on them. * If an area file encounters EOF, the fread_* functions will shutdown the * MUD, as all area files should be read in in full or bad things will * happen during the game. Any files loaded in without fBootDb which * encounter EOF will return what they have read so far. These files * should include player files, and in-progress areas that are not loaded * upon bootup. * -- Altrag */ /* * Read a letter from a file. */ char fread_letter(FILE * fp) { char c; do { if (feof(fp)) { bug("fread_letter: EOF encountered on read.\n\r"); if (fBootDb) exit(1); return '\0'; } c = getc(fp); } while (isspace(c)); return c; } /* * Read a number from a file. */ int fread_number(FILE * fp) { int number; bool sign; char c; do { if (feof(fp)) { bug("fread_number: EOF encountered on read.\n\r"); if (fBootDb) exit(1); return 0; } c = getc(fp); } while (isspace(c)); number = 0; sign = FALSE; if (c == '+') { c = getc(fp); } else if (c == '-') { sign = TRUE; c = getc(fp); } if (!isdigit(c)) { bug("Fread_number: bad format. (%c)", c); if (fBootDb) exit(1); return 0; } while (isdigit(c)) { if (feof(fp)) { bug("fread_number: EOF encountered on read.\n\r"); if (fBootDb) exit(1); return number; } number = number * 10 + c - '0'; c = getc(fp); } if (sign) number = 0 - number; if (c == '|') number += fread_number(fp); else if (c != ' ') ungetc(c, fp); return number; } /* * Read a float from a file. */ float fread_float(FILE * fp) { float number; bool sign; char c; char buf[MSL]; int x = 0; do { if (feof(fp)) { bug("fread_number: EOF encountered on read.\n\r"); if (fBootDb) exit(1); return 0; } c = getc(fp); } while (isspace(c)); number = 0; sign = FALSE; if (c == '+') { c = getc(fp); } else if (c == '-') { sign = TRUE; c = getc(fp); } if (!isdigit(c) && c != '.') { bug("Fread_number: bad format. (%c)", c); if (fBootDb) exit(1); return 0; } while (isdigit(c) || c == '.') { if (feof(fp)) { bug("fread_number: EOF encountered on read.\n\r"); if (fBootDb) exit(1); return number; } buf[x++] = c; c = getc(fp); } buf[x] = '\0'; number = atof(buf); if (sign) number = 0 - number; if (c == '|') number += fread_float(fp); else if (c != ' ') ungetc(c, fp); return number; } /* * custom str_dup using create -Thoric */ #ifdef MTRACE char *_str_dup( const char *str, char *file_n, char *funct_n, int line_n ) #else char *str_dup(char const *str) #endif { static char *ret; int len; #ifdef MTRACE FILE *fp; #endif if (!str) return NULL; len = strlen(str) + 1; CREATE(ret, char, len); strcpy(ret, str); #ifdef MTRACE fp = fopen( "str_dup.log", "a" ); fprintf( fp, "%p:%s:%s:%d: %s\n",ret, file_n, funct_n, line_n, ret ); fclose( fp ); #endif return ret; } /* * Read a string from file fp */ char *fread_string(FILE * fp) { char buf[MSL]; char *plast; char c; int ln; plast = buf; buf[0] = '\0'; ln = 0; /* * Skip blanks. * Read first char. */ do { if (feof(fp)) { bug("fread_string: EOF encountered on read.\n\r"); if (fBootDb) exit(1); return STRALLOC(""); } c = getc(fp); } while (isspace(c)); if ((*plast++ = c) == '~') return STRALLOC(""); for (;;) { if (ln >= (MSL - 1)) { bug("fread_string: string too long"); *plast = '\0'; return STRALLOC(buf); } switch (*plast = getc(fp)) { default: plast++; ln++; break; case EOF: bug("Fread_string: EOF"); if (fBootDb) exit(1); *plast = '\0'; return STRALLOC(buf); break; case '\n': plast++; ln++; *plast++ = '\r'; ln++; break; case '\r': break; case '~': *plast = '\0'; return STRALLOC(buf); } } } /* * Read a string from file fp using str_dup (ie: no string hashing) */ char *fread_string_nohash(FILE * fp) { char buf[MSL]; char *plast; char c; int ln; plast = buf; buf[0] = '\0'; ln = 0; /* * Skip blanks. * Read first char. */ do { if (feof(fp)) { bug("fread_string_no_hash: EOF encountered on read.\n\r"); if (fBootDb) exit(1); return str_dup(""); } c = getc(fp); } while (isspace(c)); if ((*plast++ = c) == '~') return str_dup(""); for (;;) { if (ln >= (MSL - 1)) { bug("fread_string_no_hash: string too long"); *plast = '\0'; return str_dup(buf); } switch (*plast = getc(fp)) { default: plast++; ln++; break; case EOF: bug("Fread_string_no_hash: EOF"); if (fBootDb) exit(1); *plast = '\0'; return str_dup(buf); break; case '\n': plast++; ln++; *plast++ = '\r'; ln++; break; case '\r': break; case '~': *plast = '\0'; return str_dup(buf); } } } /* * Read to end of line (for comments). */ void fread_to_eol(FILE * fp) { char c; do { if (feof(fp)) { bug("fread_to_eol: EOF encountered on read.\n\r"); if (fBootDb) exit(1); return; } c = getc(fp); } while (c != '\n' && c != '\r'); do { c = getc(fp); } while (c == '\n' || c == '\r'); ungetc(c, fp); return; } /* * Read to end of line into static buffer -Thoric */ char *fread_line(FILE * fp) { static char line[MSL]; char *pline; char c; int ln; pline = line; line[0] = '\0'; ln = 0; /* * Skip blanks. * Read first char. */ do { if (feof(fp)) { bug("fread_line: EOF encountered on read.\n\r"); if (fBootDb) exit(1); strcpy(line, ""); return line; } c = getc(fp); } while (isspace(c)); ungetc(c, fp); do { if (feof(fp)) { bug("fread_line: EOF encountered on read.\n\r"); if (fBootDb) exit(1); *pline = '\0'; return line; } c = getc(fp); *pline++ = c; ln++; if (ln >= (MSL - 1)) { bug("fread_line: line too long"); break; } } while (c != '\n' && c != '\r'); do { c = getc(fp); } while (c == '\n' || c == '\r'); ungetc(c, fp); *pline = '\0'; return line; } /* * Read one word (into static buffer). */ char *fread_word(FILE * fp) { static char word[MIL]; char *pword; char cEnd; do { if (feof(fp)) { bug("fread_word: EOF encountered on read.\n\r"); if (fBootDb) exit(1); word[0] = '\0'; return word; } cEnd = getc(fp); } while (isspace(cEnd)); if (cEnd == '\'' || cEnd == '"') { pword = word; } else { word[0] = cEnd; pword = word + 1; cEnd = ' '; } for (; pword < word + MIL; pword++) { if (feof(fp)) { bug("fread_word: EOF encountered on read.\n\r"); if (fBootDb) exit(1); *pword = '\0'; return word; } *pword = getc(fp); if (cEnd == ' ' ? isspace(*pword) : *pword == cEnd) { if (cEnd == ' ') ungetc(*pword, fp); *pword = '\0'; return word; } } bug("Fread_word: word too long"); exit(1); return NULL; } void do_memory(CHAR_DATA * ch, char *argument) { char arg[MIL]; int hash; set_char_color(AT_PLAIN, ch); argument = one_argument(argument, arg); send_to_char_color("\n\r&wSystem Memory [arguments - hash, check, showhigh]\n\r", ch); ch_printf_color(ch, "&wAffects: &W%5d\t\t\t&wAreas: &W%5d\n\r", top_affect, top_area); ch_printf_color(ch, "&wExtDes: &W%5d\t\t\t&wExits: &W%5d\n\r", top_ed, top_exit); ch_printf_color(ch, "&wHelps: &W%5d\t\t\t&wResets: &W%5d\n\r", top_help, top_reset); ch_printf_color(ch, "&wIdxMobs: &W%5d\t\t\t&wMobiles: &W%5d\n\r", top_mob_index, nummobsloaded); ch_printf_color(ch, "&wIdxObjs: &W%5d\t\t\t&wObjs: &W%5d(%d)\n\r", top_obj_index, numobjsloaded, physicalobjects); ch_printf_color(ch, "&wRooms: &W%5d\t\t\t&wVRooms: &W%5d\n\r", top_room, top_vroom); ch_printf_color(ch, "&wShops: &W%5d\t\t\t&wRepShps: &W%5d\n\r", top_shop, top_repair); ch_printf_color(ch, "&wCurOq's: &W%5d\t\t\t&wCurCq's: &W%5d\n\r", cur_qobjs, cur_qchars); ch_printf_color(ch, "&wPlayers: &W%5d\t\t\t&wMaxplrs: &W%5d\n\r", num_descriptors, sysdata.maxplayers); ch_printf_color(ch, "&wMaxEver: &W%5d\t\t\t&wTopsn: &W%5d(%d)\n\r", sysdata.alltimemax, top_sn, MAX_SKILL); ch_printf_color(ch, "&wMaxEver was recorded on: &W%s\n\r\n\r", sysdata.time_of_max); ch_printf_color(ch, "&wPotion Val: &W%-16d &wScribe/Brew: &W%d/%d\n\r", sysdata.upotion_val, sysdata.scribed_used, sysdata.brewed_used); ch_printf_color(ch, "&wPill Val: &W%-16d &wGlobal loot: &W%d\n\r", sysdata.upill_val, sysdata.global_looted); ch_printf_color(ch, "&wMap Mobiles: &G%-16d &wSerialCnt: &W%d\n\r", top_map_mob, serialmobsloaded); ch_printf_color(ch, "&WTrans X : &W%-3d &wTrans Y : &W%-3d\n\r", global_x[0], global_y[0]); if (!str_cmp(arg, "check")) { #ifdef HASHSTR send_to_char(check_hash(argument), ch); #else send_to_char("Hash strings not enabled.\n\r", ch); #endif return; } if (!str_cmp(arg, "showhigh")) { #ifdef HASHSTR show_high_hash(atoi(argument)); #else send_to_char("Hash strings not enabled.\n\r", ch); #endif return; } if (argument[0] != '\0') hash = atoi(argument); else hash = -1; if (!str_cmp(arg, "hash")) { #ifdef HASHSTR ch_printf(ch, "Hash statistics:\n\r%s", hash_stats()); if (hash != -1) hash_dump(hash); #else send_to_char("Hash strings not enabled.\n\r", ch); #endif } return; } /* * Stick a little fuzz on a number. */ int number_fuzzy(int number) { switch (number_bits(2)) { case 0: number -= 1; break; case 3: number += 1; break; } return UMAX(1, number); } /* * Generate a random number. */ int number_range(int from, int to) { if ((to - from) < 1) return from; return ((number_mm() % (to - from + 1)) + from); } sh_int snumber_range(sh_int from, sh_int to) { if ((to - from) < 1) return from; return ((snumber_mm() % (to - from + 1)) + from); } /* * Generate a percentile roll. */ int number_percent(void) { /* int percent; while ( ( percent = number_mm( ) & (128-1) ) > 99 ) ; return 1 + percent;*/ return (number_mm() % 100) + 1; } /* * Generate a random door. */ int number_door(void) { int door; while ((door = number_mm() & (16 - 1)) > 9) ; return door; /* return number_mm() & 10; */ } int number_bits(int width) { return number_mm() & ((1 << width) - 1); } /* * I've gotten too many bad reports on OS-supplied random number generators. * This is the Mitchell-Moore algorithm from Knuth Volume II. * Best to leave the constants alone unless you've read Knuth. * -- Furey */ static int rgiState[2 + 55]; void init_mm() { int *piState; int iState; piState = &rgiState[2]; piState[-2] = 55 - 55; piState[-1] = 55 - 24; piState[0] = ((int) current_time) & ((1 << 30) - 1); piState[1] = 1; for (iState = 2; iState < 55; iState++) { piState[iState] = (piState[iState - 1] + piState[iState - 2]) & ((1 << 30) - 1); } return; } int number_mm(void) { int *piState; int iState1; int iState2; int iRand; piState = &rgiState[2]; iState1 = piState[-2]; iState2 = piState[-1]; iRand = (piState[iState1] + piState[iState2]) & ((1 << 30) - 1); piState[iState1] = iRand; if (++iState1 == 55) iState1 = 0; if (++iState2 == 55) iState2 = 0; piState[-2] = iState1; piState[-1] = iState2; return iRand >> 6; } sh_int snumber_mm(void) { int *piState; sh_int iState1; sh_int iState2; sh_int iRand; piState = &rgiState[2]; iState1 = piState[-2]; iState2 = piState[-1]; iRand = (piState[iState1] + piState[iState2]) & ((1 << 30) - 1); piState[iState1] = iRand; if (++iState1 == 55) iState1 = 0; if (++iState2 == 55) iState2 = 0; piState[-2] = iState1; piState[-1] = iState2; return iRand >> 6; } /* * Roll some dice. -Thoric */ int dice(int number, int size) { int idice; int sum; switch (size) { case 0: return 0; case 1: return number; } for (idice = 0, sum = 0; idice < number; idice++) sum += number_range(1, size); return sum; } /* * Same thing as dice, but use sh_int format */ sh_int sdice(sh_int number, sh_int size) { sh_int idice; sh_int sum; switch (size) { case 0: return 0; case 1: return number; } for (idice = 0, sum = 0; idice < number; idice++) sum += snumber_range(1, size); return sum; } /* * Simple linear interpolation. */ int interpolate(int level, int value_00, int value_32) { return value_00 + level * (value_32 - value_00) / 32; } /* * Removes the tildes from a string. * Used for player-entered strings that go into disk files. */ void smash_tilde(char *str) { for (; *str != '\0'; str++) if (*str == '~') *str = '-'; return; } /* * Encodes the tildes in a string. -Thoric * Used for player-entered strings that go into disk files. */ void hide_tilde(char *str) { for (; *str != '\0'; str++) if (*str == '~') *str = HIDDEN_TILDE; return; } char *show_tilde(char *str) { static char buf[MSL]; char *bufptr; bufptr = buf; for (; *str != '\0'; str++, bufptr++) { if (*str == HIDDEN_TILDE) *bufptr = '~'; else *bufptr = *str; } *bufptr = '\0'; return buf; } /* * Compare strings, case insensitive. * Return TRUE if different * (compatibility with historical functions). */ bool str_cmp(const char *astr, const char *bstr) { if (!astr) { //bug("Str_cmp: null astr."); if (bstr) fprintf(stderr, "str_cmp: astr: (null) bstr: %s\n", bstr); return TRUE; } if (!bstr) { //bug("Str_cmp: null bstr."); if (astr) fprintf(stderr, "str_cmp: astr: %s bstr: (null)\n", astr); return TRUE; } for (; *astr || *bstr; astr++, bstr++) { if (LOWER(*astr) != LOWER(*bstr)) return TRUE; } return FALSE; } /* * Compare strings, case insensitive, for prefix matching. * Return TRUE if astr not a prefix of bstr * (compatibility with historical functions). */ bool str_prefix(const char *astr, const char *bstr) { if (!astr) { //bug("Strn_cmp: null astr."); return TRUE; } if (!bstr) { //bug("Strn_cmp: null bstr."); return TRUE; } for (; *astr; astr++, bstr++) { if (LOWER(*astr) != LOWER(*bstr)) return TRUE; } return FALSE; } /* * Compare strings, case insensitive, for match anywhere. * Returns TRUE is astr not part of bstr. * (compatibility with historical functions). */ bool str_infix(const char *astr, const char *bstr) { int sstr1; int sstr2; int ichar; char c0; if ((c0 = LOWER(astr[0])) == '\0') return FALSE; sstr1 = strlen(astr); sstr2 = strlen(bstr); for (ichar = 0; ichar <= sstr2 - sstr1; ichar++) if (c0 == LOWER(bstr[ichar]) && !str_prefix(astr, bstr + ichar)) return FALSE; return TRUE; } /* * Compare strings, case insensitive, for suffix matching. * Return TRUE if astr not a suffix of bstr * (compatibility with historical functions). */ bool str_suffix(const char *astr, const char *bstr) { int sstr1; int sstr2; sstr1 = strlen(astr); sstr2 = strlen(bstr); if (sstr1 <= sstr2 && !str_cmp(astr, bstr + sstr2 - sstr1)) return FALSE; else return TRUE; } /* * Returns an initial-capped string. */ char *capitalize(const char *str) { static char strcap[MSL]; int i; for (i = 0; str[i] != '\0'; i++) strcap[i] = LOWER(str[i]); strcap[i] = '\0'; strcap[0] = UPPER(strcap[0]); return strcap; } /* * Returns a lowercase string. */ char *strlower(const char *str) { static char strlow[MSL]; int i; for (i = 0; str[i] != '\0'; i++) strlow[i] = LOWER(str[i]); strlow[i] = '\0'; return strlow; } /* * Returns an uppercase string. */ char *strupper(const char *str) { static char strup[MSL]; int i; for (i = 0; str[i] != '\0'; i++) strup[i] = UPPER(str[i]); strup[i] = '\0'; return strup; } /* * Returns TRUE or FALSE if a letter is a vowel -Thoric */ bool isavowel(char letter) { char c; c = LOWER(letter); if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') return TRUE; else return FALSE; } /* * Shove either "a " or "an " onto the beginning of a string -Thoric */ char *aoran(const char *str) { static char temp[MSL]; if (!str) { bug("Aoran(): NULL str"); return ""; } if (isavowel(str[0]) || (strlen(str) > 1 && LOWER(str[0]) == 'y' && !isavowel(str[1]))) strcpy(temp, "an "); else strcpy(temp, "a "); strcat(temp, str); return temp; } /* * Append a string to a file. */ void append_file(CHAR_DATA * ch, char *file, char *str) { FILE *fp; if (IS_NPC(ch) || str[0] == '\0') return; fclose(fpLOG); if ((fp = fopen(file, "a")) == NULL) { perror(file); send_to_char("Could not open the file!\n\r", ch); } else { fprintf(fp, "[%5d] %s: %s\n", ch->in_room ? ch->in_room->vnum : 0, ch->name, str); fclose(fp); } fpLOG = fopen(NULL_FILE, "r"); return; } /* * Append a string to a file. */ void append_to_file(char *file, char *str) { FILE *fp; if ((fp = fopen(file, "a")) == NULL) perror(file); else { fprintf(fp, "%s\n", str); fclose(fp); } return; } /* * Reports a bug. */ void bug( const char *str, ... ) { char buf[MSL]; FILE *fp; struct stat fst; if ( fpArea != NULL ) { int iLine; int iChar; if ( fpArea == stdin ) { iLine = 0; } else { iChar = ftell( fpArea ); fseek( fpArea, 0, 0 ); for ( iLine = 0; ftell( fpArea ) < iChar; iLine++ ) { while ( getc( fpArea ) != '\n' ) ; } fseek( fpArea, iChar, 0 ); } sprintf( buf, "[*****] FILE: %s LINE: %d", strArea, iLine ); log_string( buf ); if ( stat( SHUTDOWN_FILE, &fst ) != -1 ) /* file exists */ { if ( ( fp = fopen( SHUTDOWN_FILE, "a" ) ) != NULL ) { fprintf( fp, "[*****] %s\n", buf ); fclose( fp ); } } } strcpy( buf, "[*****] BUG: " ); { va_list param; va_start(param, str); vsprintf( buf + strlen(buf), str, param ); va_end(param); } log_string( buf ); fclose( fpLOG ); /*if ( ( fp = fopen( BUG_FILE, "a" ) ) != NULL ) { fprintf( fp, "%s\n", buf ); fclose( fp ); }*/ fpLOG = fopen( NULL_FILE, "r" ); return; } /* * Add a string to the boot-up log -Thoric */ void boot_log(const char *str, ...) { char buf[MSL]; FILE *fp; va_list param; strcpy(buf, "[*****] BOOT: "); va_start(param, str); vsprintf(buf + strlen(buf), str, param); va_end(param); log_string(buf); fclose(fpLOG); if ((fp = fopen(BOOTLOG_FILE, "a")) != NULL) { fprintf(fp, "%s\n", buf); fclose(fp); } fpLOG = fopen(NULL_FILE, "r"); return; } /* * Dump a text file to a player, a line at a time -Thoric */ void show_file(CHAR_DATA * ch, char *filename) { FILE *fp; char buf[MSL]; int c; int num = 0; fclose(fpReserve); if ((fp = fopen(filename, "r")) != NULL) { while (!feof(fp)) { while ((buf[num] = fgetc(fp)) != EOF && buf[num] != '\n' && buf[num] != '\r' && num < (MSL - 2)) num++; c = fgetc(fp); if ((c != '\n' && c != '\r') || c == buf[num]) ungetc(c, fp); buf[num++] = '\n'; buf[num++] = '\r'; buf[num] = '\0'; send_to_pager_color(buf, ch); num = 0; } /* Thanks to stu <sprice@ihug.co.nz> from the mailing list in pointing * This out. */ fclose(fp); } fpReserve = fopen(NULL_FILE, "r"); } /* * Show the boot log file -Thoric */ void do_dmesg(CHAR_DATA * ch, char *argument) { set_pager_color(AT_LOG, ch); show_file(ch, BOOTLOG_FILE); } /* * Writes a string to the log, extended version -Thoric */ void log_string_plus(const char *str, sh_int log_type, sh_int level) { char *strtime; int offset; strtime = ctime(¤t_time); strtime[strlen(strtime) - 1] = '\0'; fprintf(stderr, "%s :: %s\n", strtime, str); if (strncmp(str, "Log ", 4) == 0) offset = 4; else offset = 0; switch (log_type) { default: to_channel(str + offset, CHANNEL_LOG, "Log", level); break; case LOG_BUILD: to_channel(str + offset, CHANNEL_BUILD, "Build", level); break; case LOG_COMM: to_channel(str + offset, CHANNEL_COMM, "Comm", level); break; case LOG_WARN: to_channel(str + offset, CHANNEL_WARN, "Warn", level); break; case LOG_ALL: break; } return; } /* * wizlist builder! -Thoric */ void towizfile(const char *line) { int filler, xx; char outline[MSL]; FILE *wfp; outline[0] = '\0'; if (line && line[0] != '\0') { filler = (78 - strlen(line)); if (filler < 1) filler = 1; filler /= 2; for (xx = 0; xx < filler; xx++) strcat(outline, " "); strcat(outline, line); } strcat(outline, "\n\r"); wfp = fopen(WIZLIST_FILE, "a"); if (wfp) { fputs(outline, wfp); fclose(wfp); } } void add_to_wizlist(char *name, int level) { WIZENT *wiz, *tmp; #ifdef DEBUG log_string("Adding to wizlist..."); #endif CREATE(wiz, WIZENT, 1); wiz->name = str_dup(name); wiz->level = level; if (!first_wiz) { wiz->last = NULL; wiz->next = NULL; first_wiz = wiz; last_wiz = wiz; return; } /* insert sort, of sorts */ for (tmp = first_wiz; tmp; tmp = tmp->next) if (level > tmp->level) { if (!tmp->last) first_wiz = wiz; else tmp->last->next = wiz; wiz->last = tmp->last; wiz->next = tmp; tmp->last = wiz; return; } wiz->last = last_wiz; wiz->next = NULL; last_wiz->next = wiz; last_wiz = wiz; return; } /* * Wizlist builder -Thoric */ void make_wizlist() { DIR *dp; struct dirent *dentry; FILE *gfp; char *word; int ilevel, iflags; WIZENT *wiz, *wiznext; char buf[MSL]; first_wiz = NULL; last_wiz = NULL; dp = opendir(GOD_DIR); ilevel = 0; dentry = readdir(dp); while (dentry) { if (dentry->d_name[0] != '.') { sprintf(buf, "%s%s", GOD_DIR, dentry->d_name); gfp = fopen(buf, "r"); if (gfp) { word = feof(gfp) ? "End" : fread_word(gfp); ilevel = fread_number(gfp); fread_to_eol(gfp); word = feof(gfp) ? "End" : fread_word(gfp); if (!str_cmp(word, "Pcflags")) iflags = fread_number(gfp); else iflags = 0; fclose(gfp); if (IS_SET(iflags, PCFLAG_RETIRED)) /* Tracker1 -- Xerves 4/10/99 */ ilevel = LEVEL_IMMORTAL; if (IS_SET(iflags, PCFLAG_GUEST)) ilevel = LEVEL_IMMORTAL; add_to_wizlist(dentry->d_name, ilevel); } } dentry = readdir(dp); } closedir(dp); unlink(WIZLIST_FILE); sprintf(buf, " The EVIL ONES of %s!", sysdata.mud_name); towizfile(buf); /* towizfile( " Masters of the Realms of Despair!" );*/ buf[0] = '\0'; ilevel = 65535; for (wiz = first_wiz; wiz; wiz = wiz->next) { if (wiz->level < ilevel) { if (buf[0]) { towizfile(buf); buf[0] = '\0'; } towizfile(""); ilevel = wiz->level; switch (ilevel) { case MAX_LEVEL - 0: towizfile("&c&w Admin (7)&Y"); break; /* Tracker1 -- Xerves 4/10/99 */ case MAX_LEVEL - 1: towizfile("&c&w Hi-Staff (6)&Y"); break; case MAX_LEVEL - 2: towizfile("&c&w Staff (5)&Y"); break; case MAX_LEVEL - 3: towizfile("&c&w Hi-Imm (4)&Y"); break; case MAX_LEVEL - 4: towizfile("&c&w Imm (3)&Y"); break; case MAX_LEVEL - 5: towizfile("&c&w Guests/Retired (2)&Y"); break; default: towizfile("&c&w Servants &Y"); break; } } if (strlen(buf) + strlen(wiz->name) > 76) { towizfile(buf); buf[0] = '\0'; } strcat(buf, " "); strcat(buf, wiz->name); if (strlen(buf) > 70) { towizfile(buf); buf[0] = '\0'; } } if (buf[0]) towizfile(buf); for (wiz = first_wiz; wiz; wiz = wiznext) { wiznext = wiz->next; DISPOSE(wiz->name); DISPOSE(wiz); } first_wiz = NULL; last_wiz = NULL; } void do_makewizlist(CHAR_DATA * ch, char *argument) { make_wizlist(); } /* mud prog functions */ /* This routine reads in scripts of MUDprograms from a file */ int mprog_name_to_type(char *name) { if (!str_cmp(name, "in_file_prog")) return IN_FILE_PROG; if (!str_cmp(name, "act_prog")) return ACT_PROG; if (!str_cmp(name, "speech_prog")) return SPEECH_PROG; if (!str_cmp(name, "rand_prog")) return RAND_PROG; if (!str_cmp(name, "fight_prog")) return FIGHT_PROG; if (!str_cmp(name, "hitprcnt_prog")) return HITPRCNT_PROG; if (!str_cmp(name, "death_prog")) return DEATH_PROG; if (!str_cmp(name, "entry_prog")) return ENTRY_PROG; if (!str_cmp(name, "greet_prog")) return GREET_PROG; if (!str_cmp(name, "all_greet_prog")) return ALL_GREET_PROG; if (!str_cmp(name, "give_prog")) return GIVE_PROG; if (!str_cmp(name, "bribe_prog")) return BRIBE_PROG; if (!str_cmp(name, "time_prog")) return TIME_PROG; if (!str_cmp(name, "hour_prog")) return HOUR_PROG; if (!str_cmp(name, "wear_prog")) return WEAR_PROG; if (!str_cmp(name, "remove_prog")) return REMOVE_PROG; if (!str_cmp(name, "sac_prog")) return SAC_PROG; if (!str_cmp(name, "look_prog")) return LOOK_PROG; if (!str_cmp(name, "exa_prog")) return EXA_PROG; if (!str_cmp(name, "zap_prog")) return ZAP_PROG; if (!str_cmp(name, "get_prog")) return GET_PROG; if (!str_cmp(name, "drop_prog")) return DROP_PROG; if (!str_cmp(name, "damage_prog")) return DAMAGE_PROG; if (!str_cmp(name, "repair_prog")) return REPAIR_PROG; if (!str_cmp(name, "greet_prog")) return GREET_PROG; if (!str_cmp(name, "randiw_prog")) return RANDIW_PROG; if (!str_cmp(name, "speechiw_prog")) return SPEECHIW_PROG; if (!str_cmp(name, "pull_prog")) return PULL_PROG; if (!str_cmp(name, "push_prog")) return PUSH_PROG; if (!str_cmp(name, "sleep_prog")) return SLEEP_PROG; if (!str_cmp(name, "rest_prog")) return REST_PROG; if (!str_cmp(name, "rfight_prog")) return FIGHT_PROG; if (!str_cmp(name, "enter_prog")) return ENTRY_PROG; if (!str_cmp(name, "leave_prog")) return LEAVE_PROG; if (!str_cmp(name, "rdeath_prog")) return DEATH_PROG; if (!str_cmp(name, "script_prog")) return SCRIPT_PROG; if (!str_cmp(name, "use_prog")) return USE_PROG; return (ERROR_PROG); } MPROG_DATA *mprog_file_read(char *f, MPROG_DATA * mprg, MOB_INDEX_DATA * pMobIndex) { char MUDProgfile[MIL]; FILE *progfile; char letter; MPROG_DATA *mprg_next, *mprg2; bool done = FALSE; sprintf(MUDProgfile, "%s%s", PROG_DIR, f); progfile = fopen(MUDProgfile, "r"); if (!progfile) { bug("Mob: %d couldn't open mudprog file", pMobIndex->vnum); exit(1); } mprg2 = mprg; switch (letter = fread_letter(progfile)) { case '>': break; case '|': bug("empty mudprog file."); exit(1); break; default: bug("in mudprog file syntax error."); exit(1); break; } while (!done) { mprg2->type = mprog_name_to_type(fread_word(progfile)); switch (mprg2->type) { case ERROR_PROG: bug("mudprog file type error"); exit(1); break; case IN_FILE_PROG: bug("mprog file contains a call to file."); exit(1); break; default: xSET_BIT(pMobIndex->progtypes, mprg2->type); mprg2->arglist = fread_string(progfile); mprg2->comlist = fread_string(progfile); switch (letter = fread_letter(progfile)) { case '>': CREATE(mprg_next, MPROG_DATA, 1); mprg_next->next = mprg2; mprg2 = mprg_next; break; case '|': done = TRUE; break; default: bug("in mudprog file syntax error."); exit(1); break; } break; } } fclose(progfile); return mprg2; } /* Load a MUDprogram section from the area file. */ void load_mudprogs(AREA_DATA * tarea, FILE * fp) { MOB_INDEX_DATA *iMob; MPROG_DATA *original; MPROG_DATA *working; char letter; int value; for (;;) switch (letter = fread_letter(fp)) { default: bug("Load_mudprogs: bad command '%c'.", letter); exit(1); break; case 'S': case 's': fread_to_eol(fp); return; case '*': fread_to_eol(fp); break; case 'M': case 'm': value = fread_number(fp); if ((iMob = get_mob_index(value)) == NULL) { bug("Load_mudprogs: vnum %d doesnt exist", value); exit(1); } /* Go to the end of the prog command list if other commands exist */ if ((original = iMob->mudprogs) != NULL) for (; original->next; original = original->next) ; CREATE(working, MPROG_DATA, 1); if (original) original->next = working; else iMob->mudprogs = working; working = mprog_file_read(fread_word(fp), working, iMob); working->next = NULL; fread_to_eol(fp); break; } return; } /* This procedure is responsible for reading any in_file MUDprograms. */ void mprog_read_programs(FILE * fp, MOB_INDEX_DATA * pMobIndex) { MPROG_DATA *mprg; char letter; bool done = FALSE; if ((letter = fread_letter(fp)) != '>') { bug("Load_mobiles: vnum %d MUDPROG char", pMobIndex->vnum); exit(1); } CREATE(mprg, MPROG_DATA, 1); pMobIndex->mudprogs = mprg; while (!done) { mprg->type = mprog_name_to_type(fread_word(fp)); switch (mprg->type) { case ERROR_PROG: bug("Load_mobiles: vnum %d MUDPROG type.", pMobIndex->vnum); exit(1); break; case IN_FILE_PROG: mprg = mprog_file_read(fread_string(fp), mprg, pMobIndex); fread_to_eol(fp); switch (letter = fread_letter(fp)) { case '>': CREATE(mprg->next, MPROG_DATA, 1); mprg = mprg->next; break; case '|': mprg->next = NULL; fread_to_eol(fp); done = TRUE; break; default: bug("Load_mobiles: vnum %d bad MUDPROG.", pMobIndex->vnum); exit(1); break; } break; default: xSET_BIT(pMobIndex->progtypes, mprg->type); mprg->arglist = fread_string(fp); fread_to_eol(fp); mprg->comlist = fread_string(fp); fread_to_eol(fp); switch (letter = fread_letter(fp)) { case '>': CREATE(mprg->next, MPROG_DATA, 1); mprg = mprg->next; break; case '|': mprg->next = NULL; fread_to_eol(fp); done = TRUE; break; default: bug("Load_mobiles: vnum %d bad MUDPROG.", pMobIndex->vnum); exit(1); break; } break; } } return; } /*************************************************************/ /* obj prog functions */ /* This routine transfers between alpha and numeric forms of the * mob_prog bitvector types. This allows the use of the words in the * mob/script files. */ /* This routine reads in scripts of OBJprograms from a file */ MPROG_DATA *oprog_file_read(char *f, MPROG_DATA * mprg, OBJ_INDEX_DATA * pObjIndex) { char MUDProgfile[MIL]; FILE *progfile; char letter; MPROG_DATA *mprg_next, *mprg2; bool done = FALSE; sprintf(MUDProgfile, "%s%s", PROG_DIR, f); progfile = fopen(MUDProgfile, "r"); if (!progfile) { bug("Obj: %d couldnt open mudprog file", pObjIndex->vnum); exit(1); } mprg2 = mprg; switch (letter = fread_letter(progfile)) { case '>': break; case '|': bug("empty objprog file."); exit(1); break; default: bug("in objprog file syntax error."); exit(1); break; } while (!done) { mprg2->type = mprog_name_to_type(fread_word(progfile)); switch (mprg2->type) { case ERROR_PROG: bug("objprog file type error"); exit(1); break; case IN_FILE_PROG: bug("objprog file contains a call to file."); exit(1); break; default: xSET_BIT(pObjIndex->progtypes, mprg2->type); mprg2->arglist = fread_string(progfile); mprg2->comlist = fread_string(progfile); switch (letter = fread_letter(progfile)) { case '>': CREATE(mprg_next, MPROG_DATA, 1); mprg_next->next = mprg2; mprg2 = mprg_next; break; case '|': done = TRUE; break; default: bug("in objprog file syntax error."); exit(1); break; } break; } } fclose(progfile); return mprg2; } /* Load a MUDprogram section from the area file. */ void load_objprogs(AREA_DATA * tarea, FILE * fp) { OBJ_INDEX_DATA *iObj; MPROG_DATA *original; MPROG_DATA *working; char letter; int value; for (;;) switch (letter = fread_letter(fp)) { default: bug("Load_objprogs: bad command '%c'.", letter); exit(1); break; case 'S': case 's': fread_to_eol(fp); return; case '*': fread_to_eol(fp); break; case 'M': case 'm': value = fread_number(fp); if ((iObj = get_obj_index(value)) == NULL) { bug("Load_objprogs: vnum %d doesnt exist", value); exit(1); } /* Go to the end of the prog command list if other commands exist */ if ((original = iObj->mudprogs) != NULL) for (; original->next; original = original->next) ; CREATE(working, MPROG_DATA, 1); if (original) original->next = working; else iObj->mudprogs = working; working = oprog_file_read(fread_word(fp), working, iObj); working->next = NULL; fread_to_eol(fp); break; } return; } /* This procedure is responsible for reading any in_file OBJprograms. */ void oprog_read_programs(FILE * fp, OBJ_INDEX_DATA * pObjIndex) { MPROG_DATA *mprg; char letter; bool done = FALSE; if ((letter = fread_letter(fp)) != '>') { bug("Load_objects: vnum %d OBJPROG char", pObjIndex->vnum); exit(1); } CREATE(mprg, MPROG_DATA, 1); pObjIndex->mudprogs = mprg; while (!done) { mprg->type = mprog_name_to_type(fread_word(fp)); switch (mprg->type) { case ERROR_PROG: bug("Load_objects: vnum %d OBJPROG type.", pObjIndex->vnum); exit(1); break; case IN_FILE_PROG: mprg = oprog_file_read(fread_string(fp), mprg, pObjIndex); fread_to_eol(fp); switch (letter = fread_letter(fp)) { case '>': CREATE(mprg->next, MPROG_DATA, 1); mprg = mprg->next; break; case '|': mprg->next = NULL; fread_to_eol(fp); done = TRUE; break; default: bug("Load_objects: vnum %d bad OBJPROG.", pObjIndex->vnum); exit(1); break; } break; default: xSET_BIT(pObjIndex->progtypes, mprg->type); mprg->arglist = fread_string(fp); fread_to_eol(fp); mprg->comlist = fread_string(fp); fread_to_eol(fp); switch (letter = fread_letter(fp)) { case '>': CREATE(mprg->next, MPROG_DATA, 1); mprg = mprg->next; break; case '|': mprg->next = NULL; fread_to_eol(fp); done = TRUE; break; default: bug("Load_objects: vnum %d bad OBJPROG.", pObjIndex->vnum); exit(1); break; } break; } } return; } /*************************************************************/ /* room prog functions */ /* This routine transfers between alpha and numeric forms of the * mob_prog bitvector types. This allows the use of the words in the * mob/script files. */ /* This routine reads in scripts of OBJprograms from a file */ MPROG_DATA *rprog_file_read(char *f, MPROG_DATA * mprg, ROOM_INDEX_DATA * RoomIndex) { char MUDProgfile[MIL]; FILE *progfile; char letter; MPROG_DATA *mprg_next, *mprg2; bool done = FALSE; sprintf(MUDProgfile, "%s%s", PROG_DIR, f); progfile = fopen(MUDProgfile, "r"); if (!progfile) { bug("Room: %d couldnt open roomprog file", RoomIndex->vnum); exit(1); } mprg2 = mprg; switch (letter = fread_letter(progfile)) { case '>': break; case '|': bug("empty roomprog file."); exit(1); break; default: bug("in roomprog file syntax error."); exit(1); break; } while (!done) { mprg2->type = mprog_name_to_type(fread_word(progfile)); switch (mprg2->type) { case ERROR_PROG: bug("roomprog file type error"); exit(1); break; case IN_FILE_PROG: bug("roomprog file contains a call to file."); exit(1); break; default: xSET_BIT(RoomIndex->progtypes, mprg2->type); mprg2->arglist = fread_string(progfile); mprg2->comlist = fread_string(progfile); switch (letter = fread_letter(progfile)) { case '>': CREATE(mprg_next, MPROG_DATA, 1); mprg_next->next = mprg2; mprg2 = mprg_next; break; case '|': done = TRUE; break; default: bug("in roomprog file syntax error."); exit(1); break; } break; } } fclose(progfile); return mprg2; } /* Load a ROOMprogram section from the area file. */ void load_roomprogs(AREA_DATA * tarea, FILE * fp) { ROOM_INDEX_DATA *iRoom; MPROG_DATA *original; MPROG_DATA *working; char letter; int value; for (;;) switch (letter = fread_letter(fp)) { default: bug("Load_objprogs: bad command '%c'.", letter); exit(1); break; case 'S': case 's': fread_to_eol(fp); return; case '*': fread_to_eol(fp); break; case 'M': case 'm': value = fread_number(fp); if ((iRoom = get_room_index(value)) == NULL) { bug("Load_roomprogs: vnum %d doesnt exist", value); exit(1); } /* Go to the end of the prog command list if other commands exist */ if ((original = iRoom->mudprogs) != NULL) for (; original->next; original = original->next) ; CREATE(working, MPROG_DATA, 1); if (original) original->next = working; else iRoom->mudprogs = working; working = rprog_file_read(fread_word(fp), working, iRoom); working->next = NULL; fread_to_eol(fp); break; } return; } /* This procedure is responsible for reading any in_file ROOMprograms. */ void rprog_read_programs(FILE * fp, ROOM_INDEX_DATA * pRoomIndex) { MPROG_DATA *mprg; char letter; bool done = FALSE; if ((letter = fread_letter(fp)) != '>') { bug("Load_rooms: vnum %d ROOMPROG char", pRoomIndex->vnum); exit(1); } CREATE(mprg, MPROG_DATA, 1); pRoomIndex->mudprogs = mprg; while (!done) { mprg->type = mprog_name_to_type(fread_word(fp)); switch (mprg->type) { case ERROR_PROG: bug("Load_rooms: vnum %d ROOMPROG type.", pRoomIndex->vnum); exit(1); break; case IN_FILE_PROG: mprg = rprog_file_read(fread_string(fp), mprg, pRoomIndex); fread_to_eol(fp); switch (letter = fread_letter(fp)) { case '>': CREATE(mprg->next, MPROG_DATA, 1); mprg = mprg->next; break; case '|': mprg->next = NULL; fread_to_eol(fp); done = TRUE; break; default: bug("Load_rooms: vnum %d bad ROOMPROG.", pRoomIndex->vnum); exit(1); break; } break; default: xSET_BIT(pRoomIndex->progtypes, mprg->type); mprg->arglist = fread_string(fp); fread_to_eol(fp); mprg->comlist = fread_string(fp); fread_to_eol(fp); switch (letter = fread_letter(fp)) { case '>': CREATE(mprg->next, MPROG_DATA, 1); mprg = mprg->next; break; case '|': mprg->next = NULL; fread_to_eol(fp); done = TRUE; break; default: bug("Load_rooms: vnum %d bad ROOMPROG.", pRoomIndex->vnum); exit(1); break; } break; } } return; } //Used for removing loaded quest zones, note there are no resets in quest zones so if you need that //support you code it right in void delete_area(AREA_DATA *tarea) { STRFREE(tarea->author); DISPOSE(tarea->name); DISPOSE(tarea->filename); UNLINK(tarea, first_area, last_area, next, prev); UNLINK(tarea, first_area_name, last_area_name, next_sort_name, prev_sort_name); UNLINK(tarea, first_asort, last_asort, next_sort, prev_sort); DISPOSE(tarea); top_area--; } /*************************************************************/ /* Function to delete a room index. Called from do_rdelete in build.c Narn, May/96 Don't ask me why they return bool.. :).. oh well.. -- Alty */ bool delete_room(ROOM_INDEX_DATA * room) { int hash; ROOM_INDEX_DATA *prev, *limbo = get_room_index(ROOM_VNUM_LIMBO); OBJ_DATA *o; CHAR_DATA *ch; EXTRA_DESCR_DATA *ed; EXIT_DATA *ex; MPROG_ACT_LIST *mpact; MPROG_DATA *mp; while ((ch = room->first_person) != NULL) { if (!IS_NPC(ch)) { char_from_room(ch); char_to_room(ch, limbo); } else extract_char(ch, TRUE); } while ((o = room->first_content) != NULL) extract_obj(o); while ((ed = room->first_extradesc) != NULL) { room->first_extradesc = ed->next; STRFREE(ed->keyword); STRFREE(ed->description); DISPOSE(ed); --top_ed; } while ((ex = room->first_exit) != NULL) extract_exit(room, ex); while ((mpact = room->mpact) != NULL) { room->mpact = mpact->next; DISPOSE(mpact->buf); DISPOSE(mpact); } while ((mp = room->mudprogs) != NULL) { room->mudprogs = mp->next; STRFREE(mp->arglist); STRFREE(mp->comlist); DISPOSE(mp); } if (room->map) { MAP_INDEX_DATA *mapi; if ((mapi = get_map_index(room->map->vnum)) != NULL) if (room->map->x > 0 && room->map->x < 80 && room->map->y > 0 && room->map->y < 48) mapi->map_of_vnums[room->map->y][room->map->x] = -1; DISPOSE(room->map); } STRFREE(room->name); STRFREE(room->description); hash = room->vnum % MAX_KEY_HASH; if (room == room_index_hash[hash]) room_index_hash[hash] = room->next; else { for (prev = room_index_hash[hash]; prev; prev = prev->next) if (prev->next == room) break; if (prev) prev->next = room->next; else bug("delete_room: room %d not in hash bucket %d.", room->vnum, hash); } DISPOSE(room); --top_room; return TRUE; } /* See comment on delete_room. */ bool delete_obj(OBJ_INDEX_DATA * obj) { int hash; OBJ_INDEX_DATA *prev; OBJ_DATA *o, *o_next; EXTRA_DESCR_DATA *ed; AFFECT_DATA *af; MPROG_DATA *mp; int auc; /* Remove references to object index */ for (o = first_object; o; o = o_next) { o_next = o->next; if (o->pIndexData == obj) extract_obj(o); } while ((ed = obj->first_extradesc) != NULL) { obj->first_extradesc = ed->next; STRFREE(ed->keyword); STRFREE(ed->description); DISPOSE(ed); --top_ed; } while ((af = obj->first_affect) != NULL) { obj->first_affect = af->next; DISPOSE(af); --top_affect; } while ((mp = obj->mudprogs) != NULL) { obj->mudprogs = mp->next; STRFREE(mp->arglist); STRFREE(mp->comlist); DISPOSE(mp); } STRFREE(obj->name); STRFREE(obj->short_descr); STRFREE(obj->description); STRFREE(obj->action_desc); for (auc = 0; auc < AUCTION_MEM; ++auc) if (auction->history[auc] == obj) { if (auc < AUCTION_MEM - 1) memmove(&auction->history[auc], &auction->history[auc + 1], (AUCTION_MEM - auc - 1) * sizeof(OBJ_INDEX_DATA *)); auction->history[AUCTION_MEM - 1] = NULL; --auc; } hash = obj->vnum % MAX_KEY_HASH; if (obj == obj_index_hash[hash]) obj_index_hash[hash] = obj->next; else { for (prev = obj_index_hash[hash]; prev; prev = prev->next) if (prev->next == obj) break; if (prev) prev->next = obj->next; else bug("delete_obj: object %d not in hash bucket %d.", obj->vnum, hash); } DISPOSE(obj); --top_obj_index; return TRUE; } /* See comment on delete_room. */ bool delete_mob(MOB_INDEX_DATA * mob) { int hash; MOB_INDEX_DATA *prev; CHAR_DATA *ch, *ch_next; MPROG_DATA *mp; for (ch = first_char; ch; ch = ch_next) { ch_next = ch->next; if (ch->pIndexData == mob) extract_char(ch, TRUE); } while ((mp = mob->mudprogs) != NULL) { mob->mudprogs = mp->next; STRFREE(mp->arglist); STRFREE(mp->comlist); DISPOSE(mp); } if (mob->pShop) { UNLINK(mob->pShop, first_shop, last_shop, next, prev); DISPOSE(mob->pShop); --top_shop; } if (mob->rShop) { UNLINK(mob->rShop, first_repair, last_repair, next, prev); DISPOSE(mob->rShop); --top_repair; } STRFREE(mob->player_name); STRFREE(mob->short_descr); STRFREE(mob->long_descr); STRFREE(mob->description); hash = mob->vnum % MAX_KEY_HASH; if (mob == mob_index_hash[hash]) mob_index_hash[hash] = mob->next; else { for (prev = mob_index_hash[hash]; prev; prev = prev->next) if (prev->next == mob) break; if (prev) prev->next = mob->next; else bug("delete_mob: mobile %d not in hash bucket %d.", mob->vnum, hash); } DISPOSE(mob); --top_mob_index; return TRUE; } /* * Creat a new room (for online building) -Thoric */ ROOM_INDEX_DATA *make_room(int vnum) { ROOM_INDEX_DATA *pRoomIndex; int iHash; CREATE(pRoomIndex, ROOM_INDEX_DATA, 1); pRoomIndex->first_person = NULL; pRoomIndex->last_person = NULL; pRoomIndex->first_content = NULL; pRoomIndex->last_content = NULL; pRoomIndex->first_extradesc = NULL; pRoomIndex->last_extradesc = NULL; pRoomIndex->area = NULL; pRoomIndex->vnum = vnum; pRoomIndex->name = STRALLOC("Floating in a void"); pRoomIndex->description = STRALLOC(""); xCLEAR_BITS(pRoomIndex->room_flags); xSET_BIT(pRoomIndex->room_flags, ROOM_PROTOTYPE); /* pRoomIndex->room_flags = ROOM_PROTOTYPE; */ pRoomIndex->sector_type = 1; pRoomIndex->light = 0; pRoomIndex->resource = 0; pRoomIndex->first_exit = NULL; pRoomIndex->last_exit = NULL; iHash = vnum % MAX_KEY_HASH; pRoomIndex->next = room_index_hash[iHash]; room_index_hash[iHash] = pRoomIndex; top_room++; return pRoomIndex; } /* * Create a new INDEX object (for online building) -Thoric * Option to clone an existing index object. */ OBJ_INDEX_DATA *make_object(int vnum, int cvnum, char *name, int cprog) { OBJ_INDEX_DATA *pObjIndex, *cObjIndex; char buf[MSL]; int iHash; if (cvnum > 0) cObjIndex = get_obj_index(cvnum); else cObjIndex = NULL; CREATE(pObjIndex, OBJ_INDEX_DATA, 1); pObjIndex->vnum = vnum; pObjIndex->name = STRALLOC(name); pObjIndex->first_affect = NULL; pObjIndex->last_affect = NULL; pObjIndex->first_extradesc = NULL; pObjIndex->last_extradesc = NULL; if (!cObjIndex) { sprintf(buf, "A newly created %s", name); pObjIndex->short_descr = STRALLOC(buf); sprintf(buf, "Some god dropped a newly created %s here.", name); pObjIndex->description = STRALLOC(buf); pObjIndex->action_desc = STRALLOC(""); pObjIndex->short_descr[0] = LOWER(pObjIndex->short_descr[0]); pObjIndex->description[0] = UPPER(pObjIndex->description[0]); pObjIndex->item_type = ITEM_TRASH; xCLEAR_BITS(pObjIndex->extra_flags); xSET_BIT(pObjIndex->extra_flags, ITEM_PROTOTYPE); pObjIndex->wear_flags = 0; SET_BIT(pObjIndex->wear_flags, ITEM_TAKE); pObjIndex->value[0] = 0; pObjIndex->value[1] = 0; pObjIndex->value[2] = 0; pObjIndex->value[3] = 0; pObjIndex->value[4] = 0; pObjIndex->value[5] = 0; pObjIndex->value[6] = 0; pObjIndex->value[7] = 0; pObjIndex->value[8] = 0; pObjIndex->value[9] = 0; pObjIndex->value[10] = 0; pObjIndex->value[11] = 0; pObjIndex->value[12] = 0; pObjIndex->value[13] = 0; pObjIndex->weight = 1; pObjIndex->cost = 0; pObjIndex->cvnum = 0; pObjIndex->cident = 0; pObjIndex->sworthrestrict = 0; pObjIndex->imbueslots = 0; } else { EXTRA_DESCR_DATA *ed, *ced; AFFECT_DATA *paf, *cpaf; pObjIndex->short_descr = QUICKLINK(cObjIndex->short_descr); pObjIndex->description = QUICKLINK(cObjIndex->description); pObjIndex->action_desc = QUICKLINK(cObjIndex->action_desc); pObjIndex->item_type = cObjIndex->item_type; pObjIndex->extra_flags = cObjIndex->extra_flags; xSET_BIT(pObjIndex->extra_flags, ITEM_PROTOTYPE); pObjIndex->wear_flags = cObjIndex->wear_flags; SET_BIT(pObjIndex->wear_flags, ITEM_TAKE); pObjIndex->value[0] = cObjIndex->value[0]; pObjIndex->value[1] = cObjIndex->value[1]; pObjIndex->value[2] = cObjIndex->value[2]; pObjIndex->value[3] = cObjIndex->value[3]; pObjIndex->value[4] = cObjIndex->value[4]; pObjIndex->value[5] = cObjIndex->value[5]; pObjIndex->value[6] = cObjIndex->value[6]; pObjIndex->value[7] = cObjIndex->value[7]; pObjIndex->value[8] = cObjIndex->value[8]; pObjIndex->value[9] = cObjIndex->value[9]; pObjIndex->value[10] = cObjIndex->value[10]; pObjIndex->value[11] = cObjIndex->value[11]; pObjIndex->value[12] = cObjIndex->value[12]; pObjIndex->value[13] = cObjIndex->value[13]; pObjIndex->weight = cObjIndex->weight; pObjIndex->cost = cObjIndex->cost; pObjIndex->cvnum = cObjIndex->vnum; pObjIndex->cident = cObjIndex->cident; pObjIndex->sworthrestrict = cObjIndex->sworthrestrict; pObjIndex->imbueslots = cObjIndex->imbueslots; for (ced = cObjIndex->first_extradesc; ced; ced = ced->next) { CREATE(ed, EXTRA_DESCR_DATA, 1); ed->keyword = QUICKLINK(ced->keyword); ed->description = QUICKLINK(ced->description); LINK(ed, pObjIndex->first_extradesc, pObjIndex->last_extradesc, next, prev); top_ed++; } for (cpaf = cObjIndex->first_affect; cpaf; cpaf = cpaf->next) { CREATE(paf, AFFECT_DATA, 1); paf->type = cpaf->type; paf->duration = cpaf->duration; paf->location = cpaf->location; paf->modifier = cpaf->modifier; paf->bitvector = cpaf->bitvector; LINK(paf, pObjIndex->first_affect, pObjIndex->last_affect, next, prev); top_affect++; } } pObjIndex->count = 0; iHash = vnum % MAX_KEY_HASH; pObjIndex->next = obj_index_hash[iHash]; obj_index_hash[iHash] = pObjIndex; top_obj_index++; return pObjIndex; } /* * Create a new INDEX mobile (for online building) -Thoric * Option to clone an existing index mobile. */ MOB_INDEX_DATA *make_mobile(sh_int vnum, sh_int cvnum, char *name) { MOB_INDEX_DATA *pMobIndex, *cMobIndex; char buf[MSL]; int iHash; if (cvnum > 0) cMobIndex = get_mob_index(cvnum); else cMobIndex = NULL; CREATE(pMobIndex, MOB_INDEX_DATA, 1); pMobIndex->vnum = vnum; pMobIndex->count = 0; pMobIndex->killed = 0; pMobIndex->player_name = STRALLOC(name); if (!cMobIndex) { sprintf(buf, "A newly created %s", name); pMobIndex->short_descr = STRALLOC(buf); sprintf(buf, "Some god abandoned a newly created %s here.\n\r", name); pMobIndex->long_descr = STRALLOC(buf); pMobIndex->description = STRALLOC(""); pMobIndex->short_descr[0] = LOWER(pMobIndex->short_descr[0]); pMobIndex->long_descr[0] = UPPER(pMobIndex->long_descr[0]); pMobIndex->description[0] = UPPER(pMobIndex->description[0]); xCLEAR_BITS(pMobIndex->act); xCLEAR_BITS(pMobIndex->miflags); pMobIndex->elementb = 0; xSET_BIT(pMobIndex->act, ACT_IS_NPC); xSET_BIT(pMobIndex->act, ACT_PROTOTYPE); xCLEAR_BITS(pMobIndex->affected_by); pMobIndex->pShop = NULL; pMobIndex->rShop = NULL; pMobIndex->spec_fun = NULL; pMobIndex->mudprogs = NULL; xCLEAR_BITS(pMobIndex->progtypes); pMobIndex->alignment = 0; pMobIndex->level = 0; pMobIndex->hitnodice = 0; pMobIndex->hitsizedice = 0; pMobIndex->hitplus = 0; pMobIndex->damnodice = 0; pMobIndex->damsizedice = 0; pMobIndex->damplus = 0; pMobIndex->damaddhi = 0; pMobIndex->damaddlow = 0; pMobIndex->max_move = 1000; pMobIndex->gold = 0; pMobIndex->position = 12; pMobIndex->tohitslash = 0; pMobIndex->tohitstab = 0; pMobIndex->tohitbash = 0; pMobIndex->defposition = 12; pMobIndex->apply_res_fire = 100; pMobIndex->apply_res_water = 100; pMobIndex->apply_res_air = 100; pMobIndex->apply_res_earth = 100; pMobIndex->apply_res_energy = 100; pMobIndex->apply_res_magic = 100; pMobIndex->apply_res_nonmagic = 100; pMobIndex->apply_res_blunt = 100; pMobIndex->apply_res_pierce = 100; pMobIndex->apply_res_slash = 100; pMobIndex->apply_res_poison = 100; pMobIndex->apply_res_paralysis = 100; pMobIndex->apply_res_holy = 100; pMobIndex->apply_res_unholy = 100; pMobIndex->apply_res_undead = 100; pMobIndex->sex = 0; pMobIndex->m1 = 0; pMobIndex->m2 = 0; pMobIndex->m3 = 0; pMobIndex->m4 = 0; pMobIndex->m5 = 0; pMobIndex->m6 = 0; pMobIndex->m7 = 0; pMobIndex->m8 = 0; pMobIndex->m9 = 0; pMobIndex->m10 = 0; pMobIndex->m11 = 0; pMobIndex->m12 = 0; pMobIndex->cident = 0; pMobIndex->perm_str = 13; pMobIndex->perm_dex = 13; pMobIndex->perm_int = 13; pMobIndex->perm_wis = 13; pMobIndex->perm_cha = 13; pMobIndex->perm_con = 13; pMobIndex->perm_lck = 13; pMobIndex->perm_agi = 15; pMobIndex->race = 0; pMobIndex->xflags = 0; pMobIndex->resistant = 0; pMobIndex->immune = 0; pMobIndex->susceptible = 0; xCLEAR_BITS(pMobIndex->attacks); xCLEAR_BITS(pMobIndex->defenses); } else { pMobIndex->short_descr = QUICKLINK(cMobIndex->short_descr); pMobIndex->long_descr = QUICKLINK(cMobIndex->long_descr); pMobIndex->description = QUICKLINK(cMobIndex->description); pMobIndex->act = cMobIndex->act; pMobIndex->miflags = cMobIndex->miflags; xSET_BIT(pMobIndex->act, ACT_PROTOTYPE); pMobIndex->affected_by = cMobIndex->affected_by; pMobIndex->pShop = NULL; pMobIndex->rShop = NULL; pMobIndex->spec_fun = cMobIndex->spec_fun; pMobIndex->mudprogs = NULL; xCLEAR_BITS(pMobIndex->progtypes); pMobIndex->alignment = cMobIndex->alignment; pMobIndex->level = 0; pMobIndex->tohitbash = cMobIndex->tohitbash; pMobIndex->tohitslash = cMobIndex->tohitslash; pMobIndex->tohitstab = cMobIndex->tohitstab; pMobIndex->mobthac0 = cMobIndex->mobthac0; pMobIndex->ac = cMobIndex->ac; pMobIndex->hitnodice = cMobIndex->hitnodice; pMobIndex->hitsizedice = cMobIndex->hitsizedice; pMobIndex->hitplus = cMobIndex->hitplus; pMobIndex->damnodice = cMobIndex->damnodice; pMobIndex->damsizedice = cMobIndex->damsizedice; pMobIndex->damplus = cMobIndex->damplus; pMobIndex->damaddhi = cMobIndex->damaddhi; pMobIndex->damaddlow = cMobIndex->damaddlow; pMobIndex->max_move = cMobIndex->max_move; pMobIndex->gold = cMobIndex->gold; pMobIndex->position = cMobIndex->position; pMobIndex->defposition = cMobIndex->defposition; pMobIndex->apply_res_fire = cMobIndex->apply_res_fire; pMobIndex->apply_res_water = cMobIndex->apply_res_water; pMobIndex->apply_res_air = cMobIndex->apply_res_air; pMobIndex->apply_res_earth = cMobIndex->apply_res_earth; pMobIndex->apply_res_energy = cMobIndex->apply_res_energy; pMobIndex->apply_res_magic = cMobIndex->apply_res_magic; pMobIndex->apply_res_nonmagic = cMobIndex->apply_res_nonmagic; pMobIndex->apply_res_blunt = cMobIndex->apply_res_blunt; pMobIndex->apply_res_pierce = cMobIndex->apply_res_pierce; pMobIndex->apply_res_slash = cMobIndex->apply_res_slash; pMobIndex->apply_res_poison = cMobIndex->apply_res_poison; pMobIndex->apply_res_paralysis = cMobIndex->apply_res_paralysis; pMobIndex->apply_res_holy = cMobIndex->apply_res_holy; pMobIndex->apply_res_unholy = cMobIndex->apply_res_unholy; pMobIndex->apply_res_undead = cMobIndex->apply_res_undead; pMobIndex->sex = cMobIndex->sex; pMobIndex->m1 = cMobIndex->m1; pMobIndex->m2 = cMobIndex->m2; pMobIndex->m3 = cMobIndex->m3; pMobIndex->m4 = cMobIndex->m4; pMobIndex->m5 = cMobIndex->m5; pMobIndex->m6 = cMobIndex->m6; pMobIndex->m7 = cMobIndex->m7; pMobIndex->m8 = cMobIndex->m8; pMobIndex->m9 = cMobIndex->m9; pMobIndex->m10 = cMobIndex->m10; pMobIndex->m11 = cMobIndex->m11; pMobIndex->m12 = cMobIndex->m12; pMobIndex->perm_str = cMobIndex->perm_str; pMobIndex->perm_dex = cMobIndex->perm_dex; pMobIndex->perm_int = cMobIndex->perm_int; pMobIndex->perm_wis = cMobIndex->perm_wis; pMobIndex->perm_cha = cMobIndex->perm_cha; pMobIndex->perm_con = cMobIndex->perm_con; pMobIndex->perm_lck = cMobIndex->perm_lck; pMobIndex->perm_agi = cMobIndex->perm_agi; pMobIndex->race = cMobIndex->race; pMobIndex->xflags = cMobIndex->xflags; pMobIndex->resistant = cMobIndex->resistant; pMobIndex->immune = cMobIndex->immune; pMobIndex->susceptible = cMobIndex->susceptible; pMobIndex->attacks = cMobIndex->attacks; pMobIndex->defenses = cMobIndex->defenses; } iHash = vnum % MAX_KEY_HASH; pMobIndex->next = mob_index_hash[iHash]; mob_index_hash[iHash] = pMobIndex; top_mob_index++; return pMobIndex; } /* * Creates a simple exit with no fields filled but rvnum and optionally * to_room and vnum. -Thoric * Exits are inserted into the linked list based on vdir. */ EXIT_DATA *make_exit(ROOM_INDEX_DATA * pRoomIndex, ROOM_INDEX_DATA * to_room, sh_int door) { EXIT_DATA *pexit, *texit; bool broke; CREATE(pexit, EXIT_DATA, 1); pexit->vdir = door; pexit->rvnum = pRoomIndex->vnum; pexit->to_room = to_room; pexit->distance = 1; CREATE(pexit->coord, COORD_DATA, 1); pexit->coord->x = 0; pexit->coord->y = 0; if (to_room) { pexit->vnum = to_room->vnum; texit = get_exit_to(to_room, rev_dir[door], pRoomIndex->vnum); if (texit) /* assign reverse exit pointers */ { texit->rexit = pexit; pexit->rexit = texit; } } broke = FALSE; for (texit = pRoomIndex->first_exit; texit; texit = texit->next) if (door < texit->vdir) { broke = TRUE; break; } if (!pRoomIndex->first_exit) pRoomIndex->first_exit = pexit; else { /* keep exits in incremental order - insert exit into list */ if (broke && texit) { if (!texit->prev) pRoomIndex->first_exit = pexit; else texit->prev->next = pexit; pexit->prev = texit->prev; pexit->next = texit; texit->prev = pexit; top_exit++; return pexit; } pRoomIndex->last_exit->next = pexit; } pexit->next = NULL; pexit->prev = pRoomIndex->last_exit; pRoomIndex->last_exit = pexit; top_exit++; return pexit; } void fix_area_exits(AREA_DATA * tarea) { ROOM_INDEX_DATA *pRoomIndex; EXIT_DATA *pexit, *rev_exit; int rnum; bool fexit; for (rnum = tarea->low_r_vnum; rnum <= tarea->hi_r_vnum; rnum++) { if ((pRoomIndex = get_room_index(rnum)) == NULL) continue; fexit = FALSE; for (pexit = pRoomIndex->first_exit; pexit; pexit = pexit->next) { fexit = TRUE; pexit->rvnum = pRoomIndex->vnum; if (pexit->vnum <= 0) pexit->to_room = NULL; else pexit->to_room = get_room_index(pexit->vnum); } if (!fexit) xSET_BIT(pRoomIndex->room_flags, ROOM_NO_MOB); } for (rnum = tarea->low_r_vnum; rnum <= tarea->hi_r_vnum; rnum++) { if ((pRoomIndex = get_room_index(rnum)) == NULL) continue; for (pexit = pRoomIndex->first_exit; pexit; pexit = pexit->next) { if (pexit->to_room && !pexit->rexit) { rev_exit = get_exit_to(pexit->to_room, rev_dir[pexit->vdir], pRoomIndex->vnum); if (rev_exit) { pexit->rexit = rev_exit; rev_exit->rexit = pexit; } } } } } void load_area_file(AREA_DATA * tarea, char *filename) { /* FILE *fpin; what intelligent person stopped using fpArea????? if fpArea isn't being used, then no filename or linenumber is printed when an error occurs during loading the area.. (bug uses fpArea) --TRI */ if (fBootDb) tarea = last_area; if (!fBootDb && !tarea) { bug("Load_area: null area!"); return; } if ((fpArea = fopen(filename, "r")) == NULL) { perror(filename); bug("load_area: error loading file (can't open)"); bug(filename); return; } area_version = 0; for (;;) { char *word; if (fread_letter(fpArea) != '#') { bug(tarea->filename); bug("load_area: # not found."); exit(1); } word = fread_word(fpArea); if (word[0] == '$') break; else if (!str_cmp(word, "AREA")) { if (fBootDb) { load_area(fpArea); tarea = last_area; } else { DISPOSE(tarea->name); tarea->name = fread_string_nohash(fpArea); } } else if (!str_cmp(word, "AUTHOR")) load_author(tarea, fpArea); else if (!str_cmp(word, "FLAGS")) load_flags(tarea, fpArea); else if (!str_cmp(word, "RANGES")) load_ranges(tarea, fpArea); else if (!str_cmp(word, "ECONOMY")) load_economy(tarea, fpArea); else if (!str_cmp(word, "KINGDOM")) //no longer used, left for old area files load_area_kingdom(tarea, fpArea); else if (!str_cmp(word, "KOWNER")) load_kowner(tarea, fpArea); else if (!str_cmp(word, "RESETMSG")) load_resetmsg(tarea, fpArea); /* Rennard */ else if (!str_cmp(word, "HELPS")) load_helps(tarea, fpArea); else if (!str_cmp(word, "MOBILES")) load_mobiles(tarea, fpArea); else if (!str_cmp(word, "MUDPROGS")) load_mudprogs(tarea, fpArea); else if (!str_cmp(word, "OBJECTS")) load_objects(tarea, fpArea); else if (!str_cmp(word, "OBJPROGS")) load_objprogs(tarea, fpArea); else if (!str_cmp(word, "RESETS")) load_resets(tarea, fpArea); else if (!str_cmp(word, "ROOMS")) load_rooms(tarea, fpArea); else if (!str_cmp(word, "SHOPS")) load_shops(tarea, fpArea); else if (!str_cmp(word, "REPAIRS")) load_repairs(tarea, fpArea); else if (!str_cmp(word, "SPECIALS")) load_specials(tarea, fpArea); else if (!str_cmp(word, "CLIMATE")) load_climate(tarea, fpArea); else if (!str_cmp(word, "VERSION")) load_version(tarea, fpArea); else { bug(tarea->filename); bug("load_area: bad section name."); if (fBootDb) exit(1); else { fclose(fpArea); fpArea=NULL; return; } } } fclose(fpArea); fpArea=NULL; if (tarea) { if (fBootDb) { sort_area_by_name(tarea); /* 4/27/97 */ sort_area(tarea, FALSE); } fprintf(stderr, "%-14s: Rooms: %5d - %-5d Objs: %5d - %-5d Mobs: %5d - %d\n", tarea->filename, tarea->low_r_vnum, tarea->hi_r_vnum, tarea->low_o_vnum, tarea->hi_o_vnum, tarea->low_m_vnum, tarea->hi_m_vnum); if (!tarea->author) tarea->author = STRALLOC(""); SET_BIT(tarea->status, AREA_LOADED); } else fprintf(stderr, "(%s)\n", filename); } void load_reserved(void) { RESERVE_DATA *res; FILE *fp; if (!(fp = fopen(SYSTEM_DIR RESERVED_LIST, "r"))) return; for (;;) { if (feof(fp)) { bug("Load_reserved: no $ found."); fclose(fp); return; } CREATE(res, RESERVE_DATA, 1); res->name = fread_string_nohash(fp); if (*res->name == '$') break; sort_reserved(res); } DISPOSE(res->name); DISPOSE(res); fclose(fp); return; } /* Build list of in_progress areas. Do not load areas. * define AREA_READ if you want it to build area names rather than reading * them out of the area files. -- Altrag */ void load_buildlist(void) { DIR *dp; struct dirent *dentry; FILE *fp; char buf[MSL]; AREA_DATA *pArea; char line[81]; char word[81]; int low, hi; int mlow, mhi, olow, ohi, rlow, rhi; bool badfile = FALSE; char temp; dp = opendir(GOD_DIR); dentry = readdir(dp); while (dentry) { if (dentry->d_name[0] != '.') { sprintf(buf, "%s%s", GOD_DIR, dentry->d_name); if (!(fp = fopen(buf, "r"))) { bug("Load_buildlist: invalid file"); perror(buf); dentry = readdir(dp); continue; } log_string(buf); badfile = FALSE; rlow = rhi = olow = ohi = mlow = mhi = 0; while (!feof(fp) && !ferror(fp)) { low = 0; hi = 0; word[0] = 0; line[0] = 0; if ((temp = fgetc(fp)) != EOF) ungetc(temp, fp); else break; fgets(line, 80, fp); sscanf(line, "%s %d %d", word, &low, &hi); if (!strcmp(word, "Level")) { if (low < LEVEL_IMMORTAL) { sprintf(buf, "%s: God file with level %d < %d", dentry->d_name, low, LEVEL_IMMORTAL); badfile = TRUE; } } if (!strcmp(word, "RoomRange")) rlow = low, rhi = hi; else if (!strcmp(word, "MobRange")) mlow = low, mhi = hi; else if (!strcmp(word, "ObjRange")) olow = low, ohi = hi; } fclose(fp); if (rlow && rhi && !badfile) { sprintf(buf, "%s%s.are", BUILD_DIR, dentry->d_name); if (!(fp = fopen(buf, "r"))) { bug("Load_buildlist: cannot open area file for read"); perror(buf); dentry = readdir(dp); continue; } #if !defined(READ_AREA) /* Dont always want to read stuff.. dunno.. shrug */ strcpy(word, fread_word(fp)); if (word[0] != '#' || strcmp(&word[1], "AREA")) { sprintf(buf, "Make_buildlist: %s.are: no #AREA found.", dentry->d_name); fclose(fp); dentry = readdir(dp); continue; } #endif CREATE(pArea, AREA_DATA, 1); sprintf(buf, "%s.are", dentry->d_name); pArea->author = STRALLOC(dentry->d_name); pArea->filename = str_dup(buf); #if !defined(READ_AREA) pArea->name = fread_string_nohash(fp); #else sprintf(buf, "{PROTO} %s's area in progress", dentry->d_name); pArea->name = str_dup(buf); #endif fclose(fp); pArea->low_r_vnum = rlow; pArea->hi_r_vnum = rhi; pArea->low_m_vnum = mlow; pArea->hi_m_vnum = mhi; pArea->low_o_vnum = olow; pArea->hi_o_vnum = ohi; pArea->low_soft_range = -1; pArea->hi_soft_range = -1; pArea->low_hard_range = -1; pArea->hi_hard_range = -1; pArea->first_reset = NULL; pArea->last_reset = NULL; LINK(pArea, first_build, last_build, next, prev); fprintf(stderr, "%-14s: Rooms: %5d - %-5d Objs: %5d - %-5d " "Mobs: %5d - %-5d\n", pArea->filename, pArea->low_r_vnum, pArea->hi_r_vnum, pArea->low_o_vnum, pArea->hi_o_vnum, pArea->low_m_vnum, pArea->hi_m_vnum); sort_area(pArea, TRUE); } } dentry = readdir(dp); } closedir(dp); } /* Rebuilt from broken copy, but bugged - commented out for now - Blod */ void sort_reserved(RESERVE_DATA * pRes) { RESERVE_DATA *res = NULL; if (!pRes) { bug("Sort_reserved: NULL pRes"); return; } pRes->next = NULL; pRes->prev = NULL; for (res = first_reserved; res; res = res->next) { if (strcasecmp(pRes->name, res->name) > 0) { INSERT(pRes, res, first_reserved, next, prev); break; } } if (!res) { LINK(pRes, first_reserved, last_reserved, next, prev); } return; } /* * Sort areas by name alphanumercially * - 4/27/97, Fireblade */ void sort_area_by_name(AREA_DATA * pArea) { AREA_DATA *temp_area; if (!pArea) { bug("Sort_area_by_name: NULL pArea"); return; } for (temp_area = first_area_name; temp_area; temp_area = temp_area->next_sort_name) { if (strcmp(pArea->name, temp_area->name) < 0) { INSERT(pArea, temp_area, first_area_name, next_sort_name, prev_sort_name); break; } } if (!temp_area) { LINK(pArea, first_area_name, last_area_name, next_sort_name, prev_sort_name); } return; } /* * Sort by room vnums -Altrag & Thoric */ void sort_area(AREA_DATA * pArea, bool proto) { AREA_DATA *area = NULL; AREA_DATA *first_sort, *last_sort; bool found; if (!pArea) { bug("Sort_area: NULL pArea"); return; } if (proto) { first_sort = first_bsort; last_sort = last_bsort; } else { first_sort = first_asort; last_sort = last_asort; } found = FALSE; pArea->next_sort = NULL; pArea->prev_sort = NULL; if (!first_sort) { pArea->prev_sort = NULL; pArea->next_sort = NULL; first_sort = pArea; last_sort = pArea; found = TRUE; } else for (area = first_sort; area; area = area->next_sort) if (pArea->low_r_vnum < area->low_r_vnum) { if (!area->prev_sort) first_sort = pArea; else area->prev_sort->next_sort = pArea; pArea->prev_sort = area->prev_sort; pArea->next_sort = area; area->prev_sort = pArea; found = TRUE; break; } if (!found) { pArea->prev_sort = last_sort; pArea->next_sort = NULL; last_sort->next_sort = pArea; last_sort = pArea; } if (proto) { first_bsort = first_sort; last_bsort = last_sort; } else { first_asort = first_sort; last_asort = last_sort; } } /* * Display vnums currently assigned to areas -Altrag & Thoric * Sorted, and flagged if loaded. */ void show_vnums(CHAR_DATA * ch, int low, int high, bool proto, bool shownl, char *loadst, char *notloadst) { AREA_DATA *pArea, *first_sort; int count, loaded; count = 0; loaded = 0; set_pager_color(AT_PLAIN, ch); if (proto) first_sort = first_bsort; else first_sort = first_asort; for (pArea = first_sort; pArea; pArea = pArea->next_sort) { if (IS_SET(pArea->status, AREA_DELETED)) continue; if (pArea->low_r_vnum < low) continue; if (pArea->hi_r_vnum > high) break; if (IS_SET(pArea->status, AREA_LOADED)) loaded++; else if (!shownl) continue; pager_printf(ch, "%-22s| Rooms: %6d - %-6d" " Objs: %6d - %-6d Mobs: %6d - %-6d%s\n\r", (pArea->filename ? pArea->filename : "(invalid)"), pArea->low_r_vnum, pArea->hi_r_vnum, pArea->low_o_vnum, pArea->hi_o_vnum, pArea->low_m_vnum, pArea->hi_m_vnum, IS_SET(pArea->status, AREA_LOADED) ? loadst : notloadst); count++; } pager_printf(ch, "Areas listed: %d Loaded: %d\n\r", count, loaded); return; } /* * Shows prototype vnums ranges, and if loaded */ void do_vnums(CHAR_DATA * ch, char *argument) { char arg1[MIL]; char arg2[MIL]; int low, high; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); low = 0; high = MAX_VNUM; if (arg1[0] != '\0') { low = atoi(arg1); if (arg2[0] != '\0') high = atoi(arg2); } show_vnums(ch, low, high, TRUE, TRUE, " *", ""); } /* * Shows installed areas, sorted. Mark unloaded areas with an X */ void do_zones(CHAR_DATA * ch, char *argument) { char arg1[MIL]; char arg2[MIL]; int low, high; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); low = 0; high = MAX_VNUM; if (arg1[0] != '\0') { low = atoi(arg1); if (arg2[0] != '\0') high = atoi(arg2); } show_vnums(ch, low, high, FALSE, TRUE, "", " X"); } /* * Show prototype areas, sorted. Only show loaded areas */ void do_newzones(CHAR_DATA * ch, char *argument) { char arg1[MIL]; char arg2[MIL]; int low, high; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); low = 0; high = MAX_VNUM; if (arg1[0] != '\0') { low = atoi(arg1); if (arg2[0] != '\0') high = atoi(arg2); } show_vnums(ch, low, high, TRUE, FALSE, "", " X"); } /* * Save system info to data file */ void save_sysdata(SYSTEM_DATA sys) { FILE *fp; char filename[MIL]; int x, y, z; sprintf(filename, "%ssysdata.dat", SYSTEM_DIR); fclose(fpReserve); if ((fp = fopen(filename, "w")) == NULL) { bug("save_sysdata: fopen"); perror(filename); } else { fprintf(fp, "#SYSTEM\n"); fprintf(fp, "MudName %s~\n", sys.mud_name); fprintf(fp, "CodeVersion %s~\n", sys.cversion); fprintf(fp, "MudVersion %s~\n", sys.mversion); fprintf(fp, "TopPin %d\n", sys.top_pid); fprintf(fp, "TopKPin %d\n", sys.top_kpid); fprintf(fp, "TopTPin %d\n", sys.top_tpid); fprintf(fp, "Highplayers %d\n", sys.alltimemax); fprintf(fp, "Highplayertime %s~\n", sys.time_of_max); fprintf(fp, "CheckImmHost %d\n", sys.check_imm_host); fprintf(fp, "Nameresolving %d\n", sys.NO_NAME_RESOLVING); fprintf(fp, "Waitforauth %d\n", sys.WAIT_FOR_AUTH); fprintf(fp, "Readallmail %d\n", sys.read_all_mail); fprintf(fp, "FirstRun %d\n", sys.firstrun); fprintf(fp, "AccountEmail %d\n", sys.accountemail); fprintf(fp, "ResetGame %d\n", sys.resetgame); fprintf(fp, "Readmailfree %d\n", sys.read_mail_free); fprintf(fp, "Writemailfree %d\n", sys.write_mail_free); fprintf(fp, "Takeothersmail %d\n", sys.take_others_mail); fprintf(fp, "IMCMailVnum %d\n", sys.imc_mail_vnum); fprintf(fp, "Muse %d\n", sys.muse_level); fprintf(fp, "MaxAccounts %d\n", sys.max_accounts); fprintf(fp, "MaxAccountChanges %d\n", sys.max_account_changes); fprintf(fp, "GemVnum %d\n", sys.gem_vnum); fprintf(fp, "TimeoutLogin %d\n", sys.timeout_login); fprintf(fp, "TimeoutNotes %d\n", sys.timeout_notes); fprintf(fp, "TimeoutIdle %d\n", sys.timeout_idle); fprintf(fp, "StartCalender %d\n", sys.start_calender); fprintf(fp, "LastResCheck %d\n", sys.lastrescheck); fprintf(fp, "LastPopCheck %d\n", sys.lastpopcheck); fprintf(fp, "LastTaxCheck %d\n", sys.lasttaxcheck); fprintf(fp, "Think %d\n", sys.think_level); fprintf(fp, "Build %d\n", sys.build_level); fprintf(fp, "Log %d\n", sys.log_level); fprintf(fp, "Protoflag %d\n", sys.level_modify_proto); fprintf(fp, "Overridepriv %d\n", sys.level_override_private); fprintf(fp, "Msetplayer %d\n", sys.level_mset_player); fprintf(fp, "Stunplrvsplr %d\n", sys.stun_plr_vs_plr); fprintf(fp, "Stunregular %d\n", sys.stun_regular); fprintf(fp, "Gougepvp %d\n", sys.gouge_plr_vs_plr); fprintf(fp, "Gougenontank %d\n", sys.gouge_nontank); fprintf(fp, "Bashpvp %d\n", sys.bash_plr_vs_plr); fprintf(fp, "Bashnontank %d\n", sys.bash_nontank); fprintf(fp, "Dodgemod %d\n", sys.dodge_mod); fprintf(fp, "Parrymod %d\n", sys.parry_mod); fprintf(fp, "Tumblemod %d\n", sys.tumble_mod); fprintf(fp, "Damplrvsplr %d\n", sys.dam_plr_vs_plr); fprintf(fp, "Damplrvsmob %d\n", sys.dam_plr_vs_mob); fprintf(fp, "Dammobvsplr %d\n", sys.dam_mob_vs_plr); fprintf(fp, "Dammobvsmob %d\n", sys.dam_mob_vs_mob); fprintf(fp, "Forcepc %d\n", sys.level_forcepc); fprintf(fp, "Guildoverseer %s~\n", sys.guild_overseer); fprintf(fp, "Guildadvisor %s~\n", sys.guild_advisor); fprintf(fp, "Saveflags %d\n", sys.save_flags); fprintf(fp, "Savefreq %d\n", sys.save_frequency); fprintf(fp, "Bestowdif %d\n", sys.bestow_dif); fprintf(fp, "BanSiteLevel %d\n", sys.ban_site_level); fprintf(fp, "BanRaceLevel %d\n", sys.ban_race_level); fprintf(fp, "BanClassLevel %d\n", sys.ban_class_level); fprintf(fp, "MorphOpt %d\n", sys.morph_opt); fprintf(fp, "MaxKingdom %d\n", sys.max_kingdom); fprintf(fp, "LastPortal %d\n", sys.last_portal); fprintf(fp, "LastTrap %d\n", sys.last_trap_uid); fprintf(fp, "LastInvTrap %d\n", sys.last_invtrap_uid); fprintf(fp, "PetSave %d\n", sys.save_pets); fprintf(fp, "IdentTries %d\n", sys.ident_retries); fprintf(fp, "Newbie_purge %d\n", sys.newbie_purge); fprintf(fp, "Regular_purge %d\n", sys.regular_purge); fprintf(fp, "Autopurge %d\n", sys.CLEANPFILES); fprintf(fp, "Purgetime %ld\n", sys.purgetime); fprintf(fp, "Exp_Percent %d\n", sys.exp_percent); fprintf(fp, "Stat_Gain %d\n", sys.stat_gain); fprintf(fp, "Top_Gem_Num %d\n", sys.top_gem_num); fprintf(fp, "Quest_item1 %d\n", sys.quest_item1); fprintf(fp, "Quest_value1 %d\n", sys.quest_value1); fprintf(fp, "Quest_item2 %d\n", sys.quest_item2); fprintf(fp, "Quest_value2 %d\n", sys.quest_value2); fprintf(fp, "Quest_item3 %d\n", sys.quest_item3); fprintf(fp, "Quest_value3 %d\n", sys.quest_value3); fprintf(fp, "Quest_item4 %d\n", sys.quest_item4); fprintf(fp, "Quest_value4 %d\n", sys.quest_value4); fprintf(fp, "Quest_item5 %d\n", sys.quest_item5); fprintf(fp, "Quest_value5 %d\n", sys.quest_value5); fprintf(fp, "Quest_item6 %d\n", sys.quest_item6); fprintf(fp, "Quest_value6 %d\n", sys.quest_value6); fprintf(fp, "Quest_item7 %d\n", sys.quest_item7); fprintf(fp, "Quest_value7 %d\n", sys.quest_value7); fprintf(fp, "Quest_item8 %d\n", sys.quest_item8); fprintf(fp, "Quest_value8 %d\n", sys.quest_value8); fprintf(fp, "Quest_item9 %d\n", sys.quest_item9); fprintf(fp, "Quest_value9 %d\n", sys.quest_value9); fprintf(fp, "Quest_item10 %d\n", sys.quest_item10); fprintf(fp, "Quest_value10 %d\n", sys.quest_value10); fprintf(fp, "Quest_item11 %d\n", sys.quest_item11); fprintf(fp, "Quest_value11 %d\n", sys.quest_value11); fprintf(fp, "Quest_item12 %d\n", sys.quest_item12); fprintf(fp, "Quest_value12 %d\n", sys.quest_value12); for (x = 0; x <= MAX_SPHERE-1; x++) { fprintf(fp, "Toadvance%d ", x+1); for (y = 0; y <= MAX_GROUP-1; y++) { for (z = 0; z <= MAX_TIER-2; z++) fprintf(fp, " %d", sys.toadvance[x][y][z]); } fprintf(fp, "\n"); } fprintf(fp, "End\n\n"); fprintf(fp, "#END\n"); } fclose(fp); fpReserve = fopen(NULL_FILE, "r"); return; } void fread_sysdata(SYSTEM_DATA * sys, FILE * fp) { char *word; bool fMatch; char *ln; int y, z; char arg[MIL]; sys->time_of_max = NULL; sys->mud_name = NULL; for (;;) { word = feof(fp) ? "End" : fread_word(fp); fMatch = FALSE; switch (UPPER(word[0])) { case '*': fMatch = TRUE; fread_to_eol(fp); break; case 'A': KEY("AccountEmail", sys->accountemail, fread_number(fp)); KEY("Autopurge", sys->CLEANPFILES, fread_number(fp)); break; case 'B': KEY("Bashpvp", sys->bash_plr_vs_plr, fread_number(fp)); KEY("Bashnontank", sys->bash_nontank, fread_number(fp)); KEY("Bestowdif", sys->bestow_dif, fread_number(fp)); KEY("Build", sys->build_level, fread_number(fp)); KEY("BanSiteLevel", sys->ban_site_level, fread_number(fp)); KEY("BanClassLevel", sys->ban_class_level, fread_number(fp)); KEY("BanRaceLevel", sys->ban_race_level, fread_number(fp)); break; case 'C': KEY("CheckImmHost", sys->check_imm_host, fread_number(fp)); KEY("CodeVersion", sys->cversion, fread_string_nohash(fp)); break; case 'D': KEY("Damplrvsplr", sys->dam_plr_vs_plr, fread_number(fp)); KEY("Damplrvsmob", sys->dam_plr_vs_mob, fread_number(fp)); KEY("Dammobvsplr", sys->dam_mob_vs_plr, fread_number(fp)); KEY("Dammobvsmob", sys->dam_mob_vs_mob, fread_number(fp)); KEY("Dodgemod", sys->dodge_mod, fread_number(fp)); break; case 'E': if (!str_cmp(word, "End")) { if (!sys->time_of_max) sys->time_of_max = str_dup("(not recorded)"); if (!sys->mud_name) sys->mud_name = str_dup("(Name Not Set)"); new_pfile_time_t = sys->purgetime; /* Samson 5-9-99 */ return; } KEY("Exp_Percent", sys->exp_percent, fread_number(fp)); break; case 'F': KEY("FirstRun", sys->firstrun, fread_number(fp)); KEY("Forcepc", sys->level_forcepc, fread_number(fp)); break; case 'G': KEY("GemVnum", sys->gem_vnum, fread_number(fp)); KEY("Gougepvp", sys->gouge_plr_vs_plr, fread_number(fp)); KEY("Gougenontank", sys->gouge_nontank, fread_number(fp)); KEY("Guildoverseer", sys->guild_overseer, fread_string(fp)); KEY("Guildadvisor", sys->guild_advisor, fread_string(fp)); break; case 'H': KEY("Highplayers", sys->alltimemax, fread_number(fp)); KEY("Highplayertime", sys->time_of_max, fread_string_nohash(fp)); break; case 'I': KEY("IdentTries", sys->ident_retries, fread_number(fp)); KEY("IMCMailVnum", sys->imc_mail_vnum, fread_number(fp)); break; case 'L': KEY("LastPortal", sys->last_portal, fread_number(fp)); KEY("LastTrap", sys->last_trap_uid, fread_number(fp)); KEY("LastInvTrap", sys->last_invtrap_uid, fread_number(fp)); KEY("LastPopCheck", sys->lastpopcheck, fread_number(fp)); KEY("LastResCheck", sys->lastrescheck, fread_number(fp)); KEY("LastTaxCheck", sys->lasttaxcheck, fread_number(fp)); KEY("Log", sys->log_level, fread_number(fp)); break; case 'M': KEY("MaxKingdom", sys->max_kingdom, fread_number(fp)); KEY("MorphOpt", sys->morph_opt, fread_number(fp)); KEY("Msetplayer", sys->level_mset_player, fread_number(fp)); KEY("MudName", sys->mud_name, fread_string_nohash(fp)); KEY("Muse", sys->muse_level, fread_number(fp)); KEY("MudVersion", sys->mversion, fread_string_nohash(fp)); KEY("MaxAccounts", sys->max_accounts, fread_number(fp)); KEY("MaxAccountChanges", sys->max_account_changes, fread_number(fp)); break; case 'N': KEY("Nameresolving", sys->NO_NAME_RESOLVING, fread_number(fp)); KEY("Newbie_purge", sys->newbie_purge, fread_number(fp)); break; case 'O': KEY("Overridepriv", sys->level_override_private, fread_number(fp)); break; case 'P': KEY("Parrymod", sys->parry_mod, fread_number(fp)); KEY("PetSave", sys->save_pets, fread_number(fp)); KEY("Protoflag", sys->level_modify_proto, fread_number(fp)); KEY("Purgetime", sys->purgetime, fread_number(fp)); /* Samson 5-9-99 */ break; case 'Q': KEY("Quest_item1", sys->quest_item1, fread_number(fp)); KEY("Quest_value1", sys->quest_value1, fread_number(fp)); KEY("Quest_item2", sys->quest_item2, fread_number(fp)); KEY("Quest_value2", sys->quest_value2, fread_number(fp)); KEY("Quest_item3", sys->quest_item3, fread_number(fp)); KEY("Quest_value3", sys->quest_value3, fread_number(fp)); KEY("Quest_item4", sys->quest_item4, fread_number(fp)); KEY("Quest_value4", sys->quest_value4, fread_number(fp)); KEY("Quest_item5", sys->quest_item5, fread_number(fp)); KEY("Quest_value5", sys->quest_value5, fread_number(fp)); KEY("Quest_item6", sys->quest_item6, fread_number(fp)); KEY("Quest_value6", sys->quest_value6, fread_number(fp)); KEY("Quest_item7", sys->quest_item7, fread_number(fp)); KEY("Quest_value7", sys->quest_value7, fread_number(fp)); KEY("Quest_item8", sys->quest_item8, fread_number(fp)); KEY("Quest_value8", sys->quest_value8, fread_number(fp)); KEY("Quest_item9", sys->quest_item9, fread_number(fp)); KEY("Quest_value9", sys->quest_value9, fread_number(fp)); KEY("Quest_item10", sys->quest_item10, fread_number(fp)); KEY("Quest_value10", sys->quest_value10, fread_number(fp)); KEY("Quest_item11", sys->quest_item11, fread_number(fp)); KEY("Quest_value11", sys->quest_value11, fread_number(fp)); KEY("Quest_item12", sys->quest_item12, fread_number(fp)); KEY("Quest_value12", sys->quest_value12, fread_number(fp)); case 'R': KEY("Readallmail", sys->read_all_mail, fread_number(fp)); KEY("Readmailfree", sys->read_mail_free, fread_number(fp)); KEY("Regular_purge", sys->regular_purge, fread_number(fp)); KEY("ResetGame", sys->resetgame, fread_number(fp)); break; case 'S': KEY("Startcalender", sys->start_calender, fread_number(fp)); KEY("Stunplrvsplr", sys->stun_plr_vs_plr, fread_number(fp)); KEY("Stunregular", sys->stun_regular, fread_number(fp)); KEY("Saveflags", sys->save_flags, fread_number(fp)); KEY("Stat_Gain", sys->stat_gain, fread_number(fp)); KEY("Savefreq", sys->save_frequency, fread_number(fp)); break; case 'T': KEY("Takeothersmail", sys->take_others_mail, fread_number(fp)); KEY("TimeoutLogin", sys->timeout_login, fread_number(fp)); KEY("TimeoutNotes", sys->timeout_notes, fread_number(fp)); KEY("TimeoutIdle", sys->timeout_idle, fread_number(fp)); KEY("Top_Gem_Num", sys->top_gem_num, fread_number(fp)); KEY("Think", sys->think_level, fread_number(fp)); if (!str_cmp(word, "Toadvance1")) { ln = fread_line(fp); for (y = 0; y <= MAX_GROUP-1; y++) { for (z = 0; z <= MAX_TIER-2; z++) { ln = one_argument(ln, arg); sys->toadvance[0][y][z] = atoi(arg); } } fMatch = TRUE; } if (!str_cmp(word, "Toadvance2")) { ln = fread_line(fp); for (y = 0; y <= MAX_GROUP-1; y++) { for (z = 0; z <= MAX_TIER-2; z++) { ln = one_argument(ln, arg); sys->toadvance[1][y][z] = atoi(arg); } } fMatch = TRUE; } if (!str_cmp(word, "Toadvance3")) { ln = fread_line(fp); for (y = 0; y <= MAX_GROUP-1; y++) { for (z = 0; z <= MAX_TIER-2; z++) { ln = one_argument(ln, arg); sys->toadvance[2][y][z] = atoi(arg); } } fMatch = TRUE; } if (!str_cmp(word, "Toadvance4")) { ln = fread_line(fp); for (y = 0; y <= MAX_GROUP-1; y++) { for (z = 0; z <= MAX_TIER-2; z++) { ln = one_argument(ln, arg); sys->toadvance[3][y][z] = atoi(arg); } } fMatch = TRUE; } if (!str_cmp(word, "Toadvance5")) { ln = fread_line(fp); for (y = 0; y <= MAX_GROUP-1; y++) { for (z = 0; z <= MAX_TIER-2; z++) { ln = one_argument(ln, arg); sys->toadvance[4][y][z] = atoi(arg); } } fMatch = TRUE; } KEY("TopPin", sys->top_pid, fread_number(fp)); KEY("TopKPin", sys->top_kpid, fread_number(fp)); KEY("TopTPin", sys->top_tpid, fread_number(fp)); KEY("Tumblemod", sys->tumble_mod, fread_number(fp)); break; case 'W': KEY("Waitforauth", sys->WAIT_FOR_AUTH, fread_number(fp)); KEY("Writemailfree", sys->write_mail_free, fread_number(fp)); break; } if (!fMatch) { bug("Fread_sysdata: no match: %s", word); } } } /* * Load the sysdata file */ bool load_systemdata(SYSTEM_DATA * sys) { char filename[MIL]; FILE *fp; bool found; found = FALSE; sprintf(filename, "%ssysdata.dat", SYSTEM_DIR); if ((fp = fopen(filename, "r")) != NULL) { found = TRUE; for (;;) { char letter; char *word; letter = fread_letter(fp); if (letter == '*') { fread_to_eol(fp); continue; } if (letter != '#') { bug("Load_sysdata_file: # not found."); break; } word = fread_word(fp); if (!str_cmp(word, "SYSTEM")) { fread_sysdata(sys, fp); break; } else if (!str_cmp(word, "END")) break; else { bug("Load_sysdata_file: bad section."); break; } } fclose(fp); } if (!sysdata.guild_overseer) sysdata.guild_overseer = STRALLOC(""); if (!sysdata.guild_advisor) sysdata.guild_advisor = STRALLOC(""); return found; } void load_watchlist(void) { WATCH_DATA *pwatch; FILE *fp; int number; CMDTYPE *cmd; if (!(fp = fopen(SYSTEM_DIR WATCH_LIST, "r"))) return; for (;;) { if (feof(fp)) { bug("Load_watchlist: no -1 found."); fclose(fp); return; } number = fread_number(fp); if (number == -1) { fclose(fp); return; } CREATE(pwatch, WATCH_DATA, 1); pwatch->imm_level = number; pwatch->imm_name = fread_string_nohash(fp); pwatch->target_name = fread_string_nohash(fp); if (strlen(pwatch->target_name) < 2) DISPOSE(pwatch->target_name); pwatch->player_site = fread_string_nohash(fp); if (strlen(pwatch->player_site) < 2) DISPOSE(pwatch->player_site); /* Check for command watches */ if (pwatch->target_name) for (cmd = command_hash[(int) pwatch->target_name[0]]; cmd; cmd = cmd->next) { if (!str_cmp(pwatch->target_name, cmd->name)) { SET_BIT(cmd->flags, CMD_WATCH); break; } } LINK(pwatch, first_watch, last_watch, next, prev); } } /* Check to make sure range of vnums is free - Scryn 2/27/96 */ void do_check_vnums(CHAR_DATA * ch, char *argument) { char buf[MSL]; char buf2[MSL]; AREA_DATA *pArea; char arg1[MSL]; char arg2[MSL]; bool room, mob, obj, all, area_conflict; int low_range, high_range; room = FALSE; mob = FALSE; obj = FALSE; all = FALSE; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (arg1[0] == '\0') { send_to_char("Please specify room, mob, object, or all as your first argument.\n\r", ch); return; } if (!str_cmp(arg1, "room")) room = TRUE; else if (!str_cmp(arg1, "mob")) mob = TRUE; else if (!str_cmp(arg1, "object")) obj = TRUE; else if (!str_cmp(arg1, "all")) all = TRUE; else { send_to_char("Please specify room, mob, or object as your first argument.\n\r", ch); return; } if (arg2[0] == '\0') { send_to_char("Please specify the low end of the range to be searched.\n\r", ch); return; } if (argument[0] == '\0') { send_to_char("Please specify the high end of the range to be searched.\n\r", ch); return; } low_range = atoi(arg2); high_range = atoi(argument); if (low_range < 1 || low_range > MAX_VNUM) { send_to_char("Invalid argument for bottom of range.\n\r", ch); return; } if (high_range < 1 || high_range > MAX_VNUM) { send_to_char("Invalid argument for top of range.\n\r", ch); return; } if (high_range < low_range) { send_to_char("Bottom of range must be below top of range.\n\r", ch); return; } if (all) { sprintf(buf, "room %d %d", low_range, high_range); do_check_vnums(ch, buf); sprintf(buf, "mob %d %d", low_range, high_range); do_check_vnums(ch, buf); sprintf(buf, "object %d %d", low_range, high_range); do_check_vnums(ch, buf); return; } set_char_color(AT_PLAIN, ch); for (pArea = first_asort; pArea; pArea = pArea->next_sort) { area_conflict = FALSE; if (IS_SET(pArea->status, AREA_DELETED)) continue; else if (room) { if (low_range < pArea->low_r_vnum && pArea->low_r_vnum < high_range) area_conflict = TRUE; if (low_range < pArea->hi_r_vnum && pArea->hi_r_vnum < high_range) area_conflict = TRUE; if ((low_range >= pArea->low_r_vnum) && (low_range <= pArea->hi_r_vnum)) area_conflict = TRUE; if ((high_range <= pArea->hi_r_vnum) && (high_range >= pArea->low_r_vnum)) area_conflict = TRUE; } if (mob) { if (low_range < pArea->low_m_vnum && pArea->low_m_vnum < high_range) area_conflict = TRUE; if (low_range < pArea->hi_m_vnum && pArea->hi_m_vnum < high_range) area_conflict = TRUE; if ((low_range >= pArea->low_m_vnum) && (low_range <= pArea->hi_m_vnum)) area_conflict = TRUE; if ((high_range <= pArea->hi_m_vnum) && (high_range >= pArea->low_m_vnum)) area_conflict = TRUE; } if (obj) { if (low_range < pArea->low_o_vnum && pArea->low_o_vnum < high_range) area_conflict = TRUE; if (low_range < pArea->hi_o_vnum && pArea->hi_o_vnum < high_range) area_conflict = TRUE; if ((low_range >= pArea->low_o_vnum) && (low_range <= pArea->hi_o_vnum)) area_conflict = TRUE; if ((high_range <= pArea->hi_o_vnum) && (high_range >= pArea->low_o_vnum)) area_conflict = TRUE; } if (area_conflict) { sprintf(buf, "Conflict:%-15s| ", (pArea->filename ? pArea->filename : "(invalid)")); if (room) sprintf(buf2, "Rooms: %5d - %-5d\n\r", pArea->low_r_vnum, pArea->hi_r_vnum); if (mob) sprintf(buf2, "Mobs: %5d - %-5d\n\r", pArea->low_m_vnum, pArea->hi_m_vnum); if (obj) sprintf(buf2, "Objects: %5d - %-5d\n\r", pArea->low_o_vnum, pArea->hi_o_vnum); strcat(buf, buf2); send_to_char(buf, ch); } } for (pArea = first_bsort; pArea; pArea = pArea->next_sort) { area_conflict = FALSE; if (IS_SET(pArea->status, AREA_DELETED)) continue; else if (room) { if (low_range < pArea->low_r_vnum && pArea->low_r_vnum < high_range) area_conflict = TRUE; if (low_range < pArea->hi_r_vnum && pArea->hi_r_vnum < high_range) area_conflict = TRUE; if ((low_range >= pArea->low_r_vnum) && (low_range <= pArea->hi_r_vnum)) area_conflict = TRUE; if ((high_range <= pArea->hi_r_vnum) && (high_range >= pArea->low_r_vnum)) area_conflict = TRUE; } if (mob) { if (low_range < pArea->low_m_vnum && pArea->low_m_vnum < high_range) area_conflict = TRUE; if (low_range < pArea->hi_m_vnum && pArea->hi_m_vnum < high_range) area_conflict = TRUE; if ((low_range >= pArea->low_m_vnum) && (low_range <= pArea->hi_m_vnum)) area_conflict = TRUE; if ((high_range <= pArea->hi_m_vnum) && (high_range >= pArea->low_m_vnum)) area_conflict = TRUE; } if (obj) { if (low_range < pArea->low_o_vnum && pArea->low_o_vnum < high_range) area_conflict = TRUE; if (low_range < pArea->hi_o_vnum && pArea->hi_o_vnum < high_range) area_conflict = TRUE; if ((low_range >= pArea->low_o_vnum) && (low_range <= pArea->hi_o_vnum)) area_conflict = TRUE; if ((high_range <= pArea->hi_o_vnum) && (high_range >= pArea->low_o_vnum)) area_conflict = TRUE; } if (area_conflict) { sprintf(buf, "Conflict:%-15s| ", (pArea->filename ? pArea->filename : "(invalid)")); if (room) sprintf(buf2, "Rooms: %5d - %-5d\n\r", pArea->low_r_vnum, pArea->hi_r_vnum); if (mob) sprintf(buf2, "Mobs: %5d - %-5d\n\r", pArea->low_m_vnum, pArea->hi_m_vnum); if (obj) sprintf(buf2, "Objects: %5d - %-5d\n\r", pArea->low_o_vnum, pArea->hi_o_vnum); strcat(buf, buf2); send_to_char(buf, ch); } } /* for ( pArea = first_asort; pArea; pArea = pArea->next_sort ) { area_conflict = FALSE; if ( IS_SET( pArea->status, AREA_DELETED ) ) continue; else if (room) if((pArea->low_r_vnum >= low_range) && (pArea->hi_r_vnum <= high_range)) area_conflict = TRUE; if (mob) if((pArea->low_m_vnum >= low_range) && (pArea->hi_m_vnum <= high_range)) area_conflict = TRUE; if (obj) if((pArea->low_o_vnum >= low_range) && (pArea->hi_o_vnum <= high_range)) area_conflict = TRUE; if (area_conflict) ch_printf(ch, "Conflict:%-15s| Rooms: %5d - %-5d" " Objs: %5d - %-5d Mobs: %5d - %-5d\n\r", (pArea->filename ? pArea->filename : "(invalid)"), pArea->low_r_vnum, pArea->hi_r_vnum, pArea->low_o_vnum, pArea->hi_o_vnum, pArea->low_m_vnum, pArea->hi_m_vnum ); } for ( pArea = first_bsort; pArea; pArea = pArea->next_sort ) { area_conflict = FALSE; if ( IS_SET( pArea->status, AREA_DELETED ) ) continue; else if (room) if((pArea->low_r_vnum >= low_range) && (pArea->hi_r_vnum <= high_range)) area_conflict = TRUE; if (mob) if((pArea->low_m_vnum >= low_range) && (pArea->hi_m_vnum <= high_range)) area_conflict = TRUE; if (obj) if((pArea->low_o_vnum >= low_range) && (pArea->hi_o_vnum <= high_range)) area_conflict = TRUE; if (area_conflict) sprintf(ch, "Conflict:%-15s| Rooms: %5d - %-5d" " Objs: %5d - %-5d Mobs: %5d - %-5d\n\r", (pArea->filename ? pArea->filename : "(invalid)"), pArea->low_r_vnum, pArea->hi_r_vnum, pArea->low_o_vnum, pArea->hi_o_vnum, pArea->low_m_vnum, pArea->hi_m_vnum ); } */ return; } /* * This function is here to aid in debugging. * If the last expression in a function is another function call, * gcc likes to generate a JMP instead of a CALL. * This is called "tail chaining." * It hoses the debugger call stack for that call. * So I make this the last call in certain critical functions, * where I really need the call stack to be right for debugging! * * If you don't understand this, then LEAVE IT ALONE. * Don't remove any calls to tail_chain anywhere. * * -- Furey */ void tail_chain(void) { return; } /* * Load weather data from appropriate file in system dir * Last Modified: July 24, 1997 * Fireblade */ bool load_weatherdata() { char filename[MIL]; FILE *fp; FRONT_DATA *fnt; TORNADO_DATA *torn; bool fMatch; sprintf(filename, "%sweather.dat", SYSTEM_DIR); if ((fp = fopen(filename, "r")) != NULL) { for (;;) { char letter; char *word; letter = fread_letter(fp); if (letter != '#') { bug("load_weatherdata: # not found"); return FALSE; } word = fread_word(fp); if (!str_cmp(word, "FRONT")) { CREATE(fnt, FRONT_DATA, 1); for (;;) { word = feof(fp) ? "End" : fread_word(fp); switch (UPPER(word[0])) { case '*': fMatch = TRUE; fread_to_eol(fp); break; case 'M': KEY("Map", fnt->map, fread_number(fp)); break; case 'S': KEY("Size", fnt->size, fread_number(fp)); KEY("Speed", fnt->speed, fread_number(fp)); break; case 'T': KEY("Type", fnt->type, fread_number(fp)); KEY("Typec", fnt->typec, fread_number(fp)); break; case 'X': KEY("X", fnt->x, fread_number(fp)); break; case 'Y': KEY("Y", fnt->y, fread_number(fp)); break; } if (!str_cmp(word, "End")) { int ttype; int cnt; ttype = fnt->typec; //Creates 8 different kinds, produces slightly different angles. for (cnt = 0; cnt < 30; cnt++) fnt->f[cnt] = -1; for (cnt = 0; cnt < fnt->size; cnt++) { fnt->f[cnt] = front_cr[ttype][cnt]; } LINK(fnt, first_front, last_front, next, prev); break; } } } else if (!str_cmp(word, "TORNADO")) { CREATE(torn, TORNADO_DATA, 1); for (;;) { word = feof(fp) ? "End" : fread_word(fp); switch (UPPER(word[0])) { case '*': fMatch = TRUE; fread_to_eol(fp); break; case 'D': KEY("Dir", torn->power, fread_number(fp)); break; case 'M': KEY("Map", torn->map, fread_number(fp)); break; case 'P': KEY("Power", torn->power, fread_number(fp)); break; case 'T': KEY("Turns", torn->turns, fread_number(fp)); break; case 'X': KEY("X", torn->x, fread_number(fp)); break; case 'Y': KEY("Y", torn->y, fread_number(fp)); break; } if (!str_cmp(word, "End")) { LINK(torn, first_tornado, last_tornado, next, prev); break; } } } else if (!str_cmp(word, "END")) { fclose(fp); return TRUE; } else { bug("load_weatherdata: unknown field"); fclose(fp); break; } } } else return FALSE; return FALSE; } /* * Write data for global weather parameters * Last Modified: July 24, 1997 * Fireblade */ void save_weatherdata() { char filename[MIL]; FILE *fp; FRONT_DATA *frt; TORNADO_DATA *torn; sprintf(filename, "%sweather.dat", SYSTEM_DIR); if ((fp = fopen(filename, "w")) != NULL) { for (frt = first_front; frt; frt = frt->next) { fprintf(fp, "#FRONT\n"); fprintf(fp, "X %d\n", frt->x); fprintf(fp, "Y %d\n", frt->y); fprintf(fp, "Map %d\n", frt->map); fprintf(fp, "Speed %d\n", frt->speed); fprintf(fp, "Size %d\n", frt->size); fprintf(fp, "Type %d\n", frt->type); fprintf(fp, "Typec %d\n", frt->typec); fprintf(fp, "End\n\n"); } for (torn = first_tornado; torn; torn = torn->next) { fprintf(fp, "#TORNADO\n"); fprintf(fp, "X %d\n", torn->x); fprintf(fp, "Y %d\n", torn->y); fprintf(fp, "Map %d\n", torn->map); fprintf(fp, "Power %d\n", torn->power); fprintf(fp, "Turns %d\n", torn->turns); fprintf(fp, "Dir %d\n", torn->dir); fprintf(fp, "End\n\r"); } fprintf(fp, "\n#END\n"); fclose(fp); } else { bug("save_weatherdata: could not open file"); } return; } void load_projects(void) /* Copied load_boards structure for simplicity */ { char filename[MIL]; FILE *fp; PROJECT_DATA *project; first_project = NULL; last_project = NULL; sprintf(filename, "%s", PROJECTS_FILE); if ((fp = fopen(filename, "r")) == NULL) return; while ((project = read_project(filename, fp)) != NULL) LINK(project, first_project, last_project, next, prev); return; } PROJECT_DATA *read_project(char *filename, FILE * fp) { PROJECT_DATA *project; NOTE_DATA *log, *tlog; char *word; char buf[MSL]; bool fMatch; char letter; do { letter = getc(fp); if (feof(fp)) { fclose(fp); return NULL; } } while (isspace(letter)); ungetc(letter, fp); CREATE(project, PROJECT_DATA, 1); #ifdef KEY #undef KEY #endif #define KEY( literal, field, value ) \ if ( !str_cmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } project->first_log = NULL; project->last_log = NULL; project->next = NULL; project->prev = NULL; project->coder = NULL; project->description = STRALLOC(""); project->name = STRALLOC(""); project->owner = STRALLOC(""); project->date = STRALLOC("Not Set?!"); project->status = STRALLOC("No update."); project->rewardee = STRALLOC("None"); for (;;) { word = feof(fp) ? "End" : fread_word(fp); fMatch = FALSE; switch (UPPER(word[0])) { case '*': fMatch = TRUE; fread_to_eol(fp); break; case 'C': KEY("Coder", project->coder, fread_string_nohash(fp)); break; case 'D': if (!str_cmp(word, "Date")) STRFREE(project->date); else if (!str_cmp(word, "Description")) STRFREE(project->description); KEY("Date", project->date, fread_string(fp)); KEY("Description", project->description, fread_string(fp)); break; case 'E': if (!str_cmp(word, "End")) { if (!project->description) project->description = STRALLOC(""); if (!project->name) project->name = STRALLOC(""); if (!project->owner) project->owner = STRALLOC(""); if (!project->date) project->date = STRALLOC("Not Set?!"); if (!project->status) project->status = STRALLOC("No update."); if (str_cmp(project->owner, "None")) project->taken = TRUE; return project; } break; case 'L': if (!str_cmp(word, "Log")) { fread_to_eol(fp); log = read_log(fp); if (!log) { sprintf(buf, "read_project: couldn't read log, aborting"); bug(buf, 0); exit(1); } if (!log->sender) log->sender = STRALLOC(""); if (!log->date) log->date = STRALLOC(""); if (!log->subject) log->subject = STRALLOC("None"); log->to_list = STRALLOC(""); LINK(log, project->first_log, project->last_log, next, prev); fMatch = TRUE; break; } break; case 'N': if (!str_cmp(word, "Name")) STRFREE(project->name); KEY("Name", project->name, fread_string_nohash(fp)); break; case 'O': if (!str_cmp(word, "Owner")) STRFREE(project->owner); KEY("Owner", project->owner, fread_string(fp)); break; case 'P': KEY("Points", project->points, fread_number(fp)); break; case 'R': if (!str_cmp(word, "Rewardee")) STRFREE(project->rewardee); KEY("Rewardee", project->rewardee, fread_string(fp)); KEY("Rewardedpoints", project->rewardedpoints, fread_number(fp)); break; case 'S': if (!str_cmp(word, "Status")) STRFREE(project->status); KEY("Status", project->status, fread_string(fp)); break; case 'T': KEY("Time", project->time, fread_number(fp)); KEY("Type", project->type, fread_number(fp)); break; } if (!fMatch) { sprintf(buf, "read_project: no match: %s", word); bug(buf, 0); } } log = project->last_log; while (log) { UNLINK(log, project->first_log, project->last_log, next, prev); tlog = log->prev; free_note(log); log = tlog; } if (project->coder) DISPOSE(project->coder); if (project->description) STRFREE(project->description); if (project->name) STRFREE(project->name); if (project->owner) STRFREE(project->owner); if (project->date) STRFREE(project->date); if (project->status) STRFREE(project->status); if (project->rewardee) STRFREE(project->rewardee); DISPOSE(project); return project; } NOTE_DATA *read_log(FILE * fp) { NOTE_DATA *log; char *word; CREATE(log, NOTE_DATA, 1); for (;;) { word = fread_word(fp); if (!str_cmp(word, "Sender")) log->sender = fread_string(fp); else if (!str_cmp(word, "Date")) log->date = fread_string(fp); else if (!str_cmp(word, "Subject")) log->subject = fread_string(fp); else if (!str_cmp(word, "Text")) log->text = fread_string(fp); else if (!str_cmp(word, "Endlog")) { fread_to_eol(fp); log->next = NULL; log->prev = NULL; return log; } else { DISPOSE(log); bug("read_log: bad key word.", 0); return NULL; } } } void write_projects() { PROJECT_DATA *project; NOTE_DATA *log; FILE *fpout; char filename[MIL]; sprintf(filename, "%s", PROJECTS_FILE); fpout = fopen(filename, "w"); if (!fpout) { bug("FATAL: cannot open projects.txt for writing!\n\r", 0); return; } for (project = first_project; project; project = project->next) { fprintf(fpout, "Name %s~\n", project->name); fprintf(fpout, "Owner %s~\n", (project->owner) ? project->owner : "None"); if (project->coder) fprintf(fpout, "Coder %s~\n", project->coder); fprintf(fpout, "Type %d\n", project->type); fprintf(fpout, "Time %d\n", project->time); fprintf(fpout, "Status %s~\n", (project->status) ? project->status : "No update."); fprintf(fpout, "Date %s~\n", (project->date) ? project->date : "Not Set?!?"); fprintf(fpout, "Rewardee %s~\n", (project->rewardee) ? project->rewardee : "None"); fprintf(fpout, "Points %d\n", project->points); fprintf(fpout, "Rewardedpoints %d\n", project->rewardedpoints); if (project->description) fprintf(fpout, "Description %s~\n", project->description); for (log = project->first_log; log; log = log->next) fprintf(fpout, "Log\nSender %s~\nDate %s~\nSubject %s~\nText %s~\nEndlog\n", log->sender, log->date, log->subject, log->text); fprintf(fpout, "End\n"); } fclose(fpout); }