#include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "emlen.h" #ifdef WINDOWS #include <winsock.h> #include <sys\types.h> #include <direct.h> #else #include <sys/errno.h> #include <netinet/in.h> #include <signal.h> #include <sys/time.h> #include <dirent.h> #endif extern int _filbuf (FILE *); char cl[10024]; unsigned short g_obj_pop[MAX_RANDOMPOP]; unsigned char g_percent[MAX_RANDOMPOP]; unsigned short g_moblist[MAX_RANDOMPOP][10]; bool g_mobpop[10000]; void load_scriptassoc (void); SINGLE_TRIGGER *trigger_list[TMAX_TRIGGERS]; SCRIPT_INFO *info_list; CODE *code_list[256]; SA *sa_head[27]; CHAR_DATA *aggro_check = NULL; bool oldflag = FALSE; time_t bt_tm; int ti = 5; DAM_MSG dmsg; CHR_FUNCTION *cf = NULL; COMMAND *command_hash[256]; POWER pow; int commands = 0; extern char str_boot_time[]; bool allow_anything = FALSE; CHAR_DATA *pedit_found; int min_level; int max_level; CHANNEL *chan_first = NULL; char tmpt[2048]; CHAR_DATA *f_first = NULL; long day_counter; char hugebuf_o[30000]; char *questname[100]; int cons_damage; bool builder_port = FALSE; char reasonone[30]; int arena_timelimit; HELP_DATA *help_first; HELP_DATA *help_last; int desc_rooms; SHOP_DATA *shop_first; SHOP_DATA *shop_last; char *score = NULL; char *sh_score = NULL; char *info = NULL; int current_vnum = 0; int mob_chunk = 0; int room_chunk = 0; int obj_chunk = 0; TEMP_STR *temp_first = NULL; TEMP_STR *temp_free = NULL; BLIST *base_blist = NULL; CHAR_DATA *auction_char; CHAR_DATA *auction_tochar; CHAR_DATA *e_auction_char; CHAR_DATA *e_auction_tochar; bool pet_flag = TRUE; bool refresh_oldchars = FALSE; DAM_STRUCT damt; bool got = TRUE; int max_connected; int sac_vnums[30]; int sac_points[30]; short combat_state; int ticks_to_reboot; int ticks_to_battlefield; int prize_vnum_1; int prize_vnum_2; long chars_sent; int meg_sent; bool auto_xfer; bool e_auto_xfer; bool changed_spells; AREA_DATA *saving = NULL; CHAR_DATA *char_free = NULL; DESCRIPTION_DATA *extra_descr_free = NULL; NOTE_DATA *note_free = NULL; SINGLE_OBJECT *obj_free = NULL; REALCHAR_DATA *pcdata_free = NULL; MOB_DATA *npcdata_free = NULL; char bug_buf[2 * SML_LENGTH]; CHAR_DATA *char_list; CED_DATA *ced_first; CED_DATA *ced_free; SPELL_DATA *spell_list[SPELL_HASH]; SPELL_DATA *spell_list_2[SPELL_HASH]; short top_ced = 0; short top_temp = 0; bool state_var_1; char *help_greeting; char *help_greeting_a; char log_buf[2 * SML_LENGTH]; PLAYERBASE_DATA *playerbase_zero; NOTE_DATA *note_list; SINGLE_OBJECT *object_list; TIME_INFO_DATA time_info; WEATHER_DATA weather_info; CLAN_DATA *clan_list = NULL; CLAN_DATA *clan_list_2 = NULL; REALCHAR_DATA base_pc; char condition_var[500]; int auction_minbid; int auction_bid; char auction_item[500]; SINGLE_OBJECT *auction_item_g; SINGLE_OBJECT *e_auction_item_e; short auction_going; int e_auction_minbid; int e_auction_bid; char e_auction_item[500]; short e_auction_going; int pulse_timer; short gsn_elbow; short gsn_tap; short gsn_disembowel; short gsn_headbutt; short gsn_bodyslam; short gsn_berserk; short gsn_grunt; short gsn_invest; short gsn_riding; short gsn_circle; short gsn_penetration; short gsn_swim; short gsn_butcher; short gsn_backstab; short gsn_dodge; short gsn_hide; short gsn_peek; short gsn_pick_lock; short gsn_sneak; short gsn_steal; short gsn_bash; short gsn_track; short gsn_disarm; short gsn_enhanced_damage; short gsn_kick; short gsn_parry; short gsn_shield_block; short gsn_rescue; short gsn_second_attack; short gsn_third_attack; short gsn_dual_wield; short gsn_laser; short gsn_pierce; short gsn_slashing; short gsn_concussion; short gsn_heavy_slash; short gsn_light_slash; short gsn_whip; short gsn_search; int bytes_saved = 0; TOPTEN_DATA topten; RATING_DATA ratingd; LIMITED_DATA limited; BID_DATA biddata; short gsn_blindness; short gsn_charm_person; short gsn_curse; short gsn_invis; short gsn_mass_invis; short gsn_poison; short gsn_plague; short gsn_sleep; MOB_PROTOTYPE *mob_index_hash[HASH_MAX]; OBJ_PROTOTYPE *obj_index_hash[HASH_MAX]; ROOM_DATA *room_hash[HASH_MAX]; CLAN_DATA *clan_index_hash[20]; CLAN_DATA *clan_index_hash_2[20]; char *string_hash[HASH_MAX]; int wear_flag (int loc); int wear_location (int loc); int exit_flag (int loc); char *add_newline (char *str); char *get_name (char *str); int room_flag (int loc); AREA_DATA *area_first; AREA_DATA *area_last; char *string_space; char *top_string; int top_spell; char str_empty[1]; int LOG_LEVEL = LEVEL_IMMORTAL; int top_clan = 0; int top_clan_2 = 0; int top_affect = 0; int top_area = 0; int top_ed = 0; int top_exit = 0; int top_help = 0; int top_mob_index = 0; int top_obj_index = 0; int top_reset = 0; int top_room = 0; int top_shop = 0; int top_vnum_mob = 0; int top_vnum_obj = 0; int top_vnum_room = 0; int num_areas = 0; int num_mobs = 0; int num_objs = 0; int num_rooms = 0; int num_shops = 0; int nAllocString; int sAllocString; bool fBootDb; FILE *fpArea; char strArea[SML_LENGTH]; void init_mm (void); void load_playerbase (void); void load_area (FILE * fp); void load_helps (FILE * fp); void load_mobiles (FILE * fp); void load_objects (FILE * fp); void load_rooms (FILE * fp); void load_specials (FILE * fp); void load_notes (void); void load_scripts_2 (char *fn, MOB_PROTOTYPE * pMob); void load_clans (void); void load_clans_2 (void); void load_topten (void); void load_rating (void); void load_bansites (void); void load_limited (int vnum); void fix_exits (void); char *fread_and_compress_string (FILE * fp, CHAR_DATA * ch); void reset_room (ROOM_DATA * pRoom); void set_mob_xp (CHAR_DATA * mob); void cleanup_system (void) { #ifndef WINDOWS DIR *d; struct dirent *e; char *t; if ((d = opendir ("../plr")) == NULL) return; while ((e = readdir (d)) != NULL) { for (t = e->d_name; *t != '\0'; t++) { if (*t == '.') goto tte; } fcheck_pbase (e->d_name); tte: } #endif return; } void save_tps (void) { int i; ROOM_DATA *r; FILE *f; if ((f = fopen ("tps.dat", "w")) == NULL) { fprintf (stderr, "Could not open tps.dat for tps write.\n"); return; } for (i = 0; i < HASH_MAX; i++) { for (r = room_hash[i]; r != NULL; r = r->next) { if (r->tps > 0) { fprintf (f, "%d %d\n", r->vnum, r->tps); } } } fprintf (f, "0 0\n"); fclose (f); return; } void load_tps (void) { FILE *f; ROOM_DATA *r; int rv; if ((f = fopen ("tps.dat", "r")) == NULL) { save_tps (); return; } while ((rv = fread_number (f)) != 0) { if ((r = get_room_index (rv)) == NULL) { fread_number (f); } else { r->tps = fread_number (f); } } fclose (f); return; } void area_sort (AREA_DATA * pArea) { AREA_DATA *fArea; area_last = pArea; if (!area_first) { area_first = pArea; return; } for (fArea = area_first; fArea; fArea = fArea->next) { if (pArea->lvnum == fArea->lvnum || (pArea->lvnum > fArea->lvnum && (!fArea->next || pArea->lvnum < fArea->next->lvnum))) { pArea->next = fArea->next; fArea->next = pArea; return; } } pArea->next = area_first; area_first = pArea; return; } void do_secretlog (CHAR_DATA * ch, char *argy) { DEFINE_COMMAND ("llog", do_secretlog, POSITION_DEAD, 111, LOG_NEVER, "For security only.") log_string (argy); return; } #ifdef SLOW_BOOTUP void sleepy_time (void) { long secDelta; long usecDelta; struct timeval stall_time; secDelta = 1; usecDelta = 0; stall_time.tv_usec = usecDelta; stall_time.tv_sec = secDelta; if (select (0, NULL, NULL, NULL, &stall_time) < 0) { perror ("Game_loop: select: stall"); exit (1); } return; } #endif void set_mob_xp (CHAR_DATA * mob) { /*mob->exp = (((mob->level+1) * (mob->level+2) * 1000) - (mob->level * mob->level * 1000)); mob->exp /= 39; mob->exp += (mob->level<5 ? 0 : (mob->max_hit*5)); mob->exp += (mob->level*((mob->level))*2); */ mob->exp = translate (pow.mob_exp, LEVEL (mob), mob); if (LEVEL (mob) < 7) mob->exp /= 2; if (mob->armor < 70) mob->exp += LEVEL (mob) * 40; if (mob->armor < 0) mob->exp += LEVEL (mob) * 40; if (mob->armor < -55) mob->exp += LEVEL (mob) * 40; if (mob->pIndexData->spec_fun) if (mob->pIndexData->spec_fun == spec_breath_any) mob->exp += LEVEL (mob) * 200; else if (mob->pIndexData->spec_fun == spec_breath_acid || mob->pIndexData->spec_fun == spec_breath_fire || mob->pIndexData->spec_fun == spec_breath_frost || mob->pIndexData->spec_fun == spec_breath_gas || mob->pIndexData->spec_fun == spec_breath_lightning) mob->exp += LEVEL (mob) * 200; else if (mob->pIndexData->spec_fun == spec_poison) mob->exp += LEVEL (mob) * 300; if (mob->pIndexData->hpmult >= 1000) { mob->exp = (mob->exp * (mob->pIndexData->hpmult / 1000)) / 10; } if (mob->exp <= 0) mob->exp = 1; return; } void save_day_counter (void) { FILE *ddd; if ((ddd = fopen ("dayct.dat", "w")) == NULL) { fprintf (stderr, "Error in day counter write.\n"); exit (20); return; } fprintf (ddd, "%ld\nDF_EOF\n", day_counter); fclose (ddd); return; } void load_day_counter (void) { FILE *dct; if ((dct = fopen ("dayct.dat", "r")) == NULL) { day_counter = 105; save_day_counter (); return; } day_counter = fread_number (dct); fclose (dct); return; } void write_damages () { FILE *cr; if ((cr = fopen ("dam.dat", "w")) == NULL) { fprintf (stderr, "You're screwed... couldn't write a dam.dat file!!\n"); exit (1); } fprintf (cr, "Kickd %s\n", damt.kick_dam); fprintf (cr, "END\n"); fclose (cr); return; } void reset_world (void) { int iHash; ROOM_DATA *rid; for (iHash = 0; iHash < HASH_MAX; iHash++) { for (rid = room_hash[iHash]; rid != NULL; rid = rid->next) { reset_room (rid); } } return; } void add_to_list (char *nm, DO_COMMAND * cmd, int pos, int lev, int log_lev, char *help) { COMMAND *newc; newc = mem_alloc (sizeof (*newc)); newc->name = str_dup (nm); newc->do_fun = cmd; newc->position = pos; newc->level = lev; newc->log = log_lev; newc->help = str_dup (help); newc->next = command_hash[UPPER (nm[0])]; command_hash[UPPER (nm[0])] = newc; return; } int seg_count=0; void segfault_handler () { DESCRIPTOR_DATA *d; seg_count++; fprintf (stderr, "Last marked label was %s.\n", cl); /*#ifdef NEW_WORLD*/ fprintf (stderr, "Trapped segfault successfully. This makes %d.\n",seg_count); do_asave (char_list, "changed"); for (d = descriptor_list; d != NULL; d = d->next) { if (!d->character) continue; if (d->connected != CON_PLAYING) continue; write_to_descriptor (d->descriptor, "Game Crash detected! Saving your character's current state.\n\r", 0); save_char_obj (d->character); save_char_tro (d->character); } /*if (seg_count<5) { game_loop_unix(control,0); } else {*/ exit (5); /*}*/ /*#endif*/ return; } void boot_db (void) { FILE *fttr; int hsh; struct timeval now_time; time_t timr; int i, jj, kk; fBootDb = TRUE; cl[0] = '\0'; for (i=0;i<MT;i++) { average_time[i]=0; times_through[i]=0; total_time[i]=0; this_time[i]=0; temp_time[i]=0; } #ifndef WINDOWS signal (SIGSEGV, segfault_handler); #endif bzero (&outgoing, sizeof (outgoing)); bzero (&connection_names, sizeof (connection_names)); connectiond[0] = NULL; connectiond[1] = NULL; connectiond[2] = NULL; connectiond[3] = NULL; connectiond[4] = NULL; for (jj=0; jj<27; jj++) sa_head[jj]=NULL; bzero (&g_mobpop, sizeof (g_mobpop)); bzero (&g_obj_pop, sizeof (g_obj_pop)); bzero (&g_percent, sizeof (g_percent)); for (jj = 0; jj < MAX_RANDOMPOP; jj++) { for (kk = 0; kk < 10; kk++) { g_moblist[jj][kk] = 0; } } bzero (&chan, sizeof (chan)); bzero (&chan_count, sizeof (chan_count)); reasonfd[0] = '\0'; bzero (&command_hash, sizeof (command_hash)); day_counter = 0; bzero (&questname, sizeof (questname)); for (hsh = 0; hsh < HASH_MAX; hsh++) obj_index_hash[hsh] = NULL; for (hsh = 0; hsh < HASH_MAX; hsh++) mob_index_hash[hsh] = NULL; for (hsh = 0; hsh < HASH_MAX; hsh++) room_hash[hsh] = NULL; max_connected = 0; bzero (&spell_list, sizeof (spell_list)); bzero (&spell_list_2, sizeof (spell_list_2)); top_spell = 0; combat_state = 0; fprintf (stderr, "Reading power.dat...\n"); read_power_dat (); fprintf (stderr, "Reading races.dat...\n"); read_race_info (); fprintf (stderr, "Reading channel.dat...\n"); read_channel_data (); fprintf (stderr, "Loading day/year counter...\n"); load_day_counter (); fprintf (stderr, "Reading conflict.dat...\n"); read_conflict_data (); fprintf (stderr, "Reading dam.dat...\n"); read_damages (); fprintf (stderr, "Reading triggers and script code...\n"); load_triggers (); load_code (); fprintf (stderr, "Reading script association strings...\n"); load_scriptassoc (); meg_sent = 0; chars_sent = 0; pulse_timer = 5; pedit_found = NULL; desc_rooms = 0; auction_minbid = 0; auction_bid = 0; auction_item[0] = '\0'; auction_char = NULL; auction_tochar = NULL; auto_xfer = FALSE; e_auto_xfer = FALSE; changed_spells = FALSE; auction_going = 0; e_auction_minbid = 0; ticks_to_reboot = 0; ticks_to_battlefield = 0; prize_vnum_1 = 0; prize_vnum_2 = 0; e_auction_bid = 0; e_auction_item[0] = '\0'; e_auction_char = NULL; e_auction_tochar = NULL; e_auction_going = 0; gettimeofday (&now_time, NULL); timr = (time_t) now_time.tv_sec; fprintf (stderr, "EmlenMUD began bootup proc %s", ((char *) ctime (&timr))); /* * Init random number generator. */ { init_mm (); } #ifdef NEW_WORLD questname[14] = str_dup ("*Has talked to the gnome wizard"); questname[15] = str_dup ("*Has been given the slave's ring"); questname[16] = str_dup ("Gnome Wizard's Ring Quest"); questname[17] = str_dup ("*Dimple flag one"); questname[18] = str_dup ("*Got dimple's answer"); questname[19] = str_dup ("Solved the existance of Dimples"); #endif /* * Set time and weather. */ { long lhour, lday, lmonth; lhour = (current_time - 650336715) / (PULSE_TICK / PULSE_PER_SECOND); if (lhour < 24) lhour = 5000; time_info.hour = lhour % 24; lday = day_counter; time_info.day = day_counter % 35; lmonth = day_counter / 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.winddir = 0; if (time_info.month <= 4 || time_info.month >= 17) weather_info.temperature = number_fuzzy (20); else weather_info.temperature = number_fuzzy (50); weather_info.windspeed = number_range (1, 10); 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 have them. */ if ((fttr = fopen ("reason.fi", "r")) != NULL) { strcpy (reasonone, fread_word (fttr)); fclose (fttr); unlink ("reason.fi"); } else strcpy (reasonone, "Game-Crash"); /* * Read in all the area files. */ { FILE *fpList; if ((fpList = fopen (AREA_LIST, "r")) == NULL) { perror (AREA_LIST); exit (1); } for (;;) { strcpy (strArea, fread_word (fpList)); if (strArea[0] == '$') break; if (strArea[0] == '-') { fpArea = stdin; } else { if ((fpArea = fopen (strArea, "r")) == NULL) { perror (strArea); exit (1); } } for (;;) { char *word; if (fread_letter (fpArea) != '#') { bug ("Boot_db: # not found.", 0); exit (1); } word = fread_word (fpArea); if (word[0] == '$') break; else if (!str_cmp (word, "SPECIALS")) load_specials (fpArea); else if (!str_cmp (word, "HELPS")) { load_helps (fpArea); } else if (!str_cmp (word, "AREADATA")) { load_area (fpArea); #ifdef SLOW_BOOTUP sleepy_time (); #endif } else if (!str_cmp (word, "MOBDATA")) load_mobiles (fpArea); else if (!str_cmp (word, "OBJDATA")) load_objects (fpArea); else if (!str_cmp (word, "ROOMDATA")) load_rooms (fpArea); else { bug ("Bootup: $bad section name", 0); exit (1); } } if (fpArea != stdin) fclose (fpArea); fpArea = NULL; } fclose (fpList); } gettimeofday (&now_time, NULL); timr = (time_t) now_time.tv_sec; fprintf (stderr, "EmlenMUD finished reading area files %s", ((char *) ctime (&timr))); min_level = 0; max_level = 99; free_arena (); dummy_pc (); fix_exits (); fBootDb = FALSE; fprintf (stderr, "Loading notes...\n"); load_notes (); fprintf (stderr, "Loading clans...\n"); load_clans (); fprintf (stderr, "Loading clans 2...\n"); load_clans_2 (); fprintf (stderr, "Loading topten and ratings...\n"); load_topten (); load_rating (); fprintf (stderr, "Loading boats...\n"); load_boats (); fprintf (stderr, "Loading playerbase into memory...\n"); load_playerbase (); fprintf (stderr, "Loading bansites...\n"); load_bansites (); fprintf (stderr, "Loading score.dat, looking for sh_score.dat...\n"); read_score (NULL, ""); fprintf (stderr, "Loading all spells and skills...\n"); load_spells (); fprintf (stderr, "Placing all commands in the hash table...\n"); scanthru_commands (); fprintf (stderr, "Reading commands.dat for command level overrides...\n"); read_command_levels (); fprintf (stderr, "Loading random pops...\n"); load_random_pops (); fprintf (stderr, "Loading socials...\n"); load_new_socials (); fprintf (stderr, "Performing complete world repop...\n"); reset_world (); fprintf (stderr, "Checking all playerbase entries and pfiles for confirmation...\n"); cleanup_system (); fBootDb = FALSE; fprintf (stderr, "Loading all travel points...\n"); load_tps (); fprintf (stderr, "Saved %d bytes from string compression...\n", bytes_saved); { SPELL_DATA *spp; int sn; gsn_blindness = -1; gsn_charm_person = -1; gsn_curse = -1; gsn_invis = -1; gsn_mass_invis = -1; gsn_poison = -1; gsn_plague = -1; gsn_sleep = -1; for (sn = 0; sn < SKILL_COUNT; sn++) { if ((spp = skill_lookup (NULL, sn)) == NULL) continue; if (!str_prefix ("blind", spp->spell_name)) gsn_blindness = spp->gsn; if (!str_prefix ("charm", spp->spell_name)) gsn_charm_person = spp->gsn; if (!str_prefix ("curse", spp->spell_name)) gsn_curse = spp->gsn; if (!str_prefix ("invis", spp->spell_name)) gsn_invis = spp->gsn; if (!str_prefix ("mass in", spp->spell_name)) gsn_mass_invis = spp->gsn; if (!str_prefix ("poison", spp->spell_name)) gsn_poison = spp->gsn; if (!str_prefix ("plague", spp->spell_name)) gsn_plague = spp->gsn; if (!str_prefix ("sleep", spp->spell_name)) gsn_sleep = spp->gsn; } } if (gsn_blindness==-1) { fprintf(stderr,"Couldn't find spell '%s'\n","blind"); } if (gsn_charm_person ==-1) { fprintf(stderr,"Couldn't find spell '%s'\n","blind"); } if (gsn_curse ==-1) { fprintf(stderr,"Couldn't find spell '%s'\n","curse"); } if (gsn_invis ==-1) { fprintf(stderr,"Couldn't find spell '%s'\n","invis"); } if (gsn_mass_invis ==-1) { fprintf(stderr,"Couldn't find spell '%s'\n","mass in"); } if (gsn_poison ==-1) { fprintf(stderr,"Couldn't find spell '%s'\n","poison"); } if (gsn_plague ==-1) { fprintf(stderr,"Couldn't find spell '%s'\n","plague"); } if (gsn_sleep ==-1) { fprintf(stderr,"Couldn't find spell '%s'\n","sleep"); } gettimeofday (&now_time, NULL); timr = (time_t) now_time.tv_sec; fprintf (stderr, "EmlenMUD finished bootup initialization %s", ((char *) ctime (&timr))); bt_tm = (time_t) now_time.tv_sec; strcpy(cl,""); #ifdef NEW_WORLD assign_coordinates (NULL, ""); #endif return; } #define CALCULATE_HEAD(s) (UPPER((s)[0])-'A') void new_assoc(char *s, char *s2) { SA *temp; temp=mem_alloc(sizeof(*temp)); temp->next=sa_head[CALCULATE_HEAD(s)]; sa_head[CALCULATE_HEAD(s)]=temp; temp->flagname=str_dup(s); temp->flagtext=s2;/*str_dup(s2);*/ return; } void load_scriptassoc (void) { FILE *fp; char assoc1[500]; if ((fp=fopen("sassoc.dat", "r")) == NULL ) { return; } for ( ; ; ) { strcpy(assoc1,fread_word(fp)); if (!str_cmp(assoc1,"END")) break; new_assoc(assoc1,fread_string_eol(fp)); } fclose(fp); return; } void do_quests(CHAR_DATA *ch, char *argy) { int i; SA *temp; DEFINE_COMMAND("quests",do_quests,POSITION_DEAD,0,LOG_NORMAL,"Views quest information.") hugebuf_o[0]='\0'; sprintf(hugebuf_o,"\x1B[37;1m--- Quest Information/Status ---\x1B[37;0m\n\r"); for (i=0; i<3000; i++) { if (!ch->pcdata->script_flags[i]) continue; for (temp=sa_head[CALCULATE_HEAD(ch->pcdata->script_flags[i])]; temp!=NULL; temp=temp->next) { if (!str_cmp(temp->flagname,ch->pcdata->script_flags[i])) { sprintf(hugebuf_o+strlen(hugebuf_o),"%s\n\r", temp->flagtext); } } } page_to_char(hugebuf_o,ch); return; } void view_scriptassoc(CHAR_DATA *ch, char *argy) { int i; SA *temp; DEFINE_COMMAND("view_associations",view_scriptassoc,POSITION_DEAD,110,LOG_NORMAL,"Views all script associations (sassoc.dat).") hugebuf_o[0]='\0'; sprintf(hugebuf_o,"----- Script flag associations -----\n\r"); for (i=0; i<27; i++) { for (temp=sa_head[i]; temp!=NULL; temp=temp->next) { sprintf(hugebuf_o+strlen(hugebuf_o),"%s: %s\n\r",temp->flagname,temp->flagtext); } } page_to_char(hugebuf_o,ch); return; } void save_random_pops (void) { FILE *fp; char outb[200]; int i; int ct; if ((fp = fopen ("random.dat", "w+")) == NULL) { fprintf (stderr, "Error on random.dat write!\n"); return; } for (i = 0; i < MAX_RANDOMPOP; i++) { if (g_obj_pop[i] == 0) continue; ct = 0; fprintf (fp, "OBJ %d\n", g_obj_pop[i]); fprintf (fp, "PCT %d\n", g_percent[i]); for (ct = 0; ct < 10; ct++) { if (g_moblist[i][ct] == 0) continue; fprintf (fp, "ADDM %d\n", g_moblist[i][ct]); } } fprintf (fp, "END\n"); fclose (fp); return; } void load_random_pops (void) { FILE *fp; char inb[200]; int cur_obj; int ctr = -1; int cur_pos = 0; if ((fp = fopen ("random.dat", "r")) == NULL) { return; } for (;;) { strcpy (inb, fread_word (fp)); if (!str_cmp (inb, "END")) break; if (!str_cmp (inb, "OBJ")) { cur_obj = fread_number (fp); if (get_obj_index (cur_obj) == NULL) { cur_obj = 0; } ctr++; g_obj_pop[ctr] = cur_obj; cur_obj = ctr; cur_pos = 0; continue; } if (!str_cmp (inb, "PCT")) { g_percent[cur_obj] = fread_number (fp); continue; } if (!str_cmp (inb, "ADDM")) { g_moblist[cur_obj][cur_pos] = fread_number (fp); if (g_moblist[cur_obj][cur_pos] >= 10000) continue; if (get_mob_index (g_moblist[cur_obj][cur_pos]) == NULL) { g_moblist[cur_obj][cur_pos] = 0; continue; } g_mobpop[g_moblist[cur_obj][cur_pos]] = TRUE; cur_pos++; } } fclose (fp); return; } #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) if ( !str_cmp( word, literal ) ) {field = value; fMatch = TRUE; break;} #define SKEY( string, field ) if ( !str_cmp( word, string ) ) {free_string( field ); field = fread_string( fp, NULL ); fMatch = TRUE; break;} #ifdef NEW_WORLD #define SCKEY( string, field ) if ( !str_cmp( word, string ) ) {free_string( field ); field = fread_and_compress_string( fp, NULL ); fMatch = TRUE; break;} #else /*#define SCKEY( string, field ) if ( !str_cmp( word, string ) ) {free_string( field ); field = fread_and_compress_string( fp, NULL ); fMatch = TRUE; break;}*/ #define SCKEY( string, field ) if ( !str_cmp( word, string ) ) {free_string( field ); field = fread_string( fp, NULL ); fMatch = TRUE; break;} #endif void load_area (FILE * fp) { AREA_DATA *pArea; char *word; bool fMatch; pArea = mem_alloc (sizeof (*pArea)); pArea->has_popped_this_reboot = FALSE; pArea->open = 0; pArea->desc_rooms = 0; pArea->weather_change = 0; pArea->can_quit = FALSE; pArea->more_rainy = FALSE; pArea->more_dry = FALSE; pArea->more_fog = FALSE; pArea->nplayer = 0; pArea->filename = str_dup (strArea); pArea->vnum = top_area; pArea->name = &str_empty[0]; pArea->builders = &str_empty[0]; pArea->repop = &str_empty[0]; pArea->security = 1; pArea->jail = 0; pArea->outjail = 0; pArea->clanzone = FALSE; pArea->lvnum = 0; pArea->uvnum = 0; pArea->area_flags = 0; pArea->room_count = 0; pArea->mob_count = 0; pArea->obj_count = 0; pArea->repop_rate = 55; pArea->repop_counter = number_range (30, 55); for (;;) { word = feof (fp) ? "End" : fread_word (fp); fMatch = FALSE; switch (UPPER (word[0])) { case 'N': SKEY ("Name", pArea->name); KEY ("NQuit", pArea->can_quit, fread_number (fp)); break; case 'S': KEY ("Security", pArea->security, fread_number (fp)); KEY ("SRepop", pArea->repop_rate, fread_number (fp)); KEY ("SJail", pArea->jail, fread_number (fp)); KEY ("SCZone", pArea->clanzone, fread_number (fp)); KEY ("SOutJail", pArea->outjail, fread_number (fp)); break; case 'V': if (!str_cmp (word, "VNUMs")) { pArea->lvnum = fread_number (fp); pArea->uvnum = fread_number (fp); } break; case 'E': if (!str_cmp (word, "End")) { fMatch = TRUE; area_sort (pArea); top_area++; if (pArea->open) num_areas++; pArea->repop_counter = number_range (1, pArea->repop_rate); return; } break; case 'B': SKEY ("Builders", pArea->builders); break; case 'O': KEY ("Open", pArea->open, fread_number (fp)); break; case 'R': KEY ("Rcount", pArea->room_count, fread_number (fp)); SKEY ("Repop", pArea->repop); if (!str_cmp (word, "Reset")) { fread_to_eol (fp); fMatch = TRUE; } break; } } pArea->repop_counter = number_range (1, pArea->repop_rate); return; } void load_helps (FILE * fp) { HELP_DATA *pHelp; int i; for (;;) { pHelp = mem_alloc (sizeof (*pHelp)); pHelp->level = fread_number (fp); pHelp->keyword = fread_string (fp, NULL); if (pHelp->keyword[0] == '$') break; #ifdef NEW_WORLD strcpy (hugebuf_o, fread_string2 (fp, NULL)); i = strlen (hugebuf_o); pHelp->text = str_dup (compress (hugebuf_o, i)); bytes_saved += i - strlen (pHelp->text); #else pHelp->text = fread_string (fp, NULL); #endif if (!str_cmp (pHelp->keyword, "greeting")) help_greeting = pHelp->text; if (!str_cmp (pHelp->keyword, "greeting_raw")) help_greeting_a = pHelp->text; if (help_first == NULL) help_first = pHelp; if (help_last != NULL) help_last->next = pHelp; help_last = pHelp; pHelp->next = NULL; top_help++; } if (!help_greeting_a) help_greeting_a = help_greeting; return; } SOCIAL *social_list; SOCIAL *social_hashed[255]; void save_new_socials (void) { FILE *fp; SOCIAL *s; if ((fp = fopen ("socials.dat", "w+")) == NULL) { fprintf (stderr, "Error on social write.\n\r"); return; } for (s = social_list; s != NULL; s = s->next) { fprintf (fp, "SocialName %s~\n", s->name); fprintf (fp, "CharNoArg %s~\n", (s->char_no_arg ? s->char_no_arg : "none")); fprintf (fp, "OtherNoArg %s~\n", (s->others_no_arg ? s->others_no_arg : "none")); fprintf (fp, "CharFound %s~\n", (s->char_found ? s->char_found : "none")); fprintf (fp, "OtherFound %s~\n", (s->others_found ? s->others_found : "none")); fprintf (fp, "VictFound %s~\n", (s->vict_found ? s->vict_found : "none")); fprintf (fp, "CharNFound %s~\n", (s->char_not_found ? s->char_not_found : "none")); fprintf (fp, "CharSelf %s~\n", (s->char_auto ? s->char_auto : "none")); fprintf (fp, "OtherSelf %s~\n\n", (s->others_auto ? s->others_auto : "none")); } fprintf (fp, "END\n"); fclose (fp); return; } void social_update_hash (void) { SOCIAL *s; bzero (&social_hashed, sizeof (social_hashed)); for (s = social_list; s != NULL; s = s->next) { s->next_hashed = social_hashed[UPPER (s->name[0])]; social_hashed[UPPER (s->name[0])] = s; } return; } SOCIAL * new_social (void) { SOCIAL *soc; soc = mem_alloc (sizeof (*soc)); bzero (soc, sizeof (*soc)); soc->next = social_list; social_list = soc; return soc; } void load_new_socials (void) { FILE *fp; SOCIAL *s; char tempbuf[1500]; if ((fp = fopen ("socials.dat", "r")) == NULL) { fprintf (stderr, "Error on social read!\n"); return; } for (;;) { strcpy (tempbuf, fread_word (fp)); if (!str_cmp (tempbuf, "END")) break; if (!str_cmp (tempbuf, "SocialName")) { s = new_social (); strcpy (s->name, fread_string2 (fp, NULL)); continue; } if (!str_cmp (tempbuf, "CharNoArg")) { strcpy (tempbuf, fread_string2 (fp, NULL)); if (!str_cmp (tempbuf, "none")) continue; s->char_no_arg = str_dup (tempbuf); continue; } if (!str_cmp (tempbuf, "OtherNoArg")) { strcpy (tempbuf, fread_string2 (fp, NULL)); if (!str_cmp (tempbuf, "none")) continue; s->others_no_arg = str_dup (tempbuf); continue; } if (!str_cmp (tempbuf, "CharFound")) { strcpy (tempbuf, fread_string2 (fp, NULL)); if (!str_cmp (tempbuf, "none")) continue; s->char_found = str_dup (tempbuf); continue; } if (!str_cmp (tempbuf, "OtherFound")) { strcpy (tempbuf, fread_string2 (fp, NULL)); if (!str_cmp (tempbuf, "none")) continue; s->others_found = str_dup (tempbuf); continue; } if (!str_cmp (tempbuf, "VictFound")) { strcpy (tempbuf, fread_string2 (fp, NULL)); if (!str_cmp (tempbuf, "none")) continue; s->vict_found = str_dup (tempbuf); continue; } if (!str_cmp (tempbuf, "CharNFound")) { strcpy (tempbuf, fread_string2 (fp, NULL)); if (!str_cmp (tempbuf, "none")) continue; s->char_not_found = str_dup (tempbuf); continue; } if (!str_cmp (tempbuf, "CharSelf")) { strcpy (tempbuf, fread_string2 (fp, NULL)); if (!str_cmp (tempbuf, "none")) continue; s->char_auto = str_dup (tempbuf); continue; } if (!str_cmp (tempbuf, "OtherSelf")) { strcpy (tempbuf, fread_string2 (fp, NULL)); if (!str_cmp (tempbuf, "none")) continue; s->others_auto = str_dup (tempbuf); continue; } } social_update_hash (); fclose (fp); } void fread_clan (FILE * fp, int vnum) { CLAN_DATA *clan; char *word; bool fMatch; int iHash; int iAttack; clan = mem_alloc (sizeof (*clan)); clan->vnum = vnum; clan->alignment = 0; clan->leader[0] = '\0'; clan->name[0] = '\0'; clan->minlev = 0; clan->start_vnum = 0; for (iAttack = 0; iAttack < 100; iAttack++) clan->members[iAttack] = NULL; for (;;) { word = feof (fp) ? "End" : fread_word (fp); fMatch = FALSE; switch (UPPER (word[0])) { case '*': fread_to_eol (fp); break; case 'E': if (!str_cmp (word, "End")) { iHash = vnum % 20; clan->next = clan_index_hash[iHash]; clan_index_hash[iHash] = clan; top_clan++; return; } break; case 'A': KEY ("Alignment", clan->alignment, fread_number (fp)); break; case 'C': if (!str_cmp (word, "CMember")) { int ii; ii = clan_free (clan); clan->members[ii] = str_dup (fread_word (fp)); fMatch = TRUE; } break; case 'L': if (!str_cmp ("Leader", word)) { strcpy (clan->leader, fread_word (fp)); fMatch = TRUE; } break; case 'M': KEY ("MStartV", clan->start_vnum, fread_number (fp)); KEY ("Minlev", clan->minlev, fread_number (fp)); break; case 'N': if (!str_cmp ("Name", word)) { strcpy (clan->name, fread_string (fp, NULL)); fMatch = TRUE; } break; } if (!fMatch) { char buf[80]; sprintf (buf, "fread_clan: %d incorrect: %s", vnum, word); bug (buf, 0); fread_to_eol (fp); } }; return; } void fread_clan_2 (FILE * fp, int vnum) { CLAN_DATA *clan; char *word; bool fMatch; int iHash; int iAttack; clan = mem_alloc (sizeof (*clan)); clan->vnum = vnum; clan->alignment = 0; clan->leader[0] = '\0'; clan->name[0] = '\0'; clan->minlev = 0; clan->start_vnum = 0; for (iAttack = 0; iAttack < 100; iAttack++) clan->members[iAttack] = NULL; for (;;) { word = feof (fp) ? "End" : fread_word (fp); fMatch = FALSE; switch (UPPER (word[0])) { case '*': fread_to_eol (fp); break; case 'E': if (!str_cmp (word, "End")) { iHash = vnum % 20; clan->next = clan_index_hash_2[iHash]; clan_index_hash_2[iHash] = clan; top_clan_2++; return; } break; case 'A': KEY ("Alignment", clan->alignment, fread_number (fp)); break; case 'C': if (!str_cmp (word, "CMember")) { int ii; ii = clan_free (clan); clan->members[ii] = str_dup (fread_word (fp)); fMatch = TRUE; } break; case 'L': if (!str_cmp ("Leader", word)) { strcpy (clan->leader, fread_word (fp)); fMatch = TRUE; } break; case 'M': KEY ("MStartV", clan->start_vnum, fread_number (fp)); KEY ("Minlev", clan->minlev, fread_number (fp)); break; case 'N': if (!str_cmp ("Name", word)) { strcpy (clan->name, fread_string (fp, NULL)); fMatch = TRUE; } break; } if (!fMatch) { char buf[80]; sprintf (buf, "fread_clan_2: %d incorrect: %s", vnum, word); bug (buf, 0); fread_to_eol (fp); } }; return; } void fread_mobile (FILE * fp, int vnum) { MOB_PROTOTYPE *pMobIndex; char *word; bool fMatch; int iHash; pMobIndex = mem_alloc (sizeof (*pMobIndex)); pMobIndex->points=0; pMobIndex->java[0]='\0'; pMobIndex->java[1]='\0'; pMobIndex->vnum = vnum; pMobIndex->area = area_last; pMobIndex->attackname = NULL; pMobIndex->name = NULL; pMobIndex->short_descr = NULL; pMobIndex->long_descr = NULL; pMobIndex->description = NULL; pMobIndex->triggers = NULL; pMobIndex->trig_list = NULL; pMobIndex->script_fn = NULL; pMobIndex->mobtype = -1; pMobIndex->clan_guard_1 = 0; pMobIndex->clan_guard_2 = 0; pMobIndex->hpmult = 10; pMobIndex->yeller_number = 0; pMobIndex->max_in_world = 5; pMobIndex->height = -1; pMobIndex->will_help = 0; pMobIndex->guard = -1; pMobIndex->act = 0; pMobIndex->act3 = 0; pMobIndex->affected_by = 0; pMobIndex->more_affected_by = 0; pMobIndex->alignment = 0; pMobIndex->money = 0; pMobIndex->sex = 0; pMobIndex->act4 = 0; pMobIndex->armcls = 101; pMobIndex->race_hate = 0; pMobIndex->alt_vnum = 0; pMobIndex->guard = -1; pMobIndex->opt = NULL; pMobIndex->hitroll = 0; pMobIndex->damroll = 0; pMobIndex->dodge = 0; pMobIndex->parry = 0; for (;;) { word = feof (fp) ? "End" : fread_word (fp); fMatch = FALSE; switch (UPPER (word[0])) { case '*': fread_to_eol (fp); break; case 'E': if (!str_cmp (word, "End")) { iHash = vnum % HASH_MAX; pMobIndex->next = mob_index_hash[iHash]; mob_index_hash[iHash] = pMobIndex; top_mob_index++; if (!pMobIndex->name) pMobIndex->name = str_dup ("(no name)"); if (!pMobIndex->short_descr) pMobIndex->short_descr = str_dup ("(no short desc)"); if (!pMobIndex->long_descr) pMobIndex->long_descr = str_dup ("(no long desc)\n\r"); if (!pMobIndex->description) pMobIndex->description = str_dup ("(no description)"); return; } break; case 'A': SKEY ("Attackmsg", pMobIndex->attackname); KEY ("AClan2", pMobIndex->clan_guard_2, fread_number (fp)); KEY ("AClan", pMobIndex->clan_guard_1, fread_number (fp)); KEY ("ActBits", pMobIndex->act, fread_number (fp)); KEY ("ActBits3", pMobIndex->act3, fread_number (fp)); KEY ("AYeller", pMobIndex->yeller_number, fread_number (fp)); KEY ("AMax", pMobIndex->max_in_world, fread_number (fp)); KEY ("AWillhelp", pMobIndex->will_help, fread_number (fp)); KEY ("ActBits4", pMobIndex->act4, fread_number (fp)); KEY ("Affect_By", pMobIndex->affected_by, fread_number (fp)); KEY ("AffectTWO", pMobIndex->more_affected_by, fread_number (fp)); KEY ("Alignment", pMobIndex->alignment, fread_number (fp)); KEY ("Alt_vnum", pMobIndex->alt_vnum, fread_number (fp)); if (!str_cmp (word, "ArmorClass")) { fMatch = TRUE; pMobIndex->armcls = fread_number (fp); } if (!str_cmp (word, "ASklTaught")) { int num; int num2; fMatch = TRUE; if (!pMobIndex->opt) pMobIndex->opt = new_optional (); num = fread_number (fp); num2 = fread_number (fp); if (num != 30) pMobIndex->opt->skltaught[num] = num2; } break; case 'B': if (!str_cmp (word, "BCasts")) { int num = 0; fMatch = TRUE; if (!pMobIndex->opt) pMobIndex->opt = new_optional (); while (pMobIndex->opt->cast_spells[num] != NULL) num++; pMobIndex->opt->cast_spells[num] = fread_string (fp, NULL); } if (!str_cmp (word, "BCast_P")) { fMatch = TRUE; if (!pMobIndex->opt) pMobIndex->opt = new_optional (); pMobIndex->opt->cast_percent = fread_number (fp); } if (!str_cmp (word, "BKicks")) { fMatch = TRUE; if (!pMobIndex->opt) pMobIndex->opt = new_optional (); pMobIndex->opt->kicks = fread_number (fp); } if (!str_cmp (word, "BFlurries")) { fMatch = TRUE; if (!pMobIndex->opt) pMobIndex->opt = new_optional (); pMobIndex->opt->flurries = fread_number (fp); } if (!str_cmp (word, "BTackles")) { fMatch = TRUE; if (!pMobIndex->opt) pMobIndex->opt = new_optional (); pMobIndex->opt->tackles = fread_number (fp); } if (!str_cmp (word, "BWarrior_P")) { fMatch = TRUE; if (!pMobIndex->opt) pMobIndex->opt = new_optional (); pMobIndex->opt->warrior_percent = fread_number (fp); } break; case 'G': KEY ("Guard", pMobIndex->guard, fread_number (fp)); KEY ("GHitR", pMobIndex->hitroll, fread_number (fp)); KEY ("GDamR", pMobIndex->damroll, fread_number (fp)); KEY ("GDod", pMobIndex->dodge, fread_number (fp)); KEY ("GPar", pMobIndex->parry, fread_number (fp)); break; case 'H': KEY ("Hp", pMobIndex->hpmult, fread_number (fp)); break; case 'J': KEY ("JPts", pMobIndex->points, fread_number(fp)); KEY ("JavO", pMobIndex->java[0], fread_number(fp)); KEY ("JavT", pMobIndex->java[1], fread_number(fp)); break; case 'M': KEY ("MobType", pMobIndex->mobtype, fread_number (fp)); KEY ("Money", pMobIndex->money, fread_number (fp)); break; case 'N': KEY ("NHeight", pMobIndex->height, fread_number (fp)); SKEY ("Name", pMobIndex->name); break; case 'R': KEY ("RaceHate", pMobIndex->race_hate, fread_number (fp)); case 'S': KEY ("Sex", pMobIndex->sex, fread_number (fp)); SKEY ("Short", pMobIndex->short_descr); if (!str_cmp (word, "Spec")) { pMobIndex->spec_fun = NULL; pMobIndex->spec_name = str_dup (fread_word (fp)); pMobIndex->spec_fun = spec_lookup (pMobIndex->spec_name); fMatch = TRUE; } KEY ("Shopd2", pMobIndex->pShop->decrease, fread_number (fp)); KEY ("Shopd3", pMobIndex->pShop->items_until_decrease, fread_number (fp)); KEY ("ShopCr", pMobIndex->pShop->creates_vnum, fread_number (fp)); KEY ("ShCrh", pMobIndex->pShop->creates_hours, fread_number (fp)); SKEY ("ShopCS", pMobIndex->pShop->creates_message); if (!str_cmp (word, "Shop")) { SHOP_DATA *pShop; int iTrade; pShop = mem_alloc (sizeof (*pShop)); pShop->keeper = vnum; 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->creates_hours = 1; pShop->open_hour = fread_number (fp); pShop->close_hour = fread_number (fp); pShop->decrease = 5; pShop->items_until_decrease = 4; pShop->creates_vnum = 0; pShop->creates_message = NULL; pMobIndex->pShop = pShop; if (shop_first == NULL) shop_first = pShop; if (shop_last != NULL) shop_last->next = pShop; shop_last = pShop; pShop->next = NULL; top_shop++; fMatch = TRUE; } if (!str_cmp (word, "SFT")) { pMobIndex->script_fn = str_dup (fread_word (fp)); load_scripts_2 (pMobIndex->script_fn, pMobIndex); fMatch = TRUE; } break; case 'L': SKEY ("Long", pMobIndex->long_descr); KEY ("Level", pMobIndex->level, fread_number (fp)); break; case 'D': SCKEY ("Descr", pMobIndex->description); break; } if (!fMatch) { char buf[80]; sprintf (buf, "fread_mobile: %d incorrect: %s", vnum, word); bug (buf, 0); fread_to_eol (fp); } }; return; } void load_mobiles (FILE * fp) { area_last->mob_count = 0; for (;;) { int vnum; char letter; letter = fread_letter (fp); if (letter != '#') { bug ("Load_mobiles: '#' not found.", 0); exit (1); } vnum = fread_number (fp); if (vnum == 0) { /*bug( "found vnum zero", 0 ); */ break; } fBootDb = FALSE; if (get_mob_index (vnum) != NULL) { bug ("Load_mobiles: vnum %d duplicated.", vnum); continue; } fBootDb = TRUE; fread_mobile (fp, vnum); area_last->mob_count++; if (area_last->open) num_mobs++; top_vnum_mob = top_vnum_mob < vnum ? vnum : top_vnum_mob; } return; } void load_clans (void) { FILE *fp; if ((fp = fopen ("pclans.dat", "r")) == NULL) return; for (;;) { int vnum; char letter; letter = fread_letter (fp); if (letter != '#') { bug ("Load_clan: '#' not found.", 0); exit (1); } vnum = fread_number (fp); if (vnum == 0) { break; } fBootDb = FALSE; if (get_clan_index (vnum) != NULL) { bug ("Load_clans: vnum %d duplicated.", vnum); continue; } fBootDb = TRUE; fread_clan (fp, vnum); if (vnum > 0) fread_clan_storage (vnum); top_clan = top_clan < vnum ? vnum : top_clan; } fclose (fp); return; } void load_clans_2 (void) { FILE *fp; if ((fp = fopen ("pclans2.dat", "r")) == NULL) return; for (;;) { int vnum; char letter; letter = fread_letter (fp); if (letter != '#') { bug ("Load_clan_2: '#' not found.", 0); exit (1); } vnum = fread_number (fp); if (vnum == 0) { break; } fBootDb = FALSE; if (get_clan_index_2 (vnum) != NULL) { bug ("Load_clans_2: vnum %d duplicated.", vnum); continue; } fBootDb = TRUE; fread_clan_2 (fp, vnum); top_clan_2 = top_clan_2 < vnum ? vnum : top_clan_2; } fclose (fp); return; } void load_boats (void) { #ifndef NEW_WORLD FILE *fp; BLIST *bt; OBJ_PROTOTYPE *boat; ROOM_DATA *room; SINGLE_OBJECT *bot; int i; if ((fp = fopen ("boat.dat", "r")) == NULL) { save_boats (); return; } if ((boat = get_obj_index (97)) == NULL) { fclose (fp); return; } for (;;) { i = fread_number (fp); if (i == 0) break; bt = mem_alloc (sizeof (*bt)); bt->vnum = i; bt->next = base_blist; base_blist = bt; if ((room = get_room_index (i)) == NULL) continue; bot = create_object (boat, 1); obj_to (bot, room); } fclose (fp); #endif return; } void save_boats (void) { #ifndef NEW_WORLD FILE *fp; BLIST *bt; if ((fp = fopen ("boat.dat", "w")) == NULL) exit (99); for (bt = base_blist; bt != NULL; bt = bt->next) { fprintf (fp, "%d\n", bt->vnum); } fprintf (fp, "0\n"); fclose (fp); #endif return; } void load_topten (void) { FILE *fp; int k; if ((fp = fopen ("topten.dat", "r")) == NULL) { for (k = 0; k < 10; k++) { strcpy (topten.topten_name[k], "Free-Slot"); topten.topten_warpoints[k] = 0; topten.topten_good[k] = TRUE; } save_topten (); return; } for (k = 0; k < 10; k++) { strcpy (topten.topten_name[k], fread_word (fp)); topten.topten_warpoints[k] = fread_number (fp); topten.topten_good[k] = fread_number (fp); } fclose (fp); return; } void load_rating (void) { FILE *fp; int k; if ((fp = fopen ("rating.dat", "r")) == NULL) { for (k = 0; k < 10; k++) { strcpy (ratingd.rating_name[k], "Free-Slot"); ratingd.rating_rating[k] = 0; ratingd.rating_good[k] = TRUE; } save_rating (); return; } for (k = 0; k < 10; k++) { strcpy (ratingd.rating_name[k], fread_word (fp)); ratingd.rating_rating[k] = fread_number (fp); ratingd.rating_good[k] = fread_number (fp); } fclose (fp); return; } void load_bansites (void) { FILE *fp; bool newb; char templine[500]; if ((fp = fopen ("bansite.dat", "r")) == NULL) { return; } strcpy (templine, "NOEND"); while (str_cmp (templine, "END")) { strcpy (templine, fread_word (fp)); if (str_cmp (templine, "END")) { newb = fread_number (fp); if (!newb) bansite (templine); else nbansite (templine); } } fclose (fp); return; } void load_limited (int vnum) { FILE *fp; char fn[60]; sprintf (fn, "../limited/%d", vnum); if ((fp = fopen (fn, "r")) == NULL) { limited.limited_array[vnum] = 0; save_limited (vnum); return; } limited.limited_array[vnum] = fread_number (fp); fclose (fp); return; } void fix_object (OBJ_PROTOTYPE * pObjIndex) { return; } void fread_object (FILE * fp, int vnum) { OBJ_PROTOTYPE *pObjIndex; int iHash; char *word; bool fMatch; int tmpi; pObjIndex = mem_alloc (sizeof (*pObjIndex)); pObjIndex->made_of=0; pObjIndex->java[0]='\0'; pObjIndex->java[1]='\0'; pObjIndex->max_in_room = 1; pObjIndex->vnum = vnum; pObjIndex->timer = 0; pObjIndex->area = area_last; pObjIndex->how_many = 0; pObjIndex->name = &str_empty[0]; pObjIndex->short_descr = &str_empty[0]; pObjIndex->description = &str_empty[0]; pObjIndex->action_descr[0] = NULL; pObjIndex->action_descr[1] = NULL; pObjIndex->action_descr[2] = NULL; pObjIndex->extra_flags = 0; pObjIndex->level = 1; pObjIndex->effects = 0; for (tmpi = 0; tmpi < 10; tmpi++) pObjIndex->value[tmpi] = 0; for (tmpi = 0; tmpi < 10; tmpi++) pObjIndex->values_2[tmpi] = 0; for (;;) { word = feof (fp) ? "End" : fread_word (fp); fMatch = FALSE; switch (UPPER (word[0])) { case '*': fread_to_eol (fp); break; case 'E': KEY ("Extra", pObjIndex->extra_flags, fread_number (fp)); if (!str_cmp (word, "ExtraDescr")) { DESCRIPTION_DATA *ed; ed = mem_alloc (sizeof (*ed)); ed->keyword = fread_string (fp, NULL); ed->description = fread_string (fp, NULL); ed->next = pObjIndex->extra_descr; pObjIndex->extra_descr = ed; top_ed++; fMatch = TRUE; } if (!str_cmp (word, "End")) { iHash = vnum % HASH_MAX; pObjIndex->next = obj_index_hash[iHash]; obj_index_hash[iHash] = pObjIndex; top_obj_index++; fix_object (pObjIndex); return; } break; case 'A': if (!str_cmp (word, "Affect")) { AFFECT_DATA *paf; paf = mem_alloc (sizeof (*paf)); paf->location = fread_number (fp); paf->modifier = fread_number (fp); paf->type = fread_number (fp); paf->duration = fread_number (fp); paf->bitvector = fread_number (fp); paf->next = pObjIndex->affected; pObjIndex->affected = paf; top_affect++; fMatch = TRUE; } break; case 'D': KEY ("DMat", pObjIndex->made_of, fread_number(fp)); SKEY ("Descr", pObjIndex->description); SKEY ("DescA1", pObjIndex->action_descr[0]); SKEY ("DescA2", pObjIndex->action_descr[1]); SKEY ("DescA3", pObjIndex->action_descr[2]); break; case 'J': KEY ("JavO", pObjIndex->java[0], fread_number(fp)); KEY ("JavT", pObjIndex->java[1], fread_number(fp)); break; case 'L': if (!str_cmp (word, "Limited")) { char *dd; dd = fread_word (fp); fMatch = TRUE; } if (!str_cmp (word, "Limtd")) { pObjIndex->how_many = fread_number (fp); fMatch = TRUE; } KEY ("Level", pObjIndex->level, fread_number (fp)); KEY ("LEffect", pObjIndex->effects, fread_number (fp)); break; case 'T': KEY ("Timer", pObjIndex->timer, fread_number (fp)); KEY ("Type", pObjIndex->item_type, fread_number (fp)); break; case 'M': KEY ("Maxinroom", pObjIndex->max_in_room, fread_number (fp)); break; case 'N': SKEY ("Name", pObjIndex->name); break; case 'S': SKEY ("Short", pObjIndex->short_descr); break; case 'W': KEY ("Wear", pObjIndex->wear_flags, fread_number (fp)); KEY ("Weight", pObjIndex->weight, fread_number (fp)); break; case 'V': if (!str_cmp (word, "Values")) { fMatch = TRUE; for (iHash = 0; iHash < 10; iHash++) { pObjIndex->value[iHash] = fread_number (fp); }; } if (!str_cmp (word, "Values2")) { fMatch = TRUE; for (iHash = 0; iHash < 10; iHash++) { pObjIndex->values_2[iHash] = fread_number (fp); }; } break; case 'C': KEY ("Cost", pObjIndex->cost, fread_number (fp)); break; } if (!fMatch) { sprintf (log_buf, "fread_object: vnum %d incorrect: '%s'", vnum, word); bug (log_buf, 0); fread_to_eol (fp); } }; return; } DOOR_DATA * new_door (void) { DOOR_DATA *ped; ped = mem_alloc (sizeof (*ped)); ped->key = 0; ped->exit_info = 0; ped->rs_flags = 0; ped->str = 30; ped->maxstr = 30; ped->keyword = &str_empty[0]; ped->description = &str_empty[0]; return ped; } void load_objects (FILE * fp) { area_last->obj_count = 0; for (;;) { int vnum; char letter; letter = fread_letter (fp); if (letter != '#') { bug ("Load_objects: # not found.", 0); exit (1); } vnum = fread_number (fp); if (vnum == 0) break; fBootDb = FALSE; if (get_obj_index (vnum) != NULL) { bug ("Load_objects: vnum %d duplicated.", vnum); continue; } fBootDb = TRUE; fread_object (fp, vnum); if (vnum < MAX_LIMITED) load_limited (vnum); area_last->obj_count++; if (area_last->open) num_objs++; top_vnum_obj = top_vnum_obj < vnum ? vnum : top_vnum_obj; } return; } void fread_room (FILE * fp, int vnum) { ROOM_DATA *oneroom; int iHash; int door; char *word; bool fMatch; oneroom = new_room (); oneroom->area = area_last; oneroom->vnum = vnum; for (;;) { word = feof (fp) ? "End" : fread_word (fp); fMatch = FALSE; switch (UPPER (word[0])) { case '*': fread_to_eol (fp); break; case 'E': if (!str_cmp (word, "End")) { if (DESCRIPTED (oneroom)) { desc_rooms++; oneroom->area->desc_rooms++; } iHash = vnum % HASH_MAX; oneroom->next = room_hash[iHash]; room_hash[iHash] = oneroom; top_room++; return; } if (!str_cmp (word, "ExtraDescr")) { DESCRIPTION_DATA *ed; check_room_more (oneroom); ed = mem_alloc (sizeof (*ed)); ed->keyword = fread_string (fp, NULL); ed->description = fread_string (fp, NULL); ed->next = oneroom->more->extra_descr; oneroom->more->extra_descr = ed; top_ed++; fMatch = TRUE; } break; case 'R': if (!str_cmp (word, "Reset")) { RESET_DATA *pReset; check_room_more (oneroom); pReset = mem_alloc (sizeof (*pReset)); pReset->command = fread_letter (fp); pReset->rs_vnum = fread_number (fp); pReset->loc = fread_number (fp); pReset->percent = fread_number (fp); fread_to_eol (fp); if (oneroom->more->reset_first == NULL) oneroom->more->reset_first = pReset; if (oneroom->more->reset_last != NULL) oneroom->more->reset_last->next = pReset; oneroom->more->reset_last = pReset; pReset->next = NULL; top_reset++; fMatch = TRUE; } break; case 'D': /* Might want descriptions NOT to be compressed... */ SCKEY ("Descr", oneroom->description); if (!str_cmp (word, "Door")) { EXIT_DATA *pexit; char tmpp[5000]; int tmp; door = fread_number (fp); if (door < 0 || door > 5) { bug ("Fread_rooms: vnum %d has bad door number.", vnum); exit (1); } pexit = new_exit (); pexit->d_info = NULL; tmp = fread_number (fp); if (tmp != 0) { if (pexit->d_info == NULL) { pexit->d_info = new_door (); } pexit->d_info->rs_flags = tmp; } tmp = fread_number (fp); if (tmp != 0) { if (pexit->d_info == NULL) { pexit->d_info = new_door (); } pexit->d_info->key = tmp; } /*pexit->rs_flags = fread_number( fp ); pexit->key = fread_number( fp ); */ pexit->vnum = fread_number (fp); tmp = fread_number (fp); tmp = fread_number (fp); if (tmp != 0 && tmp != 30) { if (pexit->d_info == NULL) { pexit->d_info = new_door (); } pexit->d_info->maxstr = tmp; pexit->d_info->str = tmp; } tmpp[0] = '\0'; strcpy (tmpp, fread_string2 (fp, NULL)); if (tmpp[0] != '\0') { if (pexit->d_info == NULL) { pexit->d_info = new_door (); } pexit->d_info->description = str_dup (tmpp); } /*pexit->description = fread_string( fp,NULL ); */ tmpp[0] = '\0'; strcpy (tmpp, fread_string2 (fp, NULL)); if (str_cmp (tmpp, "none") && str_cmp (tmpp, "d") && tmpp[0] != '\0') { if (pexit->d_info == NULL) { pexit->d_info = new_door (); } pexit->d_info->keyword = str_dup (tmpp); } oneroom->exit[door] = pexit; fMatch = TRUE; } break; case 'N': KEY ("NJAO", oneroom->img[0], fread_number(fp)); KEY ("NJAT", oneroom->img[1], fread_number(fp)); KEY ("NAP", oneroom->a, fread_number (fp)); KEY ("NAC", oneroom->c, fread_number (fp)); SKEY ("Name", oneroom->name); if (!str_cmp (word, "NTPS")) { int t; t = fread_number (fp); oneroom->tps = t; fMatch = TRUE; } break; case 'M': { check_room_more (oneroom); if (!str_cmp (word, "Mlt")) { int ia; ROOM_DATA *roomto; ia = fread_number (fp); roomto = get_room_index (ia); if (roomto) room_to_room (oneroom, roomto); fMatch = TRUE; } KEY ("Mor", oneroom->more->orig_room, fread_number (fp)); KEY ("Mcts", oneroom->more->can_travel_sectors, fread_number (fp)); KEY ("Move_dir", oneroom->more->move_dir, fread_number (fp)); SKEY ("Movemess", oneroom->more->move_message); SKEY ("Mdescript", oneroom->more->obj_description); } break; case 'F': KEY ("Flags", oneroom->room_flags, fread_number (fp)); KEY ("Flags2", oneroom->room_flags_2, fread_number (fp)); break; case 'S': KEY ("Shd", oneroom->shade, fread_number (fp)); KEY ("Sector", oneroom->sector_type, fread_number (fp)); break; } if (!fMatch) { char buf[80]; sprintf (buf, "fread_rooms: incorrect titler %s on v%d", word, vnum); bug (buf, 0); fread_to_eol (fp); } }; return; } void load_rooms (FILE * fp) { if (area_last == NULL) { bug ("Load_rooms: no #AREA seen yet.", 0); exit (1); } area_last->room_count = 0; /*if (builder_port && area_last->open) return; */ for (;;) { int vnum; char letter; letter = fread_letter (fp); if (letter != '#') { bug ("Load_rooms: # not found.", 0); exit (1); } vnum = fread_number (fp); if (vnum == 0) break; fBootDb = FALSE; if (get_room_index (vnum) != NULL) { bug ("Load_rooms: vnum %d duplicated.", vnum); continue; } fBootDb = TRUE; fread_room (fp, vnum); area_last->room_count++; if (area_last->open) num_rooms++; top_vnum_room = top_vnum_room < vnum ? vnum : top_vnum_room; } return; } void load_specials (FILE * fp) { for (;;) { MOB_PROTOTYPE *pMobIndex; char letter; switch (letter = fread_letter (fp)) { default: bug ("Load_specials: letter '%c' not *MS.", letter); exit (1); case 'S': return; case '*': break; case 'M': pMobIndex = get_mob_index (fread_number (fp)); pMobIndex->spec_name = str_dup (fread_word (fp)); pMobIndex->spec_fun = spec_lookup (pMobIndex->spec_name); if (pMobIndex->spec_fun == 0) { bug ("Load_specials: 'M': vnum %d.", pMobIndex->vnum); exit (1); } break; } fread_to_eol (fp); } return; } void load_notes (void) { FILE *fp; NOTE_DATA *pnotelast; char *word; bool fMatch; bool endinterior; if ((fp = fopen (NOTE_FILE, "r")) == NULL) return; pnotelast = NULL; for (;;) { NOTE_DATA *pnote; char letter; do { letter = getc (fp); if (feof (fp)) { fclose (fp); return; } } while (isspace (letter)); ungetc (letter, fp); pnote = mem_alloc (sizeof (*pnote)); pnote->board_num = 0; endinterior = FALSE; for (; !endinterior;) { word = feof (fp) ? "End" : fread_word (fp); fMatch = FALSE; switch (UPPER (word[0])) { case 'T': KEY ("TBoard", pnote->board_num, fread_number (fp)); KEY ("Text", pnote->text, fread_string (fp, NULL)); KEY ("To", pnote->to_list, fread_string (fp, NULL)); break; case 'S': KEY ("Sender", pnote->sender, fread_string (fp, NULL)); KEY ("Stamp", pnote->date_stamp, fread_number (fp)); KEY ("Subject", pnote->subject, fread_string (fp, NULL)); break; case 'E': if (!str_cmp (word, "End")) { fMatch = TRUE; endinterior = TRUE; pnote->next = NULL; if (pnotelast != NULL) pnotelast->next = pnote; else note_list = pnote; } break; case 'D': KEY ("Date", pnote->date, fread_string (fp, NULL)); break; } if (!fMatch) { sprintf (log_buf, "load_notes: bad keyword '%s'", word); bug (log_buf, 0); fread_to_eol (fp); } }; pnotelast = pnote; } strcpy (strArea, NOTE_FILE); fpArea = fp; bug ("Load_notes: bad key word.", 0); exit (1); return; } TRIGGY_DATA * triggy_new (void) { TRIGGY_DATA *tnew; tnew = mem_alloc ((sizeof (*tnew))); tnew->head = NULL; tnew->type = 0; tnew->scriptline = NULL; tnew->next = NULL; tnew->active = TRUE; return tnew; } SCRIPT_DAT * new_scriptdat (void) { SCRIPT_DAT *snew; snew = mem_alloc ((sizeof (*snew))); snew->label = 0; snew->to_do = NULL; snew->next = NULL; snew->player = NULL; return snew; } void load_scripts_2 (char *fn, MOB_PROTOTYPE * pMob) { FILE *fp; char *word; bool fMatch = TRUE; char general_use[STD_LENGTH]; int curline = 0; pMob->trig_list = NULL; if ((fp = fopen (fn, "r")) == NULL) { sprintf (general_use, "%s : script file not found!", fn); bug (general_use, 0); return; } for (; fMatch;) { fMatch = FALSE; word = feof (fp) ? "#END" : fread_word (fp); if (word[0] == '#') { if (!str_cmp (word, "#END")) { fMatch = TRUE; break; } else if (!str_cmp (word, "#QUESTFLAG")) { int i; i = fread_number (fp); questname[i] = fread_string (fp, NULL); fMatch = TRUE; } else if (!str_cmp (word, "#TRIGGER")) { TRIGGY_DATA *trig; fMatch = TRUE; trig = triggy_new (); trig->type = fread_number (fp); trig->scriptline = fread_string (fp, NULL); for (;;) { SCRIPT_DAT *sscr; curline++; sscr = new_scriptdat (); sscr->label = curline; sscr->to_do = fread_string (fp, NULL); sscr->next = trig->head; trig->head = sscr; if (!str_prefix ("donetrig", sscr->to_do)) { goto dun_a; } } dun_a: trig->next = pMob->trig_list; pMob->trig_list = trig; } } } if (!fMatch) { strcpy (strArea, fn); fpArea = fp; bug ("Load_scripts: bad key word.", 0); exit (1); } return; } void fix_exits (void) { ROOM_DATA *oneroom; EXIT_DATA *pexit; int iHash; int door; for (iHash = 0; iHash < HASH_MAX; iHash++) { for (oneroom = room_hash[iHash]; oneroom != NULL; oneroom = oneroom->next) { bool fexit; fexit = FALSE; for (door = 0; door <= 5; door++) { if ((pexit = oneroom->exit[door]) != NULL) { fexit = TRUE; if (pexit->vnum > 100000 || pexit->vnum == 0) continue; ((ROOM_DATA *) pexit->to_room) = get_room_index (pexit->vnum); } } } } return; } void clean_blank_rooms (CHAR_DATA * ch, char *argy) { ROOM_DATA *oneroom; EXIT_DATA *pexit; int iHash; int door; bool allf = FALSE; DEFINE_COMMAND ("cleanblankrooms", clean_blank_rooms, POSITION_DEAD, 110, LOG_ALWAYS, "For Orin's use only.") if (!str_cmp (argy, "all")) allf = TRUE; for (iHash = 0; iHash < HASH_MAX; iHash++) { for (oneroom = room_hash[iHash]; oneroom != NULL; oneroom = oneroom->next) { bool fexit; if (!allf && oneroom->area != ch->in_room->area) continue; if (oneroom->vnum < 1202 || oneroom->area->open == 0) continue; fexit = FALSE; for (door = 0; door <= 5; door++) /*Does room have an exit? */ { if ( ((pexit = oneroom->exit[door]) != NULL) && pexit->to_room != NULL) { fexit = TRUE; break; } } if (!fexit && (!oneroom->more || oneroom->more->reset_first == NULL) && (!pexit)) { /*Room doesn't have an exit, and no resets! */ char tmpbuf[500]; sprintf (tmpbuf, "Room %d marked for deletion!\n\r", oneroom->vnum); write_to_descriptor2 (ch->desc, tmpbuf, 0); check_room_more (oneroom); oneroom->more->pcs = 31999; } } } return; } CHAR_DATA * create_mobile (MOB_PROTOTYPE * pMobIndex) { CHAR_DATA *mob; if (pMobIndex == NULL) { bug ("Create_mobile: NULL pMobIndex.", 0); pMobIndex = get_mob_index (1); /*exit( 1 ); */ } mob = new_char (); mob->pIndexData = pMobIndex; mob->pcdata = &base_pc; mob->special = ISMOB; mob->position = POSITION_STANDING; if (!pMobIndex->spec_name) pMobIndex->spec_fun = NULL; mob->timer = pMobIndex->timer; mob->act = pMobIndex->act; mob->height = pMobIndex->height; mob->affected_by = pMobIndex->affected_by; mob->more_affected_by = pMobIndex->more_affected_by; if (pMobIndex->money != 0) create_amount (number_range (pMobIndex->money / 4, pMobIndex->money - 1) + 1, mob, NULL, NULL); if (pMobIndex->armcls == 101) { mob->armor = 99 - (number_range (LEVEL (mob) / 3, LEVEL (mob))) - LEVEL (mob); if (mob->armor <= -30) mob->armor /= 2; } else mob->armor = pMobIndex->armcls; set_initial_hp (mob); add_level_bonuses (mob, mob->pIndexData->level - 1); mob->damroll = 4 + mob->hit / (number_range (9, 12)); /* Before the modifier! */ mob->max_hit = (mob->max_hit * 10 * (pMobIndex->hpmult > 1000 ? (pMobIndex->hpmult % 1000) : pMobIndex->hpmult)) / 100; if (mob->max_hit <= 1) { mob->max_hit = 3; } if (mob->max_hit < 100 && LEVEL (mob) > 50) { mob->max_hit = 30000; fprintf (stderr, "MOB hps wrapped on vnum %d.\n", pMobIndex->vnum); } mob->hit = mob->max_hit; set_mob_xp (mob); mob->hitroll = UMAX (7, number_fuzzy (LEVEL (mob) / 2)); mob->next = char_list; char_list = mob; pMobIndex->count++; conv_height (mob); if (mob->pIndexData->trig_list) check_ced (mob); return mob; } SINGLE_OBJECT * create_object (OBJ_PROTOTYPE * pObjIndex, int level) { OBJ_PROTOTYPE *pIndex; SINGLE_OBJECT *obj; if (pObjIndex == NULL) { bug ("Create_object: NULL pObjIndex.", 0); exit (1); } if (pObjIndex->item_type == ITEM_LIST) { char *scanarg; char buf[20]; int num; int d; scanarg = str_dup (pObjIndex->description); num = number_range (1, pObjIndex->value[0]); buf[0] = '\0'; for (d = 0; d < num; d++) { scanarg = one_argy (scanarg, buf); } if (!is_number (buf)) pObjIndex = get_obj_index (37); else { num = atoi (buf); pIndex = get_obj_index (num); if (pIndex != NULL) pObjIndex = pIndex; else pObjIndex = get_obj_index (37); } } obj = new_obj (); obj->pIndexData = pObjIndex; allocate_correct_datatype (obj, pObjIndex->value); obj->in_room = NULL; obj->wear_loc = WEAR_NONE; if (obj->pIndexData->item_type == ITEM_BOAT) { OBJ_BOAT *boat; obj->boat = mem_alloc (sizeof (*boat)); obj->boat->in_boat[0] = NULL; obj->boat->in_boat[1] = NULL; obj->boat->in_boat[2] = NULL; obj->boat->in_boat[3] = NULL; obj->boat->in_boat[4] = NULL; obj->boat->in_boat[5] = NULL; obj->boat->in_boat[6] = NULL; obj->boat->in_boat[7] = NULL; obj->boat->navigator = NULL; } obj->timer = pObjIndex->timer; obj->extra_flags = pObjIndex->extra_flags; if (pObjIndex->cost != 0) obj->cost = number_range (pObjIndex->cost, ((pObjIndex->cost * 3) / 2)); if (pObjIndex->cost != 0 && obj->cost == 0) obj->cost = 1; obj->next = object_list; object_list = obj; pObjIndex->count++; return obj; } MOB_PROTOTYPE * get_mob_index (int vnum) { MOB_PROTOTYPE *pMobIndex; if (!fBootDb && vnum > top_vnum_mob) return NULL; for (pMobIndex = mob_index_hash[vnum % HASH_MAX]; pMobIndex != NULL; pMobIndex = pMobIndex->next) { if (pMobIndex->vnum == vnum) return pMobIndex; } if (fBootDb) { bug ("Get_mob_index: bad vnum %d.", vnum); } return NULL; } CLAN_DATA * get_clan_index (int vnum) { CLAN_DATA *clanny; if (!fBootDb && vnum > top_clan) return NULL; for (clanny = clan_index_hash[vnum % 20]; clanny != NULL; clanny = clanny->next) { if (clanny->vnum == vnum) return clanny; } if (fBootDb) { bug ("Get_clan_index: bad vnum %d.", vnum); exit (1); } return NULL; } CLAN_DATA * get_clan_index_2 (int vnum) { CLAN_DATA *clanny; if (!fBootDb && vnum > top_clan_2) return NULL; for (clanny = clan_index_hash_2[vnum % 20]; clanny != NULL; clanny = clanny->next) { if (clanny->vnum == vnum) return clanny; } if (fBootDb) { bug ("Get_clan_index_2: bad vnum %d.", vnum); exit (1); } return NULL; } OBJ_PROTOTYPE * get_obj_index (int vnum) { OBJ_PROTOTYPE *pObjIndex; if (!fBootDb && vnum > top_vnum_obj) return NULL; for (pObjIndex = obj_index_hash[vnum % HASH_MAX]; pObjIndex != NULL; pObjIndex = pObjIndex->next) { if (pObjIndex->vnum == vnum) return pObjIndex; } if (fBootDb) { bug ("Get_obj_index: bad vnum %d.", vnum); } return NULL; } /* * Translates mob virtual number to its room index struct. * Hash table lookup. */ ROOM_DATA * get_room_index (int vnum) { ROOM_DATA *oneroom; if (!fBootDb && vnum > top_vnum_room) return NULL; for (oneroom = room_hash[vnum % HASH_MAX]; oneroom != NULL; oneroom = oneroom->next) { if (oneroom->vnum == vnum) return oneroom; } if (fBootDb) { bug ("Get_room_index: bad vnum %d.", vnum); } return NULL; } /* * Read a letter from a file. */ char fread_letter (FILE * fp) { char c; do { c = getc (fp); } while (isspace (c)); return c; } /* * Read a number from a file. */ int fread_number (FILE * fp) { long number; bool sign; char c; int base; oldflag = FALSE; do { c = getc (fp); } while (isspace (c)); number = 0; sign = FALSE; if (c == '+') { c = getc (fp); } else if (c == '-') { sign = TRUE; c = getc (fp); } if (!isdigit (c) && c != '.') { oldflag = TRUE; fprintf (stderr, "BAD CHARACTER READ FIRST: %c\n", c); ungetc (c, fp); return 0; } /* New octal code */ if (c == '.') /* An octal value */ { base = 8; c = getc (fp); } else base = 10; while (isdigit (c)) { number = (number * base) + (c - '0'); c = getc (fp); } if (sign) number = 0 - number; if (c == '|') number += fread_number (fp); else if (c != ' ') ungetc (c, fp); return number; } char * fread_string2 (FILE * fp, CHAR_DATA * ch) { char *plst; char c; static char bufr[10000]; plst = bufr; do { c = getc (fp); } while (isspace (c)); if ((*plst++ = c) == '~') { bufr[0] = '\0'; return bufr; } for (;;) { switch (*plst = getc (fp)) { default: plst++; break; case EOF: { bug ("Fread_string: EOF - POSSIBLE PFILE CORRUPTION", 0); exit (1); } break; case '\n': plst++; *plst++ = '\r'; break; case '\r': break; case '~': *plst = '\0'; return bufr; break; } } } char * fread_and_compress_string (FILE * fp, CHAR_DATA * ch) { char tmp[8000]; char *pls = tmp; char *s; char *plast; int lo; int lt; int i = 0; char c; plast = top_string + sizeof (char *); if (plast > &string_space[pow.space_needed - STD_LENGTH]) { bug ("Fread_string: SPACE_NEEDED %d exceeded.", pow.space_needed); exit (1); } do { c = getc (fp); } while (isspace (c)); if ((*pls++ = c) == '~') return &str_empty[0]; for (;;) { switch (*pls = getc (fp)) { default: pls++; break; case EOF: { bug ("Fread_string: EOF - POSSIBLE PFILE CORRUPTION", 0); exit (1); } break; case '\n': pls++; *pls++ = '\r'; break; case '\r': break; case '~': pls[0] = '\0'; lo = strlen (tmp); /*tally_stuff(tmp); */ s = compress (tmp, lo); lt = strlen (s); for (i = 0; i < lt; i++) { *plast++ = s[i]; } bytes_saved += lo - lt; /*plast++; */ *plast = '\0'; plast++; { union { char *pc; char rgc[sizeof (char *)]; } u1; int ic; int iHash; char *pHash; char *pHashPrev; char *pString; iHash = UMIN (HASH_MAX - 1, plast - 1 - top_string); for (pHash = string_hash[iHash]; pHash; pHash = pHashPrev) { for (ic = 0; ic < sizeof (char *); ic++) u1.rgc[ic] = pHash[ic]; pHashPrev = u1.pc; pHash += sizeof (char *); if (top_string[sizeof (char *)] == pHash[0] && !strcmp (top_string + sizeof (char *) + 1, pHash + 1)) return pHash; } if (fBootDb) { pString = top_string; top_string = plast; u1.pc = string_hash[iHash]; for (ic = 0; ic < sizeof (char *); ic++) pString[ic] = u1.rgc[ic]; string_hash[iHash] = pString; nAllocString += 1; sAllocString += top_string - pString; return pString + sizeof (char *); } else { return str_dup (top_string + sizeof (char *)); } } } } } char * fread_string (FILE * fp, CHAR_DATA * ch) { char *plast; char c; plast = top_string + sizeof (char *); if (plast > &string_space[pow.space_needed - STD_LENGTH]) { bug ("Fread_string: SPACE_NEEDED %d exceeded.", pow.space_needed); exit (1); } do { c = getc (fp); } while (isspace (c)); if ((*plast++ = c) == '~') return &str_empty[0]; for (;;) { switch (*plast = getc (fp)) { default: plast++; break; case EOF: { bug ("Fread_string: EOF - POSSIBLE PFILE CORRUPTION", 0); exit (1); } break; case '\n': plast++; *plast++ = '\r'; break; case '\r': break; case '~': plast++; { union { char *pc; char rgc[sizeof (char *)]; } u1; int ic; int iHash; char *pHash; char *pHashPrev; char *pString; plast[-1] = '\0'; iHash = UMIN (HASH_MAX - 1, plast - 1 - top_string); for (pHash = string_hash[iHash]; pHash; pHash = pHashPrev) { for (ic = 0; ic < sizeof (char *); ic++) u1.rgc[ic] = pHash[ic]; pHashPrev = u1.pc; pHash += sizeof (char *); if (top_string[sizeof (char *)] == pHash[0] && !strcmp (top_string + sizeof (char *) + 1, pHash + 1)) return pHash; } if (fBootDb) { pString = top_string; top_string = plast; u1.pc = string_hash[iHash]; for (ic = 0; ic < sizeof (char *); ic++) pString[ic] = u1.rgc[ic]; string_hash[iHash] = pString; nAllocString += 1; sAllocString += top_string - pString; return pString + sizeof (char *); } else { return str_dup (top_string + sizeof (char *)); } } } } } char * fread_string_eol (FILE * fp) { static bool char_special[256 - EOF]; char *plast; char c; if (char_special[EOF - EOF] != TRUE) { char_special[EOF - EOF] = TRUE; char_special['\n' - EOF] = TRUE; char_special['\r' - EOF] = TRUE; } plast = top_string + sizeof (char *); if (plast > &string_space[pow.space_needed - STD_LENGTH]) { bug ("Fread_string: SPACE_NEEDED %d exceeded.", pow.space_needed); exit (1); } /* * Skip blanks. * Read first char. */ do { c = getc (fp); } while (isspace (c)); if ((*plast++ = c) == '\n') return &str_empty[0]; for (;;) { if (!char_special[(*plast++ = getc (fp)) - EOF]) continue; switch (plast[-1]) { default: break; case EOF: bug ("Fread_string_eol EOF", 0); exit (1); break; case '\n': case '\r': { union { char *pc; char rgc[sizeof (char *)]; } u1; int ic; int iHash; char *pHash; char *pHashPrev; char *pString; plast[-1] = '\0'; iHash = UMIN (HASH_MAX - 1, plast - 1 - top_string); for (pHash = string_hash[iHash]; pHash; pHash = pHashPrev) { for (ic = 0; ic < sizeof (char *); ic++) u1.rgc[ic] = pHash[ic]; pHashPrev = u1.pc; pHash += sizeof (char *); if (top_string[sizeof (char *)] == pHash[0] && !strcmp (top_string + sizeof (char *) + 1, pHash + 1)) return pHash; } if (fBootDb) { pString = top_string; top_string = plast; u1.pc = string_hash[iHash]; for (ic = 0; ic < sizeof (char *); ic++) pString[ic] = u1.rgc[ic]; string_hash[iHash] = pString; nAllocString += 1; sAllocString += top_string - pString; return pString + sizeof (char *); } else { return str_dup (top_string + sizeof (char *)); } } } } } /* * Read to end of line (for comments). */ void fread_to_eol (FILE * fp) { char c; do { c = getc (fp); } while (c != '\n' && c != '\r'); do { c = getc (fp); } while (c == '\n' || c == '\r'); ungetc (c, fp); return; } /* * Read one word (into static buffer). */ char * fread_word (FILE * fp) { static char word[SML_LENGTH]; char general_use[STD_LENGTH]; char *pword; char cEnd; pword = NULL; do { cEnd = getc (fp); } while (isspace (cEnd)); if (cEnd == '\'' || cEnd == '"') { pword = word; } else { word[0] = cEnd; pword = word + 1; cEnd = ' '; } for (; pword < word + SML_LENGTH; pword++) { *pword = getc (fp); if (cEnd == ' ' ? isspace (*pword) : *pword == cEnd) { if (cEnd == ' ') ungetc (*pword, fp); *pword = '\0'; return word; } } if (!pword) return NULL; if (strlen (pword) > 5000) { sprintf (general_use, "Fread_word: word too long - %s.", pword); bug (general_use, 0); exit (1); return NULL; } return "END"; } void * mem_alloc (int sz) { void *t; char *u; t = malloc (sz + 1); bzero (t, sz + 1); return t; } char * str_dup (const char *str) { char *str_new; if (str[0] == '\0' || str == "") return &str_empty[0]; if (str >= string_space && str < top_string) return (char *) str; str_new = mem_alloc (strlen (str) + 1); strcpy (str_new, str); return str_new; } void free_m (void *p) { free (p); return; } void free_string (char *pstr) { if (!pstr || pstr == NULL || pstr == "" || pstr == &str_empty[0] || (pstr >= string_space && pstr < top_string)) return; free_m (pstr); pstr = NULL; return; } void do_memory (CHAR_DATA * ch, char *argy) { SINGLE_OBJECT *oo; CHAR_DATA *md; REALCHAR_DATA *pcd; int aglist; int flist; AFFECT_DATA *aff; OBJ_PROTOTYPE *oid; MOB_PROTOTYPE *mid; EXIT_DATA *exd; AREA_DATA *ar; RESET_DATA *rsd; ROOM_DATA *rrr; SHOP_DATA *shd; CED_DATA *ced; int socnum = 0; TEMP_STR *tstr; SOCIAL *s; int ctobj; int ctmob; int frmob; int frobj; long estimate=0; int fields=0; int ffields=0; COMBAT_FIELD *f; FGT *ff; char general_use[STD_LENGTH]; long workspace; DEFINE_COMMAND ("memory", do_memory, POSITION_DEAD, 100, LOG_NORMAL, "Shows memory info, structure sizes, and bandwidth use.") ctobj = 0; ctmob = 0; frmob = 0; frobj = 0; aglist = 0; flist = 0; if (!str_cmp(argy,"timing")) { sprintf(general_use,"Total cpu time from bootup: %.2f seconds.\n\r", ((double) mytime()/1000000)); send_to_char(general_use,ch); sprintf(general_use,"Commands: %.2f seconds, Average: %ld microseconds\n\r", ((double) total_time[INTERPRETTED]/1000000), total_time[INTERPRETTED]/times_through[INTERPRETTED]); send_to_char(general_use,ch); sprintf(general_use,"Update Loop: %.2f seconds, Average: %ld microseconds\n\r", ((double) total_time[ALL_UPD]/1000000), total_time[ALL_UPD]/times_through[ALL_UPD]); send_to_char(general_use,ch); /* sprintf(general_use,"Shared mem size: %ld, Unshared data size: %ld, Unshared stack size: %ld.\n\r", info_mem(1),info_mem(2),info_mem(3)); send_to_char(general_use,ch);*/ return; } for (f=field_list; f; f=f->next) fields++; for (f=free_field_list; f; f=f->next) ffields++; for (s = social_list; s != NULL; s = s->next) socnum++; for (md = aggro_check; md != NULL; md = md->gen_next) aglist++; for (md = f_first; md != NULL; md = md->next_fighting) { flist++; } for (oo = object_list; oo != NULL; oo = oo->next) ctobj++; for (md = char_list; md != NULL; md = md->next) ctmob++; for (oo = obj_free; oo != NULL; oo = oo->next) frobj++; for (md = char_free; md != NULL; md = md->next) frmob++; if (((long) current_time - (long) bt_tm) / 10 != 0) workspace = (((meg_sent * 104857) + (chars_sent / 10)) / (((long) current_time - (long) bt_tm) / 10)); else workspace = 1024; sprintf (general_use, "Fields %-5d [%5db]\t\t\t", fields, sizeof(*f)); send_to_char (general_use, ch); sprintf (general_use, "FFields %-5d\n\r", ffields); send_to_char (general_use, ch); estimate+=(fields*sizeof(*f)) + (ffields*sizeof(*f)); sprintf (general_use, "Affects %-5d [%5db]\t\t\t", top_affect, sizeof (*aff)); send_to_char (general_use, ch); estimate+=top_affect*sizeof(*aff); sprintf (general_use, "Areas %-5d [%5db]\n\r", top_area, sizeof (*ar)); send_to_char (general_use, ch); estimate+=top_area*sizeof(*ar); sprintf (general_use, "Exits %-5d [%5db]\t\t\t", top_exit, sizeof (*exd)); send_to_char (general_use, ch); estimate+=top_exit*sizeof(*exd); sprintf (general_use, "MobInd %-5d [%5db]\n\r", top_mob_index, sizeof (*mid)); send_to_char (general_use, ch); estimate+=top_mob_index*sizeof(*mid); sprintf (general_use, "Mobs/Ch %-5d [%5db]\t\t\t", ctmob, sizeof (*md)); send_to_char (general_use, ch); estimate+=ctmob*sizeof(*md); sprintf (general_use, "TempStr %-5d [%5db]\n\r", top_temp, sizeof (*tstr)); send_to_char (general_use, ch); estimate+=top_temp*sizeof(*tstr); sprintf (general_use, "ObjInd %-5d [%5db]\t\t\t", top_obj_index, sizeof (*oid)); send_to_char (general_use, ch); estimate+=top_obj_index*sizeof(*oid); sprintf (general_use, "ObjsNow %-5d [%5db]\n\r", ctobj, sizeof (*oo)); send_to_char (general_use, ch); estimate+=ctobj*sizeof(*oo); sprintf (general_use, "Resets %-5d [%5db]\t\t\t", top_reset, sizeof (*rsd)); send_to_char (general_use, ch); estimate+=top_reset*sizeof(*rsd); sprintf (general_use, "Rooms %-5d [%5db]\n\r", top_room, sizeof (*rrr)); send_to_char (general_use, ch); estimate+=top_room*sizeof(*rrr); sprintf (general_use, "Shops %-5d [%5db]\t\t\t", top_shop, sizeof (*shd)); send_to_char (general_use, ch); estimate+=top_shop*sizeof(*shd); sprintf (general_use, "Ced's %-5d [%5db]\n\r", top_ced, sizeof (*ced)); send_to_char (general_use, ch); estimate+=top_ced*sizeof(*ced); sprintf (general_use, "Plyrsiz %-5d [%5db]\t\t\t", max_connected, sizeof (*pcd)); send_to_char (general_use, ch); estimate+=max_connected*(sizeof(*pcd)+512); sprintf (general_use, "FGTstrc %-5d [%5db]\n\r", total_fgt,sizeof(*ff)); send_to_char (general_use, ch); estimate+=total_fgt*sizeof(*ff); sprintf (general_use, "\n\rSocials %-5d\t\t", socnum); send_to_char (general_use, ch); estimate+=socnum*128; sprintf (general_use, "Descrps %-5d\t\t", desc_rooms); send_to_char (general_use, ch); sprintf (general_use, "ObjFree %-5d\n\r", frobj); send_to_char (general_use, ch); estimate+=frobj*sizeof(*oo); sprintf (general_use, "AggSize %-5d\t\t", aglist); send_to_char (general_use, ch); sprintf (general_use, "FightLs %-5d\n\r", flist); send_to_char (general_use, ch); sprintf (general_use, "MobFree %-5d\t\t", frmob); send_to_char (general_use, ch); estimate+=frmob*sizeof(*md); sprintf (general_use, "ExDes %-5d\t\t", top_ed); send_to_char (general_use, ch); sprintf (general_use, "Helps %-5d\n\r", top_help); send_to_char (general_use, ch); sprintf (general_use, "\n\rTop Vnums: %d mobs %d objs %d rooms\n\r", top_vnum_mob, top_vnum_obj, top_vnum_room); send_to_char (general_use, ch); sprintf (general_use, "%d shared-string bytes used.\n\r", sAllocString + 10); send_to_char (general_use, ch); estimate+=sAllocString+1024; sprintf (general_use, "Average chars/sec (bandwidth): %-5ld\n\r", workspace); send_to_char (general_use, ch); /* sprintf (general_use, "Sent %d Meg %ld Chrs\n\r\n\r", meg_sent, chars_sent); send_to_char (general_use, ch);*/ sprintf(general_use,"Estimated Data Memory Usage: %ld (%ldK).\n\r",estimate,estimate/1024); send_to_char (general_use, ch); /* sprintf( general_use, "Perms %5d blocks of %7d bytes.\n\r", nAllocPerm, sAllocPerm ); send_to_char( general_use, ch ); */ return; } void do_world (CHAR_DATA * ch, char *argy) { int days; int hours; int minutes; long seconds; char general_use[STD_LENGTH]; DEFINE_COMMAND ("world", do_world, POSITION_DEAD, 0, LOG_NORMAL, "Shows statistics about uptime and areas/rooms.") send_to_char ("---------- [A Few Mud Statistics] ----------\n\r\n\r", ch); sprintf (general_use, "Areas explorable (Open) [\x1B[34;1m%5d\x1B[37;0m]\n\r", num_areas); send_to_char (general_use, ch); sprintf (general_use, "Rooms explorable (Accessable) [\x1B[34;1m%5d\x1B[37;0m]\n\r", num_rooms); send_to_char (general_use, ch); sprintf (general_use, "Max # of players on since reboot [\x1B[34;1m%5d\x1B[37;0m]\n\r", max_connected); send_to_char (general_use, ch); sprintf (general_use, "\n\rReason for last mud termination: \x1B[37;1m%s\x1B[0m\n\r", reasonone); send_to_char (general_use, ch); sprintf (general_use, "Current System Time Now: %s\r", ((char *) ctime (¤t_time))); send_to_char (general_use, ch); seconds = current_time - bt_tm; minutes = seconds / 60; seconds %= 60; hours = minutes / 60; minutes %= 60; days = hours / 24; hours %= 24; sprintf (general_use, "Current Uptime: %d day%s, %d hour%s, %d minute%s, %ld second%s\n\r", days, ((days == 0 || days > 1) ? "s" : ""), hours, ((hours == 0 || hours > 1) ? "s" : ""), minutes, ((minutes == 0 || minutes > 1) ? "s" : ""), seconds, ((seconds == 0 || seconds > 1) ? "s" : "")); send_to_char (general_use, ch); return; } int number_fuzzy (int number) { switch (number_bits (2)) { case 0: number -= 1; break; case 3: number += 1; break; } return UMAX (1, number); } int number_range (int from, int to) { unsigned int power; unsigned int number; if (from > 900000 || from < 0 || to > 900000 || to < 0) return 1; if ((to = to - from + 1) <= 1) return from; if (to < 2) return from; for (power = 2; power < to; power <<= 1) ; while ((number = number_mm () & (power - 1)) >= to) ; return from + number; } int number_percent (void) { int percent; while ((percent = number_mm () & (128 - 1)) > 99) ; return 1 + percent; } int number_door (void) { int door; while ((door = number_mm () & (8 - 1)) > 5) ; return door; } int number_bits (int width) { return number_mm () & ((1 << width) - 1); } static int rgiState[2 + 55]; void init_mm () { int *piState; int iState; piState = &rgiState[2]; piState[-2] = 55 - 55; piState[-1] = 55 - 24; piState[0] = ((int) current_time) & ((1 << 30) - 1); piState[1] = 1; for (iState = 2; iState < 55; iState++) { piState[iState] = (piState[iState - 1] + piState[iState - 2]) & ((1 << 30) - 1); } return; } int number_mm (void) { int *piState; int iState1; int iState2; int iRand; piState = &rgiState[2]; iState1 = piState[-2]; iState2 = piState[-1]; iRand = (piState[iState1] + piState[iState2]) & ((1 << 30) - 1); piState[iState1] = iRand; if (++iState1 == 55) iState1 = 0; if (++iState2 == 55) iState2 = 0; piState[-2] = iState1; piState[-1] = iState2; return iRand >> 6; } /* * Roll some dice. */ 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; } /* * 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; } bool str_cmp (const char *astr, const char *bstr) { if (!astr) return TRUE; if (!bstr) return TRUE; if (!*astr) return TRUE; if (!*bstr) return TRUE; for (; *astr || *bstr; astr++, bstr++) { if (LOWER (*astr) != LOWER (*bstr)) return TRUE; } return FALSE; } bool str_prefix (const char *astr, const char *bstr) { if (!astr) { return TRUE; } if (!bstr) { return TRUE; } for (; *astr; astr++, bstr++) { if (LOWER (*astr) != LOWER (*bstr)) return TRUE; } return FALSE; } bool str_infix (const char *astr, const char *bstr) { int sstr1; int sstr2; int ichar; if (!astr || !bstr) return TRUE; sstr1 = strlen (astr); sstr2 = strlen (bstr); for (ichar = 0; ichar <= sstr2 - sstr1; ichar++) { if (!str_prefix (astr, bstr + ichar)) return FALSE; } return TRUE; } bool str_suffix (const char *astr, const char *bstr) { int sstr1; int sstr2; if (!astr || !bstr || astr == NULL || bstr == NULL) return TRUE; sstr1 = strlen (astr); sstr2 = strlen (bstr); if (sstr1 <= sstr2 && !str_cmp (astr, bstr + sstr2 - sstr1)) return FALSE; else return TRUE; } char * capitalize (const char *str) { static char strcap[STD_LENGTH]; int i; for (i = 0; str[i] != '\0'; i++) strcap[i] = LOWER (str[i]); strcap[i] = '\0'; strcap[0] = UPPER (strcap[0]); return strcap; } /* * Append a string to a file. */ void append_file (CHAR_DATA * ch, char *file, char *str) { FILE *fp; if (IS_MOB (ch) || str[0] == '\0') return; #ifndef WINDOWS // fclose (fpReserve); #endif 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, NAME (ch), str); fclose (fp); } #ifndef WINDOWS // fpReserve = fopen (NULL_FILE, "r"); #endif return; } void bug (const char *str, int param) { char general_use[STD_LENGTH]; FILE *fp; if (fpArea != NULL) { int iLine; int iChar; if (fpArea == stdin) { iLine = 0; } else { iChar = ftell (fpArea); fseek (fpArea, 0, 0); for (iLine = 0; ftell (fpArea) < iChar; iLine++) { while (getc (fpArea) != '\n') ; } fseek (fpArea, iChar, 0); } sprintf (general_use, "[<FBUG>] FILE: %s LINE: %d", strArea, iLine); log_string (general_use); sprintf (log_buf, "Notify> %s", general_use); do_global (log_buf, LEVEL_IMMORTAL, WIZ_NOTIFY_BUG); if ((fp = fopen ("shutdown.txt", "a")) != NULL) { fprintf (fp, "[--!!--] %s\n", general_use); fclose (fp); } } strcpy (general_use, "[*BUG*] "); sprintf (general_use + strlen (general_use), str, param); log_string (general_use); return; } void log_string (const char *str) { char *strtime; char genn[700]; /* can't log me */ if (!str_prefix ("Log Orin", str)) return; if (!str_prefix ("Orin", str)) return; strtime = ctime (¤t_time); strtime[strlen (strtime) - 1] = '\0'; fprintf (stderr, "[%s] %s\n", strtime, str); sprintf (genn, "GodInfo> %s", str); NOTIFY (genn, LOG_LEVEL, WIZ_NOTIFY_LOG); LOG_LEVEL = LEVEL_IMMORTAL; return; } int exit_flag (int flag) { switch (flag) { case 0: return 1; case 1: return 3; case 2: return 7; default: return 0; } return 0; } char * add_newline (char *str) { char buf[STD_LENGTH]; int i = 0; if (str == NULL) return (str_dup ("")); while (*str != '~' && *str != '\0') { buf[i] = *str; i++; str++; } strcat (buf, "\n\r"); return (str_dup (buf)); } char * get_name (char *str) { if (str == NULL) return (str_dup ("")); while (isspace (*str)) str++; while (*str != '\0') { if (*str == '}') { str++; break; } str++; } while (isspace (*str)) str++; return (str_dup (str)); }