Skip to content

Commit

Permalink
Merge branch 't/2.3/mapmod' into 2.3
Browse files Browse the repository at this point in the history
Refs #2610, closes #2688.
  • Loading branch information
cybersphinx committed May 4, 2011
2 parents fe46419 + 68843d0 commit 65d968c
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 9 deletions.
4 changes: 4 additions & 0 deletions src/game.c
Expand Up @@ -4505,6 +4505,10 @@ bool gameLoadV(PHYSFS_file* fileHandle, unsigned int version)
if (version >= VERSION_38)
{
setOverrideMods(saveGameData.modList);
if (saveGameData.sGame.map[0])
{
setOverrideMap(saveGameData.sGame.map, saveGameData.sGame.maxPlayers);
}
}

// All savegames from version 34 or before are little endian so swap them. All
Expand Down
12 changes: 6 additions & 6 deletions src/init.c
Expand Up @@ -234,7 +234,7 @@ BOOL rebuildSearchPath( searchPathMode mode, BOOL force )
char tmpstr[PATH_MAX] = "\0";

if (mode != current_mode || force ||
(use_override_mods && strcmp(override_mod_list, getModList())))
(use_override_mods && strcmp(override_mod_list, getModList())) || use_override_map)
{
if (mode != mod_clean)
{
Expand Down Expand Up @@ -344,7 +344,7 @@ BOOL rebuildSearchPath( searchPathMode mode, BOOL force )
#endif // DEBUG
// Add maps and global and multiplay mods
PHYSFS_addToSearchPath( curSearchPath->path, PHYSFS_APPEND );
addSubdirs( curSearchPath->path, "maps", PHYSFS_APPEND, NULL, false );
addSubdirs( curSearchPath->path, "maps", PHYSFS_APPEND, use_override_map?override_map:NULL, false );
addSubdirs( curSearchPath->path, "mods/music", PHYSFS_APPEND, NULL, false );
addSubdirs( curSearchPath->path, "mods/global", PHYSFS_APPEND, use_override_mods?override_mods:global_mods, true );
addSubdirs( curSearchPath->path, "mods", PHYSFS_APPEND, use_override_mods?override_mods:global_mods, true );
Expand Down Expand Up @@ -383,13 +383,13 @@ BOOL rebuildSearchPath( searchPathMode mode, BOOL force )
debug(LOG_ERROR, "Can't switch to unknown mods %i", mode);
return false;
}
if (use_override_mods && mode != mod_clean)
if ((use_override_mods || use_override_map) && mode != mod_clean)
{
if (strcmp(getModList(),override_mod_list))
if (use_override_mods && strcmp(getModList(),override_mod_list))
{
debug(LOG_POPUP, _("The required mod could not be loaded: %s\n\nWarzone will try to load the game without it."), override_mod_list);
}
clearOverrideMods();
clearOverrides();
current_mode = mod_override;
}

Expand All @@ -404,7 +404,7 @@ BOOL rebuildSearchPath( searchPathMode mode, BOOL force )
else if (use_override_mods)
{
// override mods are already the same as current mods, so no need to do anything
clearOverrideMods();
clearOverrides();
}
return true;
}
Expand Down
2 changes: 2 additions & 0 deletions src/levels.c
Expand Up @@ -47,6 +47,7 @@
#include "research.h"
#include "lib/framework/lexer_input.h"
#include "effects.h"
#include "modding.h"

extern int lev_get_lineno(void);
extern char* lev_get_text(void);
Expand Down Expand Up @@ -677,6 +678,7 @@ BOOL levLoadData(const char* name, char *pSaveName, GAME_TYPE saveType)
}
}

setOverrideMap(psNewLevel->pName, psNewLevel->players);
if (!rebuildSearchPath(psNewLevel->dataDir, false))
{
return false;
Expand Down
35 changes: 33 additions & 2 deletions src/main.c
Expand Up @@ -107,6 +107,8 @@ char * multiplay_mods[MAX_MODS] = { NULL };
char * override_mods[MAX_MODS] = { NULL };
char * override_mod_list = NULL;
bool use_override_mods = false;
char * override_map[2] = { NULL };
bool use_override_map = false;

char * loaded_mods[MAX_MODS] = { NULL };
char * mod_list = NULL;
Expand Down Expand Up @@ -250,7 +252,29 @@ void setOverrideMods(char * modlist)
override_mod_list = modlist;
use_override_mods = true;
}
void clearOverrideMods(void)
void setOverrideMap(char* map, int maxPlayers)
{
// Transform "Sk-Rush-T2" into "4c-Rush.wz" so it can be matched by the map loader
override_map[0] = (char*)malloc(strlen(map)+1+7);
snprintf(override_map[0], 3, "%d", maxPlayers);
strcat(override_map[0],"c-");
if (strncmp(map, "Sk-", 3) == 0)
{
strcat(override_map[0],map+3);
}
else
{
strcat(override_map[0],map);
}
if (strncmp(override_map[0]+strlen(override_map[0])-3,"-T",2) == 0)
{
override_map[0][strlen(override_map[0])-3] = '\0';
}
strcat(override_map[0],".wz");
override_map[1] = NULL;
use_override_map = true;
}
void clearOverrides(void)
{
int i;
use_override_mods = false;
Expand All @@ -260,6 +284,13 @@ void clearOverrideMods(void)
}
override_mods[0] = NULL;
override_mod_list = NULL;

if (override_map[0])
{
free(override_map[0]);
override_map[0] = NULL;
}
use_override_map = false;
}

void addLoadedMod(const char * modname)
Expand Down Expand Up @@ -705,7 +736,7 @@ static void startGameLoop(void)
{
SetGameMode(GS_NORMAL);

if (!levLoadData(aLevelName, NULL, 0))
if (!levLoadData(aLevelName, NULL, GTYPE_SCENARIO_START))
{
debug( LOG_FATAL, "Shutting down after failure" );
exit(EXIT_FAILURE);
Expand Down
2 changes: 2 additions & 0 deletions src/main.h
Expand Up @@ -49,5 +49,7 @@ extern char * multiplay_mods[MAX_MODS];
extern char * override_mods[MAX_MODS];
extern char * override_mod_list;
extern bool use_override_mods;
extern char * override_map[2];
extern bool use_override_map;

#endif // __INCLUDED_SRC_MAIN_H__
3 changes: 2 additions & 1 deletion src/modding.h
Expand Up @@ -26,7 +26,8 @@ void removeSubdirs( const char * basedir, const char * subdir, char * checkList[
void printSearchPath( void );

void setOverrideMods(char * modlist);
void clearOverrideMods(void);
void setOverrideMap(char* map, int maxPlayers);
void clearOverrides(void);

void addLoadedMod(const char * modname);
void clearLoadedMods(void);
Expand Down

0 comments on commit 65d968c

Please sign in to comment.