Commits

Joe Hultgren committed 4146ef3 Draft Merge

merge after version control error losing 5-10 commits hopefully haven't lost code

  • Participants
  • Parent commits dc725dd, 770ee62

Comments (0)

Files changed (19)

+syntax: glob
+.DS_Store
+AssemblyInfo\.cs
+bin
+Engineer\.csproj
+Engineer\.pidb
+Engineer\.zip
+Engineer 2
+
+testandpackage\.sh
+b9ffb6c682104f439210286014037b60b5f3dffb 0.2.1
+b98ddf480be7b8340d78c03b249ee91e2432a85d v0.3
+1d02688a6b9d5942c77b69a471eea3b39f68144c v0.5

File AdvancedBrakes.cs

+using System;
+using UnityEngine;
+
+public class AdvancedBrakes : PartModule {
+	LandingGear g;
+	[KSPField]
+	public bool
+		parking = true;
+	float brakeTorque;
+	[KSPField]
+	public float
+		highTolerance = 4f;
+	[KSPField]
+	public float
+		lowTolerance = 1.25f;
+	[KSPField]
+	public bool
+		disable = false;
+	[KSPField]
+	public bool
+		taxiAssist = true;
+	[KSPField]
+	public double taxiAssistSpeed = 25;
+
+	[KSPEvent(guiActive=true,guiName="Enable ABS")]
+	public void absEnable () {
+		disable = false;
+		setGuiEvents();
+		Debug.Log ("abs is enabled");
+		
+	}
+
+	[KSPEvent(guiActive=true,guiName="Disable ABS")]
+	public void absDisable () {
+		disable = true;
+		setGuiEvents();
+		Debug.Log ("abs is disabled");
+	}
+
+	[KSPEvent(guiActive=true,guiName="Enable P-Brake")]
+	public void parkOn () {
+		parking = true;
+		setGuiEvents();
+		Debug.Log ("parking on");
+	}
+
+	[KSPEvent(guiActive=true,guiName="Disable P-Brake")]
+	public void parkOff () {
+		parking = false;
+		setGuiEvents();
+		Debug.Log ("parking off");
+	}
+
+	[KSPEvent(guiActive = true,guiName = "Enable Taxi Assist")]
+	public void taxiOn () {
+		taxiAssist = true;
+		setGuiEvents();
+	}
+	[KSPEvent(guiActive = true,guiName = "Disable Taxi Assist")]
+	public void taxiOff() {
+		taxiAssist = false;
+		setGuiEvents();
+	}
+	private void setGuiEvents() {
+		if (disable) {
+			Events ["absDisable"].active = false;
+			Events ["absEnable"].active = true;
+			Debug.Log ("abs is disabled");
+			Events["taxiOn"].active = false;
+			Events["taxiOff"].active = false;
+		} else {
+			Events ["absDisable"].active = true;
+			Events ["absEnable"].active = false;
+			Debug.Log ("abs is enabled");
+			if (taxiAssist) {
+				Events["taxiOn"].active = false;
+				Events["taxiOff"].active = true;
+			} else {
+				Events["taxiOn"].active = true;
+				Events["taxiOff"].active = false;
+			}
+		}
+		if (parking) {
+			Events ["parkOn"].active = false;
+			Events ["parkOff"].active = true;
+			Debug.Log ("parking on");
+		} else {
+			Events ["parkOn"].active = true;
+			Events ["parkOff"].active = false;
+			Debug.Log ("parking off");
+		}
+	}
+
+	public override void OnFixedUpdate () {
+		base.OnFixedUpdate ();
+		Debug.Log ("fixedUpdate");
+		if (!g && this.part is LandingGear) {
+			g = this.part as LandingGear;
+		}
+		if (parking) {
+			Debug.Log ("parking");
+			if (FlightInputHandler.state.mainThrottle > 0.1) {
+				parking = false;
+				Events ["parkOn"].active = true;
+				Events ["parkOff"].active = false;
+				Debug.Log ("parking off");
+			} else {
+				Debug.Log ("setwheelcolliderbrake");
+				Debug.Log ("g is" + g);
+				Debug.Log ("wheel collider is " + g.wheelCollider);
+				Debug.Log ("wheel brake is " + g.wheelCollider.brakeTorque);
+				g.wheelCollider.brakeTorque = brakeTorque;
+			}
+		} 
+		//Debug.Log("check vessel");
+		if (vessel.isActiveVessel && g && vessel.checkGroundContact ()) {
+			Debug.Log ("groundContact");
+			float pitchmomentum = vessel.angularMomentum.x;
+			if (!disable && (pitchmomentum > lowTolerance)) {
+				Debug.Log ("x angular momentum is " + pitchmomentum);
+				Debug.Log ("Break force " + g.BrakeTorque + " setting lower");
+			
+				if (pitchmomentum > highTolerance) {
+					g.BrakeTorque = 0;
+					Debug.Log ("Brakes off");
+				} else {
+					g.BrakeTorque = Mathf.Lerp (
+						brakeTorque,
+						0,
+						(pitchmomentum - lowTolerance) / (highTolerance - lowTolerance)
+					);
+					Debug.Log ("set to " + g.BrakeTorque);
+				}
+			
+			} else {
+				g.BrakeTorque = brakeTorque;
+			}
+			//Debug.Log ("taxiAssist");
+			Debug.Log("magnitude "+vessel.srf_velocity.magnitude);
+			
+			if (taxiAssist && !disable && vessel.srf_velocity.magnitude < taxiAssistSpeed) {//expose
+				if (g.orgPos.x > 0.1 && FlightInputHandler.state.yaw > 0.25) {//expose?
+					Debug.Log ("taxi assist right");
+					g.wheelCollider.brakeTorque = g.BrakeTorque;
+				} else if (g.orgPos.x < -0.1 && FlightInputHandler.state.yaw < -0.25) {
+					g.wheelCollider.brakeTorque = g.BrakeTorque;
+					Debug.Log ("taxi assist left");
+				}
+			}
+		}
+	}
+
+	public override void OnStart (StartState state) {
+		base.OnStart (state);
+		if (this.part is LandingGear)
+			g = this.part as LandingGear;
+		else {
+			Events ["absDisable"].active = false;
+			Events ["absEnable"].active = false;
+			Events ["parkOn"].active = false;
+			Events ["parkOff"].active = false;
+			Debug.Log ("not on landing gear");
+			return;
+		}
+		brakeTorque = g.BrakeTorque;
+		Debug.Log ("abs breaks start");
+		this.part.activate(this.part.inStageIndex);
+		setGuiEvents();
+			
+		//check tolerance values
+		if ((lowTolerance > highTolerance) || lowTolerance == highTolerance) {
+			highTolerance = 4f;
+			lowTolerance = 1.25f;
+		}
+	}
+}

