diff --git a/desktop_version/src/FileSystemUtils.cpp b/desktop_version/src/FileSystemUtils.cpp index 977cbc0e..c9b2fef5 100644 --- a/desktop_version/src/FileSystemUtils.cpp +++ b/desktop_version/src/FileSystemUtils.cpp @@ -7,6 +7,8 @@ #include #include +#include "Graphics.h" + #include #include #include @@ -76,7 +78,7 @@ int FILESYSTEM_init(char *argvZero, char* baseDir, char *assetsPath) mkdirResult = mkdir(output, 0777); /* Mount our base user directory */ - PHYSFS_mount(output, NULL, 1); + PHYSFS_mount(output, NULL, 0); PHYSFS_setWriteDir(output); printf("Base directory: %s\n", output); @@ -149,6 +151,33 @@ char *FILESYSTEM_getUserLevelDirectory() return levelDir; } +bool FILESYSTEM_directoryExists(const char *fname) +{ + return PHYSFS_exists(fname); +} + +void FILESYSTEM_mount(const char *fname) +{ + std::string path(PHYSFS_getRealDir(fname)); + path += PHYSFS_getDirSeparator(); + path += fname; + if (!PHYSFS_mount(path.c_str(), NULL, 0)) { + printf("Error mounting: %s\n", PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode())); + } else + graphics.assetdir = path.c_str(); +} + +void FILESYSTEM_unmountassets() +{ + if (graphics.assetdir != "") + { + printf("Unmounting %s\n", graphics.assetdir.c_str()); + PHYSFS_unmount(graphics.assetdir.c_str()); + graphics.assetdir = ""; + graphics.reloadresources(); + } else printf("Cannot unmount when no asset directory is mounted\n"); +} + void FILESYSTEM_loadFileToMemory(const char *name, unsigned char **mem, size_t *len, bool addnull) { diff --git a/desktop_version/src/FileSystemUtils.h b/desktop_version/src/FileSystemUtils.h index 718ecbea..eefab861 100644 --- a/desktop_version/src/FileSystemUtils.h +++ b/desktop_version/src/FileSystemUtils.h @@ -12,6 +12,10 @@ void FILESYSTEM_deinit(); char *FILESYSTEM_getUserSaveDirectory(); char *FILESYSTEM_getUserLevelDirectory(); +bool FILESYSTEM_directoryExists(const char *fname); +void FILESYSTEM_mount(const char *fname); +void FILESYSTEM_unmountassets(); + void FILESYSTEM_loadFileToMemory(const char *name, unsigned char **mem, size_t *len, bool addnull = false); void FILESYSTEM_freeMemory(unsigned char **mem); diff --git a/desktop_version/src/Graphics.cpp b/desktop_version/src/Graphics.cpp index 4eeb821d..85294fbe 100644 --- a/desktop_version/src/Graphics.cpp +++ b/desktop_version/src/Graphics.cpp @@ -2819,3 +2819,48 @@ bool Graphics::onscreen(int t) { return (t >= -40 && t <= 280); } + +void Graphics::reloadresources() { + grphx = GraphicsResources(); + grphx.init(); + + for (size_t i = 0; i < images.size(); i++){ SDL_FreeSurface(images[i]); } + images.clear(); + for (size_t i = 0; i < tiles.size(); i++){ SDL_FreeSurface(tiles[i]); } + tiles.clear(); + for (size_t i = 0; i < tiles2.size(); i++){ SDL_FreeSurface(tiles2[i]); } + tiles2.clear(); + for (size_t i = 0; i < tiles3.size(); i++){ SDL_FreeSurface(tiles3[i]); } + tiles3.clear(); + for (size_t i = 0; i < entcolours.size(); i++){ SDL_FreeSurface(entcolours[i]); } + entcolours.clear(); + for (size_t i = 0; i < sprites.size(); i++){ SDL_FreeSurface(sprites[i]); } + sprites.clear(); + for (size_t i = 0; i < flipsprites.size(); i++){ SDL_FreeSurface(flipsprites[i]); } + flipsprites.clear(); + + for (size_t i = 0; i < tele.size(); i++){ SDL_FreeSurface(tele[i]); } + tele.clear(); + + MakeTileArray(); + MakeSpriteArray(); + maketelearray(); + Makebfont(); + + images.push_back(grphx.im_image0); + images.push_back(grphx.im_image1); + images.push_back(grphx.im_image2); + images.push_back(grphx.im_image3); + images.push_back(grphx.im_image4); + images.push_back(grphx.im_image5); + images.push_back(grphx.im_image6); + + images.push_back(grphx.im_image7); + images.push_back(grphx.im_image8); + images.push_back(grphx.im_image9); + images.push_back(grphx.im_image10); + images.push_back(grphx.im_image11); + images.push_back(grphx.im_image12); + + music.init(); +} diff --git a/desktop_version/src/Graphics.h b/desktop_version/src/Graphics.h index 025bb21d..deef31b0 100644 --- a/desktop_version/src/Graphics.h +++ b/desktop_version/src/Graphics.h @@ -184,6 +184,9 @@ public: void drawtowerspikes(); bool onscreen(int t); + + void reloadresources(); + std::string assetdir; void menuoffrender(); diff --git a/desktop_version/src/editor.cpp b/desktop_version/src/editor.cpp index ae5b3f90..b206f5c5 100644 --- a/desktop_version/src/editor.cpp +++ b/desktop_version/src/editor.cpp @@ -18,6 +18,7 @@ #include #include +#include edlevelclass::edlevelclass() { @@ -78,6 +79,10 @@ bool compare_nocase (std::string first, std::string second) return false; } +static bool endsWith(const std::string& str, const std::string& suffix) { + return str.size() >= suffix.size() && 0 == str.compare(str.size()-suffix.size(), suffix.size(), suffix); +} + void replace_all(std::string& str, const std::string& from, const std::string& to) { if (from.empty()) @@ -1640,6 +1645,38 @@ void editorclass::load(std::string& _path) _path = levelDir + _path; } + FILESYSTEM_unmountassets(); + + std::string zippath = "levels/" + _path.substr(7,_path.size()-14) + ".data.zip"; + std::string dirpath = "levels/" + _path.substr(7,_path.size()-14) + "/"; + std::string zip_path; + const char* cstr = PHYSFS_getRealDir(_path.c_str()); + if (cstr) zip_path = cstr; + if (cstr && FILESYSTEM_directoryExists(zippath.c_str())) { + printf("Custom asset directory exists at %s\n",zippath.c_str()); + FILESYSTEM_mount(zippath.c_str()); + graphics.reloadresources(); + music.init(); + } else if (zip_path != "data.zip" && !endsWith(zip_path, "/data.zip") && endsWith(zip_path, ".zip")) { + printf("Custom asset directory is .zip at %s\n", zip_path.c_str()); + PHYSFS_File* zip = PHYSFS_openRead(zip_path.c_str()); + zip_path += ".data.zip"; + if (zip == NULL) { + printf("error loading .zip: %s\n", PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode())); + } else if (PHYSFS_mountHandle(zip, zip_path.c_str(), "/", 0) == 0) { + printf("error mounting .zip: %s\n", PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode())); + } else { + graphics.assetdir = zip_path; + } + graphics.reloadresources(); + } else if (FILESYSTEM_directoryExists(dirpath.c_str())) { + printf("Custom asset directory exists at %s\n",dirpath.c_str()); + FILESYSTEM_mount(dirpath.c_str()); + graphics.reloadresources(); + } else { + printf("Custom asset directory does not exist\n"); + } + TiXmlDocument doc; if (!FILESYSTEM_loadTiXmlDocument(_path.c_str(), &doc)) { @@ -3661,6 +3698,13 @@ void editorinput() game.press_action = true; }; + if (key.keymap[SDLK_F9] && (ed.keydelay==0)) { + ed.keydelay = 30; + ed.note="Reloaded resources"; + ed.notedelay=45; + graphics.reloadresources(); + } + if (key.isDown(KEYBOARD_ENTER)) game.press_map = true; if (key.isDown(27) && !ed.settingskey) { diff --git a/desktop_version/src/main.cpp b/desktop_version/src/main.cpp index 6e722260..05897ac1 100644 --- a/desktop_version/src/main.cpp +++ b/desktop_version/src/main.cpp @@ -168,25 +168,7 @@ int main(int argc, char *argv[]) game.init(); game.infocus = true; - graphics.MakeTileArray(); - graphics.MakeSpriteArray(); - graphics.maketelearray(); - - - graphics.images.push_back(graphics.grphx.im_image0); - graphics.images.push_back(graphics.grphx.im_image1); - graphics.images.push_back(graphics.grphx.im_image2); - graphics.images.push_back(graphics.grphx.im_image3); - graphics.images.push_back(graphics.grphx.im_image4); - graphics.images.push_back(graphics.grphx.im_image5); - graphics.images.push_back(graphics.grphx.im_image6); - - graphics.images.push_back(graphics.grphx.im_image7); - graphics.images.push_back(graphics.grphx.im_image8); - graphics.images.push_back(graphics.grphx.im_image9); - graphics.images.push_back(graphics.grphx.im_image10); - graphics.images.push_back(graphics.grphx.im_image11); - graphics.images.push_back(graphics.grphx.im_image12); + graphics.reloadresources(); const SDL_PixelFormat* fmt = gameScreen.GetFormat(); graphics.backBuffer = SDL_CreateRGBSurface(SDL_SWSURFACE, 320, 240, fmt->BitsPerPixel, fmt->Rmask, fmt->Gmask, fmt->Bmask, fmt->Amask);