--- deliantra/server/common/init.C 2006/09/09 23:49:06 1.9 +++ deliantra/server/common/init.C 2006/12/18 02:35:00 1.17 @@ -1,9 +1,4 @@ /* - * static char *rcsid_init_c = - * "$Id: init.C,v 1.9 2006/09/09 23:49:06 root Exp $"; - */ - -/* CrossFire, A Multiplayer game for X-windows Copyright (C) 2002 Mark Wedel & Crossfire Development Team @@ -23,33 +18,27 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - The authors can be reached via e-mail at crossfire-devel@real-time.com + The authors can be reached via e-mail at */ -#define EXTERN // horrible hack +#define EXTERN // horrible hack #include #include -extern const char* const attacktype_desc[NROFATTACKS] = { +extern const char *const attacktype_desc[NROFATTACKS] = { # define def(uc, lc, name, plus, change) # name, # include "attackinc.h" # undef def }; -extern const keyword resist_save[NROFATTACKS] = { -# define def(uc, lc, name, plus, change) KW_resist_ ## lc, -# include "attackinc.h" -# undef def -}; - -extern const char* const resist_plus[NROFATTACKS] = { +extern const char *const resist_plus[NROFATTACKS] = { # define def(uc, lc, name, plus, change) # plus, # include "attackinc.h" # undef def }; -extern const char* const change_resist_msg[NROFATTACKS] = { +extern const char *const change_resist_msg[NROFATTACKS] = { # define def(uc, lc, name, plus, change) # change, # include "attackinc.h" # undef def @@ -65,8 +54,8 @@ * correspond to. */ struct Settings settings = { -LOGFILE, /* Logfile */ -CSPORT, /* Client/server port */ + LOGFILE, /* Logfile */ + CSPORT, /* Client/server port */ /* Debug level */ #ifdef DEBUG @@ -75,85 +64,78 @@ llevInfo, #endif -0, NULL, 0, /* dumpvalues, dumparg, daemonmode */ -0, /* argc */ -NULL, /* argv */ -CONFDIR, -DATADIR, -LOCALDIR, -PLAYERDIR, MAPDIR, ARCHETYPES,REGIONS,TREASURES, -UNIQUE_DIR, TEMPLATE_DIR, -TMPDIR, -STAT_LOSS_ON_DEATH, -PK_LUCK_PENALTY, -PERMANENT_EXPERIENCE_RATIO, -DEATH_PENALTY_RATIO, -DEATH_PENALTY_LEVEL, -BALANCED_STAT_LOSS, -NOT_PERMADETH, -SIMPLE_EXP, -RESET_LOCATION_TIME, -SET_TITLE, -RESURRECTION, -SEARCH_ITEMS, -SPELL_ENCUMBRANCE, -SPELL_FAILURE_EFFECTS, -CASTING_TIME, -REAL_WIZ, -RECYCLE_TMP_MAPS, -EXPLORE_MODE, -SPELLPOINT_LEVEL_DEPEND, -SET_FRIENDLY_FIRE, -"", /* Who format specifier */ -"", /* who wiz format specifier */ -MOTD, -"rules", -"news", -"", /* DM_MAIL */ -0, /* This and the next 3 values are metaserver values */ -"", -"", -0, -"", -0,0,0,0,0,0,0,0, /* worldmap settings*/ -EMERGENCY_MAPPATH, EMERGENCY_X, EMERGENCY_Y, -0, -1.0, + 0, NULL, 0, /* dumpvalues, dumparg, daemonmode */ + 0, /* argc */ + NULL, /* argv */ + CONFDIR, + DATADIR, + LOCALDIR, + PLAYERDIR, MAPDIR, ARCHETYPES, REGIONS, TREASURES, + UNIQUE_DIR, TEMPLATE_DIR, + TMPDIR, + STAT_LOSS_ON_DEATH, + PK_LUCK_PENALTY, + PERMANENT_EXPERIENCE_RATIO, + DEATH_PENALTY_RATIO, + DEATH_PENALTY_LEVEL, + BALANCED_STAT_LOSS, + NOT_PERMADETH, + SIMPLE_EXP, + RESET_LOCATION_TIME, + SET_TITLE, + RESURRECTION, + SEARCH_ITEMS, + SPELL_ENCUMBRANCE, + SPELL_FAILURE_EFFECTS, + CASTING_TIME, + REAL_WIZ, + EXPLORE_MODE, + SPELLPOINT_LEVEL_DEPEND, + SET_FRIENDLY_FIRE, + MOTD, + "rules", + "news", + "", /* DM_MAIL */ + 0, 0, 0, 0, 0, 0, 0, 0, /* worldmap settings */ + EMERGENCY_MAPPATH, EMERGENCY_X, EMERGENCY_Y, + 0, + 1.0, + /* Armor enchantment stuff */ -ARMOR_MAX_ENCHANT, -ARMOR_WEIGHT_REDUCTION, -ARMOR_WEIGHT_LINEAR, -ARMOR_SPEED_IMPROVEMENT, -ARMOR_SPEED_LINEAR, -1, /* no_player_stealing */ -1, /* create_home_portals */ + ARMOR_MAX_ENCHANT, + ARMOR_WEIGHT_REDUCTION, + ARMOR_WEIGHT_LINEAR, + ARMOR_SPEED_IMPROVEMENT, + ARMOR_SPEED_LINEAR, + 1, /* no_player_stealing */ + 1, /* create_home_portals */ }; /* perhaps not the best place for this, but needs to be * in some file in the common area so that standalone * programs, like the random map generator, can be built. */ -const char* const spellpathnames[NRSPELLPATHS] = { - "Protection", - "Fire", - "Frost", - "Electricity", - "Missiles", - "Self", - "Summoning", - "Abjuration", - "Restoration", - "Detonation", - "Mind", - "Creation", - "Teleportation", - "Information", - "Transmutation", - "Transferrence", - "Turning", - "Wounding", - "Death", - "Light" +const char *const spellpathnames[NRSPELLPATHS] = { + "Protection", + "Fire", + "Frost", + "Electricity", + "Missiles", + "Self", + "Summoning", + "Abjuration", + "Restoration", + "Detonation", + "Mind", + "Creation", + "Teleportation", + "Information", + "Transmutation", + "Transferrence", + "Turning", + "Wounding", + "Death", + "Light" }; @@ -164,40 +146,47 @@ * this could not be re-loaded during play, but it seems * like there should be little reason to do that. */ -static void init_emergency_mappath(void) +static void +init_emergency_mappath (void) { - char filename[MAX_BUF], tmpbuf[MAX_BUF]; - FILE *fp; - int online=0; - - /* If this file doesn't exist, not a big deal */ - sprintf(filename,"%s/%s/.emergency",settings.datadir, settings.mapdir); - if ((fp = fopen(filename, "r"))!=NULL) { - while (fgets(tmpbuf, MAX_BUF-1, fp)) { - if (tmpbuf[0] == '#') continue; /* ignore comments */ - - if (online == 0) { - tmpbuf[strlen(tmpbuf)-1] = 0; /* kill newline */ - settings.emergency_mapname = strdup_local(tmpbuf); + char filename[MAX_BUF], tmpbuf[MAX_BUF]; + FILE *fp; + int online = 0; + + /* If this file doesn't exist, not a big deal */ + sprintf (filename, "%s/%s/.emergency", settings.datadir, settings.mapdir); + if ((fp = fopen (filename, "r")) != NULL) + { + while (fgets (tmpbuf, MAX_BUF - 1, fp)) + { + if (tmpbuf[0] == '#') + continue; /* ignore comments */ + + if (online == 0) + { + tmpbuf[strlen (tmpbuf) - 1] = 0; /* kill newline */ + settings.emergency_mapname = strdup (tmpbuf); } - else if (online == 1) { - settings.emergency_x = atoi(tmpbuf); + else if (online == 1) + { + settings.emergency_x = atoi (tmpbuf); } - else if (online == 2) { - settings.emergency_y = atoi(tmpbuf); + else if (online == 2) + { + settings.emergency_y = atoi (tmpbuf); } - online++; - if (online>2) break; + online++; + if (online > 2) + break; } - fclose(fp); - if (online<=2) - LOG(llevError,"Online read partial data from %s\n", filename); - LOG(llevDebug,"Emergency mappath reset to %s (%d, %d)\n", settings.emergency_mapname, - settings.emergency_x, settings.emergency_y); + fclose (fp); + if (online <= 2) + LOG (llevError, "Online read partial data from %s\n", filename); + LOG (llevDebug, "Emergency mappath reset to %s (%d, %d)\n", settings.emergency_mapname, settings.emergency_x, settings.emergency_y); } } - + /* * It is vital that init_library() is called by any functions @@ -208,21 +197,22 @@ * init_hash_table if you are doing any object loading. */ -void init_library(void) { - init_environ(); - init_globals(); - init_objects(); - init_vars(); - init_block(); - ReadBmapNames (); - ReadSmooth(); - init_anim(); /* Must be after we read in the bitmaps */ - init_archetypes(); /* Reads all archetypes from file */ - init_dynamic (); - init_attackmess(); - init_clocks(); - init_emergency_mappath(); - init_experience(); +void +init_library (void) +{ + init_environ (); + init_globals (); + init_vars (); + init_block (); + ReadBmapNames (); + ReadSmooth (); + init_anim (); /* Must be after we read in the bitmaps */ + init_archetypes (); /* Reads all archetypes from file */ + init_dynamic (); + init_attackmess (); + init_clocks (); + init_emergency_mappath (); + init_experience (); } @@ -230,109 +220,84 @@ * it needs to be called very early, since command line options should * overwrite these if specified. */ -void init_environ(void) { - char *cp; +void +init_environ (void) +{ + char *cp; - cp=getenv("CROSSFIRE_LIBDIR"); - if (cp) settings.datadir=cp; - cp=getenv("CROSSFIRE_LOCALDIR"); - if (cp) settings.localdir=cp; - cp=getenv("CROSSFIRE_PLAYERDIR"); - if (cp) settings.playerdir=cp; - cp=getenv("CROSSFIRE_MAPDIR"); - if (cp) settings.mapdir=cp; - cp=getenv("CROSSFIRE_ARCHETYPES"); - if (cp) settings.archetypes=cp; - cp=getenv("CROSSFIRE_TREASURES"); - if (cp) settings.treasures=cp; - cp=getenv("CROSSFIRE_UNIQUEDIR"); - if (cp) settings.uniquedir=cp; - cp=getenv("CROSSFIRE_TEMPLATEDIR"); - if (cp) settings.templatedir=cp; - cp=getenv("CROSSFIRE_TMPDIR"); - if (cp) settings.tmpdir=cp; + cp = getenv ("CROSSFIRE_LIBDIR"); + if (cp) + settings.datadir = cp; + cp = getenv ("CROSSFIRE_LOCALDIR"); + if (cp) + settings.localdir = cp; + cp = getenv ("CROSSFIRE_PLAYERDIR"); + if (cp) + settings.playerdir = cp; + cp = getenv ("CROSSFIRE_MAPDIR"); + if (cp) + settings.mapdir = cp; + cp = getenv ("CROSSFIRE_ARCHETYPES"); + if (cp) + settings.archetypes = cp; + cp = getenv ("CROSSFIRE_TREASURES"); + if (cp) + settings.treasures = cp; + cp = getenv ("CROSSFIRE_UNIQUEDIR"); + if (cp) + settings.uniquedir = cp; + cp = getenv ("CROSSFIRE_TEMPLATEDIR"); + if (cp) + settings.templatedir = cp; + cp = getenv ("CROSSFIRE_TMPDIR"); + if (cp) + settings.tmpdir = cp; } - + /* * Initialises all global variables. * Might use environment-variables as default for some of them. */ -void init_globals(void) { - if (settings.logfilename[0] == 0) { - logfile = stderr; - } - else if ((logfile=fopen(settings.logfilename, "a"))==NULL) { - fprintf(stderr,"Unable to open %s as the logfile - will use stderr instead\n", - settings.logfilename); - logfile = stderr; - } - else { - setvbuf(logfile, NULL, _IOLBF, 0); +void +init_globals (void) +{ + if (settings.logfilename[0] == 0) + logfile = stderr; + else if ((logfile = fopen (settings.logfilename, "a")) == NULL) + { + fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename); + logfile = stderr; } - exiting = 0; - first_player=NULL; - first_friendly_object=NULL; - first_map=NULL; - first_treasurelist=NULL; - first_artifactlist=NULL; - first_archetype=NULL; - *first_map_ext_path=0; - warn_archetypes=0; - nroftreasures = 0; - nrofartifacts = 0; - nrofallowedstr=0; - ring_arch = NULL; - amulet_arch = NULL; - staff_arch = NULL; - trying_emergency_save = 0; - num_animations=0; - animations_allocated=0; - init_defaults(); + else + setvbuf (logfile, NULL, _IOLBF, 0); } -/* - * Sets up and initialises the linked list of free and used objects. - * Allocates a certain chunk of objects and puts them on the free list. - * Called by init_library(); - */ - void -init_objects(void) +init_dynamic (void) { - /* Initialize all objects: */ - objects = NULL; - active_objects = NULL; -} - -/* - * Initialises global variables which can be changed by options. - * Called by init_library(). - */ - -void init_defaults(void) { - editor=0; - nroferrors=0; -} - + archetype *at = first_archetype; -void init_dynamic (void) { - archetype *at = first_archetype; - while (at) { - if (at->clone.type == MAP) { - if (at->clone.race) { - strcpy (first_map_ext_path, at->clone.race); - } - if (EXIT_PATH (&at->clone)) { - strcpy (first_map_path, EXIT_PATH (&at->clone)); - return; + while (at) + { + if (at->clone.type == MAP) + { + if (at->clone.race) + strcpy (first_map_ext_path, at->clone.race); + + if (EXIT_PATH (&at->clone)) + { + strcpy (first_map_path, EXIT_PATH (&at->clone)); + return; } } - at = at->next; + + at = at->next; } - LOG(llevDebug,"You Need a archetype called 'map' and it have to contain start map\n"); - exit (-1); + + LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n"); + exit (-1); } unsigned long todtick; @@ -342,18 +307,20 @@ * reset every time the server reboots. */ -void write_todclock(void) +void +write_todclock (void) { - char filename[MAX_BUF]; - FILE *fp; + char filename[MAX_BUF]; + FILE *fp; - sprintf(filename, "%s/clockdata", settings.localdir); - if ((fp = fopen(filename, "w")) == NULL) { - LOG(llevError, "Cannot open %s for writing\n", filename); - return; + sprintf (filename, "%s/clockdata", settings.localdir); + if ((fp = fopen (filename, "w")) == NULL) + { + LOG (llevError, "Cannot open %s for writing\n", filename); + return; } - fprintf(fp, "%lu", todtick); - fclose(fp); + fprintf (fp, "%lu", todtick); + fclose (fp); } /* @@ -361,28 +328,30 @@ * Called by init_library(). */ -void init_clocks(void) +void +init_clocks (void) { - char filename[MAX_BUF]; - FILE *fp; - static int has_been_done=0; - - if (has_been_done) - return; - else - has_been_done = 1; - - sprintf(filename, "%s/clockdata", settings.localdir); - LOG(llevDebug, "Reading clockdata from %s...", filename); - if ((fp = fopen(filename, "r")) == NULL) { - LOG(llevError, "Can't open %s.\n", filename); - todtick = 0; - write_todclock(); - return; + char filename[MAX_BUF]; + FILE *fp; + static int has_been_done = 0; + + if (has_been_done) + return; + else + has_been_done = 1; + + sprintf (filename, "%s/clockdata", settings.localdir); + LOG (llevDebug, "Reading clockdata from %s...", filename); + if ((fp = fopen (filename, "r")) == NULL) + { + LOG (llevError, "Can't open %s.\n", filename); + todtick = 0; + write_todclock (); + return; } - fscanf(fp, "%lu", &todtick); - LOG(llevDebug, "todtick=%lu\n", todtick); - fclose(fp); + fscanf (fp, "%lu", &todtick); + LOG (llevDebug, "todtick=%lu\n", todtick); + fclose (fp); } /* @@ -392,84 +361,96 @@ //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS]; -void init_attackmess(void){ - char buf[MAX_BUF]; - char filename[MAX_BUF]; - char *cp, *p; - FILE *fp; - static int has_been_done=0; - int mess, level, comp; - int mode=0, total=0; - - if (has_been_done) - return; - else - has_been_done = 1; - - sprintf(filename, "%s/attackmess", settings.datadir); - LOG(llevDebug, "Reading attack messages from %s...", filename); - if ((fp = open_and_uncompress(filename, 0, &comp)) == NULL) { - LOG(llevError, "Can't open %s.\n", filename); - return; +void +init_attackmess (void) +{ + char buf[MAX_BUF]; + char filename[MAX_BUF]; + char *cp, *p; + FILE *fp; + static int has_been_done = 0; + int mess, level, comp; + int mode = 0, total = 0; + + if (has_been_done) + return; + else + has_been_done = 1; + + sprintf (filename, "%s/attackmess", settings.datadir); + LOG (llevDebug, "Reading attack messages from %s...", filename); + if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL) + { + LOG (llevError, "Can't open %s.\n", filename); + return; } - level = 0; - while (fgets(buf, MAX_BUF, fp)!=NULL) { - if (*buf=='#') continue; - if((cp=strchr(buf,'\n'))!=NULL) - *cp='\0'; - cp=buf; - while(*cp==' ') /* Skip blanks */ - cp++; - - if (strncmp(cp, "TYPE:", 5)==0) { - p = strtok(buf, ":"); - p = strtok(NULL, ":"); - if (mode == 1) { - attack_mess[mess][level].level = -1; - attack_mess[mess][level].buf1 = NULL; - attack_mess[mess][level].buf2 = NULL; - attack_mess[mess][level].buf3 = NULL; + level = 0; + while (fgets (buf, MAX_BUF, fp) != NULL) + { + if (*buf == '#') + continue; + if ((cp = strchr (buf, '\n')) != NULL) + *cp = '\0'; + cp = buf; + while (*cp == ' ') /* Skip blanks */ + cp++; + + if (strncmp (cp, "TYPE:", 5) == 0) + { + p = strtok (buf, ":"); + p = strtok (NULL, ":"); + if (mode == 1) + { + attack_mess[mess][level].level = -1; + attack_mess[mess][level].buf1 = NULL; + attack_mess[mess][level].buf2 = NULL; + attack_mess[mess][level].buf3 = NULL; } - level = 0; - mess = atoi(p); - mode = 1; - continue; + level = 0; + mess = atoi (p); + mode = 1; + continue; + } + if (mode == 1) + { + p = strtok (buf, "="); + attack_mess[mess][level].level = atoi (buf); + p = strtok (NULL, "="); + if (p != NULL) + attack_mess[mess][level].buf1 = strdup (p); + else + attack_mess[mess][level].buf1 = strdup (""); + mode = 2; + continue; + } + else if (mode == 2) + { + p = strtok (buf, "="); + attack_mess[mess][level].level = atoi (buf); + p = strtok (NULL, "="); + if (p != NULL) + attack_mess[mess][level].buf2 = strdup (p); + else + attack_mess[mess][level].buf2 = strdup (""); + mode = 3; + continue; } - if (mode==1) { - p = strtok(buf, "="); - attack_mess[mess][level].level = atoi(buf); - p = strtok(NULL, "="); - if (p != NULL) - attack_mess[mess][level].buf1 = strdup_local(p); - else - attack_mess[mess][level].buf1 = strdup_local(""); - mode = 2; - continue; - } else if (mode==2) { - p = strtok(buf, "="); - attack_mess[mess][level].level = atoi(buf); - p = strtok(NULL, "="); - if (p != NULL) - attack_mess[mess][level].buf2 = strdup_local(p); - else - attack_mess[mess][level].buf2 = strdup_local(""); - mode = 3; - continue; - } else if (mode==3) { - p = strtok(buf, "="); - attack_mess[mess][level].level = atoi(buf); - p = strtok(NULL, "="); - if (p != NULL) - attack_mess[mess][level].buf3 = strdup_local(p); - else - attack_mess[mess][level].buf3 = strdup_local(""); - mode = 1; - level++; - total++; - continue; + else if (mode == 3) + { + p = strtok (buf, "="); + attack_mess[mess][level].level = atoi (buf); + p = strtok (NULL, "="); + if (p != NULL) + attack_mess[mess][level].buf3 = strdup (p); + else + attack_mess[mess][level].buf3 = strdup (""); + mode = 1; + level++; + total++; + continue; } } - LOG(llevDebug, "got %d messages in %d categories.\n", total, mess+1); - close_and_delete(fp, comp); + LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1); + close_and_delete (fp, comp); }