1
0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-06-25 22:18:30 +02:00

Make one-way recolors check for specific files

So, 2.3 added recoloring one-way tiles to no longer make them be always
yellow. However, custom levels that retexture the one-way tiles might
not want them to be recolored. So, if there are ANY custom assets
mounted, then the one-ways will not be recolored. However, if the XML
has a <onewaycol_override>1</onewaycol_override> tag, then the one-way
will be recolored again anyways.

When I added one-way recoloring, I didn't intend for any custom asset to
disable the recoloring; I only did it because I couldn't find a way to
check if a specific file was customized by the custom level or not.

However, I have figured out how to do so, and so now tiles.png one-way
recolors will only be disabled if there's a custom tiles.png, and
tiles2.png one-way recolors will only be disabled if there's a custom
tiles2.png.

In order to make sure we're not calling PhysFS functions on every single
deltaframe, I've added caching variables, tiles1_mounted and
tiles2_mounted, to Graphics; these get assigned every time
reloadresources() is called.
This commit is contained in:
Misa 2021-03-06 10:52:11 -08:00 committed by Ethan Lee
parent 34865a8ef1
commit c1572de9e2
4 changed files with 21 additions and 19 deletions

View File

@ -241,8 +241,6 @@ void FILESYSTEM_loadZip(const char* filename)
}
}
bool FILESYSTEM_assetsmounted = false;
void FILESYSTEM_mountassets(const char* path)
{
const size_t path_size = SDL_strlen(path);
@ -288,8 +286,6 @@ void FILESYSTEM_mountassets(const char* path)
FILESYSTEM_mount(zip_data);
graphics.reloadresources();
FILESYSTEM_assetsmounted = true;
}
else if (zip_normal != NULL && endsWith(zip_normal, ".zip"))
{
@ -323,8 +319,6 @@ void FILESYSTEM_mountassets(const char* path)
SDL_strlcpy(assetDir, zip_data, sizeof(assetDir));
}
FILESYSTEM_assetsmounted = true;
graphics.reloadresources();
}
else if (FILESYSTEM_exists(dir))
@ -334,14 +328,10 @@ void FILESYSTEM_mountassets(const char* path)
FILESYSTEM_mount(dir);
graphics.reloadresources();
FILESYSTEM_assetsmounted = true;
}
else
{
puts("Custom asset directory does not exist");
FILESYSTEM_assetsmounted = false;
}
}
@ -358,7 +348,6 @@ void FILESYSTEM_unmountassets(void)
{
printf("Cannot unmount when no asset directory is mounted\n");
}
FILESYSTEM_assetsmounted = false;
}
bool FILESYSTEM_isAssetMounted(const char* filename)

View File

@ -17,7 +17,6 @@ bool FILESYSTEM_isMounted(const char* filename);
void FILESYSTEM_mount(const char *fname);
void FILESYSTEM_loadZip(const char* filename);
extern bool FILESYSTEM_assetsmounted;
void FILESYSTEM_mountassets(const char *path);
void FILESYSTEM_unmountassets(void);
bool FILESYSTEM_isAssetMounted(const char* filename);

View File

@ -146,6 +146,11 @@ void Graphics::init(void)
col_tb = 0;
kludgeswnlinewidth = false;
#ifndef NO_CUSTOM_LEVELS
tiles1_mounted = false;
tiles2_mounted = false;
#endif
}
void Graphics::destroy(void)
@ -710,10 +715,10 @@ void Graphics::drawsprite(int x, int y, int t, Uint32 c)
}
#ifndef NO_CUSTOM_LEVELS
bool Graphics::shouldrecoloroneway(const int tilenum)
bool Graphics::shouldrecoloroneway(const int tilenum, const bool mounted)
{
return (tilenum >= 14 && tilenum <= 17
&& (!FILESYSTEM_assetsmounted
&& (!mounted
|| ed.onewaycol_override));
}
#endif
@ -729,7 +734,7 @@ void Graphics::drawtile( int x, int y, int t )
SDL_Rect rect = { Sint16(x), Sint16(y), tiles_rect.w, tiles_rect.h };
#if !defined(NO_CUSTOM_LEVELS)
if (shouldrecoloroneway(t))
if (shouldrecoloroneway(t, tiles1_mounted))
{
colourTransform thect = {ed.getonewaycol()};
BlitSurfaceTinted(tiles[t], NULL, backBuffer, &rect, thect);
@ -753,7 +758,7 @@ void Graphics::drawtile2( int x, int y, int t )
SDL_Rect rect = { Sint16(x), Sint16(y), tiles_rect.w, tiles_rect.h };
#if !defined(NO_CUSTOM_LEVELS)
if (shouldrecoloroneway(t))
if (shouldrecoloroneway(t, tiles2_mounted))
{
colourTransform thect = {ed.getonewaycol()};
BlitSurfaceTinted(tiles2[t], NULL, backBuffer, &rect, thect);
@ -3153,7 +3158,7 @@ void Graphics::drawforetile(int x, int y, int t)
setRect(rect, x,y,tiles_rect.w, tiles_rect.h);
#if !defined(NO_CUSTOM_LEVELS)
if (shouldrecoloroneway(t))
if (shouldrecoloroneway(t, tiles1_mounted))
{
colourTransform thect = {ed.getonewaycol()};
BlitSurfaceTinted(tiles[t], NULL, foregroundBuffer, &rect, thect);
@ -3177,7 +3182,7 @@ void Graphics::drawforetile2(int x, int y, int t)
setRect(rect, x,y,tiles_rect.w, tiles_rect.h);
#if !defined(NO_CUSTOM_LEVELS)
if (shouldrecoloroneway(t))
if (shouldrecoloroneway(t, tiles2_mounted))
{
colourTransform thect = {ed.getonewaycol()};
BlitSurfaceTinted(tiles2[t], NULL, foregroundBuffer, &rect, thect);
@ -3268,6 +3273,11 @@ void Graphics::reloadresources()
music.destroy();
music.init();
#ifndef NO_CUSTOM_LEVELS
tiles1_mounted = FILESYSTEM_isAssetMounted("graphics/tiles.png");
tiles2_mounted = FILESYSTEM_isAssetMounted("graphics/tiles2.png");
#endif
}
Uint32 Graphics::crewcolourreal(int t)

View File

@ -162,7 +162,7 @@ public:
void drawbackground(int t);
void updatebackground(int t);
#ifndef NO_CUSTOM_LEVELS
bool shouldrecoloroneway(const int tilenum);
bool shouldrecoloroneway(const int tilenum, const bool mounted);
#endif
void drawtile3( int x, int y, int t, int off, int height_subtract = 0 );
void drawtile2( int x, int y, int t );
@ -187,6 +187,10 @@ public:
bool onscreen(int t);
void reloadresources(void);
#ifndef NO_CUSTOM_LEVELS
bool tiles1_mounted;
bool tiles2_mounted;
#endif
void menuoffrender(void);