Link up menus
This commit is contained in:
parent
1fb3234815
commit
2e47a2f541
|
@ -12,6 +12,7 @@
|
|||
#include "../build/assets/materials/images.h"
|
||||
#include "../scene/render_plan.h"
|
||||
#include "../levels/levels.h"
|
||||
#include "../controls/controller.h"
|
||||
|
||||
#include "../build/assets/test_chambers/test_chamber_00/test_chamber_00.h"
|
||||
|
||||
|
@ -24,19 +25,22 @@
|
|||
#define PORTAL_LOGO_HEIGHT 47
|
||||
|
||||
struct Chapter gChapters[] = {
|
||||
{"CHAPTER 1", "Testchamber 00", images_chapter1_rgba_16b},
|
||||
{"CHAPTER 2", "Testchamber 04", images_chapter2_rgba_16b},
|
||||
{"CHAPTER 3", "Testchamber 08", images_chapter3_rgba_16b},
|
||||
{"CHAPTER 4", "Testchamber 10", images_chapter4_rgba_16b},
|
||||
{"CHAPTER 5", "Testchamber 13", images_chapter5_rgba_16b},
|
||||
{"CHAPTER 6", "Testchamber 14", images_chapter6_rgba_16b},
|
||||
{"CHAPTER 7", "Testchamber 15", images_chapter7_rgba_16b},
|
||||
{"CHAPTER 8", "Testchamber 16", images_chapter8_rgba_16b},
|
||||
{"CHAPTER 9", "Testchamber 17", images_chapter9_rgba_16b},
|
||||
{"CHAPTER 10", "Testchamber 18", images_chapter10_rgba_16b},
|
||||
{"CHAPTER 11", "Testchamber 19", images_chapter11_rgba_16b},
|
||||
{"CHAPTER 1", "Testchamber 00", images_chapter1_rgba_16b, 0},
|
||||
{"CHAPTER 2", "Testchamber 04", images_chapter2_rgba_16b, 2},
|
||||
{"CHAPTER 3", "Testchamber 08", images_chapter3_rgba_16b, 4},
|
||||
{"CHAPTER 4", "Testchamber 10", images_chapter4_rgba_16b, 6},
|
||||
{"CHAPTER 5", "Testchamber 13", images_chapter5_rgba_16b, -1},
|
||||
{"CHAPTER 6", "Testchamber 14", images_chapter6_rgba_16b, -1},
|
||||
{"CHAPTER 7", "Testchamber 15", images_chapter7_rgba_16b, -1},
|
||||
{"CHAPTER 8", "Testchamber 16", images_chapter8_rgba_16b, -1},
|
||||
{"CHAPTER 9", "Testchamber 17", images_chapter9_rgba_16b, -1},
|
||||
{"CHAPTER 10", "Testchamber 18", images_chapter10_rgba_16b, -1},
|
||||
{"CHAPTER 11", "Testchamber 19", images_chapter11_rgba_16b, -1},
|
||||
{NULL, NULL, NULL},
|
||||
};
|
||||
|
||||
#define CHAPTER_COUNT (sizeof(gChapters) / sizeof(*gChapters))
|
||||
|
||||
Gfx portal_logo_gfx[] = {
|
||||
gsSPTextureRectangle(
|
||||
PORTAL_LOGO_X << 2,
|
||||
|
@ -72,10 +76,44 @@ Gfx portal_logo_gfx[] = {
|
|||
gsSPEndDisplayList(),
|
||||
};
|
||||
|
||||
struct Coloru8 gSelectionOrange = {255, 156, 0, 255};
|
||||
struct Coloru8 gSelectionGray = {201, 201, 201, 255};
|
||||
|
||||
void menuSetRenderColor(struct RenderState* renderState, int isSelected, struct Coloru8* selected, struct Coloru8* defaultColor) {
|
||||
if (isSelected) {
|
||||
gDPSetEnvColor(renderState->dl++, selected->r, selected->g, selected->b, selected->a);
|
||||
} else {
|
||||
gDPSetEnvColor(renderState->dl++, defaultColor->r, defaultColor->g, defaultColor->b, defaultColor->a);
|
||||
}
|
||||
}
|
||||
|
||||
void landingMenuInit(struct LandingMenu* landingMenu) {
|
||||
landingMenu->newGameText = menuBuildText(&gDejaVuSansFont, "NEW GAME", 30, 132);
|
||||
landingMenu->loadGameText = menuBuildText(&gDejaVuSansFont, "LOAD GAME", 30, 148);
|
||||
landingMenu->optionsText = menuBuildText(&gDejaVuSansFont, "OPTIONS", 30, 164);
|
||||
|
||||
landingMenu->selectedItem = 0;
|
||||
}
|
||||
|
||||
enum MainMenuState landingMenuUpdate(struct LandingMenu* landingMenu) {
|
||||
if ((controllerGetDirectionDown(0) & ControllerDirectionUp) != 0 && landingMenu->selectedItem > 0) {
|
||||
--landingMenu->selectedItem;
|
||||
}
|
||||
|
||||
if ((controllerGetDirectionDown(0) & ControllerDirectionDown) != 0 && landingMenu->selectedItem < 2) {
|
||||
++landingMenu->selectedItem;
|
||||
}
|
||||
|
||||
if (controllerGetButtonDown(0, A_BUTTON)) {
|
||||
switch (landingMenu->selectedItem)
|
||||
{
|
||||
case 0:
|
||||
return MainMenuStateNewGame;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return MainMenuStateLanding;
|
||||
}
|
||||
|
||||
void landingMenuRender(struct LandingMenu* landingMenu, struct RenderState* renderState, struct GraphicsTask* task) {
|
||||
|
@ -86,8 +124,14 @@ void landingMenuRender(struct LandingMenu* landingMenu, struct RenderState* rend
|
|||
gSPDisplayList(renderState->dl++, ui_material_revert_list[PORTAL_LOGO_INDEX]);
|
||||
|
||||
gSPDisplayList(renderState->dl++, ui_material_list[DEJAVU_SANS_INDEX]);
|
||||
gDPPipeSync(renderState->dl++);
|
||||
menuSetRenderColor(renderState, landingMenu->selectedItem == 0, &gSelectionGray, &gColorWhite);
|
||||
gSPDisplayList(renderState->dl++, landingMenu->newGameText);
|
||||
gDPPipeSync(renderState->dl++);
|
||||
menuSetRenderColor(renderState, landingMenu->selectedItem == 1, &gSelectionGray, &gColorWhite);
|
||||
gSPDisplayList(renderState->dl++, landingMenu->loadGameText);
|
||||
gDPPipeSync(renderState->dl++);
|
||||
menuSetRenderColor(renderState, landingMenu->selectedItem == 2, &gSelectionGray, &gColorWhite);
|
||||
gSPDisplayList(renderState->dl++, landingMenu->optionsText);
|
||||
gSPDisplayList(renderState->dl++, ui_material_revert_list[DEJAVU_SANS_INDEX]);
|
||||
}
|
||||
|
@ -121,25 +165,35 @@ void chapterMenuInit(struct ChapterMenu* chapterMenu, int x, int y) {
|
|||
}
|
||||
|
||||
void chapterMenuSetChapter(struct ChapterMenu* chapterMenu, struct Chapter* chapter) {
|
||||
Gfx* dl = fontRender(
|
||||
&gDejaVuSansFont,
|
||||
chapter->chapter,
|
||||
chapterMenu->x,
|
||||
chapterMenu->y,
|
||||
chapterMenu->chapterText
|
||||
);
|
||||
gSPEndDisplayList(dl++);
|
||||
Gfx* dl;
|
||||
|
||||
if (chapter->chapter) {
|
||||
dl = fontRender(
|
||||
&gDejaVuSansFont,
|
||||
chapter->chapter,
|
||||
chapterMenu->x,
|
||||
chapterMenu->y,
|
||||
chapterMenu->chapterText
|
||||
);
|
||||
gSPEndDisplayList(dl++);
|
||||
}
|
||||
|
||||
dl = fontRender(
|
||||
&gDejaVuSansFont,
|
||||
chapter->testChamber,
|
||||
chapterMenu->x,
|
||||
chapterMenu->y + 14,
|
||||
chapterMenu->testChamberText
|
||||
);
|
||||
gSPEndDisplayList(dl++);
|
||||
if (chapter->testChamber) {
|
||||
dl = fontRender(
|
||||
&gDejaVuSansFont,
|
||||
chapter->testChamber,
|
||||
chapterMenu->x,
|
||||
chapterMenu->y + 14,
|
||||
chapterMenu->testChamberText
|
||||
);
|
||||
gSPEndDisplayList(dl++);
|
||||
}
|
||||
|
||||
romCopy(chapter->imageData, chapterMenu->imageBuffer, CHAPTER_IMAGE_SIZE);
|
||||
if (chapter->imageData) {
|
||||
romCopy(chapter->imageData, chapterMenu->imageBuffer, CHAPTER_IMAGE_SIZE);
|
||||
}
|
||||
|
||||
chapterMenu->chapter = chapter;
|
||||
}
|
||||
|
||||
#define NEW_GAME_LEFT 40
|
||||
|
@ -160,6 +214,44 @@ void newGameInit(struct NewGameMenu* newGameMenu) {
|
|||
|
||||
chapterMenuSetChapter(&newGameMenu->chapter0, &gChapters[0]);
|
||||
chapterMenuSetChapter(&newGameMenu->chapter1, &gChapters[1]);
|
||||
|
||||
newGameMenu->chapterOffset = 0;
|
||||
newGameMenu->selectedChapter = 0;
|
||||
}
|
||||
|
||||
enum MainMenuState newGameUpdate(struct NewGameMenu* newGameMenu) {
|
||||
if (controllerGetButtonDown(0, B_BUTTON)) {
|
||||
return MainMenuStateLanding;
|
||||
}
|
||||
|
||||
if (controllerGetButtonDown(0, A_BUTTON) && gChapters[newGameMenu->selectedChapter + 1].testChamberNumber >= 0) {
|
||||
struct Transform identityTransform;
|
||||
transformInitIdentity(&identityTransform);
|
||||
identityTransform.position.y = 1.0f;
|
||||
|
||||
levelQueueLoad(gChapters[newGameMenu->selectedChapter].testChamberNumber, &identityTransform, &gZeroVec);
|
||||
}
|
||||
|
||||
if ((controllerGetDirectionDown(0) & ControllerDirectionRight) != 0 &&
|
||||
newGameMenu->selectedChapter + 1 < CHAPTER_COUNT &&
|
||||
gChapters[newGameMenu->selectedChapter + 1].imageData) {
|
||||
newGameMenu->selectedChapter = newGameMenu->selectedChapter + 1;
|
||||
}
|
||||
|
||||
if ((controllerGetDirectionDown(0) & ControllerDirectionLeft) != 0 && newGameMenu->selectedChapter > 0) {
|
||||
newGameMenu->selectedChapter = newGameMenu->selectedChapter - 1;
|
||||
}
|
||||
|
||||
int nextChapterOffset = newGameMenu->selectedChapter & ~1;
|
||||
|
||||
if (nextChapterOffset != newGameMenu->chapterOffset) {
|
||||
newGameMenu->chapterOffset = nextChapterOffset;
|
||||
|
||||
chapterMenuSetChapter(&newGameMenu->chapter0, &gChapters[newGameMenu->chapterOffset]);
|
||||
chapterMenuSetChapter(&newGameMenu->chapter1, &gChapters[newGameMenu->chapterOffset + 1]);
|
||||
}
|
||||
|
||||
return MainMenuStateNewGame;
|
||||
}
|
||||
|
||||
void newGameRender(struct NewGameMenu* newGameMenu, struct RenderState* renderState, struct GraphicsTask* task) {
|
||||
|
@ -179,12 +271,14 @@ void newGameRender(struct NewGameMenu* newGameMenu, struct RenderState* renderSt
|
|||
gSPDisplayList(renderState->dl++, newGameMenu->cancelButton.outline);
|
||||
|
||||
gDPPipeSync(renderState->dl++);
|
||||
gDPSetEnvColor(renderState->dl++, 0, 0, 0, 255);
|
||||
menuSetRenderColor(renderState, newGameMenu->selectedChapter == newGameMenu->chapterOffset, &gSelectionOrange, &gColorBlack);
|
||||
gSPDisplayList(renderState->dl++, newGameMenu->chapter0.border);
|
||||
|
||||
gDPPipeSync(renderState->dl++);
|
||||
gDPSetEnvColor(renderState->dl++, 0, 0, 0, 255);
|
||||
gSPDisplayList(renderState->dl++, newGameMenu->chapter1.border);
|
||||
if (newGameMenu->chapter1.chapter->imageData) {
|
||||
gDPPipeSync(renderState->dl++);
|
||||
menuSetRenderColor(renderState, newGameMenu->selectedChapter != newGameMenu->chapterOffset, &gSelectionOrange, &gColorBlack);
|
||||
gSPDisplayList(renderState->dl++, newGameMenu->chapter1.border);
|
||||
}
|
||||
|
||||
gSPDisplayList(renderState->dl++, ui_material_revert_list[SOLID_ENV_INDEX]);
|
||||
|
||||
|
@ -193,15 +287,17 @@ void newGameRender(struct NewGameMenu* newGameMenu, struct RenderState* renderSt
|
|||
gSPDisplayList(renderState->dl++, newGameMenu->cancelButton.text);
|
||||
|
||||
gDPPipeSync(renderState->dl++);
|
||||
gDPSetEnvColor(renderState->dl++, 255, 255, 255, 255);
|
||||
menuSetRenderColor(renderState, newGameMenu->selectedChapter == newGameMenu->chapterOffset, &gSelectionOrange, &gColorWhite);
|
||||
gSPDisplayList(renderState->dl++, newGameMenu->chapter0.chapterText);
|
||||
gSPDisplayList(renderState->dl++, newGameMenu->chapter0.testChamberText);
|
||||
|
||||
gDPPipeSync(renderState->dl++);
|
||||
gDPSetEnvColor(renderState->dl++, 255, 255, 255, 255);
|
||||
gSPDisplayList(renderState->dl++, newGameMenu->chapter1.chapterText);
|
||||
gSPDisplayList(renderState->dl++, newGameMenu->chapter1.testChamberText);
|
||||
gSPDisplayList(renderState->dl++, ui_material_revert_list[DEJAVU_SANS_INDEX]);
|
||||
if (newGameMenu->chapter1.chapter->imageData) {
|
||||
gDPPipeSync(renderState->dl++);
|
||||
menuSetRenderColor(renderState, newGameMenu->selectedChapter != newGameMenu->chapterOffset, &gSelectionOrange, &gColorWhite);
|
||||
gSPDisplayList(renderState->dl++, newGameMenu->chapter1.chapterText);
|
||||
gSPDisplayList(renderState->dl++, newGameMenu->chapter1.testChamberText);
|
||||
gSPDisplayList(renderState->dl++, ui_material_revert_list[DEJAVU_SANS_INDEX]);
|
||||
}
|
||||
|
||||
graphicsCopyImage(
|
||||
renderState, newGameMenu->chapter0.imageBuffer,
|
||||
|
@ -213,15 +309,17 @@ void newGameRender(struct NewGameMenu* newGameMenu, struct RenderState* renderSt
|
|||
gColorWhite
|
||||
);
|
||||
|
||||
graphicsCopyImage(
|
||||
renderState, newGameMenu->chapter1.imageBuffer,
|
||||
84, 48,
|
||||
0, 0,
|
||||
newGameMenu->chapter1.x + 5,
|
||||
newGameMenu->chapter1.y + 32,
|
||||
84, 48,
|
||||
gColorWhite
|
||||
);
|
||||
if (newGameMenu->chapter1.chapter->imageData) {
|
||||
graphicsCopyImage(
|
||||
renderState, newGameMenu->chapter1.imageBuffer,
|
||||
84, 48,
|
||||
0, 0,
|
||||
newGameMenu->chapter1.x + 5,
|
||||
newGameMenu->chapter1.y + 32,
|
||||
84, 48,
|
||||
gColorWhite
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void mainMenuReadCamera(struct MainMenu* mainMenu) {
|
||||
|
@ -236,6 +334,8 @@ void mainMenuInit(struct MainMenu* mainMenu) {
|
|||
landingMenuInit(&mainMenu->landingMenu);
|
||||
newGameInit(&mainMenu->newGameMenu);
|
||||
|
||||
mainMenu->state = MainMenuStateLanding;
|
||||
|
||||
mainMenuReadCamera(mainMenu);
|
||||
|
||||
gScene.camera.fov = 56.0f;
|
||||
|
@ -254,6 +354,15 @@ void mainMenuUpdate(struct MainMenu* mainMenu) {
|
|||
|
||||
mainMenuReadCamera(mainMenu);
|
||||
sceneAnimatorUpdate(&gScene.animator);
|
||||
|
||||
switch (mainMenu->state) {
|
||||
case MainMenuStateLanding:
|
||||
mainMenu->state = landingMenuUpdate(&mainMenu->landingMenu);
|
||||
break;
|
||||
case MainMenuStateNewGame:
|
||||
mainMenu->state = newGameUpdate(&mainMenu->newGameMenu);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
extern Lights1 gSceneLights;
|
||||
|
@ -279,6 +388,12 @@ void mainMenuRender(struct MainMenu* mainMenu, struct RenderState* renderState,
|
|||
renderPlanBuild(&renderPlan, &gScene, renderState);
|
||||
renderPlanExecute(&renderPlan, &gScene, staticMatrices, renderState);
|
||||
|
||||
// landingMenuRender(&mainMenu->landingMenu, renderState, task);
|
||||
newGameRender(&mainMenu->newGameMenu, renderState, task);
|
||||
switch (mainMenu->state) {
|
||||
case MainMenuStateLanding:
|
||||
landingMenuRender(&mainMenu->landingMenu, renderState, task);
|
||||
break;
|
||||
case MainMenuStateNewGame:
|
||||
newGameRender(&mainMenu->newGameMenu, renderState, task);
|
||||
break;
|
||||
}
|
||||
}
|
|
@ -4,10 +4,16 @@
|
|||
#include "../graphics/graphics.h"
|
||||
#include "./menu.h"
|
||||
|
||||
enum MainMenuState {
|
||||
MainMenuStateLanding,
|
||||
MainMenuStateNewGame,
|
||||
};
|
||||
|
||||
struct LandingMenu {
|
||||
Gfx* newGameText;
|
||||
Gfx* loadGameText;
|
||||
Gfx* optionsText;
|
||||
short selectedItem;
|
||||
};
|
||||
|
||||
void landingMenuInit(struct LandingMenu* landingMenu);
|
||||
|
@ -17,6 +23,7 @@ struct Chapter {
|
|||
char* chapter;
|
||||
char* testChamber;
|
||||
void* imageData;
|
||||
int testChamberNumber;
|
||||
};
|
||||
|
||||
struct ChapterMenu {
|
||||
|
@ -42,12 +49,17 @@ struct NewGameMenu {
|
|||
|
||||
struct ChapterMenu chapter0;
|
||||
struct ChapterMenu chapter1;
|
||||
|
||||
short selectedChapter;
|
||||
short chapterOffset;
|
||||
};
|
||||
|
||||
void newGameInit(struct NewGameMenu* newGameMenu);
|
||||
enum MainMenuState newGameUpdate(struct NewGameMenu* newGameMenu);
|
||||
void newGameRender(struct NewGameMenu* newGameMenu, struct RenderState* renderState, struct GraphicsTask* task);
|
||||
|
||||
struct MainMenu {
|
||||
enum MainMenuState state;
|
||||
struct LandingMenu landingMenu;
|
||||
struct NewGameMenu newGameMenu;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue