diff --git a/game/buildings.c b/game/buildings.c index 8ee7156..3b202a6 100644 --- a/game/buildings.c +++ b/game/buildings.c @@ -147,6 +147,9 @@ void getBuildingCost(BuildingType type, i32 cost[RES_COUNT]) { case BUILDING_HOUSE_04: case BUILDING_HOUSE_05: case BUILDING_HOUSE_06: + case BUILDING_HOUSE_07: + case BUILDING_HOUSE_08: + case BUILDING_HOUSE_09: cost[RES_WOOD] = 50; break; case BUILDING_MARKET: @@ -171,6 +174,7 @@ void getBuildingCost(BuildingType type, i32 cost[RES_COUNT]) { case BUILDING_COUNT: // NA break; + default:; } } bool canAffordBuilding(BuildingType type, PlayerResources res) { diff --git a/game/entity_factory.c b/game/entity_factory.c index 9ea8b84..85e8db6 100644 --- a/game/entity_factory.c +++ b/game/entity_factory.c @@ -94,3 +94,46 @@ ecs_entity_t entityCreateWorker(const Position position, Player player, Game *ga return e; } + +ecs_entity_t entityHire(EntityType type, Position position, Player player, Game *game) { + PlayerResources *playerRes = &game->playerResources[player]; + i32 res[RES_COUNT] = {0, }; + getEntityCost(type, res); + switch (type) { + case ENTITY_WORKER: + entityCreateWorker(position, player, game); + playerRes->food -= res[RES_FOOD]; + playerRes->wood -= res[RES_WOOD]; + playerRes->gold -= res[RES_GOLD]; + default: + return 0; + } +} + +void getEntityCost(EntityType type, i32 cost[RES_COUNT]) { + for (i32 i = 0; i < RES_COUNT; i++) { + cost[i] = 0; + } + switch (type) { + case ENTITY_WORKER: + cost[RES_FOOD] = 50; + break; + case ENTITY_SOLDIER: + cost[RES_FOOD] = 50; + cost[RES_GOLD] = 50; + break; + case ENTITY_WARRIOR: + cost[RES_FOOD] = 200; + cost[RES_GOLD] = 100; + break; + } +} +bool canAffordEntity(EntityType type, PlayerResources res) { + i32 needed[RES_COUNT] = {0, }; + getEntityCost(type, needed); + + if (needed[RES_WOOD] > res.wood) return false; + if (needed[RES_FOOD] > res.food) return false; + if (needed[RES_GOLD] > res.gold) return false; + return true; +} diff --git a/game/entity_factory.h b/game/entity_factory.h index e9aa07f..baafab7 100644 --- a/game/entity_factory.h +++ b/game/entity_factory.h @@ -11,4 +11,9 @@ ecs_entity_t entityCreateBaseUnit(const Position position, f32 size, Player play ecs_entity_t entityCreateSoldier(const Position position, Player player, Game *game); ecs_entity_t entityCreateWorker(const Position position, Player player, Game *game); +ecs_entity_t entityHire(EntityType type, Position position, Player player, Game *game); + +void getEntityCost(EntityType type, i32 cost[RES_COUNT]); +bool canAffordEntity(EntityType type, PlayerResources res); + #endif //PIXELDEFENSE_ENTITY_FACTORY_H diff --git a/game/game_tileset.h b/game/game_tileset.h index 3ae4d49..a714a5a 100644 --- a/game/game_tileset.h +++ b/game/game_tileset.h @@ -325,9 +325,9 @@ typedef enum BuildingType { BUILDING_HOUSE_04, BUILDING_HOUSE_05, BUILDING_HOUSE_06, - BUILDING_HOUSE_7, - BUILDING_HOUSE_8, - BUILDING_HOUSE_9, + BUILDING_HOUSE_07, + BUILDING_HOUSE_08, + BUILDING_HOUSE_09, BUILDING_KEEP, BUILDING_MARKET, BUILDING_MILL, @@ -375,11 +375,11 @@ static BuildingType getTileBuilding(BzTileID tile) { case 6945: return BUILDING_GRANARY; case 7178: - return BUILDING_HOUSE_7; + return BUILDING_HOUSE_07; case 7179: - return BUILDING_HOUSE_8; + return BUILDING_HOUSE_08; case 7180: - return BUILDING_HOUSE_9; + return BUILDING_HOUSE_09; case 7191: return BUILDING_MARKET; default: @@ -404,9 +404,9 @@ static BzTileID getBuildingTile(BuildingType type) { case BUILDING_HOUSE_05: return 6923; case BUILDING_HOUSE_06: return 6924; case BUILDING_GRANARY: return 6945; - case BUILDING_HOUSE_7: return 7178; - case BUILDING_HOUSE_8: return 7179; - case BUILDING_HOUSE_9: return 7180; + case BUILDING_HOUSE_07: return 7178; + case BUILDING_HOUSE_08: return 7179; + case BUILDING_HOUSE_09: return 7180; case BUILDING_MARKET: return 7191; default: return -1; } @@ -429,9 +429,9 @@ static const char *getBuildingStr(BuildingType type) { case BUILDING_HOUSE_05: return "house_05"; case BUILDING_HOUSE_06: return "house_06"; case BUILDING_GRANARY: return "granary"; - case BUILDING_HOUSE_7: return "house_7"; - case BUILDING_HOUSE_8: return "house_8"; - case BUILDING_HOUSE_9: return "house_9"; + case BUILDING_HOUSE_07: return "house_07"; + case BUILDING_HOUSE_08: return "house_08"; + case BUILDING_HOUSE_09: return "house_09"; case BUILDING_MARKET: return "market"; default: return NULL; } @@ -499,15 +499,15 @@ static BuildingType getBuildingSize(BuildingType type, i32 *outWidth, i32 *outHe if (outWidth) *outWidth = 1; if (outHeight) *outHeight = 1; break; - case BUILDING_HOUSE_7: + case BUILDING_HOUSE_07: if (outWidth) *outWidth = 1; if (outHeight) *outHeight = 1; break; - case BUILDING_HOUSE_8: + case BUILDING_HOUSE_08: if (outWidth) *outWidth = 1; if (outHeight) *outHeight = 1; break; - case BUILDING_HOUSE_9: + case BUILDING_HOUSE_09: if (outWidth) *outWidth = 1; if (outHeight) *outHeight = 1; break; diff --git a/game/systems/s_ui.c b/game/systems/s_ui.c index 28ac300..1c1e7ca 100644 --- a/game/systems/s_ui.c +++ b/game/systems/s_ui.c @@ -6,6 +6,7 @@ #include "../ui_widgets.h" #include "../buildings.h" #include "../utils.h" +#include "../entity_factory.h" void drawGameUI(Game *game, f32 dt) { // UI @@ -173,8 +174,49 @@ void drawGameUI(Game *game, f32 dt) { } case INPUT_SELECTED_OBJECT: break; - case INPUT_SELECTED_BUILDING: + case INPUT_SELECTED_BUILDING: { + ecs_iter_t it = ecs_query_iter(ECS, input->queries.selected); + ecs_entity_t buildingEntity = 0; + while (ecs_query_next(&it)) { + for (i32 i = 0; i < it.count; i++) { + buildingEntity = it.entities[i]; + } + } + if (!buildingEntity || !ecs_has(ECS, buildingEntity, Building)) + break; + Building building = *ecs_get(ECS, buildingEntity, Building); + Vector2 placePos = { + (building.pos.x + building.size.x * 0.5f) * 16.0f, + (building.pos.y + building.size.y + 0.5f) * 16.0f + }; + //placePos = GetWorldToScreen2D(placePos, game->camera); + PlayerResources playerRes = game->playerResources[game->player]; + switch (building.type) { + case BUILDING_KEEP: { + Rectangle rec = getTextureRect(getEntityTile(ENTITY_WORKER)); + bool selected = false; + uiGameBuild("Worker", rec, tex, canAffordEntity(ENTITY_WORKER, playerRes), &selected); + if (selected) + entityHire(ENTITY_WORKER, placePos, game->player, game); + break; + } + case BUILDING_BARRACKS: { + Rectangle soldierRec = getTextureRect(getEntityTile(ENTITY_SOLDIER)); + Rectangle warriorRec = getTextureRect(getEntityTile(ENTITY_WARRIOR)); + bool selected = false; + uiGameBuild("Soldier", soldierRec, tex, canAffordEntity(ENTITY_SOLDIER, playerRes), &selected); + if (selected) + entityHire(ENTITY_SOLDIER, placePos, game->player, game); + selected = false; + uiGameBuild("Warrior", warriorRec, tex, canAffordEntity(ENTITY_WARRIOR, playerRes), &selected); + if (selected) + entityHire(ENTITY_WARRIOR, placePos, game->player, game); + } + default:; + } break; + } + default:; } bzUIEnd(UI); diff --git a/game/ui_widgets.c b/game/ui_widgets.c index 151cc46..29bc5cb 100644 --- a/game/ui_widgets.c +++ b/game/ui_widgets.c @@ -257,6 +257,9 @@ void uiGameBuild(const char *label, Rectangle rec, Texture2D tex, bool canAfford .semanticSize[BZ_UI_AXIS_X] = {BZ_UI_SIZE_CHILD_MAX}, .semanticSize[BZ_UI_AXIS_Y] = {BZ_UI_SIZE_CHILD_SUM}, }); + if (rec.height > 16) + rec.y += 16; + rec.height = rec.width; BzUIInteraction inter = bzUIGetInteraction(UI, btn); @@ -323,6 +326,9 @@ void uiGameBuild(const char *label, Rectangle rec, Texture2D tex, bool canAfford bzUIPopParent(UI); } bool uiGameUnit(const char *label, i32 count, Rectangle rec, Texture2D tex) { + if (rec.height > 16) + rec.y += 16; + rec.height = rec.width; f32 scl = uiGetScale(); BzUINode *btn = bzUINodeMake(UI, bzUIKeyFromString(label), &(BzUINodeDesc) { .flags = BZ_UI_CLICKABLE | BZ_UI_ALIGN_CENTER | BZ_UI_DRAW_BORDER, diff --git a/rawAssets/game.tsj b/rawAssets/game.tsj index d9f6cb6..89c18f5 100644 --- a/rawAssets/game.tsj +++ b/rawAssets/game.tsj @@ -9130,7 +9130,7 @@ "type":"int", "value":0 }], - "type":"house_7" + "type":"house_07" }, { "id":7179, @@ -9145,7 +9145,7 @@ "type":"int", "value":0 }], - "type":"house_8" + "type":"house_08" }, { "id":7180, @@ -9160,7 +9160,7 @@ "type":"int", "value":0 }], - "type":"house_9" + "type":"house_09" }, { "id":7182, diff --git a/rawAssets/game.tsx b/rawAssets/game.tsx index 99a74ca..d67c1fe 100644 --- a/rawAssets/game.tsx +++ b/rawAssets/game.tsx @@ -3384,19 +3384,19 @@ - + - + - +