Deploy reworking, Windows edition.
Deploy reworking, Windows edition.

file:a/EVAManager.cfg (deleted)
--- a/EVAManager.cfg
+++ /dev/null
@@ -1,74 +1,1 @@
-// EVAManager
-//
-// EVAPartModule.cfg
-//
-// Copyright © 2014, toadicus
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice,
-//    this list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation and/or other
-//    materials provided with the distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-DELETE_EVA_RESOURCE[EVA\sPropellant] {}
-
-EVA_RESOURCE
-{
-	name = EVA Propellant
-	amount = 0
-	maxAmount = 5
-}
-
-@PART[*]:HAS[#CrewCapacity[1]]
-{
-	RESOURCE
-	{
-		name = EVA Propellant
-		amount = 5
-		maxAmount = 5
-	}
-}
-
-@PART[*]:HAS[#CrewCapacity[2]]
-{
-	RESOURCE
-	{
-		name = EVA Propellant
-		amount = 10
-		maxAmount = 10
-	}
-}
-
-@PART[*]:HAS[#CrewCapacity[3]]
-{
-	RESOURCE
-	{
-		name = EVA Propellant
-		amount = 15
-		maxAmount = 15
-	}
-}
-
-@PART[*]:HAS[#CrewCapacity[4]]
-{
-	RESOURCE
-	{
-		name = EVA Propellant
-		amount = 20
-		maxAmount = 20
-	}
-}
-

--- a/EVAManager.cs
+++ b/EVAManager.cs
@@ -43,6 +43,9 @@
 
 		private const string empty = "";
 
+		private const string MODULE = "MODULE";
+		private const string RESOURCE = "RESOURCE";
+
 		private List<ConfigAction> evaConfigs;
 		private List<ConfigAction> passQueue;
 
@@ -81,7 +84,7 @@
 					{
 						if (loadedPart.name.ToLower() == "kerbaleva")
 						{
-							Tools.PostDebugMessage(this, "Found {0}", loadedPart.name);
+							this.LogDebug("Found {0}", loadedPart.name);
 
 							evaPart = loadedPart.partPrefab;
 
@@ -129,7 +132,7 @@
 
 						Match match = rgx.Match(urlConfig.type);
 
-						Tools.PostDebugMessage(this, "Found {0}match for {1}{2}",
+						this.LogDebug("Found {0}match for {1}{2}",
 							!match.Success ? "no " : "",
 							urlConfig.type,
 							!match.Success ? "" : string.Format(
@@ -156,29 +159,25 @@
 					{
 						if (action.Operator == "DELETE")
 						{
-							Tools.PostDebugMessage(this, "Trying delete action on {0}", action);
+							this.LogDebug("Trying delete action on {0}", action);
 
 							if (action.MatchName == string.Empty)
 							{
-								Debug.LogWarning(string.Format(
-									"[{0}] match name required for 'delete' action but not present; ignoring.",
-									this.GetType().Name));
+								this.LogWarning("Match name required for 'delete' action but not present; ignoring.");
 								continue;
 							}
 
 							switch (action.ClassType)
 							{
-								case "MODULE":
+								case MODULE:
 									this.delModuleByName(action.MatchName);
 									break;
-								case "RESOURCE":
+								case RESOURCE:
 									this.delResourceByName(action.MatchName);
 									break;
 								default:
-									Debug.LogWarning(string.Format(
-										"[{0}] Class type '{1}' not implemented for 'delete' action.",
-										this.GetType().Name,
-										action.ClassType));
+									this.LogWarning("Class type '{0}' not implemented for 'delete' action.",
+										action.ClassType);
 									continue;
 							}
 						}
@@ -191,29 +190,25 @@
 					{
 						if (action.Operator == "EDIT")
 						{
-							Tools.PostDebugMessage(this, "Trying edit action on {0}", action);
+							this.LogDebug("Trying edit action on {0}", action);
 
 							if (action.MatchName == string.Empty)
 							{
-								Debug.LogWarning(string.Format(
-									"[{0}] match name required for 'edit' action but not present; ignoring.",
-									this.GetType().Name));
+								this.LogWarning("Match name required for 'edit' action but not present; ignoring.");
 								continue;
 							}
 
 							switch (action.ClassType)
 							{
-								case "MODULE":
+								case MODULE:
 									this.editModuleByNameFromConfig(action.MatchName, action.Node);
 									break;
-								case "RESOURCE":
+								case RESOURCE:
 									this.editResourceByNameFromConfig(action.MatchName, action.Node);
 									break;
 								default:
-									Debug.LogWarning(string.Format(
-										"[{0}] Class type '{1}' not implemented for 'delete' action.",
-										this.GetType().Name,
-										action.ClassType));
+									this.LogWarning("Class type '{0}' not implemented for 'delete' action.",
+										action.ClassType);
 									continue;
 							}
 						}
@@ -227,25 +222,21 @@
 						{
 							if (action.MatchName != string.Empty)
 							{
-								Debug.LogWarning(string.Format(
-									"[{0}] match name ('{1}') not used for 'add' action; ignoring.",
-									this.GetType().Name,
-									action.MatchName));
+								this.LogWarning("match name ('{0}') not used for 'add' action; ignoring.",
+									action.MatchName);
 							}
 
 							switch (action.ClassType)
 							{
-								case "MODULE":
+								case MODULE:
 									this.addModuleFromConfig(action.Node);
 									break;
-								case "RESOURCE":
+								case RESOURCE:
 									this.addResourceFromConfig(action.Node);
 									break;
 								default:
-									Debug.LogWarning(string.Format(
-										"[{0}] Class type '{1}' not implemented for 'add' action.",
-										this.GetType().Name,
-										action.ClassType));
+									this.LogWarning("Class type '{0}' not implemented for 'add' action.",
+										action.ClassType);
 									continue;
 							}
 						}
@@ -280,7 +271,7 @@
 
 					GameObject.Destroy(this);
 
-					Tools.PostDebugMessage(this, "Destruction Requested.");
+					this.LogDebug("Destruction Requested.");
 					break;
 			}
 		}
@@ -293,11 +284,7 @@
 			{
 				if (evaPart.GetComponents<PartModule>().Any(m => m.GetType().Name == moduleName))
 				{
-					Debug.LogWarning(string.Format(
-						"[{0}] Skipping module {1}: already present in kerbalEVA",
-						this.GetType().Name,
-						moduleName
-					));
+					this.LogWarning("Skipping module {1}: already present in kerbalEVA", moduleName);
 					return;
 				}
 
@@ -305,11 +292,7 @@
 
 				if (moduleClass == null)
 				{
-					Debug.LogWarning(string.Format(
-						"[{0}] Skipping module {1}: class not found in loaded assemblies.",
-						this.GetType().Name,
-						moduleName
-					));
+					this.LogWarning("Skipping module {0}: class not found in loaded assemblies.", moduleName);
 					return;
 				}
 
@@ -329,10 +312,7 @@
 				}
 				catch (Exception ex)
 				{
-					Debug.Log(string.Format(
-						"TweakableEVAManager handled exception {0} while adding modules to kerbalEVA.",
-						ex.GetType().Name
-					));
+					this.LogError("Handled exception {0} while adding modules to kerbalEVA.", ex.GetType().Name);
 
 					#if DEBUG
 					Debug.LogException(ex);
@@ -341,26 +321,16 @@
 
 				if (evaPart.GetComponents<PartModule>().Any(m => m.GetType().Name == moduleName))
 				{
-					Debug.Log(string.Format("[{0}] added module {1} to kerbalEVA part.",
-						this.GetType().Name,
-						moduleName
-					));
+					this.Log("Added module {0} to kerbalEVA part.",	moduleName);
 				}
 				else
 				{
-					Debug.LogWarning(string.Format(
-						"[{0}] failed to add {1} to kerbalEVA part.",
-						this.GetType().Name,
-						moduleName
-					));
+					this.LogWarning("Failed to add {0} to kerbalEVA part.", moduleName);
 				}
 			}
 			else
 			{
-				Debug.Log(string.Format(
-					"[{0}] Skipping malformed EVA_MODULE node: missing 'name' field.",
-					this.GetType().Name
-				));
+				this.LogWarning("Skipping malformed EVA_MODULE node: missing 'name' field.");
 				return;
 			}
 		}
@@ -371,57 +341,43 @@
 
 			if (evaResourceNode.TryGetValue("name", out resourceName))
 			{
-				Tools.PostDebugMessage(this, "Adding resource '{0}'", resourceName);
+				this.LogDebug("Adding resource '{0}'", resourceName);
 
 				PartResourceDefinition resourceInfo =
 					PartResourceLibrary.Instance.GetDefinition(resourceName);
 
 				if (resourceInfo == null)
 				{
-					Debug.LogWarning(string.Format(
-						"[{0}]: Skipping resource {1}: definition not present in library.",
-						this.GetType().Name,
-						resourceName
-					));
+					this.LogWarning("Skipping resource {0}: definition not present in library.", resourceName);
 
 					return;
 				}
 
-				Tools.PostDebugMessage(this, "Resource '{0}' is in library.", resourceName);
+				this.LogDebug("Resource '{0}' is in library.", resourceName);
 
 				if (evaPart.GetComponents<PartResource>().Any(r => r.resourceName == resourceName))
 				{
-					Debug.LogWarning(string.Format(
-						"[{0}] Skipping resource {1}: already present in kerbalEVA.",
-						this.GetType().Name,
-						resourceName
-					));
+					this.LogWarning("Skipping resource {0}: already present in kerbalEVA.", resourceName);
 
 					return;
 				}
 
-				Tools.PostDebugMessage(this, "Resource '{0}' is not present.", resourceName);
+				this.LogDebug("Resource '{0}' is not present.", resourceName);
 
 				PartResource resource = evaPart.gameObject.AddComponent<EVAPartResource>();
 
-				Tools.PostDebugMessage(this, "Resource '{0}' component built.", resourceName);
+				this.LogDebug("Resource '{0}' component built.", resourceName);
 
 				resource.SetInfo(resourceInfo);
 				((EVAPartResource)resource).Load(evaResourceNode);
 
-				Debug.Log(string.Format("[{0}] Added resource {1} to kerbalEVA part.",
-					this.GetType().Name,
-					resource.resourceName
-				));
-
-				Tools.PostDebugMessage(this, "Resource '{0}' loaded.", resourceName);
+				this.Log("Added resource {0} to kerbalEVA part.", resource.resourceName);
+
+				this.LogDebug("Resource '{0}' loaded.", resourceName);
 			}
 			else
 			{
-				Debug.Log(string.Format(
-					"[{0}] Skipping malformed EVA_RESOURCE node: missing 'name' field.",
-					this.GetType().Name
-				));
+				this.Log("Skipping malformed EVA_RESOURCE node: missing 'name' field.");
 				return;
 			}
 		}
@@ -463,9 +419,9 @@
 
 					GameObject.Destroy(module);
 
-					Tools.PostDebugMessage(this, "EVA module {0} marked for destruction.", module.GetType().Name);
-
-					ConfigAction copyAction = new ConfigAction(empty, "MODULE", empty, config);
+					this.LogDebug("EVA module {0} marked for destruction.", module.GetType().Name);
+
+					ConfigAction copyAction = new ConfigAction(empty, MODULE, empty, config);
 
 					this.passQueue.Add(copyAction);
 
@@ -495,9 +451,9 @@
 
 					GameObject.Destroy(resource);
 
-					Tools.PostDebugMessage(this, "EVA resource {0} marked for destruction.", resource.resourceName);
-
-					ConfigAction copyAction = new ConfigAction(empty, "RESOURCE", empty, config);
+					this.LogDebug("EVA resource {0} marked for destruction.", resource.resourceName);
+
+					ConfigAction copyAction = new ConfigAction(empty, RESOURCE, empty, config);
 
 					this.passQueue.Add(copyAction);
 
@@ -580,28 +536,21 @@
 
 						success &= true;
 
-						Tools.PostDebugMessage(this, "Assigned field '{0}' with new value '{1}'.", namedField.Name, convertedValue);
+						this.LogDebug("Assigned field '{0}' with new value '{1}'.", namedField.Name, convertedValue);
 					}
 					else
 					{
-						Debug.LogWarning(string.Format(
-							"[{0}] Failed assigning value '{1}': field not found in class '{2}'",
-							this.GetType().Name,
+						this.LogWarning("Failed assigning value '{0}': field not found in class '{1}'",
 							cfgValue.name,
 							obj.GetType().Name
-						));
+						);
 
 						success &= false;
 					}
 				}
 				catch (Exception ex)
 				{
-					Debug.LogWarning(string.Format(
-						"[{0}] Failed assigning value '{1}': {2}",
-						this.GetType().Name,
-						cfgValue.name,
-						ex.Message
-					));
+					this.LogWarning("Failed assigning value '{0}': {1}", cfgValue.name,	ex.Message);
 
 					success &= false;
 
@@ -674,7 +623,7 @@
 		#if DEBUG
 		public void OnDestroy()
 		{
-			Tools.PostDebugMessage(this, "Destroyed.");
+			this.LogDebug("Destroyed.");
 		}
 		#endif
 

--- a/EVAManager.csproj
+++ b/EVAManager.csproj
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug_win</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>8.0.30703</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
@@ -12,7 +12,7 @@
     <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
     <UseMSBuildEngine>False</UseMSBuildEngine>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug_win|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
@@ -23,12 +23,12 @@
     <ConsolePause>false</ConsolePause>
     <CustomCommands>
       <CustomCommands>
-        <Command type="AfterBuild" command="xcopy /y ${ProjectDir}\EVAManager.cfg C:\Users\andy\Games\KSP_win\GameData\EVAManager\" />
-        <Command type="AfterBuild" command="xcopy /y ${TargetFile} C:\Users\andy\Games\KSP_win\GameData\EVAManager\" />
+        <Command type="AfterBuild" command="xcopy /y ${ProjectDir}\EVAManager.cfg ${ProjectDir}\GameData\EVAManager\" />
+        <Command type="AfterBuild" command="xcopy /y ${TargetFile} ${ProjectDir}\GameData\EVAManager\" />
       </CustomCommands>
     </CustomCommands>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_win|AnyCPU' ">
     <DebugType>full</DebugType>
     <Optimize>true</Optimize>
     <OutputPath>bin\Release</OutputPath>
@@ -37,8 +37,36 @@
     <ConsolePause>false</ConsolePause>
     <CustomCommands>
       <CustomCommands>
-        <Command type="AfterBuild" command="xcopy /y ${TargetFile} C:\Users\andy\Games\KSP_win\GameData\EVAManager\" />
-        <Command type="AfterBuild" command="xcopy /y ${ProjectDir}\EVAManager.cfg C:\Users\andy\Games\KSP_win\GameData\EVAManager\" />
+        <Command type="AfterBuild" command="xcopy /y ${TargetFile} ${ProjectDir}\GameData\EVAManager\" />
+        <Command type="AfterBuild" command="xcopy /y ${ProjectDir}\EVAManager.cfg ${ProjectDir}\GameData\EVAManager\" />
+      </CustomCommands>
+    </CustomCommands>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_linux|AnyCPU' ">
+    <DebugType>full</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+    <CustomCommands>
+      <CustomCommands>
+        <Command type="AfterBuild" command="cp -vfa ${ProjectDir}/EVAManager.cfg ${TargetFile} ${ProjectDir}/GameData/EVAManager/" />
+      </CustomCommands>
+    </CustomCommands>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug_linux|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+    <CustomCommands>
+      <CustomCommands>
+        <Command type="AfterBuild" command="cp -vfa ${ProjectDir}/EVAManager.cfg ${TargetFile} ${ProjectDir}/GameData/EVAManager/" />
       </CustomCommands>
     </CustomCommands>
   </PropertyGroup>
@@ -64,9 +92,6 @@
       <Link>ConfigNodeExtensions.cs</Link>
     </Compile>
   </ItemGroup>
-  <ItemGroup>
-    <None Include="EVAManager.cfg" />
-  </ItemGroup>
   <ProjectExtensions>
     <MonoDevelop>
       <Properties>
@@ -76,4 +101,7 @@
       </Properties>
     </MonoDevelop>
   </ProjectExtensions>
+  <ItemGroup>
+    <None Include="GameData\EVAManager\EVAManager.cfg" />
+  </ItemGroup>
 </Project>

--- /dev/null
+++ b/GameData/EVAManager/EVAManager.cfg
@@ -1,1 +1,74 @@
+// EVAManager
+//
+// EVAPartModule.cfg
+//
+// Copyright © 2014, toadicus
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+DELETE_EVA_RESOURCE[EVA\sPropellant] {}
+
+EVA_RESOURCE
+{
+	name = EVA Propellant
+	amount = 0
+	maxAmount = 5
+}
+
+@PART[*]:HAS[#CrewCapacity[1]]
+{
+	RESOURCE
+	{
+		name = EVA Propellant
+		amount = 5
+		maxAmount = 5
+	}
+}
+
+@PART[*]:HAS[#CrewCapacity[2]]
+{
+	RESOURCE
+	{
+		name = EVA Propellant
+		amount = 10
+		maxAmount = 10
+	}
+}
+
+@PART[*]:HAS[#CrewCapacity[3]]
+{
+	RESOURCE
+	{
+		name = EVA Propellant
+		amount = 15
+		maxAmount = 15
+	}
+}
+
+@PART[*]:HAS[#CrewCapacity[4]]
+{
+	RESOURCE
+	{
+		name = EVA Propellant
+		amount = 20
+		maxAmount = 20
+	}
+}
+

 Binary files /dev/null and b/GameData/EVAManager/EVAManager.dll differ