File ConsultantManager.cs

+using System;
+using System.Collections.Generic;
+ 
+public class ConsultantManager {
+	private Dictionary<string,KICOITConsultant> registeredConsultants;
+
+	public ConsultantManager () {
+		registeredConsultants = new Dictionary<string, KICOITConsultant> ();
+	}
+
+	public void ClearConsultants () {
+		registeredConsultants.Clear ();
+	}
+
+	public bool Register (KICOITConsultant c) {
+		if (!registeredConsultants.ContainsKey (c.DisplayName)) {
+			registeredConsultants.Add (c.DisplayName, c);
+			return true;
+		} 
+		return false;
+	}
+
+	public List<string> GetConsultantList () {
+		return new List<string> (registeredConsultants.Keys);
+	}
+
+	public KICOITConsultant GetConsultant (string key) {
+		return registeredConsultants[key];	
+	}
+
+	public void AnalizePart (Part p) {
+		foreach (KICOITConsultant c in registeredConsultants.Values) {
+			c.AnalizePart (p);
+		}
+	}
+
+	public void AnalizeShip (ShipData s) {
+		foreach (KICOITConsultant c in registeredConsultants.Values) {
+			c.AnalizeShip (s);
+		}
+	}
+
+}
+

File DebugModule.cs

+using System;
+using UnityEngine;
+
+public class DebugModule : PartModule {
+	
+	public override void OnActive () {
+		print (this.part.name + ":OnActive");
+		base.OnActive ();
+		
+	}
+
+	public override void OnFixedUpdate () {
+		print (this.part.name + ":OnFixedUpdate");
+		base.OnFixedUpdate ();
+	}
+
+	public override void OnInactive () {
+		print (this.part.name + ":OnInactive");
+		base.OnInactive ();
+	}
+
+	public override void OnAwake () {
+		print (this.part.name + ":OnAwake");
+		base.OnAwake ();
+	}
+
+	public override void OnLoad (ConfigNode node) {
+		print (this.part.name + ":OnLoad");
+		base.OnLoad (node);
+	}
+
+	public override void OnSave (ConfigNode node) {
+		print (this.part.name + ":OnSave");
+		base.OnSave (node);
+	}
+
+	public override void OnStart (StartState state) {
+		print (this.part.name + ":OnStart");
+		base.OnStart (state);
+	}
+
+	public override void OnUpdate () {
+		print (this.part.name + ":OnUpdate");
+		base.OnUpdate ();
+	}
+	public void SendDebugMessage() {
+		part.SendEvent("DebugEvent");
+		//BaseEventData
+	}
+	[KSPEvent(guiActive = false,guiName = "DebugMessage")]
+	public void DebugEvent() {
+		print (part.name +": debugEvent");
+	}
+	
+}
+
 			}
 		}
 		if(!controller) Debug.LogError("KICOITController module missing on "+ this.name);
