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

@@ -419,6 +419,150 @@
"width":10,
"x":276.667,
"y":284.333
},
{
"gid":540,
"height":10,
"id":10,
"name":"soldier",
"rotation":0,
"type":"",
"visible":true,
"width":10,
"x":353.333333333333,
"y":235.666666666667
},
{
"gid":540,
"height":10,
"id":11,
"name":"soldier",
"rotation":0,
"type":"",
"visible":true,
"width":10,
"x":367.666666666667,
"y":236.393939393939
},
{
"gid":540,
"height":10,
"id":12,
"name":"soldier",
"rotation":0,
"type":"",
"visible":true,
"width":10,
"x":367.909090909091,
"y":221
},
{
"gid":540,
"height":10,
"id":13,
"name":"soldier",
"rotation":0,
"type":"",
"visible":true,
"width":10,
"x":354.636363636364,
"y":216.818181818182
},
{
"gid":540,
"height":10,
"id":14,
"name":"soldier",
"rotation":0,
"type":"",
"visible":true,
"width":10,
"x":354.090909090909,
"y":201.727272727273
},
{
"gid":540,
"height":10,
"id":15,
"name":"soldier",
"rotation":0,
"type":"",
"visible":true,
"width":10,
"x":365.727272727273,
"y":205.181818181818
},
{
"gid":540,
"height":10,
"id":16,
"name":"soldier",
"rotation":0,
"type":"",
"visible":true,
"width":10,
"x":365.727272727273,
"y":190.636363636364
},
{
"gid":540,
"height":10,
"id":17,
"name":"soldier",
"rotation":0,
"type":"",
"visible":true,
"width":10,
"x":353.727272727273,
"y":188.090909090909
},
{
"gid":540,
"height":10,
"id":18,
"name":"soldier",
"rotation":0,
"type":"",
"visible":true,
"width":10,
"x":352.818181818182,
"y":173.909090909091
},
{
"gid":540,
"height":10,
"id":19,
"name":"soldier",
"rotation":0,
"type":"",
"visible":true,
"width":10,
"x":364.454545454545,
"y":175.545454545455
},
{
"gid":550,
"height":10,
"id":20,
"name":"soldier",
"rotation":0,
"type":"",
"visible":true,
"width":10,
"x":47.5,
"y":179.25
},
{
"gid":550,
"height":10,
"id":21,
"name":"soldier",
"rotation":0,
"type":"",
"visible":true,
"width":10,
"x":46.5,
"y":167.5
}],
"opacity":1,
"type":"objectgroup",
@@ -438,7 +582,7 @@
"y":0
}],
"nextlayerid":10,
"nextobjectid":10,
"nextobjectid":22,
"orientation":"orthogonal",
"renderorder":"right-down",
"tiledversion":"1.10.2",

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);

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.2" orientation="orthogonal" renderorder="right-down" width="32" height="32" tilewidth="16" tileheight="16" infinite="0" nextlayerid="10" nextobjectid="10">
<map version="1.10" tiledversion="1.10.2" orientation="orthogonal" renderorder="right-down" width="32" height="32" tilewidth="16" tileheight="16" infinite="0" nextlayerid="10" nextobjectid="22">
<editorsettings>
<export target="../assets/maps/tree_test.tmj" format="json"/>
</editorsettings>
@@ -266,6 +266,18 @@
<object id="7" name="worker" gid="28" x="275.333" y="160.333" width="10" height="10"/>
<object id="8" name="worker" gid="28" x="276" y="222.333" width="10" height="10"/>
<object id="9" name="worker" gid="28" x="276.667" y="284.333" width="10" height="10"/>
<object id="10" name="soldier" gid="540" x="353.333" y="235.667" width="10" height="10"/>
<object id="11" name="soldier" gid="540" x="367.667" y="236.394" width="10" height="10"/>
<object id="12" name="soldier" gid="540" x="367.909" y="221" width="10" height="10"/>
<object id="13" name="soldier" gid="540" x="354.636" y="216.818" width="10" height="10"/>
<object id="14" name="soldier" gid="540" x="354.091" y="201.727" width="10" height="10"/>
<object id="15" name="soldier" gid="540" x="365.727" y="205.182" width="10" height="10"/>
<object id="16" name="soldier" gid="540" x="365.727" y="190.636" width="10" height="10"/>
<object id="17" name="soldier" gid="540" x="353.727" y="188.091" width="10" height="10"/>
<object id="18" name="soldier" gid="540" x="352.818" y="173.909" width="10" height="10"/>
<object id="19" name="soldier" gid="540" x="364.455" y="175.545" width="10" height="10"/>
<object id="20" name="soldier" gid="550" x="47.5" y="179.25" width="10" height="10"/>
<object id="21" name="soldier" gid="550" x="46.5" y="167.5" width="10" height="10"/>
</objectgroup>
<objectgroup id="9" name="game"/>
</map>

View File

@@ -506,6 +506,10 @@ class EnumWriter:
x, y = k
writer.output(f"base.width *= {x};\n")
writer.output(f"base.height *= {y};\n")
if x > 1:
writer.output(f"base.x -= {(x - 1) * tile_width};\n")
if y > 1:
writer.output(f"base.y -= {(y - 1) * tile_height};\n")
writer.output("break;\n")
writer.unindent()
writer.output("default: break;\n")

View File

@@ -78,6 +78,7 @@ anim_writer = EnumWriter(writer, entity_tiles, "entity", "anim")
anim_writer.output_enum()
anim_writer.output_anim_enum()
anim_writer.output_tile_to_enum("getTileEntity")
anim_writer.output_enum_to_tile("getEntityTile")
anim_writer.output_enum_to_str("getEntityStr")
anim_writer.output_anim_enum_to_str("getEntityAnimationStr")