]> git.localhorst.tv Git - space.git/blob - src/world/Universe.h
added universe environmental resources
[space.git] / src / world / Universe.h
1 #ifndef SPACE_UNIVERSE_H_
2 #define SPACE_UNIVERSE_H_
3
4 #include "Resource.h"
5 #include "../entity/Ship.h"
6 #include "../graphics/Vector.h"
7
8 #include <list>
9 #include <map>
10 #include <vector>
11
12
13 namespace space {
14
15 class Universe {
16
17 public:
18         Universe(Vector<int> size, Vector<int> secSize, Vector<int> areaSize);
19         ~Universe();
20
21         Universe(const Universe &) = delete;
22         Universe &operator =(const Universe &) = delete;
23
24 public:
25         const Vector<int> size;
26         const Vector<int> secSize;
27         const Vector<int> areaSize;
28         const Vector<int> bounds;
29
30 public:
31         using Env = std::map<int, float>;
32
33         class Area;
34
35         class Sector {
36
37         public:
38                 Sector(const Universe &univ, Vector<int> coords)
39                 : univ(univ), coords(coords) { }
40
41         public:
42                 Vector<int> SectorCoords() const { return coords; }
43                 Vector<int> AreaCoords() const { return univ.areaSize * coords; }
44
45                 Area AreaAt(Vector<int> ac) const { return univ.AreaAt(AreaCoords() + ac); }
46
47         private:
48                 const Universe &univ;
49                 Vector<int> coords;
50
51         };
52
53         class Area {
54
55         public:
56                 Area(const Universe &univ, Vector<int> coords)
57                 : univ(univ), coords(coords) { }
58
59         public:
60                 Vector<int> SectorCoords() const { return coords / univ.areaSize; }
61                 Vector<int> AreaCoords() const { return coords; }
62
63                 Sector ParentSector() const { return univ.SectorAt(SectorCoords()); }
64                 const Env &GetEnv() const { return univ.EnvAt(coords); }
65
66         private:
67                 const Universe &univ;
68                 Vector<int> coords;
69
70         };
71
72 public:
73         Sector SectorAt(Vector<int> coords) const { return Sector(*this, coords); }
74         Area AreaAt(Vector<int> coords) const { return Area(*this, coords); }
75         const Env &EnvAt(Vector<int> coords) const { return env[coords.x * bounds.y + coords.y]; }
76
77 public:
78         Ship *AddShip(const Ship &);
79         const std::list<Ship> &Ships() const { return ships; }
80
81         int AddResource(const Resource &);
82         const Resource &GetResource(int id) const { return resources[id]; }
83
84         void DumpEnv(int res, Vector<int> coords, float amount);
85         void DumpEnv(int res, Vector<float> coords, float amount) {
86                 DumpEnv(res, Vector<int>(coords), amount);
87         }
88
89 public:
90         void Update(float deltaT);
91
92 private:
93         std::list<Ship> ships;
94         std::vector<Resource> resources;
95         std::vector<Env> env;
96
97 };
98
99 }
100
101 #endif