From 88b3bb7f83f9a5c91de05c6b8d99c0787db37241 Mon Sep 17 00:00:00 2001 From: Dan Date: Sun, 9 Apr 2023 10:24:05 -0500 Subject: [PATCH] Remove unused Code --- Source/ROTanks/Modules/ModuleROTProbe.cs.bak | 575 ------------- Source/ROTanks/Modules/ModuleROTank.cs.bak | 826 ------------------- Source/ROTanks/Properties/AssemblyInfo.cs | 36 - Source/ROTanks/ROTanks.csproj | 68 -- Source/ROTanks/ROTanks.sln | 25 - 5 files changed, 1530 deletions(-) delete mode 100644 Source/ROTanks/Modules/ModuleROTProbe.cs.bak delete mode 100644 Source/ROTanks/Modules/ModuleROTank.cs.bak delete mode 100644 Source/ROTanks/Properties/AssemblyInfo.cs delete mode 100644 Source/ROTanks/ROTanks.csproj delete mode 100644 Source/ROTanks/ROTanks.sln diff --git a/Source/ROTanks/Modules/ModuleROTProbe.cs.bak b/Source/ROTanks/Modules/ModuleROTProbe.cs.bak deleted file mode 100644 index d2157a1..0000000 --- a/Source/ROTanks/Modules/ModuleROTProbe.cs.bak +++ /dev/null @@ -1,575 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; -using KSPShaderTools; -using ROLib; - -namespace ROTanks -{ - public class ModuleROTProbe : PartModule, IRecolorable, IContainerVolumeContributor, IPartMassModifier - { - #region KSPFields - - [KSPField] - public float diameterLargeStep = 0.1f; - - [KSPField] - public float diameterSmallStep = 0.1f; - - [KSPField] - public float diameterSlideStep = 0.001f; - - [KSPField] - public float minDiameter = 0.1f; - - [KSPField] - public float maxDiameter = 5.0f; - - [KSPField] - public float volumeScalingPower = 3f; - - [KSPField] - public float massScalingPower = 3f; - - [KSPField] - public bool enableVScale = true; - - [KSPField] - public int coreContainerIndex = 0; - - [KSPField] - public int auxContainerSourceIndex = -1; - - [KSPField] - public int auxContainerTargetIndex = -1; - - [KSPField] - public float auxContainerMinPercent = 0f; - - [KSPField] - public float auxContainerMaxPercent = 0f; - - [KSPField] - public string coreManagedNodes = string.Empty; - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Total Length", guiFormat = "F4", guiUnits = "m")] - public float totalTankLength = 0.0f; - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Largest Diameter", guiFormat = "F4", guiUnits = "m")] - public float largestDiameter = 0.0f; - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Diameter", guiUnits = "m"), - UI_FloatEdit(sigFigs = 4, suppressEditorShipModified = true)] - public float currentDiameter = 1.0f; - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "V.ScaleAdj"), - UI_FloatEdit(sigFigs = 4, suppressEditorShipModified = true, minValue = -1, maxValue = 1, incrementLarge = 0.25f, incrementSmall = 0.05f, incrementSlide = 0.001f)] - public float currentVScale = 0f; - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Support", guiUnits = "%"), - UI_FloatEdit(sigFigs = 4, suppressEditorShipModified = true, minValue = 0, maxValue = 15, incrementLarge = 5, incrementSmall = 1, incrementSlide = 0.1f)] - public float auxContainerPercent = 0f; - - [KSPField(isPersistant = true, guiName = "Variant", guiActiveEditor = true, guiActive = false), - UI_ChooseOption(suppressEditorShipModified = true)] - public string currentVariant = "Default"; - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Core"), - UI_ChooseOption(suppressEditorShipModified = true)] - public string currentCore = "Mount-None"; - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Core Tex"), - UI_ChooseOption(suppressEditorShipModified = true)] - public string currentCoreTexture = "default"; - - [KSPField(isPersistant = true)] - public string coreModulePersistentData = string.Empty; - - [KSPField(isPersistant = true)] - public bool initializedDefaults = false; - - #endregion KSPFields - - - #region Private Variables - - [Persistent] - public string configNodeData = string.Empty; - - private bool initialized = false; - private float modifiedMass = -1; - private float prevDiameter = -1; - private string[] coreNodeNames; - private ROLModelModule coreModule; - - /// - /// Mapping of all of the variant sets available for this part. When variant list length > 0, an additional 'variant' UI slider is added to allow for switching between variants. - /// - private Dictionary variantSets = new Dictionary(); - - /// - /// Helper method to get or create a variant set for the input variant name. If no set currently exists, a new set is empty set is created and returned. - /// - /// - /// - private ModelDefinitionVariantSet getVariantSet(string name) - { - ModelDefinitionVariantSet set = null; - if (!variantSets.TryGetValue(name, out set)) - { - set = new ModelDefinitionVariantSet(name); - variantSets.Add(name, set); - } - return set; - } - - /// - /// Helper method to find the variant set for the input model definition. Will nullref/error if no variant set is found. Will NOT create a new set if not found. - /// - /// - /// - private ModelDefinitionVariantSet getVariantSet(ModelDefinitionLayoutOptions def) - { - //returns the first variant set out of all variants where the variants definitions contains the input definition - return variantSets.Values.Where((a, b) => { return a.definitions.Contains(def); }).First(); - } - - #endregion Private Variables - - - #region KSP Overrides - - public override void OnLoad(ConfigNode node) - { - base.OnLoad(node); - if (string.IsNullOrEmpty(configNodeData)) { configNodeData = node.ToString(); } - initialize(); - } - - public override void OnStart(StartState state) - { - base.OnStart(state); - initialize(); - initializeUI(); - updateMassAndDimensions(); - } - - public void Start() - { - initializedDefaults = true; - updateDragCubes(); - } - - public void OnDestroy() - { - if (HighLogic.LoadedSceneIsEditor) - { - GameEvents.onEditorShipModified.Remove(new EventData.OnEvent(onEditorVesselModified)); - } - } - - private void onEditorVesselModified(ShipConstruct ship) - { - //update available variants for attach node changes - updateAvailableVariants(); - } - - // IPartMass Override - public ModifierChangeWhen GetModuleMassChangeWhen() { return ModifierChangeWhen.CONSTANTLY; } - - // IPartMass Override - public float GetModuleMass(float defaultMass, ModifierStagingSituation sit) - { - if (modifiedMass == -1) { return 0; } - return -defaultMass + modifiedMass; - } - - // IRecolorable Override - public string[] getSectionNames() - { - return new string[] { "Core" }; - } - - // IRecolorable Override - public RecoloringData[] getSectionColors(string section) - { - return coreModule.recoloringData; - } - - // IRecolorable Override - public void setSectionColors(string section, RecoloringData[] colors) - { - coreModule.setSectionColors(colors); - } - - // IRecolorable Override - public TextureSet getSectionTexture(string section) - { - return coreModule.textureSet; - } - - // IContainerVolumeContributor Override - public ContainerContribution[] getContainerContributions() - { - ContainerContribution[] cts; - float auxVol = 0; - ContainerContribution ctCore = getCC("core", coreContainerIndex, coreModule.moduleVolume * 1000f, ref auxVol); - ContainerContribution ctAux = new ContainerContribution("aux", auxContainerTargetIndex, auxVol); - cts = new ContainerContribution[2] { ctCore, ctAux }; - return cts; - } - - private ContainerContribution getCC(string name, int index, float vol, ref float auxVol) - { - float ap = auxContainerPercent * 0.01f; - float contVol = vol; - if (index == auxContainerSourceIndex && auxContainerTargetIndex >= 0) - { - auxVol += vol * ap; - contVol = (1 - ap) * vol; - } - return new ContainerContribution(name, index, contVol); - } - - #endregion KSP Overrides - - - #region Custom Update Methods - - private void initialize() - { - if (initialized) { return; } - initialized = true; - - prevDiameter = currentDiameter; - - coreNodeNames = ROLUtils.parseCSV(coreManagedNodes); - - //model-module setup/initialization - ConfigNode node = ROLConfigNodeUtils.parseConfigNode(configNodeData); - - //list of CORE model nodes from config - //each one may contain multiple 'model=modelDefinitionName' entries - //but must contain no more than a single 'variant' entry. - //if no variant is specified, they are added to the 'Default' variant. - ConfigNode[] coreDefNodes = node.GetNodes("CORE"); - ModelDefinitionLayoutOptions[] coreDefs; - List coreDefList = new List(); - int coreDefLen = coreDefNodes.Length; - for (int i = 0; i < coreDefLen; i++) - { - string variantName = coreDefNodes[i].ROLGetStringValue("variant", "Default"); - coreDefs = ROLModelData.getModelDefinitionLayouts(coreDefNodes[i].ROLGetStringValues("model")); - coreDefList.AddUniqueRange(coreDefs); - ModelDefinitionVariantSet mdvs = getVariantSet(variantName); - mdvs.addModels(coreDefs); - } - coreDefs = coreDefList.ToArray(); - - coreModule = new ROLModelModule(part, this, getRootTransform("ModularProbe-CORE"), ModelOrientation.CENTRAL, nameof(currentCore), null, nameof(currentCoreTexture), nameof(coreModulePersistentData)); - coreModule.name = "ModularProbe-Core"; - coreModule.getSymmetryModule = m => m.coreModule; - coreModule.getValidOptions = () => getVariantSet(currentVariant).definitions; - - coreModule.massScalar = massScalingPower; - coreModule.volumeScalar = volumeScalingPower; - - //set up the model lists and load the currently selected model - coreModule.setupModelList(coreDefs); - coreModule.setupModel(); - - updateModulePositions(); - updateMassAndDimensions(); - updateAttachNodes(false); - updateAvailableVariants(); - ROLStockInterop.updatePartHighlighting(part); - } - - /// - /// Initialize the UI controls, including default values, and specifying delegates for their 'onClick' methods. - /// All UI based interaction code will be defined/run through these delegates. - /// - private void initializeUI() - { - Action modelChangedAction = (m) => - { - m.updateModulePositions(); - m.updateMassAndDimensions(); - m.updateAttachNodes(true); - m.updateAvailableVariants(); - m.updateDragCubes(); - ROLModInterop.updateResourceVolume(m.part); - }; - - //set up the core variant UI control - string[] variantNames = ROLUtils.getNames(variantSets.Values, m => m.variantName); - this.ROLupdateUIChooseOptionControl(nameof(currentVariant), variantNames, variantNames, true, currentVariant); - Fields[nameof(currentVariant)].guiActiveEditor = variantSets.Count > 1; - - Fields[nameof(currentVariant)].uiControlEditor.onFieldChanged = (a, b) => - { - //TODO find variant set for the currently enabled core model - //query the index from that variant set - ModelDefinitionVariantSet prevMdvs = getVariantSet(coreModule.definition.name); - //this is the index of the currently selected model within its variant set - int previousIndex = prevMdvs.indexOf(coreModule.layoutOptions); - //grab ref to the current/new variant set - ModelDefinitionVariantSet mdvs = getVariantSet(currentVariant); - //and a reference to the model from same index out of the new set ([] call does validation internally for IAOOBE) - ModelDefinitionLayoutOptions newCoreDef = mdvs[previousIndex]; - //now, call model-selected on the core model to update for the changes, including symmetry counterpart updating. - this.ROLactionWithSymmetry(m => - { - m.currentVariant = currentVariant; - m.coreModule.modelSelected(newCoreDef.definition.name); - modelChangedAction(m); - }); - }; - - Fields[nameof(currentDiameter)].uiControlEditor.onFieldChanged = (a, b) => - { - this.ROLactionWithSymmetry(m => - { - if (m != this) { m.currentDiameter = this.currentDiameter; } - modelChangedAction(m); - m.prevDiameter = m.currentDiameter; - }); - ROLStockInterop.fireEditorUpdate(); - }; - - Fields[nameof(currentVScale)].uiControlEditor.onFieldChanged = (a, b) => - { - this.ROLactionWithSymmetry(m => - { - if (m != this) { m.currentVScale = this.currentVScale; } - modelChangedAction(m); - }); - ROLStockInterop.fireEditorUpdate(); - }; - - Fields[nameof(currentCore)].uiControlEditor.onFieldChanged = (a, b) => - { - coreModule.modelSelected(a, b); - this.ROLactionWithSymmetry(modelChangedAction); - ROLStockInterop.fireEditorUpdate(); - }; - - //------------------MODEL DIAMETER SWITCH UI INIT---------------------// - if (maxDiameter == minDiameter) - { - Fields[nameof(currentDiameter)].guiActiveEditor = false; - } - else - { - this.ROLupdateUIFloatEditControl(nameof(currentDiameter), minDiameter, maxDiameter, diameterLargeStep, diameterSmallStep, diameterSlideStep, true, currentDiameter); - } - Fields[nameof(currentVScale)].guiActiveEditor = enableVScale; - - //------------------AUX CONTAINER SWITCH UI INIT---------------------// - Fields[nameof(auxContainerPercent)].uiControlEditor.onFieldChanged = (a, b) => - { - this.ROLactionWithSymmetry(m => - { - if (m != this) { m.auxContainerPercent = this.auxContainerPercent; } - ROLModInterop.updateResourceVolume(m.part); - ROLStockInterop.fireEditorUpdate(); - }); - }; - if (auxContainerMinPercent == auxContainerMaxPercent || auxContainerSourceIndex < 0 || auxContainerTargetIndex < 0) - { - Fields[nameof(auxContainerPercent)].guiActiveEditor = false; - } - else - { - this.ROLupdateUIFloatEditControl(nameof(auxContainerPercent), auxContainerMinPercent, auxContainerMaxPercent, 5f, 1f, 0.1f, false, auxContainerPercent); - } - - //------------------MODULE TEXTURE SWITCH UI INIT---------------------// - Fields[nameof(currentCoreTexture)].uiControlEditor.onFieldChanged = coreModule.textureSetSelected; - - if (HighLogic.LoadedSceneIsEditor) - { - GameEvents.onEditorShipModified.Add(new EventData.OnEvent(onEditorVesselModified)); - } - } - - public void updateAvionicsData() - { - PartModule avionicsData; - avionicsData = part.Modules["ProceduralAvionics"]; - avionicsData.GetType().GetField("cachedVolume").SetValue(avionicsData, 1000.0f); - } - - /// - /// Update the scale and position values for all currently configured models. Does no validation, only updates positions. - /// After calling this method, all models will be scaled and positioned according to their internal position/scale values and the orientations/offsets defined in the models. - /// - private void updateModulePositions() - { - //scales for modules depend on the module above/below them - //first set the scale for the core module -- this depends directly on the UI specified 'diameter' value. - coreModule.setScaleForDiameter(currentDiameter, currentVScale); - - //total height of the part is determined by the sum of the heights of the modules at their current scale - float totalHeight = coreModule.moduleHeight; - - //position of each module is set such that the vertical center of the models is at part origin/COM - float pos = totalHeight * 0.5f; //abs top of model - pos -= coreModule.moduleHeight * 0.5f; //center of 'core' model - coreModule.setPosition(pos); - pos -= coreModule.moduleHeight * 0.5f; //bottom of 'core' model - - //update actual model positions and scales - coreModule.updateModelMeshes(); - } - - /// - /// Update the cached modifiedMass and dimension updates for the PAW. Used with stock cost/mass modifier interface. - /// - private void updateMassAndDimensions() - { - modifiedMass = coreModule.moduleMass; - totalTankLength = getTotalHeight(); - } - - /// - /// Update the attach nodes for the current model-module configuration. - /// The 'nose' module is responsible for updating of upper attach nodes, while the 'mount' module is responsible for lower attach nodes. - /// Also includes updating of 'interstage' nose/mount attach nodes. - /// Also includes updating of surface-attach node position. - /// Also includes updating of any parts that are surface attached to this part. - /// - /// - private void updateAttachNodes(bool userInput) - { - //update the standard top and bottom attach nodes, using the node position(s) defined in the nose and mount modules - coreModule.updateAttachNodeTop("top", userInput); - coreModule.updateAttachNodeBottom("bottom", userInput); - - //update the model-module specific attach nodes, using the per-module node definitions from the part - coreModule.updateAttachNodeBody(coreNodeNames, userInput); - - //update surface attach node position, part position, and any surface attached children - //TODO -- how to determine how far to offset/move surface attached children? - AttachNode surfaceNode = part.srfAttachNode; - if (surfaceNode != null) - { - coreModule.updateSurfaceAttachNode(surfaceNode, prevDiameter, userInput); - } - } - - /// - /// Return the total height of this part in its current configuration. This will be the distance from the bottom attach node to the top attach node, and may not include any 'extra' structure. TOOLING - /// - /// - private float getTotalHeight() - { - float totalHeight = coreModule.moduleHeight; - return totalHeight; - } - - /// - /// Return the topmost position in the models relative to the part's origin. - /// - /// - private float getPartTopY() - { - return getTotalHeight() * 0.5f; - } - - /// - /// Update the UI visibility for the currently available selections. - /// Will hide/remove UI fields for slots with only a single option (models, textures, layouts). - /// - private void updateAvailableVariants() - { - coreModule.updateSelections(); - } - - /// - /// Calls the generic SSTU procedural drag-cube updating routines. Will update the drag cubes for whatever the current model state is. - /// - private void updateDragCubes() - { - ROLModInterop.onPartGeometryUpdate(part, true); - } - - /// - /// Return the root transform for the specified name. If does not exist, will create it and parent it to the parts' 'model' transform. - /// - /// - /// - /// - private Transform getRootTransform(string name) - { - Transform root = part.transform.ROLFindRecursive(name); - if (root != null) - { - GameObject.DestroyImmediate(root.gameObject); - root = null; - } - root = new GameObject(name).transform; - root.NestToParent(part.transform.ROLFindRecursive("model")); - return root; - } - - /// - /// Return the model-module corresponding to the input slot name. Valid slot names are: NOSE,UPPER,CORE,LOWER,MOUNT - /// - /// - /// - private ROLModelModule getModuleByName(string name) - { - switch (name) - { - case "CORE": - return coreModule; - default: - return null; - } - } - - #endregion Custom Update Methods - - - /// - /// Data storage for a group of model definitions that share the same 'variant' type. Used by modular-part in variant-defined configurations. - /// - public class ModelDefinitionVariantSet - { - public readonly string variantName; - - public ModelDefinitionLayoutOptions[] definitions = new ModelDefinitionLayoutOptions[0]; - - public ModelDefinitionLayoutOptions this[int index] - { - get - { - if (index < 0) { index = 0; } - if (index >= definitions.Length) { index = definitions.Length - 1; } - return definitions[index]; - } - } - - public ModelDefinitionVariantSet(string name) - { - this.variantName = name; - } - - public void addModels(ModelDefinitionLayoutOptions[] defs) - { - List allDefs = new List(); - allDefs.AddRange(definitions); - allDefs.AddUniqueRange(defs); - definitions = allDefs.ToArray(); - } - - public int indexOf(ModelDefinitionLayoutOptions def) - { - return definitions.IndexOf(def); - } - - } - } -} diff --git a/Source/ROTanks/Modules/ModuleROTank.cs.bak b/Source/ROTanks/Modules/ModuleROTank.cs.bak deleted file mode 100644 index 057449c..0000000 --- a/Source/ROTanks/Modules/ModuleROTank.cs.bak +++ /dev/null @@ -1,826 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; -using ROLib; -using KSPShaderTools; - -namespace ROTanks -{ - - // TODO: prevDiameter allows the surface attached parts to update, so I should make a prevHeight to allow the surface attached parts on the top and bottom to update as well. - /// - /// PartModule that manages multiple models/meshes and accompanying features for model switching - resources, modules, textures, recoloring. - /// Includes 3 stack-mounted modules. All modules support model-switching, texture-switching, recoloring. - /// - public class ModuleROTank : PartModule, IPartCostModifier, IPartMassModifier, IRecolorable, IContainerVolumeContributor - { - #region KSPFields - - [KSPField] - public float diameterLargeStep = 0.1f; - - [KSPField] - public float diameterSmallStep = 0.1f; - - [KSPField] - public float diameterSlideStep = 0.001f; - - [KSPField] - public float minDiameter = 0.1f; - - [KSPField] - public float maxDiameter = 5.0f; - - [KSPField] - public float volumeScalingPower = 3f; - - [KSPField] - public float massScalingPower = 3f; - - [KSPField] - public bool enableVScale = true; - - [KSPField] - public bool scaleMass = false; - - [KSPField] - public bool scaleCost = false; - - [KSPField] - public int coreContainerIndex = 0; - - [KSPField] - public int noseContainerIndex = 0; - - [KSPField] - public int mountContainerIndex = 0; - - [KSPField] - public string coreManagedNodes = string.Empty; - - [KSPField] - public string noseManagedNodes = string.Empty; - - [KSPField] - public string mountManagedNodes = string.Empty; - - [KSPField] - public string noseInterstageNode = "noseinterstage"; - - [KSPField] - public string mountInterstageNode = "mountinterstage"; - - [KSPField] - public float actualHeight = 0.0f; - - /// - /// This is the total length of the entire tank with the nose, core and mounts all considered. - /// - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Total Length", guiFormat = "F4", guiUnits = "m")] - public float totalTankLength = 0.0f; - - /// - /// This is the largest diameter of the entire tank. - /// - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Largest Diameter", guiFormat = "F4", guiUnits = "m")] - public float largestDiameter = 0.0f; - - /// - /// The current user selected diamater of the part. Drives the scaling and positioning of everything else in the model. - /// - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Diameter", guiUnits = "m"), - UI_FloatEdit(sigFigs = 4, suppressEditorShipModified = true)] - public float currentDiameter = 1.0f; - - /// - /// Adjustment to the vertical-scale of v-scale compatible models/module-slots. - /// - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "V.ScaleAdj"), - UI_FloatEdit(sigFigs = 4, suppressEditorShipModified = true, minValue = -1, maxValue = 1, incrementLarge = 0.25f, incrementSmall = 0.05f, incrementSlide = 0.001f)] - public float currentVScale = 0f; - - //------------------------------------------MODEL SELECTION SET PERSISTENCE-----------------------------------------------// - - //non-persistent value; initialized to whatever the currently selected core model definition is at time of loading - //allows for variant names to be updated in the part-config without breaking everything.... - [KSPField(isPersistant = true, guiName = "Variant", guiActiveEditor = true, guiActive = false), - UI_ChooseOption(suppressEditorShipModified = true)] - public string currentVariant = "Default"; - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Nose"), - UI_ChooseOption(suppressEditorShipModified = true)] - public string currentNose = "Mount-None"; - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Core"), - UI_ChooseOption(suppressEditorShipModified = true)] - public string currentCore = "Mount-None"; - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Mount"), - UI_ChooseOption(suppressEditorShipModified = true)] - public string currentMount = "Mount-None"; - - //------------------------------------------TEXTURE SET PERSISTENCE-----------------------------------------------// - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Nose Tex"), - UI_ChooseOption(suppressEditorShipModified = true)] - public string currentNoseTexture = "default"; - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Core Tex"), - UI_ChooseOption(suppressEditorShipModified = true)] - public string currentCoreTexture = "default"; - - [KSPField(isPersistant = true, guiActiveEditor = true, guiActive = false, guiName = "Mount Tex"), - UI_ChooseOption(suppressEditorShipModified = true)] - public string currentMountTexture = "default"; - - //------------------------------------------RECOLORING PERSISTENCE-----------------------------------------------// - - //persistent data for modules; stores colors - [KSPField(isPersistant = true)] - public string noseModulePersistentData = string.Empty; - - [KSPField(isPersistant = true)] - public string coreModulePersistentData = string.Empty; - - [KSPField(isPersistant = true)] - public string mountModulePersistentData = string.Empty; - - //tracks if default textures and resource volumes have been initialized; only occurs once during the parts' first Start() call - [KSPField(isPersistant = true)] - public bool initializedDefaults = false; - - #endregion KSPFields - - #region Private Variables - - /// - /// Standard work-around for lack of config-node data being passed consistently and lack of support for mod-added serializable classes. - /// - [Persistent] - public string configNodeData = string.Empty; - - /// - /// Has initialization been run? Set to true the first time init methods are run (OnLoad/OnStart), and ensures that init is only run a single time. - /// - private bool initialized = false; - - /// - /// The adjusted modified mass for this part. - /// - private float modifiedMass = -1; - - /// - /// The adjusted modified cost for this part. - /// - private float modifiedCost = -1; - - /// - /// Previous diameter value, used for surface attach position updates. - /// - private float prevDiameter = -1; - - private string[] noseNodeNames; - private string[] coreNodeNames; - private string[] mountNodeNames; - - //Main module slots for nose/core/mount - private ROLModelModule noseModule; - private ROLModelModule coreModule; - private ROLModelModule mountModule; - - /// - /// Mapping of all of the variant sets available for this part. When variant list length > 0, an additional 'variant' UI slider is added to allow for switching between variants. - /// - private Dictionary variantSets = new Dictionary(); - - /// - /// Helper method to get or create a variant set for the input variant name. If no set currently exists, a new set is empty set is created and returned. - /// - /// - /// - private ModelDefinitionVariantSet getVariantSet(string name) - { - ModelDefinitionVariantSet set = null; - if (!variantSets.TryGetValue(name, out set)) - { - set = new ModelDefinitionVariantSet(name); - variantSets.Add(name, set); - } - return set; - } - - /// - /// Helper method to find the variant set for the input model definition. Will nullref/error if no variant set is found. Will NOT create a new set if not found. - /// - /// - /// - private ModelDefinitionVariantSet getVariantSet(ModelDefinitionLayoutOptions def) - { - //returns the first variant set out of all variants where the variants definitions contains the input definition - return variantSets.Values.Where((a, b) => { return a.definitions.Contains(def); }).First(); - } - - #endregion Private Variables - - #region Standard KSP Overrides - - // Standard KSP lifecyle override - public override void OnLoad(ConfigNode node) - { - base.OnLoad(node); - if (string.IsNullOrEmpty(configNodeData)) { configNodeData = node.ToString(); } - initialize(); - } - - // Standard KSP lifecyle override - public override void OnStart(StartState state) - { - base.OnStart(state); - initialize(); - initializeUI(); - updateDimensions(); - } - - // Standard Unity lifecyle override - public void Start() - { - initializedDefaults = true; - updateDragCubes(); - } - - // Standard Unity lifecyle override - public void OnDestroy() - { - if (HighLogic.LoadedSceneIsEditor) - { - GameEvents.onEditorShipModified.Remove(new EventData.OnEvent(onEditorVesselModified)); - } - } - - //KSP editor modified event callback - private void onEditorVesselModified(ShipConstruct ship) - { - //update available variants for attach node changes - updateAvailableVariants(); - } - - // IPartMass/CostModifier override - public ModifierChangeWhen GetModuleMassChangeWhen() { return ModifierChangeWhen.CONSTANTLY; } - - // IPartMass/CostModifier override - public ModifierChangeWhen GetModuleCostChangeWhen() { return ModifierChangeWhen.CONSTANTLY; } - - // IPartMass/CostModifier override - public float GetModuleMass(float defaultMass, ModifierStagingSituation sit) - { - if (modifiedMass == -1) { return 0; } - return -defaultMass + modifiedMass; - } - - // IPartMass/CostModifier override - public float GetModuleCost(float defaultCost, ModifierStagingSituation sit) - { - if (modifiedCost == -1) { return 0; } - return -defaultCost + modifiedCost; - } - - //IRecolorable override - public string[] getSectionNames() - { - return new string[] { "Nose", "Core", "Mount" }; - } - - //IRecolorable override - public RecoloringData[] getSectionColors(string section) - { - if (section == "Nose") - { - return noseModule.recoloringData; - } - else if (section == "Core") - { - return coreModule.recoloringData; - } - else if (section == "Mount") - { - return mountModule.recoloringData; - } - return coreModule.recoloringData; - } - - //IRecolorable override - public void setSectionColors(string section, RecoloringData[] colors) - { - if (section == "Nose") - { - noseModule.setSectionColors(colors); - } - else if (section == "Core") - { - coreModule.setSectionColors(colors); - } - else if (section == "Mount") - { - mountModule.setSectionColors(colors); - } - } - - //IRecolorable override - public TextureSet getSectionTexture(string section) - { - if (section == "Nose") - { - return noseModule.textureSet; - } - else if (section == "Core") - { - return coreModule.textureSet; - } - else if (section == "Mount") - { - return mountModule.textureSet; - } - return coreModule.textureSet; - } - - //IContainerVolumeContributor override - public ContainerContribution[] getContainerContributions() - { - ContainerContribution[] cts; - ContainerContribution ct0 = getCC("nose", noseContainerIndex, noseModule.moduleVolume * 1000f); - ContainerContribution ct1 = getCC("core", coreContainerIndex, coreModule.moduleVolume * 1000f); - ContainerContribution ct2 = getCC("mount", mountContainerIndex, mountModule.moduleVolume * 1000f); - cts = new ContainerContribution[3] { ct0, ct1, ct2 }; - return cts; - } - - private ContainerContribution getCC(string name, int index, float vol) - { - float contVol = vol; - return new ContainerContribution(name, index, contVol); - } - - #endregion Standard KSP Overrides - - #region Custom Update Methods - - /// - /// Initialization method. Sets up model modules, loads their configs from the input config node. Does all initial linking of part-modules. - /// Does NOT set up their UI interaction -- that is all handled during OnStart() - /// - private void initialize() - { - if (initialized) { return; } - initialized = true; - - prevDiameter = currentDiameter; - - noseNodeNames = ROLUtils.parseCSV(noseManagedNodes); - coreNodeNames = ROLUtils.parseCSV(coreManagedNodes); - mountNodeNames = ROLUtils.parseCSV(mountManagedNodes); - - //model-module setup/initialization - ConfigNode node = ROLConfigNodeUtils.parseConfigNode(configNodeData); - - //list of CORE model nodes from config - //each one may contain multiple 'model=modelDefinitionName' entries - //but must contain no more than a single 'variant' entry. - //if no variant is specified, they are added to the 'Default' variant. - ConfigNode[] coreDefNodes = node.GetNodes("CORE"); - ModelDefinitionLayoutOptions[] coreDefs; - List coreDefList = new List(); - int coreDefLen = coreDefNodes.Length; - for (int i = 0; i < coreDefLen; i++) - { - string variantName = coreDefNodes[i].ROLGetStringValue("variant", "Default"); - coreDefs = ROLModelData.getModelDefinitionLayouts(coreDefNodes[i].ROLGetStringValues("model")); - coreDefList.AddUniqueRange(coreDefs); - ModelDefinitionVariantSet mdvs = getVariantSet(variantName); - mdvs.addModels(coreDefs); - } - coreDefs = coreDefList.ToArray(); - - //model defs - brought here so we can capture the array rather than the config node+method call - ModelDefinitionLayoutOptions[] noseDefs = ROLModelData.getModelDefinitions(node.GetNodes("NOSE")); - ModelDefinitionLayoutOptions[] mountDefs = ROLModelData.getModelDefinitions(node.GetNodes("MOUNT")); - - noseModule = new ROLModelModule(part, this, getRootTransform("ModularPart-NOSE"), ModelOrientation.TOP, nameof(currentNose), null, nameof(currentNoseTexture), nameof(noseModulePersistentData)); - noseModule.name = "ModuleROTank-Nose"; - noseModule.getSymmetryModule = m => m.noseModule; - noseModule.getValidOptions = () => noseDefs; - - coreModule = new ROLModelModule(part, this, getRootTransform("ModularPart-CORE"), ModelOrientation.CENTRAL, nameof(currentCore), null, nameof(currentCoreTexture), nameof(coreModulePersistentData)); - coreModule.name = "ModuleROTank-Core"; - coreModule.getSymmetryModule = m => m.coreModule; - coreModule.getValidOptions = () => getVariantSet(currentVariant).definitions; - - mountModule = new ROLModelModule(part, this, getRootTransform("ModularPart-MOUNT"), ModelOrientation.BOTTOM, nameof(currentMount), null, nameof(currentMountTexture), nameof(mountModulePersistentData)); - mountModule.name = "ModuleROTank-Mount"; - mountModule.getSymmetryModule = m => m.mountModule; - mountModule.getValidOptions = () => mountDefs; - - noseModule.volumeScalar = volumeScalingPower; - coreModule.volumeScalar = volumeScalingPower; - mountModule.volumeScalar = volumeScalingPower; - - //set up the model lists and load the currently selected model - noseModule.setupModelList(noseDefs); - coreModule.setupModelList(coreDefs); - mountModule.setupModelList(mountDefs); - coreModule.setupModel(); - noseModule.setupModel(); - mountModule.setupModel(); - - updateModulePositions(); - updateDimensions(); - updateAttachNodes(false); - updateAvailableVariants(); - if (scaleMass) - { - updateMass(); - } - if (scaleCost) - { - updateCost(); - } - ROLStockInterop.updatePartHighlighting(part); - } - - /// - /// Initialize the UI controls, including default values, and specifying delegates for their 'onClick' methods. - /// All UI based interaction code will be defined/run through these delegates. - /// - private void initializeUI() - { - Action modelChangedAction = (m) => - { - m.updateModulePositions(); - m.updateDimensions(); - m.updateAttachNodes(true); - m.updateAvailableVariants(); - m.updateDragCubes(); - if (scaleMass) - { - m.updateMass(); - } - if (scaleCost) - { - m.updateCost(); - } - ROLModInterop.updateResourceVolume(m.part); - }; - - //set up the core variant UI control - string[] variantNames = ROLUtils.getNames(variantSets.Values, m => m.variantName); - this.ROLupdateUIChooseOptionControl(nameof(currentVariant), variantNames, variantNames, true, currentVariant); - Fields[nameof(currentVariant)].guiActiveEditor = variantSets.Count > 1; - - Fields[nameof(currentVariant)].uiControlEditor.onFieldChanged = (a, b) => - { - //TODO find variant set for the currently enabled core model - //query the index from that variant set - ModelDefinitionVariantSet prevMdvs = getVariantSet(coreModule.definition.name); - //this is the index of the currently selected model within its variant set - int previousIndex = prevMdvs.indexOf(coreModule.layoutOptions); - //grab ref to the current/new variant set - ModelDefinitionVariantSet mdvs = getVariantSet(currentVariant); - //and a reference to the model from same index out of the new set ([] call does validation internally for IAOOBE) - ModelDefinitionLayoutOptions newCoreDef = mdvs[previousIndex]; - //now, call model-selected on the core model to update for the changes, including symmetry counterpart updating. - this.ROLactionWithSymmetry(m => - { - m.currentVariant = currentVariant; - m.coreModule.modelSelected(newCoreDef.definition.name); - modelChangedAction(m); - }); - }; - - Fields[nameof(currentDiameter)].uiControlEditor.onFieldChanged = (a, b) => - { - this.ROLactionWithSymmetry(m => - { - if (m != this) { m.currentDiameter = this.currentDiameter; } - modelChangedAction(m); - m.prevDiameter = m.currentDiameter; - }); - ROLStockInterop.fireEditorUpdate(); - }; - - Fields[nameof(currentVScale)].uiControlEditor.onFieldChanged = (a, b) => - { - this.ROLactionWithSymmetry(m => - { - if (m != this) { m.currentVScale = this.currentVScale; } - modelChangedAction(m); - }); - ROLStockInterop.fireEditorUpdate(); - }; - - Fields[nameof(currentNose)].uiControlEditor.onFieldChanged = (a, b) => - { - noseModule.modelSelected(a, b); - this.ROLactionWithSymmetry(modelChangedAction); - ROLStockInterop.fireEditorUpdate(); - }; - - Fields[nameof(currentCore)].uiControlEditor.onFieldChanged = (a, b) => - { - coreModule.modelSelected(a, b); - this.ROLactionWithSymmetry(modelChangedAction); - ROLStockInterop.fireEditorUpdate(); - }; - - Fields[nameof(currentMount)].uiControlEditor.onFieldChanged = (a, b) => - { - mountModule.modelSelected(a, b); - this.ROLactionWithSymmetry(modelChangedAction); - ROLStockInterop.fireEditorUpdate(); - }; - - //------------------MODEL DIAMETER SWITCH UI INIT---------------------// - if (maxDiameter == minDiameter) - { - Fields[nameof(currentDiameter)].guiActiveEditor = false; - } - else - { - this.ROLupdateUIFloatEditControl(nameof(currentDiameter), minDiameter, maxDiameter, diameterLargeStep, diameterSmallStep, diameterSlideStep, true, currentDiameter); - } - Fields[nameof(currentVScale)].guiActiveEditor = enableVScale; - - //------------------MODULE TEXTURE SWITCH UI INIT---------------------// - Fields[nameof(currentNoseTexture)].uiControlEditor.onFieldChanged = noseModule.textureSetSelected; - Fields[nameof(currentCoreTexture)].uiControlEditor.onFieldChanged = coreModule.textureSetSelected; - Fields[nameof(currentMountTexture)].uiControlEditor.onFieldChanged = mountModule.textureSetSelected; - - if (HighLogic.LoadedSceneIsEditor) - { - GameEvents.onEditorShipModified.Add(new EventData.OnEvent(onEditorVesselModified)); - } - - // Force the Textures selection to show up to keep the PAW at the same size - Fields[nameof(currentNoseTexture)].guiActiveEditor = true; - Fields[nameof(currentCoreTexture)].guiActiveEditor = true; - Fields[nameof(currentMountTexture)].guiActiveEditor = true; - } - - /// - /// Update the scale and position values for all currently configured models. Does no validation, only updates positions. - /// After calling this method, all models will be scaled and positioned according to their internal position/scale values and the orientations/offsets defined in the models. - /// - private void updateModulePositions() - { - //scales for modules depend on the module above/below them - //first set the scale for the core module -- this depends directly on the UI specified 'diameter' value. - coreModule.setScaleForDiameter(currentDiameter, currentVScale); - - //next, set nose scale values - noseModule.setDiameterFromBelow(coreModule.moduleUpperDiameter, currentVScale); - - //finally, set mount scale values - mountModule.setDiameterFromAbove(coreModule.moduleLowerDiameter, currentVScale); - - //total height of the part is determined by the sum of the heights of the modules at their current scale - float totalHeight = noseModule.moduleHeight; - totalHeight += coreModule.moduleHeight; - totalHeight += mountModule.moduleHeight; - - //position of each module is set such that the vertical center of the models is at part origin/COM - float pos = totalHeight * 0.5f;//abs top of model - pos -= noseModule.moduleHeight;//bottom of nose model - noseModule.setPosition(pos); - pos -= coreModule.moduleHeight * 0.5f;//center of 'core' model - coreModule.setPosition(pos); - pos -= coreModule.moduleHeight * 0.5f;//bottom of 'core' model - mountModule.setPosition(pos); - - //update actual model positions and scales - noseModule.updateModelMeshes(); - coreModule.updateModelMeshes(); - mountModule.updateModelMeshes(); - } - - /// - /// Update the cached modifiedMass field values. Used with stock mass modifier interface. - /// - private void updateMass() - { - modifiedMass = coreModule.moduleMass; - modifiedMass += noseModule.moduleMass; - modifiedMass += mountModule.moduleMass; - } - - /// - /// Update the cached modifiedCost field values. Used with stock cost modifier interface. - /// - private void updateCost() - { - modifiedCost = coreModule.moduleCost; - modifiedCost += noseModule.moduleCost; - modifiedCost += mountModule.moduleCost; - } - - /// - /// Updates all dimensions for the PAW and tooling. - /// - private void updateDimensions() - { - float noseMaxDiam, mountMaxDiam = 0.0f; - noseMaxDiam = Math.Max(noseModule.moduleLowerDiameter, noseModule.moduleUpperDiameter); - ROLLog.debug("currentMount: " + currentMount); - if (currentMount.Contains("Mount")) - { - ROLLog.debug("currentMount: " + currentMount); - mountMaxDiam = mountModule.moduleUpperDiameter; - } - else - mountMaxDiam = Math.Max(mountModule.moduleLowerDiameter, mountModule.moduleUpperDiameter); - - totalTankLength = getTotalHeight(); - ROLLog.debug("The Total Tank Length is: " + totalTankLength); - largestDiameter = Math.Max(currentDiameter, Math.Max(noseMaxDiam, mountMaxDiam)); - } - - /// - /// Update the attach nodes for the current model-module configuration. - /// The 'nose' module is responsible for updating of upper attach nodes, while the 'mount' module is responsible for lower attach nodes. - /// Also includes updating of 'interstage' nose/mount attach nodes. - /// Also includes updating of surface-attach node position. - /// Also includes updating of any parts that are surface attached to this part. - /// - /// - public void updateAttachNodes(bool userInput) - { - //update the standard top and bottom attach nodes, using the node position(s) defined in the nose and mount modules - noseModule.updateAttachNodeTop("top", userInput); - mountModule.updateAttachNodeBottom("bottom", userInput); - - //update the model-module specific attach nodes, using the per-module node definitions from the part - noseModule.updateAttachNodeBody(noseNodeNames, userInput); - coreModule.updateAttachNodeBody(coreNodeNames, userInput); - mountModule.updateAttachNodeBody(mountNodeNames, userInput); - - // Update the Nose Interstage Node - float y = noseModule.modulePosition + noseModule.moduleVerticalScale; - int nodeSize = Mathf.RoundToInt(coreModule.moduleDiameter) + 1; - Vector3 pos = new Vector3(0, y, 0); - ROLSelectableNodes.updateNodePosition(part, noseInterstageNode, pos); - AttachNode noseInterstage = part.FindAttachNode(noseInterstageNode); - if (noseInterstage != null) - { - ROLAttachNodeUtils.updateAttachNodePosition(part, noseInterstage, pos, Vector3.up, userInput, nodeSize); - } - - // Update the Mount Interstage Node - y = mountModule.modulePosition + mountModule.moduleVerticalScale; - nodeSize = Mathf.RoundToInt(coreModule.moduleDiameter) + 1; - pos = new Vector3(0, y, 0); - ROLSelectableNodes.updateNodePosition(part, mountInterstageNode, pos); - AttachNode mountInterstage = part.FindAttachNode(mountInterstageNode); - if (mountInterstage != null) - { - ROLAttachNodeUtils.updateAttachNodePosition(part, mountInterstage, pos, Vector3.down, userInput, nodeSize); - } - - - //update surface attach node position, part position, and any surface attached children - AttachNode surfaceNode = part.srfAttachNode; - if (surfaceNode != null) - { - coreModule.updateSurfaceAttachNode(surfaceNode, prevDiameter, userInput); - } - } - - /// - /// Return the total height of this part in its current configuration. This will be the distance from the bottom attach node to the top attach node, and may not include any 'extra' structure. TOOLING - /// - /// - private float getTotalHeight() - { - float totalHeight = noseModule.moduleHeight; - totalHeight += mountModule.moduleHeight; - ROLLog.debug("currentCore: " + currentCore); - if (currentCore.Contains("Booster")) - { - ROLLog.debug("currentCore: " + currentCore); - totalHeight += coreModule.moduleActualHeight; - } - else - totalHeight += coreModule.moduleHeight; - return totalHeight; - } - - /// - /// Return the topmost position in the models relative to the part's origin. - /// - /// - private float getPartTopY() - { - return getTotalHeight() * 0.5f; - } - - /// - /// Update the UI visibility for the currently available selections. - /// Will hide/remove UI fields for slots with only a single option (models, textures, layouts). - /// - private void updateAvailableVariants() - { - noseModule.updateSelections(); - coreModule.updateSelections(); - mountModule.updateSelections(); - } - - /// - /// Calls the generic ROT procedural drag-cube updating routines. Will update the drag cubes for whatever the current model state is. - /// - private void updateDragCubes() - { - ROLModInterop.onPartGeometryUpdate(part, true); - } - - /// - /// Return the root transform for the specified name. If does not exist, will create it and parent it to the parts' 'model' transform. - /// - /// - /// - /// - private Transform getRootTransform(string name) - { - Transform root = part.transform.ROLFindRecursive(name); - if (root != null) - { - GameObject.DestroyImmediate(root.gameObject); - root = null; - } - root = new GameObject(name).transform; - root.NestToParent(part.transform.ROLFindRecursive("model")); - return root; - } - - /// - /// Return the model-module corresponding to the input slot name. Valid slot names are: NOSE,UPPER,CORE,LOWER,MOUNT - /// - /// - /// - private ROLModelModule getModuleByName(string name) - { - switch (name) - { - case "NOSE": - return noseModule; - case "CORE": - return coreModule; - case "MOUNT": - return mountModule; - case "NONE": - return null; - default: - return null; - } - } - - #endregion ENDREGION - Custom Update Methods - - } - - /// - /// Data storage for a group of model definitions that share the same 'variant' type. Used by modular-part in variant-defined configurations. - /// - public class ModelDefinitionVariantSet - { - public readonly string variantName; - - public ModelDefinitionLayoutOptions[] definitions = new ModelDefinitionLayoutOptions[0]; - - public ModelDefinitionLayoutOptions this[int index] - { - get - { - if (index < 0) { index = 0; } - if (index >= definitions.Length) { index = definitions.Length - 1; } - return definitions[index]; - } - } - - public ModelDefinitionVariantSet(string name) - { - this.variantName = name; - } - - public void addModels(ModelDefinitionLayoutOptions[] defs) - { - List allDefs = new List(); - allDefs.AddRange(definitions); - allDefs.AddUniqueRange(defs); - definitions = allDefs.ToArray(); - } - - public int indexOf(ModelDefinitionLayoutOptions def) - { - return definitions.IndexOf(def); - } - - } - -} diff --git a/Source/ROTanks/Properties/AssemblyInfo.cs b/Source/ROTanks/Properties/AssemblyInfo.cs deleted file mode 100644 index ec9f62b..0000000 --- a/Source/ROTanks/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ROTanks")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ROTanks")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("1384d518-b1a1-44b2-98a5-7b7138d0050b")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Source/ROTanks/ROTanks.csproj b/Source/ROTanks/ROTanks.csproj deleted file mode 100644 index bdc03a3..0000000 --- a/Source/ROTanks/ROTanks.csproj +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Debug - AnyCPU - {1384D518-B1A1-44B2-98A5-7B7138D0050B} - Library - Properties - ROTanks - ROTanks - v3.5 - 512 - true - - - true - full - false - ..\..\GameData\ROTanks\Plugins\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - ..\..\GameData\ROTanks\Plugins\ - TRACE - prompt - 4 - - - - False - ..\..\..\..\KSP DLL\1.6.1\Assembly-CSharp.dll - False - - - False - ..\..\..\..\KSP DLL\1.6.1\ROLib.dll - False - - - - - False - ..\..\..\..\KSP DLL\1.6.1\TexturesUnlimited.dll - False - - - False - ..\..\..\..\KSP DLL\1.6.1\UnityEngine.dll - False - - - False - ..\..\..\..\KSP DLL\1.6.1\UnityEngine.UI.dll - False - - - - - - - - - \ No newline at end of file diff --git a/Source/ROTanks/ROTanks.sln b/Source/ROTanks/ROTanks.sln deleted file mode 100644 index da98c1a..0000000 --- a/Source/ROTanks/ROTanks.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28729.10 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ROTanks", "ROTanks.csproj", "{1384D518-B1A1-44B2-98A5-7B7138D0050B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1384D518-B1A1-44B2-98A5-7B7138D0050B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1384D518-B1A1-44B2-98A5-7B7138D0050B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1384D518-B1A1-44B2-98A5-7B7138D0050B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1384D518-B1A1-44B2-98A5-7B7138D0050B}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {4D2D686F-87E2-478F-8CC5-ED62F1B60296} - EndGlobalSection -EndGlobal