support for building without Network/Graphics, although the disable-graphics case is kind of hackish still new_graphics
authorTero Marttila <terom@fixme.fi>
Thu, 22 Jan 2009 01:53:05 +0200
branchnew_graphics
changeset 417 c503e0c6a740
parent 416 38cba347a3a9
child 418 194bc810a570
support for building without Network/Graphics, although the disable-graphics case is kind of hackish still
src/Application.cc
src/Application.hh
src/CMakeLists.txt
src/Config.hh
src/Configuration.hh
src/Engine.cc
src/Engine.hh
src/GameState.cc
src/GameState.hh
src/Graphics/CMakeLists.txt
src/Graphics/Display.hh
src/Network/Buffer.cc
src/Network/CMakeLists.txt
src/Network/Client.cc
src/Network/Config.hh
src/Network/Packet.hh
src/Network/Server.cc
src/Player.cc
src/Player.hh
src/Projectile.cc
src/Projectile.hh
src/Rope.cc
src/Rope.hh
src/Terrain.cc
src/Terrain.hh
src/Types.hh
src/config.h.in
--- a/src/Application.cc	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Application.cc	Thu Jan 22 01:53:05 2009 +0200
@@ -1,7 +1,15 @@
 
 #include "Application.hh"
+#include "Config.hh"
 
-#include <ClanLib/gl.h>
+#if GRAPHICS_ENABLED
+    // for dump_display_modes
+    #include "Graphics/Display.hh"
+    
+    // for CL_SetupGL
+    #include <ClanLib/gl.h>
+#endif
+
 #include <stdexcept>
 #include <sstream>
 #include <cstdio>
@@ -37,42 +45,62 @@
  * Set the arg_* members
  */
 bool Main::parse_args (int argc, char **argv) {
-    // set up the options
-    args.add_option(ARG_HELP, "help", "",
-            "display argument help and exit");
-
-    args.add_option(ARG_PORT, "port", "PORT",
-            "set network port used");
-
-    args.add_option(ARG_SERVER, "server", "",
-            "act as a network server");
 
-    args.add_option(ARG_CLIENT, "client", "SERVERHOST",
-            "act as a network client");
-
-    args.add_option(ARG_GRAPHICS, "graphics", "",        
-            "run graphics/local input. Implied with --connect");
+    // set up the options
+    args.add_usage("[OPTIONS]");
+    args.set_help_indent(30);
+    
+    if (NETWORK_ENABLED) {
+        args.add_group("Network");
 
-    args.add_option(ARG_FULLSCREEN, "fullscreen", "",
-            "run graphics in fullscreen mode");
+        args.add_option(ARG_PORT, "port", "PORT",
+                "set network port used");
 
-    args.add_option(ARG_RESOLUTION, "resolution", "WIDTHxHEIGHT",
-            "set graphics resolution");
-    
-    args.add_option(ARG_LIST_MODES, "list-modes", "",
-            "output a list of available display modes and exit");
+        args.add_option(ARG_SERVER, "server", "",
+                "act as a network server");
+        
+        // require graphics for network-client
+        if (GRAPHICS_ENABLED)
+            args.add_option(ARG_CLIENT, "client", "SERVERHOST",
+                    "act as a network client");
+    }
 
+    if (GRAPHICS_ENABLED) {
+        args.add_group("Graphics");
+
+        args.add_option(ARG_GRAPHICS, "graphics", "",        
+                "run graphics/local input. Implied with --client");
+
+        args.add_option(ARG_FULLSCREEN, "fullscreen", "",
+                "run graphics in fullscreen mode");
+
+        args.add_option(ARG_RESOLUTION, "resolution", "WIDTHxHEIGHT",
+                "set graphics resolution");
+        
+        args.add_option(ARG_LIST_MODES, "list-modes", "",
+                "output a list of available display modes and exit");
+    }
+
+    args.add_group("Game");
     args.add_option(ARG_TERRAIN_SEED, "terrain-seed", "SEED",
             "set seed for terrain random generator");
 
     args.add_option(ARG_TERRAIN_SIZE, "terrain-size", "WIDTHxHEIGHT",
             "set terrain size for random generator");
 
+    
+    args.add_group("General");
+    args.add_option(ARG_HELP, "help", "",
+            "display argument help and exit");
+
     args.add_option(ARG_VERSION, "version", "",
-            "output application version and exit");
+            "output application version plus configuration and exit");
 
+#if GRAPHICS_ENABLED    
     // extra state
     bool resolution_default = true;
