#include "entity_factory.h" #include "ai_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 entityCreateBaseUnit(const Position position, Player player, EntityType type, AnimType startAnim, Game *game) { BzTileset *tileset = &game->tileset; TextureRegion region = { tileset->tiles, getTextureRect(getEntityTile(type)) }; const Size size = {10.0f * region.rec.width / 16.0f, 10.0f * region.rec.height / 16.0f}; bzLogInfo("%.2f %.2f", size.x, size.y); 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 - size.x * 0.5f, position.y - size.y * 0.5f, size.x, size.y); ecs_set(ECS, e, SpatialGridID, { spatialID }); ecs_set(ECS, e, Rotation, { 0.0f }); ecs_set(ECS, e, Orientation, {0.0f}); ecs_set(ECS, e, Velocity, {}); ecs_set(ECS, e, Steering, {}); ecs_set(ECS, e, Owner, {player}); ecs_set_ptr(ECS, e, TextureRegion, ®ion); if (startAnim != ANIM_NONE) { ecs_set(ECS, e, Animation, { .entityType = type, .animType = startAnim, .sequence = entityGetAnimationSequence(type, startAnim), .tileset = tileset, .curFrame = 0, .elapsed = 0.0f, }); } ecs_set(ECS, e, BzBTState, { .root = NULL, .nodeStatePool = game->pools.btNodeState }); ecs_set(ECS, e, AIBlackboard, {.entity = e}); ecs_add_id(ECS, e, Selectable); ecs_set(ECS, e, Unit, { .acceleration = 80.0f, .maxSpeed = 15.0f, .deceleration = 0.1f, .unitType = type }); return e; } ecs_entity_t entityCreateSoldier(const Position position, Player player, Game *game) { ecs_entity_t e = entityCreateBaseUnit(position, player, ENTITY_SOLDIER, ANIM_IDLE, game); return e; } ecs_entity_t entityCreateWorker(const Position position, Player player, Game *game) { BzTileset *tileset = &game->tileset; ecs_entity_t e = entityCreateBaseUnit(position, player, ENTITY_WORKER, ANIM_IDLE, game); ecs_set(ECS, e, Worker, { .collectSpeed = 0.8f, .depositSpeed = 0.2f, .carryCapacity = 5, }); ecs_entity_t right = entityCreateEmpty(); Arms arms = {.primary = right}; ecs_set_ptr(ECS, e, Arms, &arms); ecs_set(ECS, right, Arm, {.offset = 45.0f, 4.5f}); ecs_set(ECS, right, Size, {8, 8}); ecs_set(ECS, right, Rotation, { 0.0f }); TextureRegion daggerRegion = { tileset->tiles, bzTilesetGetTileRegion(tileset, getItemTile(ITEM_AXE)) }; ecs_set_ptr(ECS, right, TextureRegion, &daggerRegion); return e; }