-		else controller.OnBackup ();	 	
+		else controller.OnBackup ();		
 	}
 }

File KICOITAdvancedLogic.cs

+using System;
+using UnityEngine;
+
+public class KICOITAdvancedLogic : KICOITConsultant {
+	public override void AnalizePart (Part p) {
+		base.AnalizePart (p);
+	}
+		
+//		private void calculateEngines (int stage) {
+//			float lthrust = 0;
+//			float lconsumption = 0;
+//			foreach (LiquidEngine e in shipInfo[stage].engines) {
+//				lthrust += e.maxThrust;
+//				lconsumption += e.fuelConsumption;
+//			}
+//			int i = stage;
+//			float fuelmass = 0;
+//			float fuelunits = 0;
+//			//float lostweight = 0;
+//			do {
+//				//get fuel mass
+//				fuelmass += shipInfo [i].fuelMass;
+//				//get fuel units
+//				fuelunits += shipInfo [i].fuel;
+//				i--;
+//			} while(i >=0 && shipInfo[i].engines.Count <= 0);
+//		}
+		
+
+}
+

File KICOITBasicLogic.cs

+using System;
+using UnityEngine;
+
+public class KICOITBasicLogic : KICOITConsultant {
+
+	public override void OnAwake () {
+		base.OnAwake ();
+		displayName = "KICOIT Basic Stats";
+	}
+
+	public override void AnalizePart (Part p) {
+		base.AnalizePart (p);
+	}
+
+	public override void DisplayUI (ShipData s) {
+		base.DisplayUI (s);
+		
+		GUIStyle txtR = new GUIStyle (GUI.skin.label);
+		txtR.alignment = TextAnchor.UpperRight;
+			
+			
+		GUILayout.BeginHorizontal (
+				GUILayout.ExpandHeight (true),
+				GUILayout.ExpandWidth (true)
+		);
+			
+		GUILayout.BeginVertical (GUILayout.ExpandHeight (true));
+		GUILayout.Label ("Stage");
+		for (int i = 0; i <s.Count(); i++) {
+			GUILayout.Label ("S " + i);
+		}
+		GUILayout.EndVertical ();
+				
+		GUILayout.BeginVertical (GUILayout.ExpandHeight (true));
+		GUILayout.Label ("Cost");
+		for (int i = 0; i <s.Count(); i++) {
+			GUILayout.Label (
+							s.getStage (i).cost.ToString () + "/" + s.getStage (i).totalCost.ToString (),
+							txtR
+			);
+		}
+		GUILayout.EndVertical ();
+				
+		GUILayout.BeginVertical (GUILayout.ExpandHeight (true));
+		GUILayout.Label ("Weight");
+		
+		for (int i = 0; i < s.Count(); i++) {
+			GUILayout.Label (
+							s.getStage (i).mass.ToString ("0.###") + " / " + s.getStage (i).totalWeight.ToString ("0.###"),
+							txtR
+			);
+		}
+		GUILayout.EndVertical ();
+				
+		GUILayout.BeginVertical (GUILayout.ExpandHeight (true));
+		GUILayout.Label ("RCS");
+		for (int i = 0; i <s.Count(); i++) {
+			GUILayout.Label (s.getStage (i).rcs.ToString ("0.###"), txtR);
+		}
+		GUILayout.EndVertical ();
+				
+		GUILayout.BeginVertical (GUILayout.ExpandHeight (true));
+		GUILayout.Label ("Fuel");
+		for (int i = 0; i <s.Count(); i++) {
+			GUILayout.Label (s.getStage (i).fuel.ToString ("0.###"), txtR);
+		}
+		GUILayout.EndVertical ();
+				
+		GUILayout.BeginVertical (GUILayout.ExpandHeight (true));
+		GUILayout.Label ("Thrust");
+		for (int i = 0; i <s.Count(); i++) {
+			if (s.getStage (i).thrust != 0 && s.getStage (i).airthrust != 0) {
+				txtR.normal.textColor = Color.yellow;//mixed
+			} else if (s.getStage (i).airthrust != 0) {
+				txtR.normal.textColor = Color.green;//air
+			} else {
+				txtR.normal.textColor = Color.white;//rockets
+			}
+						
+			GUILayout.Label (
+							(s.getStage (i).thrust + s.getStage (i).airthrust).ToString ("0.###"),
+							txtR
+			);
+						
+		}
+		GUILayout.EndVertical ();
+		txtR.normal.textColor = Color.white;
+				
+		//start advanced stats
+		GUILayout.BeginVertical (GUILayout.ExpandHeight (true));
+		GUILayout.Label ("Kerbin/Mun TWR");
+		for (int i = 0; i <s.Count(); i++) {
+			if (s.getStage (i).thrust != 0 && s.getStage (i).airthrust != 0) {
+				txtR.normal.textColor = Color.yellow;//mixed
+			} else if (s.getStage (i).airthrust != 0) {
+				txtR.normal.textColor = Color.green;//air
+			} else {
+				txtR.normal.textColor = Color.white;//rockets
+			}
+			if (s.getStage (i).thrust == 0 && s.getStage (i).airthrust == 0) {
+				GUILayout.Label ("-/-", txtR);
+			} else {
+				float tw = s.getStage (i).thrust / s.getStage (i).totalWeight;
+				float ktw = (s.getStage (i).thrust + s.getStage (i).airthrust) / s.getStage (i).totalWeight;
+								
+				GUILayout.Label (
+							(ktw / 9.8068).ToString ("0.###") + " / " + (tw / 1.628).ToString ("0.###"),
+							txtR
+				);
+			}
+		}
+		GUILayout.EndVertical ();
+		GUILayout.EndHorizontal ();
+	}
+}
+
+

