Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
FROM ubuntu:noble

RUN apt-get update && \
apt-get install -y binutils make git python3 python3-venv ninja-build 7zip bchunk && \
apt-get install -y build-essential binutils make git python3 python3-venv ninja-build 7zip bchunk && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN echo "deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ questing main universe multiverse restricted" > /etc/apt/sources.list.d/questing.list && \
Expand Down
1 change: 1 addition & 0 deletions config/symbols.savemenu.us.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
func_801D1774 = 0x801D1774;
func_801D1BAC = 0x801D1BAC;
g_MenuStartMode = 0x801E2CF8;
D_801E2E64 = 0x801E2E64;
menus = 0x801E379C; // size:0x90
D_801E3D80 = 0x801E3D80; // size:0x24
4 changes: 2 additions & 2 deletions src/menu/savemenu.c
Original file line number Diff line number Diff line change
Expand Up @@ -632,8 +632,8 @@ static s16 func_801D2A34(s32 save_id) {
return ret;
}

s32 D_801E2CF4 = 0xFF; // used by title.c
u32 D_801E2CF8 = 0; // used by title.c
s32 D_801E2CF4 = 0xFF; // used by title.c
StartMenuMode g_MenuStartMode = START_MENU_MODE_SELECT_SLOT; // used by title.c

