From 848dcbcf0993f7bb15d16db4d65daaa0d4ffaf82 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 17 Nov 2012 15:13:52 +1100 Subject: HOPKINS: Properly implemented CONSTRUIT_FICHIER for animations. The game has separate folders for selected animations at different resolutions. --- engines/hopkins/files.cpp | 41 ++++++++++++++++++++++++++++++++++------- engines/hopkins/files.h | 11 ++++++++++- 2 files changed, 44 insertions(+), 8 deletions(-) (limited to 'engines') diff --git a/engines/hopkins/files.cpp b/engines/hopkins/files.cpp index aafa56691f..daa618d7c2 100644 --- a/engines/hopkins/files.cpp +++ b/engines/hopkins/files.cpp @@ -134,16 +134,43 @@ int FileManager::CONSTRUIT_SYSTEM(const Common::String &file) { return _vm->_globals.NFICHIER.size(); } -// Build File -void FileManager::CONSTRUIT_FICHIER(const Common::String &hop, const Common::String &file) { - // At this point, the original program did a big switch statement to determine - // whether to preprend the CD or installed directory path into REPJEU +void FileManager::CONSTRUIT_FICHIER(const Common::String &folder, const Common::String &file) { + Common::String folderToUse = folder; - if (hop[0] == 'A' && hop[1] == 'N' && hop[2] == 'N') { - error("TODO: CONSTRUIT_FICHIER"); + // A lot of the code in the original engine based on COPIE_SEQ was used to determine + // whether a file resided on the CD or hard disk. Since the ScummVM implementatoin + // requires all the files in the same location, we only need to do a somewhat simpler + // check for animations that don't exist in the ANM folder, but rather in special + // sub-folders depending on the physical screen resolution being used. + + if (folder == "ANM") { + switch (_vm->_globals.SVGA) { + case 1: + if (TEST_REP(folderToUse, file)) + folderToUse = "TSVGA"; + break; + case 2: + if (TEST_REP(folderToUse, file)) + folderToUse = "SVGA"; + break; + case 3: + if (TEST_REP(folderToUse, file)) + folderToUse = "VGA"; + break; + default: + break; + } } - _vm->_globals.NFICHIER = Common::String::format("%s/%s", hop.c_str(), file.c_str()); + _vm->_globals.NFICHIER = Common::String::format("%s/%s", folderToUse.c_str(), file.c_str()); +} + +bool FileManager::TEST_REP(const Common::String &folder, const Common::String &file) { + Common::String filename = folder.empty() ? file : + Common::String::format("%s/%s", folder.c_str(), file.c_str()); + + Common::File f; + return !f.exists(filename); } // Free File diff --git a/engines/hopkins/files.h b/engines/hopkins/files.h index d9df4341ca..e63e5370c8 100644 --- a/engines/hopkins/files.h +++ b/engines/hopkins/files.h @@ -33,6 +33,8 @@ namespace Hopkins { class HopkinsEngine; class FileManager { +private: + bool TEST_REP(const Common::String &folder, const Common::String &file); public: HopkinsEngine *_vm; public: @@ -48,7 +50,14 @@ public: int bload_it(Common::ReadStream &stream, void *buf, size_t nbytes); void F_Censure(); int CONSTRUIT_SYSTEM(const Common::String &file); - void CONSTRUIT_FICHIER(const Common::String &hop, const Common::String &file); + + /** + * Construct a filename based on a suggested folder and filename. + * @param folder Folder to use. May be overriden for animations. + * @param file Filename + */ + void CONSTRUIT_FICHIER(const Common::String &folder, const Common::String &file); + byte *LIBERE_FICHIER(byte *ptr); byte *RECHERCHE_CAT(const Common::String &file, int a2); Common::String CONSTRUIT_LINUX(const Common::String &file); -- cgit v1.2.3