+
+#endif    
     
     try {
         // parse args
@@ -88,6 +116,7 @@
                 args.print_help();
                 return false;
 
+#if NETWORK_ENABLED                
             case ARG_PORT:
                 net_port = args.get_argument();
                 break;
@@ -100,6 +129,9 @@
                 net_connect = args.get_argument();
                 break;
 
+#endif                
+
+#if GRAPHICS_ENABLED                
             case ARG_GRAPHICS:
                 graphics_enabled = true;
                 break;
@@ -125,6 +157,7 @@
             case ARG_LIST_MODES:
                 dump_display_modes();
                 return false;
+#endif
 
             case ARG_VERSION:
                 dump_version();
@@ -147,14 +180,18 @@
         }
     }
 
+#if NETWORK_ENABLED    
     // check for invalid combinations of arugments
     if (net_server and !net_connect.empty())
         throw ArgumentError("cannot be both server and client");
+#endif
 
+#if GRAPHICS_ENABLED    
     // enable graphics by default unless server
     if (!net_server)
         graphics_enabled = true;
-    
+#endif    
+
     // continue
     return true;
 }
@@ -180,18 +217,39 @@
     
     return PixelDimensions(w, h);
 }
-        
+
+#if GRAPHICS_ENABLED
 void Main::dump_display_modes (void) {
+    // get the list of display modes from graphics
     const std::vector<CL_DisplayMode> &modes = graphics::Display::getDisplayModes();
+    PixelCoordinate last_resolution;
     
     std::cout << "Available display modes:" << std::endl;
-
-    for (std::vector<CL_DisplayMode>::const_iterator it = modes.begin(); it != modes.end(); it++)
-        std::cout << "\t" << it->get_resolution().width << "x" << it->get_resolution().height << std::endl;
+    
+    // iterate over the list of available display modes
+    for (std::vector<CL_DisplayMode>::const_iterator it = modes.begin(); it != modes.end(); it++) {
+        PixelCoordinate resolution(it->get_resolution().width, it->get_resolution().height);
+        
+        // filter out those that haven't changed
+        if (resolution != last_resolution)
+            std::cout << "\t" << it->get_resolution().width << "x" << it->get_resolution().height << std::endl;
+        
+        // update for next item
+        last_resolution = resolution;
+    }
 }
+#endif
         
 void Main::dump_version (void) {
-    std::cout << PROJECT_LONG_NAME << " version " << PROJECT_VERSION << " built " << PROJECT_BUILD_TIMESTAMP << std::endl;
+    std::cout 
+        << PROJECT_LONG_NAME << " version " << PROJECT_VERSION << " built [" << PROJECT_BUILD_TIMESTAMP << "]" << std::endl;
+
+    // then some additional stuff about what's enabled
+    std::cout
+        << std::endl
+        << "Enabled components:" << std::endl
+        << "\tGraphics:\t" << (GRAPHICS_ENABLED ? "Yes" : "No") << std::endl
+        << "\tNetwork:\t" << (NETWORK_ENABLED ? "Yes" : "No") << std::endl;
 }
 
 /**
@@ -200,8 +258,12 @@
 int Main::main (int argc, char **argv) {
     // initialize the ClanLib components that we use
     CL_SetupCore setup_core;
+
+#if GRAPHICS_ENABLED    
+    // XXX: move to Graphics/Graphics.hh?
     CL_SetupDisplay setup_disp;
     CL_SetupGL setup_gl;
+#endif
 
     try {
         // parse arugments, exit if false
@@ -226,8 +288,12 @@
         } else if (!net_connect.empty()) {
             engine.setupNetworkClient(net_connect, net_port);
         
+        } else if (graphics_enabled) {
+            engine.setupSinglePlayer();
+
         } else {
-            engine.setupSinglePlayer();
+            throw ArgumentError("Nothing to do");
+
         }
 
         // run the main loop
@@ -237,11 +303,14 @@
         return 0;
     
     } catch (ArgumentError &e) {
-        std::cerr << e.what() << std::endl;
+        std::cerr 
+            << "Error: " << e.what() << std::endl
+            << std::endl;
+
         args.print_help();
 
-        // XXX: handle --help
         return 1;
+
     } catch (CL_Error &e) {
         std::cerr << "main: CL_Error:" << e.message << std::endl;
 
--- a/src/Application.hh	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Application.hh	Thu Jan 22 01:53:05 2009 +0200
@@ -28,7 +28,7 @@
         /**
          * --fullscreen and --resolution
          */
