diff --git a/game/main.c b/game/main.c index 9f35e2f..0b0e666 100644 --- a/game/main.c +++ b/game/main.c @@ -560,8 +560,67 @@ static void renderGameMenu(Game *game, float dt) { uiGameResCount(1, 10, popRec, tileset->tiles); bzUIPopParent(UI); + uiPushDivParentPercentage(1.0f, 0.20f); + InputState *input = ecs_singleton_get_mut(ECS, InputState); + const BuildingType buildingOrder[] = { + BUILDING_HOUSE_01, + BUILDING_GRANARY, + BUILDING_WAREHOUSE, + BUILDING_MARKET, + BUILDING_MILL, + BUILDING_HOUSE_02, // placeholder for farm + BUILDING_BARRACS, + BUILDING_ARCHERY_RANGE + }; + const char *buildingNames[] = { + "House", + "Granary", + "Warehouse", + "Market", + "Mill", + "Farm", + "Barracks", + "Archery Range" + }; + i32 numBuildings = sizeof(buildingOrder) / sizeof(*buildingOrder); + + switch (input->state) { + case INPUT_NONE: + case INPUT_BUILDING: + bzUISetParentLayout(UI, (BzUILayout) { + .type = BZ_UI_LAYOUT_FLEX_BOX, + .flags = BZ_UI_FLEX_DIR_ROW | BZ_UI_FLEX_ALIGN_CENTER | BZ_UI_FLEX_JUSTIFY_START + }); + for (i32 i = 0; i < numBuildings; i++) { + BuildingType buildingType = buildingOrder[i]; + Rectangle rec = bzTilesetGetTileRegion(tileset, getBuildingTile(buildingType)); + // Adjust for size + i32 sizeX = 1, sizeY = 1; + getBuildingSize(buildingType, &sizeX, &sizeY); + rec.width *= sizeX; + rec.height *= sizeY; + Texture2D tex = tileset->tiles; + bool selected = input->building == buildingOrder[i]; + uiGameBuild(buildingNames[i], rec, tex, &selected); + if (selected) { + input->building = buildingOrder[i]; + input->state = INPUT_BUILDING; + } + } + break; + case INPUT_SELECTED_UNITS: + break; + case INPUT_SELECTED_OBJECT: + break; + case INPUT_SELECTED_BUILDING: + break; + } + + + bzUISetDebugMode(UI, true); bzUIEnd(UI); + bzUISetDebugMode(UI, false); } static void renderPauseMenu(Game *game, float dt) { i32 width = GetScreenWidth(); diff --git a/game/ui_widgets.c b/game/ui_widgets.c index 3e49200..6770b72 100644 --- a/game/ui_widgets.c +++ b/game/ui_widgets.c @@ -239,5 +239,79 @@ void uiGameResCount(i32 amount, i32 capacity, Rectangle icon, Texture2D texture) .tintActive = WHITE, }); + bzUIPopParent(UI); +} + +void uiGameBuild(const char *label, Rectangle rec, Texture2D tex, bool *selected) { + f32 scl = uiGetScale(); + BzUINode *btn = bzUINodeMake(UI, bzUIKeyFromString(label), &(BzUINodeDesc) { + .flags = BZ_UI_CLICKABLE | BZ_UI_ALIGN_CENTER | BZ_UI_DRAW_BORDER, + .margin[BZ_UI_AXIS_X] = 10.0f * scl, + .semanticSize[BZ_UI_AXIS_X] = {BZ_UI_SIZE_CHILD_MAX}, + .semanticSize[BZ_UI_AXIS_Y] = {BZ_UI_SIZE_CHILD_SUM}, + }); + + BzUIInteraction inter = bzUIGetInteraction(UI, btn); + + Color bgColor = DARKBROWN; + if (*selected || inter.hovering) + bgColor = BROWN; + if (inter.clicked) + *selected = true; + + bzUISetBackgroundStyle(UI, btn, (BzUIBackgroundStyle) { + .roundness = 0.2f, + .active = bgColor, + .normal = bgColor, + .hover = bgColor, + }); + bzUISetBorderStyle(UI, btn, (BzUIBorderStyle) { + .roundness = 0.2f, + .thickness = 5.0f * scl, + .normal = BLACK, + .hover = BLACK, + .active = BLACK, + }); + bzUIPushParent(UI, btn); + bzUISetParentLayout(UI, (BzUILayout) { + .type = BZ_UI_LAYOUT_FLEX_BOX, + .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_ALIGN_CENTER | BZ_UI_FLEX_JUSTIFY_START + }); + + BzUINode *tileSprite = bzUINodeMake(UI, bzUIGetUniqueKey(UI), &(BzUINodeDesc) { + .flags = BZ_UI_DRAW_SPRITE, + .semanticSize[BZ_UI_AXIS_X] = {BZ_UI_SIZE_PIXELS, rec.width * 5 * scl}, + .semanticSize[BZ_UI_AXIS_Y] = {BZ_UI_SIZE_PIXELS, rec.height * 5 * scl}, + }); + bzUISetSpriteStyle(UI, tileSprite, (BzUISpriteStyle) { + .texture = tex, + .rec = rec, + .tintNormal = WHITE, + .tintHover = WHITE, + .tintActive = WHITE, + }); + + BzUINode *labelDisplay = bzUINodeMake(UI, bzUIGetUniqueKey(UI), &(BzUINodeDesc) { + .flags = BZ_UI_DRAW_TEXT | BZ_UI_DRAW_TEXT_SHADOW, + .semanticSize[BZ_UI_AXIS_X] = {BZ_UI_SIZE_FIT}, + .semanticSize[BZ_UI_AXIS_Y] = {BZ_UI_SIZE_FIT}, + }); + bzUISetTextStyle(UI, labelDisplay, (BzUITextStyle) { + .font = getFont(), + .fontSize = 25.0f * scl, + .fontSpacing = 1.0f * scl, + .normal = WHITE, + .hover = WHITE, + .active = WHITE, + .text = label + }); + bzUISetTextShadowStyle(UI, labelDisplay, (BzUITextShadowStyle) { + .offset = {1.0f * scl, 1.0f * scl}, + .normal = BLACK, + .hover = BLACK, + .active = BLACK + }); + + bzUIPopParent(UI); } diff --git a/game/ui_widgets.h b/game/ui_widgets.h index bd4e6f0..b826389 100644 --- a/game/ui_widgets.h +++ b/game/ui_widgets.h @@ -27,4 +27,6 @@ void uiSettingsSlider(const char *txt, f32 *value); void uiGameResCount(i32 amount, i32 capacity, Rectangle icon, Texture2D texture); +void uiGameBuild(const char *label, Rectangle rec, Texture2D tex, bool *selected); + #endif //PIXELDEFENSE_UI_WIDGETS_H