#include "systems.h" #include "../game_state.h" #include "../input.h" #include "../map_init.h" #include "../ui_widgets.h" void drawGameUI(Game *game, f32 dt) { // UI i32 width = GetScreenWidth(); i32 height = GetScreenHeight(); bzUIBegin(UI, width, height); bzUISetParentLayout(UI, (BzUILayout) { .type = BZ_UI_LAYOUT_FLEX_BOX, .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_JUSTIFY_SPACE_BETWEEN | BZ_UI_FLEX_ALIGN_CENTER }); // top bar BzUINode *topBar = bzUINodeMake(UI, bzUIGetUniqueKey(UI), &(BzUINodeDesc) { .semanticSize[BZ_UI_AXIS_X] = {BZ_UI_SIZE_AS_PARENT}, .semanticSize[BZ_UI_AXIS_Y] = {BZ_UI_SIZE_CHILD_MAX}, }); bzUIPushParent(UI, topBar); 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 }); Color topBarBG = {0, 0, 0, 50}; bzUISetBackgroundStyle(UI, topBar, (BzUIBackgroundStyle) { .normal = topBarBG, .hover = topBarBG, .active = topBarBG, }); BzTileset *tileset = &game->tileset; Rectangle woodRec = bzTilesetGetTileRegion(tileset, getEntityTile(ENTITY_WOOD)); Rectangle stoneRec = bzTilesetGetTileRegion(tileset, getEntityTile(ENTITY_STONE)); Rectangle foodRec = bzTilesetGetTileRegion(tileset, getEntityTile(ENTITY_APPLE)); Rectangle goldRec = bzTilesetGetTileRegion(tileset, getEntityTile(ENTITY_GOLD)); Rectangle popRec = bzTilesetGetTileRegion(tileset, getEntityTile(ENTITY_POP)); uiGameResCount(100, -1, woodRec, tileset->tiles); uiGameResCount(100, -1, stoneRec, tileset->tiles); uiGameResCount(100, -1, foodRec, tileset->tiles); uiGameResCount(250, -1, goldRec, tileset->tiles); uiGameResCount(1, 10, popRec, tileset->tiles); bzUIPopParent(UI); 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_BARRACKS, BUILDING_ARCHERY_RANGE }; const char *buildingNames[] = { "House", "Granary", "Warehouse", "Market", "Mill", "Farm", "Barracks", "Archery Range" }; i32 numBuildings = sizeof(buildingOrder) / sizeof(*buildingOrder); BzUINode *menu = NULL; switch (input->state) { case INPUT_NONE: case INPUT_BUILDING: menu = bzUINodeMake(UI, bzUIGetUniqueKey(UI), &(BzUINodeDesc) { .semanticSize[BZ_UI_AXIS_X] = {BZ_UI_SIZE_AS_PARENT}, .semanticSize[BZ_UI_AXIS_Y] = {BZ_UI_SIZE_CHILD_MAX}, .margin[BZ_UI_AXIS_Y * 2] = 5.0f * uiGetScale(), }); bzUIPushParent(UI, menu); 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; } bzUIEnd(UI); } void drawPauseUI(Game *game, f32 dt) { i32 width = GetScreenWidth(); i32 height = GetScreenHeight(); bzUIBegin(UI, width, height); bzUISetParentLayout(UI, (BzUILayout) { .type = BZ_UI_LAYOUT_FLEX_BOX, .flags = BZ_UI_FLEX_DIR_COLUMN }); uiPushDivParentPercentage(1.0f, 0.4f); bzUISetParentLayout(UI, (BzUILayout) { .type = BZ_UI_LAYOUT_FLEX_BOX, .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_JUSTIFY_CENTER | BZ_UI_FLEX_ALIGN_CENTER }); uiMainMenuLabel("Paused"); bzUIPopParent(UI); uiPushDivParentPercentage(1.0f, 0.6f); bzUISetParentLayout(UI, (BzUILayout) { .type = BZ_UI_LAYOUT_FLEX_BOX, .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_ALIGN_CENTER }); if (uiMainMenuButton("Resume")) { setScreen(game, SCREEN_GAME); } if (uiMainMenuButton("Exit")) { setScreen(game, SCREEN_MAIN_MENU); unloadMap(game); loadMap(game, "assets/maps/main_menu_01.tmj"); } bzUIPopParent(UI); bzUIEnd(UI); } void drawMainMenuUI(Game *game, f32 dt) { i32 width = GetScreenWidth(); i32 height = GetScreenHeight(); game->camera.zoom = 3 * uiGetScale(); bzUIBegin(UI, width, height); bzUISetParentLayout(UI, (BzUILayout) { .type = BZ_UI_LAYOUT_FLEX_BOX, .flags = BZ_UI_FLEX_DIR_COLUMN }); uiPushDivParentPercentage(1.0f, 0.4f); bzUISetParentLayout(UI, (BzUILayout) { .type = BZ_UI_LAYOUT_FLEX_BOX, .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_JUSTIFY_CENTER | BZ_UI_FLEX_ALIGN_CENTER }); uiMainMenuLabel("Pixel Defense"); bzUIPopParent(UI); uiPushDivParentPercentage(1.0f, 0.6f); bzUISetParentLayout(UI, (BzUILayout) { .type = BZ_UI_LAYOUT_FLEX_BOX, .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_ALIGN_CENTER }); if (uiMainMenuButton("Play")) { setScreen(game, SCREEN_GAME); unloadMap(game); loadMap(game, "assets/maps/tree_test.tmj"); } if (uiMainMenuButton("Settings")) { setScreen(game, SCREEN_SETTINGS); } if (uiMainMenuButton("Exit")) { bzGameExit(); } bzUIPopParent(UI); bzUIEnd(UI); } void drawSettingsUI(Game *game, f32 dt) { i32 width = GetScreenWidth(); i32 height = GetScreenHeight(); game->camera.zoom = 3 * uiGetScale(); bzUIBegin(UI, width, height); bzUISetParentLayout(UI, (BzUILayout) { .type = BZ_UI_LAYOUT_FLEX_BOX, .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_JUSTIFY_CENTER | BZ_UI_FLEX_ALIGN_CENTER }); bzUIPushDiv(UI, (BzUISize) { BZ_UI_SIZE_REL_PARENT, 0.8f}, (BzUISize) { BZ_UI_SIZE_REL_PARENT, 0.8f}); bzUISetParentLayout(UI, (BzUILayout) { .type = BZ_UI_LAYOUT_FLEX_BOX, .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_JUSTIFY_CENTER | BZ_UI_FLEX_ALIGN_CENTER }); static Options opts; if (game->screenPrevFrame != SCREEN_SETTINGS) opts = game->options; uiSettingsLabel("Video"); uiSettingsCheckbox("Fullscreen", &opts.fullscreen); uiSettingsCheckbox("V-Sync", &opts.vsync); uiSettingsLabel("Audio"); uiSettingsSlider("Master: ", &opts.master); uiSettingsSlider("Music: ", &opts.music); uiSettingsSlider("Sound: ", &opts.sound); bzUIPopParent(UI); bzUIPushDiv(UI, (BzUISize) {BZ_UI_SIZE_REL_PARENT, 0.8f}, (BzUISize) {BZ_UI_SIZE_REL_PARENT, 0.2f}); bzUISetParentLayout(UI, (BzUILayout) { .type = BZ_UI_LAYOUT_FLEX_BOX, .flags = BZ_UI_FLEX_DIR_ROW | BZ_UI_FLEX_JUSTIFY_CENTER | BZ_UI_FLEX_ALIGN_CENTER }); if (uiSettingsButton("Back")) { setScreen(game, SCREEN_MAIN_MENU); } if (uiSettingsButton("Reset")) { opts = game->options; } if (uiSettingsButton("Apply")) { game->options = opts; setScreen(game, SCREEN_MAIN_MENU); } bzUIEnd(UI); }