1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
#pragma once
#include "StarDungeonGenerator.hpp"
#include "StarFallingBlocksAgent.hpp"
#include "StarSpawner.hpp"
#include "StarWorldStorage.hpp"
#include "StarMicroDungeon.hpp"
#include "StarCellularLiquid.hpp"
#include "StarBiomePlacement.hpp"
namespace Star {
STAR_CLASS(WorldServer);
STAR_CLASS(FallingBlocksWorld);
STAR_CLASS(DungeonGeneratorWorld);
STAR_CLASS(SpawnerWorld);
STAR_CLASS(WorldGenerator);
STAR_CLASS(Plant);
STAR_CLASS(LiquidsDatabase);
class LiquidWorld : public CellularLiquidWorld<LiquidId> {
public:
LiquidWorld(WorldServer* world);
Vec2I uniqueLocation(Vec2I const& location) const override;
CellularLiquidCell<LiquidId> cell(Vec2I const& location) const override;
float drainLevel(Vec2I const& location) const override;
void setFlow(Vec2I const& location, CellularLiquidFlowCell<LiquidId> const& flow) override;
void liquidInteraction(Vec2I const& a, LiquidId aLiquid, Vec2I const& b, LiquidId bLiquid) override;
void liquidCollision(Vec2I const& pos, LiquidId liquid, Vec2I const& blockPos) override;
private:
WorldServer* m_worldServer;
LiquidsDatabaseConstPtr m_liquidsDatabase;
MaterialDatabaseConstPtr m_materialDatabase;
};
class FallingBlocksWorld : public FallingBlocksFacade {
public:
FallingBlocksWorld(WorldServer* world);
FallingBlockType blockType(Vec2I const& pos) override;
void moveBlock(Vec2I const& from, Vec2I const& to) override;
private:
WorldServer* m_worldServer;
MaterialDatabaseConstPtr m_materialDatabase;
};
class DungeonGeneratorWorld : public DungeonGeneratorWorldFacade {
public:
DungeonGeneratorWorld(WorldServer* worldServer, bool markForActivation);
void markRegion(RectI const& region) override;
void markTerrain(PolyF const& region) override;
void markSpace(PolyF const& region) override;
void setForegroundMaterial(Vec2I const& position, MaterialId material, MaterialHue hueshift, MaterialColorVariant colorVariant) override;
void setBackgroundMaterial(Vec2I const& position, MaterialId material, MaterialHue hueshift, MaterialColorVariant colorVariant) override;
void setForegroundMod(Vec2I const& position, ModId mod, MaterialHue hueshift) override;
void setBackgroundMod(Vec2I const& position, ModId mod, MaterialHue hueshift) override;
void placeObject(
Vec2I const& pos, String const& objectName, Star::Direction direction, Json const& parameters) override;
void placeVehicle(Vec2F const& pos, String const& vehicleName, Json const& parameters) override;
void placeSurfaceBiomeItems(Vec2I const& pos) override;
void placeBiomeTree(Vec2I const& pos) override;
void addDrop(Vec2F const& position, ItemDescriptor const& item) override;
void spawnNpc(Vec2F const& position, Json const& parameters) override;
void spawnStagehand(Vec2F const& position, Json const& definition) override;
void setLiquid(Vec2I const& pos, LiquidStore const& liquid) override;
void setPlayerStart(Vec2F const& startPosition) override;
void connectWireGroup(List<Vec2I> const& wireGroup) override;
void setTileProtection(DungeonId dungeonId, bool isProtected) override;
bool checkSolid(Vec2I const& position, TileLayer layer) override;
bool checkOpen(Vec2I const& position, TileLayer open) override;
bool checkOceanLiquid(Vec2I const& position) override;
DungeonId getDungeonIdAt(Vec2I const& position) override;
void setDungeonIdAt(Vec2I const& position, DungeonId dungeonId) override;
void clearTileEntities(RectI const& bounds, Set<Vec2I> const& positions, bool clearAnchoredObjects) override;
WorldGeometry getWorldGeometry() const override;
private:
void placePlant(PlantPtr const& plant, Vec2I const& position);
void placeBiomeItems(Vec2I const& pos, List<BiomeItemPlacement>& potentialItems);
WorldServer* m_worldServer;
bool m_markForActivation;
};
class SpawnerWorld : public SpawnerFacade {
public:
SpawnerWorld(WorldServer* worldServer);
WorldGeometry geometry() const override;
List<RectF> clientWindows() const override;
bool signalRegion(RectF const& region) const override;
CollisionKind collision(Vec2I const& position) const override;
bool isFreeSpace(RectF const& area) const override;
bool isBackgroundEmpty(Vec2I const& position) const override;
LiquidLevel liquidLevel(Vec2I const& position) const override;
bool spawningProhibited(RectF const& area) const override;
uint64_t spawnSeed() const override;
SpawnProfile spawnProfile(Vec2F const& position) const override;
float dayLevel() const override;
float threatLevel() const override;
EntityId spawnEntity(EntityPtr entity) const override;
void despawnEntity(EntityId entityId) override;
EntityPtr getEntity(EntityId entityId) const override;
private:
WorldServer* m_worldServer;
};
class WorldGenerator : public WorldGeneratorFacade {
public:
WorldGenerator(WorldServer* server);
void generateSectorLevel(WorldStorage* worldStorage, Sector const& sector, SectorGenerationLevel generationLevel) override;
void sectorLoadLevelChanged(WorldStorage* worldStorage, Sector const& sector, SectorLoadLevel loadLevel) override;
void terraformSector(WorldStorage* worldStorage, Sector const& sector) override;
void initEntity(WorldStorage* worldStorage, EntityId entityId, EntityPtr const& entity) override;
void destructEntity(WorldStorage* worldStorage, EntityPtr const& entity) override;
bool entityKeepAlive(WorldStorage* worldStorage, EntityPtr const& entity) const override;
bool entityPersistent(WorldStorage* worldStorage, EntityPtr const& entity) const override;
RpcPromise<Vec2I> enqueuePlacement(List<BiomeItemDistribution> distributions, Maybe<DungeonId> id) override;
void replaceBiomeBlocks(ServerTile* tile);
private:
struct QueuedPlacement {
List<BiomeItemDistribution> distributions;
Maybe<DungeonId> dungeonId;
RpcPromiseKeeper<Vec2I> promise;
bool fulfilled;
};
void prepareTiles(WorldStorage* worldStorage, Sector const& sector);
void generateMicroDungeons(WorldStorage* worldStorage, Sector const& sector);
void generateCaveLiquid(WorldStorage* worldStorage, Sector const& sector);
void prepareSector(WorldStorage* worldStorage, Sector const& sector);
void prepareSectorBiomeBlocks(WorldStorage* worldStorage, Sector const& sector);
void placeBiomeGrass(WorldStorage* worldStorage, ServerTile* tile, Vec2I const& position);
void reapplyBiome(WorldStorage* worldStorage, Sector const& sector);
Set<Vec2I> caveLiquidSeeds(WorldStorage* worldStorage, Sector const& sector);
Map<Vec2I, float> determineLiquidLevel(Set<Vec2I> const& spots, Set<Vec2I> const& filled);
void levelCluster(Set<Vec2I>& cluster, Set<Vec2I> const& filled, Map<Vec2I, float>& results);
// Special plant placement routine that does slight terrain adjustments to
// fit plants.
bool placePlant(WorldStorage* worldStorage, PlantPtr const& plant, Vec2I const& position);
WorldServer* m_worldServer;
MicroDungeonFactoryPtr m_microDungeonFactory;
List<QueuedPlacement> m_queuedPlacements;
};
}
|