-        graphics::DisplayConfig display;
+        DisplayConfig display;
 
         /**
          * --terrain-seed and --terrain-size
@@ -74,7 +74,7 @@
         void dump_display_modes (void);
         
         /**
-         * Print out our project version
+         * Print out our project version and some configuration info
          */
         void dump_version (void);
 
--- a/src/CMakeLists.txt	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/CMakeLists.txt	Thu Jan 22 01:53:05 2009 +0200
@@ -1,22 +1,37 @@
-FILE(GLOB SOURCE_FILES "*.cc" "Network/*.cc")
-FILE(GLOB HEADER_FILES "*.hh" "Network/*.hh")
+FILE(GLOB SOURCE_FILES "*.cc")
+FILE(GLOB HEADER_FILES "*.hh")
 
 set_source_files_properties("version.c" PROPERTIES GENERATED true)
 
+# Component selection
+set (GRAPHICS_ENABLED true)
+set (NETWORK_ENABLED true)
+
+mark_as_advanced (CLEAR GRAPHICS_ENABLED NETWORK_ENABLED)
+
 # Generate config.h
 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/config.h" @ONLY)
 include_directories("${CMAKE_CURRENT_BINARY_DIR}")
 
 # main module
 set (CORE_CLANLIB_COMPONENTS Core App Signals)
-set (CORE_SOURCES ${SOURCE_FILES} ${HEADER_FILES})
+set (CORE_SOURCES ${SOURCE_FILES} ${HEADER_FILES} "version.c")
 
 # Graphics module
-add_subdirectory(Graphics)
+if (GRAPHICS_ENABLED)
+    add_subdirectory (Graphics)
+
+endif (GRAPHICS_ENABLED)
+
+# Network module
+if (NETWORK_ENABLED)
+    add_subdirectory (Network)
+
+endif (NETWORK_ENABLED)    
 
 # Libraries
 set (CLANLIB_VERSION 0.8)
-set (CLANLIB_COMPONENTS ${CORE_CLANLIB_COMPONENTS} ${GRAPHICS_CLANLIB_COMPONENTS})
+set (CLANLIB_COMPONENTS ${CORE_CLANLIB_COMPONENTS} ${GRAPHICS_CLANLIB_COMPONENTS} ${NETWORK_CLANLIB_COMPONENTS})
 
 # ClanLib 0.8
 message (STATUS "Finding ClanLib version=${CLANLIB_VERSION}, components=${CLANLIB_COMPONENTS}" )
@@ -26,7 +41,7 @@
 
 # build list of libs/source files
 set(LIBS ${LIBS} ${ClanLib_LIBRARIES})
-set(SOURCES ${CORE_SOURCES} ${GRAPHICS_SOURCES} "version.c")
+set(SOURCES ${CORE_SOURCES} ${GRAPHICS_SOURCES} ${NETWORK_SOURCES})
 
 # Assumes the project generates only one executable. If you need more, you'll need to alter
 # the script and replace ${PROJECT_SHORT_NAME} by executable name.
--- a/src/Config.hh	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Config.hh	Thu Jan 22 01:53:05 2009 +0200
@@ -134,8 +134,33 @@
  */
 const PixelDimension GRAPHICS_INFO_TEXT_LINE_OFFSET = 5;
 
-// Filesystem paths
+/**
+ * @name Network
+ * @{
+ */
+
+/** Default port used for network games */
+const std::string NETWORK_PORT_STR = "9338";
+
+/** Maximum packet size used for normal NetworkPackets... aligned to a sensible UDP mtu */
+const size_t NETWORK_PACKET_SIZE = 1280;
+
+/** Backlog used for TCP server... doesn't really matter all that much */
+const int NETWORK_LISTEN_BACKLOG = 5;
+
+/** Magic string used to identify game between client/server */
+const char NETWORK_MAGIC_STR[8+1] = "KISNGLIS";
+const uint64_t NETWORK_MAGIC_ID = * ((const uint64_t *) NETWORK_MAGIC_STR);
+
+// @}
+
+/**
+ * @name Filesystem paths
+ * @{
+ */
 const std::string PLAYER_SKIN_PATH = (PROJECT_DATA_DIR "/skin.png");
 const std::string RESOURCE_XML_PATH = (PROJECT_DATA_DIR "/resources.xml");
 
