diff --git a/src/game/game.cpp b/src/game/game.cpp new file mode 100644 index 000000000..147e8459b --- /dev/null +++ b/src/game/game.cpp @@ -0,0 +1,349 @@ +// ___________ _________ _____ __ +// \_ _____/______ ____ ____ \_ ___ \____________ _/ ____\/ |_ +// | __) \_ __ \_/ __ \_/ __ \/ \ \/\_ __ \__ \\ __\\ __\ +// | \ | | \/\ ___/\ ___/\ \____| | \// __ \| | | | +// \___ / |__| \___ >\___ >\______ /|__| (____ /__| |__| +// \/ \/ \/ \/ \/ +// ______________________ ______________________ +// T H E W A R B E G I N S +// FreeCraft - A free fantasy real time strategy game engine +// +/**@name game.c - The game set-up and creation. */ +/* +** (c) Copyright 1998-2000 by Lutz Sammer, Andreas Arens +** +** $Id$ +*/ + +//@{ + +/*---------------------------------------------------------------------------- +-- Includes +----------------------------------------------------------------------------*/ + +#include <stdio.h> +#include <string.h> + +#include "freecraft.h" +#include "map.h" +#include "minimap.h" +#include "player.h" +#include "unit.h" +#include "pathfinder.h" +#include "pud.h" +#include "ui.h" +#include "font.h" +#include "sound_server.h" +#include "menus.h" +#include "depend.h" +#include "interface.h" +#include "cursor.h" +#include "image.h" +#include "spells.h" +#include "construct.h" +#include "network.h" +#include "settings.h" + +#include "ccl.h" + +/*---------------------------------------------------------------------------- +-- Variables +----------------------------------------------------------------------------*/ + +global Settings GameSettings; /// Game Settings +global int lcm_prevent_recurse = 0; /// prevent recursion through LoadGameMap + +/*---------------------------------------------------------------------------- +-- Map loading/saving +----------------------------------------------------------------------------*/ + +/** +** Load a clone map. +** +** @param filename map filename +** @param map map loaded +*/ +local void LoadCloneMap(const char* filename,WorldMap* map) +{ + DebugLevel3(__FUNCTION__" %p \n",map); + +#if defined(USE_CCL) || defined(USE_CCL2) + if (lcm_prevent_recurse) { + fprintf(stderr,"recursive use of load clone map!\n"); + exit(-1); + } + lcm_prevent_recurse = 1; + gh_eval_file((char*)filename); + lcm_prevent_recurse = 0; + if (!ThisPlayer) { /// ARI: bomb if nothing was loaded! + fprintf(stderr,"%s: invalid clone map\n", filename); + exit(-1); + } +#else + fprintf(stderr,"Sorry, you need guile/siod installed to use clone maps!\n"); + exit(-1); +#endif +} + +/** +** Load any map. +** +** @param filename map filename +** @param map map loaded +*/ +global void LoadMap(const char* filename,WorldMap* map) +{ + const char* tmp; + + tmp=strrchr(filename,'.'); + if( tmp ) { +#ifdef USE_ZLIB + if( !strcmp(tmp,".gz") ) { + while( tmp-1>filename && *--tmp!='.' ) { + } + } else +#endif +#ifdef USE_BZ2LIB + if( !strcmp(tmp,".bz2") ) { + while( tmp-1>filename && *--tmp!='.' ) { + } + } +#endif + if( !strcmp(tmp,".cm") +#ifdef USE_ZLIB + || !strcmp(tmp,".cm.gz") +#endif +#ifdef USE_BZ2LIB + || !strcmp(tmp,".cm.bz2") +#endif + ) { + LoadCloneMap(filename,map); + return; + } + } + // ARI: This bombs out, if no pud, so will be safe. + LoadPud(filename,map); +} + +/** +** Save a map. +** +** @param file Output file. +*/ +global void SaveMap(FILE* file) +{ + fprintf(file,"\n;;; -----------------------------------------\n"); + fprintf(file,";;; MODULE: map $Id$\n"); + + fprintf(file,"(freecraft-map\n"); + + // FIXME: Need version number here! + fprintf(file," '(version %d.%d)\n",0,0); + fprintf(file," '(description \"Saved\")\n"); + fprintf(file," '(terrain %d \"%s\")\n" + ,TheMap.Terrain,Tilesets[TheMap.Terrain].Name); + fprintf(file," '(tiles #(\n"); + fprintf(file," )\n"); + + fprintf(file,")\n"); + + fprintf(file,"(the-map\n"); + fprintf(file," (%d %d)\n",TheMap.Width,TheMap.Height); + fprintf(file," %d\n",TheMap.NoFogOfWar); + fprintf(file,")\n"); +} + +/*---------------------------------------------------------------------------- +-- Game creation +----------------------------------------------------------------------------*/ + +/** +** CreateGame. +** +** Load map, graphics, sounds, etc +** +** @param filename map filename +** @param map map loaded +*/ +global void CreateGame(char* filename, WorldMap* map) +{ + char* PalettePath; + + if (filename == NULL) { + ProcessMenu(MENU_PRG_START, 1); + } else { + if (filename[0] != '/' && filename[0] != '.') { + filename = strdcat3(FreeCraftLibPath, "/", filename); + } + // + // Load the map. + // + LoadMap(filename, map); + } + + if( FlagRevealMap ) { + RevealMap(); + } + + DebugLevel3("Terrain %d\n",TheMap.Terrain); + + // FIXME: must use palette from tileset!! + // FIXME: this must be extendable!! + + switch( TheMap.Terrain ) { + case TilesetSummer: + PalettePath = strdcat(FreeCraftLibPath, "/summer.rgb"); + break; + case TilesetWinter: + PalettePath = strdcat(FreeCraftLibPath, "/winter.rgb"); + break; + case TilesetWasteland: + PalettePath = strdcat(FreeCraftLibPath, "/wasteland.rgb"); + break; + case TilesetSwamp: + PalettePath = strdcat(FreeCraftLibPath, "/swamp.rgb"); + break; + default: + DebugLevel2("Unknown Terrain %d\n",TheMap.Terrain); + PalettePath = strdcat(FreeCraftLibPath, "/summer.rgb"); + break; + } + LoadRGB(GlobalPalette, PalettePath); + VideoCreatePalette(GlobalPalette); + + // + // Graphic part + // + LoadIcons(); + InitMenus(ThisPlayer->Race); + LoadImages(ThisPlayer->Race); + LoadCursors(ThisPlayer->Race); + LoadTileset(); + InitUnitButtons(); + LoadMissileSprites(); + InitSpells(); + LoadUnitSprites(); + LoadConstructions(); + LoadDecorations(); + + IfDebug( + DebugLevel0("Graphics uses %d bytes (%d KB, %d MB)\n" + ,AllocatedGraphicMemory + ,AllocatedGraphicMemory/1024 + ,AllocatedGraphicMemory/1024/1024); + DebugLevel0("Compressed graphics uses %d bytes (%d KB, %d MB)\n" + ,CompressedGraphicMemory + ,CompressedGraphicMemory/1024 + ,CompressedGraphicMemory/1024/1024); + ); + + CreateMinimap(); // create minimap for pud + InitMap(); // setup draw functions + InitMapFogOfWar(); // build tables for fog of war + PreprocessMap(); // Adjust map for use + MapColorCycle(); // Setup color cycle + + InitUserInterface(); // Setup the user interface. + + // + // Sound part + // + //FIXME: check if everything is really loaded + LoadUnitSounds(); + MapUnitSounds(); + +#ifdef WITH_SOUND + IfDebug( + DebugLevel0("Sounds uses %d bytes (%d KB, %d MB)\n" + ,AllocatedSoundMemory + ,AllocatedSoundMemory/1024 + ,AllocatedSoundMemory/1024/1024); + DebugLevel0("Compressed sounds uses %d bytes (%d KB, %d MB)\n" + ,CompressedSoundMemory + ,CompressedSoundMemory/1024 + ,CompressedSoundMemory/1024/1024); + ); +#endif + + // + // Network part + // + InitNetwork(); + + // + // Init units' groups + // + InitGroups(); + + // + // Init players? + // + DebugPlayers(); + PlayersInitAi(); + + // + // Upgrades + // + InitUpgrades(); + + // + // Dependencies + // + InitDependencies(); + + // + // Buttons (botpanel) + // + InitButtons(); + +#ifdef WITH_SOUND + if (SoundFildes!=-1) { + //FIXME: must be done after map is loaded + if ( InitSoundServer() ) { + SoundOff=1; + SoundFildes=-1; + } else { + // must be done after sounds are loaded + InitSoundClient(); + } + } +#endif + + if( ThisPlayer->Race==PlayerRaceHuman ) { + SetDefaultTextColors(FontWhite,FontYellow); + // FIXME: Add this again: + // PlaySound(SoundBasicHumanVoicesSelected1); + } else if( ThisPlayer->Race==PlayerRaceOrc ) { + SetDefaultTextColors(FontYellow,FontWhite); + // FIXME: Add this again: + // PlaySound(SoundBasicOrcVoicesSelected1); + } + // FIXME: support more races + + MapCenter(ThisPlayer->X,ThisPlayer->Y); + + //FIXME: must be done after map is loaded + if(AStarOn) { + InitAStar(); + } + +} + + +/** +** Init Game Setting to default values +** +*/ +global void InitSettings(void) +{ + int i; + + for (i = 0; i < PlayerMax; i++) { + GameSettings.Presets[i].Race = SettingsPresetMapDefault; + GameSettings.Presets[i].Team = SettingsPresetMapDefault; + } + GameSettings.Resources = SettingsResourcesMapDefault; + GameSettings.NumUnits = SettingsNumUnitsMapDefault; + GameSettings.Opponents = SettingsPresetMapDefault; + GameSettings.Terrain = SettingsPresetMapDefault; +}