Buildings as entities instead of map layer

This commit is contained in:
2024-01-08 14:41:26 +01:00
parent 03dc3774e7
commit c08fca9670
17 changed files with 168 additions and 186 deletions

View File

@@ -2,6 +2,7 @@
#include <flecs.h>
#include "buildings.h"
#include "components.h"
#include "entity_factory.h"
#include "game_state.h"
@@ -60,40 +61,24 @@ bool initBuildingsLayer(BzTileMap *map, BzTileLayer *layer) {
BzTileset *buildingTileset = bzTileLayerGetTileset(map, buildingLayer);
BzTile *data = layer->data;
BzTile *buildingData = buildingLayer->data;
BZ_ASSERT(ownershipLayer->tilesetIdx == buildingLayer->tilesetIdx);
for (i32 y = 0; y < layer->height; y++) {
for (i32 x = 0; x < layer->width; x++) {
BzTile ownerTile = data[y * layer->width + x];
BzTile ownerRawTile = data[y * layer->width + x];
BzTileID owner = bzTilesetGetTileID(buildingTileset, ownerRawTile);
BzTile buildingRawTile = buildingData[y * layer->width + x];
BzTile buildingTile = bzTilesetGetTileID(buildingTileset, buildingRawTile);
buildingTile = getTileBuilding(buildingTile);
if (buildingTile == BUILDING_NONE || ownerTile == 0) continue;
// We have a building
TileSize tileSize = {};
getBuildingSize(buildingTile, &tileSize.sizeX, &tileSize.sizeY);
bzTileLayerSetTile(ownershipLayer, 0, x, y, tileSize.sizeX, tileSize.sizeY);
BzTile buildingType = bzTilesetGetTileID(buildingTileset, buildingRawTile);
buildingType = getTileBuilding(buildingType);
if (buildingType <= BUILDING_NONE || buildingType >= BUILDING_COUNT)
continue;
placeBuilding(game, buildingType, x, y, (Owner) {owner});
const i32 tileWidth = map->tileWidth;
const i32 tileHeight = map->tileHeight;
ecs_entity_t e = entityCreateEmpty();
Size size = {.x = tileSize.sizeX * tileWidth, .y = tileSize.sizeY * tileHeight };
ecs_set_ptr(ECS, e, Size, &size);
ecs_set(ECS, e, Position, {
.x = x * tileWidth + size.x * 0.5f,
.y = y * tileHeight + size.y * 0.5f
});
ownerTile = bzTilesetGetTileID(buildingTileset, ownerTile);
ownerTile = getTileBuilding(ownerTile);
ecs_set(ECS, e, Owner, {.playerID=ownerTile});
ecs_add_id(ECS, e, Selectable);
//if (buildingTile == BUILDINGS_WAREHOUSE) {
// ecs_set(ECS, e, Storage, {});
//}
if (buildingTile == BUILDING_KEEP) {
ecs_add_id(ECS, e, Storage);
}
//bzTileMapUpdateCollider(&GAME.map, x, y);
i32 sizeX = 1;
i32 sizeY = 1;
getBuildingSize(buildingType, &sizeX, &sizeY);
x += sizeX - 1;
y += sizeY - 1;
}
}
return true;