#include "ui.h" #include "app.h" #include "util/vector.h" #include #ifndef RGB #define RGB(r, g, b) ((r) | ((g) << 8) | ((b) << 16)) #endif static void _ui_Action_ResumeGame(System_UI *sys, ui_Part *part, uintptr_t data) { ui_Action_PopState(sys, part, data); sys->super->paused = false; } static void _ui_Action_ReturnToTitle(System_UI *sys, ui_Part *part, uintptr_t data) { while (vector_Size(sys->state) > 0 && ui_CurrentState(sys) != ui_TitleMenu) { INFO("popping \"%s\"", ui_StateTitle[ui_CurrentState(sys)]); ui_Action_PopState(sys, part, data); } sys->super->paused = false; if (vector_Size(sys->state) == 0) WARN("new state stack is now empty, ohno"); sys->super->clear_color = RGB(40, 40, 40); // Clear the app // see app_file.c:233 entity_Clear(sys->super->entity); particle_Clear(sys->super->particle); sys->super->camera->target = NULL; } static void _ui_Action_SelectLevel(System_UI *sys, ui_Part *part, uintptr_t data) { while (vector_Size(sys->state) > 0 && ui_CurrentState(sys) != ui_TitleMenu) { INFO("popping \"%s\"", ui_StateTitle[ui_CurrentState(sys)]); ui_Action_PopState(sys, part, data); } sys->super->paused = false; if (vector_Size(sys->state) == 0) WARN("new state stack is now empty, ohno"); const char *level = (const char *)data; app_QueueLoadLevel(sys->super, level); ui_Action_PushState(sys, part, (uintptr_t)ui_Running); } static void _ui_Action_StartFromBeginning(System_UI *sys, ui_Part *part, uintptr_t data) { _ui_Action_SelectLevel(sys, part, (uintptr_t) "intro.txt"); } static void _ui_Action_Quit(System_UI *sys, ui_Part *part, uintptr_t data) { sys->super->wantQuit = true; } #define PUSH_UI(part) \ _p0 = (part); \ vector_Push(p, &_p0); void ui_RebuildUI(System_UI *sys) { vector_Vector *p; ui_Part _p0; // Title Menu p = sys->parts[ui_TitleMenu]; vector_Clear(p); PUSH_UI(ui_Button_New( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0, 250), vec2(500, 50)), "Start from Beginning", &_ui_Action_StartFromBeginning, 0)) PUSH_UI(ui_Button_New( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0, 250 + (50 + UI_PADDING)), vec2(500, 50)), "Select Level", &ui_Action_PushState, ui_SceneSelect)) PUSH_UI(ui_Button_New( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0 - (500 - UI_PADDING) / 4.0 - UI_PADDING / 2.0, 250 + 2 * (50 + UI_PADDING)), vec2((500 - UI_PADDING) / 2.0, 40)), "Options", &ui_Action_PushState, (uintptr_t)ui_Options)) PUSH_UI(ui_Button_New( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0 + (500 - UI_PADDING) / 4.0 + UI_PADDING / 2.0, 250 + 2 * (50 + UI_PADDING)), vec2((500 - UI_PADDING) / 2.0, 40)), "Quit", &_ui_Action_Quit, 0)) // Select Level p = sys->parts[ui_SceneSelect]; vector_Clear(p); PUSH_UI(ui_Button_NewLeftAligned( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0, 280), vec2(400, 40)), "Introduction", &_ui_Action_SelectLevel, (uintptr_t) "intro.txt")); PUSH_UI(ui_Button_NewLeftAligned( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0, 280 + (40 + UI_PADDING / 2.0)), vec2(400, 40)), "Scene 1", &_ui_Action_SelectLevel, (uintptr_t) "level1.txt")); PUSH_UI(ui_Button_NewLeftAligned( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0, 280 + 2 * (40 + UI_PADDING / 2.0)), vec2(400, 40)), "Scene 2", &_ui_Action_SelectLevel, (uintptr_t) "level2.txt")); PUSH_UI(ui_Button_NewLeftAligned( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0, 280 + 3 * (40 + UI_PADDING / 2.0)), vec2(400, 40)), "Scene 3", &_ui_Action_SelectLevel, (uintptr_t) "level3.txt")); PUSH_UI(ui_Button_NewLeftAligned( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0 + 100, 280 + 3 * (40 + UI_PADDING / 2.0) + (40 + UI_PADDING)), vec2(200, 40)), "Return", &ui_Action_PopState, 0)); // Paused p = sys->parts[ui_Paused]; vector_Clear(p); PUSH_UI(ui_Button_New( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0, 300), vec2(400, 40)), "Resume Game", &_ui_Action_ResumeGame, 0)) PUSH_UI(ui_Button_New( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0, 300 + (40 + UI_PADDING)), vec2(400, 40)), "Reselect Level", &ui_Action_PushState, (uintptr_t)ui_SceneSelect)) PUSH_UI(ui_Button_New( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0, 300 + 2 * (40 + UI_PADDING)), vec2(400, 40)), "Options", &ui_Action_PushState, (uintptr_t)ui_Options)) PUSH_UI(ui_Button_New( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0, 300 + 3 * (40 + UI_PADDING) + UI_PADDING), vec2(400, 40)), "Return to Title", &_ui_Action_ReturnToTitle, 0)) // Options p = sys->parts[ui_Options]; vector_Clear(p); PUSH_UI(ui_Button_New( box2_FromCenter(vec2(SCREEN_WIDTH / 2.0, 300), vec2(600, 50)), "Return", &ui_Action_PopState, 0)) }