From 01af8825cbd6bf58b917211db4a5689b09286cab Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 6 Nov 2022 16:43:00 +1000 Subject: [PATCH] Introduce bot quantities --- src/assets/ntsc-final/lang/mpmenu.json | 4 +- src/game/menu.c | 20 +++---- src/game/mplayer/mplayer.c | 4 ++ src/game/mplayer/setup.c | 77 +++++++++++++++++++++++++- src/game/setup.c | 9 ++- src/include/data.h | 1 + src/include/types.h | 1 + 7 files changed, 99 insertions(+), 17 deletions(-) diff --git a/src/assets/ntsc-final/lang/mpmenu.json b/src/assets/ntsc-final/lang/mpmenu.json index 155f90028..ce1dd9c96 100644 --- a/src/assets/ntsc-final/lang/mpmenu.json +++ b/src/assets/ntsc-final/lang/mpmenu.json @@ -4840,8 +4840,8 @@ "es": "Press START!\n" }, { - "id": "L_MPMENU_484", - "en": "Searching for Camera!\n", + "id": "L_MPMENU_QUANTITY", + "en": "Quantity\n", "gb": "Searching for Camera!\n", "jp": "Calibrating Camera\n", "it": "Searching for Camera!\n", diff --git a/src/game/menu.c b/src/game/menu.c index d79817820..69299f293 100644 --- a/src/game/menu.c +++ b/src/game/menu.c @@ -272,17 +272,17 @@ Gfx *menuRenderBanner(Gfx *gdl, s32 x1, s32 y1, s32 x2, s32 y2, bool big, s32 ms struct font *font; static u16 msgs[] = { - L_MPMENU_484, // "Searching for Camera!" - L_MPMENU_485, // "Calibrating Camera" - L_MPMENU_486, // "Downloading Image" - L_MPMENU_487, // "Loading Image" - L_MPMENU_488, // "Saving Image" - L_MPMENU_489, // "Transferring Image" - L_MPMENU_490, // "Uploading Segment" + 0, // "Searching for Camera!" + 0, // "Calibrating Camera" + 0, // "Downloading Image" + 0, // "Loading Image" + 0, // "Saving Image" + 0, // "Transferring Image" + 0, // "Uploading Segment" L_MPMENU_491, // "Checking Controller Pak" - L_MPMENU_492, // "Getting PerfectHead" - L_MPMENU_493, // "Saving PerfectHead" - L_MPMENU_494, // "Auto Camera Adjustment" + 0, // "Getting PerfectHead" + 0, // "Saving PerfectHead" + 0, // "Auto Camera Adjustment" }; chars = g_CharsHandelGothicSm; diff --git a/src/game/mplayer/mplayer.c b/src/game/mplayer/mplayer.c index fc9e36f25..421e52d27 100644 --- a/src/game/mplayer/mplayer.c +++ b/src/game/mplayer/mplayer.c @@ -409,6 +409,7 @@ void func0f1881d4(s32 index) g_BotConfigsArray[index].base.mpbodynum = MPBODY_DARK_COMBAT; g_BotConfigsArray[index].type = BOTTYPE_GENERAL; g_BotConfigsArray[index].difficulty = BOTDIFF_DISABLED; + g_BotConfigsArray[index].quantity = 1; } void mpInit(void) @@ -4495,6 +4496,7 @@ void mpCreateBotFromProfile(s32 botnum, u8 profilenum) g_BotConfigsArray[botnum].type = g_BotProfiles[profilenum].type; g_BotConfigsArray[botnum].difficulty = g_BotProfiles[profilenum].difficulty; + g_BotConfigsArray[botnum].quantity = g_BotQuantity; if (botnum < 8) { for (i = 0; i < 4; i++) { @@ -5169,6 +5171,7 @@ void mpApplyConfig(struct mpconfigfull *config) for (i = 0; i < 8; i++) { g_BotConfigsArray[i].type = config->config.simulants[i].type; + g_BotConfigsArray[i].quantity = 1; for (j = 0; j < 4; j++) { g_MpSimulantDifficultiesPerNumPlayers[i][j] = config->config.simulants[i].difficulties[j]; @@ -5249,6 +5252,7 @@ void mpsetupfileLoadWad(struct savebuffer *buffer) g_BotConfigsArray[i].base.name[0] = '\0'; g_BotConfigsArray[i].type = savebufferReadBits(buffer, 5); g_BotConfigsArray[i].difficulty = savebufferReadBits(buffer, 3); + g_BotConfigsArray[i].quantity = 1; for (j = 0; j < 4; j++) { g_MpSimulantDifficultiesPerNumPlayers[i][j] = g_BotConfigsArray[i].difficulty; diff --git a/src/game/mplayer/setup.c b/src/game/mplayer/setup.c index e32c624b8..ee989c040 100644 --- a/src/game/mplayer/setup.c +++ b/src/game/mplayer/setup.c @@ -23,6 +23,8 @@ #include "gbiex.h" #include "types.h" +s32 g_BotQuantity = 1; + struct menuitem g_MpCharacterMenuItems[]; struct menudialogdef g_MpAddSimulantMenuDialog; struct menudialogdef g_MpChangeSimulantMenuDialog; @@ -2824,6 +2826,42 @@ s32 menuhandlerMpClearAllSimulants(s32 operation, struct menuitem *item, union h return 0; } +s32 menuhandlerIndividualBotQuantity(s32 operation, struct menuitem *item, union handlerdata *data) +{ + s32 botnum = g_Menus[g_MpPlayerNum].mpsetup.slotindex; + + switch (operation) { + case MENUOP_GETSLIDER: + data->slider.value = g_BotConfigsArray[botnum].quantity; + break; + case MENUOP_SET: + g_BotConfigsArray[botnum].quantity = data->slider.value > 0 ? data->slider.value : 1; + break; + case MENUOP_GETSLIDERLABEL: + sprintf(data->slider.label, "%d\n", g_BotConfigsArray[botnum].quantity); + break; + } + + return 0; +} + +s32 menuhandlerBotQuantity(s32 operation, struct menuitem *item, union handlerdata *data) +{ + switch (operation) { + case MENUOP_GETSLIDER: + data->slider.value = g_BotQuantity; + break; + case MENUOP_SET: + g_BotQuantity = data->slider.value > 0 ? data->slider.value : 1; + break; + case MENUOP_GETSLIDERLABEL: + sprintf(data->slider.label, "%d\n", g_BotQuantity); + break; + } + + return 0; +} + s32 menuhandlerMpAddSimulant(s32 operation, struct menuitem *item, union handlerdata *data) { switch (operation) { @@ -2861,6 +2899,17 @@ s32 menuhandlerMpSimulantSlot(s32 operation, struct menuitem *item, union handle return 0; } +char *mpMenuTextAddSimulantsLabel(struct menuitem *item) +{ + if (g_BotQuantity == 1) { + return "Add Simulant...\n"; + } + + sprintf(g_StringPointer, "Add %d Simulants...\n", g_BotQuantity); + + return g_StringPointer; +} + char *mpMenuTextSimulantName(struct menuitem *item) { s32 index = item->param; @@ -2869,7 +2918,9 @@ char *mpMenuTextSimulantName(struct menuitem *item) return ""; } - return g_BotConfigsArray[index].base.name; + sprintf(g_StringPointer, "%dx %s", g_BotConfigsArray[index].quantity, g_BotConfigsArray[index].base.name); + + return g_StringPointer; } s32 menudialogMpSimulants(s32 operation, struct menudialogdef *dialogdef, union handlerdata *data) @@ -2973,6 +3024,14 @@ struct menuitem g_MpEditSimulantMenuItems[] = { 0, (void *)&g_MpSimulantCharacterMenuDialog, }, + { + MENUITEMTYPE_SLIDER, + 0, + MENUITEMFLAG_LOCKABLEMINOR, + L_MPMENU_QUANTITY, + 1000, + menuhandlerIndividualBotQuantity, + }, { MENUITEMTYPE_SEPARATOR, 0, @@ -3010,11 +3069,19 @@ struct menudialogdef g_MpEditSimulantMenuDialog = { }; struct menuitem g_MpSimulantsMenuItems[] = { + { + MENUITEMTYPE_SLIDER, + 0, + MENUITEMFLAG_LOCKABLEMINOR, + L_MPMENU_QUANTITY, + 1000, + menuhandlerBotQuantity, + }, { MENUITEMTYPE_SELECTABLE, 0, MENUITEMFLAG_LOCKABLEMINOR, - L_MPMENU_084, // "Add Simulant..." + (u32)&mpMenuTextAddSimulantsLabel, 0, menuhandlerMpAddSimulant, }, @@ -3297,6 +3364,12 @@ char *mpMenuTextChrNameForTeamSetup(struct menuitem *item) struct mpchrconfig *mpchr = mpGetChrConfigBySlotNum(item->param); if (mpchr) { + if (mpchr >= &g_BotConfigsArray[0].base && mpchr < &g_BotConfigsArray[MAX_BOTS].base) { + struct mpbotconfig *botconfig = (struct mpbotconfig *) mpchr; + sprintf(g_StringPointer, "%dx %s\n", botconfig->quantity, mpchr->name); + return g_StringPointer; + } + return mpchr->name; } diff --git a/src/game/setup.c b/src/game/setup.c index 30b79b5e6..b3ed7a09f 100644 --- a/src/game/setup.c +++ b/src/game/setup.c @@ -809,7 +809,7 @@ s32 setupGetNumRequestedBots(void) if (g_Vars.normmplayerisrunning && mpHasSimulants()) { for (i = 0; i < MAX_BOTS; i++) { if ((g_MpSetup.chrslots & (1 << (i + 4))) && mpIsSimSlotEnabled(i)) { - numbots++; + numbots += g_BotConfigsArray[i].quantity; } } } @@ -827,6 +827,7 @@ void setupAllocateEverything(void) s32 numbotsrequested; bool haslaptops = false; s32 i; + s32 j; // Count how many bots were requested numbotsrequested = setupGetNumRequestedBots(); @@ -862,8 +863,10 @@ void setupAllocateEverything(void) for (i = 0; i < MAX_BOTS; i++) { if ((g_MpSetup.chrslots & (1 << (i + 4))) && mpIsSimSlotEnabled(i)) { - botmgrAllocateBot(chrnum, i); - chrnum++; + for (j = 0; j < g_BotConfigsArray[i].quantity; j++) { + botmgrAllocateBot(chrnum, i); + chrnum++; + } } } } diff --git a/src/include/data.h b/src/include/data.h index 964dd1ccc..aa7f04c93 100644 --- a/src/include/data.h +++ b/src/include/data.h @@ -491,6 +491,7 @@ extern s32 var80087260; extern bool g_MpEnableMusicSwitching; extern struct mpweapon g_MpWeapons[NUM_MPWEAPONS]; extern struct mphead g_MpHeads[NUM_MPHEADS]; +extern s32 g_BotQuantity; extern struct botprofile g_BotProfiles[18]; extern struct mpbody g_MpBodies[NUM_MPBODIES]; extern struct mppreset g_MpPresets[NUM_MPPRESETS]; diff --git a/src/include/types.h b/src/include/types.h index 6b074ad64..aea2aa241 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -4201,6 +4201,7 @@ struct mpbotconfig { /*0x44*/ u8 unk44[3]; /*0x47*/ u8 type; /*0x48*/ u8 difficulty; + /*0x4a*/ u16 quantity; }; struct missionconfig {