#ifndef SPACE_UNIVERSE_H_
#define SPACE_UNIVERSE_H_
-namespace space {
+#include "Resource.h"
+#include "../entity/Ship.h"
+#include "../graphics/Vector.h"
+
+#include <list>
+#include <map>
+#include <vector>
-class Sector;
+
+namespace space {
class Universe {
public:
- Universe(int w, int h, int sec_w, int sec_h, int numres);
+ Universe(Vector<int> size, Vector<int> secSize, Vector<int> areaSize);
~Universe();
-private:
- Universe(const Universe &);
- Universe &operator =(const Universe &);
+
+ Universe(const Universe &) = delete;
+ Universe &operator =(const Universe &) = delete;
+
+public:
+ const Vector<int> size;
+ const Vector<int> secSize;
+ const Vector<int> areaSize;
+ const Vector<int> bounds;
+
+public:
+ using Env = std::map<int, float>;
+
+ class Area;
+
+ class Sector {
+
+ public:
+ Sector(const Universe &univ, Vector<int> coords)
+ : univ(univ), coords(coords) { }
+
+ public:
+ Vector<int> SectorCoords() const { return coords; }
+ Vector<int> AreaCoords() const { return univ.areaSize * coords; }
+
+ Area AreaAt(Vector<int> ac) const { return univ.AreaAt(AreaCoords() + ac); }
+
+ private:
+ const Universe &univ;
+ Vector<int> coords;
+
+ };
+
+ class Area {
+
+ public:
+ Area(const Universe &univ, Vector<int> coords)
+ : univ(univ), coords(coords) { }
+
+ public:
+ Vector<int> SectorCoords() const { return coords / univ.areaSize; }
+ Vector<int> AreaCoords() const { return coords; }
+
+ Sector ParentSector() const { return univ.SectorAt(SectorCoords()); }
+ const Env &GetEnv() const { return univ.EnvAt(coords); }
+
+ private:
+ const Universe &univ;
+ Vector<int> coords;
+
+ };
+
+public:
+ Sector SectorAt(Vector<int> coords) const { return Sector(*this, coords); }
+ Area AreaAt(Vector<int> coords) const { return Area(*this, coords); }
+ const Env &EnvAt(Vector<int> coords) const { return env[coords.x * bounds.y + coords.y]; }
+
+public:
+ Ship *AddShip(const Ship &);
+ const std::list<Ship> &Ships() const { return ships; }
+
+ int AddResource(const Resource &);
+ const Resource &GetResource(int id) const { return resources[id]; }
+
+ void DumpEnv(int res, Vector<int> coords, float amount);
+ void DumpEnv(int res, Vector<float> coords, float amount) {
+ DumpEnv(res, Vector<int>(coords), amount);
+ }
+
+public:
+ void Update(float deltaT);
private:
- int w;
- int h;
- int numres;
- int total;
- Sector *sec_begin;
- Sector *sec_end;
+ std::list<Ship> ships;
+ std::vector<Resource> resources;
+ std::vector<Env> env;
};