unsigned char D_801E2CFC[][0x24] = {
_S("Load"),
Expand Down
12 changes: 11 additions & 1 deletion src/menu/savemenu.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
#include <game.h>

typedef enum {
START_MENU_MODE_SELECT_SLOT = 0,
START_MENU_MODE_SELECT_FILE = 1,
START_MENU_MODE_CHECKING_FILES = 2,
START_MENU_MODE_CHECKING_WAIT = 3,
START_MENU_MODE_LOADING = 4,
START_MENU_MODE_FORMAT_PROMPT = 6,
START_MENU_MODE_TITLE = 7,
} StartMenuMode;

typedef struct {
// this whole thing might be a D_801E379C[6]
/* 0x00 */ Unk80026448 D_801E379C[2];
Expand All @@ -22,7 +32,7 @@ extern s32 D_801DEEF4;
extern RECT D_801DEEFC;
extern u8 D_801E2EAC[];
extern const char* D_801E2CB8[];
extern u32 D_801E2CF8;
extern StartMenuMode g_MenuStartMode;
extern s32 D_801E3440;
extern s32 D_801E3530;
extern RECT D_801E3650[3];
Expand Down
75 changes: 39 additions & 36 deletions src/menu/title.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
//! PSYQ=3.3 CC1=2.7.2
#include <psxsdk/libapi.h>
#include "savemenu.h"

extern s32 D_801E2CF4;
Expand Down Expand Up @@ -189,7 +190,7 @@ void func_801D370C(s32 x, s32 y, s32 slot_no) {

static void func_801D39C4(void) {
D_801E3698 = 0;
D_801E2CF8 = 7;
g_MenuStartMode = START_MENU_MODE_TITLE;
func_8001DEF0(D_801E368C);
func_80025D14(D_801D4EDC, 0x380, 0, 0, 0x1E0);
DrawSync(0);
Expand All @@ -201,6 +202,7 @@ static void func_801D39C4(void) {
func_801D19C4();
}

// title screen handler
static s32 func_801D3AB0(s32 arg0) {
RECT sp38;
RECT rect;
Expand All @@ -214,8 +216,9 @@ static s32 func_801D3AB0(s32 arg0) {
s32 temp_s2;
s32 var_s3;

if ((D_801E2CF8 < 2 || D_801E2CF8 == 7) && D_801E3D54 != 2 &&
D_801E3D54 != 0) {
if ((g_MenuStartMode < START_MENU_MODE_CHECKING_FILES ||
g_MenuStartMode == START_MENU_MODE_TITLE) &&
D_801E3D54 != 2 && D_801E3D54 != 0) {
func_801D3668(arg0);
}
func_80026B5C(0x80);
Expand All @@ -229,8 +232,8 @@ static s32 func_801D3AB0(s32 arg0) {
}
}
func_8001F6B4();
switch (D_801E2CF8) {
case 0:
switch (g_MenuStartMode) {
case START_MENU_MODE_SELECT_SLOT:
func_8001EB2C(
D_801E3668.x - 18, D_801E3668.y + 6 + D_801E3D80[0].unkB * 12);
func_80026F44(10, 11, D_801E2CFC[1], 7);
Expand All @@ -245,9 +248,9 @@ static s32 func_801D3AB0(s32 arg0) {
func_80026A34(0, 1, 0x7F, &rect);
func_8001E040(&D_801E3668);
break;
case 1:
case START_MENU_MODE_SELECT_FILE:
if (!D_801E8F38[D_801E3D80[0].unkB][0]) {
D_801E2CF8 = 0;
g_MenuStartMode = START_MENU_MODE_SELECT_SLOT;
} else {
func_800269D0();
func_800269C0(D_801E3D58 * 0x5000 + D_801D4EDC);
Expand Down Expand Up @@ -288,9 +291,9 @@ static s32 func_801D3AB0(s32 arg0) {
func_800269E8();
}
break;
case 2:
case 3:
if (D_801E2CF8 == 2) {
case START_MENU_MODE_CHECKING_FILES:
case START_MENU_MODE_CHECKING_WAIT:
if (g_MenuStartMode == START_MENU_MODE_CHECKING_FILES) {
var_s2 = 0x40;
var_s1 = 0x20;
var_s0_2 = 0xA0;
Expand All @@ -312,15 +315,15 @@ static s32 func_801D3AB0(s32 arg0) {
func_8001DE0C(&sp38, 112, 0x6D, 0x8C, 0x18);
func_8001E040(&sp38);
break;
case 4:
case START_MENU_MODE_LOADING:
if (D_801E3D54 != 2) {
temp_s1 = func_80026B70(D_801E2CFC[6]) + 0x10;
func_80026F44(190 - temp_s1 / 2, 0x73, D_801E2CFC[6], 7);
func_8001DE0C(&sp38, 0xB6 - temp_s1 / 2, 0x6D, temp_s1, 24);
func_8001E040(&sp38);
}
break;
case 6:
case START_MENU_MODE_FORMAT_PROMPT:
if (arg0 & 2) {
func_8001EB2C(D_801E3668.x - 0x12,
D_801E3668.y + 6 + D_801E3D80[0].unkB * 12);
Expand All @@ -346,7 +349,7 @@ static s32 func_801D3AB0(s32 arg0) {
&sp38, 0xB6 - temp_s2 / 2, D_801E3668.h + 0x5D, temp_s2, 0x30);
func_8001E040(&sp38);
break;
case 7:
case START_MENU_MODE_TITLE:
func_8001EB2C(
D_801E3668.x - 0x12, D_801E3668.y + 6 + D_801E3DEC[1].unkB * 12);
func_80026F44(
Expand Down Expand Up @@ -385,16 +388,16 @@ static s32 func_801D3AB0(s32 arg0) {
D_80062F24.ft4++;
break;
}
if (D_801E2CF8 != 7) {
if (g_MenuStartMode != START_MENU_MODE_TITLE) {
func_80026F44(0x126, 11, D_801E2CFC[0], 7);
func_8001DE0C(&sp38, 0x116, 5, 0x56, 0x18);
func_8001E040(&sp38);
func_8001DE0C(&sp38, 0, 5, 0x16C, 0x18);
func_8001E040(&sp38);
}
if (!(func_8001F6B4() & 0xFF) && D_801E3D54 == 1) {
switch (D_801E2CF8) {
case 0:
switch (g_MenuStartMode) {
case START_MENU_MODE_SELECT_SLOT:
if (D_80062D7C & 0x20) {
temp_v1_2 = D_801E3D80[0].unkB;
if (temp_v1_2 >= 2) {
Expand All @@ -406,12 +409,12 @@ static s32 func_801D3AB0(s32 arg0) {
if (D_801E8F38[temp_v1_2][0]) {
func_801D2B58(1);
if (D_801E8F38[D_801E3D80[0].unkB][2]) {
D_801E2CF8 = 6;
g_MenuStartMode = START_MENU_MODE_FORMAT_PROMPT;
func_80026448(&D_801E3D80[6], 0, 1, 1, 2, 0, 0, 1, 2, 0,
0, 0, 1, 0);
} else {
D_801E3F18 = 10;
D_801E2CF8 = 2;
g_MenuStartMode = START_MENU_MODE_CHECKING_FILES;
D_801E3F20 = 0;
D_801E3F14 = 0;
D_80062F3C = 0;
Expand All @@ -425,12 +428,12 @@ static s32 func_801D3AB0(s32 arg0) {
}
} else if (D_80062D7C & 0x40) {
func_801D2B58(4);
D_801E2CF8 = 7;
g_MenuStartMode = START_MENU_MODE_TITLE;
} else {
func_800264A8(&D_801E3D80[0]);
}
break;
case 1:
case START_MENU_MODE_SELECT_FILE:
var_s1 = D_801E3D80[1].unkF;
func_801D2DA8(&D_801E3D80[1]);
if (!D_801E3D80[1].unkF && !var_s1) {
Expand All @@ -439,18 +442,18 @@ static s32 func_801D3AB0(s32 arg0) {
(D_801E3D80[1].unkB + D_801E3D80[1].unk2)) &
1) {
func_801D2B58(1);
D_801E2CF8 = 4;
g_MenuStartMode = START_MENU_MODE_LOADING;
D_801E3F18 = 10;
} else {
func_801D2B58(3);
}
} else if ((u16)D_80062D7C & 0x40) {
func_801D2B58(4);
D_801E2CF8 = 0;
g_MenuStartMode = START_MENU_MODE_SELECT_SLOT;
}
}
break;
case 2:
case START_MENU_MODE_CHECKING_FILES:
if (D_801E3F18 == 0) {
if (D_801E3F1C) {
D_801E3F18 = 0;
Expand All @@ -463,13 +466,13 @@ static s32 func_801D3AB0(s32 arg0) {
}
D_801E3F20++;
if (var_s1) {
D_801E2CF8 = 0;
g_MenuStartMode = START_MENU_MODE_SELECT_SLOT;
func_8001F6C0(D_801E33B0[8], 2);
func_801D2B58(3);
}
if (D_801E3F20 == 0xF) {
D_801E3F20 = 0xE;
D_801E2CF8 = 3;
g_MenuStartMode = START_MENU_MODE_CHECKING_WAIT;
D_801E3F18 = 10;
func_801D2B58(2);
}
Expand All @@ -478,13 +481,13 @@ static s32 func_801D3AB0(s32 arg0) {
D_801E3F18--;
}
break;
case 3:
case START_MENU_MODE_CHECKING_WAIT:
if (D_801E3F18 == 0) {
D_801E2CF8 = 1;
g_MenuStartMode = START_MENU_MODE_SELECT_FILE;
}
D_801E3F18--;
break;
case 4:
case START_MENU_MODE_LOADING:
if (D_801E3F18 != 0) {
D_801E3F18--;
break;
Expand All @@ -499,7 +502,7 @@ static s32 func_801D3AB0(s32 arg0) {
if (_work.header.checksum !=
(u16)func_801D1950(
sizeof(SaveWork) - 4, &_work.header.leader_level)) {
D_801E2CF8 = 1;
g_MenuStartMode = START_MENU_MODE_SELECT_FILE;
func_801D2B58(3);
func_8001F6C0(D_801E2CFC[31], 0);
} else {
Expand All @@ -508,13 +511,13 @@ static s32 func_801D3AB0(s32 arg0) {
func_801D2D10(_work.config & 3);
}
} else {
D_801E2CF8 = 1;
g_MenuStartMode = START_MENU_MODE_SELECT_FILE;
func_801D2B58(3);
func_8001F6C0(D_801E2CFC[11], var_s1);
}
D_80062D99 = 0;
break;
case 6:
case START_MENU_MODE_FORMAT_PROMPT:
func_800264A8(&D_801E3DEC[0]);
if (D_80062D7C & 0x20) {
if (D_801E3DEC[0].unkB == 0) {
Expand All @@ -523,7 +526,7 @@ static s32 func_801D3AB0(s32 arg0) {
} else {
temp_v1_2 = format("bu00:");
}
D_801E2CF8 = 0;
g_MenuStartMode = START_MENU_MODE_SELECT_SLOT;
if (temp_v1_2 == 1) {
D_801E8F38[D_801E3D80[0].unkB][2] = 0;
func_8001F6C0(D_801E2CFC[41], 7);
Expand All @@ -533,15 +536,15 @@ static s32 func_801D3AB0(s32 arg0) {
func_801D2B58(3);
}
} else {
D_801E2CF8 = 0;
g_MenuStartMode = START_MENU_MODE_SELECT_SLOT;
func_801D2B58(4);
}
} else if (D_80062D7C & 0x40) {
D_801E2CF8 = 0;
g_MenuStartMode = START_MENU_MODE_SELECT_SLOT;
func_801D2B58(4);
}
break;
case 7:
case START_MENU_MODE_TITLE:
if (D_80062D7C & 0x20) {
switch (D_801E3D80[7].unkB) {
case 0:
Expand All @@ -554,7 +557,7 @@ static s32 func_801D3AB0(s32 arg0) {
func_801D2B58(1);
func_80026448(&D_801E3D80[0], 0, 0, 1, 2, 0, 0, 1, 2, 0,
0, 0, 1, 0);
D_801E2CF8 = 0;
g_MenuStartMode = START_MENU_MODE_SELECT_SLOT;
} else {
func_801D2B58(3);
}
Expand Down