Link up menus

This commit is contained in:
James Lambert 2023-04-22 20:51:19 -06:00
parent 1fb3234815
commit 2e47a2f541
2 changed files with 176 additions and 49 deletions

View file

@ -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;
}
}

View file

@ -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;
};