载入中...
搜索中...
未找到
Building.cpp
浏览该文件的文档.
1#include "building/Building.h"
4
5#include <simplesquirrel/simplesquirrel.hpp>
6
7namespace eve::building {
8
10
11int Building::registerBuildingsFromJson(const std::string &json) {
13 return BuildingRegistry::loadFromJson(json, nullptr);
14}
15
17
19
20bool Building::hasBuildingDefinition(const std::string &buildingId) {
21 return BuildingRegistry::find(buildingId) != nullptr;
22}
23
24std::string Building::getBuildingDisplayName(const std::string &buildingId) {
25 const auto *def = BuildingRegistry::find(buildingId);
26 return def ? def->displayName : std::string{};
27}
28
29std::string Building::getBuildingCategory(const std::string &buildingId) {
30 const auto *def = BuildingRegistry::find(buildingId);
31 return def ? def->category : std::string{};
32}
33
34int Building::getBuildingFootprintW(const std::string &buildingId) {
35 const auto *def = BuildingRegistry::find(buildingId);
36 return def ? def->footprintW : 0;
37}
38
39int Building::getBuildingFootprintH(const std::string &buildingId) {
40 const auto *def = BuildingRegistry::find(buildingId);
41 return def ? def->footprintH : 0;
42}
43
44std::string Building::getBuildingSnapMode(const std::string &buildingId) {
45 const auto *def = BuildingRegistry::find(buildingId);
46 return def ? def->snapMode : std::string{};
47}
48
49std::string Building::getBuildingRotationMode(const std::string &buildingId) {
50 const auto *def = BuildingRegistry::find(buildingId);
51 return def ? def->rotationMode : std::string{};
52}
53
54std::string Building::getBuildingValidateRule(const std::string &buildingId) {
55 const auto *def = BuildingRegistry::find(buildingId);
56 return def ? def->validateRule : std::string{};
57}
58
59std::string Building::getBuildingChannel(const std::string &buildingId) {
60 const auto *def = BuildingRegistry::find(buildingId);
61 return def ? def->channel : std::string{};
62}
63
64std::string Building::getBuildingRenderMode(const std::string &buildingId) {
65 const auto *def = BuildingRegistry::find(buildingId);
66 return def ? def->renderMode : std::string{};
67}
68
69std::string Building::getBuildingVisual2d(const std::string &buildingId, const std::string &key,
70 const std::string &fallback) {
71 const auto *def = BuildingRegistry::find(buildingId);
72 return def ? def->getVisual2d(key, fallback) : fallback;
73}
74
75std::string Building::getBuildingVisual3d(const std::string &buildingId, const std::string &key,
76 const std::string &fallback) {
77 const auto *def = BuildingRegistry::find(buildingId);
78 return def ? def->getVisual3d(key, fallback) : fallback;
79}
80
81bool Building::buildingHasTag(const std::string &buildingId, const std::string &tag) {
82 const auto *def = BuildingRegistry::find(buildingId);
83 return def ? def->hasTag(tag) : false;
84}
85
86std::string Building::getBuildingExtra(const std::string &buildingId, const std::string &key,
87 const std::string &fallback) {
88 const auto *def = BuildingRegistry::find(buildingId);
89 return def ? def->getExtra(key, fallback) : fallback;
90}
91
92int Building::getBuildingCost(const std::string &buildingId, const std::string &resource) {
93 const auto *def = BuildingRegistry::find(buildingId);
94 return def ? def->getCost(resource, 0) : 0;
95}
96
97PlacementWorld *Building::newWorld(int width, int height, float cellSize) {
99 return new PlacementWorld(width, height, cellSize);
100}
101
106
111
112bool Building::hasValidateRule(const std::string &name) {
114}
115
116bool Building::hasSnapRule(const std::string &name) {
118}
119
120bool Building::hasSurface(const std::string &name) {
122}
123
125 return int(PlacementSystem::surfaceNames().size());
126}
127
128std::string Building::getSurfaceName(int index) {
129 const auto names = PlacementSystem::surfaceNames();
130 if (index < 0 || index >= int(names.size())) return {};
131 return names[size_t(index)];
132}
133
135
137
139
140int Building::getChangeEventCount() const { return int(PlacementSystem::events().size()); }
141
142std::string Building::getChangeEventAction(int index) const {
143 const auto &evs = PlacementSystem::events();
144 if (index < 0 || size_t(index) >= evs.size()) return {};
145 return evs[size_t(index)].action;
146}
147
148std::string Building::getChangeEventWorldId(int index) const {
149 const auto &evs = PlacementSystem::events();
150 if (index < 0 || size_t(index) >= evs.size()) return {};
151 return evs[size_t(index)].worldId;
152}
153
154std::string Building::getChangeEventBuildingId(int index) const {
155 const auto &evs = PlacementSystem::events();
156 if (index < 0 || size_t(index) >= evs.size()) return {};
157 return evs[size_t(index)].buildingId;
158}
159
161 const auto &evs = PlacementSystem::events();
162 if (index < 0 || size_t(index) >= evs.size()) return 0;
163 return evs[size_t(index)].instanceId;
164}
165
166int Building::getChangeEventCellX(int index) const {
167 const auto &evs = PlacementSystem::events();
168 if (index < 0 || size_t(index) >= evs.size()) return -1;
169 return evs[size_t(index)].cellX;
170}
171
172int Building::getChangeEventCellY(int index) const {
173 const auto &evs = PlacementSystem::events();
174 if (index < 0 || size_t(index) >= evs.size()) return -1;
175 return evs[size_t(index)].cellY;
176}
177
179 const auto &evs = PlacementSystem::events();
180 if (index < 0 || size_t(index) >= evs.size()) return -1;
181 return evs[size_t(index)].otherCellX;
182}
183
185 const auto &evs = PlacementSystem::events();
186 if (index < 0 || size_t(index) >= evs.size()) return -1;
187 return evs[size_t(index)].otherCellY;
188}
189
190float Building::getChangeEventRotation(int index) const {
191 const auto &evs = PlacementSystem::events();
192 if (index < 0 || size_t(index) >= evs.size()) return 0.f;
193 return evs[size_t(index)].rotationDeg;
194}
195
196void Building::expose(ssq::Table &table) {
197 auto cls = table.addClass(name, Building::create, false);
198 expose(cls);
199
200 auto world = table.addClass<PlacementWorld>(
201 "PlacementWorld",
202 std::function<PlacementWorld *(int, int, float)>(
203 [](int w, int h, float cs) -> PlacementWorld * {
204 return new PlacementWorld(w, h, cs);
205 }),
206 true);
207 world.addFunc("destroy", &PlacementWorld::destroy);
208 world.addFunc("getId", &PlacementWorld::getId);
209 world.addFunc("setId", &PlacementWorld::setId);
210 world.addFunc("getWidth", &PlacementWorld::getWidth);
211 world.addFunc("getHeight", &PlacementWorld::getHeight);
212 world.addFunc("getCellSize", &PlacementWorld::getCellSize);
213 world.addFunc("setCellSize", &PlacementWorld::setCellSize);
214 world.addFunc("getOriginX", &PlacementWorld::getOriginX);
215 world.addFunc("getOriginY", &PlacementWorld::getOriginY);
216 world.addFunc("setOrigin", &PlacementWorld::setOrigin);
217 world.addFunc("getSnapMode", &PlacementWorld::getSnapMode);
218 world.addFunc("setSnapMode", &PlacementWorld::setSnapMode);
219 world.addFunc("getValidateRule", &PlacementWorld::getValidateRule);
220 world.addFunc("setValidateRule", &PlacementWorld::setValidateRule);
221 world.addFunc("setGridLayout", &PlacementWorld::setGridLayout);
222 world.addFunc("getGridLayoutName", &PlacementWorld::getGridLayoutName);
223 world.addFunc("setGridPlane", &PlacementWorld::setGridPlane);
224 world.addFunc("getGridPlaneName", &PlacementWorld::getGridPlaneName);
225 world.addFunc("setCellGap", &PlacementWorld::setCellGap);
226 world.addFunc("setHexSideLength", &PlacementWorld::setHexSideLength);
227 world.addFunc("setStagger", &PlacementWorld::setStagger);
228 world.addFunc("setGridFromLayer", &PlacementWorld::setGridFromLayer);
229 world.addFunc("hasGridFromLayer", &PlacementWorld::hasGridFromLayer);
230 world.addFunc("setExtra", &PlacementWorld::setExtra);
231 world.addFunc("getExtra", &PlacementWorld::getExtra);
232 world.addFunc("worldToCellX", &PlacementWorld::worldToCellX);
233 world.addFunc("worldToCellY", &PlacementWorld::worldToCellY);
234 world.addFunc("cellToWorldX", &PlacementWorld::cellToWorldX);
235 world.addFunc("cellToWorldY", &PlacementWorld::cellToWorldY);
236 world.addFunc("cellToWorld3DX", &PlacementWorld::cellToWorld3DX);
237 world.addFunc("cellToWorld3DY", &PlacementWorld::cellToWorld3DY);
238 world.addFunc("cellToWorld3DZ", &PlacementWorld::cellToWorld3DZ);
239 world.addFunc("worldToCell3DX", &PlacementWorld::worldToCell3DX);
240 world.addFunc("worldToCell3DY", &PlacementWorld::worldToCell3DY);
241 world.addFunc("fillTerrain", &PlacementWorld::fillTerrain);
242 world.addFunc("setTerrain", &PlacementWorld::setTerrain);
243 world.addFunc("getTerrain", &PlacementWorld::getTerrain);
244 world.addFunc("inBounds", &PlacementWorld::inBounds);
245 world.addFunc("bindTileLayer", &PlacementWorld::bindTileLayer);
246 world.addFunc("getTileLayer", &PlacementWorld::getTileLayer);
247 world.addFunc("clearTileLayer", &PlacementWorld::clearTileLayer);
248 world.addFunc("setTerrainGidMapJson", &PlacementWorld::setTerrainGidMapJson);
249 world.addFunc("setTerrainGid", &PlacementWorld::setTerrainGid);
250 world.addFunc("clearTerrainGidMap", &PlacementWorld::clearTerrainGidMap);
251 world.addFunc("getOccupant", &PlacementWorld::getOccupant);
252 world.addFunc("getOccupantInChannel", &PlacementWorld::getOccupantInChannel);
253 world.addFunc("getAnyOccupant", &PlacementWorld::getAnyOccupant);
254 world.addFunc("isCellEmpty", &PlacementWorld::isCellEmpty);
255 world.addFunc("isCellEmptyInChannel", &PlacementWorld::isCellEmptyInChannel);
256 world.addFunc("getBuildingCount", &PlacementWorld::getBuildingCount);
257 world.addFunc("hasBuilding", &PlacementWorld::hasBuilding);
258 world.addFunc("getBuildingId", &PlacementWorld::getBuildingId);
259 world.addFunc("getBuildingCellX", &PlacementWorld::getBuildingCellX);
260 world.addFunc("getBuildingCellY", &PlacementWorld::getBuildingCellY);
261 world.addFunc("getBuildingWorldX", &PlacementWorld::getBuildingWorldX);
262 world.addFunc("getBuildingWorldY", &PlacementWorld::getBuildingWorldY);
263 world.addFunc("getBuildingWorldZ", &PlacementWorld::getBuildingWorldZ);
264 world.addFunc("getBuildingElevation", &PlacementWorld::getBuildingElevation);
265 world.addFunc("getBuildingChannel", &PlacementWorld::getBuildingChannel);
266 world.addFunc("getBuildingRotation", &PlacementWorld::getBuildingRotation);
267 world.addFunc("getBuildingProp", &PlacementWorld::getBuildingProp);
268 world.addFunc("setBuildingProp", &PlacementWorld::setBuildingProp);
269 world.addFunc("buildingHasTag", &PlacementWorld::buildingHasTag);
270 world.addFunc("getBuildingInstanceAt", &PlacementWorld::getBuildingInstanceAt);
271 world.addFunc("canPlace", &PlacementWorld::canPlace);
272 world.addFunc("canPlaceReason", &PlacementWorld::canPlaceReason);
273 world.addFunc("placeAt", &PlacementWorld::placeAt);
274 world.addFunc("placeAtWorld", &PlacementWorld::placeAtWorld);
275 world.addFunc("placeAtWorld3D", &PlacementWorld::placeAtWorld3D);
276 world.addFunc("placeGhost", &PlacementWorld::placeGhost);
277 world.addFunc("removeBuilding", &PlacementWorld::removeBuilding);
278 world.addFunc("moveBuilding", &PlacementWorld::moveBuilding);
279 world.addFunc("clearBuildings", &PlacementWorld::clearBuildings);
280
281 auto ghost = table.addClass<Ghost>(
282 "Ghost", std::function<Ghost *()>([]() -> Ghost * { return new Ghost(); }), true);
283 ghost.addFunc("destroy", &Ghost::destroy);
284 ghost.addFunc("getBuildingId", &Ghost::getBuildingId);
285 ghost.addFunc("setBuildingId", &Ghost::setBuildingId);
286 ghost.addFunc("getCellX", &Ghost::getCellX);
287 ghost.addFunc("getCellY", &Ghost::getCellY);
288 ghost.addFunc("setCell", &Ghost::setCell);
289 ghost.addFunc("getWorldX", &Ghost::getWorldX);
290 ghost.addFunc("getWorldY", &Ghost::getWorldY);
291 ghost.addFunc("setWorld", &Ghost::setWorld);
292 ghost.addFunc("getElevation", &Ghost::getElevation);
293 ghost.addFunc("setElevation", &Ghost::setElevation);
294 ghost.addFunc("getRotationDeg", &Ghost::getRotationDeg);
295 ghost.addFunc("setRotationDeg", &Ghost::setRotationDeg);
296 ghost.addFunc("rotateBy", &Ghost::rotateBy);
297 ghost.addFunc("isValid", &Ghost::isValid);
298 ghost.addFunc("getReason", &Ghost::getReason);
299 ghost.addFunc("setFromWorld", &Ghost::setFromWorld);
300 ghost.addFunc("setFromWorld3D", &Ghost::setFromWorld3D);
301 ghost.addFunc("setFromSurface", &Ghost::setFromSurface);
302 ghost.addFunc("validate", &Ghost::validate);
303
304 auto session = table.addClass<PlacementSession>(
305 "PlacementSession", std::function<PlacementSession *()>([]() -> PlacementSession * {
306 return new PlacementSession();
307 }),
308 true);
309 session.addFunc("destroy", &PlacementSession::destroy);
310 session.addFunc("startPlacement", &PlacementSession::startPlacement);
311 session.addFunc("stopPlacement", &PlacementSession::stopPlacement);
312 session.addFunc("isActive", &PlacementSession::isActive);
313 session.addFunc("getBuildingId", &PlacementSession::getBuildingId);
314 session.addFunc("getGhost", &PlacementSession::getGhost);
315 session.addFunc("setMode", &PlacementSession::setMode);
316 session.addFunc("getMode", &PlacementSession::getMode);
317 session.addFunc("setRotationDeg", &PlacementSession::setRotationDeg);
318 session.addFunc("rotateBy", &PlacementSession::rotateBy);
319 session.addFunc("getRotationDeg", &PlacementSession::getRotationDeg);
320 session.addFunc("updateFromWorld", &PlacementSession::updateFromWorld);
321 session.addFunc("updateFromWorld3D", &PlacementSession::updateFromWorld3D);
322 session.addFunc("updateFromSurface", &PlacementSession::updateFromSurface);
323 session.addFunc("isValid", &PlacementSession::isValid);
324 session.addFunc("getReason", &PlacementSession::getReason);
325 session.addFunc("execute", &PlacementSession::execute);
326}
327
328void Building::expose(ssq::Class &cls) {
329 cls.addFunc("registerBuildingsFromJson", &Building::registerBuildingsFromJson);
330 cls.addFunc("clearBuildingDefinitions", &Building::clearBuildingDefinitions);
331 cls.addFunc("getBuildingDefinitionCount", &Building::getBuildingDefinitionCount);
332 cls.addFunc("hasBuildingDefinition", &Building::hasBuildingDefinition);
333 cls.addFunc("getBuildingDisplayName", &Building::getBuildingDisplayName);
334 cls.addFunc("getBuildingCategory", &Building::getBuildingCategory);
335 cls.addFunc("getBuildingFootprintW", &Building::getBuildingFootprintW);
336 cls.addFunc("getBuildingFootprintH", &Building::getBuildingFootprintH);
337 cls.addFunc("getBuildingSnapMode", &Building::getBuildingSnapMode);
338 cls.addFunc("getBuildingRotationMode", &Building::getBuildingRotationMode);
339 cls.addFunc("getBuildingValidateRule", &Building::getBuildingValidateRule);
340 cls.addFunc("getBuildingChannel", &Building::getBuildingChannel);
341 cls.addFunc("getBuildingRenderMode", &Building::getBuildingRenderMode);
342 cls.addFunc("getBuildingVisual2d", &Building::getBuildingVisual2d);
343 cls.addFunc("getBuildingVisual3d", &Building::getBuildingVisual3d);
344 cls.addFunc("buildingHasTag", &Building::buildingHasTag);
345 cls.addFunc("getBuildingExtra", &Building::getBuildingExtra);
346 cls.addFunc("getBuildingCost", &Building::getBuildingCost);
347 cls.addFunc("newWorld", &Building::newWorld);
348 cls.addFunc("newGhost", &Building::newGhost);
349 cls.addFunc("newSession", &Building::newSession);
350 cls.addFunc("hasValidateRule", &Building::hasValidateRule);
351 cls.addFunc("hasSnapRule", &Building::hasSnapRule);
352 cls.addFunc("hasSurface", &Building::hasSurface);
353 cls.addFunc("getSurfaceCount", &Building::getSurfaceCount);
354 cls.addFunc("getSurfaceName", &Building::getSurfaceName);
355 cls.addFunc("setPlaneSurfaceHeight", &Building::setPlaneSurfaceHeight);
356 cls.addFunc("getPlaneSurfaceHeight", &Building::getPlaneSurfaceHeight);
357 cls.addFunc("clearChangeEvents", &Building::clearChangeEvents);
358 cls.addFunc("getChangeEventCount", &Building::getChangeEventCount);
359 cls.addFunc("getChangeEventAction", &Building::getChangeEventAction);
360 cls.addFunc("getChangeEventWorldId", &Building::getChangeEventWorldId);
361 cls.addFunc("getChangeEventBuildingId", &Building::getChangeEventBuildingId);
362 cls.addFunc("getChangeEventInstanceId", &Building::getChangeEventInstanceId);
363 cls.addFunc("getChangeEventCellX", &Building::getChangeEventCellX);
364 cls.addFunc("getChangeEventCellY", &Building::getChangeEventCellY);
365 cls.addFunc("getChangeEventOtherCellX", &Building::getChangeEventOtherCellX);
366 cls.addFunc("getChangeEventOtherCellY", &Building::getChangeEventOtherCellY);
367 cls.addFunc("getChangeEventRotation", &Building::getChangeEventRotation);
368}
369
370} // namespace eve::building
HSQOBJECT cls
Definition ECS.cpp:21
float height
Definition Grass.cpp:235
int h
int w
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:24
int width
const char * name
Definition RockMesh.cpp:21
static int loadFromJson(const std::string &json, std::string *error=nullptr)
从 JSON 数组或单对象批量注册,返回成功数量。 元素形如: { "id": "house.wood", "displayName": "木屋", "category": "housing",...
static const BuildingDefinition * find(const std::string &id)
建筑放置模块(eve.Building)。
Definition Building.h:18
std::string getBuildingRotationMode(const std::string &buildingId)
Definition Building.cpp:49
int registerBuildingsFromJson(const std::string &json)
从 JSON 注册建筑模板;返回成功注册数量。
Definition Building.cpp:11
bool hasSnapRule(const std::string &name)
Definition Building.cpp:116
int getChangeEventInstanceId(int index) const
Definition Building.cpp:160
std::string getBuildingDisplayName(const std::string &buildingId)
Definition Building.cpp:24
void setPlaneSurfaceHeight(float h)
Definition Building.cpp:134
std::string getChangeEventBuildingId(int index) const
Definition Building.cpp:154
std::string getBuildingVisual3d(const std::string &buildingId, const std::string &key, const std::string &fallback={})
Definition Building.cpp:75
bool hasValidateRule(const std::string &name)
扩展规则是否存在(校验/吸附)。
Definition Building.cpp:112
float getChangeEventRotation(int index) const
Definition Building.cpp:190
int getBuildingFootprintW(const std::string &buildingId)
Definition Building.cpp:34
void clearBuildingDefinitions()
清空全部建筑模板。
Definition Building.cpp:16
std::string getBuildingSnapMode(const std::string &buildingId)
Definition Building.cpp:44
std::string getBuildingExtra(const std::string &buildingId, const std::string &key, const std::string &fallback={})
Definition Building.cpp:86
bool buildingHasTag(const std::string &buildingId, const std::string &tag)
Definition Building.cpp:81
int getChangeEventCellY(int index) const
Definition Building.cpp:172
int getBuildingCost(const std::string &buildingId, const std::string &resource)
Definition Building.cpp:92
std::string getBuildingCategory(const std::string &buildingId)
Definition Building.cpp:29
std::string getBuildingChannel(const std::string &buildingId)
Definition Building.cpp:59
PlacementSession * newSession()
Definition Building.cpp:107
std::string getChangeEventAction(int index) const
Definition Building.cpp:142
int getChangeEventCellX(int index) const
Definition Building.cpp:166
std::string getChangeEventWorldId(int index) const
Definition Building.cpp:148
int getBuildingFootprintH(const std::string &buildingId)
Definition Building.cpp:39
std::string getBuildingVisual2d(const std::string &buildingId, const std::string &key, const std::string &fallback={})
Definition Building.cpp:69
void clearChangeEvents()
变更事件队列(放置/移除/移动)。
Definition Building.cpp:138
std::string getBuildingRenderMode(const std::string &buildingId)
Definition Building.cpp:64
int getChangeEventOtherCellY(int index) const
Definition Building.cpp:184
std::string getSurfaceName(int index)
Definition Building.cpp:128
int getChangeEventCount() const
Definition Building.cpp:140
bool hasSurface(const std::string &name)
Definition Building.cpp:120
std::string getBuildingValidateRule(const std::string &buildingId)
Definition Building.cpp:54
bool hasBuildingDefinition(const std::string &buildingId)
建筑模板查询(显示名/类别/占地/规则/标签/额外属性/成本)。
Definition Building.cpp:20
int getBuildingDefinitionCount()
已注册建筑模板数量。
Definition Building.cpp:18
int getChangeEventOtherCellX(int index) const
Definition Building.cpp:178
PlacementWorld * newWorld(int width, int height, float cellSize=32.f)
工厂:创建放置世界 / 鬼影。
Definition Building.cpp:97
float getElevation() const
Definition Ghost.h:30
int getCellY() const
Definition Ghost.h:24
float getWorldY() const
Definition Ghost.h:28
void setFromWorld(PlacementWorld *world, float worldX, float worldY)
按世界吸附模式,从世界坐标刷新格子与世界位姿。
Definition Ghost.cpp:45
void setRotationDeg(float deg)
Definition Ghost.cpp:35
int getCellX() const
Definition Ghost.h:23
void setElevation(float elevation)
Definition Ghost.cpp:29
bool validate(PlacementWorld *world)
对当前姿态做校验,写入 valid_/reason_。
Definition Ghost.cpp:80
void setFromWorld3D(PlacementWorld *world, float worldX, float worldY, float worldZ)
Definition Ghost.cpp:57
std::string getReason() const
Definition Ghost.h:38
bool isValid() const
Definition Ghost.h:37
float getWorldX() const
Definition Ghost.h:27
float getRotationDeg() const
Definition Ghost.h:33
std::string getBuildingId() const
Definition Ghost.h:20
void setWorld(float worldX, float worldY)
Definition Ghost.cpp:22
void rotateBy(float deltaDeg)
Definition Ghost.cpp:41
void setCell(int cellX, int cellY)
Definition Ghost.cpp:15
void setFromSurface(PlacementWorld *world, const std::string &surface, float x, float y)
Definition Ghost.cpp:69
void setBuildingId(const std::string &id)
Definition Ghost.cpp:9
void setMode(const std::string &mode)
bool startPlacement(PlacementWorld *world, const std::string &buildingId)
bool updateFromWorld3D(PlacementWorld *world, float worldX, float worldY, float worldZ)
bool updateFromWorld(PlacementWorld *world, float worldX, float worldY)
bool updateFromSurface(PlacementWorld *world, const std::string &surface, float x, float y)
static std::vector< std::string > surfaceNames()
static const std::vector< BuildingChangeEvent > & events()
static void setPlaneSurfaceHeight(float h)
static void ensureBuiltins()
确保内置规则已注册(模块首次使用时自动调用)。
static bool hasSurface(const std::string &name)
static bool hasSnapRule(const std::string &name)
static bool hasValidateRule(const std::string &name)
格子型建筑放置世界(脚本可直接操作)。
std::string canPlaceReason(const std::string &buildingId, int cellX, int cellY, float rotationDeg=0.f)
bool inBounds(int cellX, int cellY) const
int worldToCellX(float worldX) const
世界像素 ↔ 格子坐标。
void destroy()
释放资源并使其失效。
int getTerrain(int cellX, int cellY) const
std::string getBuildingProp(int instanceId, const std::string &key, const std::string &fallback={}) const
int getWidth() const
尺寸 / 格子大小 / 原点。
float getBuildingWorldY(int instanceId) const
int getBuildingCellY(int instanceId) const
void setGridFromLayer(map::TileLayer *layer)
float getBuildingWorldX(int instanceId) const
bool moveBuilding(int instanceId, int cellX, int cellY, float rotationDeg=-1.f)
void setValidateRule(const std::string &rule)
std::string getGridLayoutName() const
float getBuildingElevation(int instanceId) const
int getOccupant(int cellX, int cellY) const
占用查询:格子上建筑实例 / 是否为空。
bool isCellEmptyInChannel(const std::string &channel, int cellX, int cellY) const
已放置建筑实例查询。
bool hasBuilding(int instanceId) const
void setOrigin(float x, float y)
int getBuildingInstanceAt(int index) const
按插入顺序取实例 id。
int getBuildingCellX(int instanceId) const
float cellToWorld3DX(int cellX, int cellY, float elevation) const
bool buildingHasTag(int instanceId, const std::string &tag) const
std::string getSnapMode() const
放置策略:吸附模式 / 校验规则。
int placeAt(const std::string &buildingId, int cellX, int cellY, float rotationDeg=0.f)
std::string getId() const
世界 id(用于变更事件定位)。
void setGridLayout(const std::string &layout)
std::string getValidateRule() const
void setExtra(const std::string &key, const std::string &value)
世界级额外属性(键值)。
void setCellGap(float gapX, float gapY)
bool isCellEmpty(int cellX, int cellY) const
map::TileLayer * getTileLayer() const
void setTerrain(int cellX, int cellY, int semantic)
void setTerrainGid(int gid, int semantic)
bool removeBuilding(int instanceId)
float getBuildingRotation(int instanceId) const
int worldToCell3DX(float worldX, float worldY, float worldZ) const
float cellToWorldX(int cellX) const
int placeAtWorld3D(const std::string &buildingId, float worldX, float worldY, float worldZ, float rotationDeg=0.f)
std::string getGridPlaneName() const
bool canPlace(const std::string &buildingId, int cellX, int cellY, float rotationDeg=0.f)
便捷操作(转发 PlacementSystem):放置 / 移除 / 移动。
float cellToWorldY(int cellY) const
void setId(const std::string &id)
int worldToCellY(float worldY) const
void setBuildingProp(int instanceId, const std::string &key, const std::string &value)
std::string getBuildingId(int instanceId) const
void setGridPlane(const std::string &plane)
void setSnapMode(const std::string &mode)
void bindTileLayer(map::TileLayer *layer)
std::string getExtra(const std::string &key, const std::string &fallback={}) const
int worldToCell3DY(float worldX, float worldY, float worldZ) const
void setStagger(const std::string &axis, const std::string &index)
int placeAtWorld(const std::string &buildingId, float worldX, float worldY, float rotationDeg=0.f)
int getAnyOccupant(int cellX, int cellY) const
float cellToWorld3DY(int cellX, int cellY, float elevation) const
std::string getBuildingChannel(int instanceId) const
void setTerrainGidMapJson(const std::string &json)
float getBuildingWorldZ(int instanceId) const
int getOccupantInChannel(const std::string &channel, int cellX, int cellY) const
float cellToWorld3DZ(int cellX, int cellY, float elevation) const
void fillTerrain(int semantic)
地形语义(占用检查用)。
建筑放置模块入口:定义 / 放置世界 / 鬼影 / 变更事件的脚本绑定点。 设计文档:docs/dev/建筑放置系统设计.md
Definition Building.cpp:7