--- deliantra/server/common/init.C 2007/05/17 13:24:54 1.34 +++ deliantra/server/common/init.C 2009/11/07 18:30:05 1.51 @@ -1,25 +1,25 @@ /* - * CrossFire, A Multiplayer game for X-windows + * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team - * Copyright (C) 2002 Mark Wedel & Crossfire Development Team - * Copyright (C) 1992 Frank Tore Johansen + * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team + * Copyright (©) 1992,2007 Frank Tore Johansen * - * This program 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 + * 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 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 + * 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 */ #define EXTERN // horrible hack @@ -27,6 +27,8 @@ #include #include +dynbuf_text msg_dynbuf (65536, 65536); + extern const char *const attacktype_desc[NROFATTACKS] = { # define def(uc, lc, name, plus, change) # name, # include "attackinc.h" @@ -88,15 +90,10 @@ SPELL_ENCUMBRANCE, SPELL_FAILURE_EFFECTS, SET_FRIENDLY_FIRE, - CASTING_TIME, - REAL_WIZ, + 0, + 0, EXPLORE_MODE, SPELLPOINT_LEVEL_DEPEND, - MOTD, - "rules", - "news", - "", /* DM_MAIL */ - 0, 0, 0, 0, 0, 0, 0, 0, /* worldmap settings */ 0, 1.0, @@ -106,8 +103,6 @@ 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 @@ -137,24 +132,6 @@ "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. @@ -162,43 +139,20 @@ void init_environ (void) { - char *cp; + const 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; + 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; + + if (cp = getenv ("DELIANTRA_LOGFILE" )) settings.logfilename = cp; } /* @@ -209,40 +163,26 @@ init_globals (void) { if (settings.logfilename[0] == 0) - logfile = stderr; - else if ((logfile = fopen (settings.logfilename, "a")) == NULL) + set_logfd (-1); + else { - fprintf (stderr, "Unable to open %s as the logfile - will use stderr instead\n", settings.logfilename); - logfile = stderr; + int logfd = open (settings.logfilename, O_CREAT|O_WRONLY|O_APPEND, 0666); + + if (logfd >= 0) + set_logfd (logfd); + else + { + set_logfd (-1); + LOG (llevError, "Unable to open %s as the logfile - will use stderr instead", settings.logfilename); + } } - else - setvbuf (logfile, NULL, _IOLBF, 0); } void init_dynamic (void) { - archetype *at = first_archetype; - - while (at) - { - if (at->clone.type == MAP) - { - if (at->clone.race) - first_map_ext_path = at->clone.race; - - if (EXIT_PATH (&at->clone)) - { - first_map_path = EXIT_PATH (&at->clone); - return; - } - } - - at = at->next; - } - - LOG (llevDebug, "You need an archetype of type 'map' and it has to contain the player start map\n"); - exit (-1); + first_map_ext_path = "/start/HallsOfSelection"; + first_map_path = "/HallOfSelection"; } /* @@ -260,7 +200,7 @@ char *cp, *p; FILE *fp; static int has_been_done = 0; - int mess, level, comp; + int msgnum, level, comp; int mode = 0, total = 0; if (has_been_done) @@ -281,8 +221,10 @@ { if (*buf == '#') continue; + if ((cp = strchr (buf, '\n')) != NULL) *cp = '\0'; + cp = buf; while (*cp == ' ') /* Skip blanks */ cp++; @@ -291,57 +233,63 @@ { 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; + attack_mess[msgnum][level].level = -1; + attack_mess[msgnum][level].buf1 = NULL; + attack_mess[msgnum][level].buf2 = NULL; + attack_mess[msgnum][level].buf3 = NULL; } + level = 0; - mess = atoi (p); + msgnum = atoi (p); mode = 1; - continue; } - if (mode == 1) + else if (mode == 1) { p = strtok (buf, "="); - attack_mess[mess][level].level = atoi (buf); + attack_mess[msgnum][level].level = atoi (buf); p = strtok (NULL, "="); + if (p != NULL) - attack_mess[mess][level].buf1 = strdup (p); + attack_mess[msgnum][level].buf1 = strdup (p); else - attack_mess[mess][level].buf1 = strdup (""); + attack_mess[msgnum][level].buf1 = strdup (""); + mode = 2; - continue; } else if (mode == 2) { p = strtok (buf, "="); - attack_mess[mess][level].level = atoi (buf); + attack_mess[msgnum][level].level = atoi (buf); p = strtok (NULL, "="); + if (p != NULL) - attack_mess[mess][level].buf2 = strdup (p); + attack_mess[msgnum][level].buf2 = strdup (p); else - attack_mess[mess][level].buf2 = strdup (""); + attack_mess[msgnum][level].buf2 = strdup (""); + mode = 3; - continue; } else if (mode == 3) { p = strtok (buf, "="); - attack_mess[mess][level].level = atoi (buf); + attack_mess[msgnum][level].level = atoi (buf); p = strtok (NULL, "="); + if (p != NULL) - attack_mess[mess][level].buf3 = strdup (p); + attack_mess[msgnum][level].buf3 = strdup (p); else - attack_mess[mess][level].buf3 = strdup (""); + attack_mess[msgnum][level].buf3 = strdup (""); + mode = 1; level++; total++; - continue; } } - LOG (llevDebug, "got %d messages in %d categories.\n", total, mess + 1); + + LOG (llevDebug, "got %d messages in %d categories.\n", total, msgnum + 1); close_and_delete (fp, comp); } +