mirror of https://github.com/OpenTTD/OpenTTD
(svn r24487) -Codechange [FS#5236]: make several DoesContentExist return the path instead of a boolean (LordAro)
parent
2a89d0d13d
commit
fe31aa28c4
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "../script/api/script_event_types.hpp"
|
#include "../script/api/script_event_types.hpp"
|
||||||
#include "../core/string_compare_type.hpp"
|
#include "../core/string_compare_type.hpp"
|
||||||
|
#include "ai_scanner.hpp"
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
/** A list that maps AI names to their AIInfo object. */
|
/** A list that maps AI names to their AIInfo object. */
|
||||||
|
@ -140,6 +141,12 @@ public:
|
||||||
* found it is removed from the config.
|
* found it is removed from the config.
|
||||||
*/
|
*/
|
||||||
static void Rescan();
|
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)
|
#if defined(ENABLE_NETWORK)
|
||||||
/** Wrapper function for AIScanner::HasAI */
|
/** Wrapper function for AIScanner::HasAI */
|
||||||
static bool HasAI(const struct ContentInfo *ci, bool md5sum);
|
static bool HasAI(const struct ContentInfo *ci, bool md5sum);
|
||||||
|
|
|
@ -352,3 +352,14 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* defined(ENABLE_NETWORK) */
|
#endif /* defined(ENABLE_NETWORK) */
|
||||||
|
|
||||||
|
/* static */ AIScannerInfo *AI::GetScannerInfo()
|
||||||
|
{
|
||||||
|
return AI::scanner_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* static */ AIScannerLibrary *AI::GetScannerLibrary()
|
||||||
|
{
|
||||||
|
return AI::scanner_library;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -201,6 +201,8 @@ public:
|
||||||
return num + fs.Scan(GetExtension(), BASESET_DIR, Tbase_set::SEARCH_IN_TARS);
|
return num + fs.Scan(GetExtension(), BASESET_DIR, Tbase_set::SEARCH_IN_TARS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Tbase_set *GetAvailableSets();
|
||||||
|
|
||||||
static bool SetSet(const char *name);
|
static bool SetSet(const char *name);
|
||||||
static char *GetSetsList(char *p, const char *last);
|
static char *GetSetsList(char *p, const char *last);
|
||||||
static int GetNumSets();
|
static int GetNumSets();
|
||||||
|
@ -217,6 +219,15 @@ public:
|
||||||
static bool HasSet(const ContentInfo *ci, bool md5sum);
|
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 */
|
/** Types of graphics in the base graphics set */
|
||||||
enum GraphicsFileType {
|
enum GraphicsFileType {
|
||||||
|
|
|
@ -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/>.
|
* 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 "base_media_base.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
@ -274,19 +277,13 @@ template <class Tbase_set>
|
||||||
#if defined(ENABLE_NETWORK)
|
#if defined(ENABLE_NETWORK)
|
||||||
#include "network/network_content.h"
|
#include "network/network_content.h"
|
||||||
|
|
||||||
/**
|
template <class Tbase_set> const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const Tbase_set *s)
|
||||||
* 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)
|
|
||||||
{
|
{
|
||||||
for (; s != NULL; s = s->next) {
|
for (; s != NULL; s = s->next) {
|
||||||
if (s->GetNumMissing() != 0) continue;
|
if (s->GetNumMissing() != 0) continue;
|
||||||
|
|
||||||
if (s->shortname != ci->unique_id) continue;
|
if (s->shortname != ci->unique_id) continue;
|
||||||
if (!md5sum) return true;
|
if (!md5sum) return s->files[0].filename;
|
||||||
|
|
||||||
byte md5[16];
|
byte md5[16];
|
||||||
memset(md5, 0, sizeof(md5));
|
memset(md5, 0, sizeof(md5));
|
||||||
|
@ -295,21 +292,26 @@ template <class Tbase_set> bool HasBaseSet(const ContentInfo *ci, bool md5sum, c
|
||||||
md5[j] ^= s->files[i].hash[j];
|
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 NULL;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Tbase_set>
|
template <class Tbase_set>
|
||||||
/* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum)
|
/* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum)
|
||||||
{
|
{
|
||||||
return HasBaseSet(ci, md5sum, BaseMedia<Tbase_set>::available_sets) ||
|
return (TryGetBaseSetFile(ci, md5sum, BaseMedia<Tbase_set>::available_sets) != NULL) ||
|
||||||
HasBaseSet(ci, md5sum, BaseMedia<Tbase_set>::duplicate_sets);
|
(TryGetBaseSetFile(ci, md5sum, BaseMedia<Tbase_set>::duplicate_sets) != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
template <class Tbase_set>
|
||||||
|
const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const Tbase_set *s)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
template <class Tbase_set>
|
template <class Tbase_set>
|
||||||
/* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum)
|
/* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum)
|
||||||
{
|
{
|
||||||
|
@ -374,6 +376,16 @@ template <class Tbase_set>
|
||||||
return BaseMedia<Tbase_set>::used_set;
|
return BaseMedia<Tbase_set>::used_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.
|
* Force instantiation of methods so we don't get linker errors.
|
||||||
* @param repl_type the type of the BaseMedia to instantiate
|
* @param repl_type the type of the BaseMedia to instantiate
|
||||||
|
@ -390,5 +402,6 @@ template <class Tbase_set>
|
||||||
template int repl_type::GetIndexOfUsedSet(); \
|
template int repl_type::GetIndexOfUsedSet(); \
|
||||||
template const set_type *repl_type::GetSet(int index); \
|
template const set_type *repl_type::GetSet(int index); \
|
||||||
template const set_type *repl_type::GetUsedSet(); \
|
template const set_type *repl_type::GetUsedSet(); \
|
||||||
template bool repl_type::DetermineBestSet();
|
template bool repl_type::DetermineBestSet(); \
|
||||||
|
template set_type *repl_type::GetAvailableSets();
|
||||||
|
|
||||||
|
|
36
src/fios.cpp
36
src/fios.cpp
|
@ -561,8 +561,9 @@ void FiosGetHeightmapList(SaveLoadDialogMode mode)
|
||||||
|
|
||||||
/** Basic data to distinguish a scenario. Used in the server list window */
|
/** Basic data to distinguish a scenario. Used in the server list window */
|
||||||
struct ScenarioIdentifier {
|
struct ScenarioIdentifier {
|
||||||
uint32 scenid; ///< ID for the scenario (generated by content)
|
uint32 scenid; ///< ID for the scenario (generated by content).
|
||||||
uint8 md5sum[16]; ///< MD5 checksum of file
|
uint8 md5sum[16]; ///< MD5 checksum of file.
|
||||||
|
char filename[MAX_PATH]; ///< filename of the file.
|
||||||
|
|
||||||
bool operator == (const ScenarioIdentifier &other) const
|
bool operator == (const ScenarioIdentifier &other) const
|
||||||
{
|
{
|
||||||
|
@ -606,6 +607,7 @@ public:
|
||||||
int fret = fscanf(f, "%i", &id.scenid);
|
int fret = fscanf(f, "%i", &id.scenid);
|
||||||
FioFCloseFile(f);
|
FioFCloseFile(f);
|
||||||
if (fret != 1) return false;
|
if (fret != 1) return false;
|
||||||
|
strecpy(id.filename, filename, lastof(id.filename));
|
||||||
|
|
||||||
Md5 checksum;
|
Md5 checksum;
|
||||||
uint8 buffer[1024];
|
uint8 buffer[1024];
|
||||||
|
@ -638,24 +640,34 @@ public:
|
||||||
static ScenarioScanner _scanner;
|
static ScenarioScanner _scanner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether we've got a given scenario based on its unique ID.
|
* Find a given scenario based on its unique ID.
|
||||||
* @param ci the content info to compare it to
|
* @param ci The content info to compare it to.
|
||||||
* @param md5sum whether to look at the md5sum or the id
|
* @param md5sum Whether to look at the md5sum or the id.
|
||||||
* @return true if we've got the scenario
|
* @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);
|
_scanner.Scan(false);
|
||||||
|
|
||||||
for (ScenarioIdentifier *id = _scanner.Begin(); id != _scanner.End(); id++) {
|
for (ScenarioIdentifier *id = _scanner.Begin(); id != _scanner.End(); id++) {
|
||||||
if (md5sum ?
|
if (md5sum ? (memcmp(id->md5sum, ci->md5sum, sizeof(id->md5sum)) == 0)
|
||||||
(memcmp(id->md5sum, ci->md5sum, sizeof(id->md5sum)) == 0) :
|
: (id->scenid == ci->unique_id)) {
|
||||||
(id->scenid == ci->unique_id)) {
|
return id->filename;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "gfx_type.h"
|
#include "gfx_type.h"
|
||||||
#include "company_base.h"
|
#include "company_base.h"
|
||||||
#include "newgrf_config.h"
|
#include "newgrf_config.h"
|
||||||
|
#include "network/core/tcp_content.h"
|
||||||
|
|
||||||
|
|
||||||
typedef SmallMap<uint, CompanyProperties *> CompanyPropertiesMap;
|
typedef SmallMap<uint, CompanyProperties *> CompanyPropertiesMap;
|
||||||
|
@ -180,4 +181,6 @@ extern const TextColour _fios_colours[];
|
||||||
void BuildFileList();
|
void BuildFileList();
|
||||||
void SetFiosType(const byte fiostype);
|
void SetFiosType(const byte fiostype);
|
||||||
|
|
||||||
|
const char *FindScenario(const ContentInfo *ci, bool md5sum);
|
||||||
|
|
||||||
#endif /* FIOS_H */
|
#endif /* FIOS_H */
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#define GAME_HPP
|
#define GAME_HPP
|
||||||
|
|
||||||
#include "../core/string_compare_type.hpp"
|
#include "../core/string_compare_type.hpp"
|
||||||
|
#include "game_scanner.hpp"
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
/** A list that maps AI names to their AIInfo object. */
|
/** 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 HasGame(const struct ContentInfo *ci, bool md5sum);
|
||||||
static bool HasGameLibrary(const ContentInfo *ci, bool md5sum);
|
static bool HasGameLibrary(const ContentInfo *ci, bool md5sum);
|
||||||
#endif
|
#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:
|
private:
|
||||||
static uint frame_counter; ///< Tick counter for the Game code.
|
static uint frame_counter; ///< Tick counter for the Game code.
|
||||||
|
|
|
@ -253,3 +253,12 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* defined(ENABLE_NETWORK) */
|
#endif /* defined(ENABLE_NETWORK) */
|
||||||
|
|
||||||
|
/* static */ GameScannerInfo *Game::GetScannerInfo()
|
||||||
|
{
|
||||||
|
return Game::scanner_info;
|
||||||
|
}
|
||||||
|
/* static */ GameScannerLibrary *Game::GetScannerLibrary()
|
||||||
|
{
|
||||||
|
return Game::scanner_library;
|
||||||
|
}
|
||||||
|
|
|
@ -271,4 +271,12 @@ bool ScriptScanner::HasScript(const ContentInfo *ci, bool md5sum)
|
||||||
return false;
|
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 */
|
#endif /* ENABLE_NETWORK */
|
||||||
|
|
|
@ -69,6 +69,14 @@ public:
|
||||||
*/
|
*/
|
||||||
bool HasScript(const struct ContentInfo *ci, bool md5sum);
|
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);
|
/* virtual */ bool AddFile(const char *filename, size_t basepath_length, const char *tar_filename);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue