diff options
-rw-r--r-- | src/ai/ai.hpp | 7 | ||||
-rw-r--r-- | src/ai/ai_core.cpp | 11 | ||||
-rw-r--r-- | src/base_media_base.h | 11 | ||||
-rw-r--r-- | src/base_media_func.h | 43 | ||||
-rw-r--r-- | src/fios.cpp | 36 | ||||
-rw-r--r-- | src/fios.h | 3 | ||||
-rw-r--r-- | src/game/game.hpp | 5 | ||||
-rw-r--r-- | src/game/game_core.cpp | 9 | ||||
-rw-r--r-- | src/script/script_scanner.cpp | 8 | ||||
-rw-r--r-- | src/script/script_scanner.hpp | 8 |
10 files changed, 114 insertions, 27 deletions
diff --git a/src/ai/ai.hpp b/src/ai/ai.hpp index 967210f4f..abe3f48ae 100644 --- a/src/ai/ai.hpp +++ b/src/ai/ai.hpp @@ -14,6 +14,7 @@ #include "../script/api/script_event_types.hpp" #include "../core/string_compare_type.hpp" +#include "ai_scanner.hpp" #include <map> /** A list that maps AI names to their AIInfo object. */ @@ -140,6 +141,12 @@ public: * found it is removed from the config. */ static void Rescan(); + + /** Gets the ScriptScanner instance that is used to find AIs */ + static AIScannerInfo *GetScannerInfo(); + /** Gets the ScriptScanner instance that is used to find AI Libraries */ + static AIScannerLibrary *GetScannerLibrary(); + #if defined(ENABLE_NETWORK) /** Wrapper function for AIScanner::HasAI */ static bool HasAI(const struct ContentInfo *ci, bool md5sum); diff --git a/src/ai/ai_core.cpp b/src/ai/ai_core.cpp index 82e2c7809..e2f04622b 100644 --- a/src/ai/ai_core.cpp +++ b/src/ai/ai_core.cpp @@ -352,3 +352,14 @@ } #endif /* defined(ENABLE_NETWORK) */ + +/* static */ AIScannerInfo *AI::GetScannerInfo() +{ + return AI::scanner_info; +} + +/* static */ AIScannerLibrary *AI::GetScannerLibrary() +{ + return AI::scanner_library; +} + diff --git a/src/base_media_base.h b/src/base_media_base.h index 828ae797e..d5de6c373 100644 --- a/src/base_media_base.h +++ b/src/base_media_base.h @@ -201,6 +201,8 @@ public: return num + fs.Scan(GetExtension(), BASESET_DIR, Tbase_set::SEARCH_IN_TARS); } + static Tbase_set *GetAvailableSets(); + static bool SetSet(const char *name); static char *GetSetsList(char *p, const char *last); static int GetNumSets(); @@ -217,6 +219,15 @@ public: static bool HasSet(const ContentInfo *ci, bool md5sum); }; +/** + * Check whether there's a base set matching some information. + * @param ci The content info to compare it to. + * @param md5sum Should the MD5 checksum be tested as well? + * @param s The list with sets. + * @return The filename of the first file of the base set, or \c NULL if there is no match. + */ +template <class Tbase_set> +const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const Tbase_set *s); /** Types of graphics in the base graphics set */ enum GraphicsFileType { diff --git a/src/base_media_func.h b/src/base_media_func.h index 9ed08dc80..dd0f4cc24 100644 --- a/src/base_media_func.h +++ b/src/base_media_func.h @@ -7,7 +7,10 @@ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>. */ -/** @file base_media_func.h Generic function implementations for base data (graphics, sounds). */ +/** + * @file base_media_func.h Generic function implementations for base data (graphics, sounds). + * @note You should _never_ include this file due to the SET_TYPE define. + */ #include "base_media_base.h" #include "debug.h" @@ -274,19 +277,13 @@ template <class Tbase_set> #if defined(ENABLE_NETWORK) #include "network/network_content.h" -/** - * Check whether there's a base set matching some information. - * @param ci The content info to compare it to. - * @param md5sum Should the MD5 checksum be tested as well? - * @param s The list with sets. - */ -template <class Tbase_set> bool HasBaseSet(const ContentInfo *ci, bool md5sum, const Tbase_set *s) +template <class Tbase_set> const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const Tbase_set *s) { for (; s != NULL; s = s->next) { if (s->GetNumMissing() != 0) continue; if (s->shortname != ci->unique_id) continue; - if (!md5sum) return true; + if (!md5sum) return s->files[0].filename; byte md5[16]; memset(md5, 0, sizeof(md5)); @@ -295,22 +292,27 @@ template <class Tbase_set> bool HasBaseSet(const ContentInfo *ci, bool md5sum, c md5[j] ^= s->files[i].hash[j]; } } - if (memcmp(md5, ci->md5sum, sizeof(md5)) == 0) return true; + if (memcmp(md5, ci->md5sum, sizeof(md5)) == 0) return s->files[0].filename; } - - return false; + return NULL; } template <class Tbase_set> /* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum) { - return HasBaseSet(ci, md5sum, BaseMedia<Tbase_set>::available_sets) || - HasBaseSet(ci, md5sum, BaseMedia<Tbase_set>::duplicate_sets); + return (TryGetBaseSetFile(ci, md5sum, BaseMedia<Tbase_set>::available_sets) != NULL) || + (TryGetBaseSetFile(ci, md5sum, BaseMedia<Tbase_set>::duplicate_sets) != NULL); } #else template <class Tbase_set> +const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const Tbase_set *s) +{ + return NULL; +} + +template <class Tbase_set> /* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum) { return false; @@ -375,6 +377,16 @@ template <class Tbase_set> } /** + * Return the available sets. + * @return The available sets. + */ +template <class Tbase_set> +/* static */ Tbase_set *BaseMedia<Tbase_set>::GetAvailableSets() +{ + return BaseMedia<Tbase_set>::available_sets; +} + +/** * Force instantiation of methods so we don't get linker errors. * @param repl_type the type of the BaseMedia to instantiate * @param set_type the type of the BaseSet to instantiate @@ -390,5 +402,6 @@ template <class Tbase_set> template int repl_type::GetIndexOfUsedSet(); \ template const set_type *repl_type::GetSet(int index); \ template const set_type *repl_type::GetUsedSet(); \ - template bool repl_type::DetermineBestSet(); + template bool repl_type::DetermineBestSet(); \ + template set_type *repl_type::GetAvailableSets(); diff --git a/src/fios.cpp b/src/fios.cpp index ffbe57375..e948b5680 100644 --- a/src/fios.cpp +++ b/src/fios.cpp @@ -561,8 +561,9 @@ void FiosGetHeightmapList(SaveLoadDialogMode mode) /** Basic data to distinguish a scenario. Used in the server list window */ struct ScenarioIdentifier { - uint32 scenid; ///< ID for the scenario (generated by content) - uint8 md5sum[16]; ///< MD5 checksum of file + uint32 scenid; ///< ID for the scenario (generated by content). + uint8 md5sum[16]; ///< MD5 checksum of file. + char filename[MAX_PATH]; ///< filename of the file. bool operator == (const ScenarioIdentifier &other) const { @@ -606,6 +607,7 @@ public: int fret = fscanf(f, "%i", &id.scenid); FioFCloseFile(f); if (fret != 1) return false; + strecpy(id.filename, filename, lastof(id.filename)); Md5 checksum; uint8 buffer[1024]; @@ -638,24 +640,34 @@ public: static ScenarioScanner _scanner; /** - * Check whether we've got a given scenario based on its unique ID. - * @param ci the content info to compare it to - * @param md5sum whether to look at the md5sum or the id - * @return true if we've got the scenario + * Find a given scenario based on its unique ID. + * @param ci The content info to compare it to. + * @param md5sum Whether to look at the md5sum or the id. + * @return The filename of the file, else \c NULL. */ -bool HasScenario(const ContentInfo *ci, bool md5sum) +const char *FindScenario(const ContentInfo *ci, bool md5sum) { _scanner.Scan(false); for (ScenarioIdentifier *id = _scanner.Begin(); id != _scanner.End(); id++) { - if (md5sum ? - (memcmp(id->md5sum, ci->md5sum, sizeof(id->md5sum)) == 0) : - (id->scenid == ci->unique_id)) { - return true; + if (md5sum ? (memcmp(id->md5sum, ci->md5sum, sizeof(id->md5sum)) == 0) + : (id->scenid == ci->unique_id)) { + return id->filename; } } - return false; + return NULL; +} + +/** + * Check whether we've got a given scenario based on its unique ID. + * @param ci The content info to compare it to. + * @param md5sum Whether to look at the md5sum or the id. + * @return True iff we've got the scenario. + */ +bool HasScenario(const ContentInfo *ci, bool md5sum) +{ + return (FindScenario(ci, md5sum) != NULL); } /** diff --git a/src/fios.h b/src/fios.h index bf354617d..ffb603af4 100644 --- a/src/fios.h +++ b/src/fios.h @@ -15,6 +15,7 @@ #include "gfx_type.h" #include "company_base.h" #include "newgrf_config.h" +#include "network/core/tcp_content.h" typedef SmallMap<uint, CompanyProperties *> CompanyPropertiesMap; @@ -180,4 +181,6 @@ extern const TextColour _fios_colours[]; void BuildFileList(); void SetFiosType(const byte fiostype); +const char *FindScenario(const ContentInfo *ci, bool md5sum); + #endif /* FIOS_H */ diff --git a/src/game/game.hpp b/src/game/game.hpp index 50d97b50c..0347758e4 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -13,6 +13,7 @@ #define GAME_HPP #include "../core/string_compare_type.hpp" +#include "game_scanner.hpp" #include <map> /** A list that maps AI names to their AIInfo object. */ @@ -101,6 +102,10 @@ public: static bool HasGame(const struct ContentInfo *ci, bool md5sum); static bool HasGameLibrary(const ContentInfo *ci, bool md5sum); #endif + /** Gets the ScriptScanner instance that is used to find Game scripts */ + static GameScannerInfo *GetScannerInfo(); + /** Gets the ScriptScanner instance that is used to find Game Libraries */ + static GameScannerLibrary *GetScannerLibrary(); private: static uint frame_counter; ///< Tick counter for the Game code. diff --git a/src/game/game_core.cpp b/src/game/game_core.cpp index c1892097f..f56dddf83 100644 --- a/src/game/game_core.cpp +++ b/src/game/game_core.cpp @@ -253,3 +253,12 @@ } #endif /* defined(ENABLE_NETWORK) */ + +/* static */ GameScannerInfo *Game::GetScannerInfo() +{ + return Game::scanner_info; +} +/* static */ GameScannerLibrary *Game::GetScannerLibrary() +{ + return Game::scanner_library; +} diff --git a/src/script/script_scanner.cpp b/src/script/script_scanner.cpp index 552b1cf46..248b17f9a 100644 --- a/src/script/script_scanner.cpp +++ b/src/script/script_scanner.cpp @@ -271,4 +271,12 @@ bool ScriptScanner::HasScript(const ContentInfo *ci, bool md5sum) return false; } +const char *ScriptScanner::FindMainScript(const ContentInfo *ci, bool md5sum) +{ + for (ScriptInfoList::iterator it = this->info_list.begin(); it != this->info_list.end(); it++) { + if (IsSameScript(ci, md5sum, (*it).second, this->GetDirectory())) return (*it).second->GetMainScript(); + } + return NULL; +} + #endif /* ENABLE_NETWORK */ diff --git a/src/script/script_scanner.hpp b/src/script/script_scanner.hpp index 1518dbe59..792d36bae 100644 --- a/src/script/script_scanner.hpp +++ b/src/script/script_scanner.hpp @@ -69,6 +69,14 @@ public: */ bool HasScript(const struct ContentInfo *ci, bool md5sum); + /** + * Find a script of a #ContentInfo + * @param ci The information to compare to. + * @param md5sum Whether to check the MD5 checksum. + * @return A filename of a file of the content, else \c NULL. + */ + const char *FindMainScript(const ContentInfo *ci, bool md5sum); + /* virtual */ bool AddFile(const char *filename, size_t basepath_length, const char *tar_filename); /** |