--- deliantra/server/common/init.C 2007/05/28 21:21:40 1.36 +++ deliantra/server/common/init.C 2010/10/11 18:40:43 1.61 @@ -1,25 +1,25 @@ /* - * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game. + * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team - * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team - * Copyright (©) 1992,2007 Frank Tore Johansen + * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * Copyright (©) 2002 Mark Wedel & Crossfire Development Team + * Copyright (©) 1992 Frank Tore Johansen * - * Crossfire TRT is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. + * Deliantra is free software: you can redistribute it and/or modify it under + * the terms of the Affero GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51 - * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the Affero GNU General Public License + * and the GNU General Public License along with this program. If not, see + * . * - * The authors can be reached via e-mail to + * The authors can be reached via e-mail to */ #define EXTERN // horrible hack @@ -27,26 +27,34 @@ #include #include +dynbuf_text msg_dynbuf (65536, 65536); + +extern const char *const attacktype_name[NROFATTACKS] = { +# define def(uc, lc, desc, plus, change) # lc, +# include "attackinc.h" +# undef def +}; + extern const char *const attacktype_desc[NROFATTACKS] = { -# define def(uc, lc, name, plus, change) # name, +# define def(uc, lc, desc, plus, change) # desc, # include "attackinc.h" # undef def }; extern const char *const resist_plus[NROFATTACKS] = { -# define def(uc, lc, name, plus, change) # plus, +# define def(uc, lc, desc, plus, change) # plus, # include "attackinc.h" # undef def }; extern const char *const change_resist_msg[NROFATTACKS] = { -# define def(uc, lc, name, plus, change) # change, +# define def(uc, lc, desc, plus, change) # change, # include "attackinc.h" # undef def }; int resist_table[NROFATTACKS] = { -# define def(uc, lc, name, plus, change) ATNR_ ## uc, +# define def(uc, lc, desc, plus, change) ATNR_ ## uc, # include "attackinc.h" # undef def }; @@ -57,14 +65,7 @@ struct Settings settings = { LOGFILE, /* Logfile */ CSPORT, /* Client/server port */ - -/* Debug level */ -#ifdef DEBUG - llevDebug, -#else - llevInfo, -#endif - + llevTrace, /* Log level */ 0, NULL, 0, /* dumpvalues, dumparg, daemonmode */ 0, /* argc */ NULL, /* argv */ @@ -72,7 +73,7 @@ DATADIR, LOCALDIR, PLAYERDIR, MAPDIR, ARCHETYPES, REGIONS, TREASURES, - UNIQUE_DIR, TEMPLATE_DIR, + UNIQUE_DIR, "", TMPDIR, PK_LUCK_PENALTY, STAT_LOSS_ON_DEATH, @@ -92,13 +93,8 @@ 0, EXPLORE_MODE, SPELLPOINT_LEVEL_DEPEND, - MOTD, - "rules", - "news", - "", /* DM_MAIL */ - 0, 0, 0, 0, 0, 0, 0, 0, /* worldmap settings */ 0, - 1.0, + 1.25, /* Armor enchantment stuff */ ARMOR_MAX_ENCHANT, @@ -135,68 +131,27 @@ "Light" }; -/* - * It is vital that init_library() is called by any functions - * using this library. - * If you want to lessen the size of the program using the library, - * you can replace the call to init_library() with init_globals() and - * init_function_pointers(). Good idea to also call init_vars and - * init_hash_table if you are doing any object loading. - */ -void -init_library (void) -{ - init_globals (); - init_block (); - init_dynamic (); - init_attackmess (); - init_experience (); -} - /* init_environ initialises values from the environmental variables. * it needs to be called very early, since command line options should * overwrite these if specified. */ void -init_environ (void) +init_environ () { - char *cp; + const char *cp; + + if (cp = getenv ("DELIANTRA_CONFDIR" )) settings.confdir = cp; + if (cp = getenv ("DELIANTRA_LIBDIR" )) settings.datadir = cp; + if (cp = getenv ("DELIANTRA_LOCALDIR" )) settings.localdir = cp; + if (cp = getenv ("DELIANTRA_PLAYERDIR" )) settings.playerdir = cp; + if (cp = getenv ("DELIANTRA_MAPDIR" )) settings.mapdir = cp; + if (cp = getenv ("DELIANTRA_ARCHETYPES" )) settings.archetypes = cp; + if (cp = getenv ("DELIANTRA_TREASURES" )) settings.treasures = cp; + if (cp = getenv ("DELIANTRA_UNIQUEDIR" )) settings.uniquedir = cp; + if (cp = getenv ("DELIANTRA_TEMPLATEDIR")) settings.templatedir = cp; + if (cp = getenv ("DELIANTRA_TMPDIR" )) 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; + if (cp = getenv ("DELIANTRA_LOGFILE" )) settings.logfilename = cp; } /* @@ -204,43 +159,29 @@ * Might use environment-variables as default for some of them. */ void -init_globals (void) +init_globals () { if (settings.logfilename[0] == 0) - logfile = stderr; - else if ((logfile = fopen (settings.logfilename, "a")) == NULL) + log_setfd (-1); + else { - 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_dynamic (void) -{ - archetype *at = first_archetype; + int logfd = open (settings.logfilename, O_CREAT|O_WRONLY|O_APPEND, 0666); - while (at) - { - if (at->clone.type == MAP) + if (logfd >= 0) + log_setfd (logfd); + else { - if (at->clone.race) - first_map_ext_path = at->clone.race; - - if (EXIT_PATH (&at->clone)) - { - first_map_path = EXIT_PATH (&at->clone); - return; - } + log_setfd (-1); + LOG (llevError, "Unable to open %s as the logfile - will use stderr instead", settings.logfilename); } - - at = at->next; } +} - LOG (llevDebug, "You need an archetype of type 'map' and it has to contain the player start map\n"); - exit (-1); +void +init_dynamic () +{ + first_map_ext_path = "/start/HallsOfSelection"; + first_map_path = "/HallOfSelection"; } /* @@ -251,95 +192,64 @@ //attackmess_t attack_mess[NROFATTACKMESS][MAXATTACKMESS]; void -init_attackmess (void) +init_attackmess () { - 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...\n", filename); - if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL) + object_thawer thawer (settings.datadir, "attackmess"); + + if (!thawer) { - LOG (llevError, "Can't open %s.\n", filename); + LOG (llevError, "Can't open %s.\n", thawer.name); return; } - level = 0; - while (fgets (buf, MAX_BUF, fp) != NULL) + int msgnum = -1; + int total = 0; + + while (thawer.kw) { - if (*buf == '#') - continue; - if ((cp = strchr (buf, '\n')) != NULL) - *cp = '\0'; - cp = buf; - while (*cp == ' ') /* Skip blanks */ - cp++; + if (thawer.kw != KW_type) + if (!thawer.parse_error ("attackmess file")) + break; + + thawer.get (msgnum); + thawer.next (); - if (strncmp (cp, "TYPE:", 5) == 0) + int level = 0; + + while (thawer.kw == KW_hp) { - p = strtok (buf, ":"); - p = strtok (NULL, ":"); - if (mode == 1) + // our old friend, dog-slow sscanf + int hp; + char buf1[1024]; + char buf2[1024]; + char buf3[1024]; + + if (4 != sscanf (thawer.value_nn, "%d %1023[^|]|%1023[^|]|%1023[^|]", + &hp, buf1, buf2, buf3)) + thawer.parse_error ("attackmess file"); + else { - attack_mess[mess][level].level = -1; - attack_mess[mess][level].buf1 = NULL; - attack_mess[mess][level].buf2 = NULL; - attack_mess[mess][level].buf3 = NULL; + if (*buf2 == '-') + *buf2 = 0; // sscanf can't parse empty fields, so use "-" as marker + + attack_mess[msgnum][level].level = hp; + attack_mess[msgnum][level].buf1 = strdup (buf1); + attack_mess[msgnum][level].buf2 = strdup (buf2); + attack_mess[msgnum][level].buf3 = strdup (buf3); + + ++level; + ++total; } - 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; - } - 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; + + thawer.next (); } + + attack_mess[msgnum][level].level = -1; + attack_mess[msgnum][level].buf1 = 0; + attack_mess[msgnum][level].buf2 = 0; + attack_mess[msgnum][level].buf3 = 0; } - 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, msgnum + 1); } +