int main(int argc, char *argv[]) { SunState state; initialiseState(&state, 51.509865, -0.118092); calculateSunriseOn(&state, date(2000, 2, 1)); calculateSunsetOn(&state, date(2099, 2, 1)); return 0; }
void runGame(PlayerSet& players, ControlData& control, const GameState& gameState, const Map& map, const SimulationParameters& params, GameStats& gameStats, zmq::socket_t& stateSocket, const json& settings, InfoLogger& logger) { uint targetFPS = settings["simulation"]["targetFPS"]; uint totalGameTimeSeconds = settings["gameTime"]; uint integrationSteps = uint(1. / float(targetFPS) / params.timeStep); // Make sure the per-game stats are cleared gameStats.playerRanks.clear(); gameStats.playerDists.clear(); uint nShips = players.fromId.size(); uint targetMicroseconds = 1000000 / targetFPS; StateMatrix state(nShips, STATE_LENGTH); initialiseState(state, map, params); ControlMatrix inputs = control.inputs; bool running = true; unsigned int fpscounter = 0; auto gameStart = hrclock::now(); logger("game", "status", {{"state","running"},{"map",map.name}, {"game",gameState.name}}); while (running && !interruptedBySignal) { auto frameStart = hrclock::now(); // Threadsafe copy of control inputs (unlock managed by scope) { std::lock_guard<std::mutex> lock(control.mutex); inputs = control.inputs; } for (uint i=0; i<integrationSteps;i++) rk4TimeStep(state, inputs, params, map); // Calculate game stats every second fpscounter++; if (fpscounter >= targetFPS) { fpscounter = 0; playerScore(state, control, map, params, gameStats); logger("game", "status", {{"state","running"},{"map",map.name}, {"game",gameState.name}, {"ranking", gameStats.playerRanks}}); } //check we don't need to end the game bool timeout = hasRoughIntervalPassed(gameStart, totalGameTimeSeconds, targetFPS); bool raceWon = winner(players, state,control, map, params) != ""; running = (!timeout) && (!raceWon); // get control inputs from control thread broadcastState(players, state, gameState, control, params, stateSocket); // make sure we target a particular frame rate waitPreciseInterval(frameStart, targetMicroseconds); } // Game over, so tell the clients playerScore(state, control, map, params, gameStats); // get final score updateRanks(players, control,map, gameStats); logger("game", "status", {{"state","finished"},{"map",map.name}, {"game",gameState.name}, {"ranking", gameStats.playerRanks}, {"totalScore", gameStats.totalPlayerScore}, {"teamScore", gameStats.totalTeamScore}}); send(stateSocket, {gameState.name,"{\"state\":\"finished\"}"}); }