Load multiple musicdef lumps from a single wad

This commit is contained in:
James R 2020-10-27 15:45:10 -07:00
parent e7051737d7
commit d896fee2e5

View file

@ -1602,25 +1602,37 @@ musicdef_t *musicdefstart = NULL;
struct cursongcredit cursongcredit; // Currently displayed song credit info struct cursongcredit cursongcredit; // Currently displayed song credit info
int musicdef_volume; int musicdef_volume;
// static boolean
// search for music definition in wad MusicDefError
// (
static UINT16 W_CheckForMusicDefInPwad(UINT16 wadid) alerttype_t level,
{ const char * description,
UINT16 i; const char * field,
lumpinfo_t *lump_p; lumpnum_t lumpnum,
int line
){
const wadfile_t * wad = wadfiles[WADFILENUM (lumpnum)];
const lumpinfo_t * lump = &wad->lumpinfo[LUMPNUM (lumpnum)];
lump_p = wadfiles[wadid]->lumpinfo; CONS_Alert(level,
for (i = 0; i < wadfiles[wadid]->numlumps; i++, lump_p++) va("%%s|%%s: %s (line %%d)\n", description),
if (memcmp(lump_p->name, "MUSICDEF", 8) == 0) wad->filename,
return i; lump->fullname,
field,
line
);
return INT16_MAX; // not found return false;
} }
static boolean static boolean
ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp) ReadMusicDefFields
{ (
lumpnum_t lumpnum,
int line,
char * stoken,
musicdef_t ** defp
){
musicdef_t *def; musicdef_t *def;
char *value; char *value;
@ -1631,10 +1643,9 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp)
value = strtok(NULL, " "); value = strtok(NULL, " ");
if (!value) if (!value)
{ {
CONS_Alert(CONS_WARNING, return MusicDefError(CONS_WARNING,
"MUSICDEF: Field '%s' is missing name. (file %s, line %d)\n", "Field '%'s is missing name.",
stoken, wadfiles[wadnum]->filename, line); stoken, lumpnum, line);
return false;
} }
else else
{ {
@ -1678,10 +1689,9 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp)
if (!value) if (!value)
{ {
CONS_Alert(CONS_WARNING, return MusicDefError(CONS_WARNING,
"MUSICDEF: Field '%s' is missing value. (file %s, line %d)\n", "Field '%s' is missing value.",
stoken, wadfiles[wadnum]->filename, line); stoken, lumpnum, line);
return false;
} }
else else
{ {
@ -1689,10 +1699,9 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp)
if (!def) if (!def)
{ {
CONS_Alert(CONS_ERROR, return MusicDefError(CONS_ERROR,
"MUSICDEF: No music definition before field '%s'. (file %s, line %d)\n", "No music definition before field '%s'.",
stoken, wadfiles[wadnum]->filename, line); stoken, lumpnum, line);
return false;
} }
// Skip the equals sign. // Skip the equals sign.
@ -1713,9 +1722,9 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp)
} else if (!stricmp(stoken, "volume")) { } else if (!stricmp(stoken, "volume")) {
def->volume = atoi(textline); def->volume = atoi(textline);
} else { } else {
CONS_Alert(CONS_WARNING, MusicDefError(CONS_WARNING,
"MUSICDEF: Invalid field '%s'. (file %s, line %d)\n", "Unknown field '%s'.",
stoken, wadfiles[wadnum]->filename, line); stoken, lumpnum, line);
} }
} }
} }
@ -1723,9 +1732,8 @@ ReadMusicDefFields (UINT16 wadnum, int line, char *stoken, musicdef_t **defp)
return true; return true;
} }
void S_LoadMusicDefs(UINT16 wadnum) static void S_LoadMusicDefLump(lumpnum_t lumpnum)
{ {
UINT16 lumpnum;
char *lump; char *lump;
char *musdeftext; char *musdeftext;
size_t size; size_t size;
@ -1739,12 +1747,8 @@ void S_LoadMusicDefs(UINT16 wadnum)
musicdef_t *def = NULL; musicdef_t *def = NULL;
int line = 1; // for better error msgs int line = 1; // for better error msgs
lumpnum = W_CheckForMusicDefInPwad(wadnum); lump = W_CacheLumpNum(lumpnum, PU_CACHE);
if (lumpnum == INT16_MAX) size = W_LumpLength(lumpnum);
return;
lump = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE);
size = W_LumpLengthPwad(wadnum, lumpnum);
// Null-terminated MUSICDEF lump. // Null-terminated MUSICDEF lump.
musdeftext = malloc(size+1); musdeftext = malloc(size+1);
@ -1770,7 +1774,7 @@ void S_LoadMusicDefs(UINT16 wadnum)
stoken = strtok(stoken, " "); stoken = strtok(stoken, " ");
if (stoken) if (stoken)
{ {
if (! ReadMusicDefFields(wadnum, line, stoken, &def)) if (! ReadMusicDefFields(lumpnum, line, stoken, &def))
break; break;
} }
@ -1795,6 +1799,20 @@ void S_LoadMusicDefs(UINT16 wadnum)
free(musdeftext); free(musdeftext);
} }
void S_LoadMusicDefs(UINT16 wad)
{
const lumpnum_t wadnum = wad << 16;
UINT16 lump = 0;
while (( lump = W_CheckNumForNamePwad("MUSICDEF", wad, lump) ) != INT16_MAX)
{
S_LoadMusicDefLump(wadnum | lump);
lump++;
}
}
// //
// S_InitMusicDefs // S_InitMusicDefs
// //