--- deliantra/server/common/init.C 2006/12/14 22:45:40 1.16 +++ deliantra/server/common/init.C 2008/04/15 03:16:02 1.44 @@ -1,25 +1,25 @@ /* - CrossFire, A Multiplayer game for X-windows - - Copyright (C) 2002 Mark Wedel & Crossfire Development Team - Copyright (C) 1992 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. - - 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 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 -*/ + * This file is part of Deliantra, the Roguelike Realtime MMORPG. + * + * 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 + * + * Deliantra 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 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. + * + * You should have received a copy of 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 @@ -73,32 +73,29 @@ PLAYERDIR, MAPDIR, ARCHETYPES, REGIONS, TREASURES, UNIQUE_DIR, TEMPLATE_DIR, TMPDIR, - STAT_LOSS_ON_DEATH, PK_LUCK_PENALTY, + STAT_LOSS_ON_DEATH, 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, + SET_FRIENDLY_FIRE, + 0, + 0, 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, @@ -108,8 +105,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 @@ -139,85 +134,7 @@ "Light" }; - -/* This loads the emergency map information from a - * .emergency file in the map directory. Doing this makes - * it easier to switch between map distributions (don't need - * to recompile. Note that there is no reason I see that - * 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) -{ - 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 == 2) - { - settings.emergency_y = atoi (tmpbuf); - } - 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); - } -} - - -/* - * 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_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 (); -} - - -/* init_environ initializes values from the environmental variables. +/* init_environ initialises values from the environmental variables. * it needs to be called very early, since command line options should * overwrite these if specified. */ @@ -226,137 +143,75 @@ { char *cp; - cp = getenv ("CROSSFIRE_LIBDIR"); + cp = getenv ("DELIANTRA_LIBDIR"); if (cp) settings.datadir = cp; - cp = getenv ("CROSSFIRE_LOCALDIR"); + + cp = getenv ("DELIANTRA_LOCALDIR"); if (cp) settings.localdir = cp; - cp = getenv ("CROSSFIRE_PLAYERDIR"); + + cp = getenv ("DELIANTRA_PLAYERDIR"); if (cp) settings.playerdir = cp; - cp = getenv ("CROSSFIRE_MAPDIR"); + + cp = getenv ("DELIANTRA_MAPDIR"); if (cp) settings.mapdir = cp; - cp = getenv ("CROSSFIRE_ARCHETYPES"); + + cp = getenv ("DELIANTRA_ARCHETYPES"); if (cp) settings.archetypes = cp; - cp = getenv ("CROSSFIRE_TREASURES"); + + cp = getenv ("DELIANTRA_TREASURES"); if (cp) settings.treasures = cp; - cp = getenv ("CROSSFIRE_UNIQUEDIR"); + + cp = getenv ("DELIANTRA_UNIQUEDIR"); if (cp) settings.uniquedir = cp; - cp = getenv ("CROSSFIRE_TEMPLATEDIR"); + + cp = getenv ("DELIANTRA_TEMPLATEDIR"); if (cp) settings.templatedir = cp; - cp = getenv ("CROSSFIRE_TMPDIR"); + + cp = getenv ("DELIANTRA_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) + set_logfd (-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); -} + int logfd = open (settings.logfilename, O_CREAT|O_WRONLY|O_APPEND, 0666); -void -init_dynamic (void) -{ - archetype *at = first_archetype; - - while (at) - { - if (at->clone.type == MAP) + if (logfd >= 0) + set_logfd (logfd); + else { - 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; - } + set_logfd (-1); + LOG (llevError, "Unable to open %s as the logfile - will use stderr instead", settings.logfilename); } - - at = at->next; } - - LOG (llevDebug, "You Need a archetype called 'map' and it have to contain start map\n"); - exit (-1); } -unsigned long todtick; - -/* - * Write out the current time to the file so time does not - * reset every time the server reboots. - */ - void -write_todclock (void) -{ - 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; - } - fprintf (fp, "%lu", todtick); - fclose (fp); -} - -/* - * Initializes the gametime and TOD counters - * Called by init_library(). - */ - -void -init_clocks (void) +init_dynamic (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; - } - fscanf (fp, "%lu", &todtick); - LOG (llevDebug, "todtick=%lu\n", todtick); - fclose (fp); + first_map_ext_path = "/start/HallsOfSelection"; + first_map_path = "/HallOfSelection"; } /* - * Initializes the attack messages. + * initialises the attack messages. * Called by init_library(). */ @@ -379,7 +234,7 @@ has_been_done = 1; sprintf (filename, "%s/attackmess", settings.datadir); - LOG (llevDebug, "Reading attack messages from %s...", filename); + LOG (llevDebug, "Reading attack messages from %s...\n", filename); if ((fp = open_and_uncompress (filename, 0, &comp)) == NULL) { LOG (llevError, "Can't open %s.\n", filename);