diff --git a/game/components.c b/game/components.c index 4cd7043..a50e8b2 100644 --- a/game/components.c +++ b/game/components.c @@ -1,5 +1,8 @@ #include "components.h" +ECS_TAG_DECLARE(TextureTerrain); +ECS_TAG_DECLARE(TextureBuildings); +ECS_TAG_DECLARE(TextureEntities); ECS_COMPONENT_DECLARE(TilePosition); ECS_COMPONENT_DECLARE(TileSize); @@ -8,6 +11,7 @@ ECS_COMPONENT_DECLARE(Position); ECS_COMPONENT_DECLARE(Size); ECS_COMPONENT_DECLARE(TargetPosition); ECS_COMPONENT_DECLARE(MoveForce); +ECS_COMPONENT_DECLARE(Resource); ECS_COMPONENT_DECLARE(SpatialGridID); ECS_COMPONENT_DECLARE(Rotation); ECS_COMPONENT_DECLARE(Health); @@ -17,6 +21,10 @@ ECS_COMPONENT_DECLARE(Animation); ECS_COMPONENT_DECLARE(Path); void initComponentIDs(ecs_world_t *ecs) { + ECS_TAG_DEFINE(ecs, TextureTerrain); + ECS_TAG_DEFINE(ecs, TextureBuildings); + ECS_TAG_DEFINE(ecs, TextureEntities); + ECS_COMPONENT_DEFINE(ecs, TilePosition); ECS_COMPONENT_DEFINE(ecs, TileSize); ECS_COMPONENT_DEFINE(ecs, Owner); @@ -24,6 +32,7 @@ void initComponentIDs(ecs_world_t *ecs) { ECS_COMPONENT_DEFINE(ecs, Size); ECS_COMPONENT_DEFINE(ecs, TargetPosition); ECS_COMPONENT_DEFINE(ecs, MoveForce); + ECS_COMPONENT_DEFINE(ecs, Resource); ECS_COMPONENT_DEFINE(ecs, SpatialGridID); ECS_COMPONENT_DEFINE(ecs, Rotation); ECS_COMPONENT_DEFINE(ecs, Health); diff --git a/game/components.h b/game/components.h index c71f31b..137878a 100644 --- a/game/components.h +++ b/game/components.h @@ -6,8 +6,9 @@ #include "utils/building_types.h" - -#define ecs_set_p(world, e, T, ...) ecs_set_id(world, e, ecs_id(T), sizeof(T), (T*)__VA_ARGS__) +extern ECS_TAG_DECLARE(TextureTerrain); +extern ECS_TAG_DECLARE(TextureBuildings); +extern ECS_TAG_DECLARE(TextureEntities); typedef struct TilePosition { BzTile x; @@ -32,6 +33,20 @@ extern ECS_COMPONENT_DECLARE(Size); extern ECS_COMPONENT_DECLARE(TargetPosition); extern ECS_COMPONENT_DECLARE(MoveForce); +typedef enum ResourceType { + RES_IRON, + RES_WOOD, + RES_GOLD, + RES_FOOD, + RES_COUNT, +} ResourceType; + +typedef struct Resource { + ResourceType type; + i32 amount; +} Resource; +extern ECS_COMPONENT_DECLARE(Resource); + typedef BzSpatialGridID SpatialGridID; extern ECS_COMPONENT_DECLARE(SpatialGridID); diff --git a/game/main.c b/game/main.c index 57f578a..a5ae0cf 100644 --- a/game/main.c +++ b/game/main.c @@ -106,6 +106,9 @@ bool init(void *userData) { .userDataSize=sizeof(ecs_entity_t) }); + bzTileMapOverrideLayer(&game->map, LAYER_TREES, initTreesLayer); + bzTileMapOverrideLayer(&game->map, LAYER_TREES2, initTreesLayer); + bzTileMapOverrideLayer(&game->map, LAYER_BUILDING_OWNER, initBuildingsLayer); bzTileMapOverrideObjectGroup(&game->map, OBJECTS_GAME, initGameObjectsLayer); @@ -116,7 +119,11 @@ bool init(void *userData) { ECS_SYSTEM(ECS, updatePos, EcsOnUpdate, Position, TargetPosition, TextureRegion); ECS_SYSTEM(ECS, entityUpdatePhysics, EcsOnUpdate, Position, Size, SpatialGridID); ECS_SYSTEM(ECS, drawDebugPath, EcsOnUpdate, Path); - ECS_SYSTEM(ECS, renderEntities, EcsOnUpdate, Position, Size, Rotation, TextureRegion); + + ECS_SYSTEM(ECS, renderTerrain, EcsOnUpdate, Position, Size, Rotation, TextureRegion, TextureTerrain); + ECS_SYSTEM(ECS, renderBuildings, EcsOnUpdate, Position, Size, Rotation, TextureRegion, TextureBuildings); + ECS_SYSTEM(ECS, renderEntities, EcsOnUpdate, Position, Size, Rotation, TextureRegion, TextureEntities); + ECS_OBSERVER(ECS, targetFinish, EcsOnRemove, TargetPosition); ECS_OBSERVER(ECS, startPath, EcsOnSet, Path); return true; diff --git a/game/map_init.c b/game/map_init.c index 150ea71..ce54dbb 100644 --- a/game/map_init.c +++ b/game/map_init.c @@ -27,6 +27,7 @@ bool initEntityObjectsLayer(BzTileMap *map, BzTileObjectGroup *objectGroup) { BzTileObject object = objectGroup->objects[i]; ecs_entity_t e = ecs_new_id(ECS); game->entity = e; + ecs_add(ECS, e, TextureEntities); ecs_set(ECS, e, Position, {object.shape.x, object.shape.y}); ecs_set(ECS, e, Size, {object.shape.sizeX, object.shape.sizeY}); BzSpatialGridID spatialID = bzSpatialGridInsert(game->entityGrid, &e, @@ -70,7 +71,6 @@ bool initBuildingsLayer(BzTileMap *map, BzTileLayer *layer) { TileSize size = {}; getBuildingSize(buildingTile, &size.sizeX, &size.sizeY); bzTileLayerSetTile(ownershipLayer, 0, x, y, size.sizeX, size.sizeY); - bzLogInfo("Got size: %2d %2d", size.sizeX, size.sizeY); ecs_entity_t e = ecs_new_id(ECS); ecs_set(ECS, e, TilePosition, {.x=x, .y=y}); @@ -85,3 +85,32 @@ bool initBuildingsLayer(BzTileMap *map, BzTileLayer *layer) { return true; } + +bool initTreesLayer(BzTileMap *map, BzTileLayer *layer) { + Game *game = ecs_singleton_get_mut(ECS, Game); + + BzTileset *tileset = bzTileLayerGetTileset(map, layer); + + for (i32 y = 0; y < layer->height; y++) { + for (i32 x = 0; x < layer->width; x++) { + BzTile tile = layer->data[y * layer->width + x]; + BzTile layerTile = tile; + tile = bzTilesetGetTile(tileset, tile); + if (tile != 185) continue; // Not a tree + + f32 sizeX = tileset->tileWidth; + f32 sizeY = tileset->tileHeight; + f32 posX = layer->offsetX + x * sizeX + sizeX * 0.5f; + f32 posY = layer->offsetY + y * sizeY + sizeY * 0.5f; + ecs_entity_t e = ecs_new_id(ECS); + ecs_add(ECS, e, TextureTerrain); + ecs_set(ECS, e, Position, {posX, posY}); + ecs_set(ECS, e, Size, {sizeX, sizeY}); + ecs_set(ECS, e, Rotation, {0}); + ecs_set(ECS, e, TextureRegion, {tileset->tiles, bzTilesetGetTileRegion(tileset, layerTile)}); + ecs_set(ECS, e, Resource, {RES_WOOD, 20}); + + } + } + return true; +} diff --git a/game/map_init.h b/game/map_init.h index e9c7e69..1451b0e 100644 --- a/game/map_init.h +++ b/game/map_init.h @@ -9,4 +9,6 @@ bool initEntityObjectsLayer(BzTileMap *map, BzTileObjectGroup *objectGroup); bool initBuildingsLayer(BzTileMap *map, BzTileLayer *layer); +bool initTreesLayer(BzTileMap *map, BzTileLayer *layer); + #endif //PIXELDEFENSE_MAP_INITIALIZATION_H diff --git a/game/systems.h b/game/systems.h index 9427e22..7b42148 100644 --- a/game/systems.h +++ b/game/systems.h @@ -28,8 +28,14 @@ void entityAdded(ecs_iter_t *it); */ void entityUpdatePhysics(ecs_iter_t *it); - +/* + * 0: + */ +void renderTerrain(ecs_iter_t *it); +void renderBuildings(ecs_iter_t *it); void renderEntities(ecs_iter_t *it); + +//void renderEntities(ecs_iter_t *it); void updateAnimations(ecs_iter_t *it); void updatePos(ecs_iter_t *it); void targetFinish(ecs_iter_t *it); diff --git a/game/systems_entity.c b/game/systems_entity.c index 2fbbfce..3cebe06 100644 --- a/game/systems_entity.c +++ b/game/systems_entity.c @@ -46,7 +46,7 @@ void updateAnimations(ecs_iter_t *it) { } } -void renderEntities(ecs_iter_t *it) { +static void render(ecs_iter_t *it) { Position *p = ecs_field(it, Position, 1); Size *s = ecs_field(it, Size, 2); Rotation *r = ecs_field(it, Rotation, 3); @@ -59,10 +59,20 @@ void renderEntities(ecs_iter_t *it) { if (t[i].flipX) src.width *= -1.0f; if (t[i].flipY) src.height *= -1.0f; DrawTexturePro(t[i].texture, src, dst, origin, r[i], WHITE); - DrawRectangleLines(dst.x - dst.width * 0.5f, dst.y, dst.width, dst.height, RED); + //DrawRectangleLines(dst.x - dst.width * 0.5f, dst.y - dst.height * 0.5f, dst.width, dst.height, RED); } } +void renderTerrain(ecs_iter_t *it) { + render(it); +} +void renderBuildings(ecs_iter_t *it) { + render(it); +} +void renderEntities(ecs_iter_t *it) { + render(it); +} + void updatePos(ecs_iter_t *it) { Position *pos = ecs_field(it, Position, 1); TargetPosition *target = ecs_field(it, TargetPosition, 2);