112 lines
2.5 KiB
C++
112 lines
2.5 KiB
C++
#pragma once
|
|
|
|
#include <atomic>
|
|
#include <memory>
|
|
#include <mutex>
|
|
#include <random>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "BalancingConfig.h"
|
|
#include "BeltSystem.h"
|
|
#include "EntityAdmin.h"
|
|
#include "BuildingId.h"
|
|
|
|
#include "entt/entity/entity.hpp"
|
|
#include "FireEvent.h"
|
|
#include "GameConfig.h"
|
|
#include "Tick.h"
|
|
|
|
class AiSystem;
|
|
class BuildingSystem;
|
|
class CombatSystem;
|
|
class DynamicBodySystem;
|
|
class MovementIntentSystem;
|
|
class ShipSystem;
|
|
class ScrapSystem;
|
|
|
|
struct ArenaStatus
|
|
{
|
|
struct Entry
|
|
{
|
|
std::string displayName;
|
|
int level;
|
|
int total;
|
|
int surviving;
|
|
};
|
|
|
|
struct TeamStatus
|
|
{
|
|
std::string name;
|
|
std::vector<Entry> entries; // HQ first, then ships, then stations
|
|
};
|
|
|
|
TeamStatus teams[2];
|
|
bool finished = false;
|
|
int winnerTeam = -1; // 0 or 1 when finished; -1 while running
|
|
};
|
|
|
|
class ArenaSimulation
|
|
{
|
|
public:
|
|
ArenaSimulation(const GameConfig& gameConfig,
|
|
ArenaConfig arenaConfig,
|
|
unsigned int seed = 0);
|
|
~ArenaSimulation();
|
|
|
|
void run();
|
|
void requestStop();
|
|
|
|
void tickOnce();
|
|
std::vector<FireEvent> drainFireEvents();
|
|
|
|
ArenaStatus status() const;
|
|
bool isFinished() const;
|
|
int winnerTeam() const;
|
|
Tick currentTick() const;
|
|
|
|
const ArenaConfig& arenaConfig() const;
|
|
const BuildingSystem& buildings() const;
|
|
const ShipSystem& ships() const;
|
|
const ScrapSystem& scraps() const;
|
|
EntityAdmin& admin();
|
|
const EntityAdmin& admin() const;
|
|
|
|
private:
|
|
BuildingId allocateBuildingId();
|
|
void placeStructures();
|
|
void spawnShips();
|
|
void tick();
|
|
void tickDeaths();
|
|
void updateStatus();
|
|
|
|
const GameConfig& m_gameConfig;
|
|
ArenaConfig m_arenaConfig;
|
|
std::mt19937 m_rng;
|
|
|
|
Tick m_currentTick;
|
|
BuildingId m_nextBuildingId;
|
|
|
|
EntityAdmin m_admin;
|
|
BeltSystem m_beltSystem;
|
|
std::unique_ptr<BuildingSystem> m_buildingSystem;
|
|
std::unique_ptr<ShipSystem> m_shipSystem;
|
|
std::unique_ptr<AiSystem> m_aiSystem;
|
|
std::unique_ptr<MovementIntentSystem> m_movementIntentSystem;
|
|
std::unique_ptr<DynamicBodySystem> m_dynamicBodySystem;
|
|
std::unique_ptr<CombatSystem> m_combatSystem;
|
|
std::unique_ptr<ScrapSystem> m_scrapSystem;
|
|
|
|
entt::entity m_team1HqEntity;
|
|
entt::entity m_team2HqEntity;
|
|
|
|
bool m_finished;
|
|
int m_winnerTeam;
|
|
std::atomic<bool> m_stopRequested;
|
|
|
|
std::vector<FireEvent> m_fireEvents;
|
|
|
|
mutable std::mutex m_statusMutex;
|
|
ArenaStatus m_status;
|
|
};
|