Code Search for Developers
 
 
  

ModDirs.cpp from Scorched 3D at Krugle


Show ModDirs.cpp syntax highlighted

////////////////////////////////////////////////////////////////////////////////
//    Scorched3D (c) 2000-2004
//
//    This file is part of Scorched3D.
//
//    Scorched3D is free software; you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation; either version 2 of the License, or
//    (at your option) any later version.
//
//    Scorched3D is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with Scorched3D; if not, write to the Free Software
//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
////////////////////////////////////////////////////////////////////////////////

#include <engine/ModDirs.h>
#include <common/Defines.h>
#include <common/Logger.h>
#include <common/FileList.h>
#include <stdio.h>

ModDirs::ModDirs()
{
}

ModDirs::~ModDirs()
{
}

bool ModDirs::loadModDirs()
{
	loadModFile(formatString("%s", "none"), true); // formatString used to put none into buffer

	std::string modFile = getModFile("");
	std::string globalModFile = getGlobalModFile("");
	if (!loadModDir(modFile.c_str(), false)) return false;
	if (!loadModDir(globalModFile.c_str(), true)) return false;
	return true;
}
	
bool ModDirs::loadModDir(const char *dirName, bool global)
{
	FileList dir(dirName, "*", false);
	if (dir.getStatus())
	{
		FileList::ListType &dirs = dir.getFiles();
		FileList::ListType::iterator itor;
		for (itor = dirs.begin();
			itor != dirs.end();
			itor++)
		{
			std::string filename = (*itor);
			if (!loadModFile(filename.c_str(), global)) return false;
		}
	}
	return true;
}

bool ModDirs::loadModFile(const char *fileName, bool global)
{
	if (strstr(fileName, "CVS")) return true;

	std::string oldFileName(fileName);
	_strlwr((char *) fileName);

	if (strcmp(oldFileName.c_str(), fileName) != 0)
	{
		dialogMessage("ModDirs", formatString(
			"ERROR: All mod directories must have lower case filenames.\n"
			"Directory \"%s\" has upper case charaters in it",
			fileName));
		return false;
	}
	
	// Check if this mod has already been loaded
	std::list<ModInfo>::iterator itor;
	for (itor = dirs_.begin();
		itor != dirs_.end();
		itor++)
	{
		ModInfo &info = (*itor);
		if (0 == strcmp(info.getName(), fileName)) return true;
	}

	// Check if there is a modinfo file for this mod
	std::string noneGamesFile = getDataFile("data/modinfo.xml");
	setDataFileMod(fileName);
	std::string modGamesFile = getDataFile("data/modinfo.xml");
	setDataFileMod("none");

	bool defaultInfoFile = (0 == strcmp(noneGamesFile.c_str(), modGamesFile.c_str()));
	if (0 != strcmp(fileName, "none") && defaultInfoFile)
	{
		// This mod does not have a mod info, no one can play it
		// or even see it
		return true;
	}

	ModInfo newInfo(fileName);

	setDataFileMod(fileName);
	bool parseResult = newInfo.parse(modGamesFile.c_str());
	setDataFileMod("none");

	if (!parseResult)
	{
		// Just log and return as this may be the result of
		// only downloading 1/2 the mod and not having the icons required
		// for the modinfo
		Logger::log(formatString(
			"Failed to parse mod info file \"%s\"",
			modGamesFile.c_str()));
		return true;
	}
	

	if (0 != strcmp(newInfo.getProtocolVersion(), ScorchedProtocolVersion))
	{
		// Check if this is a global mod (one bundled with s3d)
		// If its not we can't play it as it is out of date
		// If it is we remove the custom version in the home dir
		if (!global)
		{
			return true;
		}

		// The version has changed move the current mod directories
		if (!s3d_dirExists(getSettingsFile("/oldmods")))
		{
			s3d_dirMake(getSettingsFile("/oldmods"));
		}

		// The gloabl mod is out of date, move it out the way
		// This is done because this mod is included with S3D (i.e. a global mod)
		// but also exists in the users custom mod directory.
		// The one in the user's directory may be out of date, so it needs to be 
		// removed incase it masks the newer one that comes with the game.
		std::string src = getModFile(fileName);
		std::string dest = getSettingsFile(formatString("/oldmods/%s-%u", fileName, time(0)));
		if (s3d_dirExists(src.c_str()))
		{
			if (0 == rename(src.c_str(), dest.c_str()))
			{
				dialogMessage("Scorched3D", formatString(
					"Mod directory\n"
					"\"%s\"\n"
					"was moved to\n"
					"\"%s\"\n"
					"as it may be incompatable with this version of Scorched3D",
					src.c_str(), dest.c_str()));

				return loadModFile(oldFileName.c_str(), global);
			}
		}
		else
		{
			dialogExit("Scorched3D", formatString(
				"Bundled mod \"%s\" has an out of date modinfo file.\n"
				"Mod version = %s, scorched version = %s",
				oldFileName.c_str(),
				newInfo.getProtocolVersion(), ScorchedProtocolVersion));
		}
	}

	dirs_.push_back(newInfo);
	return true;
}




See more files for this project here

Scorched 3D

Scorched3D is a 3D remake of the popular 2D artillery game Scorched Earth.\r\nScorched3D can be played against the computer, other players and remotely across the internet or LAN.

Project homepage: http://sourceforge.net/projects/scorched3d
Programming language(s): C,C++,XML
License: gpl2

  Action.cpp
  Action.h
  ActionController.cpp
  ActionController.h
  ActionReferenced.cpp
  ActionReferenced.h
  EventContainer.cpp
  EventContainer.h
  GameState.cpp
  GameState.h
  GameStateI.cpp
  GameStateI.h
  GameStateStimulusI.cpp
  GameStateStimulusI.h
  MainLoop.cpp
  MainLoop.h
  MainLoopI.cpp
  MainLoopI.h
  MetaClass.cpp
  MetaClass.h
  ModDirs.cpp
  ModDirs.h
  ModFileEntry.cpp
  ModFileEntry.h
  ModFiles.cpp
  ModFiles.h
  ModInfo.cpp
  ModInfo.h
  PhysicsParticle.cpp
  PhysicsParticle.h
  PhysicsParticleObject.cpp
  PhysicsParticleObject.h
  PlayShots.cpp
  PlayShots.h
  ScorchedCollisionIds.cpp
  ScorchedCollisionIds.h
  ScorchedContext.cpp
  ScorchedContext.h
  ShotState.cpp
  ShotState.h
  SyncCheck.cpp
  SyncCheck.h
  ViewPoints.cpp
  ViewPoints.h