+// @}
+
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Configuration.hh	Thu Jan 22 01:53:05 2009 +0200
@@ -0,0 +1,44 @@
+#ifndef CONFIGURATION_HH
+#define CONFIGURATION_HH
+
+/**
+ * @file
+ *
+ * Various classes/modules have their own configuration structures, which are defined here
+ *
+ * XXX: rename to "Settings" to distinguish from Config/config?
+ */
+
+#include "Types.hh"
+#include "Config.hh"
+
+/**
+ * Terrain configuration
+ */
+struct TerrainConfig {
+    /** Size of the terrain field*/
+    PixelDimensions dimensions;
+
+    /** Set to nonzero to generate random map */
+    int random_seed;
+    
+    /** Defaults */
+    TerrainConfig (void) : dimensions(TERRAIN_WIDTH, TERRAIN_HEIGHT), random_seed(TERRAIN_RANDOM_SEED) { }
+};
+
+/**
+ * Graphics display configuration
+ */
+struct DisplayConfig {
+    /** Display resolution */
+    PixelDimensions resolution;
+
+    /** Fullscreen mode? */
+    bool fullscreen;
+
+    /** Defaults */
+    DisplayConfig (void) : resolution(GRAPHICS_RESOLUTION_WIDTH, GRAPHICS_RESOLUTION_HEIGHT), fullscreen(GRAPHICS_FULLSCREEN) { }
+};
+
+
+#endif
--- a/src/Engine.cc	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Engine.cc	Thu Jan 22 01:53:05 2009 +0200
@@ -1,10 +1,23 @@
 
 #include "Engine.hh"
 #include "SinglePlayer.hh"
-#include "Network/Reactor.hh"
 #include "Config.hh"
 
+// XXX: how does this work if we don't have NETWORK_ENABLED?
+#include "Network/Reactor.hh"
+
+// include the real component definitions
+#if NETWORK_ENABLED
+    #include "Network/Client.hh"
+    #include "Network/Server.hh"
+#endif
+
+#if GRAPHICS_ENABLED
+    #include "Graphics/Graphics.hh"
+#endif
+
 #include <iostream>
+#include <cassert>
 
 Engine::Engine (const std::string resource_xml_path) : 
     terrain(NULL), game_state(NULL), graphics(NULL), net_server(NULL), net_client_connect(NULL),
@@ -22,13 +35,9 @@
 
     // create the GameState
     game_state = new GameState(*terrain);
+    
+    // XXX: NetworkClient + GameView?
 
-    // put graphics into GameView mode
-    // XXX: this state is a mess, this is done in three places in weird ways
-    // this depends on graphics not yet being set in client mode, but not in singleplayer mode
-    if (graphics)
-        graphics->displayGameView(*game_state, game_state->getLocalPlayer());
-   
     return *game_state;
 }
         
@@ -37,12 +46,42 @@
     setupGame(new Terrain(config));
 }
 
-void Engine::setupGraphics (const graphics::DisplayConfig &config) {
+void Engine::setupGraphics (const DisplayConfig &config) {
+
+#if GRAPHICS_ENABLED    
+    assert(!graphics);
+
     // create the graphics
     graphics = new graphics::Graphics(*this, resources, config);
+
+#else
+    (void) config;
+
+    throw Error("No Graphics support available");
+
+#endif
+
+}
+        
+void Engine::startGameView (LocalPlayer *player) {
+
+#if GRAPHICS_ENABLED    
+    assert(graphics);
+
+    graphics->displayGameView(*game_state, player);
+
+#else
+    (void) player;
+
+    throw Error("No Graphics support available");
+
+#endif
+
 }
 
 void Engine::setupNetworkServer (const std::string &listen_port) {
+
+#if NETWORK_EANBLED    
     NetworkEndpoint listen_addr(listen_port);
     
     assert(terrain && game_state);
@@ -52,16 +91,33 @@
 
     // put graphics into GameView mode
     if (graphics)
-        graphics->displayGameView(*game_state, NULL);
- 
+        startGameView(NULL);
+
+#else
+    (void) listen_port;
+
+    throw Error("No Network support available");
+
+#endif    
 }
 
 void Engine::setupNetworkClient (const std::string &connect_host, const std::string &connect_port) {
+
+#if NETWORK_EANBLED    
     // connect_to
     NetworkEndpoint connect_addr(connect_host, connect_port);
 
     // begin connecting, the client will callback us with setupGame once it's connected
     net_client_connect = new NetworkClientConnect(*this, connect_addr);
+
+#else
+    (void) connect_host;
+    (void) connect_port;
+
+    throw Error("No Network support available");
+
+#endif    
+
 }
 
 void Engine::setupSinglePlayer (void) {
@@ -75,7 +131,7 @@
 
     // put graphics into GameView mode
     if (graphics)
-        graphics->displayGameView(*game_state, lp);
+        startGameView(lp);
  
 }
 
@@ -84,26 +140,21 @@
 }
 
 void Engine::run (void) {
-    // our NetworkReactor
-    NetworkReactor *reactor = NetworkReactor::current;
-
-    // timeout info
-    timeval timeout;
-
     while (is_running) {
-        // this does.... magical things
-        CL_System::keep_alive();
+        /*
+         * Run internal ClanLib stuff (also includes our timers) until our timeout has elapsed
+         */
+        CL_System::keep_alive(ENGINE_TIMEOUT_MS);
         
-        // setup our timeout to ENGINE_TIMEOUT_MS
-        timeout.tv_sec = 0;
-        timeout.tv_usec = ENGINE_TIMEOUT_MS * 1000;
-       
+#if NETWORK_ENABLED       
         /*
          * Thursday came and went, I re-wrote clan-event.
          *
-         * We use the NetworkReactor for sleeping, as it handles it effeciently even if we're not using network.
+         * (actually, we only use it for zero-timeout polling now... not sure if this is better than using the above
+         * CL_System::keep_alive)
          */
-        reactor->poll(&timeout);
+        NetworkReactor::current->poll(NULL);
+#endif        
     }
 }
 