File KICOITConsultant.cs

+using System;
+using UnityEngine;
+
+public class KICOITConsultant :PartModule {
+	protected string displayName = "";
+
+	public string DisplayName {
+		get {
+			return displayName;
+		}
+	}
+
+	[KSPEvent]
+	public virtual void RegisterConsultant (BaseEventData d) {
+		if (d.Get<ConsultantManager> ("Manager").Register (this))
+			Debug.Log (this.ClassName + " registered with Engineer Controller");
+		else
+			Debug.Log (this.ClassName + " already registered");
+	}
+		
+	public virtual void DisplayUI (ShipData s) {
+		//Debug.Log (this.ClassName + " display UI");
+	}
+		
+	public virtual void AnalizePart (Part p) {
+		Debug.Log (this.ClassName + " analize Part");
+	}
+
+	public virtual void AnalizeShip (ShipData s) {
+		Debug.Log (this.ClassName + " analize ship");
+	}
+
+}
+

File KICOITController.cs

+using System;
+using UnityEngine;
+
+public class KICOITController : PartModule {
+	protected Rect windowPos;
+	public ShipData ship = new ShipData ();
+	private PartModule.StartState state;
+	private ConsultantManager manager = new ConsultantManager ();
+	public static Engineer activeEngineer;
+	//private bool debug = false;
+		
+	private void computeShip () {
+		Debug.Log("clear consultants");
+		manager.ClearConsultants ();
+		Debug.Log("get consultants");
+		getConsultants ();
+		Debug.Log("calculate ship");
+		calculateShipInfo ();
+		Debug.Log("analize ship");
+		manager.AnalizeShip (ship);
+	}
+
+	private void calculateShipInfo () {
+		Debug.Log("clear ship data");
+		ship.ClearData ();
+		Debug.Log("walkparts");
+		Part p = this.part;
+		while (p.parent)
+			p = p.parent;
+		walkParts (p);
+		Debug.Log("calculate totals by stage");
+		ship.calculateTotals ();
+			
+	}
+
+	private void getConsultants () {
+		BaseEventData d = new BaseEventData (BaseEventData.Sender.AUTO);
+		d.Set<ConsultantManager> ("Manager", manager);
+		part.SendEvent ("RegisterConsultant", d);
+	}
+		
+	public override void OnStart (StartState state) {
+		Debug.Log("controller onstart state is: " + state);
+		this.state = state;
+		base.OnStart (state);
+		if (windowPos.x == 0 && windowPos.y == 0) {
+			windowPos = new Rect (Screen.width / 4, Screen.height / 8, 600, 100);
+		}
+		if (this.part.parent) {
+			//probably loaded instead of being a new part
+			this.OnBackup();
+		}
+	}
+
+	private void walkParts (Part p) {
+		StageData stage = ship.getStage (p.inverseStage);
+			
+		if (!(p is Engineer)) {
+			stage.parts += 1;
+			stage.mass += p.mass;
+			stage.cost += p.partInfo.cost;
+		}
+		if (p is FuelTank) {
+			stage.parts += 1;
+			stage.fuel += (p as FuelTank).fuel;
+			stage.tankweight += p.mass;
+			stage.fuelMass += p.mass - (p as FuelTank).dryMass;
+			//TODO find lost weight
+			//calculate fuel mass (m_tf - m_te) /fuel
+			stage.sumFuelMass += (p.mass - (p as FuelTank).dryMass) / (p as FuelTank).fuel;
+		} else if (p is LiquidEngine) {
+			stage.thrust += (p as LiquidEngine).maxThrust;
+			stage.engines.Add (p as LiquidEngine);	
+		} else if (p is SolidRocket) {
+			stage.thrust += (p as SolidRocket).thrust;
+			stage.solids.Add (p as SolidRocket);
+		} else if (p is RCSFuelTank) {
+			stage.rcs += (p as RCSFuelTank).fuel;
+		} else if (p is AtmosphericEngine) {
+			stage.airthrust += (p as AtmosphericEngine).maximumEnginePower;
+			stage.intake += (p as AtmosphericEngine).maxIntakePower;
+		}
+			
+		manager.AnalizePart (p);
+			
+//		if (debug) {
+//			debugPartOutput (p);
+//		}
+		foreach (Part c in p.children) {
+			walkParts (c);
+		}
+			
+	}
+
+	private void debugPartOutput (Part p) {// TODO need to recheck
+		print ("");
+		print (p.name);
+		print ("original stage: " + p.originalStage);
+		print ("default inverseStage: " + p.defaultInverseStage);
+		print ("inverse stage: " + p.inverseStage);//this guy is our guy
+		print ("in stage index: " + p.inStageIndex);
+		print ("child stage offset: " + p.childStageOffset);
+		print ("manual stage offset: " + p.manualStageOffset);
+		print ("stage offset: " + p.stageOffset);
+		print ("stage after: " + p.stageAfter);
+		print ("stage before: " + p.stageBefore);
+	}
+		
+	private void drawGUI () {
+		GUI.skin = HighLogic.Skin;
+		windowPos = GUILayout.Window (
+				4,
+				windowPos,
+				WindowGUI,
+				"Engineer",
+				GUILayout.MinWidth (600)
+		);
+	}
+
+	public void OnBackup () {
+		Debug.Log("controller on backup");
+		if (this.part == activeEngineer && this.state == PartModule.StartState.Editor) {
+			Debug.Log("just compute");
+			computeShip ();
+		} else if (!isRendering() && !this.part.isClone && this.state == PartModule.StartState.Editor) {
+			Debug.Log("set self as active and compute");
+			activeEngineer = this.part as Engineer;
+			computeShip ();
+			RenderingManager.AddToPostDrawQueue (4, new Callback (drawGUI));
+			
+		} else {
+			Debug.Log("not active engineer");
+			//Debug.Log("active engineer is: " + activeEngineer.name);
+		}
+	}
+
+	private void WindowGUI (int windowID) {
+		//Debug.Log("controller windowGUI");
+		if (isRendering () && this.state == PartModule.StartState.Editor) {
+			//get KICOIT basic for now
+			//TODO create switchable ui
+			manager.GetConsultant ("KICOIT Basic Stats").DisplayUI (ship);
+				
+			GUI.DragWindow ();
+		} else {
+			Debug.Log("controller remove window");
+			RenderingManager.RemoveFromPostDrawQueue (4, new Callback (drawGUI));
+			activeEngineer = null;
+		}
+	}
+
+	private bool isRendering () {
+		if (!activeEngineer || activeEngineer == null) {
+			return false;
+		} else if (!activeEngineer.parent) {
+			return false;
+		} else if (activeEngineer == this.part) {
+			return true;
+		}
+		return false;
+		
+	}
+}
+
+
+using System;
+using System.Collections.Generic;
+
+using UnityEngine;
+
+public class ShipData {
+	private float totalWeight;
+	private float totalCost;
+	private int totalParts;
+	private int maxStage;
+	//private bool debug;
+	List<StageData> shipInfo;
+
+	public float TotalWeight {
+		get {
+			calculateTotals ();
+			return totalWeight;
+		}
+	}
+
+	public float TotalCost {
+		get {
+			calculateTotals ();
+			return totalCost;
+		}
+	}
+
+	public int TotalParts {
+		get {
+			calculateTotals ();
+			return totalParts;
+		}
+	}
+
+	public ShipData () {
+		totalParts = 0;
+		totalWeight = 0;
+		totalCost = 0;
+		maxStage = -1;
+		shipInfo = new List<StageData> ();
+	}
+		
+	public void ClearData () {
+		totalParts = 0;
+		totalWeight = 0;
+		totalCost = 0;
+		maxStage = -1;
+		foreach (StageData s in shipInfo) {
+			s.zero ();
+		}
+	}
+
+	public int Count () {
+		return maxStage + 1;
+	}
+
+	public void calculateTotals () {
+		//Debug.Log("Shipdata calculateTotals");
+		totalWeight = 0;
+		totalCost = 0;
+		totalParts = 0;
+		
+		for (int i = 0; i < Count(); i++) {
+			StageData stage = this.getStage (i);
+			totalWeight += stage.mass;
+			totalCost += stage.cost;
+			stage.totalWeight = totalWeight;
+			stage.totalCost = totalCost;
+			totalParts += stage.parts;
+		}			
+	}
+
+	public StageData getStage (int stage) {
+		//Debug.Log("Shipdata getstage: "+ stage);
+		//store highest stage
+		if (maxStage < stage)
+			maxStage = stage;
+		//make sure list contains this stage
+		while (shipInfo.Count <= stage) {
+			shipInfo.Add (new StageData ());
+		}
+			
+		return shipInfo [stage];
+	}
+
+}
+

