<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,4 +1,5 @@
 #include &quot;GResourceMap.h&quot;
+#include &quot;RAI.h&quot;
 #include &lt;set&gt;
 #include &quot;Sim/Features/FeatureDef.h&quot;
 //#include &lt;time.h&gt;
@@ -34,7 +35,8 @@ float ResourceSite::GetResourceDistance(ResourceSite* RS, const int&amp; pathType)
 	return RSD-&gt;minDistance;
 }
 
-GlobalResourceMap::GlobalResourceMap(IAICallback* cb, cLogFile* l, GlobalTerrainMap* TM)
+GlobalResourceMap::GlobalResourceMap(IAICallback* _cb, cLogFile* l, GlobalTerrainMap* TM) :
+	cb(_cb)
 {
 //	l = logfile;
 	*l&lt;&lt;&quot;\n Loading the Resource-Map ...&quot;;
@@ -98,21 +100,26 @@ GlobalResourceMap::GlobalResourceMap(IAICallback* cb, cLogFile* l, GlobalTerrain
 				fList[i] = fList[--fSize];
 	}
 
-	string cacheDirectory = cLogFile::GetDir(cb, true, &quot;cache&quot;);
+	relResourceFileName = &quot;cache/&quot; + string(cb-&gt;GetModName());
+	relResourceFileName.resize(relResourceFileName.size()-4);
+	relResourceFileName += &quot;-&quot; + string(cb-&gt;GetMapName());
+	relResourceFileName.resize(relResourceFileName.size()-3);
+	relResourceFileName += &quot;res&quot;;
+
+	string resourceFileName_r;
+	FILE* resourceFile_r = NULL;
+	// get absolute file name
+	if (cRAI::LocateFile(cb, relResourceFileName, resourceFileName_r, false)) {
+		resourceFile_r = fopen(resourceFileName_r.c_str(), &quot;rb&quot;);
+	}
 
-	resourceFileName = cacheDirectory + string(cb-&gt;GetModName());
-	resourceFileName.resize(resourceFileName.size()-4);
-	resourceFileName += &quot;-&quot; + string(cb-&gt;GetMapName());
-	resourceFileName.resize(resourceFileName.size()-3);
-	resourceFileName += &quot;res&quot;;
-	FILE *resourceFile = fopen(resourceFileName.c_str(),&quot;rb&quot;);
 	bool useResourceFile = false;
-	if( resourceFile )
+	if( resourceFile_r )
 	{
 		useResourceFile = true;
 		*l&lt;&lt;&quot;\n  Loading Resource-Site Data ...&quot;;
 		int udL2Size;
-		fread(&amp;udL2Size, sizeof(int), 1, resourceFile);
+		fread(&amp;udL2Size, sizeof(int), 1, resourceFile_r);
 		if( udSize != udL2Size )
 			useResourceFile = false;
 		else
@@ -120,7 +127,7 @@ GlobalResourceMap::GlobalResourceMap(IAICallback* cb, cLogFile* l, GlobalTerrain
 			int ID;
 			for( int i=0; i&lt;udSize; i++ )
 			{
-				fread(&amp;ID, sizeof(int), 1, resourceFile);
+				fread(&amp;ID, sizeof(int), 1, resourceFile_r);
 				if( udList[i]-&gt;id != ID )
 				{	// The order or types of definitions have changed
 					useResourceFile = false;
@@ -130,14 +137,14 @@ GlobalResourceMap::GlobalResourceMap(IAICallback* cb, cLogFile* l, GlobalTerrain
 			if( useResourceFile )
 			{
 				int featureSites;
-				fread(&amp;featureSites, sizeof(int), 1, resourceFile);
+				fread(&amp;featureSites, sizeof(int), 1, resourceFile_r);
 				if( fSize != featureSites )
 					useResourceFile = false;
 				else
 				{	// Checks if the feature resource list has changed
 					for( int i=0; i&lt;fSize; i++ )
 					{
-						fread(&amp;ID, sizeof(int), 1, resourceFile);
+						fread(&amp;ID, sizeof(int), 1, resourceFile_r);
 						if( fList[i] != ID )
 						{	// The order or types of features have changed
 							useResourceFile = false;
@@ -156,20 +163,20 @@ GlobalResourceMap::GlobalResourceMap(IAICallback* cb, cLogFile* l, GlobalTerrain
 						int optionID;
 						for( int iT=0; iT&lt;2; iT++ )
 						{
-							fread(&amp;RSize[iT], sizeof(int), 1, resourceFile);
+							fread(&amp;RSize[iT], sizeof(int), 1, resourceFile_r);
 							for( int iR=0; iR&lt;RSize[iT]; iR++ )
 							{
-								fread(&amp;featureID, sizeof(int), 1, resourceFile);
-								fread(&amp;position, sizeof(float3), 1, resourceFile);
+								fread(&amp;featureID, sizeof(int), 1, resourceFile_r);
+								fread(&amp;position, sizeof(float3), 1, resourceFile_r);
 								if( featureID &gt;= 0 )
 									R[iT][iR] = new ResourceSite(position,featureID,cb-&gt;GetFeatureDef(featureID));
 								else
 									R[iT][iR] = new ResourceSite(position);
-								fread(&amp;R[iT][iR]-&gt;amount, sizeof(float), 1, resourceFile);
-								fread(&amp;size, sizeof(int), 1, resourceFile);
+								fread(&amp;R[iT][iR]-&gt;amount, sizeof(float), 1, resourceFile_r);
+								fread(&amp;size, sizeof(int), 1, resourceFile_r);
 								for( int i=0; i&lt;size; i++ )
 								{
-									fread(&amp;optionID, sizeof(int), 1, resourceFile);
+									fread(&amp;optionID, sizeof(int), 1, resourceFile_r);
 									R[iT][iR]-&gt;options.insert(optionID);
 								}
 							}
@@ -177,26 +184,26 @@ GlobalResourceMap::GlobalResourceMap(IAICallback* cb, cLogFile* l, GlobalTerrain
 						for( int iT=0; iT&lt;2; iT++ )
 							for( int iR=0; iR&lt;RSize[iT]; iR++ )
 							{
-								fread(&amp;size, sizeof(int), 1, resourceFile);
+								fread(&amp;size, sizeof(int), 1, resourceFile_r);
 								for( int i=0; i&lt;size; i++ )
 								{
-									fread(&amp;iT2, sizeof(int), 1, resourceFile);
-									fread(&amp;iR2, sizeof(int), 1, resourceFile);
+									fread(&amp;iT2, sizeof(int), 1, resourceFile_r);
+									fread(&amp;iR2, sizeof(int), 1, resourceFile_r);
 									R[iT][iR]-&gt;siteDistance.insert(rrPair(R[iT2][iR2],ResourceSiteDistance(0.0)));
 									ResourceSiteDistance* RSD = &amp;R[iT][iR]-&gt;siteDistance.find(R[iT2][iR2])-&gt;second;
-									fread(&amp;RSD-&gt;minDistance, sizeof(float), 1, resourceFile);
-									fread(&amp;RSD-&gt;bestPathType, sizeof(int), 1, resourceFile);
-									fread(&amp;dSize, sizeof(int), 1, resourceFile);
+									fread(&amp;RSD-&gt;minDistance, sizeof(float), 1, resourceFile_r);
+									fread(&amp;RSD-&gt;bestPathType, sizeof(int), 1, resourceFile_r);
+									fread(&amp;dSize, sizeof(int), 1, resourceFile_r);
 									for( int i=0; i&lt;dSize; i++ )
 									{
-										fread(&amp;optionID, sizeof(int), 1, resourceFile);
-										fread(&amp;distance, sizeof(float), 1, resourceFile);
+										fread(&amp;optionID, sizeof(int), 1, resourceFile_r);
+										fread(&amp;distance, sizeof(float), 1, resourceFile_r);
 										RSD-&gt;distance.insert(ifPair(optionID,distance));
 									}
-									fread(&amp;dSize, sizeof(int), 1, resourceFile);
+									fread(&amp;dSize, sizeof(int), 1, resourceFile_r);
 									for( int i=0; i&lt;dSize; i++ )
 									{
-										fread(&amp;position, sizeof(float3), 1, resourceFile);
+										fread(&amp;position, sizeof(float3), 1, resourceFile_r);
 										RSD-&gt;pathDebug.push_back(position);
 									}
 									if( RSD-&gt;bestPathType == -2 )
@@ -205,14 +212,14 @@ GlobalResourceMap::GlobalResourceMap(IAICallback* cb, cLogFile* l, GlobalTerrain
 										RSD-&gt;bestDistance = &amp;RSD-&gt;distance.find(RSD-&gt;bestPathType)-&gt;second;
 								}
 							}
-						fread(&amp;averageMetalSite, sizeof(float), 1, resourceFile);
-						fread(&amp;isMetalMap, sizeof(bool), 1, resourceFile);
+						fread(&amp;averageMetalSite, sizeof(float), 1, resourceFile_r);
+						fread(&amp;isMetalMap, sizeof(bool), 1, resourceFile_r);
 						if( isMetalMap )
 						{
 							sector = new MetalMapSector[TM-&gt;sectorXSize*TM-&gt;sectorZSize];
 							for( int iS=0; iS&lt;TM-&gt;sectorXSize*TM-&gt;sectorZSize; iS++ )
 							{
-								fread(&amp;sector[iS].isMetalSector, sizeof(bool), 1, resourceFile);
+								fread(&amp;sector[iS].isMetalSector, sizeof(bool), 1, resourceFile_r);
 								sector[iS].S = &amp;TM-&gt;sector[iS];
 							}
 						}
@@ -220,7 +227,7 @@ GlobalResourceMap::GlobalResourceMap(IAICallback* cb, cLogFile* l, GlobalTerrain
 				}
 			}
 		}
-		fclose(resourceFile);
+		fclose(resourceFile_r);
 		if( !useResourceFile )
 			*l&lt;&lt;&quot;\n  A change has been detected in the map/mod, the resource data will be reloaded.&quot;;
 	}
@@ -704,62 +711,70 @@ GlobalResourceMap::~GlobalResourceMap()
 {
 	if( saveResourceFile )
 	{
-		FILE *resourceFile = fopen(resourceFileName.c_str(),&quot;wb&quot;);
+		string resourceFileName_w;
+		FILE* resourceFile_w = NULL;
+		// get absolute file name
+		if (cRAI::LocateFile(cb, relResourceFileName, resourceFileName_w, true)) {
+			resourceFile_w = fopen(resourceFileName_w.c_str(), &quot;wb&quot;);
+		} else {
+			throw 12;
+		}
+
 		int size;
-		fwrite(&amp;(size=saveUD.size()), sizeof(int), 1, resourceFile);
+		fwrite(&amp;(size=saveUD.size()), sizeof(int), 1, resourceFile_w);
 		for(vector&lt;int&gt;::iterator i=saveUD.begin(); i!=saveUD.end(); i++)
-			fwrite(&amp;*i, sizeof(int), 1, resourceFile);
-		fwrite(&amp;(size=saveF.size()), sizeof(int), 1, resourceFile);
+			fwrite(&amp;*i, sizeof(int), 1, resourceFile_w);
+		fwrite(&amp;(size=saveF.size()), sizeof(int), 1, resourceFile_w);
 		for(vector&lt;int&gt;::iterator i=saveF.begin(); i!=saveF.end(); i++)
-			fwrite(&amp;*i, sizeof(int), 1, resourceFile);
+			fwrite(&amp;*i, sizeof(int), 1, resourceFile_w);
 		for( int iT=0; iT&lt;2; iT++ )
 		{
-			fwrite(&amp;RSize[iT], sizeof(int), 1, resourceFile);
+			fwrite(&amp;RSize[iT], sizeof(int), 1, resourceFile_w);
 			for( int iR=0; iR&lt;RSize[iT]; iR++ )
 			{
-				fwrite(&amp;R[iT][iR]-&gt;featureID, sizeof(int), 1, resourceFile);
-				fwrite(&amp;R[iT][iR]-&gt;position, sizeof(float3), 1, resourceFile);
-				fwrite(&amp;R[iT][iR]-&gt;amount, sizeof(float), 1, resourceFile);
-				fwrite(&amp;(size=R[iT][iR]-&gt;options.size()), sizeof(int), 1, resourceFile);
+				fwrite(&amp;R[iT][iR]-&gt;featureID, sizeof(int), 1, resourceFile_w);
+				fwrite(&amp;R[iT][iR]-&gt;position, sizeof(float3), 1, resourceFile_w);
+				fwrite(&amp;R[iT][iR]-&gt;amount, sizeof(float), 1, resourceFile_w);
+				fwrite(&amp;(size=R[iT][iR]-&gt;options.size()), sizeof(int), 1, resourceFile_w);
 				for( set&lt;int&gt;::iterator i=R[iT][iR]-&gt;options.begin(); i!=R[iT][iR]-&gt;options.end(); i++ )
-					fwrite(&amp;*i, sizeof(int), 1, resourceFile);
+					fwrite(&amp;*i, sizeof(int), 1, resourceFile_w);
 			}
 		}
 		for( int iT=0; iT&lt;2; iT++ )
 			for( int iR=0; iR&lt;RSize[iT]; iR++ )
 			{
-				fwrite(&amp;(size=R[iT][iR]-&gt;siteDistance.size()), sizeof(int), 1, resourceFile);
+				fwrite(&amp;(size=R[iT][iR]-&gt;siteDistance.size()), sizeof(int), 1, resourceFile_w);
 				for( map&lt;ResourceSite*,ResourceSiteDistance&gt;::iterator iRS=R[iT][iR]-&gt;siteDistance.begin(); iRS!=R[iT][iR]-&gt;siteDistance.end(); iRS++ )
 				{
-					fwrite(&amp;iRS-&gt;first-&gt;type, sizeof(int), 1, resourceFile);
+					fwrite(&amp;iRS-&gt;first-&gt;type, sizeof(int), 1, resourceFile_w);
 					ResourceSiteDistance* RSD = &amp;iRS-&gt;second;
 					for(int i=0; i&lt;RSize[iRS-&gt;first-&gt;type]; i++)
 						if( R[iRS-&gt;first-&gt;type][i] == iRS-&gt;first )
 						{
-							fwrite(&amp;i, sizeof(int), 1, resourceFile);
+							fwrite(&amp;i, sizeof(int), 1, resourceFile_w);
 							break;
 						}
-					fwrite(&amp;RSD-&gt;minDistance, sizeof(float), 1, resourceFile);
+					fwrite(&amp;RSD-&gt;minDistance, sizeof(float), 1, resourceFile_w);
 					if( RSD-&gt;bestPathType == -1 &amp;&amp; RSD-&gt;bestDistance != 0 )
 						RSD-&gt;bestPathType = -2;
-					fwrite(&amp;RSD-&gt;bestPathType, sizeof(int), 1, resourceFile);
-					fwrite(&amp;(size=RSD-&gt;distance.size()), sizeof(int), 1, resourceFile);
+					fwrite(&amp;RSD-&gt;bestPathType, sizeof(int), 1, resourceFile_w);
+					fwrite(&amp;(size=RSD-&gt;distance.size()), sizeof(int), 1, resourceFile_w);
 					for( map&lt;int,float&gt;::iterator i=RSD-&gt;distance.begin(); i!=RSD-&gt;distance.end(); i++ )
 					{
-						fwrite(&amp;i-&gt;first, sizeof(int), 1, resourceFile);
-						fwrite(&amp;i-&gt;second, sizeof(float), 1, resourceFile);
+						fwrite(&amp;i-&gt;first, sizeof(int), 1, resourceFile_w);
+						fwrite(&amp;i-&gt;second, sizeof(float), 1, resourceFile_w);
 					}
-					fwrite(&amp;(size=RSD-&gt;pathDebug.size()), sizeof(int), 1, resourceFile);
+					fwrite(&amp;(size=RSD-&gt;pathDebug.size()), sizeof(int), 1, resourceFile_w);
 					for( vector&lt;float3&gt;::iterator i=RSD-&gt;pathDebug.begin(); i!=RSD-&gt;pathDebug.end(); i++ )
-						fwrite(&amp;*i, sizeof(float3), 1, resourceFile);
+						fwrite(&amp;*i, sizeof(float3), 1, resourceFile_w);
 				}
 			}
-		fwrite(&amp;averageMetalSite, sizeof(float), 1, resourceFile);
-		fwrite(&amp;isMetalMap, sizeof(bool), 1, resourceFile);
+		fwrite(&amp;averageMetalSite, sizeof(float), 1, resourceFile_w);
+		fwrite(&amp;isMetalMap, sizeof(bool), 1, resourceFile_w);
 		if( isMetalMap )
 			for( int iS=0; iS&lt;saveSectorSize; iS++ )
-				fwrite(&amp;sector[iS].isMetalSector, sizeof(bool), 1, resourceFile);
-		fclose(resourceFile);
+				fwrite(&amp;sector[iS].isMetalSector, sizeof(bool), 1, resourceFile_w);
+		fclose(resourceFile_w);
 	}
 
 	if( sector != 0 )</diff>
      <filename>AI/Skirmish/RAI/GResourceMap.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -105,8 +105,10 @@ private:
 	int MMXSize;
 	int MMExtractorRadiusI;
 
+	IAICallback* cb;
+
 	// needed to save the file
-	string resourceFileName;
+	string relResourceFileName;
 	bool saveResourceFile;
 	vector&lt;int&gt; saveUD;
 	vector&lt;int&gt; saveF;</diff>
      <filename>AI/Skirmish/RAI/GResourceMap.h</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,5 @@
 #include &quot;GTerrainMap.h&quot;
+#include &quot;RAI.h&quot;
 #include &lt;set&gt;
 #include &quot;Sim/MoveTypes/MoveInfo.h&quot;
 #include &quot;CUtils/Util.h&quot;
@@ -11,32 +12,35 @@ GlobalTerrainMap::GlobalTerrainMap(IAICallback* cb, cLogFile* l)
 //	l = logfile;
 	*l&lt;&lt;&quot;\n Loading the Terrain-Map ...&quot;;
 
-	string cacheDirectory = cLogFile::GetDir(cb, true, &quot;cache&quot;);
-
-	if (cacheDirectory.empty()) {
-		*l&lt;&lt;&quot;\nERROR: Could not create the cache dir: &quot;&lt;&lt;cacheDirectory;
-	}
-
 	// Reading the WaterDamage entry from the map file
 	const int mapFileVersion = 2;
 	waterIsHarmful = false;
-	string mapFileName = cb-&gt;GetMapName();
-	mapFileName = cacheDirectory + mapFileName.substr(0,int(mapFileName.size())-3) + &quot;res&quot;;
-	FILE *mapFile = fopen(mapFileName.c_str(),&quot;rb&quot;);
+
+	string relMapFileName = string(&quot;cache/&quot;) + cb-&gt;GetMapName();
+	relMapFileName = relMapFileName.substr(0, ((int) relMapFileName.size()) - 3) + &quot;res&quot;;
+
+	string mapFileName_r;
+	FILE* mapFile_r = NULL;
+	if (cRAI::LocateFile(cb, relMapFileName, mapFileName_r, false)) {
+		mapFile_r = fopen(mapFileName_r.c_str(), &quot;rb&quot;);
+	} else {
+		*l&lt;&lt;&quot;\nCould not find cache file for reading: &quot;&lt;&lt;relMapFileName;
+	}
+
 	bool mapFileLoaded = false;
-	if( mapFile )
+	if( mapFile_r )
 	{
 		int version;
-		fread(&amp;version, sizeof(int), 1, mapFile);
+		fread(&amp;version, sizeof(int), 1, mapFile_r);
 		if( version == mapFileVersion )
 		{
-			fread(&amp;waterIsHarmful, sizeof(bool), 1, mapFile);
-			fread(&amp;waterIsAVoid, sizeof(bool), 1, mapFile);
+			fread(&amp;waterIsHarmful, sizeof(bool), 1, mapFile_r);
+			fread(&amp;waterIsAVoid, sizeof(bool), 1, mapFile_r);
 			mapFileLoaded = true;
 		}
 		else
-			*l&lt;&lt;&quot;\n  The cashed map-file is using a different version format, reloading...&quot;;
-		fclose(mapFile);
+			*l&lt;&lt;&quot;\n  The cached map-file is using a different version format, reloading...&quot;;
+		fclose(mapFile_r);
 	}
 	if( !mapFileLoaded )
 	{
@@ -70,17 +74,19 @@ GlobalTerrainMap::GlobalTerrainMap(IAICallback* cb, cLogFile* l)
 		}
 //		*l&lt;&lt;&quot;\n  Map-Archive Timer: &quot;&lt;&lt;(clock()-mapArchiveTimer)/CLOCKS_PER_SEC&lt;&lt;&quot; seconds&quot;;
 
-		mapFile = fopen(mapFileName.c_str(),&quot;wb&quot;);
-		if (mapFile)
-		{
-			fwrite(&amp;mapFileVersion,sizeof(int),1,mapFile);
-			fwrite(&amp;waterIsHarmful,sizeof(bool),1,mapFile);
-			fwrite(&amp;waterIsAVoid,sizeof(bool),1,mapFile);
-			fclose(mapFile);
+		string mapFileName_w;
+		FILE* mapFile_w = NULL;
+		if (cRAI::LocateFile(cb, relMapFileName, mapFileName_w, true)) {
+			mapFile_w = fopen(mapFileName_w.c_str(), &quot;wb&quot;);
 		}
-		else
-		{
-			*l&lt;&lt;&quot;\nERROR: Could not write to file: &quot;&lt;&lt;mapFileName;
+
+		if (mapFile_w) {
+			fwrite(&amp;mapFileVersion,sizeof(int),1,mapFile_w);
+			fwrite(&amp;waterIsHarmful,sizeof(bool),1,mapFile_w);
+			fwrite(&amp;waterIsAVoid,sizeof(bool),1,mapFile_w);
+			fclose(mapFile_w);
+		} else {
+			*l&lt;&lt;&quot;\nERROR: Could not write to file: &quot;&lt;&lt;relMapFileName;
 		}
 	}
 </diff>
      <filename>AI/Skirmish/RAI/GTerrainMap.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,6 @@
 #include &quot;LogFile.h&quot;
 
+#include &quot;RAI.h&quot;
 #include &quot;ExternalAI/IAICallback.h&quot;
 
 #include &lt;string&gt;
@@ -12,13 +13,18 @@ using std::string;
 
 cLogFile::cLogFile(IAICallback* cb, string sFilename, bool bAppend)
 {
-	logFileName = cLogFile::GetDir(cb) + sFilename;
+	string sFilename_w;
+	const bool located = cRAI::LocateFile(cb, sFilename, sFilename_w, true);
+	if (!located) {
+		throw 11;
+	}
+
 	if( bAppend )
-		logFile = fopen(logFileName.c_str(),&quot;a&quot;);
+		logFile = fopen(sFilename_w.c_str(), &quot;a&quot;);
 //		logFile = new ofstream();
 //		logFile-&gt;open( logFileName.c_str(), ios::app );
 	else
-		logFile = fopen(logFileName.c_str(),&quot;w&quot;);
+		logFile = fopen(sFilename_w.c_str(), &quot;w&quot;);
 //		ofstream oLog( logFileName.c_str() );
 //		oLog.close();
 
@@ -86,28 +92,3 @@ void cLogFile::Write(int message)
 //	logFile-&gt;flush();
 }
 */
-
-std::string cLogFile::GetDir(IAICallback* cb, bool writeableAndCreate, std::string relPath) {
-
-	std::string returnedPath = &quot;&quot;;
-
-	AIHCGetDataDir cmdData = {
-		relPath.c_str(),
-		writeableAndCreate,
-		writeableAndCreate,
-		true,
-		false,
-		NULL
-	};
-
-	int ret = cb-&gt;HandleCommand(AIHCGetDataDirId, &amp;cmdData);
-
-	if (ret == 1 &amp;&amp; cmdData.ret_path != NULL) {
-		// nothing failed
-		std::string returnedPath = std::string(cmdData.ret_path);
-		free(cmdData.ret_path);
-		cmdData.ret_path = NULL;
-	}
-
-	return returnedPath;
-}</diff>
      <filename>AI/Skirmish/RAI/LogFile.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -22,8 +22,6 @@ public:
 	cLogFile&amp; operator&lt;&lt;(float message);
 	cLogFile&amp; operator&lt;&lt;(string message);
 
-	static std::string GetDir(IAICallback* cb, bool writeableAndCreate = true, string relPath = &quot;&quot;);
-
 private:
 	string logFileName;
 	FILE *logFile;</diff>
      <filename>AI/Skirmish/RAI/LogFile.h</filename>
    </modified>
    <modified>
      <diff>@@ -1074,42 +1074,62 @@ void cRAI::DebugDrawLine(float3 StartPos, float distance, int direction, float x
 			EndPos.z-=distance;
 		break;
 	}
-	cb-&gt;CreateLineFigure(StartPos,EndPos,width,arrow,lifetime,group);
+	cb-&gt;CreateLineFigure(StartPos, EndPos, width, arrow, lifetime, group);
 }
 
-void cRAI::DebugDrawShape(float3 CenterPos, float linelength, float width, int arrow, float yposoffset, int lifetime, int sides, int group)
+void cRAI::DebugDrawShape(float3 centerPos, float lineLength, float width, int arrow, float yPosOffset, int lifeTime, int sides, int group)
 {
-	DebugDrawLine(CenterPos,linelength,0,-linelength/2,linelength/2,yposoffset,lifetime,arrow,width,group);
-	DebugDrawLine(CenterPos,linelength,1,-linelength/2,-linelength/2,yposoffset,lifetime,arrow,width,group);
-	DebugDrawLine(CenterPos,linelength,2,linelength/2,-linelength/2,yposoffset,lifetime,arrow,width,group);
-	DebugDrawLine(CenterPos,linelength,3,linelength/2,linelength/2,yposoffset,lifetime,arrow,width,group);
+	DebugDrawLine(centerPos, lineLength, 0, -lineLength/2,  lineLength/2, yPosOffset, lifeTime, arrow, width, group);
+	DebugDrawLine(centerPos, lineLength, 1, -lineLength/2, -lineLength/2, yPosOffset, lifeTime, arrow, width, group);
+	DebugDrawLine(centerPos, lineLength, 2,  lineLength/2, -lineLength/2, yPosOffset, lifeTime, arrow, width, group);
+	DebugDrawLine(centerPos, lineLength, 3,  lineLength/2,  lineLength/2, yPosOffset, lifeTime, arrow, width, group);
+}
+
+bool cRAI::LocateFile(IAICallback* cb, const string&amp; relFileName, string&amp; absFileName, bool forWriting) {
+
+	int action = AIVAL_LOCATE_FILE_R;
+	if (forWriting) {
+		action = AIVAL_LOCATE_FILE_W;
+	}
+
+	const size_t absFN_sizeMax = 512 + relFileName.size();
+	char absFN[absFN_sizeMax];
+	STRCPYS(absFN, absFN_sizeMax, relFileName.c_str());
+	const bool located = cb-&gt;GetValue(action, absFN);
+
+	if (located) {
+		absFileName = absFN;
+	} else {
+		absFileName = &quot;&quot;;
+	}
+
+	return located;
+}
+
+void cRAI::RemoveLogFile(string relFileName) const {
+
+	string absFileName;
+	if (cRAI::LocateFile(cb, relFileName, absFileName, true)) {
+		remove(absFileName.c_str());
+	}
 }
 
 void cRAI::ClearLogFiles()
 {
-	string logDir = cLogFile::GetDir(cb);
+	string logDir = &quot;&quot;;
 
-	string logFileName;
-	for( int i=0; i&lt;16; i++ )
+	for( int i=0; i&lt;32; i++ )
 	{
 		char c[3];
 		SNPRINTF(c, 3, &quot;%i&quot;, i);
-		logFileName = logDir+&quot;RAI&quot;+string(c)+&quot;_LastGame.log&quot;;
-		remove(logFileName.c_str());
+		RemoveLogFile(logDir+&quot;RAI&quot;+string(c)+&quot;_LastGame.log&quot;);
 	}
 
-	logFileName=logDir+&quot;RAIGlobal_LastGame.log&quot;;
-	remove(logFileName.c_str());
-	logFileName=logDir+&quot;TerrainMapDebug.log&quot;;
-	remove(logFileName.c_str());
-//	logFileName=logDir+&quot;PathfinderDebug.log&quot;;
-//	remove(logFileName.c_str());
-//	logFileName=logDir+&quot;PathFinderAPNDebug.log&quot;;
-//	remove(logFileName.c_str());
-//	logFileName=logDir+&quot;PathFinderNPNDebug.log&quot;;
-//	remove(logFileName.c_str());
-//	logFileName=logDir+&quot;Prerequisite.log&quot;;
-//	remove(logFileName.c_str());
-//	logFileName=logDir+&quot;Debug.log&quot;;
-//	remove(logFileName.c_str());
+	RemoveLogFile(logDir+&quot;RAIGlobal_LastGame.log&quot;);
+	RemoveLogFile(logDir+&quot;TerrainMapDebug.log&quot;);
+//	RemoveLogFile(logDir+&quot;PathfinderDebug.log&quot;);
+//	RemoveLogFile(logDir+&quot;PathFinderAPNDebug.log&quot;);
+//	RemoveLogFile(logDir+&quot;PathFinderNPNDebug.log&quot;);
+//	RemoveLogFile(logDir+&quot;Prerequisite.log&quot;);
+//	RemoveLogFile(logDir+&quot;Debug.log&quot;);
 }</diff>
      <filename>AI/Skirmish/RAI/RAI.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -140,6 +140,8 @@ public:
 	bool ValidateUnitList(map&lt;int,UnitInfo*&gt;* UL); // returns true if at least one unit on the list is valid
 	void ValidateAllUnits();
 
+	static bool LocateFile(IAICallback* cb, const string&amp; relFileName, string&amp; absFileName, bool forWriting);
+
 	map&lt;int,UnitInfo&gt; Units;	// Complete record of all owned units, key value = unit id
 	map&lt;int,UnitInfo*&gt; UImmobile;
 	map&lt;int,UnitInfo*&gt; UMobile;
@@ -161,6 +163,7 @@ public:
 	typedef pair&lt;int,EnemyInfo*&gt; iepPair;
 
 private:
+	void RemoveLogFile(string relFileName) const;
 	void UpdateEventRemove(UpdateEvent* e);
 	void UpdateEventReorderFirst();
 	UpdateEvent* eventList[10000];</diff>
      <filename>AI/Skirmish/RAI/RAI.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>eb490b1d33f09d9b86fe8990c95726b0617e2637</id>
    </parent>
  </parents>
  <author>
    <name>hoijui</name>
    <email>hoijui.quaero@gmail.com</email>
  </author>
  <url>http://github.com/spring/spring/commit/7cd3974f8a4dec3adf8156fc104e6a2fe8c697b6</url>
  <id>7cd3974f8a4dec3adf8156fc104e6a2fe8c697b6</id>
  <committed-date>2009-11-15T04:35:52-08:00</committed-date>
  <authored-date>2009-11-15T04:33:54-08:00</authored-date>
  <message>AI: RAI: fix for file location fetching
Cache and log files will end up in the right place now.</message>
  <tree>34db520b8609e466f3f00e62ceb21ebdc3d7a330</tree>
  <committer>
    <name>hoijui</name>
    <email>hoijui.quaero@gmail.com</email>
  </committer>
</commit>
