Overhaul how building and ownership layers are handled at init

This commit is contained in:
2023-11-10 06:38:16 +01:00
parent 60e66bbd67
commit c8c857bdb9
3 changed files with 53 additions and 24 deletions

View File

@@ -44,41 +44,47 @@ bool handleGameObjects(BzTileObjectGroup *objectLayer, BzTileObject *objects, i3
return true;
}
bool prepareBuildingLayer(BzTileLayer *layer, BzTile *data, i32 dataCount) {
BzTileset *tileset = bzTileLayerGetTileset(&GAME.map, layer);
for (i32 i = 0; i < dataCount; i++) {
BzTile tile = bzTilesetGetTile(tileset, data[i]);
data[i] = getTileBuilding(tile);
}
return false;
}
ecs_entity_t *entityMap = NULL;
bool handleBuildLayer(BzTileLayer *layer, BzTile *data, i32 dataCount) {
bool prepareBuildings(BzTileLayer *layer, BzTile *data, i32 dataCount) {
ECS_COMPONENT(ECS, TilePosition);
ECS_COMPONENT(ECS, TileSize);
entityMap = bzCalloc(sizeof(*entityMap), layer->width * layer->height);
BzTileMap *map = &GAME.map;
BzTileLayer *ownershipLayer = bzTileMapGetLayer(map, LAYER_BUILDING_OWNER);
BzTile *ownData = ownershipLayer->data;
BzTileLayer *ownershipLayer = layer;
BzTileLayer *buildingLayer = bzTileMapGetLayer(map, LAYER_BUILDINGS);
BzTileset *buildingTileset = bzTileLayerGetTileset(map, buildingLayer);
BzTile *buildingData = buildingLayer->data;
for (i32 y = 0; y < layer->height; y++) {
for (i32 x = 0; x < layer->width; x++) {
BzTile *tile = data + y * layer->width + x;
BzTile *ownTile = ownData + y * layer->width + x;
if (*tile == BUILDINGS_NONE) continue;
BzTile ownerTile = data[y * layer->width + x];
BzTile buildingRawTile = buildingData[y * layer->width + x];
BzTile buildingTile = bzTilesetGetTile(buildingTileset, buildingRawTile);
buildingTile = getTileBuilding(buildingTile);
if (buildingTile == BUILDINGS_NONE || ownerTile == 0) continue;
// We have a building
TileSize size = {};
getBuildingSize(*tile, &size.w, &size.h);
getBuildingSize(buildingTile, &size.w, &size.h);
bzTileLayerSetTile(ownershipLayer, 0, x, y, size.w, size.h);
bzLogInfo("Got size: %2d %2d", size.w, size.h);
ecs_entity_t e = ecs_new_id(ECS);
ecs_set(ECS, e, TilePosition, {.x=x, .y=y});
ecs_set(ECS, e, TileSize, {.w=0, .h=0});
ecs_set(ECS, e, TileSize, {.w=size.w, .h=size.h});
bzTileMapUpdateCollider(&GAME.map, x, y);
for (i32 yIdx = y; yIdx < y + size.h; yIdx++) {
for (i32 xIdx = x; xIdx < x + size.w; xIdx++) {
entityMap[yIdx * layer->width + xIdx] = e;
}
}
//bzTileMapUpdateCollider(&GAME.map, x, y);
}
}
return false;
return true;
}
bool canBuildOn(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) {
@@ -97,6 +103,7 @@ bool canBuildOn(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) {
sizeY += 2;
BzTileLayer *buildLayer = bzTileMapGetLayer(map, LAYER_BUILDINGS);
BzTileset *tileset = bzTileLayerGetTileset(map, buildLayer);
for (i32 y = tileY; y < tileY + sizeY; y++) {
for (i32 x = tileX; x < tileX + sizeX; x++) {
@@ -104,6 +111,8 @@ bool canBuildOn(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) {
y != tileY && y != tileY + sizeY - 1) {
// Without padding
BzTile tile = bzTileLayerGetTile(buildLayer, x, y);
tile = bzTilesetGetTile(tileset, tile);
tile = getTileBuilding(tile);
if (tile == BUILDINGS_ROAD)
return false;
}
@@ -168,15 +177,13 @@ bool init(Game *game) {
.layers[LAYER_TREES]=(BzTileLayerDesc) {"Trees"},
.layers[LAYER_TREES2]=(BzTileLayerDesc) {"TreesS"},
.layers[LAYER_BUILDINGS]=(BzTileLayerDesc) {"Buildings"},
.layers[LAYER_BUILDING_OWNER]=(BzTileLayerDesc) {"BuildingOwnership"},
.layers[LAYER_BUILDING_OWNER]=(BzTileLayerDesc) {"BuildingOwnership", BZ_TILE_LAYER_SKIP_RENDER},
.objectGroups[OBJECTS_GAME]=(BzTileObjectsDesc) {"Game"},
.objectGroups[OBJECTS_ENTITIES]=(BzTileObjectsDesc ) {"Entities"}
});
bzTileMapOverrideLayer(&game->map, LAYER_BUILDINGS, prepareBuildingLayer);
bzTileMapOverrideLayer(&game->map, LAYER_BUILDINGS, handleBuildLayer);
bzTileMapOverrideLayer(&game->map, LAYER_BUILDING_OWNER, BZ_TILE_LAYER_CLEAR);
bzTileMapOverrideLayer(&game->map, LAYER_BUILDING_OWNER, prepareBuildings);
bzTileMapOverrideObjectGroup(&game->map, OBJECTS_GAME, handleGameObjects);
bzTileMapOverrideObjectGroup(&game->map, OBJECTS_ENTITIES, BZ_TILE_OBJECTS_CLEAR);
@@ -227,8 +234,9 @@ void render(float dt, Game *game) {
EndMode2D();
if (nk_begin(NK, "Show", nk_rect(50, 50, 220, 220),
NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_CLOSABLE)) {
if (nk_begin(NK, "DebugMenu", nk_rect(50, 50, 220, 220),
NK_WINDOW_BORDER |NK_WINDOW_MOVABLE | NK_WINDOW_SCALABLE |
NK_WINDOW_TITLE | NK_WINDOW_MINIMIZABLE)) {
// fixed widget pixel width
nk_layout_row_static(NK, 30, 80, 1);
nk_labelf(NK, NK_TEXT_LEFT, "tileX: %d", tileX);