From cc6b1c1a3565dd853ba7b786ff87ba21a0563630 Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Thu, 4 Jan 2024 16:40:39 +0100 Subject: [PATCH] Add entity_factory --- CMakeLists.txt | 2 ++ game/buildings.c | 3 ++- game/components.h | 22 ++++++++++++++------- game/entity_factory.c | 46 +++++++++++++++++++++++++++++++++++++++++++ game/entity_factory.h | 11 +++++++++++ game/map_init.c | 42 +++++---------------------------------- game/map_init.h | 3 --- 7 files changed, 81 insertions(+), 48 deletions(-) create mode 100644 game/entity_factory.c create mode 100644 game/entity_factory.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d45e51..a9bbd15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,8 @@ add_executable(PixelDefense game/buildings.h game/components.c game/components.h + game/entity_factory.c + game/entity_factory.h game/entrypoint.c game/game_state.h game/game_tileset.h diff --git a/game/buildings.c b/game/buildings.c index 96b073b..3b40018 100644 --- a/game/buildings.c +++ b/game/buildings.c @@ -1,6 +1,7 @@ #include "buildings.h" #include "components.h" +#include "entity_factory.h" #include "game_state.h" #include "map_layers.h" @@ -55,7 +56,7 @@ ecs_entity_t placeBuilding(BzTileMap *map, BuildingType type, BzTile tileX, BzTi BZ_ASSERT(buildingTile != -1); // Create entity - ecs_entity_t e = entityCreate(ECS); + ecs_entity_t e = entityCreateEmpty(); ecs_set(ECS, e, TilePosition, { .x = tileX, .y = tileY }); ecs_set(ECS, e, TileSize, { .sizeX = sizeX, .sizeY = sizeY }); diff --git a/game/components.h b/game/components.h index 8ea175f..31e1238 100644 --- a/game/components.h +++ b/game/components.h @@ -152,6 +152,21 @@ typedef struct EntityArms { * Gameplay components *********************************************************/ + +typedef struct WeaponMelee { + +} WeaponMelee; +typedef struct WeaponRanged { + +} WeaponRanged; +typedef struct WeaponShield { + +} WeaponShield; +typedef struct AttachedWeapons { + ecs_entity_t primary; + ecs_entity_t secondary; +} AttachedWeapons; + extern ECS_COMPONENT_DECLARE(UnitAction); extern ECS_COMPONENT_DECLARE(UnitAI); @@ -185,11 +200,4 @@ extern ECS_TAG_DECLARE(Attackable); void initComponentIDs(ecs_world_t *ecs); -static ecs_entity_t entityCreate(ecs_world_t *ecs) { - ecs_entity_t entity = ecs_new_id(ecs); - ecs_add_id(ecs, entity, GameEntity); - return entity; -} - - #endif //PIXELDEFENSE_COMPONENTS_H diff --git a/game/entity_factory.c b/game/entity_factory.c new file mode 100644 index 0000000..00462c0 --- /dev/null +++ b/game/entity_factory.c @@ -0,0 +1,46 @@ +#include "entity_factory.h" +#include "unit_actions.h" + +ecs_entity_t entityCreateEmpty() { + ecs_entity_t e = ecs_new_id(ECS); + ecs_add_id(ECS, e, GameEntity); + return e; +} + +ecs_entity_t entityCreateWorker(const Position position, Game *game) { + const Size size = {10.0f, 10.0f}; + BzTileset *tileset = &game->tileset; + ecs_entity_t e = entityCreateEmpty(); + ecs_set_ptr(ECS, e, Position, &position); + ecs_set_ptr(ECS, e, Size, &size); + BzSpatialGridID spatialID = bzSpatialGridInsert(game->entityGrid, &e, + position.x, position.y, + size.x, size.y); + ecs_set(ECS, e, SpatialGridID, { spatialID }); + ecs_set(ECS, e, Rotation, { 0.0f }); + ecs_set(ECS, e, Velocity, {}); + ecs_set(ECS, e, Steering, {}); + TextureRegion workerRegion = { + tileset->tiles, + bzTilesetGetTileRegion(tileset, ENTITY_WORKER) + }; + ecs_set_ptr(ECS, e, TextureRegion, &workerRegion); + ecs_set(ECS, e, Animation, { + .entityType = ENTITY_WORKER, + .animType = ANIM_IDLE, + + .sequence = entityGetAnimationSequence(ENTITY_WORKER, ANIM_IDLE), + .tileset = tileset, + .curFrame = 0, + .elapsed = 0.0f, + }); + ecs_set(ECS, e, UnitAction, { NULL, NULL }); + ecs_add_id(ECS, e, Selectable); + ecs_add_id(ECS, e, Unit); + ecs_set(ECS, e, Worker, { + .collectSpeed = 0.8f, + .depositSpeed = 0.2f, + .carryCapacity = 5, + }); + return e; +} diff --git a/game/entity_factory.h b/game/entity_factory.h new file mode 100644 index 0000000..1064f48 --- /dev/null +++ b/game/entity_factory.h @@ -0,0 +1,11 @@ +#ifndef PIXELDEFENSE_ENTITY_FACTORY_H +#define PIXELDEFENSE_ENTITY_FACTORY_H + +#include "components.h" +#include "game_state.h" + +ecs_entity_t entityCreateEmpty(); + +ecs_entity_t entityCreateWorker(const Position position, Game *game); + +#endif //PIXELDEFENSE_ENTITY_FACTORY_H diff --git a/game/map_init.c b/game/map_init.c index 0756320..be551fe 100644 --- a/game/map_init.c +++ b/game/map_init.c @@ -3,6 +3,7 @@ #include #include "components.h" +#include "entity_factory.h" #include "game_state.h" #include "map_layers.h" @@ -31,9 +32,8 @@ bool initEntityObjectsLayer(BzTileMap *map, BzTileObjectGroup *objectGroup) { for (i32 i = 0; i < objectGroup->objectCount; i++) { if (i == 1) break; BzTileObject object = objectGroup->objects[i]; - ecs_entity_t e = createWorker((Position) {object.shape.x, object.shape.y}, - (Size) {object.shape.sizeX, object.shape.sizeY}, - game->entityGrid, objectTileset, object.gid); + Position pos = (Position) { object.shape.x, object.shape.y }; + entityCreateWorker(pos, game); /*ecs_set(ECS, e, Animation, { .entityType=ENTITY_WORKER, .tileset = objectTileset, @@ -76,7 +76,7 @@ bool initBuildingsLayer(BzTileMap *map, BzTileLayer *layer) { const i32 tileWidth = map->tileWidth; const i32 tileHeight = map->tileHeight; - ecs_entity_t e = entityCreate(ECS); + 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, { @@ -117,7 +117,7 @@ bool initTreesLayer(BzTileMap *map, BzTileLayer *layer) { f32 sizeY = tileset->tileHeight; f32 posX = layer->offsetX + x * sizeX; f32 posY = layer->offsetY + y * sizeY; - ecs_entity_t e = entityCreate(ECS); + ecs_entity_t e = entityCreateEmpty(); SpatialGridID gridID = bzSpatialGridInsert(game->entityGrid, &e, posX, posY, sizeX, sizeY); ecs_set(ECS, e, SpatialGridID, {gridID}); posX += sizeX * 0.5f; @@ -135,35 +135,3 @@ bool initTreesLayer(BzTileMap *map, BzTileLayer *layer) { } return true; } - -ecs_entity_t createWorker(Position position, Size size, BzSpatialGrid *grid, BzTileset *tileset, BzTile gid) { - ecs_entity_t e = entityCreate(ECS); - ecs_set_ptr(ECS, e, Position, &position); - ecs_set_ptr(ECS, e, Size, &size); - BzSpatialGridID spatialID = bzSpatialGridInsert(grid, &e, - position.x, position.y, - size.x, size.y); - ecs_set(ECS, e, SpatialGridID, {spatialID}); - ecs_set(ECS, e, Rotation, {0.0f}); - ecs_set(ECS, e, Velocity, {}); - ecs_set(ECS, e, Steering, {}); - ecs_set(ECS, e, TextureRegion, {tileset->tiles, bzTilesetGetTileRegion(tileset, gid)}); - ecs_set(ECS, e, Animation, { - .entityType = ENTITY_WORKER, - .animType = ANIM_IDLE, - - .sequence = entityGetAnimationSequence(ENTITY_WORKER, ANIM_IDLE), - .tileset = tileset, - .curFrame = 0, - .elapsed = 0.0f, - }); - ecs_set(ECS, e, UnitAction, {NULL, NULL}); - ecs_add_id(ECS, e, Selectable); - ecs_add_id(ECS, e, Unit); - ecs_set(ECS, e, Worker, { - .collectSpeed = 0.8f, - .depositSpeed = 0.2f, - .carryCapacity = 5, - }); - return e; -} diff --git a/game/map_init.h b/game/map_init.h index 47772e8..3386cee 100644 --- a/game/map_init.h +++ b/game/map_init.h @@ -14,7 +14,4 @@ bool initBuildingsLayer(BzTileMap *map, BzTileLayer *layer); bool initTreesLayer(BzTileMap *map, BzTileLayer *layer); -ecs_entity_t createWorker(Position position, Size size, BzSpatialGrid *grid, BzTileset *tileset, BzTile gid); - - #endif //PIXELDEFENSE_MAP_INITIALIZATION_H