diff --git a/src/d_main.c b/src/d_main.c index 6eafb88cf..307baa90c 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -353,7 +353,7 @@ static void D_Display(void) if (gamestate != GS_LEVEL && rendermode != render_none) { V_SetPaletteLump("PLAYPAL"); // Reset the palette - R_ReInitColormaps(0, LUMPERROR); + R_ReInitColormaps(0, NULL, 0); } F_WipeStartScreen(); @@ -1194,6 +1194,8 @@ void D_SRB2Main(void) INT32 i; UINT16 wadnum; char *name; + virtres_t *virtmap; + virtlump_t *minimap, *thumbnailPic; INT32 p; @@ -1455,6 +1457,24 @@ void D_SRB2Main(void) for (i = 0; i < numbasemapheaders; ++i) { name = mapheaderinfo[i]->lumpname; + mapheaderinfo[i]->lumpnum = W_CheckNumForMap(name); + + // Get map thumbnail and minimap + virtmap = vres_GetMap(mapheaderinfo[i]->lumpnum); + thumbnailPic = vres_Find(virtmap, "PICTURE"); + minimap = vres_Find(virtmap, "MINIMAP"); + + if (thumbnailPic) + { + mapheaderinfo[i]->thumbnailPic = vres_GetPatch(thumbnailPic, PU_CACHE); + } + + if (minimap) + { + mapheaderinfo[i]->minimapPic = vres_GetPatch(minimap, PU_HUDGFX); + } + + vres_Free(virtmap); if (W_CheckNumForMapPwad(name, wadnum, 0) != INT16_MAX) { diff --git a/src/deh_soc.c b/src/deh_soc.c index 7bdf8b35f..e574b0c5e 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -1275,22 +1275,6 @@ void readlevelheader(MYFILE *f, char * name) } // Strings that can be truncated - else if (fastcmp(word, "THUMBNAIL")) - { - mapheaderinfo[num-1]->thumbnailLump = Z_StrDup(word2); - } - else if (fastcmp(word, "MINIMAP")) - { - mapheaderinfo[num-1]->minimapLump = Z_StrDup(word2); - } - else if (fastcmp(word, "ENCOREMAP")) - { - mapheaderinfo[num-1]->encoreLump = Z_StrDup(word2); - } - else if (fastcmp(word, "TWEAKMAP")) - { - mapheaderinfo[num-1]->tweakLump = Z_StrDup(word2); - } else if (fastcmp(word, "NEXTLEVEL")) { mapheaderinfo[num-1]->nextlevel = Z_StrDup(word2); diff --git a/src/doomstat.h b/src/doomstat.h index 32b48eb27..9c48985e6 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -25,6 +25,9 @@ // We need the player data structure as well. #include "d_player.h" +// For lumpnum_t. +#include "w_wad.h" + // ============================= // Selected map etc. // ============================= @@ -338,11 +341,12 @@ typedef struct typedef struct { char * lumpname; ///< Lump name can be really long + lumpnum_t lumpnum; ///< Lump number for the map, used by vres_GetMap - char * thumbnailLump; ///< Lump name for the level select thumbnail. - char * minimapLump; ///< Lump name for the minimap graphic. - char * encoreLump; ///< Lump name for the Encore Mode remap. - char * tweakLump; ///< Lump name for the palette tweak remap. + void * thumbnailPic; ///< Lump data for the level select thumbnail. + void * minimapPic; ///< Lump data for the minimap graphic. + void * encoreLump; ///< Lump data for the Encore Mode remap. + void * tweakLump; ///< Lump data for the palette tweak remap. char lvlttl[22]; ///< Level name without "Zone". (21 character limit instead of 32, 21 characters can display on screen max anyway) char subttl[33]; ///< Subtitle for level diff --git a/src/k_hud.c b/src/k_hud.c index 0b2504ae5..de22f42a9 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -3395,7 +3395,6 @@ static void K_drawKartMinimapIcon(fixed_t objx, fixed_t objy, INT32 hudx, INT32 static void K_drawKartMinimap(void) { - lumpnum_t lumpnum = LUMPERROR; patch_t *AutomapPic; INT32 i = 0; INT32 x, y; @@ -3418,20 +3417,14 @@ static void K_drawKartMinimap(void) // Maybe move this somewhere else where this won't be a concern? if (stplyr != &players[displayplayers[0]]) return; -#if 0 - if (mapheaderinfo[gamemap-1]) - { - lumpnum = W_CheckNumForLongName(mapheaderinfo[gamemap-1]->minimapLump); - } -#endif - if (lumpnum == LUMPERROR) + AutomapPic = mapheaderinfo[gamemap-1]->minimapPic; + + if (!AutomapPic) { return; // no pic, just get outta here } - AutomapPic = W_CachePatchNum(lumpnum, PU_HUDGFX); - if (r_splitscreen < 2) // 1/2P right aligned { splitflags = (V_SLIDEIN|V_SNAPTORIGHT); diff --git a/src/k_menudraw.c b/src/k_menudraw.c index 657b6a379..a780b364e 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -1847,17 +1847,14 @@ static void M_DrawCupPreview(INT16 y, cupheader_t *cup) while (x < BASEVIDWIDTH + pad) { INT32 cupLevelNum = G_MapNumber(cup->levellist[i]); - lumpnum_t lumpnum = LUMPERROR; - patch_t *PictureOfLevel; + patch_t *PictureOfLevel = NULL; if (mapheaderinfo[cupLevelNum]) { - lumpnum = W_CheckNumForLongName(mapheaderinfo[cupLevelNum]->thumbnailLump); + PictureOfLevel = mapheaderinfo[cupLevelNum]->thumbnailPic; } - if (lumpnum != LUMPERROR) - PictureOfLevel = W_CachePatchNum(lumpnum, PU_CACHE); - else + if (!PictureOfLevel) PictureOfLevel = W_CachePatchName("BLANKLVL", PU_CACHE); V_DrawSmallScaledPatch(x + 1, y+2, 0, PictureOfLevel); @@ -2078,8 +2075,7 @@ static void M_DrawHighLowLevelTitle(INT16 x, INT16 y, INT16 map) static void M_DrawLevelSelectBlock(INT16 x, INT16 y, INT16 map, boolean redblink, boolean greyscale) { - lumpnum_t lumpnum = LUMPERROR; - patch_t *PictureOfLevel; + patch_t *PictureOfLevel = NULL; UINT8 *colormap = NULL; if (greyscale) @@ -2087,12 +2083,10 @@ static void M_DrawLevelSelectBlock(INT16 x, INT16 y, INT16 map, boolean redblink if (mapheaderinfo[map]) { - lumpnum = W_CheckNumForLongName(mapheaderinfo[map]->thumbnailLump); + PictureOfLevel = mapheaderinfo[map]->thumbnailPic; } - if (lumpnum != LUMPERROR) - PictureOfLevel = W_CachePatchNum(lumpnum, PU_CACHE); - else + if (!PictureOfLevel) PictureOfLevel = W_CachePatchName("BLANKLVL", PU_CACHE); if (redblink) @@ -2155,7 +2149,7 @@ void M_DrawTimeAttack(void) INT16 rightedge = 149+t+155; INT16 opty = 140; INT32 w; - lumpnum_t lumpnum = LUMPERROR; + patch_t *minimap = NULL; UINT8 i; consvar_t *cv; @@ -2169,11 +2163,11 @@ void M_DrawTimeAttack(void) { if (mapheaderinfo[map]) { - lumpnum = W_CheckNumForName(mapheaderinfo[map]->minimapLump); + minimap = mapheaderinfo[map]->minimapPic; } - if (lumpnum != LUMPERROR) - V_DrawScaledPatch(24-t, 82, 0, W_CachePatchNum(lumpnum, PU_CACHE)); + if (!minimap) + V_DrawScaledPatch(24-t, 82, 0, minimap); V_DrawRightAlignedString(rightedge-12, 82, highlightflags, "BEST LAP:"); K_drawKartTimestamp(0, 162+t, 88, 0, 2); @@ -3838,8 +3832,7 @@ void M_DrawPlaybackMenu(void) #define SCALEDVIEWHEIGHT (vid.height/vid.dupy) void M_DrawReplayHutReplayInfo(void) { - lumpnum_t lumpnum = LUMPERROR; - patch_t *patch; + patch_t *patch = NULL; UINT8 *colormap; INT32 x, y, w, h; @@ -3868,12 +3861,10 @@ void M_DrawReplayHutReplayInfo(void) if (mapheaderinfo[extrasmenu.demolist[dir_on[menudepthleft]].map]) { - lumpnum = W_CheckNumForName(mapheaderinfo[extrasmenu.demolist[dir_on[menudepthleft]].map]->thumbnailLump); + patch = mapheaderinfo[extrasmenu.demolist[dir_on[menudepthleft]].map]->thumbnailPic; } - if (lumpnum != LUMPERROR) - patch = W_CachePatchNum(lumpnum, PU_CACHE); - else + if (!patch) patch = W_CachePatchName("M_NOLVL", PU_CACHE); if (!(extrasmenu.demolist[dir_on[menudepthleft]].kartspeed & DF_ENCORE)) diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index db22c6b2c..6ce41dea5 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -600,7 +600,6 @@ static int libd_drawOnMinimap(lua_State *L) huddrawlist_h list; // variables used to replicate k_kart's mmap drawer: - lumpnum_t lumpnum = LUMPERROR; patch_t *AutomapPic; INT32 mx, my; INT32 splitflags, minimaptrans; @@ -686,18 +685,13 @@ static int libd_drawOnMinimap(lua_State *L) if (stplyr != &players[displayplayers[0]]) return 0; - if (mapheaderinfo[gamemap-1]) - { - lumpnum = W_CheckNumForLongName(mapheaderinfo[gamemap-1]->minimapLump); - } + AutomapPic = mapheaderinfo[gamemap-1]->minimapPic; - if (lumpnum == LUMPERROR) + if (!AutomapPic) { return 0; // no pic, just get outta here } - AutomapPic = W_CachePatchNum(lumpnum, PU_HUDGFX); - mx = MM_X - (AutomapPic->width/2); my = MM_Y - (AutomapPic->height/2); diff --git a/src/p_setup.c b/src/p_setup.c index 124c5c541..bc2df7862 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -134,6 +134,8 @@ boolean stoppedclock; boolean levelloading; UINT8 levelfadecol; +virtres_t *curmapvirt; + // BLOCKMAP // Created from axis aligned bounding box // of the map, a rectangular array of @@ -361,28 +363,16 @@ static void P_ClearSingleMapHeaderInfo(INT16 i) { const INT16 num = (INT16)(i-1); - if (mapheaderinfo[num]->thumbnailLump) + if (mapheaderinfo[num]->thumbnailPic) { - Z_Free(mapheaderinfo[num]->thumbnailLump); - mapheaderinfo[num]->thumbnailLump = NULL; + Z_Free(mapheaderinfo[num]->thumbnailPic); + mapheaderinfo[num]->thumbnailPic = NULL; } - if (mapheaderinfo[num]->minimapLump) + if (mapheaderinfo[num]->minimapPic) { - Z_Free(mapheaderinfo[num]->minimapLump); - mapheaderinfo[num]->minimapLump = NULL; - } - - if (mapheaderinfo[num]->encoreLump) - { - Z_Free(mapheaderinfo[num]->encoreLump); - mapheaderinfo[num]->encoreLump = NULL; - } - - if (mapheaderinfo[num]->tweakLump) - { - Z_Free(mapheaderinfo[num]->tweakLump); - mapheaderinfo[num]->tweakLump = NULL; + Z_Free(mapheaderinfo[num]->minimapPic); + mapheaderinfo[num]->minimapPic = NULL; } if (mapheaderinfo[num]->nextlevel) @@ -469,11 +459,10 @@ void P_AllocMapHeader(INT16 i) if (!mapheaderinfo[i]) { mapheaderinfo[i] = Z_Malloc(sizeof(mapheader_t), PU_STATIC, NULL); + mapheaderinfo[i]->lumpnum = LUMPERROR; mapheaderinfo[i]->lumpname = NULL; - mapheaderinfo[i]->thumbnailLump = NULL; - mapheaderinfo[i]->minimapLump = NULL; - mapheaderinfo[i]->encoreLump = NULL; - mapheaderinfo[i]->tweakLump = NULL; + mapheaderinfo[i]->thumbnailPic = NULL; + mapheaderinfo[i]->minimapPic = NULL; mapheaderinfo[i]->nextlevel = NULL; mapheaderinfo[i]->marathonnext = NULL; mapheaderinfo[i]->flickies = NULL; @@ -3600,15 +3589,14 @@ static void P_MakeMapMD5(virtres_t *virt, void *dest) static boolean P_LoadMapFromFile(void) { - virtres_t *virt = vres_GetMap(lastloadedmaplumpnum); - virtlump_t *textmap = vres_Find(virt, "TEXTMAP"); + virtlump_t *textmap = vres_Find(curmapvirt, "TEXTMAP"); size_t i; udmf = textmap != NULL; - if (!P_LoadMapData(virt)) + if (!P_LoadMapData(curmapvirt)) return false; - P_LoadMapBSP(virt); - P_LoadMapLUT(virt); + P_LoadMapBSP(curmapvirt); + P_LoadMapLUT(curmapvirt); P_LinkMapData(); @@ -3633,9 +3621,9 @@ static boolean P_LoadMapFromFile(void) if (sectors[i].tags.count) spawnsectors[i].tags.tags = memcpy(Z_Malloc(sectors[i].tags.count*sizeof(mtag_t), PU_LEVEL, NULL), sectors[i].tags.tags, sectors[i].tags.count*sizeof(mtag_t)); - P_MakeMapMD5(virt, &mapmd5); + P_MakeMapMD5(curmapvirt, &mapmd5); - vres_Free(virt); + vres_Free(curmapvirt); return true; } @@ -4129,6 +4117,7 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate) // Map header should always be in place at this point INT32 i, ranspecialwipe = 0; sector_t *ss; + virtlump_t *encoreLump = NULL; levelloading = true; @@ -4355,24 +4344,27 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate) if (lastloadedmaplumpnum == LUMPERROR) I_Error("Map %s not found.\n", maplumpname); + curmapvirt = vres_GetMap(lastloadedmaplumpnum); + + if (mapheaderinfo[gamemap-1]) { - INT32 encoreLump = LUMPERROR; - -#if 0 - if (mapheaderinfo[gamemap-1]) + if (encoremode) { - if (encoremode) - { - encoreLump = W_CheckNumForLongName(mapheaderinfo[gamemap-1]->encoreLump); - } - else - { - encoreLump = W_CheckNumForLongName(mapheaderinfo[gamemap-1]->tweakLump); - } + encoreLump = vres_Find(curmapvirt, "ENCORE"); } + else + { + encoreLump = vres_Find(curmapvirt, "TWEAKMAP"); + } + } - R_ReInitColormaps(mapheaderinfo[gamemap-1]->palette, encoreLump); -#endif + if (encoreLump) + { + R_ReInitColormaps(mapheaderinfo[gamemap-1]->palette, encoreLump->data, encoreLump->size); + } + else + { + R_ReInitColormaps(mapheaderinfo[gamemap-1]->palette, NULL, 0); } CON_SetupBackColormap(); @@ -4677,6 +4669,8 @@ boolean P_AddWadFile(const char *wadfilename) UINT16 numlumps, wadnum; char *name; lumpinfo_t *lumpinfo; + virtres_t *virtmap; + virtlump_t *minimap, *thumbnailPic; //boolean texturechange = false; ///\todo Useless; broken when back-frontporting PK3 changes? boolean mapsadded = false; @@ -4834,6 +4828,28 @@ boolean P_AddWadFile(const char *wadfilename) { name = mapheaderinfo[map]->lumpname; + if (mapheaderinfo[i]->lumpnum != W_CheckNumForMap(name)) + { + mapheaderinfo[i]->lumpnum = W_CheckNumForMap(name); + + // Get map thumbnail and minimap + virtmap = vres_GetMap(mapheaderinfo[i]->lumpnum); + thumbnailPic = vres_Find(virtmap, "PICTURE"); + minimap = vres_Find(virtmap, "MINIMAP"); + + if (thumbnailPic) + { + mapheaderinfo[i]->thumbnailPic = vres_GetPatch(thumbnailPic, PU_CACHE); + } + + if (minimap) + { + mapheaderinfo[i]->minimapPic = vres_GetPatch(minimap, PU_HUDGFX); + } + + vres_Free(virtmap); + } + if (W_CheckNumForMapPwad(name, wadnum, 0) != INT16_MAX) { G_SetGameModified(multiplayer, true); // oops, double-defined - no record attack privileges for you diff --git a/src/r_data.c b/src/r_data.c index ddeb5e3b5..353a9bbf5 100644 --- a/src/r_data.c +++ b/src/r_data.c @@ -286,7 +286,7 @@ void R_InitColormaps(void) #endif } -void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap) +void R_ReInitColormaps(UINT16 num, void *newencoremap, size_t encoremapsize) { char colormap[9] = "COLORMAP"; lumpnum_t lump; @@ -309,13 +309,13 @@ void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap) W_ReadLumpHeader(lump, colormaps, W_LumpLength(basecolormaplump), 0U); // Encore mode. - if (newencoremap != LUMPERROR) + if (newencoremap) { lighttable_t *colormap_p, *colormap_p2; size_t p, i; encoremap = Z_MallocAlign(256 + 10, PU_LEVEL, NULL, 8); - W_ReadLump(newencoremap, encoremap); + M_Memcpy(encoremap, newencoremap, encoremapsize); colormap_p = colormap_p2 = colormaps; colormap_p += COLORMAP_REMAPOFFSET; diff --git a/src/r_data.h b/src/r_data.h index 3c8908a59..da3f81163 100644 --- a/src/r_data.h +++ b/src/r_data.h @@ -55,7 +55,7 @@ extern size_t flatmemory, spritememory, texturememory; //#define COLORMAPREVERSELIST void R_InitColormaps(void); -void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap); +void R_ReInitColormaps(UINT16 num, void *newencoremap, size_t encoremapsize); void R_ClearColormaps(void); extracolormap_t *R_CreateDefaultColormap(boolean lighttable); extracolormap_t *R_GetDefaultColormap(void); diff --git a/src/w_wad.c b/src/w_wad.c index 714928978..3bcd805c4 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -1771,7 +1771,7 @@ void *W_CacheLumpName(const char *name, INT32 tag) // Cache a patch into heap memory, convert the patch format as necessary // -static void MakePatch(void *lumpdata, size_t size, INT32 tag, void *cache) +static void *MakePatch(void *lumpdata, size_t size, INT32 tag, void *cache) { void *ptr, *dest; size_t len = size; @@ -1786,9 +1786,10 @@ static void MakePatch(void *lumpdata, size_t size, INT32 tag, void *cache) #endif dest = Z_Calloc(sizeof(patch_t), tag, cache); + Patch_Create(ptr, len, dest); - Z_Free(ptr); + return dest; } void *W_CacheSoftwarePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag) @@ -1809,6 +1810,7 @@ void *W_CacheSoftwarePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag) W_ReadLumpHeaderPwad(wad, lump, lumpdata, 0, 0); MakePatch(lumpdata, len, tag, &lumpcache[lump]); + Z_Free(lumpdata); } else Z_ChangeTag(lumpcache[lump], tag); @@ -2289,7 +2291,6 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum) vlumps[i].name[8] = '\0'; vlumps[i].data = Z_Malloc(vlumps[i].size, PU_LEVEL, NULL); // This is memory inefficient, sorry about that. memcpy(vlumps[i].data, wadData + (fileinfo + i)->filepos, vlumps[i].size); - vlumps[i].cache = NULL; } Z_Free(wadData); @@ -2310,7 +2311,6 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum) memcpy(vlumps[i].name, W_CheckNameForNum(lumpnum), 8); vlumps[i].name[8] = '\0'; vlumps[i].data = W_CacheLumpNum(lumpnum, PU_LEVEL); - vlumps[i].cache = NULL; } } vres = Z_Malloc(sizeof(virtres_t), PU_LEVEL, NULL); @@ -2327,7 +2327,12 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum) void vres_Free(virtres_t* vres) { while (vres->numlumps--) - Z_Free(vres->vlumps[vres->numlumps].data); + { + if (vres->vlumps[vres->numlumps].data) + { + Z_Free(vres->vlumps[vres->numlumps].data); + } + } Z_Free(vres->vlumps); Z_Free(vres); } @@ -2372,14 +2377,7 @@ void *vres_GetPatch(virtlump_t *vlump, INT32 tag) if (!vlump) return NULL; - if (!vlump->cache) - { - MakePatch(vlump->data, vlump->size, tag, &vlump->cache); - } - else - Z_ChangeTag(vlump->cache, tag); - - patch = vlump->cache; + patch = MakePatch(vlump->data, vlump->size, tag, NULL); #ifdef HWRENDER // Software-only compile cache the data without conversion diff --git a/src/w_wad.h b/src/w_wad.h index 71f46f46b..310e87203 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -82,7 +82,6 @@ typedef struct { char name[9]; UINT8* data; size_t size; - void *cache; } virtlump_t; typedef struct { @@ -93,7 +92,7 @@ typedef struct { virtres_t* vres_GetMap(lumpnum_t); void vres_Free(virtres_t*); virtlump_t* vres_Find(const virtres_t*, const char*); -void* vres_GetPatch(virtlump_t *vlump, INT32 tag); +void* vres_GetPatch(virtlump_t *vlump, INT32); // ========================================================================= // DYNAMIC WAD LOADING diff --git a/src/y_inter.c b/src/y_inter.c index bb788d509..08bd9bb92 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1490,8 +1490,6 @@ void Y_StartVote(void) for (i = 0; i < 4; i++) { - lumpnum_t lumpnum = LUMPERROR; - // set up the encore levelinfo[i].encore = (votelevels[i][1] & 0x80); votelevels[i][1] &= ~0x80; @@ -1534,13 +1532,14 @@ void Y_StartVote(void) levelinfo[i].gts = NULL; // set up the pic + patch_t *thumbnailPic = NULL; if (mapheaderinfo[votelevels[i][0]+1]) { - lumpnum = W_CheckNumForLongName(mapheaderinfo[votelevels[i][0]]->thumbnailLump); + thumbnailPic = mapheaderinfo[votelevels[i][0]]->thumbnailPic; } - if (lumpnum != LUMPERROR) - levelinfo[i].pic = W_CachePatchNum(lumpnum, PU_STATIC); + if (thumbnailPic) + levelinfo[i].pic = thumbnailPic; else levelinfo[i].pic = W_CachePatchName("BLANKLVL", PU_STATIC); }