--- a/src/Engine.hh	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Engine.hh	Thu Jan 22 01:53:05 2009 +0200
@@ -5,11 +5,15 @@
 class Engine;
 
 #include "GameState.hh"
-#include "Graphics/Graphics.hh"
-#include "Network/Server.hh"
-#include "Network/Client.hh"
+#include "Configuration.hh"
+#include "Logger.hh"
 
-#include "Logger.hh"
+// forward-declare component pointer types
+// XXX: move to some kind of Components.hh file?
+namespace graphics { class Graphics; }
+class NetworkServer;
+class NetworkClientConnect;
+class NetworkClient;
 
 /**
  * This is the core class that glues all the other components together and runs the main loop
@@ -51,17 +55,23 @@
         void setupGame (const TerrainConfig &config);
 
         /**
-         * Enable graphics
+         * Enable graphics. 
+         *
+         * Requires: GRAPHICS_ENABLED
          */
-        void setupGraphics (const graphics::DisplayConfig &config);
+        void setupGraphics (const DisplayConfig &config);
         
         /**
          * Setup server, must call setupGame first
+         *
+         * Requires: NETWORK_ENABLED
          */
         void setupNetworkServer (const std::string &listen_port);
 
         /**
          * Setup client, do *not* call setupGame, configuration comes from the server
+         *
+         * Requires: NETWORK_ENABLED
          */
         void setupNetworkClient (const std::string &connect_host, const std::string &connect_port);
 
@@ -82,9 +92,9 @@
 
     private:
         /**
-         * Actually start graphics, requires that game_state is now set
+         * Puts graphics into GameView mode, using our GameState and the given player
          */
-        void startGraphics (void);
+        void startGameView (LocalPlayer *player);
 
     public:
         // get a pointer to our resource manager
--- a/src/GameState.cc	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/GameState.cc	Thu Jan 22 01:53:05 2009 +0200
@@ -2,6 +2,7 @@
 #include "GameState.hh"
 #include "Engine.hh"
 #include "Config.hh"
+#include "Error.hh"
 
 GameState::GameState (Terrain &terrain) : 
     world(Vector(0, MAP_GRAVITY), Vector(terrain.getWidth(), terrain.getHeight()), terrain), 
@@ -49,7 +50,8 @@
     if (event_handler)
         event_handler->on_player_left(player);
 }
-    
+
+#if GRAPHICS_ENABLED
 void GameState::draw (graphics::Display &display, PixelCoordinate camera, bool displayWeapon) {
     // Draw terrain
     terrain.draw(display, camera);
@@ -70,4 +72,5 @@
         (*it)->draw(display, camera);
     }
 }
- 
+#endif
+
--- a/src/GameState.hh	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/GameState.hh	Thu Jan 22 01:53:05 2009 +0200
@@ -93,11 +93,13 @@
      * Removes the given player from player_list. If the given player was the local_player, set that to NULL
      */
     void removePlayer (Player *player);
-    
+
+#if GRAPHICS_ENABLED    
     /**
      * Draws the terrain, players and projectiles
      */
     virtual void draw (graphics::Display &display, PixelCoordinate camera, bool displayWeapon);
+#endif
 };
 
 #endif
--- a/src/Graphics/CMakeLists.txt	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Graphics/CMakeLists.txt	Thu Jan 22 01:53:05 2009 +0200
@@ -3,5 +3,7 @@
 
 # what ClanLib components we need
 set (GRAPHICS_CLANLIB_COMPONENTS Display GL GUI PARENT_SCOPE)
