/*--------------------------------------------------------------------------* * ** WolfPaw 3.0 ** * *--------------------------------------------------------------------------* * WolfPaw 3.0 (c) 1997 - 1999 by Dale Corse * *--------------------------------------------------------------------------* * The WolfPaw Coding Team is headed by: Greywolf * * With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag * * Scryn, Thoric, Justice, Tricops and Brogar. * *--------------------------------------------------------------------------* * Based on SMAUG 1.2a. Copyright 1994 - 1996 by Derek Snider * * SMAUG Coding Team: Thoric, Altrag, Blodkai, Narn, Haus, Scryn, Rennard, * * Swordbearer, Gorog, Grishnakh and Tricops. * *--------------------------------------------------------------------------* * Merc 2.1 Diku MUD Improvments (C) 1992 - 1993 by Michael Chastain, * * Michael Quan, and Michael Tse. * * Original Diku MUD (C) 1990 - 1991 by Sebastian Hammer, Michael Seifert, * * Hans Hendrik Strfeldt, 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 <unistd.h> #include <sys/stat.h> #include <sys/dir.h> #include "mud.h" extern int _filbuf args( (FILE *) ); #if defined(KEY) #undef KEY #endif void init_supermob(); void inroom_update(void); #define KEY( literal, field, value ) \ if ( !str_cmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } /* * Globals. */ ZONE_DATA * zone_pointer; WEB_DESCRIPTOR *first_webdesc; WEB_DESCRIPTOR *last_webdesc; int top_web_desc; WIZENT * first_wiz; WIZENT * last_wiz; bool mudlog_off; time_t last_restore_all_time = 0; HELP_DATA * first_help; HELP_DATA * last_help; SHOP_DATA * first_shop; SHOP_DATA * last_shop; REPAIR_DATA * first_repair; REPAIR_DATA * last_repair; TELEPORT_DATA * first_teleport; TELEPORT_DATA * last_teleport; OBJ_DATA * extracted_obj_queue; EXTRACT_CHAR_DATA * extracted_char_queue; char bug_buf [2*MAX_INPUT_LENGTH]; CHAR_DATA * first_char; CHAR_DATA * last_char; char * help_greeting[3]; char * first_greeting; char log_buf [2*MAX_INPUT_LENGTH]; SECURE_DATA * first_secure; SECURE_DATA * last_secure; REFFERAL_DATA * first_refferal; REFFERAL_DATA * last_refferal; PETITION_DATA * first_petition; PETITION_DATA * last_petition; MAIL_DATA * first_mail; MAIL_DATA * last_mail; ZONE_DATA * first_zone; ZONE_DATA * last_zone; /* Commented out by Greywolf, zones dont use these.*/ /*OBJ_DATA * first_object; OBJ_DATA * last_object;*/ TIME_INFO_DATA time_info; WEATHER_DATA weather_info; TOPTEN_DATA * first_topten; TOPTEN_DATA * last_topten; bool TOPTEN_ACTIVE=FALSE; bool MAIM_DEATH; long lowest_toptens[10]; int cur_qobjs; int cur_qchars; int nummobsloaded; int numobjsloaded; int physicalobjects; bool ALIENS_RAN; bool WEBSERVER_STATUS; bool DRAGONS_RAN; bool FORCE_DRAGON_RUN; bool EMAIL_AUTH; MAP_INDEX_DATA * first_map; /* maps */ AUCTION_DATA * auction; /* auctions */ FILE * fpLOG; FILE * fpMem; /* weaponry */ sh_int gsn_pugilism; sh_int gsn_long_blades; sh_int gsn_short_blades; sh_int gsn_flexible_arms; sh_int gsn_talonous_arms; sh_int gsn_bludgeons; sh_int gsn_missile_weapons; /* 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; /* thief & warrior */ sh_int gsn_disarm; sh_int gsn_enhanced_damage; sh_int gsn_kick; sh_int gsn_parry; sh_int gsn_rescue; sh_int gsn_second_attack; sh_int gsn_third_attack; sh_int gsn_fourth_attack; sh_int gsn_fifth_attack; sh_int gsn_sixth_attack; sh_int gsn_seventh_attack; sh_int gsn_dual_wield; sh_int gsn_punch; sh_int gsn_bash; sh_int gsn_stun; sh_int gsn_bashdoor; sh_int gsn_grip; sh_int gsn_berserk; sh_int gsn_hitall; /* vampire */ sh_int gsn_feed; /* other */ sh_int gsn_aid; sh_int gsn_track; sh_int gsn_search; sh_int gsn_dig; sh_int gsn_mount; sh_int gsn_bite; sh_int gsn_claw; sh_int gsn_sting; sh_int gsn_tail; sh_int gsn_scribe; sh_int gsn_brew; sh_int gsn_climb; sh_int gsn_scan; sh_int gsn_slice; /* archmage */ sh_int gsn_ancient_lore; /* adept */ sh_int gsn_assassinate; /* spells */ 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_possess; sh_int gsn_fireball; sh_int gsn_chill_touch; sh_int gsn_lightning_bolt; sh_int gsn_reflect_magic; /* 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; sh_int gsn_vampiric; sh_int gsn_wolfish; sh_int gsn_draconian; sh_int gsn_satyr; sh_int gsn_wraith; sh_int gsn_centaur; sh_int gsn_drider; sh_int gsn_drowish; sh_int gsn_minotaur; sh_int gsn_cyclops; sh_int gsn_arewyndel; sh_int gsn_brownie; sh_int gsn_leprachaun; sh_int gsn_mrrshan; /* 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; int top_zone; /* * Locals. */ /* Same Here, zone doesnt use these --GW*/ /*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];*/ WARRENT_DATA * first_warrent; WARRENT_DATA * last_warrent; KOMBAT_DATA * kombat; CHALLENGE_DATA * first_challenge; CHALLENGE_DATA * last_challenge; ARENA_DATA * first_arena; ARENA_DATA * last_arena; AREA_DATA * first_area; AREA_DATA * last_area; 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_zone; 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 chaos; /* CHAOS (FREE PKILL) on/off */ int doubleexp; /*double EXP*/ int war; /*WAR MODE ON/OFF*/ sh_int PULSE_PER_SECOND; bool TURBO_FIGHT; int TURBO_NUM; bool noenforce; sh_int dam_no_msg; bool DRAGON_DROP; long CASINO_BANK; extern bool CR; char BOOTED_BY[MSL]; char BOOT_TIME[MSL]; char COMPILED_TIME[MSL]; char COMPILED_BY[MSL]; char MUD_VERSION[MSL]; char VERSNUM[MSL]; bool ENABLE_DEATH_CRY; extern bool skip_locker; /* * Semi-locals. */ bool fBootDb; FILE * fpArea; char strArea[MAX_INPUT_LENGTH]; /* * Local booting procedures. */ void init_mm args( ( void ) ); void load_mail args( ( void ) ); void load_zone_file args( ( ZONE_DATA *tzone, char *filename ) ); void boot_log args( ( const char *str, ... ) ); void load_area args( ( 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_zone args( ( AREA_DATA *tarea, FILE *fp ) ); /* zone */ 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_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_vehicles args( ( AREA_DATA *tarea, FILE *fp ) ); void load_ranges args( ( AREA_DATA *tarea, FILE *fp ) ); void load_buildlist args( ( void ) ); bool load_systemdata args( ( SYSTEM_DATA *sys ) ); void load_banlist args( ( void ) ); void initialize_economy args( ( void ) ); void fix_exits args( ( void ) ); void load_refferals args( ( void ) ); void clean_pfiles args( ( void ) ); void clean_lfiles args( ( void ) ); AREA_DATA * find_room_area args( ( int vnum ) ); AREA_DATA * find_obj_area args( ( int vnum ) ); AREA_DATA * find_mob_area args( ( int vnum ) ); /* * External booting function */ void load_corpses args( ( void ) ); void renumber_put_resets args( ( AREA_DATA *pArea ) ); void init_kombat args( ( void ) ); void init_challenge args( ( void ) ); void init_arenas args( ( void ) ); void load_races args( ( void ) ); void make_web_wizlist args( ( void ) ); void init_security args( ( void ) ); void load_imps args( ( void ) ); void load_mud_version( void ); void load_compile_data( void ); void load_boot_data( void ); void pk_list_cleaner( void ); void overlimit_msg( void ); void show_overlimit( CHAR_DATA *ch ); void init_upstat( void ); /* * 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) ); char last_function_call [MSL]; /* Last Function Call Buffer */ void examine_last_command () { FILE *fp=NULL; FILE *fp2=NULL; FILE *fp3=NULL; char buf [MSL]; char buf2 [MSL]; char text [MSL]; char * strtime; char sender[MSL]; char date[MSL]; fp2 = fopen (LAST_FUNCTION_FILE, "r" ); if (!fp2) return; fscanf (fp2, "%[^\n]", buf2); new_fclose (fp2); unlink (LAST_FUNCTION_FILE); fp = fopen (LAST_COMMAND_FILE, "r"); if (!fp) return; fscanf (fp, "%[^\n]", buf); new_fclose (fp); unlink (LAST_COMMAND_FILE); strtime = ctime( ¤t_time ); strtime[strlen(strtime)-1] = '\0'; strcpy(date,strtime); strcpy(sender,"CrashLog"); strcpy(text,buf); if ( ( fp3 = fopen( CRASH_FILE, "a" ) ) == NULL ) { bug("Cannot Open CrashLog File!",0); perror( DIARY_FILE ); } else { fprintf( fp3, "[%s] %-10s:\n[****] LAST COMMAND BEFORE CRASH [****]\n%s\n", date, sender, buf ); fprintf( fp3, "**** LAST FUNCTION CALLED WAS ****\n%s", buf2 ); new_fclose( fp3 ); } } void shutdown_mud( char *reason ) { FILE *fp; char buf[MSL]; if ( (fp = fopen( SHUTDOWN_FILE, "a" )) != NULL ) { fprintf( fp, "%s\n", reason ); new_fclose( fp ); } sprintf(buf,"MUD SHUTTING DOWN: %s",reason); log_string(buf); } /* * Big mama top level function. */ void boot_db( bool fCopyOver ) { sh_int wear, x; ZONE_DATA * zone; char zone_buf[MSL]; DIR *dp; extern bool DISABLE_LIMIT_SCAN; show_hash( 32 ); unlink( BOOTLOG_FILE ); unlink( BUG_FILE ); unlink( MUDLOG_FILE ); mudlog_off = TRUE; load_limited_toggle(TRUE); boot_log( "---------------------[ Boot Log ]--------------------" ); log_string( "Loading commands" ); load_commands(); log_string( "Loading sysdata configuration..." ); /* default values */ sysdata.read_all_mail = LEVEL_GOD; sysdata.read_mail_free = LEVEL_IMMORTAL; sysdata.write_mail_free = LEVEL_IMMORTAL; sysdata.take_others_mail = LEVEL_GOD; sysdata.imc_mail_vnum = 0; sysdata.muse_level = LEVEL_HYPERION; sysdata.think_level = LEVEL_HEAD_GOD; sysdata.build_level = LEVEL_FATE; sysdata.log_level = LEVEL_LOG; sysdata.level_modify_proto = LEVEL_GOD; sysdata.level_override_private = LEVEL_GOD; sysdata.level_mset_player = LEVEL_GOD; sysdata.stun_plr_vs_plr = 65; sysdata.stun_regular = 15; sysdata.max_hp = 1500; sysdata.max_mana = 2500; sysdata.maxaward = 500; sysdata.segvio = 0; sysdata.webserv = 1; 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.level_getobjnotake = LEVEL_FATE; sysdata.save_frequency = 20; /* minutes */ sysdata.save_flags = SV_DEATH | SV_PASSCHG | SV_AUTO | SV_PUT | SV_DROP | SV_GIVE | SV_AUCTION | SV_ZAPDROP | SV_IDLE; sysdata.first_approve = NULL; sysdata.last_approve = NULL; if ( !load_systemdata(&sysdata) ) { log_string( "Not found. Creating new configuration." ); sysdata.alltimemax = 0; } /* New DB Loader --GW */ load_main_db(); 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; log_string("Loading classes"); load_classes(); log_string("Loading races"); load_races(); log_string("Loading herb table"); load_herb_table(); log_string("Making wizlist"); make_wizlist(); log_string("Making Web Wizlist"); make_web_wizlist(); log_string("Loading Mail"); first_mail = NULL; last_mail = NULL; load_mail(); /* Never Used anyway --GW * log_string("Loading Refferals"); * first_refferal = NULL; * last_refferal = NULL; * load_refferals(); */ log_string("Initializing Kombat..."); init_kombat( ); log_string("Initializing Challenge..."); init_challenge( ); log_string("Initializing Arena(s)..."); init_arenas( ); log_string("Initializing Stocks..."); setup_shares(); log_string("Setting up TopTen.."); topten_setup(); log_string("Initializing request pipe"); init_request_pipe(); fBootDb = TRUE; CR = FALSE; war = 0; /* OFF is GOOD --GW */ doubleexp = 0; /* Double EXP off at reboot time =) GW */ chaos = 0; /* Chaos off at reboot is a good thing ... */ dam_no_msg = 0; skip_locker = FALSE; TURBO_FIGHT = FALSE; /* TURBO FIGHTING SPEED OFF .. GW */ TURBO_NUM = 4; /* 4 is normal */ WEBSERVER_STATUS = FALSE; noenforce = FALSE; /* Enforce Laws! HELL YES! --GW */ DRAGON_DROP = TRUE; /* Dragon Dropping On! --GW */ MAIM_DEATH = FALSE; ENABLE_DEATH_CRY = TRUE; /* Death Cry Switch */ nummobsloaded = 0; numobjsloaded = 0; physicalobjects = 0; sysdata.maxplayers = 0; sysdata.logins = 0; first_zone = NULL; last_zone = NULL; first_char = NULL; last_char = NULL; first_area = NULL; last_area = NULL; first_build = NULL; last_area = NULL; first_shop = NULL; last_shop = NULL; first_repair = NULL; last_repair = NULL; first_teleport = NULL; last_teleport = NULL; first_asort = NULL; last_asort = NULL; extracted_obj_queue = NULL; extracted_char_queue= NULL; cur_qobjs = 0; cur_qchars = 0; 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; CREATE( auction, AUCTION_DATA, 1); auction->item = NULL; 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. */ { long lhour, lday, lmonth; log_string("Setting time and weather"); lhour = (current_time - 650336715) / (PULSE_TICK / PULSE_PER_SECOND); time_info.hour = lhour % 24; lday = lhour / 24; time_info.day = lday % 35; lmonth = lday / 35; time_info.month = lmonth % 17; time_info.year = lmonth / 17; if ( time_info.hour < 5 ) weather_info.sunlight = SUN_DARK; else if ( time_info.hour < 6 ) weather_info.sunlight = SUN_RISE; else if ( time_info.hour < 19 ) weather_info.sunlight = SUN_LIGHT; else if ( time_info.hour < 20 ) weather_info.sunlight = SUN_SET; else weather_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_pugilism, "pugilism" ); ASSIGN_GSN( gsn_long_blades, "long blades" ); ASSIGN_GSN( gsn_short_blades, "short blades" ); ASSIGN_GSN( gsn_flexible_arms, "flexible arms" ); ASSIGN_GSN( gsn_talonous_arms, "talonous arms" ); ASSIGN_GSN( gsn_bludgeons, "bludgeons" ); ASSIGN_GSN( gsn_missile_weapons,"missile weapons" ); ASSIGN_GSN( gsn_detrap, "detrap" ); ASSIGN_GSN( gsn_backstab, "backstab" ); ASSIGN_GSN( gsn_assassinate, "assassinate" ); ASSIGN_GSN( gsn_circle, "circle" ); ASSIGN_GSN( gsn_dodge, "dodge" ); ASSIGN_GSN( gsn_hide, "hide" ); 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_kick, "kick" ); ASSIGN_GSN( gsn_parry, "parry" ); ASSIGN_GSN( gsn_rescue, "rescue" ); ASSIGN_GSN( gsn_second_attack, "second attack" ); ASSIGN_GSN( gsn_third_attack, "third attack" ); ASSIGN_GSN( gsn_fourth_attack, "fourth attack" ); ASSIGN_GSN( gsn_fifth_attack, "fifth attack" ); ASSIGN_GSN( gsn_sixth_attack, "sixth attack" ); ASSIGN_GSN( gsn_seventh_attack, "seventh attack" ); ASSIGN_GSN( gsn_dual_wield, "dual wield" ); ASSIGN_GSN( gsn_punch, "punch" ); ASSIGN_GSN( gsn_bash, "bash" ); ASSIGN_GSN( gsn_stun, "stun" ); ASSIGN_GSN( gsn_bashdoor, "doorbash" ); ASSIGN_GSN( gsn_grip, "grip" ); ASSIGN_GSN( gsn_berserk, "berserk" ); ASSIGN_GSN( gsn_hitall, "hitall" ); ASSIGN_GSN( gsn_feed, "feed" ); ASSIGN_GSN( gsn_ancient_lore, "ancient lore" ); ASSIGN_GSN( gsn_aid, "aid" ); ASSIGN_GSN( gsn_track, "track" ); ASSIGN_GSN( gsn_search, "search" ); ASSIGN_GSN( gsn_dig, "dig" ); ASSIGN_GSN( gsn_mount, "mount" ); ASSIGN_GSN( gsn_bite, "bite" ); ASSIGN_GSN( gsn_claw, "claw" ); ASSIGN_GSN( gsn_sting, "sting" ); ASSIGN_GSN( gsn_tail, "tail" ); ASSIGN_GSN( gsn_scribe, "scribe" ); ASSIGN_GSN( gsn_brew, "brew" ); ASSIGN_GSN( gsn_climb, "climb" ); ASSIGN_GSN( gsn_scan, "scan" ); ASSIGN_GSN( gsn_slice, "slice" ); ASSIGN_GSN( gsn_reflect_magic, "reflect magic" ); ASSIGN_GSN( gsn_fireball, "fireball" ); ASSIGN_GSN( gsn_chill_touch, "chill touch" ); ASSIGN_GSN( gsn_lightning_bolt, "lightning bolt" ); ASSIGN_GSN( gsn_aqua_breath, "aqua breath" ); 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_sleep, "sleep" ); ASSIGN_GSN( gsn_possess, "possess" ); 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" ); ASSIGN_GSN( gsn_vampiric, "vampiric" ); ASSIGN_GSN( gsn_wolfish, "wolfish" ); ASSIGN_GSN( gsn_draconian, "draconian" ); ASSIGN_GSN( gsn_satyr, "satyr" ); ASSIGN_GSN( gsn_wraith, "wraith" ); ASSIGN_GSN( gsn_centaur, "centaur" ); ASSIGN_GSN( gsn_drider, "drider" ); ASSIGN_GSN( gsn_drowish, "drowish" ); ASSIGN_GSN( gsn_minotaur, "minotaur" ); ASSIGN_GSN( gsn_cyclops, "cyclops" ); ASSIGN_GSN( gsn_arewyndel, "arewyndel" ); ASSIGN_GSN( gsn_brownie, "brownie" ); ASSIGN_GSN( gsn_leprachaun, "leprachaun" ); ASSIGN_GSN( gsn_mrrshan, "mrrshan" ); } /* * Read in all the area files. */ { FILE *fpList; top_zone = 0; log_string("Reading in zones..."); if ( ( fpList = fopen( ZONE_LIST, "r" ) ) == NULL ) { perror( ZONE_LIST ); shutdown_mud( "Unable to open zone list" ); exit( 1 ); } for ( ; ; ) { strcpy( strArea, fread_word( fpList ) ); if ( strArea[0] == '$' ) break; load_zone_file( last_zone, strArea ); } new_fclose( fpList ); } for ( zone = first_zone; zone; zone = zone->next ) { sprintf(zone_buf,"zone%d",zone->number); zone_pointer = zone; zone->first_obj = NULL; zone->last_obj = NULL; zone->first_mob = NULL; zone->last_mob = NULL; if ( !(dp = opendir(zone_buf)) ) { bug( "Load_Zones: can't open %s", zone_buf); perror(zone_buf); return; } sprintf(zone_buf,"zone%d/%s",zone->number,zone->list_filename); /* * Read in all the area files. */ { FILE *fpList; log_string("Reading in area files..."); if ( ( fpList = fopen( zone_buf, "r" ) ) == NULL ) { perror( AREA_LIST ); shutdown_mud( "Unable to open area list" ); exit( 1 ); } for ( ; ; ) { strcpy( strArea, fread_word( fpList ) ); if ( strArea[0] == '$' ) break; sprintf(zone_buf,"zone%d/%s",zone->number,strArea); load_area_file( last_area, zone_buf ); /* Dont USe, --GW fold_area(last_area,zone_buf,FALSE); */ } new_fclose( fpList ); } closedir(dp); } /**/ /* * initialize supermob. * must be done before reset_area! * */ init_supermob(); /* * Fix up exits. * Declare db booting over. * Reset all areas once. * Load up the notes file. */ { log_string( "Fixing exits" ); fix_exits( ); log_string( "Initializing economy" ); initialize_economy( ); log_string( "Limit system Loading...."); load_limit_db(); if ( !DISABLE_LIMIT_SCAN ) { log_string( "Reinitializing Limit Tables..."); reinit_limits(); log_string( "Updating Limits...."); object_limit_update(); } log_string( "Writing Overlimit File..."); overlimit_msg(); log_string( "Resetting areas" ); area_update( ); fBootDb = FALSE; log_string( "Loading buildlist" ); load_buildlist( ); log_string( "Loading boards" ); load_boards( ); log_string( "Loading clans" ); load_clans( ); log_string( "Setting Up PK-TRACKING" ); clan_pkill_record_setup( ); log_string( "Loading councils" ); load_deity( ); log_string( "Loading deities" ); load_councils( ); log_string( "Loading bans" ); load_banlist( ); log_string( "Loading corpses" ); load_corpses( ); log_string( "Loading Warrents" ); first_warrent = NULL; last_warrent = NULL; load_warrents( ); log_string("Setting up Aliens..."); ALIENS_RAN = FALSE; log_string("Setting up Dragons..."); DRAGONS_RAN = TRUE; FORCE_DRAGON_RUN = FALSE; log_string( "Loading System Messages" ); load_system_messages( ); log_string( "Loading SAVE-ROOMS -- Disabled" ); /* load_save_rooms( );*/ log_string( "Disabling Email Authorization" ); EMAIL_AUTH=FALSE; log_string( "Setting up the Casino Bank.."); setup_casino(); // log_string("Setting up CTF.."); // setup_ctf(); /* Security --GW */ log_string("Initializing Security Features.."); init_security(); log_string("WME-SECURE: Loading..."); load_imps(); /* Version/Compile/Boot Shell Stuff --GW */ log_string("Loading Compile Data.."); load_compile_data(); log_string("Loading Boot Data.."); load_boot_data(); log_string("Loading MUD Version.."); load_mud_version(); /* Upstat --GW */ init_upstat(); if ( !fCopyOver ) /* Slows CopyOver Down to much --GW */ { /* Clean Pfiles Up */ /* clean_pfiles();*/ /* Clean Locker Files Up */ /* clean_lfiles();*/ } MOBtrigger = TRUE; if (fCopyOver) { reset_copyover_boot_time(); log_string("Running copyover_recover."); copyover_recover(); } } /* init_maps ( ); */ mudlog_off = FALSE; return; } /* * Kombat Data Init Function --GW */ void init_kombat( void ) { CREATE( kombat, KOMBAT_DATA, 1 ); kombat->bits = 0; kombat->hi_lev = 0; kombat->low_lev = 0; return; } /* * Init Areans Function --GW */ void init_arenas( void ) { ARENA_DATA *arena=NULL; first_arena = NULL; last_arena = NULL; /* Arena #1 */ log_string("Loading Arena #1..."); CREATE( arena, ARENA_DATA, 1 ); arena->char_room = 42; arena->vict_room = 43; arena->in_use = FALSE; LINK( arena, first_arena, last_arena, next, prev ); /* Done */ log_string("Arena Loading Complete."); return; } /* * Init Challenge Function --GW */ void init_challenge( void ) { first_challenge = NULL; last_challenge = NULL; return; } /* * Load an 'area' header line. */ void load_area( FILE *fp ) { AREA_DATA *pArea=NULL; 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->zone = zone_pointer; pArea->version_number = 0; pArea->version_name = STRALLOC("Unknown"); LINK( pArea, first_area, last_area, next, prev ); top_area++; return; } /* * Load an 'zone' header line. */ void load_zone_header( FILE *fp ) { ZONE_DATA *pZone=NULL; CREATE( pZone, ZONE_DATA, 1 ); pZone->name = fread_string_nohash( fp ); pZone->filename = str_dup( strArea ); LINK( pZone, first_zone, last_zone, next, prev ); return; } /* * Load zones list file name .. --GW */ void load_zone_lname( ZONE_DATA *tzone, FILE *fp ) { if ( !tzone ) { bug( "Load_author: no #ZONE seen yet." ); if ( fBootDb ) { shutdown_mud( "No #ZONE" ); exit( 1 ); } else return; } if ( tzone->list_filename ) STRFREE( tzone->list_filename ); tzone->list_filename = fread_string( fp ); return; } /* * Load zones name .. --GW */ void load_zone_name( ZONE_DATA *tzone, FILE *fp ) { if ( !tzone ) { bug( "Load_author: no #ZONE seen yet." ); if ( fBootDb ) { shutdown_mud( "No #ZONE" ); exit( 1 ); } else return; } if ( tzone->name ) STRFREE( tzone->name ); tzone->name = fread_string( 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; } /* * Map filename --GW */ void load_mapfile( 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->map_file ) DISPOSE( tarea->map_file ); tarea->map_file = fread_string_nohash( fp ); return; } /* * Load Version Info */ void load_version( AREA_DATA *tarea, FILE *fp ) { char *temp=NULL; if ( !tarea ) { bug( "Load_author: no #AREA seen yet." ); if ( fBootDb ) { shutdown_mud( "No #AREA" ); exit( 1 ); } else return; } if ( tarea->version_name ) STRFREE( tarea->author ); temp = fread_string(fp); tarea->version_number = atoi(&temp[0]); temp++; temp++; tarea->version_name = STRALLOC(temp); tarea->version_name[strlen(tarea->version_name)-1] = '\0'; return; } /* * Load an club section. --GW */ void load_club( AREA_DATA *tarea, FILE *fp ) { if ( !tarea ) { bug( "Load_club: no #AREA seen yet." ); if ( fBootDb ) { shutdown_mud( "No #AREA" ); exit( 1 ); } else return; } if ( tarea->club ) STRFREE( tarea->club ); tarea->club = fread_string( fp ); 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 ); 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, x3, x4; 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=x3=x4=0; sscanf( ln, "%d %d %d %d", &x1, &x2, &x3, &x4 ); tarea->flags = x1; tarea->locklev = x2; tarea->reset_frequency = x3; tarea->seclev = x4; if ( IS_SET( tarea->flags, AFLAG_STARTED ) ) REMOVE_BIT( tarea->flags, AFLAG_STARTED ); if ( x3 ) tarea->age = x3; return; } /* * Load Zone Number -- GW */ void load_zone_number( ZONE_DATA *tzone, FILE *fp ) { char *ln; int x1; if ( !tzone ) { bug( "Load_Zone_Number: no #ZONE seen yet." ); if ( fBootDb ) { shutdown_mud( "No #ZONE" ); exit( 1 ); } else return; } ln = fread_line( fp ); x1=0; sscanf( ln, "%d", &x1 ); tzone->number = x1; 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++; } /* * Load a help section. */ void load_helps( AREA_DATA *tarea, FILE *fp ) { HELP_DATA *pHelp=NULL; char buf[MSL]; for ( ; ; ) { pHelp=NULL; CREATE( pHelp, HELP_DATA, 1 ); pHelp->level = fread_number( fp ); if( pHelp->level > MAX_LEVEL ) pHelp->level = MAX_LEVEL; pHelp->keyword = fread_string( fp ); if ( pHelp->keyword[0] == '$' ) break; /* DO we REALLY want to see this?? --GW */ if ( mudarg_scan('H') ) { sprintf(buf,"Loading Help: %s",pHelp->keyword); log_string(buf); } /* Added this to keep track of who does what --GW */ pHelp->update = fread_string( fp ); 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" ) ) first_greeting = pHelp->text; if ( !str_cmp( pHelp->keyword, "greeting1" ) ) help_greeting[0] = pHelp->text; if ( !str_cmp( pHelp->keyword, "greeting2" ) ) help_greeting[1] = pHelp->text; if ( !str_cmp( pHelp->keyword, "greeting3" ) ) help_greeting[2] = pHelp->text; add_help(pHelp); } return; } /* * Add a character to the list of all characters -Thoric */ void add_char( CHAR_DATA *ch ) { LINK( ch, first_char, last_char, next, prev ); } /* * Load a mob section. */ void load_mobiles( AREA_DATA *tarea, FILE *fp ) { MOB_INDEX_DATA *pMobIndex=NULL; char *ln; int x1, x2, x3, x4, x5, x6, x7, x8; if ( !tarea ) { bug( "Load_mobiles: no #AREA seen yet." ); if ( fBootDb ) { shutdown_mud( "No #AREA" ); exit( 1 ); } else return; } for ( ; ; ) { char buf[MAX_STRING_LENGTH]; sh_int vnum; char letter; int iHash; bool oldmob; bool tmpBootDb; /* char diceletter; char diceletter2; diceletter = 'd'; diceletter2 = '+'; */ 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,(int)tarea->zone->number ) ) { if ( tmpBootDb ) { bug( "Load_mobiles: vnum %d duplicated.", vnum ); shutdown_mud( "duplicate vnum" ); exit( 1 ); } else { pMobIndex = get_mob_index( vnum,(int)tarea->zone->number ); sprintf( buf, "Cleaning mobile: %d", vnum ); log_string_plus( buf, LOG_BUILD, sysdata.log_level ); clean_mob( pMobIndex ); oldmob = TRUE; } } else { oldmob = FALSE; pMobIndex=NULL; 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->area = tarea; pMobIndex->long_descr[0] = UPPER(pMobIndex->long_descr[0]); pMobIndex->description[0] = UPPER(pMobIndex->description[0]); /* Modification Tracking --GW */ if ( tarea->version_number > 1 ) { pMobIndex->modified_by = fread_string( fp ); pMobIndex->modified_date = fread_string( fp ); } else { pMobIndex->modified_by = STRALLOC("Unknown"); pMobIndex->modified_date = STRALLOC("Unknown"); } pMobIndex->act = fread_number( fp ) | ACT_IS_NPC; pMobIndex->flags = 0; pMobIndex->affected_by = fread_bitvector( fp ); pMobIndex->pShop = NULL; pMobIndex->rShop = NULL; pMobIndex->alignment = fread_number( fp ); letter = fread_letter( fp ); /* second act mob bit sting -- GW */ pMobIndex->acttwo = fread_number( fp ); pMobIndex->smart = fread_number( fp ); pMobIndex->level = fread_number( fp ); pMobIndex->mobthac0 = fread_number( fp ); pMobIndex->ac = fread_number( fp ); pMobIndex->hitnodice = fread_number( fp ); /* diceletter */ fread_letter( fp ); pMobIndex->hitsizedice = fread_number( fp ); /* diceletter2 */ fread_letter( fp ); pMobIndex->hitplus = fread_number( fp ); pMobIndex->damnodice = fread_number( fp ); /* diceletter */ fread_letter( fp ); pMobIndex->damsizedice = fread_number( fp ); /* diceletter2 */ fread_letter( fp ); pMobIndex->damplus = fread_number( fp ); pMobIndex->gold = fread_number( fp ); pMobIndex->exp = fread_number( fp ); pMobIndex->exp = 0; /* no exp on mobs man --GW*/ pMobIndex->position = fread_number( fp ); pMobIndex->defposition = fread_number( fp ); /* * 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 ); 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=0; sscanf( ln, "%d %d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8 ); pMobIndex->race = x1; pMobIndex->class = x2; pMobIndex->height = x3; pMobIndex->weight = x4; pMobIndex->speaks = x5; pMobIndex->speaking = x6; pMobIndex->numattacks = x7; /* numattacks bug fix by Greywolf */ if ( pMobIndex->numattacks < 1 ) { sprintf(buf,"LOAD_MOBS: NUMATTACKS LESS THEN 1 mob %d", pMobIndex->vnum ); bug(buf); bug("Fixing..."); pMobIndex->numattacks = 1; } if ( race_table[pMobIndex->race] ) { if ( !pMobIndex->speaks ) pMobIndex->speaks = race_table[pMobIndex->race]->language | LANG_COMMON; if ( !pMobIndex->speaking ) pMobIndex->speaking = race_table[pMobIndex->race]->language; } else { pMobIndex->speaks = LANG_COMMON; pMobIndex->speaking = LANG_COMMON; } ln = fread_line( fp ); x1=x2=x3=x4=x5=x6=x7=x8=0; 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; pMobIndex->attacks = x7; pMobIndex->defenses = x8; } 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->race = 0; pMobIndex->class = 3; pMobIndex->xflags = 0; pMobIndex->resistant = 0; pMobIndex->immune = 0; pMobIndex->susceptible = 0; pMobIndex->numattacks = 0; pMobIndex->attacks = 0; pMobIndex->defenses = 0; } letter = fread_letter( fp ); if ( letter == '>' ) { ungetc( letter, fp ); mprog_read_programs( fp, pMobIndex ); } else ungetc( letter,fp ); SET_BIT( pMobIndex->act, ACT_IS_NPC ); if ( !oldmob ) { iHash = vnum % MAX_KEY_HASH; pMobIndex->next = zone_pointer->mob_index_hash[iHash]; zone_pointer->mob_index_hash[iHash] = pMobIndex; top_mob_index++; zone_pointer->top_mob++; } } return; } /* * Load an obj section. */ void load_objects( AREA_DATA *tarea, FILE *fp ) { OBJ_INDEX_DATA *pObjIndex=NULL; char letter; char *ln; int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11; if ( !tarea ) { bug( "Load_objects: no #AREA seen yet." ); if ( fBootDb ) { shutdown_mud( "No #AREA" ); exit( 1 ); } else return; } for ( ; ; ) { char buf[MAX_STRING_LENGTH]; 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,(int)tarea->zone->number ) ) { if ( tmpBootDb ) { bug( "Load_objects: vnum %d duplicated.", vnum ); shutdown_mud( "duplicate vnum" ); exit( 1 ); } else { pObjIndex = get_obj_index( vnum,(int)tarea->zone->number); sprintf( buf, "Cleaning object: %d", vnum ); log_string_plus( buf, LOG_BUILD, sysdata.log_level ); clean_obj( pObjIndex ); oldobj = TRUE; } } else { oldobj = FALSE; pObjIndex=NULL; 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 ); /* Modification Tracking --GW */ if ( tarea->version_number > 1 ) { pObjIndex->modified_by = fread_string( fp ); pObjIndex->modified_date = fread_string( fp ); } else { pObjIndex->modified_by = STRALLOC("Unknown"); pObjIndex->modified_date = STRALLOC("Unknown"); } /* 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->area = tarea; 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->item_type = x1; pObjIndex->extra_flags = x2; pObjIndex->wear_flags = x3; pObjIndex->level = x4; pObjIndex->minlevel = x5; pObjIndex->second_flags = x6; /* Still in the file format .. not used tho .. maybe recylye them? =) --GW*/ pObjIndex->loaded = 0; pObjIndex->limit = 0; pObjIndex->has_moved = 0; /* ------------------------------------ */ pObjIndex->ego = x10; /* Make SURE Layers is LAST loaded! --GW */ pObjIndex->layers = x11; 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; /* Fix a DT Crasher (Damage Type) --GW */ if ( pObjIndex->item_type == ITEM_WEAPON ) { if ( pObjIndex->value[3] > DAM_PEA ) { bug("Weapon: %d had bad Damage Type! Setting to hit!",pObjIndex->vnum); pObjIndex->value[3] = DAM_HIT; } } pObjIndex->weight = fread_number( fp ); pObjIndex->weight = UMAX( 1, pObjIndex->weight ); pObjIndex->cost = fread_number( fp ); pObjIndex->rent = fread_number( fp ); for ( ; ; ) { letter = fread_letter( fp ); if ( letter == 'A' ) { AFFECT_DATA *paf=NULL; 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->modifier = slot_lookup( fread_number(fp) ); else paf->modifier = fread_number( fp ); xCLEAR_BITS(paf->bitvector); LINK( paf, pObjIndex->first_affect, pObjIndex->last_affect, next, prev ); top_affect++; } else if ( letter == 'E' ) { EXTRA_DESCR_DATA *ed=NULL; 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." */ 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; } /* Temp fix for area file fuckups, dont use --GW */ /* pObjIndex->layers = 0; pObjIndex->second_flags = 0; pObjIndex->limit = 0; pObjIndex->loaded = 0; pObjIndex->ego = 0; pObjIndex->has_moved = 0; pObjIndex->minlevel = 0;*/ if ( !oldobj ) { iHash = vnum % MAX_KEY_HASH; pObjIndex->next = zone_pointer->obj_index_hash[iHash]; zone_pointer->obj_index_hash[iHash] = pObjIndex; top_obj_index++; zone_pointer->top_obj++; } } return; } /* * Load a reset section. */ void load_resets( AREA_DATA *tarea, FILE *fp ) { char buf[MAX_STRING_LENGTH]; bool not01 = FALSE; int count = 0; int zone; if ( !tarea ) { bug( "Load_resets: no #AREA seen yet." ); if ( fBootDb ) { shutdown_mud( "No #AREA" ); exit( 1 ); } else return; } if ( tarea->zone ) zone = (int)tarea->zone->number; else zone = 1; 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; 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 ); arg3 = (letter == 'G' || letter == 'R') ? 0 : fread_number( fp ); 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 'M': if ( get_mob_index( arg1,zone ) == NULL && fBootDb ) boot_log( "Load_resets: %s (%d) 'M': mobile %d doesn't exist.", tarea->filename, count, arg1 ); if ( get_room_index( arg3,zone ) == 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,zone) == NULL && !fBootDb ) boot_log( "Load_resets: %s (%d) '%c': object %d doesn't exist.", tarea->filename, count, letter, arg1 ); if ( get_room_index(arg3,zone) == NULL && !fBootDb ) boot_log( "Load_resets: %s (%d) '%c': room %d doesn't exist.", tarea->filename, count, letter, arg3 ); break; case 'P': if ( get_obj_index(arg1,zone) == 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,zone) == 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; break; case 'G': case 'E': if ( get_obj_index(arg1,zone) == NULL && !fBootDb ) boot_log( "Load_resets: %s (%d) '%c': object %d doesn't exist.", tarea->filename, count, letter, arg1 ); break; case 'T': break; case 'H': if ( arg1 > 0 ) if ( get_obj_index(arg1,zone) == NULL && !fBootDb ) boot_log( "Load_resets: %s (%d) 'H': object %d doesn't exist.", tarea->filename, count, arg1 ); break; case 'D': pRoomIndex = get_room_index( arg1,zone ); 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, zone ); 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 ); } if ( !not01 ) renumber_put_resets(tarea); return; } /* * Load a room section. */ void load_rooms( AREA_DATA *tarea, FILE *fp ) { ROOM_INDEX_DATA *pRoomIndex=NULL; char buf[MAX_STRING_LENGTH]; char *ln; int zone; if ( !tarea ) { bug( "Load_rooms: no #AREA seen yet." ); shutdown_mud( "No #AREA" ); exit( 1 ); } if ( tarea->zone ) zone = tarea->zone->number; else zone = 1; for ( ; ; ) { int vnum; char letter; int door; int iHash; bool tmpBootDb; bool oldroom; int x1, x2, x3, x4, x5, x6, x7; 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,zone ) != NULL ) { if ( tmpBootDb ) { bug( "Load_rooms: vnum %d duplicated.", vnum ); shutdown_mud( "duplicate vnum" ); exit( 1 ); } else { pRoomIndex = get_room_index( vnum,zone); sprintf( buf, "Cleaning room: %d", vnum ); log_string_plus( buf, LOG_BUILD, sysdata.log_level ); clean_room( pRoomIndex ); oldroom = TRUE; } } else { oldroom = FALSE; pRoomIndex=NULL; 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; pRoomIndex->room_cnt = 0; 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 ); pRoomIndex->music = fread_string( fp ); /* Modification Tracking --GW */ if ( tarea->version_number > 1 ) { pRoomIndex->modified_by = fread_string( fp ); pRoomIndex->modified_date = fread_string( fp ); } else { pRoomIndex->modified_by = STRALLOC( "Unknown" ); pRoomIndex->modified_date = STRALLOC( "Unknown" ); } /* Area number fread_number( fp ); */ ln = fread_line( fp ); x1=x2=x3=x4=x5=x6=x7=0; sscanf( ln, "%d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7 ); pRoomIndex->room_flags = x2; pRoomIndex->sector_type = x3; pRoomIndex->level = x4; if ( pRoomIndex->level > LEVEL_HYPERION ) pRoomIndex->level = LEVEL_HYPERION; pRoomIndex->tele_vnum = x5; pRoomIndex->tele_delay = x6; pRoomIndex->tunnel = x7; 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 ); } else { 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=0; sscanf( ln, "%d %d %d %d", &x1, &x2, &x3, &x4 ); locks = x1; pexit->key = x2; pexit->vnum = x3; pexit->vdir = door; pexit->distance = x4; 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=NULL; 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' ) /* Disabled */ { int vnum,x,y; char entry; vnum = fread_number(fp); x = fread_number(fp); y = fread_number(fp); entry = fread_letter(fp); } /* { 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; } } } 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 = zone_pointer->room_index_hash[iHash]; zone_pointer->room_index_hash[iHash] = pRoomIndex; top_room++; zone_pointer->top_room++; } } return; } /* * Load a shop section. */ void load_shops( AREA_DATA *tarea, FILE *fp ) { SHOP_DATA *pShop=NULL; for ( ; ; ) { MOB_INDEX_DATA *pMobIndex; int iTrade; pShop=NULL; CREATE( pShop, SHOP_DATA, 1 ); pShop->keeper = fread_number( fp ); if ( pShop->keeper == 0 ) 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,(int)tarea->zone->number ); 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=NULL; for ( ; ; ) { MOB_INDEX_DATA *pMobIndex; int iFix; rShop=NULL; CREATE( rShop, REPAIR_DATA, 1 ); rShop->keeper = fread_number( fp ); if ( rShop->keeper == 0 ) 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,(int)tarea->zone->number ); 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 Vehicle Data */ void load_vehicles( AREA_DATA *tarea, FILE *fp ) { char buf[MSL]; for ( ; ; ) { OBJ_INDEX_DATA *pObjIndex; char letter; switch ( letter = fread_letter( fp ) ) { default: bug( "Load_vehicles: letter '%c' not *MS.", letter ); exit( 1 ); case 'S': return; case '*': break; case 'V': /* Format for Vehicle saving is : * V <vnum> <description> <flags> --GW */ pObjIndex = get_obj_index ( fread_number ( fp ),tarea->zone->number ); if ( !pObjIndex ) { bug("Load_vehicles: NULL Obj Index!",0); continue; } sprintf(buf,"Loading Vehicle Data: #%d\n",pObjIndex->vnum ); log_string(buf); CREATE( pObjIndex->vehicle, VEHICLE_DATA, 1 ); pObjIndex->vehicle->contents = NULL; pObjIndex->vehicle->serial_number = 0; pObjIndex->vehicle->in_room = NULL; pObjIndex->vehicle->vehicle_flags = fread_number(fp); pObjIndex->vehicle->obj_vnum = pObjIndex->vnum; break; } fread_to_eol( fp ); } } /* * 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 ),tarea->zone->number ); 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; 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=0; 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; } 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,(int)tarea->zone->number)) != 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; ZONE_DATA *in_zone; for ( in_zone = first_zone; in_zone; in_zone = in_zone->next ) { for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ ) { for ( pRoomIndex = in_zone->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,(int)in_zone->number))== 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 ) SET_BIT( pRoomIndex->room_flags, ROOM_NO_MOB ); } } /* Set all the rexit pointers -Thoric */ for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ ) { for ( pRoomIndex = in_zone->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; 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; if ( !IS_SET( pArea->flags, AFLAG_STARTED ) && !IS_SET( pArea->flags, AFLAG_ALWAYS_START ) ) continue; if ( IS_SET( pArea->flags, AFLAG_NEVER_START ) ) continue; /* * Check for PC's. */ if ( pArea->nplayer > 0 && pArea->age == (reset_age-1) ) { char buf[MAX_STRING_LENGTH]; /* 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 ) { ROOM_INDEX_DATA *pRoomIndex; if ( IS_SET( pArea->flags, AFLAG_ALWAYS_START ) ) fprintf( stderr, "AUTO-AREA-RESET: %s\n", pArea->filename ); else fprintf( stderr, "RUNTIME-RESET: %s\n", pArea->filename ); reset_area( pArea ); if ( reset_age == -1 ) pArea->age = -1; else pArea->age = number_range( 0, reset_age / 5 ); pRoomIndex = get_room_index( ROOM_VNUM_SCHOOL,1 ); if ( pRoomIndex != NULL && pArea == pRoomIndex->area && pArea->reset_frequency == 0 ) pArea->age = 15 - 3; } } return; } /* * Create an instance of a mobile. */ CHAR_DATA *create_mobile( MOB_INDEX_DATA *pMobIndex, ZONE_DATA *zone ) { CHAR_DATA *mob=NULL; if ( !pMobIndex ) { bug( "Create_mobile: NULL pMobIndex." ); return NULL; } CREATE( mob, CHAR_DATA, 1 ); clear_char( mob ); mob->pIndexData = pMobIndex; 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 = number_fuzzy( pMobIndex->level ); mob->act = pMobIndex->act; mob->acttwo = pMobIndex->acttwo; mob->smart = pMobIndex->smart; mob->affected_by = pMobIndex->affected_by; mob->alignment = pMobIndex->alignment; mob->sex = pMobIndex->sex; if ( !pMobIndex->ac ) mob->armor = pMobIndex->ac; else mob->armor = interpolate( mob->level, 100, -100 ); if ( !pMobIndex->hitnodice ) mob->max_hit = mob->level * 8 + number_range( mob->level * mob->level / 4, mob->level * mob->level ); else mob->max_hit = pMobIndex->hitnodice * number_range(1, pMobIndex->hitsizedice ) + pMobIndex->hitplus; mob->hit = mob->max_hit; /* lets put things back the way they used to be! -Thoric */ mob->damroll = mob->level * 1; mob->hitroll = mob->level * 1.5; mob->gold = pMobIndex->gold; mob->exp = pMobIndex->exp; mob->position = pMobIndex->position; mob->defposition = pMobIndex->defposition; mob->barenumdie = pMobIndex->damnodice; mob->baresizedie = pMobIndex->damsizedice; mob->mobthac0 = pMobIndex->mobthac0; mob->hitplus = pMobIndex->hitplus; mob->damplus = pMobIndex->damplus; 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->race = pMobIndex->race; mob->class = pMobIndex->class; 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->numattacks = pMobIndex->numattacks; mob->speaks = pMobIndex->speaks; mob->speaking = pMobIndex->speaking; /* * Insert in list. */ /* put it in the right list, thanks Thoric, --GW */ if ( fBootDb ) LINK(mob,pMobIndex->area->zone->first_mob,pMobIndex->area->zone->last_mob,next,prev); else LINK(mob,zone->first_mob,zone->last_mob, next,prev); pMobIndex->count++; nummobsloaded++; return mob; } /* * Create an instance of an object. */ OBJ_DATA *create_object( OBJ_INDEX_DATA *pObjIndex, int level,ZONE_DATA *zone ) { OBJ_DATA *obj=NULL; extern bool LOAD_LIMITED; if ( !pObjIndex ) { bug( "Create_object: NULL pObjIndex." ); return NULL; } /* * Limits --GW */ if ( LOAD_LIMITED == TRUE ) { if ( IS_SET( pObjIndex->second_flags, ITEM2_LIMITED ) && !IS_SET( pObjIndex->extra_flags, ITEM_PROTOTYPE ) ) { if ( obj_limit_check(pObjIndex)==TRUE ) return NULL; else adjust_limits( pObjIndex, 1, LOADED_ADJUST_UP ); } } CREATE( obj, OBJ_DATA, 1 ); obj->pIndexData = pObjIndex; obj->in_room = NULL; obj->wear_loc = -1; /* obj->deleted = FALSE;*/ if ( level > LEVEL_HYPERION ) level = LEVEL_HYPERION; obj->level = level; 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->second_flags = pObjIndex->second_flags; obj->wear_flags = pObjIndex->wear_flags; obj->minlevel = pObjIndex->minlevel; obj->ego = pObjIndex->ego; 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->weight = pObjIndex->weight; obj->cost = pObjIndex->cost; /* 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: break; 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_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_SHOVEL: case ITEM_LIFE_PROTECTION: case ITEM_INSIG: case ITEM_SHRINE: case ITEM_PK_BOOK: case ITEM_VEHICLE: break; case ITEM_SALVE: obj->value[3] = number_fuzzy( obj->value[3] ); break; case ITEM_SCROLL: obj->value[0] = number_fuzzy( obj->value[0] ); break; case ITEM_WAND: case ITEM_STAFF: obj->value[0] = number_fuzzy( obj->value[0] ); obj->value[1] = number_fuzzy( obj->value[1] ); obj->value[2] = obj->value[1]; break; case ITEM_MISSILE_WEAPON: case ITEM_PROJECTILE: case ITEM_WEAPON: if ( obj->value[1] && obj->value[2] ) obj->value[2] *= obj->value[1]; else { obj->value[1] = number_fuzzy( number_fuzzy( 1 * level / 4 + 2 ) ); obj->value[2] = number_fuzzy( number_fuzzy( 3 * level / 4 + 6 ) ); } if (obj->value[0] == 0) obj->value[0] = INIT_WEAPON_CONDITION; break; case ITEM_ARMOR: if ( obj->value[0] == 0 ) obj->value[0] = number_fuzzy( level / 4 + 2 ); if (obj->value[1] == 0) obj->value[1] = obj->value[0]; break; case ITEM_POTION: case ITEM_PILL: obj->value[0] = number_fuzzy( number_fuzzy( obj->value[0] ) ); break; case ITEM_MONEY: obj->value[0] = obj->cost; break; } /* put it in the right list, thanks Thoric, --GW */ if ( fBootDb ) LINK( obj,pObjIndex->area->zone->first_obj,pObjIndex->area->zone->last_obj,next, prev ); else LINK( obj,zone->first_obj,zone->last_obj,next,prev); ++pObjIndex->count; ++numobjsloaded; ++physicalobjects; return obj; } /* * Clear a new character. */ void clear_char( CHAR_DATA *ch ) { ch->hunting = NULL; ch->fearing = NULL; ch->hating = NULL; ch->name = NULL; ch->short_descr = NULL; ch->long_descr = NULL; ch->description = NULL; ch->next = NULL; ch->prev = 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->dest_buf = NULL; ch->spare_ptr = NULL; ch->mount = NULL; xCLEAR_BITS(ch->affected_by); ch->armor = 100; ch->position = POS_STANDING; ch->practice = 0; ch->hit = 20; ch->max_hit = 20; ch->mana = 100; ch->max_mana = 100; ch->move = 100; ch->max_move = 100; ch->height = 72; ch->weight = 180; ch->xflags = 0; ch->race = -1; ch->class = -1; ch->class2 = -1; ch->advclass = -1; 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->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->stun_rounds = 0; /* Not stunned to start */ /* ch->deleted = FALSE; Not Extracted --GW*/ 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; sh_int pos=0; /* To Catch Stale Pointers --GW */ /* if ( ch->deleted == TRUE ) return;*/ if ( !ch ) { bug( "Free_char: null ch!" ); return; } if ( ch->desc ) bug( "Free_char: char still has descriptor." ); 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->name ) STRFREE( ch->name ); if( ch->short_descr ) STRFREE( ch->short_descr ); if( ch->long_descr ) STRFREE( ch->long_descr ); if( ch->description ) STRFREE( ch->description ); stop_hunting( ch ); stop_hating ( ch ); stop_fearing( ch ); free_fight ( ch ); if ( ch->pcdata ) { for ( comments = ch->pcdata->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 ); } if ( ch->pcdata->pnote ) free_note( ch->pcdata->pnote ); if ( ch->pcdata->inter_editing ) DISPOSE( ch->pcdata->inter_editing ); if ( ch->pcdata->editor ) stop_editing( ch ); if ( ch->pcdata->gladiator ) STRFREE( ch->pcdata->gladiator ); /* Free thier maps --GW */ if ( ch->pcdata->color_maps ) free_char_colormaps(ch); /* Free Psocials --GW */ if ( ch->pcdata->personal_socials ) free_char_psocials(ch); /* Free there offline data */ if ( ch->pcdata->offline ) free_offline_data(ch); /* Free Site Locks */ if ( ch->pcdata->first_host ) free_hosts(ch); if ( ch->pcdata->clan_name ) STRFREE( ch->pcdata->clan_name ); if ( ch->pcdata->council_name ) STRFREE( ch->pcdata->council_name ); if ( ch->pcdata->pwd ) DISPOSE( ch->pcdata->pwd ); /* no hash */ if ( ch->pcdata->bamfin ) DISPOSE( ch->pcdata->bamfin ); /* no hash */ if ( ch->pcdata->bamfout ) DISPOSE( ch->pcdata->bamfout ); /* no hash */ if ( ch->pcdata->rank ) DISPOSE( ch->pcdata->rank ); if ( ch->pcdata->title ) STRFREE( ch->pcdata->title ); if ( ch->pcdata->bio ) STRFREE( ch->pcdata->bio ); if ( ch->pcdata->bestowments ) DISPOSE( ch->pcdata->bestowments ); /* no hash */ if ( ch->pcdata->homepage ) DISPOSE( ch->pcdata->homepage ); /* no hash */ if ( ch->pcdata->authed_by ) STRFREE( ch->pcdata->authed_by ); if ( ch->pcdata->prompt ) STRFREE( ch->pcdata->prompt ); if ( ch->pcdata->subprompt ) STRFREE( ch->pcdata->subprompt ); if ( ch->pcdata->email ) STRFREE( ch->pcdata->email ); if ( ch->pcdata->guild_name ) STRFREE( ch->pcdata->guild_name ); if ( ch->pcdata->deity_name ) STRFREE( ch->pcdata->deity_name ); if ( ch->pcdata->stitle ) STRFREE( ch->pcdata->stitle ); if ( ch->pcdata->rreply ) STRFREE( ch->pcdata->rreply ); if ( ch->pcdata->rreply_name ) STRFREE( ch->pcdata->rreply_name ); if ( ch->pcdata->helled_by ) STRFREE( ch->pcdata->helled_by ); if ( ch->pcdata->spouse ) STRFREE( ch->pcdata->spouse ); if ( ch->pcdata->engaged ) STRFREE( ch->pcdata->engaged ); if ( ch->pcdata->challenge_char_name ) STRFREE( ch->pcdata->challenge_char_name ); if ( ch->pcdata->name ) STRFREE( ch->pcdata->name ); /* Aliases --GW */ for( pos=0; pos < MAX_ALIAS; pos++ ) { if ( ch->pcdata->alias[pos] != NULL ) STRFREE(ch->pcdata->alias[pos]); if ( ch->pcdata->alias_sub[pos] != NULL ) STRFREE(ch->pcdata->alias_sub[pos]); } /* Ignores --GW */ for( pos=0; pos < MAX_IGNORE; pos++ ) { if ( ch->pcdata->ignore[pos] != NULL ) STRFREE(ch->pcdata->ignore[pos]); } /* Com-Track --GW */ for( pos=0; pos < MAX_COM; pos++ ); { if( ch->pcdata->comtrack[pos] != NULL && ch->pcdata->comtrack[pos][0] != '\0' ) STRFREE(ch->pcdata->comtrack[pos]); if( ch->pcdata->lastcom[pos] != NULL && ch->pcdata->lastcom[pos][0] != '\0' ) STRFREE(ch->pcdata->lastcom[pos]); } if ( ch->pcdata->arena_viewing ) STRFREE( ch->pcdata->arena_viewing ); if ( ch->pcdata ) DISPOSE( ch->pcdata ); } for ( mpact = ch->mpact; mpact; mpact = mpact_next ) { mpact_next = mpact->next; DISPOSE( mpact->buf ); DISPOSE( mpact ); } /* ch->deleted = TRUE;*/ 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. -- Zone Support Added -- GW */ MOB_INDEX_DATA *get_mob_index( sh_int vnum, sh_int zone ) { MOB_INDEX_DATA *pMobIndex; ZONE_DATA *in_zone; if ( vnum < 0 ) vnum = 0; if ( zone <= 0 ) zone = 1; /*find the right zone, and use that index -- GW*/ if ((in_zone = find_zone(zone))==NULL) { bug("Get_mob_index: ZONE ACCESS VIOLATION!! (*FATAL*)",0); return NULL; } for ( pMobIndex = in_zone->mob_index_hash[vnum % MAX_KEY_HASH]; pMobIndex; pMobIndex = pMobIndex->next ) if ( pMobIndex->vnum == vnum ) return pMobIndex; /* if ( fBootDb ) <-- What an Annoyance. --GW * bug( "Get_mob_index: bad vnum %d.", vnum ); */ return NULL; } /* * Translates obj virtual number to its obj index struct. * Hash table lookup. -- Zone Support Added -- GW */ OBJ_INDEX_DATA *get_obj_index( int vnum, int zone ) { OBJ_INDEX_DATA *pObjIndex; ZONE_DATA *in_zone; if ( vnum < 0 ) vnum = 0; if ( zone <= 0 ) zone = 1; /*find the right zone, and use that index -- GW*/ if ((in_zone = find_zone(zone))==NULL) { bug("Get_obj_index: ZONE ACCESS VIOLATION!! (*FATAL*)",0); return NULL; } for ( pObjIndex = in_zone->obj_index_hash[vnum % MAX_KEY_HASH]; pObjIndex; pObjIndex = pObjIndex->next ) if ( pObjIndex->vnum == vnum ) return pObjIndex; return NULL; } /* * Translates room virtual number to its room index struct. * Hash table lookup. -- Zone Support Added -- GW */ ROOM_INDEX_DATA *get_room_index( int vnum, int zone ) { ROOM_INDEX_DATA *pRoomIndex; ZONE_DATA *in_zone; if ( vnum < 0 ) vnum = 0; if ( zone <= 0 ) zone = 1; /*find the right zone, and use that index -- GW*/ if ((in_zone = find_zone(zone))==NULL) { bug("Get_room_index: ZONE ACCESS VIOLATION!! (*FATAL*)",0); return NULL; } for ( pRoomIndex = in_zone->room_index_hash[vnum % MAX_KEY_HASH]; pRoomIndex; pRoomIndex = pRoomIndex->next ) if ( pRoomIndex->vnum == vnum ) return pRoomIndex; return NULL; } ZONE_DATA *find_zone( int zone ) { ZONE_DATA *in_zone; if ( zone > top_zone ) zone = top_zone; if ( zone <= 0 ) zone = 1; /* search for the zone */ for( in_zone = first_zone; in_zone; in_zone = in_zone->next) { if (in_zone->number == zone ) { /* zone found, return the data */ return in_zone; } } /* zone not found */ return find_zone(1); } /* * 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. */ long fread_number( FILE *fp ) { long 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 ( c == '\0' ) return 0; 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; } /* * custom str_dup using create -Thoric */ char *str_dup( char const *str ) { char *ret=NULL; int len=0; if ( !str ) return NULL; len = strlen(str)+1; CREATE( ret, char, len ); strcpy( ret, str ); return ret; } /* * Read a string from file fp */ char *fread_string( FILE *fp ) { char buf[MAX_STRING_LENGTH]; 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 >= (MAX_STRING_LENGTH - 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[MAX_STRING_LENGTH]; 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 >= (MAX_STRING_LENGTH - 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[MAX_STRING_LENGTH]; 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 >= (MAX_STRING_LENGTH - 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[MAX_INPUT_LENGTH]; 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 + MAX_INPUT_LENGTH; 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[MAX_INPUT_LENGTH]; int hash; CHAR_DATA *wch; extern bool limits_off; extern bool LOAD_LIMITED; argument = one_argument( argument, arg ); ch_printf( ch, "Affects %5d Areas %5d\n\r", top_affect, top_area ); ch_printf( ch, "ExtDes %5d Exits %5d\n\r", top_ed, top_exit ); ch_printf( ch, "Helps %5d Resets %5d\n\r", top_help, top_reset ); ch_printf( ch, "IdxMobs %5d Mobs %5d\n\r", top_mob_index, nummobsloaded ); ch_printf( ch, "IdxObjs %5d Objs %5d (%d)\n\r", top_obj_index, numobjsloaded, physicalobjects ); ch_printf( ch, "Rooms %5d VRooms %5d\n\r", top_room, top_vroom ); ch_printf( ch, "Shops %5d RepShps %5d\n\r", top_shop, top_repair ); ch_printf( ch, "CurOq's %5d CurCq's %5d\n\r", cur_qobjs, cur_qchars ); ch_printf( ch, "Players %5d Maxplrs %5d\n\r", num_descriptors, sysdata.maxplayers ); ch_printf( ch, "MaxEver %5d Topsn %5d (%d)\n\r", sysdata.alltimemax, top_sn, MAX_SKILL ); ch_printf( ch, "MaxEver time recorded at: %s\n\r", sysdata.time_of_max ); ch_printf( ch, "Limits: %s LOAD_LIMITED: %s\n\r", limits_off ? "OFF" : "ON", LOAD_LIMITED ? "Alter Limits As Needed" : "Donot Alter Limits at this time." ); 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 } if ( !str_cmp( arg, "roomlist" ) ) { send_to_char("Linked Char->in_room listing (ALL)\n\r",ch); if ( !ch->in_room || !ch->in_room->first_person ) { send_to_char("Fatal ERROR\n",ch); return; } for( wch = ch->in_room->first_person; wch; wch = wch->next_in_room) { if (!wch) { send_to_char("Warning: Null Wch in List.\n",ch); break; } if ( !wch->name ) send_to_char("WARNING -- NULL CHAR IN LIST HERE!\n",ch); else ch_printf( ch, "Ch: %s Zone: %d Vnum: %d Master: %s Area: %s\n",wch->name,wch->in_room->area->zone->number, wch->in_room->vnum,wch->master, ch->in_room->area->filename); } } if ( !str_cmp( arg, "limitlist" ) ) { extern LIMIT_DATA *first_limit; LIMIT_DATA *limit, *next_limit; char limit_buf[MSL]; for( limit = first_limit; limit; limit = next_limit ) { next_limit = limit->next; sprintf(limit_buf,"Z:%d Vnum: %d Loaded: %d Limit: %d\n\r",limit->zone,limit->vnum, limit->loaded, limit->limit); send_to_char(limit_buf,ch); } } if ( !str_cmp( arg, "charlist" ) ) { send_to_char("Linked Char Listing (!NPC):\n\r",ch); for ( wch = first_char; wch; wch = wch->next ) { if ( !wch ) { send_to_char("Warning: Null Wch in list.\n",ch); continue; } /* if ( !IS_NPC(wch) ) {*/ if ( !wch->name ) send_to_char("WARNING -- NULL CHAR IN LIST HERE!\n",ch); else ch_printf( ch, "%s\n",wch->name); /* }*/ } } if ( !str_cmp(arg,"cleanpk")) pk_list_cleaner(); if ( !str_cmp(arg,"overlimit") ) { overlimit_msg(); show_overlimit(ch); } if ( !str_cmp(arg,"inroomupdate")) inroom_update(); 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. */ long number_range( int from, int to ) { /* int power; int number;*/ if ( ( to = to - from + 1 ) <= 1 ) return from; /* for ( power = 2; power < to; power <<= 1 ) ; while ( ( number = number_mm( ) & (power - 1) ) >= to ) ; return from + number;*/ return (number_mm() % to) + 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; } /* * 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; } long number_mm( void ) { int *piState; long iState1; long iState2; long 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; } /* * 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[MAX_STRING_LENGTH]; 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." ); bug( astr ); 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; if ( !astr || !bstr ) return FALSE; 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( char *str ) { static char strcap[MAX_STRING_LENGTH]; int i=0; record_call("<capitalize>"); strcap[0] = '\0'; if ( str == NULL ) return NULL; 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[MAX_STRING_LENGTH]; 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[MAX_STRING_LENGTH]; 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 = tolower( 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[MAX_STRING_LENGTH]; if ( !str ) { bug( "Aoran(): NULL str" ); return ""; } if ( isavowel(str[0]) || ( strlen(str) > 1 && tolower(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; new_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 ); new_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 ); new_fclose( fp ); } return; } /* * Reports a bug. */ void bug( const char *str, ... ) { char buf[MAX_STRING_LENGTH]; FILE *fp; struct stat fst; if ( str == NULL ) return; 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++ ) { if (!iChar) break; if ( !fpArea ) break; while ( getc( fpArea ) != '\n' ); } fseek( fpArea, iChar, 0 ); } if ( !strArea ) return; if ( iLine <= 0 ) return; if ( iLine > 3900 ) return; sprintf( buf, "[*****] FILE: %s LINE: %d", strArea, iLine ); if ( strlen(buf) > 4096 ) return; log_string( buf ); if ( stat( SHUTDOWN_FILE, &fst ) != -1 ) /* file exists */ { if ( ( fp = fopen( SHUTDOWN_FILE, "a" ) ) != NULL ) { fprintf( fp, "[*****] %s\n", buf ); new_fclose( fp ); } } } strcpy( buf, "[*****] BUG: " ); { va_list param; va_start(param, str); vsprintf( buf + strlen(buf), str, param ); va_end(param); } log_string( buf ); new_fclose( fpLOG ); if ( ( fp = fopen( BUG_FILE, "a" ) ) != NULL ) { fprintf( fp, "%s\n", buf ); new_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[MAX_STRING_LENGTH]; FILE *fp; va_list param; if ( str == NULL ) return; strcpy( buf, "[*****] BOOT: " ); va_start(param, str); vsprintf( buf+strlen(buf), str, param ); va_end(param); log_string( buf ); new_fclose( fpLOG ); if ( ( fp = fopen( BOOTLOG_FILE, "a" ) ) != NULL ) { fprintf( fp, "%s\n", buf ); new_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[MAX_STRING_LENGTH]; int c; int num = 0; if ( (fp = fopen( filename, "r" )) != NULL ) { while ( !feof(fp) ) { while ((buf[num]=fgetc(fp)) != EOF && buf[num] != '\n' && buf[num] != '\r' && num < (MAX_STRING_LENGTH-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'; if ( strlen(buf) > 32000 ) { bug("Strlen Greater then 32000: show_file",0); buf[32000] = '\0'; } if ( ( send_to_pager( buf, ch ) )==FALSE) return; num = 0; } } new_fclose(fp); } /* * Show the boot log file -Thoric */ void do_dmesg( CHAR_DATA *ch, char *argument ) { send_to_char("Command Curently Disabled.\n\r",ch); return; set_pager_color( AT_LOG, ch ); show_file( ch, BOOTLOG_FILE ); } void do_buglog( CHAR_DATA *ch, char *argument ) { send_to_char("Command Curently Disabled.\n\r",ch); return; set_pager_color( AT_LOG, ch ); show_file( ch, BUG_FILE ); } void do_memlog( CHAR_DATA *ch, char *argument ) { send_to_char("Command Curently Disabled.\n\r",ch); return; set_pager_color( AT_LOG, ch ); show_file( ch, MEMLOG_FILE ); } void do_mudlog( CHAR_DATA *ch, char *argument ) { send_to_char("Command Curently Disabled. Im SURE you meant Muststat :) --GW\n\r",ch); return; set_pager_color( AT_LOG, ch ); show_file( ch, MUDLOG_FILE ); } void do_crashlog( CHAR_DATA *ch, char *argument ) { send_to_char("Command Curently Disabled.\n\r",ch); return; set_pager_color( AT_LOG, ch ); show_file( ch, CRASH_FILE ); } /* Show the CR Log */ void do_crlog( CHAR_DATA *ch, char *argument ) { set_pager_color( AT_LOG, ch ); show_file( ch, "../system/CRLOG" ); } /* * 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; /* FILE *fp;*/ /* disabled for now --GW if ( ( fp = fopen( MUDLOG_FILE, "a" ) ) == NULL ) { bug("Cannot Open mudlog File!",0); perror( MUDLOG_FILE ); } */ strtime = ctime( ¤t_time ); strtime[strlen(strtime)-1] = '\0'; fprintf( stderr, "%s :: %s\n", strtime, str ); /* if ( mudlog_off == FALSE ) fprintf( fp, "%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, "[ ** ", level ); break; case LOG_BUILD: to_channel( str + offset, CHANNEL_BUILD, "[ ** ", level ); break; case LOG_COMM: to_channel( str + offset, CHANNEL_COMM, "[ ** ", level ); break; case LOG_ALL: break; } /* new_fclose(fp);*/ return; } #define WEBWIZLIST_FILE SYSTEM_DIR "WEBWIZLIST" /* * wizlist builder! -Thoric * Web Version --GW */ void towebwizfile( const char *line ) { int filler, xx; char outline[MAX_STRING_LENGTH]; 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, "<BR>" ); wfp = fopen( WEBWIZLIST_FILE, "a" ); if ( wfp ) { fputs( outline, wfp ); new_fclose( wfp ); } } /* * wizlist builder! -Thoric */ void towizfile( const char *line ) { int filler, xx; char outline[MAX_STRING_LENGTH]; 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 ); new_fclose( wfp ); } } void add_to_wizlist( char *name, int level, int flags ) { WIZENT *wiz=NULL, *tmp=NULL; #ifdef DEBUG log_string( "Adding to wizlist..." ); #endif CREATE( wiz, WIZENT, 1 ); wiz->name = str_dup( name ); wiz->level = level; wiz->flags = flags; 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; } /* * Web Wizlist builder -Thoric * Modified by GW */ void make_web_wizlist( ) { DIR *dp; struct dirent *dentry; FILE *gfp; char *word; int ilevel, iflags; WIZENT *wiz, *wiznext; char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; int cnt=0; if ( !fBootDb ) { for ( wiz = first_wiz; wiz; wiz = wiznext ) { wiznext = wiz->next; if ( wiz ) { DISPOSE(wiz->name); DISPOSE(wiz); } } } 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 ); sprintf( buf2, "%s", 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; new_fclose( gfp ); add_to_wizlist( dentry->d_name, ilevel, iflags ); if ( !IS_SET( iflags, PCFLAG_GUEST ) && !IS_SET( iflags, PCFLAG_RETIRED) ) cnt++; } } dentry = readdir( dp ); } closedir( dp ); buf[0] = '\0'; unlink( WEBWIZLIST_FILE ); towebwizfile( "<CENTER>" ); towebwizfile( "-----===={== <B><I>Age of the Ancients Immortals</B></I> ==}===-----"); ilevel = 65535; for ( wiz = first_wiz; wiz; wiz = wiz->next ) { if ( IS_SET( wiz->flags, PCFLAG_RETIRED ) || IS_SET( wiz->flags, PCFLAG_GUEST ) ) continue; if ( wiz->level < ilevel ) { if ( buf[0] ) { towebwizfile( buf ); buf[0] = '\0'; } towebwizfile( "" ); ilevel = wiz->level; switch(ilevel) { case MAX_LEVEL - 0: towebwizfile( "<B><~> <I>HYPERION</I> <~></B>");break; case MAX_LEVEL - 1: towebwizfile( "<B><~> <I>COMMITTEE</I> <~></B>");break; case MAX_LEVEL - 2: towebwizfile( "<B><~> <I>COUNCIL</I> <~></B>");break; case MAX_LEVEL - 3: towebwizfile( "<B><~> <I>HEAD GOD</I> <~></B>");break; case MAX_LEVEL - 4: towebwizfile( "<B><~> <I>GOD</I> <~></B>");break; case MAX_LEVEL - 5: towebwizfile( "<B><~> <I>FATE</I> <~></B>");break; case MAX_LEVEL - 6: towebwizfile( "<B><~> <I>TITAN</I> <~></B>");break; case MAX_LEVEL - 7: towebwizfile( "<B><~> <I>LORD</I> <~></B>");break; case MAX_LEVEL - 8: towebwizfile( "<B><~> <I>WIZARD</I> <~></B>");break; case MAX_LEVEL - 9: towebwizfile( "<B><~> <I>EMPATH</I> <~></B>");break; default: towebwizfile( "<B><~> <I>BUG</I> <~></B>" );break; } } if ( strlen( buf ) + strlen( wiz->name ) > 76 ) { towebwizfile( buf ); buf[0] = '\0'; } strcat( buf, " " ); strcat( buf, wiz->name ); if ( strlen( buf ) > 70 ) { towebwizfile( buf ); buf[0] = '\0'; } } if ( buf[0] ) towebwizfile( buf ); towebwizfile( "</CENTER>" ); sprintf( buf, "\n\r<B>Total Immortals:</B> <I>%d</I>\n\r",cnt); towebwizfile( buf ); } /* * Wizlist builder -Thoric */ void make_wizlist( ) { DIR *dp; struct dirent *dentry; FILE *gfp; char *word; int ilevel, iflags; WIZENT *wiz, *wiznext; char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; int cnt=0; if ( !fBootDb ) { for ( wiz = first_wiz; wiz; wiz = wiznext ) { wiznext = wiz->next; if ( wiz ) { DISPOSE(wiz->name); DISPOSE(wiz); } } } 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 ); sprintf( buf2, "%s", 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; new_fclose( gfp ); add_to_wizlist( dentry->d_name, ilevel, iflags ); if ( !IS_SET( iflags, PCFLAG_GUEST ) && !IS_SET( iflags, PCFLAG_RETIRED) ) cnt++; } } dentry = readdir( dp ); } closedir( dp ); buf[0] = '\0'; unlink( WIZLIST_FILE ); ilevel = 65535; towizfile( "-----===={== Age of the Ancients Immortals ==}===-----" ); for ( wiz = first_wiz; wiz; wiz = wiz->next ) { if ( IS_SET( wiz->flags, PCFLAG_RETIRED ) || IS_SET( wiz->flags, PCFLAG_GUEST ) ) continue; if ( wiz->level < ilevel ) { if ( buf[0] ) { towizfile( buf ); buf[0] = '\0'; } towizfile( "" ); ilevel = wiz->level; switch(ilevel) { case MAX_LEVEL - 0: towizfile( "<~> HYPERION <~> " );break; case MAX_LEVEL - 1: towizfile( "<~> COMMITTEE <~> " );break; case MAX_LEVEL - 2: towizfile( "<~> COUNCIL <~>" );break; case MAX_LEVEL - 3: towizfile( "<~> HEAD GOD <~>" );break; case MAX_LEVEL - 4: towizfile( "<~> GOD <~>" );break; case MAX_LEVEL - 5: towizfile( "<~> FATE <~>" );break; case MAX_LEVEL - 6: towizfile( "<~> TITAN <~>" );break; case MAX_LEVEL - 7: towizfile( "<~> LORD <~>" );break; case MAX_LEVEL - 8: towizfile( "<~> WIZARD <~>" );break; case MAX_LEVEL - 9: towizfile( "<~> EMPATH <~>" );break; default: towizfile( "<~> BUG <~>" ); 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 ); sprintf( buf, "\n\rTotal Immortals: %d\n\r",cnt); towizfile( buf ); } void do_makewizlist( CHAR_DATA *ch, char *argument ) { make_wizlist(); make_web_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[ MAX_INPUT_LENGTH ]; FILE *progfile; char letter; MPROG_DATA *mprg_next=NULL, *mprg2=NULL; 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: pMobIndex->progtypes = 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; } } new_fclose( progfile ); return mprg2; } /* Load a MUDprogram section from the area file. */ void load_mudprogs( AREA_DATA *tarea, FILE *fp ) { MOB_INDEX_DATA *iMob=NULL; MPROG_DATA *original=NULL; MPROG_DATA *working=NULL; 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,(int)tarea->zone->number ) ) ==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=NULL; 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: pMobIndex->progtypes = 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[ MAX_INPUT_LENGTH ]; FILE *progfile=NULL; char letter; MPROG_DATA *mprg_next=NULL, *mprg2=NULL; 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: pObjIndex->progtypes = 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; } } new_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=NULL; MPROG_DATA *working=NULL; 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,(int)tarea->zone->number ) ) ==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=NULL; 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: pObjIndex->progtypes = 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[ MAX_INPUT_LENGTH ]; FILE *progfile; char letter; MPROG_DATA *mprg_next=NULL, *mprg2=NULL; 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: RoomIndex->progtypes = 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; } } new_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=NULL; MPROG_DATA *working=NULL; 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,(int)tarea->zone->number ) ) ==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=NULL; 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: pRoomIndex->progtypes = 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; } /*************************************************************/ /* Function to delete a room index. Called from do_rdelete in build.c Narn, May/96 */ bool delete_room( ROOM_INDEX_DATA *room, int zone ) { int iHash; ROOM_INDEX_DATA *tmp, *prev=NULL; ZONE_DATA *in_zone; iHash = room->vnum % MAX_KEY_HASH; if( (in_zone=find_zone(zone))==NULL) { bug("delete_room: ZONE ACCESS VIOLATION!!! STOPING NOW!",0); return FALSE; } /* Take the room index out of the hash list. */ for( tmp = in_zone->room_index_hash[iHash]; tmp && tmp != room; tmp = tmp->next ) { prev = tmp; } if( !tmp ) { bug( "Delete_room: room not found" ); return FALSE; } if( prev ) { prev->next = room->next; } else { in_zone->room_index_hash[iHash] = room->next; } /* Free up the ram for all strings attached to the room. */ STRFREE( room->name ); STRFREE( room->description ); /* Free up the ram held by the room index itself. */ DISPOSE( room ); top_room--; return TRUE; } /* See comment on delete_room. */ bool delete_obj( OBJ_INDEX_DATA *obj ) { return TRUE; } /* See comment on delete_room. */ bool delete_mob( MOB_INDEX_DATA *mob ) { return TRUE; } /* * Creat a new room (for online building) -Thoric */ ROOM_INDEX_DATA *make_room( int vnum, int zone ) { ROOM_INDEX_DATA *pRoomIndex=NULL; int iHash; ZONE_DATA *in_zone=NULL; if( !(in_zone=find_zone(zone)) ) { bug("Make_Room: ZONE ACCESS VIOLATION!!! Stoping.",0); return NULL; } 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(""); pRoomIndex->music = STRALLOC(""); pRoomIndex->room_flags = ROOM_PROTOTYPE; pRoomIndex->sector_type = 1; pRoomIndex->light = 0; pRoomIndex->level = 0; pRoomIndex->first_exit = NULL; pRoomIndex->last_exit = NULL; pRoomIndex->area = find_room_area(pRoomIndex->vnum); iHash = vnum % MAX_KEY_HASH; pRoomIndex->next = in_zone->room_index_hash[iHash]; in_zone->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 zone ) { OBJ_INDEX_DATA *pObjIndex=NULL, *cObjIndex=NULL; char buf[MAX_STRING_LENGTH]; int iHash; ZONE_DATA *in_zone; if ( !(in_zone=find_zone(zone)) ) { bug("Make_Object: ZONE ACCESS VIOLATION!!!! Stoping.",0); return NULL; } if ( cvnum > 0 ) cObjIndex = get_obj_index( cvnum, zone ); 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; pObjIndex->extra_flags = ITEM_PROTOTYPE; pObjIndex->wear_flags = 0; pObjIndex->value[0] = 0; pObjIndex->value[1] = 0; pObjIndex->value[2] = 0; pObjIndex->value[3] = 0; pObjIndex->weight = 1; pObjIndex->cost = 0; pObjIndex->area = find_obj_area(pObjIndex->vnum); } else { EXTRA_DESCR_DATA *ed=NULL, *ced=NULL; AFFECT_DATA *paf=NULL, *cpaf=NULL; 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 | ITEM_PROTOTYPE; pObjIndex->second_flags = cObjIndex->second_flags; pObjIndex->wear_flags = cObjIndex->wear_flags; pObjIndex->minlevel = cObjIndex->minlevel; pObjIndex->ego = cObjIndex->ego; 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->weight = cObjIndex->weight; pObjIndex->cost = cObjIndex->cost; pObjIndex->area = find_obj_area(pObjIndex->vnum); 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 = in_zone->obj_index_hash[iHash]; in_zone->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, int zone ) { MOB_INDEX_DATA *pMobIndex=NULL, *cMobIndex=NULL; char buf[MAX_STRING_LENGTH]; int iHash; ZONE_DATA *in_zone=NULL; if ( !(in_zone=find_zone(zone)) ) { bug("Make_Mobile: ZONE ACCESS VIOLATION! Stoping."); return NULL; } if ( cvnum > 0 ) cMobIndex = get_mob_index( cvnum, zone ); 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]); pMobIndex->act = ACT_IS_NPC | ACT_PROTOTYPE; pMobIndex->flags = 0; xCLEAR_BITS(pMobIndex->affected_by); pMobIndex->pShop = NULL; pMobIndex->rShop = NULL; pMobIndex->spec_fun = NULL; pMobIndex->mudprogs = NULL; pMobIndex->progtypes = 0; pMobIndex->alignment = 0; pMobIndex->level = 1; pMobIndex->mobthac0 = 0; pMobIndex->ac = 0; pMobIndex->hitnodice = 0; pMobIndex->hitsizedice = 0; pMobIndex->hitplus = 0; pMobIndex->damnodice = 0; pMobIndex->damsizedice = 0; pMobIndex->damplus = 0; pMobIndex->gold = 0; pMobIndex->exp = 0; pMobIndex->position = 8; pMobIndex->defposition = 8; pMobIndex->sex = 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->race = 0; pMobIndex->class = 3; pMobIndex->xflags = 0; pMobIndex->resistant = 0; pMobIndex->immune = 0; pMobIndex->susceptible = 0; pMobIndex->numattacks = 0; pMobIndex->attacks = 0; pMobIndex->defenses = 0; pMobIndex->area = find_mob_area(pMobIndex->vnum); } else { pMobIndex->short_descr = QUICKLINK( cMobIndex->short_descr ); pMobIndex->long_descr = QUICKLINK( cMobIndex->long_descr ); pMobIndex->description = QUICKLINK( cMobIndex->description ); pMobIndex->act = cMobIndex->act | ACT_PROTOTYPE; pMobIndex->flags = 0; pMobIndex->acttwo = cMobIndex->acttwo; pMobIndex->smart = cMobIndex->smart; pMobIndex->affected_by = cMobIndex->affected_by; pMobIndex->pShop = NULL; pMobIndex->rShop = NULL; pMobIndex->spec_fun = cMobIndex->spec_fun; pMobIndex->mudprogs = NULL; pMobIndex->progtypes = 0; pMobIndex->alignment = cMobIndex->alignment; pMobIndex->level = cMobIndex->level; 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->gold = cMobIndex->gold; pMobIndex->exp = cMobIndex->exp; pMobIndex->position = cMobIndex->position; pMobIndex->defposition = cMobIndex->defposition; pMobIndex->sex = cMobIndex->sex; 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->race = cMobIndex->race; pMobIndex->class = cMobIndex->class; pMobIndex->xflags = cMobIndex->xflags; pMobIndex->resistant = cMobIndex->resistant; pMobIndex->immune = cMobIndex->immune; pMobIndex->susceptible = cMobIndex->susceptible; pMobIndex->numattacks = cMobIndex->numattacks; pMobIndex->attacks = cMobIndex->attacks; pMobIndex->defenses = cMobIndex->defenses; pMobIndex->area = find_mob_area(pMobIndex->vnum); } SET_BIT( pMobIndex->act, ACT_IS_NPC ); iHash = vnum % MAX_KEY_HASH; pMobIndex->next = in_zone->mob_index_hash[iHash]; in_zone->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=NULL, *texit=NULL; bool broke; CREATE( pexit, EXIT_DATA, 1 ); pexit->vdir = door; pexit->rvnum = pRoomIndex->vnum; pexit->to_room = to_room; pexit->distance = 1; 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; int in_zone; if ( tarea->zone ) in_zone = tarea->zone->number; else in_zone = 1; for ( rnum = tarea->low_r_vnum; rnum <= tarea->hi_r_vnum; rnum++ ) { if ( (pRoomIndex = get_room_index( rnum,in_zone )) ==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,in_zone ); } if ( !fexit ) SET_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,in_zone )) ==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_zone_file( ZONE_DATA *tzone, char *filename ) { if ( fBootDb ) tzone = last_zone; if ( !fBootDb && !tzone ) { bug( "Load_zone: null zone!" ); return; } if ( ( fpArea = fopen( filename, "r" ) ) == NULL ) { perror( filename ); bug( "load_zone: error loading file (can't open)" ); bug( filename ); return; } for ( ; ; ) { char *word; if ( fread_letter( fpArea ) != '#' ) { bug( tzone->filename ); bug( "load_zone: # not found." ); exit( 1 ); } word = fread_word( fpArea ); if ( word[0] == '$' ) break; else if ( !str_cmp( word, "ZONE" ) ) { if ( fBootDb ) { load_zone_header (fpArea); tzone = last_zone; } else { DISPOSE( tzone->name ); tzone->name = fread_string_nohash( fpArea ); } } /* GW */ else if ( !str_cmp( word, "NUMBER" ) ) load_zone_number (tzone,fpArea); else if ( !str_cmp( word, "LIST_NAME" ) ) load_zone_lname (tzone,fpArea); else { bug( tzone->filename ); bug( "load_zone: bad section name." ); if ( fBootDb ) exit( 1 ); else { new_fclose( fpArea ); fpArea = NULL; return; } } } new_fclose( fpArea ); fpArea = NULL; if ( tzone ) { fprintf( stderr, "%-14s Zone #: %d\n", tzone->name,tzone->number ); top_zone++; } else fprintf( stderr, "(%s)\n", filename ); } 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; } 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, "VERSION" ) ) load_version (tarea, 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, "RESETMSG" ) ) load_resetmsg(tarea, fpArea); else if ( !str_cmp( word, "CLUB" ) ) load_club (tarea,fpArea); else if ( !str_cmp( word, "MAPFILE" ) ) load_mapfile (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, "VEHICLES" ) ) load_vehicles(tarea, fpArea); else { bug( tarea->filename ); bug( "load_area: bad section name." ); if ( fBootDb ) exit( 1 ); else { new_fclose( fpArea ); fpArea = NULL; return; } } } new_fclose( fpArea ); fpArea = NULL; if ( tarea ) { if ( fBootDb ) 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 ); } /* 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[MAX_STRING_LENGTH]; AREA_DATA *pArea=NULL; char line[81]; char word[81]; int low, hi; int mlow, mhi, olow, ohi, rlow, rhi; bool badfile = FALSE; char temp; struct stat fst; 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; } new_fclose( fp ); if ( rlow && rhi && !badfile ) { sprintf( buf, "%s%s.are", BUILD_DIR, dentry->d_name ); if ( stat( buf, &fst ) != -1 ) { if ( !(fp = fopen( buf, "r" )) ) { bug( "Load_buildlist: cannot open area file for read" ); perror( buf ); dentry = readdir(dp); continue; } } else { 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 ); new_fclose( fp ); dentry = readdir(dp); continue; } #endif pArea=NULL; 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 new_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); } /* * 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_LOADED) ) loaded++; if ( IS_SET( pArea->status, AREA_DELETED ) ) continue; if ( pArea->low_r_vnum < low ) continue; if ( pArea->hi_r_vnum > high ) break; if ( !shownl ) continue; if ( pArea->low_r_vnum > 0 && pArea->hi_r_vnum > 0 ) { pager_printf(ch, "%-15s| Rooms: %5d - %-5d" " Objs: %5d - %-5d Mobs: %5d - %-5d%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[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; int low, high; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); low = 0; high = 32766; 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[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; int low, high; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); low = 0; high = 32766; 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[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; int low, high; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); low = 0; high = 32766; 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[MAX_INPUT_LENGTH]; APPROVE_DATA *approve, *next_approve; sprintf( filename, "%ssysdata.dat", SYSTEM_DIR ); // new_fclose( fpReserve ); if ( ( fp = fopen( filename, "w" ) ) == NULL ) { bug( "save_sysdata: fopen" ); perror( filename ); } else { fprintf( fp, "#SYSTEM\n" ); fprintf( fp, "Highplayers %d\n", sys.alltimemax ); fprintf( fp, "Highplayertime %s~\n", sys.time_of_max ); fprintf( fp, "Nameresolving %d\n", sys.NO_NAME_RESOLVING ); fprintf( fp, "Waitforauth %d\n", sys.WAIT_FOR_AUTH ); fprintf( fp, "Game_Wizlocked %d\n", sys.GAME_WIZLOCKED ); fprintf( fp, "Rent_Ratio %d\n", sys.rent_ratio ); fprintf( fp, "Max_Hp %d\n", sys.max_hp ); fprintf( fp, "Max_Mana %d\n", sys.max_mana ); fprintf( fp, "Maxaward %d\n", sys.maxaward ); fprintf( fp, "SegVio %d\n", sys.segvio ); fprintf( fp, "WebServ %d\n", sys.webserv ); fprintf( fp, "ConnectSound %s~\n",sys.connectsound ); fprintf( fp, "EnterSound %s~\n",sys.entersound ); fprintf( fp, "Readallmail %d\n", sys.read_all_mail ); 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, "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, "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, "PKChamp %s~\n", sys.pkchamp ); fprintf( fp, "BootTime %d\n", (int)sys.boottime ); fprintf( fp, "MaxPlrsBoot %d\n", sys.max_plrs_boot ); fprintf( fp, "Logins %d\n", sys.logins ); fprintf( fp, "Saveflags %d\n", sys.save_flags ); fprintf( fp, "Savefreq %d\n", sys.save_frequency ); /* Save Approves --GW */ if ( EMAIL_AUTH ) { for ( approve = sysdata.first_approve; approve; approve = next_approve ) { next_approve = approve->next; fprintf(fp,"APPROVE %s %s~\n",approve->email, approve->password); } } fprintf( fp, "End\n\n" ); fprintf( fp, "#END\n" ); } new_fclose( fp ); // fpReserve = fopen( NULL_FILE, "r" ); return; } void fread_sysdata( SYSTEM_DATA *sys, FILE *fp ) { char *word=NULL; bool fMatch=FALSE; sys->time_of_max = 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': /* Load Approves --GW */ if ( !str_cmp( word, "APPROVE" ) ) { char *appstring; char app_email[MSL], app_pass[MSL]; APPROVE_DATA *approve=NULL; fMatch=TRUE; appstring=fread_string(fp); appstring=one_argument( appstring, app_email ); appstring=one_argument( appstring, app_pass ); CREATE(approve, APPROVE_DATA, 1 ); approve->email = STRALLOC( app_email ); approve->password = STRALLOC( app_pass ); LINK(approve, sysdata.first_approve, sysdata.last_approve, next, prev); sprintf(log_buf,"Loaded Approval: E:%s P:%s",approve->email, approve->password); log_string(log_buf); break; } break; case 'B': KEY( "Build", sys->build_level, fread_number( fp ) ); KEY( "BootTime", sys->boottime, fread_number( fp ) ); break; case 'C': KEY( "ConnectSound", sys->connectsound, fread_string( 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 ) ); break; case 'E': KEY( "EnterSound", sys->entersound, fread_string( fp ) ); if ( !str_cmp( word, "End" ) ) { if ( !sys->time_of_max ) sys->time_of_max = str_dup("(not recorded)"); return; } break; case 'F': KEY( "Forcepc", sys->level_forcepc, fread_number( fp ) ); break; case 'G': KEY( "Game_Wizlocked", sys->GAME_WIZLOCKED, 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( "IMCMailVnum", sys->imc_mail_vnum, fread_number( fp ) ); break; case 'L': KEY( "Log", sys->log_level, fread_number( fp ) ); KEY( "Logins", sys->logins, fread_number( fp ) ); break; case 'M': KEY( "Msetplayer", sys->level_mset_player, fread_number( fp ) ); KEY( "Muse", sys->muse_level, fread_number( fp ) ); KEY( "Max_Hp", sys->max_hp, fread_number( fp ) ); KEY( "Max_Mana", sys->max_mana, fread_number( fp ) ); KEY( "Maxaward", sys->maxaward, fread_number( fp ) ); KEY( "MaxPlrsBoot", sys->max_plrs_boot, fread_number( fp ) ); break; case 'N': KEY( "Nameresolving", sys->NO_NAME_RESOLVING, fread_number( fp ) ); break; case 'O': KEY( "Overridepriv", sys->level_override_private, fread_number( fp ) ); break; case 'P': KEY( "Protoflag", sys->level_modify_proto, fread_number( fp ) ); KEY( "PKChamp", sys->pkchamp, fread_string( fp ) ); break; case 'R': KEY( "Readallmail", sys->read_all_mail, fread_number( fp ) ); KEY( "Readmailfree", sys->read_mail_free, fread_number( fp ) ); KEY( "Rent_Ratio", sys->rent_ratio, fread_number( fp ) ); break; case 'S': 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( "Savefreq", sys->save_frequency, fread_number( fp ) ); KEY( "SegVio", sys->segvio, fread_number( fp ) ); break; case 'T': KEY( "Takeothersmail", sys->take_others_mail, fread_number( fp ) ); KEY( "Think", sys->think_level, fread_number( fp ) ); break; case 'W': KEY( "Waitforauth", sys->WAIT_FOR_AUTH, fread_number( fp ) ); KEY( "Writemailfree", sys->write_mail_free, fread_number( fp ) ); KEY( "WebServ", sys->webserv, 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[MAX_INPUT_LENGTH]; 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; } } new_fclose( fp ); } if ( !sysdata.guild_overseer ) sysdata.guild_overseer = str_dup( "" ); if ( !sysdata.guild_advisor ) sysdata.guild_advisor = str_dup( "" ); return found; } void load_banlist( void ) { BAN_DATA *pban=NULL; FILE *fp=NULL; int number; char letter; if ( !(fp = fopen( SYSTEM_DIR BAN_LIST, "r" )) ) return; for ( ; ; ) { if ( feof( fp ) ) { bug( "Load_banlist: no -1 found." ); new_fclose( fp ); return; } number = fread_number( fp ); if ( number == -1 ) { new_fclose( fp ); return; } pban=NULL; CREATE( pban, BAN_DATA, 1 ); pban->level = number; pban->name = fread_string_nohash( fp ); if ( (letter = fread_letter(fp)) == '~' ) pban->ban_time = fread_string_nohash( fp ); else { ungetc(letter, fp); pban->ban_time = str_dup( "(unrecorded)" ); } pban->ban_issuer = fread_string_nohash( fp ); LINK( pban, first_ban, last_ban, next, prev ); } } /* Run Grux --GW */ void clean_pfiles( void ) { log_string("Scanning for Old Player Files......."); system("/home/mud/aota/aoa/system/grux >> /home/mud/aota/aoa/system/grux.log"); log_string("Done. Check grux.log in the System Dir for Details."); log_string("Compressing Player Files...."); system("gzip -rf /home/mud/aota/aoa/player"); log_string("Done."); return; } void clean_lfiles( void ) { log_string("Scanning for Old Locker Files......."); system("/home/mud/aota/aoa/system/locker >> /home/mud/aota/aoa/system/locker.log"); log_string("Done. Check locker.log in the System Dir for Details."); return; } /* Check to make sure range of vnums is free - Scryn 2/27/96 */ void do_check_vnums( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; AREA_DATA *pArea; char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; 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 > 32767 ) { send_to_char("Invalid argument for bottom of range.\n\r", ch); return; } if (high_range < 1 || high_range > 32767 ) { 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; } /* * Find what area a room vnum is in --GW * ability to search proto areas added --GW */ AREA_DATA *find_room_area( int vnum ) { AREA_DATA *temp; AREA_DATA *temp_next; for( temp = first_build; temp; temp = temp_next ) { temp_next = temp->next; if ( ( temp->low_r_vnum <= vnum ) && ( temp->hi_r_vnum >= vnum ) ) return temp; } for( temp = first_area; temp; temp = temp_next ) { temp_next = temp->next; if ( ( temp->low_r_vnum <= vnum ) && ( temp->hi_r_vnum >= vnum ) ) return temp; } return first_area; } /* * Find what area an object vnum is in --GW * ability to search proto areas added --GW */ AREA_DATA *find_obj_area( int vnum ) { AREA_DATA *temp; AREA_DATA *temp_next; for( temp = first_build; temp; temp = temp_next ) { temp_next = temp->next; if ( ( temp->low_o_vnum <= vnum ) && ( temp->hi_o_vnum >= vnum ) ) return temp; } for( temp = first_area; temp; temp = temp_next ) { temp_next = temp->next; if ( ( temp->low_o_vnum <= vnum ) && ( temp->hi_o_vnum >= vnum ) ) return temp; } return first_area; } /* * Find what area a mob vnum is in --GW * ability to search proto areas added --GW */ AREA_DATA *find_mob_area( int vnum ) { AREA_DATA *temp; AREA_DATA *temp_next; for( temp = first_build; temp; temp = temp_next ) { temp_next = temp->next; if ( ( temp->low_m_vnum <= vnum ) && ( temp->hi_m_vnum >= vnum ) ) return temp; } for( temp = first_area; temp; temp = temp_next ) { temp_next = temp->next; if ( ( temp->low_m_vnum <= vnum ) && ( temp->hi_m_vnum >= vnum ) ) return temp; } return first_area; } /* * 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; }