Merge remote-tracking branch 'origin/next' into next
This commit is contained in:
commit
d9742afb45
|
@ -1627,6 +1627,7 @@ static void CL_LoadReceivedSavegame(void)
|
||||||
|
|
||||||
paused = false;
|
paused = false;
|
||||||
demoplayback = false;
|
demoplayback = false;
|
||||||
|
titlemapinaction = TITLEMAP_OFF;
|
||||||
titledemo = false;
|
titledemo = false;
|
||||||
automapactive = false;
|
automapactive = false;
|
||||||
|
|
||||||
|
|
|
@ -1045,10 +1045,8 @@ void D_SRB2Main(void)
|
||||||
I_OutputMsg("setvbuf didnt work\n");
|
I_OutputMsg("setvbuf didnt work\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef GETTEXT
|
|
||||||
// initialise locale code
|
// initialise locale code
|
||||||
M_StartupLocale();
|
M_StartupLocale();
|
||||||
#endif
|
|
||||||
|
|
||||||
// get parameters from a response file (eg: srb2 @parms.txt)
|
// get parameters from a response file (eg: srb2 @parms.txt)
|
||||||
M_FindResponseFile();
|
M_FindResponseFile();
|
||||||
|
|
|
@ -98,8 +98,8 @@
|
||||||
|
|
||||||
#ifdef GETTEXT
|
#ifdef GETTEXT
|
||||||
#include <libintl.h>
|
#include <libintl.h>
|
||||||
#include <locale.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
#include <locale.h> // locale should not be dependent on GETTEXT -- 11/01/20 Monster Iestyn
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
@ -454,12 +454,12 @@ char savegamename[256];
|
||||||
// m_misc.h
|
// m_misc.h
|
||||||
#ifdef GETTEXT
|
#ifdef GETTEXT
|
||||||
#define M_GetText(String) gettext(String)
|
#define M_GetText(String) gettext(String)
|
||||||
void M_StartupLocale(void);
|
|
||||||
#else
|
#else
|
||||||
// If no translations are to be used, make a stub
|
// If no translations are to be used, make a stub
|
||||||
// M_GetText function that just returns the string.
|
// M_GetText function that just returns the string.
|
||||||
#define M_GetText(x) (x)
|
#define M_GetText(x) (x)
|
||||||
#endif
|
#endif
|
||||||
|
void M_StartupLocale(void);
|
||||||
extern void *(*M_Memcpy)(void* dest, const void* src, size_t n) FUNCNONNULL;
|
extern void *(*M_Memcpy)(void* dest, const void* src, size_t n) FUNCNONNULL;
|
||||||
char *va(const char *format, ...) FUNCPRINTF;
|
char *va(const char *format, ...) FUNCPRINTF;
|
||||||
char *M_GetToken(const char *inputString);
|
char *M_GetToken(const char *inputString);
|
||||||
|
|
|
@ -1446,8 +1446,9 @@ static menuitem_t OP_SoundOptionsMenu[] =
|
||||||
{IT_HEADER, NULL, "Miscellaneous", NULL, 102},
|
{IT_HEADER, NULL, "Miscellaneous", NULL, 102},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Closed Captioning", &cv_closedcaptioning, 114},
|
{IT_STRING | IT_CVAR, NULL, "Closed Captioning", &cv_closedcaptioning, 114},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Reset Music Upon Dying", &cv_resetmusic, 124},
|
{IT_STRING | IT_CVAR, NULL, "Reset Music Upon Dying", &cv_resetmusic, 124},
|
||||||
|
{IT_STRING | IT_CVAR, NULL, "Default 1-Up sound", &cv_1upsound, 134},
|
||||||
|
|
||||||
{IT_STRING | IT_SUBMENU, NULL, "Advanced Settings...", &OP_SoundAdvancedDef, 144},
|
{IT_STRING | IT_SUBMENU, NULL, "Advanced Settings...", &OP_SoundAdvancedDef, 154},
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef HAVE_OPENMPT
|
#ifdef HAVE_OPENMPT
|
||||||
|
|
18
src/m_misc.c
18
src/m_misc.c
|
@ -1594,16 +1594,19 @@ boolean M_ScreenshotResponder(event_t *ev)
|
||||||
// M_StartupLocale.
|
// M_StartupLocale.
|
||||||
// Sets up gettext to translate SRB2's strings.
|
// Sets up gettext to translate SRB2's strings.
|
||||||
#ifdef GETTEXT
|
#ifdef GETTEXT
|
||||||
#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)
|
#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)
|
||||||
#define GETTEXTDOMAIN1 "/usr/share/locale"
|
#define GETTEXTDOMAIN1 "/usr/share/locale"
|
||||||
#define GETTEXTDOMAIN2 "/usr/local/share/locale"
|
#define GETTEXTDOMAIN2 "/usr/local/share/locale"
|
||||||
#elif defined (_WIN32)
|
#elif defined (_WIN32)
|
||||||
#define GETTEXTDOMAIN1 "."
|
#define GETTEXTDOMAIN1 "."
|
||||||
#endif
|
#endif
|
||||||
|
#endif // GETTEXT
|
||||||
|
|
||||||
void M_StartupLocale(void)
|
void M_StartupLocale(void)
|
||||||
{
|
{
|
||||||
|
#ifdef GETTEXT
|
||||||
char *textdomhandle = NULL;
|
char *textdomhandle = NULL;
|
||||||
|
#endif //GETTEXT
|
||||||
|
|
||||||
CONS_Printf("M_StartupLocale...\n");
|
CONS_Printf("M_StartupLocale...\n");
|
||||||
|
|
||||||
|
@ -1612,6 +1615,7 @@ void M_StartupLocale(void)
|
||||||
// Do not set numeric locale as that affects atof
|
// Do not set numeric locale as that affects atof
|
||||||
setlocale(LC_NUMERIC, "C");
|
setlocale(LC_NUMERIC, "C");
|
||||||
|
|
||||||
|
#ifdef GETTEXT
|
||||||
// FIXME: global name define anywhere?
|
// FIXME: global name define anywhere?
|
||||||
#ifdef GETTEXTDOMAIN1
|
#ifdef GETTEXTDOMAIN1
|
||||||
textdomhandle = bindtextdomain("srb2", GETTEXTDOMAIN1);
|
textdomhandle = bindtextdomain("srb2", GETTEXTDOMAIN1);
|
||||||
|
@ -1632,8 +1636,8 @@ void M_StartupLocale(void)
|
||||||
textdomain("srb2");
|
textdomain("srb2");
|
||||||
else
|
else
|
||||||
CONS_Printf("Could not find locale text domain!\n");
|
CONS_Printf("Could not find locale text domain!\n");
|
||||||
|
#endif //GETTEXT
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// MISC STRING FUNCTIONS
|
// MISC STRING FUNCTIONS
|
||||||
|
|
|
@ -1466,6 +1466,13 @@ void P_PlayLivesJingle(player_t *player)
|
||||||
S_StartSound(NULL, sfx_oneup);
|
S_StartSound(NULL, sfx_oneup);
|
||||||
else if (mariomode)
|
else if (mariomode)
|
||||||
S_StartSound(NULL, sfx_marioa);
|
S_StartSound(NULL, sfx_marioa);
|
||||||
|
else if (cv_1upsound.value)
|
||||||
|
{
|
||||||
|
if (S_sfx[sfx_oneup].lumpnum != LUMPERROR)
|
||||||
|
S_StartSound(NULL, sfx_oneup);
|
||||||
|
else
|
||||||
|
S_StartSound(NULL, sfx_chchng);/* at least play something! */
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
P_PlayJingle(player, JT_1UP);
|
P_PlayJingle(player, JT_1UP);
|
||||||
|
|
496
src/r_data.c
496
src/r_data.c
|
@ -699,254 +699,29 @@ void R_FlushTextureCache(void)
|
||||||
int R_CountTexturesInTEXTURESLump(UINT16 wadNum, UINT16 lumpNum);
|
int R_CountTexturesInTEXTURESLump(UINT16 wadNum, UINT16 lumpNum);
|
||||||
void R_ParseTEXTURESLump(UINT16 wadNum, UINT16 lumpNum, INT32 *index);
|
void R_ParseTEXTURESLump(UINT16 wadNum, UINT16 lumpNum, INT32 *index);
|
||||||
|
|
||||||
//
|
#ifdef WALLFLATS
|
||||||
// R_LoadTextures
|
static INT32
|
||||||
// Initializes the texture list with the textures from the world map.
|
Rloadflats (INT32 i, INT32 w)
|
||||||
//
|
|
||||||
#define TX_START "TX_START"
|
|
||||||
#define TX_END "TX_END"
|
|
||||||
void R_LoadTextures(void)
|
|
||||||
{
|
{
|
||||||
INT32 i, w;
|
|
||||||
UINT16 j;
|
UINT16 j;
|
||||||
UINT16 texstart, texend, texturesLumpPos;
|
UINT16 texstart, texend;
|
||||||
patch_t *patchlump;
|
|
||||||
texpatch_t *patch;
|
|
||||||
texture_t *texture;
|
texture_t *texture;
|
||||||
|
texpatch_t *patch;
|
||||||
|
|
||||||
// Free previous memory before numtextures change.
|
// Yes
|
||||||
if (numtextures)
|
if (wadfiles[w]->type == RET_PK3)
|
||||||
{
|
{
|
||||||
for (i = 0; i < numtextures; i++)
|
texstart = W_CheckNumForFolderStartPK3("flats/", (UINT16)w, 0);
|
||||||
{
|
texend = W_CheckNumForFolderEndPK3("flats/", (UINT16)w, texstart);
|
||||||
Z_Free(textures[i]);
|
}
|
||||||
Z_Free(texturecache[i]);
|
else
|
||||||
}
|
{
|
||||||
Z_Free(texturetranslation);
|
texstart = W_CheckNumForNamePwad("F_START", (UINT16)w, 0);
|
||||||
Z_Free(textures);
|
texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart);
|
||||||
Z_Free(texflats);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load patches and textures.
|
if (!( texstart == INT16_MAX || texend == INT16_MAX ))
|
||||||
|
|
||||||
// Get the number of textures to check.
|
|
||||||
// NOTE: Make SURE the system does not process
|
|
||||||
// the markers.
|
|
||||||
// This system will allocate memory for all duplicate/patched textures even if it never uses them,
|
|
||||||
// but the alternative is to spend a ton of time checking and re-checking all previous entries just to skip any potentially patched textures.
|
|
||||||
for (w = 0, numtextures = 0; w < numwadfiles; w++)
|
|
||||||
{
|
{
|
||||||
// Count the textures from TEXTURES lumps
|
|
||||||
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0);
|
|
||||||
while (texturesLumpPos != INT16_MAX)
|
|
||||||
{
|
|
||||||
numtextures += R_CountTexturesInTEXTURESLump((UINT16)w, (UINT16)texturesLumpPos);
|
|
||||||
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, texturesLumpPos + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Count single-patch textures
|
|
||||||
if (wadfiles[w]->type == RET_PK3)
|
|
||||||
{
|
|
||||||
texstart = W_CheckNumForFolderStartPK3("textures/", (UINT16)w, 0);
|
|
||||||
texend = W_CheckNumForFolderEndPK3("textures/", (UINT16)w, texstart);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
texstart = W_CheckNumForNamePwad(TX_START, (UINT16)w, 0);
|
|
||||||
texend = W_CheckNumForNamePwad(TX_END, (UINT16)w, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texstart == INT16_MAX || texend == INT16_MAX)
|
|
||||||
#ifdef WALLFLATS
|
|
||||||
goto countflats;
|
|
||||||
#else
|
|
||||||
continue;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
texstart++; // Do not count the first marker
|
|
||||||
|
|
||||||
// PK3s have subfolders, so we can't just make a simple sum
|
|
||||||
if (wadfiles[w]->type == RET_PK3)
|
|
||||||
{
|
|
||||||
for (j = texstart; j < texend; j++)
|
|
||||||
{
|
|
||||||
if (!W_IsLumpFolder((UINT16)w, j)) // Check if lump is a folder; if not, then count it
|
|
||||||
numtextures++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // Add all the textures between TX_START and TX_END
|
|
||||||
{
|
|
||||||
numtextures += (UINT32)(texend - texstart);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef WALLFLATS
|
|
||||||
countflats:
|
|
||||||
// Count flats
|
|
||||||
if (wadfiles[w]->type == RET_PK3)
|
|
||||||
{
|
|
||||||
texstart = W_CheckNumForFolderStartPK3("flats/", (UINT16)w, 0);
|
|
||||||
texend = W_CheckNumForFolderEndPK3("flats/", (UINT16)w, texstart);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
texstart = W_CheckNumForNamePwad("F_START", (UINT16)w, 0);
|
|
||||||
texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texstart == INT16_MAX || texend == INT16_MAX)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
texstart++; // Do not count the first marker
|
|
||||||
|
|
||||||
// PK3s have subfolders, so we can't just make a simple sum
|
|
||||||
if (wadfiles[w]->type == RET_PK3)
|
|
||||||
{
|
|
||||||
for (j = texstart; j < texend; j++)
|
|
||||||
{
|
|
||||||
if (!W_IsLumpFolder((UINT16)w, j)) // Check if lump is a folder; if not, then count it
|
|
||||||
numtextures++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // Add all the textures between F_START and F_END
|
|
||||||
{
|
|
||||||
numtextures += (UINT32)(texend - texstart);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no textures found by this point, bomb out
|
|
||||||
if (!numtextures)
|
|
||||||
I_Error("No textures detected in any WADs!\n");
|
|
||||||
|
|
||||||
// Allocate memory and initialize to 0 for all the textures we are initialising.
|
|
||||||
// There are actually 5 buffers allocated in one for convenience.
|
|
||||||
textures = Z_Calloc((numtextures * sizeof(void *)) * 5, PU_STATIC, NULL);
|
|
||||||
texflats = Z_Calloc((numtextures * sizeof(*texflats)), PU_STATIC, NULL);
|
|
||||||
|
|
||||||
// Allocate texture column offset table.
|
|
||||||
texturecolumnofs = (void *)((UINT8 *)textures + (numtextures * sizeof(void *)));
|
|
||||||
// Allocate texture referencing cache.
|
|
||||||
texturecache = (void *)((UINT8 *)textures + ((numtextures * sizeof(void *)) * 2));
|
|
||||||
// Allocate texture width table.
|
|
||||||
texturewidth = (void *)((UINT8 *)textures + ((numtextures * sizeof(void *)) * 3));
|
|
||||||
// Allocate texture height table.
|
|
||||||
textureheight = (void *)((UINT8 *)textures + ((numtextures * sizeof(void *)) * 4));
|
|
||||||
// Create translation table for global animation.
|
|
||||||
texturetranslation = Z_Malloc((numtextures + 1) * sizeof(*texturetranslation), PU_STATIC, NULL);
|
|
||||||
|
|
||||||
for (i = 0; i < numtextures; i++)
|
|
||||||
texturetranslation[i] = i;
|
|
||||||
|
|
||||||
for (i = 0, w = 0; w < numwadfiles; w++)
|
|
||||||
{
|
|
||||||
// Get the lump numbers for the markers in the WAD, if they exist.
|
|
||||||
if (wadfiles[w]->type == RET_PK3)
|
|
||||||
{
|
|
||||||
texstart = W_CheckNumForFolderStartPK3("textures/", (UINT16)w, 0);
|
|
||||||
texend = W_CheckNumForFolderEndPK3("textures/", (UINT16)w, texstart);
|
|
||||||
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0);
|
|
||||||
while (texturesLumpPos != INT16_MAX)
|
|
||||||
{
|
|
||||||
R_ParseTEXTURESLump(w, texturesLumpPos, &i);
|
|
||||||
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, texturesLumpPos + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
texstart = W_CheckNumForNamePwad(TX_START, (UINT16)w, 0);
|
|
||||||
texend = W_CheckNumForNamePwad(TX_END, (UINT16)w, 0);
|
|
||||||
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0);
|
|
||||||
if (texturesLumpPos != INT16_MAX)
|
|
||||||
R_ParseTEXTURESLump(w, texturesLumpPos, &i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texstart == INT16_MAX || texend == INT16_MAX)
|
|
||||||
#ifdef WALLFLATS
|
|
||||||
goto checkflats;
|
|
||||||
#else
|
|
||||||
continue;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
texstart++; // Do not count the first marker
|
|
||||||
|
|
||||||
// Work through each lump between the markers in the WAD.
|
|
||||||
for (j = 0; j < (texend - texstart); j++)
|
|
||||||
{
|
|
||||||
UINT16 wadnum = (UINT16)w;
|
|
||||||
lumpnum_t lumpnum = texstart + j;
|
|
||||||
#ifndef NO_PNG_LUMPS
|
|
||||||
size_t lumplength;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (wadfiles[w]->type == RET_PK3)
|
|
||||||
{
|
|
||||||
if (W_IsLumpFolder(wadnum, lumpnum)) // Check if lump is a folder
|
|
||||||
continue; // If it is then SKIP IT
|
|
||||||
}
|
|
||||||
|
|
||||||
patchlump = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE);
|
|
||||||
#ifndef NO_PNG_LUMPS
|
|
||||||
lumplength = W_LumpLengthPwad(wadnum, lumpnum);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//CONS_Printf("\n\"%s\" is a single patch, dimensions %d x %d",W_CheckNameForNumPwad((UINT16)w,texstart+j),patchlump->width, patchlump->height);
|
|
||||||
texture = textures[i] = Z_Calloc(sizeof(texture_t) + sizeof(texpatch_t), PU_STATIC, NULL);
|
|
||||||
|
|
||||||
// Set texture properties.
|
|
||||||
M_Memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name));
|
|
||||||
|
|
||||||
#ifndef NO_PNG_LUMPS
|
|
||||||
if (R_IsLumpPNG((UINT8 *)patchlump, lumplength))
|
|
||||||
{
|
|
||||||
INT16 width, height;
|
|
||||||
R_PNGDimensions((UINT8 *)patchlump, &width, &height, lumplength);
|
|
||||||
texture->width = width;
|
|
||||||
texture->height = height;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
texture->width = SHORT(patchlump->width);
|
|
||||||
texture->height = SHORT(patchlump->height);
|
|
||||||
}
|
|
||||||
|
|
||||||
texture->type = TEXTURETYPE_SINGLEPATCH;
|
|
||||||
texture->patchcount = 1;
|
|
||||||
texture->holes = false;
|
|
||||||
texture->flip = 0;
|
|
||||||
|
|
||||||
// Allocate information for the texture's patches.
|
|
||||||
patch = &texture->patches[0];
|
|
||||||
|
|
||||||
patch->originx = patch->originy = 0;
|
|
||||||
patch->wad = (UINT16)w;
|
|
||||||
patch->lump = texstart + j;
|
|
||||||
patch->flip = 0;
|
|
||||||
|
|
||||||
Z_Unlock(patchlump);
|
|
||||||
|
|
||||||
texturewidth[i] = texture->width;
|
|
||||||
textureheight[i] = texture->height << FRACBITS;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef WALLFLATS
|
|
||||||
checkflats:
|
|
||||||
// Yes
|
|
||||||
if (wadfiles[w]->type == RET_PK3)
|
|
||||||
{
|
|
||||||
texstart = W_CheckNumForFolderStartPK3("flats/", (UINT16)w, 0);
|
|
||||||
texend = W_CheckNumForFolderEndPK3("flats/", (UINT16)w, texstart);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
texstart = W_CheckNumForNamePwad("F_START", (UINT16)w, 0);
|
|
||||||
texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texstart == INT16_MAX || texend == INT16_MAX)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
texstart++; // Do not count the first marker
|
texstart++; // Do not count the first marker
|
||||||
|
|
||||||
// Work through each lump between the markers in the WAD.
|
// Work through each lump between the markers in the WAD.
|
||||||
|
@ -1029,7 +804,248 @@ checkflats:
|
||||||
textureheight[i] = texture->height << FRACBITS;
|
textureheight[i] = texture->height << FRACBITS;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
#endif/*WALLFLATS*/
|
||||||
|
|
||||||
|
#define TX_START "TX_START"
|
||||||
|
#define TX_END "TX_END"
|
||||||
|
|
||||||
|
static INT32
|
||||||
|
Rloadtextures (INT32 i, INT32 w)
|
||||||
|
{
|
||||||
|
UINT16 j;
|
||||||
|
UINT16 texstart, texend, texturesLumpPos;
|
||||||
|
texture_t *texture;
|
||||||
|
patch_t *patchlump;
|
||||||
|
texpatch_t *patch;
|
||||||
|
|
||||||
|
// Get the lump numbers for the markers in the WAD, if they exist.
|
||||||
|
if (wadfiles[w]->type == RET_PK3)
|
||||||
|
{
|
||||||
|
texstart = W_CheckNumForFolderStartPK3("textures/", (UINT16)w, 0);
|
||||||
|
texend = W_CheckNumForFolderEndPK3("textures/", (UINT16)w, texstart);
|
||||||
|
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0);
|
||||||
|
while (texturesLumpPos != INT16_MAX)
|
||||||
|
{
|
||||||
|
R_ParseTEXTURESLump(w, texturesLumpPos, &i);
|
||||||
|
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, texturesLumpPos + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
texstart = W_CheckNumForNamePwad(TX_START, (UINT16)w, 0);
|
||||||
|
texend = W_CheckNumForNamePwad(TX_END, (UINT16)w, 0);
|
||||||
|
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0);
|
||||||
|
if (texturesLumpPos != INT16_MAX)
|
||||||
|
R_ParseTEXTURESLump(w, texturesLumpPos, &i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!( texstart == INT16_MAX || texend == INT16_MAX ))
|
||||||
|
{
|
||||||
|
texstart++; // Do not count the first marker
|
||||||
|
|
||||||
|
// Work through each lump between the markers in the WAD.
|
||||||
|
for (j = 0; j < (texend - texstart); j++)
|
||||||
|
{
|
||||||
|
UINT16 wadnum = (UINT16)w;
|
||||||
|
lumpnum_t lumpnum = texstart + j;
|
||||||
|
#ifndef NO_PNG_LUMPS
|
||||||
|
size_t lumplength;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (wadfiles[w]->type == RET_PK3)
|
||||||
|
{
|
||||||
|
if (W_IsLumpFolder(wadnum, lumpnum)) // Check if lump is a folder
|
||||||
|
continue; // If it is then SKIP IT
|
||||||
|
}
|
||||||
|
|
||||||
|
patchlump = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE);
|
||||||
|
#ifndef NO_PNG_LUMPS
|
||||||
|
lumplength = W_LumpLengthPwad(wadnum, lumpnum);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//CONS_Printf("\n\"%s\" is a single patch, dimensions %d x %d",W_CheckNameForNumPwad((UINT16)w,texstart+j),patchlump->width, patchlump->height);
|
||||||
|
texture = textures[i] = Z_Calloc(sizeof(texture_t) + sizeof(texpatch_t), PU_STATIC, NULL);
|
||||||
|
|
||||||
|
// Set texture properties.
|
||||||
|
M_Memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name));
|
||||||
|
|
||||||
|
#ifndef NO_PNG_LUMPS
|
||||||
|
if (R_IsLumpPNG((UINT8 *)patchlump, lumplength))
|
||||||
|
{
|
||||||
|
INT16 width, height;
|
||||||
|
R_PNGDimensions((UINT8 *)patchlump, &width, &height, lumplength);
|
||||||
|
texture->width = width;
|
||||||
|
texture->height = height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
texture->width = SHORT(patchlump->width);
|
||||||
|
texture->height = SHORT(patchlump->height);
|
||||||
|
}
|
||||||
|
|
||||||
|
texture->type = TEXTURETYPE_SINGLEPATCH;
|
||||||
|
texture->patchcount = 1;
|
||||||
|
texture->holes = false;
|
||||||
|
texture->flip = 0;
|
||||||
|
|
||||||
|
// Allocate information for the texture's patches.
|
||||||
|
patch = &texture->patches[0];
|
||||||
|
|
||||||
|
patch->originx = patch->originy = 0;
|
||||||
|
patch->wad = (UINT16)w;
|
||||||
|
patch->lump = texstart + j;
|
||||||
|
patch->flip = 0;
|
||||||
|
|
||||||
|
Z_Unlock(patchlump);
|
||||||
|
|
||||||
|
texturewidth[i] = texture->width;
|
||||||
|
textureheight[i] = texture->height << FRACBITS;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_LoadTextures
|
||||||
|
// Initializes the texture list with the textures from the world map.
|
||||||
|
//
|
||||||
|
void R_LoadTextures(void)
|
||||||
|
{
|
||||||
|
INT32 i, w;
|
||||||
|
UINT16 j;
|
||||||
|
UINT16 texstart, texend, texturesLumpPos;
|
||||||
|
|
||||||
|
// Free previous memory before numtextures change.
|
||||||
|
if (numtextures)
|
||||||
|
{
|
||||||
|
for (i = 0; i < numtextures; i++)
|
||||||
|
{
|
||||||
|
Z_Free(textures[i]);
|
||||||
|
Z_Free(texturecache[i]);
|
||||||
|
}
|
||||||
|
Z_Free(texturetranslation);
|
||||||
|
Z_Free(textures);
|
||||||
|
Z_Free(texflats);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load patches and textures.
|
||||||
|
|
||||||
|
// Get the number of textures to check.
|
||||||
|
// NOTE: Make SURE the system does not process
|
||||||
|
// the markers.
|
||||||
|
// This system will allocate memory for all duplicate/patched textures even if it never uses them,
|
||||||
|
// but the alternative is to spend a ton of time checking and re-checking all previous entries just to skip any potentially patched textures.
|
||||||
|
for (w = 0, numtextures = 0; w < numwadfiles; w++)
|
||||||
|
{
|
||||||
|
#ifdef WALLFLATS
|
||||||
|
// Count flats
|
||||||
|
if (wadfiles[w]->type == RET_PK3)
|
||||||
|
{
|
||||||
|
texstart = W_CheckNumForFolderStartPK3("flats/", (UINT16)w, 0);
|
||||||
|
texend = W_CheckNumForFolderEndPK3("flats/", (UINT16)w, texstart);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
texstart = W_CheckNumForNamePwad("F_START", (UINT16)w, 0);
|
||||||
|
texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!( texstart == INT16_MAX || texend == INT16_MAX ))
|
||||||
|
{
|
||||||
|
texstart++; // Do not count the first marker
|
||||||
|
|
||||||
|
// PK3s have subfolders, so we can't just make a simple sum
|
||||||
|
if (wadfiles[w]->type == RET_PK3)
|
||||||
|
{
|
||||||
|
for (j = texstart; j < texend; j++)
|
||||||
|
{
|
||||||
|
if (!W_IsLumpFolder((UINT16)w, j)) // Check if lump is a folder; if not, then count it
|
||||||
|
numtextures++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // Add all the textures between F_START and F_END
|
||||||
|
{
|
||||||
|
numtextures += (UINT32)(texend - texstart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif/*WALLFLATS*/
|
||||||
|
|
||||||
|
// Count the textures from TEXTURES lumps
|
||||||
|
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0);
|
||||||
|
while (texturesLumpPos != INT16_MAX)
|
||||||
|
{
|
||||||
|
numtextures += R_CountTexturesInTEXTURESLump((UINT16)w, (UINT16)texturesLumpPos);
|
||||||
|
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, texturesLumpPos + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count single-patch textures
|
||||||
|
if (wadfiles[w]->type == RET_PK3)
|
||||||
|
{
|
||||||
|
texstart = W_CheckNumForFolderStartPK3("textures/", (UINT16)w, 0);
|
||||||
|
texend = W_CheckNumForFolderEndPK3("textures/", (UINT16)w, texstart);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
texstart = W_CheckNumForNamePwad(TX_START, (UINT16)w, 0);
|
||||||
|
texend = W_CheckNumForNamePwad(TX_END, (UINT16)w, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (texstart == INT16_MAX || texend == INT16_MAX)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
texstart++; // Do not count the first marker
|
||||||
|
|
||||||
|
// PK3s have subfolders, so we can't just make a simple sum
|
||||||
|
if (wadfiles[w]->type == RET_PK3)
|
||||||
|
{
|
||||||
|
for (j = texstart; j < texend; j++)
|
||||||
|
{
|
||||||
|
if (!W_IsLumpFolder((UINT16)w, j)) // Check if lump is a folder; if not, then count it
|
||||||
|
numtextures++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // Add all the textures between TX_START and TX_END
|
||||||
|
{
|
||||||
|
numtextures += (UINT32)(texend - texstart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no textures found by this point, bomb out
|
||||||
|
if (!numtextures)
|
||||||
|
I_Error("No textures detected in any WADs!\n");
|
||||||
|
|
||||||
|
// Allocate memory and initialize to 0 for all the textures we are initialising.
|
||||||
|
// There are actually 5 buffers allocated in one for convenience.
|
||||||
|
textures = Z_Calloc((numtextures * sizeof(void *)) * 5, PU_STATIC, NULL);
|
||||||
|
texflats = Z_Calloc((numtextures * sizeof(*texflats)), PU_STATIC, NULL);
|
||||||
|
|
||||||
|
// Allocate texture column offset table.
|
||||||
|
texturecolumnofs = (void *)((UINT8 *)textures + (numtextures * sizeof(void *)));
|
||||||
|
// Allocate texture referencing cache.
|
||||||
|
texturecache = (void *)((UINT8 *)textures + ((numtextures * sizeof(void *)) * 2));
|
||||||
|
// Allocate texture width table.
|
||||||
|
texturewidth = (void *)((UINT8 *)textures + ((numtextures * sizeof(void *)) * 3));
|
||||||
|
// Allocate texture height table.
|
||||||
|
textureheight = (void *)((UINT8 *)textures + ((numtextures * sizeof(void *)) * 4));
|
||||||
|
// Create translation table for global animation.
|
||||||
|
texturetranslation = Z_Malloc((numtextures + 1) * sizeof(*texturetranslation), PU_STATIC, NULL);
|
||||||
|
|
||||||
|
for (i = 0; i < numtextures; i++)
|
||||||
|
texturetranslation[i] = i;
|
||||||
|
|
||||||
|
for (i = 0, w = 0; w < numwadfiles; w++)
|
||||||
|
{
|
||||||
|
#ifdef WALLFLATS
|
||||||
|
i = Rloadflats(i, w);
|
||||||
|
#endif
|
||||||
|
i = Rloadtextures(i, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
|
|
|
@ -117,6 +117,13 @@ static consvar_t surround = {"surround", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL
|
||||||
consvar_t cv_resetmusic = {"resetmusic", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_resetmusic = {"resetmusic", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_resetmusicbyheader = {"resetmusicbyheader", "Yes", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_resetmusicbyheader = {"resetmusicbyheader", "Yes", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
static CV_PossibleValue_t cons_1upsound_t[] = {
|
||||||
|
{0, "Jingle"},
|
||||||
|
{1, "Sound"},
|
||||||
|
{0, NULL}
|
||||||
|
};
|
||||||
|
consvar_t cv_1upsound = {"1upsound", "Jingle", CV_SAVE, cons_1upsound_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
// Sound system toggles, saved into the config
|
// Sound system toggles, saved into the config
|
||||||
consvar_t cv_gamedigimusic = {"digimusic", "On", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, GameDigiMusic_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_gamedigimusic = {"digimusic", "On", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, GameDigiMusic_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_gamemidimusic = {"midimusic", "On", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, GameMIDIMusic_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_gamemidimusic = {"midimusic", "On", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, GameMIDIMusic_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
@ -287,6 +294,7 @@ void S_RegisterSoundStuff(void)
|
||||||
CV_RegisterVar(&cv_samplerate);
|
CV_RegisterVar(&cv_samplerate);
|
||||||
CV_RegisterVar(&cv_resetmusic);
|
CV_RegisterVar(&cv_resetmusic);
|
||||||
CV_RegisterVar(&cv_resetmusicbyheader);
|
CV_RegisterVar(&cv_resetmusicbyheader);
|
||||||
|
CV_RegisterVar(&cv_1upsound);
|
||||||
CV_RegisterVar(&cv_playsoundsifunfocused);
|
CV_RegisterVar(&cv_playsoundsifunfocused);
|
||||||
CV_RegisterVar(&cv_playmusicifunfocused);
|
CV_RegisterVar(&cv_playmusicifunfocused);
|
||||||
CV_RegisterVar(&cv_gamesounds);
|
CV_RegisterVar(&cv_gamesounds);
|
||||||
|
|
|
@ -35,6 +35,8 @@ extern consvar_t cv_numChannels;
|
||||||
extern consvar_t cv_resetmusic;
|
extern consvar_t cv_resetmusic;
|
||||||
extern consvar_t cv_resetmusicbyheader;
|
extern consvar_t cv_resetmusicbyheader;
|
||||||
|
|
||||||
|
extern consvar_t cv_1upsound;
|
||||||
|
|
||||||
#define RESETMUSIC (!modeattacking && \
|
#define RESETMUSIC (!modeattacking && \
|
||||||
(cv_resetmusicbyheader.value ? \
|
(cv_resetmusicbyheader.value ? \
|
||||||
(mapheaderinfo[gamemap-1]->musforcereset != -1 ? mapheaderinfo[gamemap-1]->musforcereset : cv_resetmusic.value) \
|
(mapheaderinfo[gamemap-1]->musforcereset != -1 ? mapheaderinfo[gamemap-1]->musforcereset : cv_resetmusic.value) \
|
||||||
|
|
Loading…
Reference in New Issue