Add md5expected array to W_InitMultipleFiles

This commit is contained in:
Eidolon 2025-03-16 22:55:10 -05:00
parent d3c39907f7
commit 5c85a0a578
3 changed files with 63 additions and 86 deletions

View file

@ -141,8 +141,10 @@ INT32 window_y;
// //
// DEMO LOOP // DEMO LOOP
// //
static char *startupiwads[MAX_WADFILES]; static size_t num_startupiwads = 0;
static char *startuppwads[MAX_WADFILES]; static initmultiplefilesentry_t startupiwads[MAX_WADFILES];
static size_t num_startuppwads = 0;
static initmultiplefilesentry_t startuppwads[MAX_WADFILES];
boolean devparm = false; // started game with -devparm boolean devparm = false; // started game with -devparm
@ -1282,31 +1284,36 @@ boolean D_IsDeferredStartTitle(void)
// //
// D_AddFile // D_AddFile
// //
static void D_AddFile(char **list, const char *file) static void D_AddFile(initmultiplefilesentry_t *list, size_t index, const char *file, const char *md5sum)
{ {
size_t pnumwadfiles; char *filecopy = NULL;
char *newfile; if (file)
for (pnumwadfiles = 0; list[pnumwadfiles]; pnumwadfiles++)
;
newfile = static_cast<char*>(malloc(strlen(file) + 1));
if (!newfile)
{ {
I_Error("No more free memory to AddFile %s",file); size_t len = strlen(file) + 1;
filecopy = (char*)malloc(len);
memcpy(filecopy, file, len);
} }
strcpy(newfile, file); char *md5copy = NULL;
if (md5sum)
list[pnumwadfiles] = newfile; {
size_t len = strlen(md5sum) + 1;
md5copy = (char*)malloc(len);
memcpy(md5copy, md5sum, len);
}
list[index].filename = filecopy;
list[index].md5sum = md5copy;
} }
static inline void D_CleanFile(char **list) static inline void D_CleanFile(initmultiplefilesentry_t *list, size_t count)
{ {
size_t pnumwadfiles; for (INT32 i = 0; i < count; ++i)
for (pnumwadfiles = 0; list[pnumwadfiles]; pnumwadfiles++)
{ {
free(list[pnumwadfiles]); if (list[i].filename != NULL)
list[pnumwadfiles] = NULL; free((void*)list[i].filename);
list[i].filename = NULL;
if (list[i].md5sum != NULL)
free((void*)list[i].md5sum);
list[i].md5sum = NULL;
} }
} }
@ -1354,7 +1361,7 @@ static boolean AddIWAD(void)
if (FIL_ReadFileOK(path)) if (FIL_ReadFileOK(path))
{ {
D_AddFile(startupiwads, path); D_AddFile(startupiwads, num_startupiwads++, path, ASSET_HASH_BIOS_PK3);
return true; return true;
} }
else else
@ -1395,21 +1402,18 @@ static void IdentifyVersion(void)
snprintf(configfile, sizeof configfile, "%s" PATHSEP CONFIGFILENAME, srb2waddir); snprintf(configfile, sizeof configfile, "%s" PATHSEP CONFIGFILENAME, srb2waddir);
configfile[sizeof configfile - 1] = '\0'; configfile[sizeof configfile - 1] = '\0';
// if you change the ordering of this or add/remove a file, be sure to update the md5 D_AddFile(startupiwads, num_startupiwads++, va(spandf,srb2waddir,"data","scripts.pk3"), ASSET_HASH_SCRIPTS_PK3);
// checking in D_SRB2Main D_AddFile(startupiwads, num_startupiwads++, va(spandf,srb2waddir,"data","gfx.pk3"), ASSET_HASH_GFX_PK3);
D_AddFile(startupiwads, num_startupiwads++, va(spandf,srb2waddir,"data","textures_general.pk3"), ASSET_HASH_TEXTURES_GENERAL_PK3);
D_AddFile(startupiwads, va(spandf,srb2waddir,"data","scripts.pk3")); D_AddFile(startupiwads, num_startupiwads++, va(spandf,srb2waddir,"data","textures_segazones.pk3"), ASSET_HASH_TEXTURES_SEGAZONES_PK3);
D_AddFile(startupiwads, va(spandf,srb2waddir,"data","gfx.pk3")); D_AddFile(startupiwads, num_startupiwads++, va(spandf,srb2waddir,"data","textures_originalzones.pk3"), ASSET_HASH_TEXTURES_ORIGINALZONES_PK3);
D_AddFile(startupiwads, va(spandf,srb2waddir,"data","textures_general.pk3")); D_AddFile(startupiwads, num_startupiwads++, va(spandf,srb2waddir,"data","chars.pk3"), ASSET_HASH_CHARS_PK3);
D_AddFile(startupiwads, va(spandf,srb2waddir,"data","textures_segazones.pk3")); D_AddFile(startupiwads, num_startupiwads++, va(spandf,srb2waddir,"data","followers.pk3"), ASSET_HASH_FOLLOWERS_PK3);
D_AddFile(startupiwads, va(spandf,srb2waddir,"data","textures_originalzones.pk3")); D_AddFile(startupiwads, num_startupiwads++, va(spandf,srb2waddir,"data","maps.pk3"), ASSET_HASH_MAPS_PK3);
D_AddFile(startupiwads, va(spandf,srb2waddir,"data","chars.pk3")); D_AddFile(startupiwads, num_startupiwads++, va(spandf,srb2waddir,"data","unlocks.pk3"), ASSET_HASH_UNLOCKS_PK3);
D_AddFile(startupiwads, va(spandf,srb2waddir,"data","followers.pk3")); D_AddFile(startupiwads, num_startupiwads++, va(spandf,srb2waddir,"data","staffghosts.pk3"), ASSET_HASH_STAFFGHOSTS_PK3);
D_AddFile(startupiwads, va(spandf,srb2waddir,"data","maps.pk3"));
D_AddFile(startupiwads, va(spandf,srb2waddir,"data","unlocks.pk3"));
D_AddFile(startupiwads, va(spandf,srb2waddir,"data","staffghosts.pk3"));
#ifdef USE_PATCH_FILE #ifdef USE_PATCH_FILE
D_AddFile(startupiwads, va(pandf,srb2waddir,"patch.pk3")); D_AddFile(startupiwads, num_startupiwads++, va(pandf,srb2waddir,"patch.pk3"), ASSET_HASH_PATCH_PK3);
#endif #endif
#define MUSICTEST(str) \ #define MUSICTEST(str) \
@ -1418,7 +1422,7 @@ static void IdentifyVersion(void)
int ms = W_VerifyNMUSlumps(musicpath, false); \ int ms = W_VerifyNMUSlumps(musicpath, false); \
if (ms == 1) \ if (ms == 1) \
{ \ { \
D_AddFile(startupiwads, musicpath); \ D_AddFile(startupiwads, num_startupiwads++, musicpath, NULL); \
musicwads++; \ musicwads++; \
} \ } \
else if (ms == 0) \ else if (ms == 0) \
@ -1687,7 +1691,7 @@ void D_SRB2Main(void)
const char *s = M_GetNextParm(); const char *s = M_GetNextParm();
if (s) // Check for NULL? if (s) // Check for NULL?
D_AddFile(startuppwads, s); D_AddFile(startuppwads, num_startuppwads++, s, NULL);
} }
} }
} }
@ -1713,44 +1717,10 @@ void D_SRB2Main(void)
// load wad, including the main wad file // load wad, including the main wad file
CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n"); CONS_Printf("W_InitMultipleFiles(): Adding IWAD and main PWADs.\n");
W_InitMultipleFiles(startupiwads, false); W_InitMultipleFiles(startupiwads, num_startupiwads, false);
D_CleanFile(startupiwads); mainwads = num_startupiwads - musicwads;
D_CleanFile(startupiwads, num_startupiwads);
mainwads = 0; num_startupiwads = 0;
#ifndef DEVELOP
// Check MD5s of autoloaded files
// Note: Do not add any files that ignore MD5!
W_VerifyFileMD5(mainwads, ASSET_HASH_BIOS_PK3); // bios.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_SCRIPTS_PK3); // scripts.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_GFX_PK3); // gfx.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_TEXTURES_GENERAL_PK3); // textures_general.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_TEXTURES_SEGAZONES_PK3); // textures_segazones.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_TEXTURES_ORIGINALZONES_PK3); // textures_originalzones.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_CHARS_PK3); // chars.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_FOLLOWERS_PK3); // followers.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_MAPS_PK3); // maps.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_UNLOCKS_PK3); // unlocks.pk3
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_STAFFGHOSTS_PK3); // staffghosts.pk3
#ifdef USE_PATCH_FILE
mainwads++; W_VerifyFileMD5(mainwads, ASSET_HASH_PATCH_PK3); // patch.pk3
#endif
#else
mainwads++; // scripts.pk3
mainwads++; // gfx.pk3
mainwads++; // textures_general.pk3
mainwads++; // textures_segazones.pk3
mainwads++; // textures_originalzones.pk3
mainwads++; // chars.pk3
mainwads++; // followers.pk3
mainwads++; // maps.pk3
mainwads++; // unlocks.pk3
mainwads++; // staffghosts.pk3
#ifdef USE_PATCH_FILE
mainwads++; // patch.pk3
#endif
#endif //ifndef DEVELOP
// Load credits_def lump // Load credits_def lump
F_LoadCreditsDefinitions(); F_LoadCreditsDefinitions();
@ -1815,10 +1785,10 @@ void D_SRB2Main(void)
// HACK: Refer to https://git.do.srb2.org/KartKrew/RingRacers/-/merge_requests/29#note_61574 // HACK: Refer to https://git.do.srb2.org/KartKrew/RingRacers/-/merge_requests/29#note_61574
partadd_earliestfile = numwadfiles; partadd_earliestfile = numwadfiles;
W_InitMultipleFiles(startuppwads, true); W_InitMultipleFiles(startuppwads, num_startuppwads, true);
// Only search for pwad maps and reload graphics if we actually have a pwad added // Only search for pwad maps and reload graphics if we actually have a pwad added
if (startuppwads[0] != NULL) if (num_startuppwads > 0)
{ {
// //
// search for pwad maps // search for pwad maps
@ -1827,7 +1797,8 @@ void D_SRB2Main(void)
HU_LoadGraphics(); HU_LoadGraphics();
} }
D_CleanFile(startuppwads); D_CleanFile(startuppwads, num_startuppwads);
num_startuppwads = 0;
partadd_earliestfile = UINT16_MAX; partadd_earliestfile = UINT16_MAX;
CON_SetLoadingProgress(LOADED_PWAD); CON_SetLoadingProgress(LOADED_PWAD);

