From 07d1852fb91ebcb4f21da54b9151b52d02efcf9f Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Tue, 23 Jan 2024 20:31:23 +0100 Subject: [PATCH] Add soldiers --- assets/maps/tree_test.tmj | 146 ++++++++++++++++++++++++++++++++++++- game/entity_factory.c | 52 ++++++++----- game/entity_factory.h | 5 +- game/game_tileset.h | 84 +++++++++++++++++++++ game/map_init.c | 39 ++++++---- game/systems/s_ui.c | 4 +- rawAssets/tree_test.tmx | 14 +++- scripts/extract_common.py | 4 + scripts/extract_tileset.py | 1 + 9 files changed, 313 insertions(+), 36 deletions(-) diff --git a/assets/maps/tree_test.tmj b/assets/maps/tree_test.tmj index 0486cb9..bb7cd21 100644 --- a/assets/maps/tree_test.tmj +++ b/assets/maps/tree_test.tmj @@ -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", diff --git a/game/entity_factory.c b/game/entity_factory.c index d3dc5ae..d33c594 100644 --- a/game/entity_factory.c +++ b/game/entity_factory.c @@ -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, ®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 @@ -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 }); diff --git a/game/entity_factory.h b/game/entity_factory.h index 1064f48..66e93a7 100644 --- a/game/entity_factory.h +++ b/game/entity_factory.h @@ -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 diff --git a/game/game_tileset.h b/game/game_tileset.h index 35694e1..cc45c79 100644 --- a/game/game_tileset.h +++ b/game/game_tileset.h @@ -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; } diff --git a/game/map_init.c b/game/map_init.c index a69fb49..9bbca07 100644 --- a/game/map_init.c +++ b/game/map_init.c @@ -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; diff --git a/game/systems/s_ui.c b/game/systems/s_ui.c index 6f32647..faa052e 100644 --- a/game/systems/s_ui.c +++ b/game/systems/s_ui.c @@ -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); diff --git a/rawAssets/tree_test.tmx b/rawAssets/tree_test.tmx index 1ba48e2..952923c 100644 --- a/rawAssets/tree_test.tmx +++ b/rawAssets/tree_test.tmx @@ -1,5 +1,5 @@ - + @@ -266,6 +266,18 @@ + + + + + + + + + + + + diff --git a/scripts/extract_common.py b/scripts/extract_common.py index d73103a..a0061b5 100644 --- a/scripts/extract_common.py +++ b/scripts/extract_common.py @@ -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") diff --git a/scripts/extract_tileset.py b/scripts/extract_tileset.py index 13476c7..1ae9f95 100644 --- a/scripts/extract_tileset.py +++ b/scripts/extract_tileset.py @@ -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")