+
+# list of source files
 set (GRAPHICS_SOURCES ${GRAPHICS_SOURCE_FILES} ${GRAPHICS_HEADER_FILES} PARENT_SCOPE)
 
--- a/src/Graphics/Display.hh	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Graphics/Display.hh	Thu Jan 22 01:53:05 2009 +0200
@@ -7,23 +7,13 @@
 namespace graphics
 {
 
-struct DisplayConfig {
-    /** Display resolution */
-    PixelDimensions resolution;
-
-    /** Fullscreen mode? */
-    bool fullscreen;
-
-    /** Defaults */
-    DisplayConfig (void) : resolution(GRAPHICS_RESOLUTION_WIDTH, GRAPHICS_RESOLUTION_HEIGHT), fullscreen(GRAPHICS_FULLSCREEN) { }
-};
-
 class Display;
 
 }
 
 #include "View.hh"
 #include "../Timer.hh"
+#include "../Configuration.hh"
 
 #include <ClanLib/display.h>
 
--- a/src/Network/Buffer.cc	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Network/Buffer.cc	Thu Jan 22 01:53:05 2009 +0200
@@ -1,6 +1,6 @@
 
 #include "Buffer.hh"
-#include "Config.hh"
+#include "../Config.hh"
 
 #include <ClanLib/core.h>
 #include <cstdlib>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Network/CMakeLists.txt	Thu Jan 22 01:53:05 2009 +0200
@@ -0,0 +1,9 @@
+FILE(GLOB NETWORK_SOURCE_FILES "*.cc")
+FILE(GLOB NETWORK_HEADER_FILES "*.hh")
+
+# what ClanLib components we need
+set (NETWORK_CLANLIB_COMPONENTS "" PARENT_SCOPE)
+
+# list of source files
+set (NETWORK_SOURCES ${NETWORK_SOURCE_FILES} ${NETWORK_HEADER_FILES} PARENT_SCOPE)
+
--- a/src/Network/Client.cc	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Network/Client.cc	Thu Jan 22 01:53:05 2009 +0200
@@ -1,7 +1,7 @@
 
 #include "Client.hh"
 #include "Protocol.hh"
-#include "Config.hh"
+#include "../Config.hh"
 #include "../Engine.hh"
 #include "../Logger.hh"
 
--- a/src/Network/Config.hh	Thu Jan 22 00:28:26 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-#ifndef NETWORK_CONFIG_HH
-#define NETWORK_CONFIG_HH
-
-/**
- * @file
- *
- * Network-related configuration
- */
-
-#include <string>
-
-/** Default port used for network games */
-const std::string NETWORK_PORT_STR = "9338";
-
-/** Maximum packet size used for normal NetworkPackets... aligned to a sensible UDP mtu */
-const size_t NETWORK_PACKET_SIZE = 1280;
-
-/** Backlog used for TCP server... doesn't really matter all that much */
-const int NETWORK_LISTEN_BACKLOG = 5;
-
-/** Magic string used to identify game between client/server */
-const char NETWORK_MAGIC_STR[8+1] = "KISNGLIS";
-const uint64_t NETWORK_MAGIC_ID = * ((const uint64_t *) NETWORK_MAGIC_STR);
-
-#endif /* NETWORK_CONFIG_HH */
--- a/src/Network/Packet.hh	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Network/Packet.hh	Thu Jan 22 01:53:05 2009 +0200
@@ -7,7 +7,7 @@
  * Provides the NetworkPackets that are used to communicate over a NetworkTCP/NetworkUDP sockets.
  */
 
-#include "Config.hh"
+#include "../Config.hh"
 #include "../Types.hh"
 #include "../Error.hh"
 
--- a/src/Network/Server.cc	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Network/Server.cc	Thu Jan 22 01:53:05 2009 +0200
@@ -1,7 +1,7 @@
 
 #include "Server.hh"
 #include "Protocol.hh"
-#include "Config.hh"
+#include "../Config.hh"
 #include "../Engine.hh"
 #include "../Logger.hh"
 
--- a/src/Player.cc	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Player.cc	Thu Jan 22 01:53:05 2009 +0200
@@ -11,11 +11,15 @@
 #include <string>
 #include <cassert>
 
-
-// player static state
+#if GRAPHICS_ENABLED
+/*
+ * Static draw-related state
+ */
 bool Player::skin_loaded = false;
 CL_Surface Player::skin_surface;
 