View file

@ -1038,24 +1038,25 @@ UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup, const
* Each file is optional, but at least one file must be found or an error will * Each file is optional, but at least one file must be found or an error will
* result. Lump names can appear multiple times. The name searcher looks * result. Lump names can appear multiple times. The name searcher looks
* backwards, so a later file overrides all earlier ones. * backwards, so a later file overrides all earlier ones.
*
* \param filenames A null-terminated list of files to use.
*/ */
INT32 W_InitMultipleFiles(char **filenames, boolean addons) INT32 W_InitMultipleFiles(const initmultiplefilesentry_t *entries, INT32 count, boolean addons)
{ {
INT32 i;
INT32 rc = 1; INT32 rc = 1;
INT32 overallrc = 1; INT32 overallrc = 1;
// will be realloced as lumps are added // will be realloced as lumps are added
for (; *filenames; filenames++) for (i = 0; i < count; ++i)
{ {
if (addons && !W_VerifyNMUSlumps(*filenames, !addons)) const initmultiplefilesentry_t *entry = &entries[i];
if (addons && !W_VerifyNMUSlumps(entry->filename, !addons))
G_SetGameModified(true, false); G_SetGameModified(true, false);
//CONS_Debug(DBG_SETUP, "Loading %s\n", *filenames); //CONS_Debug(DBG_SETUP, "Loading %s\n", *filenames);
rc = W_InitFile(*filenames, !addons, true, NULL); rc = W_InitFile(entry->filename, !addons, true, entry->md5sum);
if (rc == INT16_MAX) if (rc == INT16_MAX)
CONS_Printf(M_GetText("Errors occurred while loading %s; not added.\n"), *filenames); CONS_Printf(M_GetText("Errors occurred while loading %s; not added.\n"), entry->filename);
overallrc &= (rc != INT16_MAX) ? 1 : 0; overallrc &= (rc != INT16_MAX) ? 1 : 0;
} }

View file

@ -147,10 +147,15 @@ FILE *W_OpenWadFile(const char **filename, boolean useerrors);
// Load and add a wadfile to the active wad files, returns numbers of lumps, INT16_MAX on error // Load and add a wadfile to the active wad files, returns numbers of lumps, INT16_MAX on error
UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup, const char *md5expected); UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup, const char *md5expected);
typedef struct initmultiplefilesentry_t
{
const char *filename;
const char *md5sum;
} initmultiplefilesentry_t;
// W_InitMultipleFiles returns 1 if all is okay, 0 otherwise, // W_InitMultipleFiles returns 1 if all is okay, 0 otherwise,
// so that it stops with a message if a file was not found, but not if all is okay. // so that it stops with a message if a file was not found, but not if all is okay.
// W_InitMultipleFiles exits if a file was not found, but not if all is okay. // W_InitMultipleFiles exits if a file was not found, but not if all is okay.
INT32 W_InitMultipleFiles(char **filenames, boolean addons); INT32 W_InitMultipleFiles(const initmultiplefilesentry_t *entries, INT32 count, boolean addons);
const char *W_CheckNameForNumPwad(UINT16 wad, UINT16 lump); const char *W_CheckNameForNumPwad(UINT16 wad, UINT16 lump);
const char *W_CheckNameForNum(lumpnum_t lumpnum); const char *W_CheckNameForNum(lumpnum_t lumpnum);