#ifndef SERVER_H #define SERVER_H #include "sceneholder.h" #include "actor.h" #include "pacman.pb.h" #include #include extern "C" { #include "enet/enet.h" } class QTcpSocket; class Server : public SceneHolder { Q_OBJECT public: Server(QWidget *parent = 0); ~Server(); bool parseCommandline(); bool run(); protected slots: void tick(); /* receive updates of client */ void keyPressUpdate(); void keyPressUpdate(ENetEvent *event); protected: /* block until we have connections from all clients */ bool waitForClientConnections(); /* calculate updates of current tick for sending to client */ Transmission::map_t calculateUpdates(); /* update client maps */ void sendUpdate(Transmission::map_t map, bool firstPacket = false); QPoint addRandomPoint(Transmission::map_t map, Transmission::field_t type = Transmission::bonuspoint); void colorizeBlocks(Transmission::map_t map); void botCalculate(Actor *actor); void initRoundMap(); protected slots: /* called when a round is started/finished */ void startGame(); void stopGame(bool delay = false); void setFinishRound(); protected: ENetHost *m_host; QMap m_clientConnections; QList m_bots; /* current movements. required to make pacmans continue their movement */ QMap m_actorMovements; /* allocate as member variable as this packet is large and used often */ ProtoBuf::MapUpdate m_updatepacket; /* list of blocks */ QList m_blocks; /* currently colored blocks + tickcount before they will turn to non-colored back */ QMap m_coloredBlocks; QHostAddress m_bindaddress; unsigned int m_port; unsigned int m_maxplayers; unsigned int m_numbots; /* number of rounds (>= 1) */ unsigned int m_rounds; /* current round, starting at 0 */ unsigned int m_curRound; bool m_running; bool m_finishRound; QTimer *m_tickTimer; }; #endif // SERVER_H