Add soldiers

This commit is contained in:
2024-01-23 20:31:23 +01:00
parent 777ebeadc4
commit 07d1852fb9
9 changed files with 313 additions and 36 deletions

View File

@@ -8,9 +8,15 @@ ecs_entity_t entityCreateEmpty() {
return e;
}
ecs_entity_t entityCreateWorker(const Position position, Game *game) {
const Size size = {10.0f, 10.0f};
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);
@@ -22,20 +28,21 @@ ecs_entity_t entityCreateWorker(const Position position, Game *game) {
ecs_set(ECS, e, Orientation, {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,
ecs_set(ECS, e, Owner, {player});
.sequence = entityGetAnimationSequence(ENTITY_WORKER, ANIM_IDLE),
.tileset = tileset,
.curFrame = 0,
.elapsed = 0.0f,
});
ecs_set_ptr(ECS, e, TextureRegion, &region);
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
@@ -46,8 +53,20 @@ ecs_entity_t entityCreateWorker(const Position position, Game *game) {
.acceleration = 80.0f,
.maxSpeed = 15.0f,
.deceleration = 0.1f,
.unitType = ENTITY_WORKER
.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,
@@ -58,7 +77,6 @@ ecs_entity_t entityCreateWorker(const Position position, Game *game) {
Arms arms = {.primary = right};
ecs_set_ptr(ECS, e, Arms, &arms);
ecs_set(ECS, right, Arm, {.offset = 45.0f, 4.5f});
ecs_set(ECS, e, Owner, {PLAYER_RED});
ecs_set(ECS, right, Size, {8, 8});
ecs_set(ECS, right, Rotation, { 0.0f });

View File

@@ -6,6 +6,9 @@
ecs_entity_t entityCreateEmpty();
ecs_entity_t entityCreateWorker(const Position position, Game *game);
ecs_entity_t entityCreateBaseUnit(const Position position, Player player,
EntityType type, AnimType startAnim, Game *game);
ecs_entity_t entityCreateSoldier(const Position position, Player player, Game *game);
ecs_entity_t entityCreateWorker(const Position position, Player player, Game *game);
#endif //PIXELDEFENSE_ENTITY_FACTORY_H

View File

@@ -482,6 +482,89 @@ typedef enum AnimType {
ANIM_NONE = -1,
} AnimType;
static EntityType getTileEntity(BzTileID tile) {
switch (tile) {
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
return ENTITY_WORKER;
case 539:
case 540:
case 541:
case 542:
case 543:
case 544:
case 545:
case 546:
case 547:
case 548:
return ENTITY_SOLDIER;
case 1051:
case 1052:
case 1053:
case 1054:
case 1055:
case 1056:
case 1057:
case 1058:
case 1059:
case 1060:
return ENTITY_WARRIOR;
case 1563:
case 1564:
case 1565:
case 1566:
case 1567:
case 1568:
case 1569:
case 1570:
case 1571:
case 1572:
return ENTITY_MAGE;
case 2075:
case 2076:
case 2077:
case 2078:
case 2079:
case 2080:
case 2081:
case 2082:
case 2083:
case 2084:
return ENTITY_ORC;
case 2587:
case 2588:
case 2589:
case 2590:
case 2591:
case 2592:
case 2593:
case 2594:
case 2595:
case 2596:
return ENTITY_GOBLIN;
case 7424:
return ENTITY_WOOD;
case 7425:
return ENTITY_STONE;
case 7426:
return ENTITY_APPLE;
case 7427:
return ENTITY_GOLD;
case 7428:
return ENTITY_POP;
default:
return ENTITY_COUNT;
}
}
static BzTileID getEntityTile(EntityType type) {
switch (type) {
case ENTITY_WORKER: return 27;
@@ -813,6 +896,7 @@ static Rectangle getTextureRect(BzTileID tile) {
case 2596:
base.width *= 1;
base.height *= 2;
base.y -= 16;
break;
default: break;
}

View File

@@ -31,20 +31,31 @@ bool initEntityObjectsLayer(BzTileMap *map, BzTileObjectGroup *objectGroup) {
//if (i == 1) break;
BzTileObject object = objectGroup->objects[i];
Position pos = (Position) { object.shape.x, object.shape.y };
entityCreateWorker(pos, game);
/*ecs_set(ECS, e, Animation, {
.entityType=ENTITY_WORKER,
.tileset = objectTileset,
.curFrame=0,
.frameDuration=0.6f + (i % 10) * 0.05f,
.elapsed=i * 0.1f,
});
*/
//EntityArms arms = {
// .left=createEntity(ECS),
// .right=createEntity(ECS),
//};
//ecs_set_ptr(ECS, e, EntityArms, &arms);
BzTileID gid = bzTilesetGetTileID(objectTileset, object.gid);
BzTileID baseGid = getTileBase(gid);
Player player = PLAYER_RED;
if (baseGid != gid)
player = PLAYER_BLUE;
EntityType entity = getTileEntity(baseGid);
switch (entity) {
case ENTITY_GOBLIN:
break;
case ENTITY_MAGE:
break;
case ENTITY_ORC:
break;
case ENTITY_SOLDIER:
entityCreateSoldier(pos, player, game);
break;
case ENTITY_WARRIOR:
break;
case ENTITY_WORKER:
entityCreateWorker(pos, player, game);
break;
default:
BZ_ASSERT(false);
break;
}
}
return true;

View File

@@ -242,8 +242,8 @@ void drawMainMenuUI(Game *game, f32 dt) {
if (uiMainMenuButton("Play")) {
setScreen(game, SCREEN_GAME);
unloadMap(game);
//loadMap(game, "assets/maps/tree_test.tmj");
loadMap(game, "assets/maps/map_01.tmj");
loadMap(game, "assets/maps/tree_test.tmj");
//loadMap(game, "assets/maps/map_01.tmj");
}
if (uiMainMenuButton("Settings")) {
setScreen(game, SCREEN_SETTINGS);