mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-12-23 01:59:43 +01:00
Display improper zip structure message to non-console users
If a zip file is improperly structured, a message will be displayed when the player loads the level list. This will only display the last-displayed improper zip, because there only needs to be one displayed at a time. Also because doing anything more would most likely require heap allocation, and I don't want to do that.
This commit is contained in:
parent
8dc5d69ef3
commit
7699f5aaf1
7 changed files with 61 additions and 7 deletions
|
@ -2,6 +2,7 @@
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <physfs.h>
|
#include <physfs.h>
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <tinyxml2.h>
|
#include <tinyxml2.h>
|
||||||
|
@ -346,6 +347,41 @@ static PHYSFS_EnumerateCallbackResult zipCheckCallback(
|
||||||
return PHYSFS_ENUM_OK;
|
return PHYSFS_ENUM_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char levelDirError[256] = {'\0'};
|
||||||
|
|
||||||
|
static bool levelDirHasError = false;
|
||||||
|
|
||||||
|
bool FILESYSTEM_levelDirHasError(void)
|
||||||
|
{
|
||||||
|
return levelDirHasError;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FILESYSTEM_clearLevelDirError(void)
|
||||||
|
{
|
||||||
|
levelDirHasError = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* FILESYSTEM_getLevelDirError(void)
|
||||||
|
{
|
||||||
|
return levelDirError;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int setLevelDirError(const char* text, ...)
|
||||||
|
{
|
||||||
|
va_list list;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
levelDirHasError = true;
|
||||||
|
|
||||||
|
va_start(list, text);
|
||||||
|
retval = SDL_vsnprintf(levelDirError, sizeof(levelDirError), text, list);
|
||||||
|
va_end(list);
|
||||||
|
|
||||||
|
puts(levelDirError);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
/* For technical reasons, the level file inside a zip named LEVELNAME.zip must
|
/* For technical reasons, the level file inside a zip named LEVELNAME.zip must
|
||||||
* be named LEVELNAME.vvvvvv, else its custom assets won't work;
|
* be named LEVELNAME.vvvvvv, else its custom assets won't work;
|
||||||
* if there are .vvvvvv files other than LEVELNAME.vvvvvv, they would be loaded
|
* if there are .vvvvvv files other than LEVELNAME.vvvvvv, they would be loaded
|
||||||
|
@ -420,9 +456,8 @@ static bool checkZipStructure(const char* filename)
|
||||||
/* If no .vvvvvv files in zip, don't print warning. */
|
/* If no .vvvvvv files in zip, don't print warning. */
|
||||||
if (!success && zip_state.has_extension)
|
if (!success && zip_state.has_extension)
|
||||||
{
|
{
|
||||||
/* FIXME: How do we print this for non-terminal users? */
|
setLevelDirError(
|
||||||
printf(
|
"%s.zip is not structured correctly! It is missing %s.vvvvvv.",
|
||||||
"%s.zip is not structured correctly! It is missing %s.vvvvvv.\n",
|
|
||||||
base_name,
|
base_name,
|
||||||
base_name
|
base_name
|
||||||
);
|
);
|
||||||
|
@ -434,9 +469,8 @@ static bool checkZipStructure(const char* filename)
|
||||||
/* This message is redundant if the correct file already DOESN'T exist. */
|
/* This message is redundant if the correct file already DOESN'T exist. */
|
||||||
if (file_exists && zip_state.other_level_files)
|
if (file_exists && zip_state.other_level_files)
|
||||||
{
|
{
|
||||||
/* FIXME: How do we print this for non-terminal users? */
|
setLevelDirError(
|
||||||
printf(
|
"%s.zip is not structured correctly! It has .vvvvvv file(s) other than %s.vvvvvv.",
|
||||||
"%s.zip is not structured correctly! It has .vvvvvv file(s) other than %s.vvvvvv.\n",
|
|
||||||
base_name,
|
base_name,
|
||||||
base_name
|
base_name
|
||||||
);
|
);
|
||||||
|
@ -872,7 +906,9 @@ static PHYSFS_EnumerateCallbackResult enumerateCallback(
|
||||||
void FILESYSTEM_enumerateLevelDirFileNames(
|
void FILESYSTEM_enumerateLevelDirFileNames(
|
||||||
void (*callback)(const char* filename)
|
void (*callback)(const char* filename)
|
||||||
) {
|
) {
|
||||||
int success = PHYSFS_enumerate("levels", enumerateCallback, (void*) callback);
|
int success;
|
||||||
|
|
||||||
|
success = PHYSFS_enumerate("levels", enumerateCallback, (void*) callback);
|
||||||
|
|
||||||
if (success == 0)
|
if (success == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -40,6 +40,10 @@ bool FILESYSTEM_loadTiXml2Document(const char *name, tinyxml2::XMLDocument& doc)
|
||||||
|
|
||||||
void FILESYSTEM_enumerateLevelDirFileNames(void (*callback)(const char* filename));
|
void FILESYSTEM_enumerateLevelDirFileNames(void (*callback)(const char* filename));
|
||||||
|
|
||||||
|
bool FILESYSTEM_levelDirHasError(void);
|
||||||
|
void FILESYSTEM_clearLevelDirError(void);
|
||||||
|
const char* FILESYSTEM_getLevelDirError(void);
|
||||||
|
|
||||||
bool FILESYSTEM_openDirectoryEnabled(void);
|
bool FILESYSTEM_openDirectoryEnabled(void);
|
||||||
bool FILESYSTEM_openDirectory(const char *dname);
|
bool FILESYSTEM_openDirectory(const char *dname);
|
||||||
|
|
||||||
|
|
|
@ -6478,7 +6478,9 @@ void Game::createmenu( enum Menu::MenuName t, bool samemenu/*= false*/ )
|
||||||
menuyoff = 10;
|
menuyoff = 10;
|
||||||
break;
|
break;
|
||||||
case Menu::errorloadinglevel:
|
case Menu::errorloadinglevel:
|
||||||
|
case Menu::warninglevellist:
|
||||||
option("ok");
|
option("ok");
|
||||||
|
menuyoff = 50;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ namespace Menu
|
||||||
errornostart,
|
errornostart,
|
||||||
errorsavingsettings,
|
errorsavingsettings,
|
||||||
errorloadinglevel,
|
errorloadinglevel,
|
||||||
|
warninglevellist,
|
||||||
graphicoptions,
|
graphicoptions,
|
||||||
ed_settings,
|
ed_settings,
|
||||||
ed_desc,
|
ed_desc,
|
||||||
|
|
|
@ -492,6 +492,10 @@ static void menuactionpress(void)
|
||||||
ed.getDirectoryData();
|
ed.getDirectoryData();
|
||||||
game.loadcustomlevelstats(); //Should only load a file if it's needed
|
game.loadcustomlevelstats(); //Should only load a file if it's needed
|
||||||
game.createmenu(Menu::levellist);
|
game.createmenu(Menu::levellist);
|
||||||
|
if (FILESYSTEM_levelDirHasError())
|
||||||
|
{
|
||||||
|
game.createmenu(Menu::warninglevellist);
|
||||||
|
}
|
||||||
map.nexttowercolour();
|
map.nexttowercolour();
|
||||||
break;
|
break;
|
||||||
#if !defined(NO_EDITOR)
|
#if !defined(NO_EDITOR)
|
||||||
|
@ -1728,6 +1732,7 @@ static void menuactionpress(void)
|
||||||
map.nexttowercolour();
|
map.nexttowercolour();
|
||||||
break;
|
break;
|
||||||
case Menu::errorloadinglevel:
|
case Menu::errorloadinglevel:
|
||||||
|
case Menu::warninglevellist:
|
||||||
music.playef(11);
|
music.playef(11);
|
||||||
game.returnmenu();
|
game.returnmenu();
|
||||||
map.nexttowercolour();
|
map.nexttowercolour();
|
||||||
|
|
|
@ -1391,6 +1391,10 @@ static void menurender(void)
|
||||||
graphics.bigprint(-1, 45, "ERROR", tr, tg, tb, true);
|
graphics.bigprint(-1, 45, "ERROR", tr, tg, tb, true);
|
||||||
graphics.PrintWrap(-1, 65, graphics.error, tr, tg, tb, true, 10, 304);
|
graphics.PrintWrap(-1, 65, graphics.error, tr, tg, tb, true, 10, 304);
|
||||||
break;
|
break;
|
||||||
|
case Menu::warninglevellist:
|
||||||
|
graphics.bigprint(-1, 45, "WARNING", tr, tg, tb, true);
|
||||||
|
graphics.PrintWrap(-1, 65, FILESYSTEM_getLevelDirError(), tr, tg, tb, true, 10, 304);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,6 +229,8 @@ void editorclass::getDirectoryData(void)
|
||||||
|
|
||||||
ListOfMetaData.clear();
|
ListOfMetaData.clear();
|
||||||
|
|
||||||
|
FILESYSTEM_clearLevelDirError();
|
||||||
|
|
||||||
loadZips();
|
loadZips();
|
||||||
|
|
||||||
FILESYSTEM_enumerateLevelDirFileNames(levelMetaDataCallback);
|
FILESYSTEM_enumerateLevelDirFileNames(levelMetaDataCallback);
|
||||||
|
|
Loading…
Reference in a new issue