diff --git a/port/src/mpsetups.c b/port/src/mpsetups.c index 1609007d2..b3d1aa063 100644 --- a/port/src/mpsetups.c +++ b/port/src/mpsetups.c @@ -35,7 +35,7 @@ s16 g_MpCurrentSetup = -1; memcpy(buf, src, size); \ buf += size; } -// #### Rename setup dialogue +// #### Rename setup dialog MenuItemHandlerResult menuhandlerRenameSetup(s32 operation, struct menuitem *item, union handlerdata *data) { char *name = data->keyboard.string; @@ -80,10 +80,10 @@ struct menuitem g_RenameSetupItems[] = { #endif { MENUITEMTYPE_KEYBOARD, + 18, 0, 0, - 0, - 0, + 1, menuhandlerRenameSetup, }, { MENUITEMTYPE_END }, @@ -181,7 +181,7 @@ struct menuitem g_MpManageSettingsListItems[] = { MENUITEMTYPE_LIST, 0, 0, - 0x00000078, + 160, 0x00000042, mpSelectSettingHandler, }, diff --git a/src/game/challenge.c b/src/game/challenge.c index 8c738105f..2377e43ff 100644 --- a/src/game/challenge.c +++ b/src/game/challenge.c @@ -400,6 +400,8 @@ struct mpconfigfull *challengeLoadConfig(s32 confignum, u8 *buffer, s32 len) extern struct mpstrings EXT_SEG _mpstringsSSegmentRomEnd; extern struct mpstrings EXT_SEG _mpstringsISegmentRomEnd; + extern struct mpconfig g_MpConfigs[]; + BTYPE banks[][2] = { { (BTYPE)REF_SEG _mpstringsESegmentRomStart, (BTYPE)REF_SEG _mpstringsESegmentRomEnd }, { (BTYPE)REF_SEG _mpstringsJSegmentRomStart, (BTYPE)REF_SEG _mpstringsJSegmentRomEnd }, @@ -421,6 +423,7 @@ struct mpconfigfull *challengeLoadConfig(s32 confignum, u8 *buffer, s32 len) bank = banks[language_id][0]; loadedstrings = dmaExecWithAutoAlign(buffer2, bank + confignum * sizeof(struct mpstrings), sizeof(struct mpstrings)); + mpconfig->config = g_MpConfigs[confignum]; mpconfig->strings = *loadedstrings; return mpconfig; diff --git a/src/game/menuitem.c b/src/game/menuitem.c index 18f80c1a6..85fa18105 100644 --- a/src/game/menuitem.c +++ b/src/game/menuitem.c @@ -1529,6 +1529,7 @@ bool menuitemKeyboardTick(struct menuitem *item, struct menuinputs *inputs, u32 inputs->start = false; } + u8 maxlen = item->param == 0 ? 10 : item->param; #ifndef PLATFORM_N64 if (g_MenuKeyboardPlayer == g_MpPlayerNum) { // match caps state to keyboard shift/caps if typing with keyboard @@ -1540,7 +1541,7 @@ bool menuitemKeyboardTick(struct menuitem *item, struct menuinputs *inputs, u32 // handle text input s32 prevpos = strlen(kb->string); s32 pos = prevpos; - s32 result = inputTextHandler(kb->string, sizeof(kb->string), &pos, true); + s32 result = inputTextHandler(kb->string, maxlen-1, &pos, true); if (result == -1) { // cancel kb->row = 5; @@ -1617,7 +1618,7 @@ bool menuitemKeyboardTick(struct menuitem *item, struct menuinputs *inputs, u32 s32 textwidth; s32 textheight; - if (kb->string[9] == '\0') { + if (kb->string[maxlen-1] == '\0') { // String is not full i = 0; @@ -1653,7 +1654,7 @@ bool menuitemKeyboardTick(struct menuitem *item, struct menuinputs *inputs, u32 // Handle deleting if (delete && kb->string[0] != '\0') { s32 deleted = false; - s32 i = 10; + s32 i = maxlen; menuPlaySound(MENUSOUND_FOCUS); diff --git a/src/mpconfigs.c b/src/game/mpconfigs.c similarity index 100% rename from src/mpconfigs.c rename to src/game/mpconfigs.c diff --git a/src/game/mplayer/mplayer.c b/src/game/mplayer/mplayer.c index 3d9381522..a9ea46998 100644 --- a/src/game/mplayer/mplayer.c +++ b/src/game/mplayer/mplayer.c @@ -3918,7 +3918,7 @@ void mpsetupfileLoadWad(struct savebuffer *buffer) s32 i; s32 j; - savebufferReadString(buffer, g_MpSetup.name, false); + savebufferReadString_ext(buffer, g_MpSetup.name, false, MPSETUP_MAXSETUPS+1); savebufferReadBits(buffer, 4); g_MpSetup.stagenum = savebufferReadBits(buffer, 7); @@ -3973,7 +3973,7 @@ void mpsetupfileSaveWad(struct savebuffer *buffer) s32 mpbodynum; s32 i; - func0f0d55a4(buffer, g_MpSetup.name); + func0f0d55a4_ext(buffer, g_MpSetup.name, MPSETUP_MAXSETUPS+1); for (i = 0; i < MAX_BOTS; i++) { if (g_MpSetup.chrslots & (1 << (i + 4))) { diff --git a/src/game/mplayer/setup.c b/src/game/mplayer/setup.c index 12c387cbc..2f129d7b4 100644 --- a/src/game/mplayer/setup.c +++ b/src/game/mplayer/setup.c @@ -1098,10 +1098,10 @@ struct menuitem g_MpSaveSetupNameMenuItems[] = { #endif { MENUITEMTYPE_KEYBOARD, + MPSETUP_MAXNAME, 0, 0, - 0, - 0, + 1, menuhandlerMpSetupName, }, { MENUITEMTYPE_END }, @@ -2254,8 +2254,7 @@ MenuItemHandlerResult mpLoadSettingsMenuHandler(s32 operation, struct menuitem * { switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->list.value = mpGetNumUnlockedPresets(); - data->list.value += g_MpSetupFile.numsetups; + data->list.value = mpGetNumUnlockedPresets() + g_MpSetupFile.numsetups; break; case MENUOP_GETOPTIONTEXT: if (data->list.value < mpGetNumUnlockedPresets()) { @@ -2263,7 +2262,7 @@ MenuItemHandlerResult mpLoadSettingsMenuHandler(s32 operation, struct menuitem * } if (g_MpSetupFile.numsetups > 0) { struct setupblock *block = &g_MpSetupFile.setups[data->list.value - mpGetNumUnlockedPresets()]; - func0f0d564c(block->bytes, g_StringPointer, false); + func0f0d564c_ext(block->bytes, g_StringPointer, false, MPSETUP_MAXSETUPS+1); return (uintptr_t)g_StringPointer; } break; @@ -2618,7 +2617,7 @@ struct menuitem g_MpLoadSettingsMenuItems[] = { MENUITEMTYPE_LIST, 0, 0, - 0x00000078, + 160, 0x00000042, mpLoadSettingsMenuHandler, }, diff --git a/src/game/savebuffer.c b/src/game/savebuffer.c index f9d4705fd..0dc22dee5 100644 --- a/src/game/savebuffer.c +++ b/src/game/savebuffer.c @@ -481,13 +481,13 @@ void func0f0d54c4(struct savebuffer *buffer) * Read a zero-terminated string from the buffer and move the buffer's internal * pointer past the end of the string. */ -void savebufferReadString(struct savebuffer *buffer, char *dst, bool addlinebreak) +void savebufferReadString_ext(struct savebuffer *buffer, char *dst, bool addlinebreak, u8 len) { bool foundnull = false; s32 index = 0; s32 i; - for (i = 0; i < 10; i++) { + for (i = 0; i < len; i++) { s32 byte = savebufferReadBits(buffer, 8); if (!foundnull) { @@ -509,12 +509,17 @@ void savebufferReadString(struct savebuffer *buffer, char *dst, bool addlinebrea dst[index] = '\0'; } -void func0f0d55a4(struct savebuffer *buffer, char *src) +void savebufferReadString(struct savebuffer *buffer, char *dst, bool addlinebreak) +{ + savebufferReadString_ext(buffer, dst, addlinebreak, 10); +} + +void func0f0d55a4_ext(struct savebuffer *buffer, char *src, u8 len) { bool done = false; s32 i; - for (i = 0; i < 10; i++) { + for (i = 0; i < len; i++) { if (!done) { if (src[i] == '\0') { done = true; @@ -532,12 +537,22 @@ void func0f0d55a4(struct savebuffer *buffer, char *src) } } -void func0f0d564c(u8 *data, char *dst, bool addlinebreak) +void func0f0d55a4(struct savebuffer *buffer, char *src) +{ + func0f0d55a4_ext(buffer, src, 10); +} + +void func0f0d564c_ext(u8 *data, char *dst, bool addlinebreak, u8 len) { struct savebuffer buffer; - savebufferWriteData(&buffer, data, 10); - savebufferReadString(&buffer, dst, addlinebreak); + savebufferWriteData(&buffer, data, len); + savebufferReadString_ext(&buffer, dst, addlinebreak, len); +} + +void func0f0d564c(u8 *data, char *dst, bool addlinebreak) +{ + func0f0d564c_ext(data, dst, addlinebreak, 10); } #if VERSION >= VERSION_NTSC_1_0 diff --git a/src/include/constants.h b/src/include/constants.h index 1baa3d998..e1c4b4ea3 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -4754,9 +4754,8 @@ enum weaponnum { #define EXTRA_SLEEP_TIME 1000LL // 100us -#define MPSETUP_MAXSETUPS 100 -#define MPSETUP_MAXGROUPS 100 -#define MPSETUP_MAXGROUPNAME 33 +#define MPSETUP_MAXSETUPS 128 +#define MPSETUP_MAXNAME 18 #define MPSETUP_BLOCKSIZE 64 #endif diff --git a/src/include/game/savebuffer.h b/src/include/game/savebuffer.h index 9529248ce..320708af2 100644 --- a/src/include/game/savebuffer.h +++ b/src/include/game/savebuffer.h @@ -17,8 +17,11 @@ u32 savebufferReadBits(struct savebuffer *buffer, s32 offset); void savebufferClear(struct savebuffer *buffer); void savebufferWriteData(struct savebuffer *buffer, u8 *data, u8 len); void func0f0d54c4(struct savebuffer *buffer); +void savebufferReadString_ext(struct savebuffer *buffer, char *dst, bool addlinebreak, u8 len); void savebufferReadString(struct savebuffer *buffer, char *dst, bool addlinebreak); +void func0f0d55a4_ext(struct savebuffer *buffer, char *src, u8 len); void func0f0d55a4(struct savebuffer *buffer, char *src); +void func0f0d564c_ext(u8 *data, char *dst, bool addlinebreak, u8 len); void func0f0d564c(u8 *data, char *dst, bool addlinebreak); void func0f0d5690(u8 *dst, char *buffer); void savebufferWriteGuid(struct savebuffer *buffer, struct fileguid *guid); diff --git a/src/include/types.h b/src/include/types.h index f5de55dd2..61d8a96f5 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -3295,7 +3295,7 @@ struct menuitemdata_dropdown { }; struct menuitemdata_keyboard { - char string[11]; + char string[MPSETUP_MAXNAME+1]; s8 col; s8 row; u8 capslock : 1; // Pressed A on caps button @@ -4080,7 +4080,7 @@ struct missionconfig { }; struct mpsetup { - /*0x800acb88*/ char name[12]; + /*0x800acb88*/ char name[MPSETUP_MAXNAME+1]; /*0x800acb94*/ u32 options; /*0x800acb98*/ u8 scenario; /*0x800acb99*/ u8 stagenum;