diff --git a/desktop_version/lang/ca/strings.xml b/desktop_version/lang/ca/strings.xml
index a7c1e7b6..0bc289cc 100644
--- a/desktop_version/lang/ca/strings.xml
+++ b/desktop_version/lang/ca/strings.xml
@@ -758,9 +758,11 @@ Has trobat el laboratori secret!" explanation="" max="34*4"/>
+
+
diff --git a/desktop_version/lang/de/strings.xml b/desktop_version/lang/de/strings.xml
index 0c9a6088..a51355a9 100644
--- a/desktop_version/lang/de/strings.xml
+++ b/desktop_version/lang/de/strings.xml
@@ -758,9 +758,11 @@ Du hast das Geheimlabor gefunden!" explanation="" max="34*4"/>
+
+
diff --git a/desktop_version/lang/en/strings.xml b/desktop_version/lang/en/strings.xml
index d8b253ad..43ca393d 100644
--- a/desktop_version/lang/en/strings.xml
+++ b/desktop_version/lang/en/strings.xml
@@ -752,9 +752,11 @@ You have found the secret lab!" translation="" explanation="" max="34*4"/>
+
+
diff --git a/desktop_version/lang/eo/strings.xml b/desktop_version/lang/eo/strings.xml
index 42786a05..d49c5211 100644
--- a/desktop_version/lang/eo/strings.xml
+++ b/desktop_version/lang/eo/strings.xml
@@ -758,9 +758,11 @@ Vi trovis la sekretan labon!" explanation="" max="34*4"/>
+
+
diff --git a/desktop_version/lang/es/strings.xml b/desktop_version/lang/es/strings.xml
index 4f1a608c..d576cc5c 100644
--- a/desktop_version/lang/es/strings.xml
+++ b/desktop_version/lang/es/strings.xml
@@ -758,9 +758,11 @@ You have found the secret lab!" translation="¡Enhorabuena!
+
+
diff --git a/desktop_version/lang/fr/strings.xml b/desktop_version/lang/fr/strings.xml
index 45b4f1d3..98142709 100644
--- a/desktop_version/lang/fr/strings.xml
+++ b/desktop_version/lang/fr/strings.xml
@@ -752,9 +752,11 @@ You have found the secret lab!" translation="Félicitations ! Vous avez trouvé
+
+
diff --git a/desktop_version/lang/it/strings.xml b/desktop_version/lang/it/strings.xml
index b3d141a1..5786d877 100644
--- a/desktop_version/lang/it/strings.xml
+++ b/desktop_version/lang/it/strings.xml
@@ -758,9 +758,11 @@ Hai trovato il laboratorio segreto!" explanation="" max="34*4"/>
+
+
diff --git a/desktop_version/lang/nl/strings.xml b/desktop_version/lang/nl/strings.xml
index 596df43f..575cd9d9 100644
--- a/desktop_version/lang/nl/strings.xml
+++ b/desktop_version/lang/nl/strings.xml
@@ -759,9 +759,11 @@ Je hebt het geheime lab gevonden!" explanation="" max="34*4"/>
+
+
diff --git a/desktop_version/lang/pt_BR/strings.xml b/desktop_version/lang/pt_BR/strings.xml
index 5741019c..ea7a8ebb 100644
--- a/desktop_version/lang/pt_BR/strings.xml
+++ b/desktop_version/lang/pt_BR/strings.xml
@@ -758,9 +758,11 @@ Você encontrou o laboratório secreto!" explanation="" max="34*4"/>
+
+
diff --git a/desktop_version/lang/pt_PT/strings.xml b/desktop_version/lang/pt_PT/strings.xml
index d45be62a..497f9e93 100644
--- a/desktop_version/lang/pt_PT/strings.xml
+++ b/desktop_version/lang/pt_PT/strings.xml
@@ -758,9 +758,11 @@ Encontraste o laboratório secreto!" explanation="" max="34*4"/>
+
+
diff --git a/desktop_version/lang/ru/strings.xml b/desktop_version/lang/ru/strings.xml
index 4087ce05..4cefc76a 100644
--- a/desktop_version/lang/ru/strings.xml
+++ b/desktop_version/lang/ru/strings.xml
@@ -758,9 +758,11 @@ You have found the secret lab!" translation="Поздравляем!
+
+
diff --git a/desktop_version/lang/tr/strings.xml b/desktop_version/lang/tr/strings.xml
index 25f93588..38389b73 100644
--- a/desktop_version/lang/tr/strings.xml
+++ b/desktop_version/lang/tr/strings.xml
@@ -758,9 +758,11 @@ Gizli laboratuvarı buldun!" explanation="" max="34*4"/>
+
+
diff --git a/desktop_version/src/Font.cpp b/desktop_version/src/Font.cpp
index d08e9cb8..be746997 100644
--- a/desktop_version/src/Font.cpp
+++ b/desktop_version/src/Font.cpp
@@ -20,7 +20,7 @@ extern "C"
}
// Sigh... This is the second forward-declaration, we need to put this in a header file
-SDL_Texture* LoadImage(const char *filename, const TextureLoadType loadtype);
+SDL_Texture* LoadImage(const char *filename, TextureLoadType loadtype);
namespace font
{
diff --git a/desktop_version/src/Graphics.cpp b/desktop_version/src/Graphics.cpp
index 80a34b9a..a076db86 100644
--- a/desktop_version/src/Graphics.cpp
+++ b/desktop_version/src/Graphics.cpp
@@ -151,9 +151,6 @@ void Graphics::init(void)
levelcomplete_mounted = false;
flipgamecomplete_mounted = false;
fliplevelcomplete_mounted = false;
-
- SDL_zeroa(error);
- SDL_zeroa(error_title);
}
void Graphics::destroy(void)
@@ -238,65 +235,6 @@ void Graphics::updatetitlecolours(void)
col_trinket = getcol(18);
}
-#define PROCESS_TILESHEET_CHECK_ERROR(tilesheet, tile_square) \
- if (grphx.im_##tilesheet == NULL) \
- { \
- /* We have already asserted; just no-op. */ \
- } \
- else if (grphx.im_##tilesheet->w % tile_square != 0 \
- || grphx.im_##tilesheet->h % tile_square != 0) \
- { \
- static const char error_fmt[] = "%s.png dimensions not exact multiples of %i!"; \
- static const char error_title_fmt[] = "Error with %s.png"; \
- \
- SDL_snprintf(error, sizeof(error), error_fmt, #tilesheet, tile_square); \
- SDL_snprintf(error_title, sizeof(error_title), error_title_fmt, #tilesheet); \
- \
- vlog_error("%s", error); \
- \
- return false; \
- }
-
-#define PROCESS_TILESHEET_RENAME(tilesheet, vector, tile_square, extra_code) \
- PROCESS_TILESHEET_CHECK_ERROR(tilesheet, tile_square) \
- \
- else \
- { \
- int j; \
- for (j = 0; j < grphx.im_##tilesheet->h / tile_square; ++j) \
- { \
- int i; \
- for (i = 0; i < grphx.im_##tilesheet->w / tile_square; ++i) \
- { \
- SDL_Surface* temp = GetSubSurface( \
- grphx.im_##tilesheet, \
- i * tile_square, j * tile_square, \
- tile_square, tile_square \
- ); \
- vector.push_back(temp); \
- \
- extra_code \
- } \
- } \
- \
- VVV_freefunc(SDL_FreeSurface, grphx.im_##tilesheet); \
- }
-
-#define PROCESS_TILESHEET(tilesheet, tile_square, extra_code) \
- PROCESS_TILESHEET_RENAME(tilesheet, tilesheet, tile_square, extra_code)
-
-bool Graphics::MakeSpriteArray(void)
-{
- PROCESS_TILESHEET(sprites_surf, 32, {})
- PROCESS_TILESHEET(flipsprites_surf, 32, {})
-
- return true;
-}
-
-#undef PROCESS_TILESHEET
-#undef PROCESS_TILESHEET_RENAME
-#undef PROCESS_TILESHEET_CHECK_ERROR
-
void Graphics::map_tab(int opt, const char* text, bool selected /*= false*/)
{
@@ -3433,14 +3371,76 @@ bool Graphics::onscreen(int t)
return (t >= -40 && t <= 280);
}
+bool Graphics::checktexturesize(
+ const char* filename, SDL_Texture* texture,
+ const int tilewidth, const int tileheight
+) {
+ int texturewidth;
+ int textureheight;
+ if (query_texture(texture, NULL, NULL, &texturewidth, &textureheight) != 0)
+ {
+ /* Just give it the benefit of the doubt. */
+ vlog_warn(
+ "Assuming the dimensions of %s are exact multiples of %i by %i!",
+ filename, tilewidth, tileheight
+ );
+ return true;
+ }
+
+ const bool valid = texturewidth % tilewidth == 0 && textureheight % tileheight == 0;
+ if (!valid)
+ {
+ FILESYSTEM_setLevelDirError(
+ loc::gettext("{filename} dimensions not exact multiples of {width} by {height}!"),
+ "filename:str, width:int, height:int",
+ filename, tilewidth, tileheight
+ );
+ return false;
+ }
+
+ return true;
+}
+
+static void make_array(
+ SDL_Surface** tilesheet,
+ std::vector& vector,
+ const int tile_square
+) {
+ int j;
+ for (j = 0; j < (*tilesheet)->h / tile_square; j++)
+ {
+ int i;
+ for (i = 0; i < (*tilesheet)->w / tile_square; i++)
+ {
+ SDL_Surface* temp = GetSubSurface(
+ *tilesheet,
+ i * tile_square, j * tile_square,
+ tile_square, tile_square
+ );
+ vector.push_back(temp);
+ }
+ }
+
+ VVV_freefunc(SDL_FreeSurface, *tilesheet);
+}
+
bool Graphics::reloadresources(void)
{
grphx.destroy();
grphx.init();
+ MAYBE_FAIL(checktexturesize("tiles.png", grphx.im_tiles, 8, 8));
+ MAYBE_FAIL(checktexturesize("tiles2.png", grphx.im_tiles2, 8, 8));
+ MAYBE_FAIL(checktexturesize("tiles3.png", grphx.im_tiles3, 8, 8));
+ MAYBE_FAIL(checktexturesize("entcolours.png", grphx.im_entcolours, 8, 8));
+ MAYBE_FAIL(checktexturesize("sprites.png", grphx.im_sprites, 32, 32));
+ MAYBE_FAIL(checktexturesize("flipsprites.png", grphx.im_flipsprites, 32, 32));
+ MAYBE_FAIL(checktexturesize("teleporter.png", grphx.im_teleporter, 96, 96));
+
destroy();
- MAYBE_FAIL(MakeSpriteArray());
+ make_array(&grphx.im_sprites_surf, sprites_surf, 32);
+ make_array(&grphx.im_flipsprites_surf, flipsprites_surf, 32);
images[IMAGE_LEVELCOMPLETE] = grphx.im_image0;
images[IMAGE_MINIMAP] = grphx.im_image1;
diff --git a/desktop_version/src/Graphics.h b/desktop_version/src/Graphics.h
index ae104537..8d3276fa 100644
--- a/desktop_version/src/Graphics.h
+++ b/desktop_version/src/Graphics.h
@@ -56,8 +56,6 @@ public:
void drawgravityline(int t);
- bool MakeSpriteArray(void);
-
void drawcoloredtile(int x, int y, int t, int r, int g, int b);
void drawmenu(int cr, int cg, int cb, enum Menu::MenuName menu);
@@ -275,6 +273,10 @@ public:
bool onscreen(int t);
bool reloadresources(void);
+ bool checktexturesize(
+ const char* filename, SDL_Texture* texture,
+ int tilewidth, int tileheight
+ );
#ifndef NO_CUSTOM_LEVELS
bool tiles1_mounted;
bool tiles2_mounted;
@@ -402,9 +404,6 @@ public:
SDL_Color crewcolourreal(int t);
void render_roomname(uint32_t font_flag, const char* roomname, int r, int g, int b);
-
- char error[128];
- char error_title[128]; /* for SDL_ShowSimpleMessageBox */
};
#ifndef GRAPHICS_DEFINITION
diff --git a/desktop_version/src/Render.cpp b/desktop_version/src/Render.cpp
index e7cf86d5..8f6e416d 100644
--- a/desktop_version/src/Render.cpp
+++ b/desktop_version/src/Render.cpp
@@ -1626,23 +1626,34 @@ static void menurender(void)
break;
case Menu::errorloadinglevel:
{
- const char* str;
+ const char* message;
if (FILESYSTEM_levelDirHasError())
{
- str = FILESYSTEM_getLevelDirError();
+ message = FILESYSTEM_getLevelDirError();
}
else
{
- str = graphics.error;
+ message = loc::gettext("Something went wrong, but we forgot to print an error message.");
}
font::print(PR_2X | PR_CEN, -1, 45, loc::gettext("ERROR"), tr, tg, tb);
- font::print_wrap(PR_CEN, -1, 65, str, tr, tg, tb);
+ font::print_wrap(PR_CEN, -1, 65, message, tr, tg, tb);
break;
}
case Menu::warninglevellist:
+ {
+ const char* message;
+ if (FILESYSTEM_levelDirHasError())
+ {
+ message = FILESYSTEM_getLevelDirError();
+ }
+ else
+ {
+ message = loc::gettext("Something went wrong, but we forgot to print an error message.");
+ }
font::print(PR_2X | PR_CEN, -1, 45, loc::gettext("WARNING"), tr, tg, tb);
- font::print_wrap(PR_CEN, -1, 65, FILESYSTEM_getLevelDirError(), tr, tg, tb);
+ font::print_wrap(PR_CEN, -1, 65, message, tr, tg, tb);
break;
+ }
default:
break;
}
diff --git a/desktop_version/src/main.cpp b/desktop_version/src/main.cpp
index 80323d4b..017beb37 100644
--- a/desktop_version/src/main.cpp
+++ b/desktop_version/src/main.cpp
@@ -658,12 +658,16 @@ int main(int argc, char *argv[])
{
/* Something wrong with the default assets? We can't use them to
* display the error message, and we have to bail. */
- SDL_ShowSimpleMessageBox(
- SDL_MESSAGEBOX_ERROR,
- graphics.error_title,
- graphics.error,
- NULL
- );
+ const char* message;
+ if (FILESYSTEM_levelDirHasError())
+ {
+ message = FILESYSTEM_getLevelDirError();
+ }
+ else
+ {
+ message = loc::gettext("Something went wrong, but we forgot to print an error message.");
+ }
+ SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", message, NULL);
VVV_exit(1);
}