3 | --- src/saveload/ai_sl.cpp (revision 27582)
| 3 | --- src/ai/ai_scanner.cpp (revision 27582)
|
---|
4 | +++ src/saveload/ai_sl.cpp (working copy)
| 4 | +++ src/ai/ai_scanner.cpp (working copy)
|
---|
5 | @@ -83,7 +83,7 @@
| 5 | @@ -136,6 +136,31 @@
|
---|
6 | /* A random AI. */
| 6 | }
|
---|
7 | config->Change(NULL, -1, false, true);
| 7 | }
|
---|
8 | } else {
| 8 |
|
---|
9 | - config->Change(_ai_saveload_name, _ai_saveload_version, false, _ai_saveload_is_random);
| 9 | + if (info == NULL && !force_exact_match && versionParam != -1) {
|
---|
10 | + config->Change(_ai_saveload_name, -1, true, _ai_saveload_is_random);
| 10 | + /* If we didn't find a match AI, maybe the user included a version */
|
---|
11 | if (!config->HasScript()) {
| 11 | + char *e = strrchr(ai_name, '.');
|
---|
12 | /* No version of the AI available that can load the data. Try to load the
| 12 | + if (e == NULL) return NULL;
|
---|
13 | * latest version of the AI instead. */
| 13 | + *e = '\0';
|
---|
14 | Index: src/saveload/game_sl.cpp
| 14 | + e++;
|
---|
| | 15 | + versionParam = atoi(e);
|
---|
| | 16 | + /* Try to find a direct 'name.version' match */
|
---|
| | 17 | + char ai_name_tmp[1024];
|
---|
| | 18 | + seprintf(ai_name_tmp, lastof(ai_name_tmp), "%s.%d", ai_name, versionParam);
|
---|
| | 19 | + strtolower(ai_name_tmp);
|
---|
| | 20 | + if (this->info_list.find(ai_name_tmp) != this->info_list.end()) return static_cast<AIInfo *>(this->info_list[ai_name_tmp]);
|
---|
| | 21 | +
|
---|
| | 22 | + /* See if there is a compatible AI which goes by that name, with the highest
|
---|
| | 23 | + * version which allows loading the requested version */
|
---|
| | 24 | + ScriptInfoList::iterator it = this->info_list.begin();
|
---|
| | 25 | + for (; it != this->info_list.end(); it++) {
|
---|
| | 26 | + AIInfo *i = static_cast<AIInfo *>((*it).second);
|
---|
| | 27 | + if (strcasecmp(ai_name, i->GetName()) == 0 && i->CanLoadFromVersion(versionParam) && (version == -1 || i->GetVersion() > version)) {
|
---|
| | 28 | + version = (*it).second->GetVersion();
|
---|
| | 29 | + info = i;
|
---|
| | 30 | + }
|
---|
| | 31 | + }
|
---|
| | 32 | + }
|
---|
| | 33 | +
|
---|
| | 34 | return info;
|
---|
| | 35 | }
|
---|
| | 36 |
|
---|
| | 37 | Index: src/game/game_scanner.cpp
|
---|
16 | --- src/saveload/game_sl.cpp (revision 27582)
| 39 | --- src/game/game_scanner.cpp (revision 27582)
|
---|
17 | +++ src/saveload/game_sl.cpp (working copy)
| 40 | +++ src/game/game_scanner.cpp (working copy)
|
---|
18 | @@ -75,7 +75,7 @@
| 41 | @@ -77,6 +77,31 @@
|
---|
19 | GameConfig *config = GameConfig::GetConfig(GameConfig::SSS_FORCE_GAME);
| 42 | }
|
---|
20 | if (StrEmpty(_game_saveload_name)) {
| 43 | }
|
---|
21 | } else {
| 44 |
|
---|
22 | - config->Change(_game_saveload_name, _game_saveload_version, false, _game_saveload_is_random);
| 45 | + if (info == NULL && !force_exact_match && versionParam != -1) {
|
---|
23 | + config->Change(_game_saveload_name, -1, true, _game_saveload_is_random);
| 46 | + /* If we didn't find a match Game script, maybe the user included a version */
|
---|
24 | if (!config->HasScript()) {
| 47 | + char *e = strrchr(game_name, '.');
|
---|
25 | /* No version of the GameScript available that can load the data. Try to load the
| 48 | + if (e == NULL) return NULL;
|
---|
26 | * latest version of the GameScript instead. */ | 49 | + *e = '\0';
|
---|
| | 50 | + e++;
|
---|
| | 51 | + versionParam = atoi(e);
|
---|
| | 52 | + /* Try to find a direct 'name.version' match */
|
---|
| | 53 | + char game_name_tmp[1024];
|
---|
| | 54 | + seprintf(game_name_tmp, lastof(game_name_tmp), "%s.%d", game_name, versionParam);
|
---|
| | 55 | + strtolower(game_name_tmp);
|
---|
| | 56 | + if (this->info_list.find(game_name_tmp) != this->info_list.end()) return static_cast<GameInfo *>(this->info_list[game_name_tmp]);
|
---|
| | 57 | +
|
---|
| | 58 | + /* See if there is a compatible Game script which goes by that name, with the highest
|
---|
| | 59 | + * version which allows loading the requested version */
|
---|
| | 60 | + ScriptInfoList::iterator it = this->info_list.begin();
|
---|
| | 61 | + for (; it != this->info_list.end(); it++) {
|
---|
| | 62 | + GameInfo *i = static_cast<GameInfo *>((*it).second);
|
---|
| | 63 | + if (strcasecmp(game_name, i->GetName()) == 0 && i->CanLoadFromVersion(versionParam) && (version == -1 || i->GetVersion() > version)) {
|
---|
| | 64 | + version = (*it).second->GetVersion();
|
---|
| | 65 | + info = i;
|
---|
| | 66 | + }
|
---|
| | 67 | + }
|
---|
| | 68 | + }
|
---|
| | 69 | +
|
---|
| | 70 | return info;
|
---|
| | 71 | } |
---|