#pragma once #include #include #include #include namespace game { // forward declarations class Command; class Missile; class Player; class Planet; class Ship; class Trace; class State { public: /*************************************************************************/ /* State management */ /*************************************************************************/ // called to setup the state (randomize planets, kill // traces/missiles/ships etc.) void init(); // main method to advance the simulation by the given timestamp in // seconds. void advance(float dt); /*************************************************************************/ /* Network / Input */ /*************************************************************************/ // The upper layer (network/renderer) calling these three functions // should keep id's unique and give one (network) input an id. int addPlayer(); void playerLeft(int playerId); void commandForPlayer(int playerId, Command *cmd); // lookup. return nullptr on invalid playerId Player *playerForId(int playerId); /*************************************************************************/ /* Mixed stuff */ // distance after which missiles get lost in space (and explode) float maxMissileDistance() const { return m_maxMissileDistance; } // each ship has the same radius float shipRadius() const { return m_shipRadius; } // add a trace to the list of traces. void addTrace(Trace *trace); /*************************************************************************/ /* Rendering */ /*************************************************************************/ // Game items which should be rendered are here: // (access missiles by iterating over player's missiles attribute) std::vector planets; std::vector ships; std::vector players; std::vector traces; private: /*************************************************************************/ /* Internal */ /*************************************************************************/ void playerKillsPlayer(Player *killer, Player *victim); void advancePlayerShipSpawns(float dt); void advancePlayerCommands(float dt); void advancePlayerMissiles(float dt); // try to spawn a ship for this player. // return true on success, false on failure to find a spot. bool spawnShipForPlayer(Player *player); // find some place where nothing is placed nearby (ships/planets). // usefule for spanwing things bool findFreePositionWithRadius(float r, glm::vec2 &pos); float m_maxMissileDistance; float m_playerRespawnTime; float m_shipRadius; float m_defaultEnergy; int m_nextId=0; }; };