terom@185: #ifndef GAMESTATE_HH terom@185: #define GAMESTATE_HH terom@185: ekku@196: class GameState; ekku@196: ekku@196: #include "PhysicsWorld.hh" terom@414: #include "Terrain.hh" ekku@196: #include "Player.hh" ekku@196: #include "Projectile.hh" terom@185: #include "Config.hh" terom@185: terom@412: #include "Graphics/Drawable.hh" terom@412: terom@185: #include terom@185: #include terom@185: #include terom@185: terom@393: class GameStateEventHandler { terom@393: friend class GameState; terom@393: terom@393: protected: terom@393: virtual void on_player_joined (Player *p) = 0; terom@393: virtual void on_player_left (Player *p) = 0; terom@393: }; terom@393: saiam@199: class GameState { terom@185: public: terom@408: /** terom@408: * All active players terom@408: */ terom@185: std::list player_list; terom@408: terom@408: /** terom@408: * All active projectiles terom@408: */ ekku@222: std::list projectiles; terom@408: terom@408: /** terom@408: * Our world simulation terom@408: */ saiam@199: PhysicsWorld world; terom@408: terom@408: /** terom@408: * Our terrain terom@408: */ terom@408: Terrain &terrain; terom@185: terom@274: /** terom@274: * The one LocalPlayer that *we* control terom@274: */ terom@185: LocalPlayer *local_player; terom@274: terom@393: protected: terom@393: /** terom@393: * Notify someone about events? terom@393: */ terom@393: GameStateEventHandler *event_handler; terom@393: terom@393: public: terom@274: /** terom@408: * Create the game world, using the given terrain terom@408: * terom@408: * @param terrain the world's terrain terom@274: */ terom@408: GameState (Terrain &terrain); terom@393: terom@393: /** terom@393: * Set event handler, only one can be set terom@393: */ terom@393: void setEventHandler (GameStateEventHandler *handler); ekku@222: terom@274: /** terom@274: * Adds projectile to our list of projectiles to draw terom@274: */ ekku@222: void addProjectile(Projectile *projectile); terom@185: terom@274: /** terom@274: * Get our current LocalPlayer if we have one, else return NULL (client hasn't connected yet) terom@185: */ saiam@199: LocalPlayer *getLocalPlayer (void); terom@274: terom@274: /** terom@274: * Check that local_player is NULL, and sets it to the given player terom@274: */ terom@274: void setLocalPlayer (LocalPlayer *player); terom@185: terom@274: /** terom@274: * Add the given player to our player_list terom@274: */ terom@274: void addPlayer (Player *player); terom@274: terom@274: /** terom@274: * Removes the given player from player_list. If the given player was the local_player, set that to NULL terom@274: */ saiam@199: void removePlayer (Player *player); terom@417: terom@417: #if GRAPHICS_ENABLED terom@274: /** terom@274: * Draws the terrain, players and projectiles terom@274: */ terom@412: virtual void draw (graphics::Display &display, PixelCoordinate camera, bool displayWeapon); terom@417: #endif terom@185: }; terom@185: terom@185: #endif