+#endif
+
 // XXX: give these better names and move elsewhere
 const int img_num_aim = 5;
 const int img_num_step = 4;
@@ -325,6 +329,7 @@
     kills++;
 }
 
+#if GRAPHICS_ENABLED
 void Player::draw (graphics::Display &display, PixelCoordinate camera) {
     CL_GraphicContext *gc = display.get_gc();
 
@@ -399,4 +404,5 @@
         );
     }
 }
+#endif
 
--- a/src/Player.hh	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Player.hh	Thu Jan 22 01:53:05 2009 +0200
@@ -152,6 +152,7 @@
      */
     void addKill ();
 
+#if GRAPHICS_ENABLED    
     /*
      * Drawing requires the skin texture, which is loaded on-demand when draw is called
      */
@@ -162,7 +163,8 @@
      * Draw this player
      */
     virtual void draw (graphics::Display &display, PixelCoordinate camera);
-    
+#endif
+
     /**
      * Returns statistics on the number of kills for this player
      */
@@ -200,10 +202,12 @@
      */
     virtual void handleInput (PlayerInput input, TimeMS dt);
         
+#if GRAPHICS_ENABLED    
     /**
      * As Player, but also draws the current weapon name if displayWeapon
      */
     virtual void draw (graphics::Display &display, bool displayWeapon, PixelCoordinate camera);
+#endif    
 };
 
 /**
--- a/src/Projectile.cc	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Projectile.cc	Thu Jan 22 01:53:05 2009 +0200
@@ -74,6 +74,7 @@
     PhysicsObject::tick(dt);
 }
 
+#if GRAPHICS_ENABLED
 void Projectile::draw(graphics::Display &display, PixelCoordinate camera) const {
     CL_GraphicContext *gc = display.get_gc();
 
@@ -92,4 +93,5 @@
         gc->fill_quad(projectile, CL_Color::green);
     }
 }
- 
+#endif
+
--- a/src/Projectile.hh	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Projectile.hh	Thu Jan 22 01:53:05 2009 +0200
@@ -48,11 +48,6 @@
     virtual ~Projectile (void);
     
     /**
-     * Draw
-     */
-    virtual void draw (graphics::Display &display, PixelCoordinate camera) const;
-
-    /**
      * Get damage inflicted by this projectile.
      *
      * @return Damage inflicted by projectile.
@@ -94,6 +89,18 @@
      * If we have expired, call onDestory and removeGround
      */
     virtual void tick (TimeMS dt);
+
+public:
+
+#if GRAPHICS_ENABLED    
+    /**
+     * Draw
+     */
+    virtual void draw (graphics::Display &display, PixelCoordinate camera) const;
+
+#endif
+
+
 };
  
 #endif
--- a/src/Rope.cc	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Rope.cc	Thu Jan 22 01:53:05 2009 +0200
@@ -1,6 +1,9 @@
+
+// XXX: must include Player first, as it contains an instance of Rope
 #include "Player.hh"
 #include "Rope.hh"      
 #include "Engine.hh"
+#include "Error.hh"
 
 #include <math.h>
 #include <stdexcept>
@@ -150,6 +153,7 @@
     this->length = length;
 }
 
+#if GRAPHICS_ENABLED
 void Rope::draw (graphics::Display &display, PixelCoordinate camera) {
     PixelCoordinate player_pos = player.getCoordinate() - camera;
     PixelCoordinate target_pos;
@@ -181,6 +185,7 @@
         ROPE_COLOR_DARK
     );
 }
+#endif
 
 void Rope::tick (TimeMS dt) {
     if (state == ROPE_FLYING) {
--- a/src/Rope.hh	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Rope.hh	Thu Jan 22 01:53:05 2009 +0200
@@ -5,11 +5,6 @@
 // and the Player wants to know the rope.
 class Rope;
 
-#include "Player.hh"
-#include "PhysicsObject.hh"
-
-#include "Graphics/Drawable.hh"
-
 /**
  * The rope can be in one of three states...
  *
@@ -21,6 +16,11 @@
     ROPE_FIXED      //<<< The rope is attached to something
 };
 
+#include "Player.hh"
+#include "PhysicsObject.hh"
+
+#include "Graphics/Drawable.hh"
+
 /**
  * A rope is a PhysicsObject that can be thrown, whereupon it then flies until it hits something, whereupon
  * it attaches to that, and sets itself as the player's pivot.
@@ -84,10 +84,12 @@
         
     virtual void tick (TimeMS dt);
 
+#if GRAPHICS_ENABLED    
     /*
      * Draw the rope, in the FLYING/FIXED state
      */ 
     virtual void draw (graphics::Display &display, PixelCoordinate camera);
+#endif    
 };
 
 #endif
--- a/src/Terrain.cc	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Terrain.cc	Thu Jan 22 01:53:05 2009 +0200
@@ -101,6 +101,8 @@
 }
 
 void Terrain::generatePixelBuffer (void) {
+
+#if GRAPHICS_ENABLED    
     // initialize textures
     generateTexture();
 
@@ -114,6 +116,12 @@
             pixbuf.draw_pixel(x, y, getTexturePixel(x, y));
         }
     }
