Example #1
0
void Process::Run(Game& game) {
  // ZeroMQ context
  zmq::context_t zcontext(1);

  // Components
  Api api(zcontext, 5555);
  Notifier notifier(zcontext, 5556);
  Server server(zcontext, 5557);

  // TODO: Read workers from file
  // TODO: Initialize workers properly and distribute players
  // TODO: Use a worker vector
  Worker worker;

  // Game log
  Log log("match/log");

  World* world;

  if(utils::FileExists("match/world.txt")) {
    std::ifstream stream("match/world.txt");

    // Read existing world
    world = game.ReadWorld(stream);
  } else {
    // TODO: This should be API-driven
    // Generate a new world
    world = game.GenerateWorld();
    log.Clear();
  }

  // Print current world
  std::ostringstream stream;
  world->PrintStructure(stream);

  debug::Println("MASTER", "Current world:");
  debug::Print(stream.str());

  // Start servers
  std::thread api_thread(run_api, std::ref(api), std::ref(worker), std::ref(*world), std::ref(log));
  std::thread server_thread(run_server, std::ref(server), std::ref(worker), std::ref(game), std::ref(*world),
                            std::ref(notifier), std::ref(log));

  // Run players
  worker.Run();

  // Run game loop
  run_game_loop(*world, notifier, log);
}