From 474cdc092e7f4b4c2df87b766c327db2824b62f9 Mon Sep 17 00:00:00 2001 From: Misa Date: Wed, 17 May 2023 17:00:33 -0700 Subject: [PATCH] Use levelDirError for graphics errors too This will actually do several things: (1) Make the tile size checks apply to the appropriate graphics files once again. (2) Make the game print a fallback error message if the error message hasn't been set on the levelDirError error screen. (3) Use levelDirError for graphics errors too. (4) Make the error message for tile size checks failing specify both width and height, not just a square dimension. (5) Make the error messages mentioned above translatable. It turns out that (1) didn't happen after #923 was merged, since #923 removed needing to process a tilesheet into a vector of surfaces for all graphics files except sprites.png and flipsprites.png. Thus, the game ended up only checking the correct tile sizes for those files only. In the process of fixing this, I also got rid of the PROCESS_TILESHEET macros and turned them into two different functions: One to make the array, and one to check the tile size of the tilesheet. I also did (2) just in case FILESYSTEM_levelDirHasError() returns false even though we know we have an error. And (3) is needed so things are unified and we have one user-facing error message system when users load levels. To facilitate this, I removed the title string, since it's really not needed. Unfortunately, (1) doesn't apply to font.png again, but that's because of the new font stuff and I'm not sure what Dav999 has in store for error checking. But that's also why I did (4), because it looks like tile sizes in font.png files can be different (i.e. non-square). --- desktop_version/lang/ca/strings.xml | 2 + desktop_version/lang/de/strings.xml | 2 + desktop_version/lang/en/strings.xml | 2 + desktop_version/lang/eo/strings.xml | 2 + desktop_version/lang/es/strings.xml | 2 + desktop_version/lang/fr/strings.xml | 2 + desktop_version/lang/it/strings.xml | 2 + desktop_version/lang/nl/strings.xml | 2 + desktop_version/lang/pt_BR/strings.xml | 2 + desktop_version/lang/pt_PT/strings.xml | 2 + desktop_version/lang/ru/strings.xml | 2 + desktop_version/lang/tr/strings.xml | 2 + desktop_version/src/Font.cpp | 2 +- desktop_version/src/Graphics.cpp | 126 ++++++++++++------------- desktop_version/src/Graphics.h | 9 +- desktop_version/src/Render.cpp | 21 ++++- desktop_version/src/main.cpp | 16 ++-- 17 files changed, 118 insertions(+), 80 deletions(-) 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); }