+
+#else
+    // no-op
+
+#endif    
+
 }
 
 /*
@@ -410,6 +418,7 @@
     return normal;
 }
 
+#if GRAPHICS_ENABLED
 void Terrain::draw (graphics::Display &display, PixelCoordinate camera) {
     // XXX: can we optimize this somehow?
     
@@ -419,4 +428,5 @@
     // draw it onto the graphics, offset by camera position
     surf.draw(-camera.x, -camera.y, display.get_gc());
 }
+#endif
 
--- a/src/Terrain.hh	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Terrain.hh	Thu Jan 22 01:53:05 2009 +0200
@@ -4,9 +4,12 @@
 #include "Vector.hh"
 #include "Types.hh"
 #include "Config.hh"
+#include "Configuration.hh"
 
 #include "Graphics/Drawable.hh"
 
+#include <vector>
+
 /**
  * Different types of terrain available
  */
@@ -22,27 +25,6 @@
 };
 
 /**
- * Terrain "pixel" type
- */
-typedef uint8_t TerrainPixel;
-
-/**
- * Terrain configuration
- */
-struct TerrainConfig {
-    /** Size of the terrain field*/
-    PixelDimensions dimensions;
-
-    /** Set to nonzero to generate random map */
-    int random_seed;
-    
-    /** Defaults */
-    TerrainConfig (void) : dimensions(TERRAIN_WIDTH, TERRAIN_HEIGHT), random_seed(TERRAIN_RANDOM_SEED) { }
-};
-
-#include <vector>
-
-/**
  * Terrain class. Represents game terrain and contains member
  * functions to manipulate terrain and get info about it.
  * 
@@ -59,10 +41,13 @@
 
     /** Terrain dimensions */
     PixelDimension width, height;
-    
+
+#if GRAPHICS_ENABLED    
     /** We pre-render the textured terrain data for display */
     CL_PixelBuffer pixbuf;
 
+#endif    
+
     // XXX: terrain texture
     std::vector<std::vector<int> > texture;
 
@@ -103,8 +88,10 @@
     inline void setType (PixelDimension x, PixelDimension y, TerrainType t) {
         terrain_buf[y * width + x] = (TerrainPixel) t;
 
+#if GRAPHICS_ENABLED        
         // XXX: locking?
         pixbuf.draw_pixel(x, y, getTexturePixel(x, y));
+#endif        
     }
 
     /**
@@ -241,6 +228,7 @@
      */
     Vector getNormal (Vector point, Vector prevPoint) const;
 
+#if GRAPHICS_ENABLED        
     /**
      * Draw the terrain onto the given graphics context
      *
@@ -248,6 +236,7 @@
      * @param camera view position
      */
     virtual void draw (graphics::Display &display, PixelCoordinate camera = PixelCoordinate(0, 0));
+#endif    
 };
 
 #endif
--- a/src/Types.hh	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/Types.hh	Thu Jan 22 01:53:05 2009 +0200
@@ -63,4 +63,11 @@
  */
 typedef int32_t TickCount;
 
+/**
+ * Terrain "pixel" type
+ *
+ * @see TerrainType
+ */
+typedef uint8_t TerrainPixel;
+
 #endif
--- a/src/config.h.in	Thu Jan 22 00:28:26 2009 +0200
+++ b/src/config.h.in	Thu Jan 22 01:53:05 2009 +0200
@@ -13,5 +13,17 @@
  */
 extern const char *PROJECT_VERSION, *PROJECT_BUILD_TIMESTAMP;
 
+/**
+ * Provide possibility to compile without graphics code.
+ *
+ * Defined as a boolean value (so use #if GRAPHICS_ENABLED / if (GRAPHICS_ENABLED) )
+ */
+#define GRAPHICS_ENABLED @GRAPHICS_ENABLED@
+
+/**
+ * Provide possibility to compile without network code.
+ */
+#define NETWORK_ENABLED @NETWORK_ENABLED@
+
 #endif