File StageData.cs

+using UnityEngine;
+using System.Collections.Generic;
+
+public class StageData {
+	public int parts = 0;
+	public float cost = 0;
+	public float mass = 0;
+	public float fuel = 0;
+	public float thrust = 0;
+	public float airthrust = 0;
+	public float intake = 0;
+	public float rcs = 0;
+	public float totalWeight = 0;
+	public float totalCost = 0;
+	public float fuelMass = 0;
+	public float tankweight = 0;
+	public float sumFuelMass = 0;
+	public List<LiquidEngine> engines = new List<LiquidEngine> ();
+	public List<SolidRocket> solids = new List<SolidRocket> ();
+	public Dictionary<string,List<Part>> partlist = new Dictionary<string, List<Part>>();
+	
+	public void zero () {
+		sumFuelMass = tankweight = fuelMass = totalCost = totalWeight = rcs = intake = airthrust = thrust = fuel = mass = cost = parts = 0;
+		engines.Clear ();
+		solids.Clear ();
+		partlist.Clear();
+	}
+}
+#!/bin/sh
+
+cp -p part.cfg /Users/joehultgren/KSP_osx/Parts/Engineer
+cp -p bin/Engineer/Plugins/Engineer.dll /Users/joehultgren/KSP_osx/Plugins
+#!/bin/sh
+
+VERSION=0.5
+
+echo Engineer$VERSION
+
+cp -p part.cfg bin/Engineer/Parts/Engineer
+
+#make zip
+cd bin
+zip -FSr ../zipfiles/Engineer$VERSION.zip Engineer -x "*.DS_Store"
+cd ..
+
+// --- general parameters ---
+name = Engineer
+module = Engineer
+author = jhultgre | Evolution(model)
+
+// --- asset parameters ---
+mesh = kengineer.DAE
+scale = 0.1
+texture = kengineer.png
+specPower = 0.1
+rimFalloff = 3
+alphaCutoff = 0.5
+
+// --- node definitions ---
+// definition format is Position X, Position Y, Position Z, Up X, Up Y, Up Z
+node_attach = 0.25212, -0.0105571, -0.0059382, 1.0, 0.0, 0.0
+
+// --- FX definitions ---
+
+// --- Sound FX definition ---
+
+// --- editor parameters ---
+cost = 450
+category = 3
+subcategory = 0
+title = Kerbal Engineer
+manufacturer = Kerbal Institute of Counting and Other Important Things
+description = Recent advances in Number Theory have lead to kerbals that can count higher than their fingers have previously allowed.
+
+// attachment rules: stack, srfAttach, allowStack, allowSrfAttach, allowCollision
+attachRules = 0,1,0,0,0
+
+// --- standard part parameters ---
+mass = 0.001
+dragModelType = default
+maximum_drag = 0.001
+minimum_drag = 0.00
+angularDrag = 0
+crashTolerance = 15
+maxTemp = 3600
+
+MODULE
+{
+	name = KICOITController
+}
+MODULE
+{
+	name = KICOITBasicLogic
+}

File zipfiles/Engineer0.3.zip

Binary file added.

File zipfiles/Engineer0.5.zip

Binary file added.

File zipfiles/Engineer_02.zip

Binary file added.

File zipfiles/Engineer_02_1.zip

Binary file added.