From ed1ed5785ad0acbd858d7493de6ab0f8a5a37c1f Mon Sep 17 00:00:00 2001 From: Bob Palmer Date: Sat, 10 Mar 2018 12:04:55 -0500 Subject: [PATCH] Branch Cleanup --- .../WarpDrive/CHANGELOG.txt | 36 +- .../WarpDrive/USI_ModuleWarpEngine.cs | 639 ------------------ .../WarpDrive/WarpDrive.version | 2 +- .../WarpDrive/WarpEngine.dll | Bin 0 -> 18432 bytes .../WarpEngine.sln.DotSettings.user | 4 + .../WarpEngine/WarpEngine/WarpEngine.csproj | 3 + .../WarpEngine/obj/Debug/WarpEngine.pdb | Bin 0 -> 32256 bytes 7 files changed, 28 insertions(+), 656 deletions(-) delete mode 100644 FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/USI_ModuleWarpEngine.cs create mode 100644 FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/WarpEngine.dll create mode 100644 Source/WarpEngine/WarpEngine.sln.DotSettings.user create mode 100644 Source/WarpEngine/WarpEngine/obj/Debug/WarpEngine.pdb diff --git a/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/CHANGELOG.txt b/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/CHANGELOG.txt index 87c181c..ddc1157 100644 --- a/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/CHANGELOG.txt +++ b/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/CHANGELOG.txt @@ -1,22 +1,26 @@ -0.8.1 - 2018.01.06 +0.9.1 - 2018.03.07 ------------------ -Implemented MinMax speed. Default is 0.001c (300km/s) +Recompile after branch cleanup -0.8.0 - 2017.11.10 +0.9.0 - 2018.03.07 ------------------ -Major Changes! -ZZZ's Warp Drive Models now included standard -"Gravity Brake" slows warping craft in a gravity well. -Turbo Mode vastly increases ship velocity when reaching user set warp speed -Angular Momentum mode fixed -Distance travelled per frame is now tied to the physics tick in settings -Multiple warp drives active on a single ship, now destroy said ship -Failsafe distance now 1/2 planetary radius -Xenon thrusters thrust drastically reduced -Electrical use massively increased - including patch for NFE, USI, FFT, & DSEV -Re-balanced fuel use & exotic matter recovery. -Default maximum warp dropped to 6c. True maximum warp in stock is about 25c (Turbo). -Included patch for scaled systems +KSP 1.4.0 Compatibility + +0.8.0 - 2017.03.06 +------------------ +Major Changes thanks to Helaeon (Thanks! You rock!) +- ZZZ's Warp Drive Models now included standard +- "Gravity Brake" slows warping craft in a gravity well. +- Turbo Mode vastly increases ship velocity when reaching user set warp speed +- Angular Momentum mode fixed +- Distance travelled per frame is now tied to the physics tick in settings +- Multiple warp drives active on a single ship, now destroy said ship +- Failsafe distance now 1/2 planetary radius +- Xenon thrusters thrust drastically reduced +- Electrical use massively increased - including patch for NFE, USI, FFT, & DSEV +- Re-balanced fuel use & exotic matter recovery. +- Default maximum warp dropped to 6c. True maximum warp in stock is about 25c (Turbo). +- Included patch for scaled systems 0.7.0 - 2017.10.09 ------------------ diff --git a/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/USI_ModuleWarpEngine.cs b/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/USI_ModuleWarpEngine.cs deleted file mode 100644 index 21653f4..0000000 --- a/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/USI_ModuleWarpEngine.cs +++ /dev/null @@ -1,639 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using UnityEngine; - -namespace WarpEngine -{ - public class USI_ModuleWarpEngine : PartModule - { - [KSPField(guiActive = true, guiName = "Warp Drive", guiActiveEditor = false)] - public string status = "inactive"; - - [KSPField] - public string deployAnimationName = "Engage"; - - [KSPField] - public string unfoldAnimationName = "Deploy"; - - [KSPField] - public string warpAnimationName = "WarpField"; - - [KSPField] - public float WarpFactor = 6f; - - [KSPField] - public float Demasting = 10f; - - [KSPField] - public int MaxAccelleration = 4; - - [KSPField] - public float MinThrottle = 0.05f; - - [KSPField(isPersistant = true)] - public bool IsDeployed = false; - - [KSPField] - public int DisruptRange = 2000; - - [KSPField] - public int BubbleSize = 20; - - [KSPField] - public double MinAltitude = 1d; - - [KSPField] - public double GravFactor = 0.95d; - - [KSPField] - public double BrakeFalloff = 0.9d; - - [KSPField(isPersistant = true, guiActive = true, guiActiveEditor = true, guiName = "T-Start", advancedTweakable = true), UI_FloatRange(minValue = 85f, maxValue = 100f, stepIncrement = 1f)] - public float TurboPoint = 92f; - - [KSPField(isPersistant = true, guiActive = true, guiActiveEditor = true, guiName = "Turbo Factor", advancedTweakable = true), UI_FloatRange(minValue = 1, maxValue = 8, stepIncrement =1f)] - public float TurboFactor = 4f; - [KSPField] - public float TurboMult = 1f; - - [KSPField(guiName = "Conservation", isPersistant = true, guiActiveEditor = true, guiActive = false), UI_Toggle(disabledText = "Velocity", enabledText = "Angular Momentum")] - protected bool AMConservationMode = false; - [KSPField(guiName = "Conservation", guiActiveEditor = false, guiActive = true)] public string ConservationMode; - - [KSPEvent(guiActive = false, active = true, guiActiveEditor = true, guiName = "Toggle Bubble Guide", guiActiveUnfocused = false)] - public void ToggleBubbleGuide() - { - var gobj = FindEditorWarpBubble(); - if (gobj != null) - gobj.GetComponent().enabled = !gobj.GetComponent().enabled; - } - - private GameObject editorBubble; - - public Animation DeployAnimation - { - get - { - try - { - return part.FindModelAnimators(deployAnimationName)[0]; - } - catch (Exception) - { - print("[WARP] ERROR IN GetDeployAnimation"); - return null; - } - } - } - - public Animation UnfoldAnimation - { - get - { - try - { - return part.FindModelAnimators(unfoldAnimationName)[0]; - } - catch (Exception) - { - print("[WARP] ERROR IN GetUnfoldAnimation"); - return null; - } - } - } - - - public Animation WarpAnimation - { - get - { - try - { - return part.FindModelAnimators(warpAnimationName)[0]; - } - catch (Exception) - { - print("[WARP] ERROR IN GetWarpAnimation"); - return null; - } - } - } - - - private const int LIGHTSPEED = 299792458; - private const int SUBLIGHT_MULT = 40; - private const int SUBLIGHT_POWER = 5; - private const double SUBLIGHT_THROTTLE = .3d; - //private double CurrentSpeed; - private List _shipParts; - private double GravityBrakes; - // Angular Momentum Calculation Variables - private Vector3d TravelDirection; - private double Speed; - private CelestialBody PreviousBodyName; - private double OriginalFrameTrueRadius; - private double OriginalSpeed; - private double OriginalMomentumSqr; - private double SemiLatusOriginal; - private int ElipMode; - - - public override void OnStart(StartState state) - { - try - { - DeployAnimation[deployAnimationName].layer = 3; - if(unfoldAnimationName != "") - UnfoldAnimation[unfoldAnimationName].layer = 5; - WarpAnimation[warpAnimationName].layer = 4; - CheckBubbleDeployment(1000); - base.OnStart(state); - } - catch (Exception ex) - { - print(String.Format("[WARP] Error in OnStart - {0}", ex.Message)); - } - } - - private ModuleEngines eModule; - private GameObject warpBubble; - public override void OnAwake() - { - SetupDrive(); - } - - private void SetupDrive() - { - eModule = part.FindModuleImplementing(); - editorBubble = FindEditorWarpBubble(); - foreach (var gobj in GameObject.FindGameObjectsWithTag("Icon_Hidden")) - { - if (gobj.name == "Torus_001") - { - warpBubble = gobj; - } - } - } - - public override void OnLoad(ConfigNode node) - { - try - { - if (!HighLogic.LoadedSceneIsFlight) - return; - - - CheckBubbleDeployment(1000); - if (AMConservationMode == true) - { - ConservationMode = "A.Momentum"; - } - if (AMConservationMode == false) - { - ConservationMode = "Velocity"; - } - } - catch (Exception ex) - { - print(String.Format("[WARP] Error in OnLoad - {0}", ex.Message)); - } - } - - private void SetPartState(bool stiffenJoints) - { - if (stiffenJoints) - { - print("Stiffening"); - //Stiffen Joints - _shipParts = new List(); - foreach (var vp in vessel.parts) - { - print("[WARP] Stiffening " + vp.name); - _shipParts.Add(new ShipInfo - { - ShipPart = vp, - BreakingForce = vp.breakingForce, - BreakingTorque = vp.breakingTorque, - CrashTolerance = vp.crashTolerance, - Constraints = vp.GetComponent().constraints - }); - vp.breakingForce = Mathf.Infinity; - vp.breakingTorque = Mathf.Infinity; - vp.crashTolerance = Mathf.Infinity; - } - vessel.GetComponent().constraints &= RigidbodyConstraints.FreezeRotation; - } - - else - { - print("Unstiffening"); - //Stop vessel - vessel.GetComponent().AddTorque(-vessel.GetComponent().angularVelocity); - //Reset part state - if (_shipParts != null) - { - foreach (var sp in _shipParts) - { - if (vessel.parts.Contains(sp.ShipPart)) - { - print("[WARP] Relaxing " + sp.ShipPart.name); - sp.ShipPart.GetComponent().AddTorque(-sp.ShipPart.GetComponent().angularVelocity); - sp.ShipPart.breakingForce = sp.BreakingForce; - sp.ShipPart.breakingTorque = sp.BreakingTorque; - sp.ShipPart.crashTolerance = sp.CrashTolerance; - sp.ShipPart.GetComponent().constraints = sp.Constraints; - } - } - vessel.GetComponent().constraints &= ~RigidbodyConstraints.FreezeRotation; - } - } - } - - private bool CheckAltitude() - { - status = "inactive"; - if (FlightGlobals.currentMainBody != null) - { - var altCutoff = FlightGlobals.ActiveVessel.mainBody.Radius * MinAltitude; - if (FlightGlobals.ActiveVessel.altitude < altCutoff) - { - status = "failsafe: " + Math.Round (altCutoff / 1000, 0) + "km"; - return false; - } - } - return true; - } - - private void GravityBrake() //Maximum warp reduces as one gets closer to a planetary body - limited by SOI so physics ticks are an issue. - { - var cutoffRadius = GravFactor * FlightGlobals.ActiveVessel.mainBody.Radius; - var currentbody = FlightGlobals.ActiveVessel.mainBody; - GravityBrakes = ((FlightGlobals.ActiveVessel.mainBody.gravParameter / Math.Pow(FlightGlobals.ActiveVessel.orbit.radius, BrakeFalloff)) / (FlightGlobals.ActiveVessel.mainBody.gravParameter / Math.Pow(cutoffRadius, BrakeFalloff))); - if (currentbody != FlightGlobals.Bodies.FirstOrDefault(x => x.referenceBody == x.referenceBody)) - { - var nextbody = FlightGlobals.ActiveVessel.mainBody.orbit.referenceBody; - while (nextbody != FlightGlobals.Bodies.FirstOrDefault(x => x.referenceBody == x.referenceBody)) - { - cutoffRadius = GravFactor * nextbody.Radius; - GravityBrakes = GravityBrakes + (((nextbody.gravParameter / Math.Pow(currentbody.orbit.radius, BrakeFalloff)) / (nextbody.gravParameter / Math.Pow(cutoffRadius, BrakeFalloff)))); - currentbody = nextbody; - nextbody = nextbody.orbit.referenceBody; - } - } - GravityBrakes = 1 - GravityBrakes; - } - - public void FixedUpdate() - { - try - { - if (!HighLogic.LoadedSceneIsFlight) - return; - - if(eModule == null) - SetupDrive(); - - if (IsDeployed != eModule.getIgnitionState) - { - IsDeployed = eModule.getIgnitionState; - CheckBubbleDeployment(3); - SetPartState(eModule.getIgnitionState); - } - - if (IsDeployed) - { - //Failsafe - if (!CheckAltitude()) - { - eModule.Shutdown(); - return; - } - - //Snip parts - DecoupleBubbleParts(); - - //OH NO FLAMEOUT! - if (eModule.flameout) - { - print("Flameout"); - BubbleCollapse(eModule.currentThrottle); - FlightInputHandler.state.mainThrottle = 0; - IsDeployed = false; - return; - } - - PlayWarpAnimation(eModule.currentThrottle); - GravityBrake(); - //Start by adding in our subluminal speed which is exponential - double lowerThrottle = (Math.Min(eModule.currentThrottle, SUBLIGHT_THROTTLE) * SUBLIGHT_MULT); - double distance = Math.Pow(lowerThrottle, SUBLIGHT_POWER); - - //Then if throttle is over our threshold, go linear - if (eModule.currentThrottle > SUBLIGHT_THROTTLE) - { - //How much headroom do we have - double maxSpeed = ((LIGHTSPEED*WarpFactor) - distance); - //How much of this can we use? - var upperThrottle = eModule.currentThrottle - SUBLIGHT_THROTTLE; - //How much of this headroom have we used? - var throttlePercent = upperThrottle/(1 - SUBLIGHT_THROTTLE); - //Add it to our current throttle calculation - var additionalDistance = maxSpeed*throttlePercent; - distance += additionalDistance; - } - - - //Take into acount safe accelleration/decelleration - //if (distance > CurrentSpeed + Math.Pow(10,MaxAccelleration)) - // distance = CurrentSpeed + Math.Pow(10, MaxAccelleration); - //if (distance < CurrentSpeed - Math.Pow(10, MaxAccelleration)) - // distance = CurrentSpeed - Math.Pow(10, MaxAccelleration); - //CurrentSpeed = distance; - - //if (distance > 1000) - //{ - //Let's see if we can get rid of precision issues with distance. - // Int32 precision = Math.Round(distance, 0).ToString().Length - 1; - // if (precision > MaxAccelleration) precision = MaxAccelleration; - // var magnitude = Math.Round((distance / Math.Pow(10, precision)),0); - // var jumpDistance = Math.Pow(10,precision) * magnitude; - // distance = jumpDistance; - //} - - double maxspeeddisp = Math.Pow(LIGHTSPEED * WarpFactor, GravityBrakes) / LIGHTSPEED; - double ts = WarpFactor * (TurboPoint / 100d); - if (maxspeeddisp >= ts) - { - distance = distance / (Math.Log(1/GravityBrakes) + (1 / (TurboFactor * TurboMult))); - maxspeeddisp = maxspeeddisp / (Math.Log(1 / GravityBrakes) + (1 / (TurboFactor*TurboMult))); - } - if (eModule.currentThrottle > MinThrottle) - { - // Translate through space on the back of a Kraken! - distance = Math.Pow(distance, GravityBrakes) * TimeWarp.fixedDeltaTime; - Vector3d ps = FlightGlobals.ActiveVessel.transform.position + (transform.up*(float) distance); - //krakensbane.setOffset(ps); - FloatingOrigin.SetOutOfFrameOffset(ps); - - //AngularMomentum Block - if (AMConservationMode == true) - { - ApplyAngularMomentum(); - } - } - if (AMConservationMode == true && eModule.currentThrottle == 0) - { - SetAMStartStateVars(); - } - double speedcdisp = (distance) / (LIGHTSPEED * TimeWarp.fixedDeltaTime); - status = String.Format("{0:g3}c [Max {1:f3}c] T@{2:f3}c", speedcdisp, maxspeeddisp, ts); - } - } - catch (Exception ex) - { - print(String.Format("[WARP] Error in OnFixedUpdate - {0}", ex.Message)); - } - } - - private void ApplyAngularMomentum() - { - FlightGlobals.ActiveVessel.IgnoreGForces(2); - if (PreviousBodyName == FlightGlobals.ActiveVessel.mainBody) - { - Krakensbane.ResetVelocityFrame(true); - if ((FlightGlobals.ActiveVessel.orbit.eccentricity >= 1) && (ElipMode == 0)) //For Hyperbolic Orbits. Conserve angular momentum by making orbit.h constant. GMp=h^2, so semi-latus rectum must be constant as well.). - { - Speed = Math.Sqrt(FlightGlobals.ActiveVessel.mainBody.gravParameter*((2/FlightGlobals.ActiveVessel.orbit.radius)-((SemiLatusOriginal*FlightGlobals.ActiveVessel.mainBody.gravParameter)/(FlightGlobals.ActiveVessel.orbit.semiMajorAxis * OriginalMomentumSqr)))); - var VelocityOffset = (TravelDirection * Speed); - FlightGlobals.ActiveVessel.SetWorldVelocity (VelocityOffset); - } - if ((FlightGlobals.ActiveVessel.orbit.eccentricity < 1) && (ElipMode == 1)) // For Elliptical Orbits. Conserve Angular Momentum directly by altering state vectors - { - Speed = OriginalSpeed * (OriginalFrameTrueRadius / (FlightGlobals.ActiveVessel.orbit.radius)); - var VelocityOffset = (TravelDirection * Speed); - FlightGlobals.ActiveVessel.SetWorldVelocity (VelocityOffset); - if (((FlightGlobals.ActiveVessel.orbit.radius / OriginalFrameTrueRadius) >= 0.85) || ((FlightGlobals.ActiveVessel.orbit.radius / OriginalFrameTrueRadius) <= 1.15)) // re-set variables when ratio between current ratio and original gets too far from 1 - { - OriginalSpeed = Vector3d.Magnitude (FlightGlobals.ActiveVessel.orbit.GetRelativeVel ()); - OriginalFrameTrueRadius = FlightGlobals.ActiveVessel.orbit.radius; - } - } - } - if (((FlightGlobals.ActiveVessel.orbit.eccentricity < 1) && (ElipMode == 0)) || ((FlightGlobals.ActiveVessel.orbit.eccentricity > 1) && (ElipMode == 1)) || (PreviousBodyName != FlightGlobals.currentMainBody)) - if (PreviousBodyName != FlightGlobals.ActiveVessel.mainBody) - { - SetAMStartStateVars(); - } - - } - - private void SetAMStartStateVars() - { - TravelDirection = Vector3d.Normalize(FlightGlobals.ActiveVessel.orbit.GetRelativeVel()); - OriginalSpeed = Vector3d.Magnitude(FlightGlobals.ActiveVessel.orbit.GetRelativeVel()); - OriginalFrameTrueRadius = FlightGlobals.ActiveVessel.orbit.radius; - OriginalMomentumSqr = Vector3d.SqrMagnitude(FlightGlobals.ActiveVessel.orbit.h.xzy); - PreviousBodyName = FlightGlobals.currentMainBody; - SemiLatusOriginal = FlightGlobals.ActiveVessel.orbit.semiLatusRectum; - if (FlightGlobals.ActiveVessel.orbit.eccentricity > 1) - { - ElipMode = 0; - } - else - { - ElipMode = 1; - } - } - - - private void BubbleCollapse(float speed) - { - var r = new System.Random(); - foreach (var p in vessel.parts) - { - var expl = r.Next(0, 100); - if (expl <= 33) - { - p.explode(); - } - if (expl >= 66) - { - p.decouple(10000); - } - } - } - - private void PlayWarpAnimation(float speed) - { - try - { - WarpAnimation[warpAnimationName].speed = 1 + (speed * WarpFactor); - if (!WarpAnimation.IsPlaying(warpAnimationName)) - { - WarpAnimation.Play(warpAnimationName); - } - //Set our color - var rgb = ColorUtils.HSL2RGB(Math.Abs(speed - 1), 0.5, speed / 2); - var c = new Color(rgb[0], rgb[1], rgb[2]); - warpBubble.GetComponent().material.SetColor("_Color", c); - - } - catch (Exception) - { - print("[WARP] ERROR IN PlayWarpAnimation"); - } - } - private void DecoupleBubbleParts() - { - try - { - int warpenginecount = 0; - foreach (var p in vessel.parts) - { - var posPart = p.partTransform.position; - var posBubble = part.partTransform.position; - double distance = Vector3d.Distance(posBubble, posPart); - if (distance > BubbleSize) - { - print("Part outside of warp bubble destroyed " + p.name); - p.decouple(10000); - } - if ((p.Modules.Contains("USI_ModuleWarpEngine") == true) && (p.FindModuleImplementing().getIgnitionState == true)) - { - warpenginecount++; - } - } - if (warpenginecount > 1) - { - ScreenMessages.PostScreenMessage("Invited Kraken - Too Many Active Warp Drives", 5f, ScreenMessageStyle.UPPER_CENTER); - foreach (var p in vessel.parts) - { - p.explode(); - part.explode(); - } - } - } - catch (Exception) - { - print("[WARP] ERROR IN DecoupleBubbleParts"); - } - } - private void CheckBubbleDeployment(int speed) - { - try - { - print("CHECKING BUBBLE " + speed); - //Turn off guide if there - if (IsDeployed) - { - SetDeployedState(speed); - } - else - { - SetRetractedState(-speed); - CheckAltitude(); - } - if (!HighLogic.LoadedSceneIsEditor) - { - if (editorBubble != null) - editorBubble.GetComponent().enabled = false; - } - } - catch (Exception) - { - print("[WARP] ERROR IN CheckBubbleDeployment"); - } - } - private GameObject FindEditorWarpBubble() - { - foreach (var gobj in GameObject.FindObjectsOfType()) - { - if (gobj.name == "EditorWarpBubble" && gobj.GetComponent() != null) - return gobj; - } - - return null; - } - private void SetRetractedState(int speed) - { - try - { - IsDeployed = false; - PlayDeployAnimation(speed); - } - catch (Exception) - { - print("[WARP] ERROR IN SetRetractedState"); - } - } - private void SetDeployedState(int speed) - { - try - { - IsDeployed = true; - PlayDeployAnimation(speed); - //For Angular Momentum Calculations - if (AMConservationMode == true) - { - SetAMStartStateVars(); - } - } - catch (Exception) - { - print("[WARP] ERROR IN SetDeployedState"); - } - } - - private void PlayDeployAnimation(int speed) - { - try - { - if (speed < 0) - { - DeployAnimation[deployAnimationName].time = DeployAnimation[deployAnimationName].length; - if(unfoldAnimationName != "") - UnfoldAnimation[unfoldAnimationName].time = UnfoldAnimation[unfoldAnimationName].length; - } - DeployAnimation[deployAnimationName].speed = speed; - DeployAnimation.Play(deployAnimationName); - if (unfoldAnimationName != "") - { - UnfoldAnimation[unfoldAnimationName].speed = speed; - UnfoldAnimation.Play(unfoldAnimationName); - } - } - catch (Exception) - { - print("[WARP] ERROR IN PlayDeployAnimation"); - } - } - - //private List GetNearbyVessels(int range, bool includeSelf) - //{ - // try - // { - // var vessels = new List(); - // foreach (var v in FlightGlobals.Vessels.Where( - // x => x.mainBody == vessel.mainBody)) - // { - // if (v == vessel && !includeSelf) continue; - // var posCur = vessel.GetWorldPos3D(); - // var posNext = v.GetWorldPos3D(); - // var distance = Vector3d.Distance(posCur, posNext); - // if (distance < range) - // { - // vessels.Add(v); - // } - // } - // return vessels; - // } - // catch (Exception ex) - // { - // print(String.Format("[WARP] - ERROR in GetNearbyVessels - {0}", ex.Message)); - // return new List(); - // } - //} - } -} diff --git a/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/WarpDrive.version b/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/WarpDrive.version index ba22828..d86b305 100644 --- a/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/WarpDrive.version +++ b/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/WarpDrive.version @@ -10,7 +10,7 @@ "VERSION":{ "MAJOR":0, "MINOR":9, - "PATCH":0, + "PATCH":1, "BUILD":0 }, "KSP_VERSION":{ diff --git a/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/WarpEngine.dll b/FOR_RELEASE/GameData/UmbraSpaceIndustries/WarpDrive/WarpEngine.dll new file mode 100644 index 0000000000000000000000000000000000000000..a6be521f847fdeb42e51b05a12241fc279bd33e5 GIT binary patch literal 18432 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
Mah_Nr(2gf?{V-+!EDJUN2MPB zKf$~3FFcCRrx}kGsp{|Izde^++(X!%=`^2EG^-^0sbWq z5q^m|SKW>Lr6qFsB0ksKi_g&$_`Nk2rQ*}<;vWPZ#{PB$kWcx1_UOY2e?;uq_W=f_Ri<u2wYV8U`9|Cn zw3a?ZJMqR|5gy_*hYg(!_@u1WmHKJHzCMjVe)i%wmG~7O+D?d;e9FzjF4lMgrzo7k zg*U2sG5p3ThQCeFWuy4%82;}8RdVDAB_WsZc5Iw4i(cgabp`9(=k&oN#5xy!#+3Bv z`{}+___`l*Fm;e9( literal 0 HcmV?d00001 diff --git a/Source/WarpEngine/WarpEngine.sln.DotSettings.user b/Source/WarpEngine/WarpEngine.sln.DotSettings.user new file mode 100644 index 0000000..1060189 --- /dev/null +++ b/Source/WarpEngine/WarpEngine.sln.DotSettings.user @@ -0,0 +1,4 @@ + + <AssemblyExplorer> + <Assembly Path="C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll" /> +</AssemblyExplorer> \ No newline at end of file diff --git a/Source/WarpEngine/WarpEngine/WarpEngine.csproj b/Source/WarpEngine/WarpEngine/WarpEngine.csproj index c7ffae4..0597e1a 100644 --- a/Source/WarpEngine/WarpEngine/WarpEngine.csproj +++ b/Source/WarpEngine/WarpEngine/WarpEngine.csproj @@ -32,6 +32,7 @@ ..\..\..\..\..\KSP_DEV\KSP_Data\Managed\Assembly-CSharp.dll + False @@ -42,9 +43,11 @@ ..\..\..\..\..\KSP_DEV\KSP_Data\Managed\UnityEngine.dll + False ..\..\..\..\..\KSP_DEV\KSP_Data\Managed\UnityEngine.UI.dll + False diff --git a/Source/WarpEngine/WarpEngine/obj/Debug/WarpEngine.pdb b/Source/WarpEngine/WarpEngine/obj/Debug/WarpEngine.pdb new file mode 100644 index 0000000000000000000000000000000000000000..93560523045f463379dacd66ba7223d305fc4cb8 GIT binary patch literal 32256 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 PsevOkaHIx4xCZ_Y$3=yt literal 0 HcmV?d00001