Example #1
0
        public override void Initialization()
        {
            base.Initialization();
            if (part.Modules.GetModule <ModuleControlSurface>())
            {
                part.RemoveModule(part.Modules.GetModule <ModuleControlSurface>());
            }

            OnVesselPartsChange += CalculateSurfaceFunctions;
            UpdateEvents();
            prevIsFlap    = isFlap;
            prevIsSpoiler = isSpoiler;
            if (!isFlap)
            {
                flapDeflectionLevel = 0;
            }


            justStarted = true;
            if (vessel)
            {
                lastReferenceTransform = vessel.ReferenceTransform;
            }

            if (!FARDebugValues.allowStructuralFailures)
            {
                return;
            }
            foreach (FARPartStressTemplate temp in FARAeroStress.StressTemplates)
            {
                if (temp.Name == "ctrlSurfStress")
                {
                    FARPartStressTemplate template = temp;
                    double maxForceMult            = Math.Pow(massMultiplier, FARAeroUtil.massStressPower);

                    YmaxForce  *= 1 - ctrlSurfFrac;
                    XZmaxForce *= 1 - ctrlSurfFrac;

                    double tmp = template.YMaxStress; //in MPa
                    tmp       *= S * ctrlSurfFrac * maxForceMult;
                    YmaxForce += tmp;

                    tmp         = template.XZMaxStress; //in MPa
                    tmp        *= S * ctrlSurfFrac * maxForceMult;
                    XZmaxForce += tmp;
                    break;
                }
            }
        }
        private static ConfigNode CreateAeroStressConfigNode(FARPartStressTemplate template, int index)
        {
            ConfigNode node = new ConfigNode("FARPartStressTemplate");

            node.AddValue("name", template.name);
            node.AddValue("YmaxStress", template.YmaxStress);
            node.AddValue("XZmaxStress", template.XZmaxStress);
            node.AddValue("requiresCrew", template.crewed.ToString());
            node.AddValue("isSpecialTemplate", template.isSpecialTemplate.ToString());

            ConfigNode res = new ConfigNode("Resources");

            res.AddValue("numReq", template.minNumResources);
            res.AddValue("rejectUnlistedResources", template.rejectUnlistedResources);

            //Make sure to update this whenever MM fixes how it goes through nodes and values
            int i = template.resources.Count - 1;

            foreach (string s in template.resources)
            {
                res.AddValue("res", s);
                i--;
            }
            i = template.excludeResources.Count - 1;
            foreach (string s in template.excludeResources)
            {
                res.AddValue("excludeRes", s);
                i++;
            }

            if (template.flowModeNeeded)
            {
                res.AddValue("flowMode", FARDebugOptions.FlowMode_str[(int)template.flowMode]);
            }
            else
            {
                res.AddValue("flowMode", "unneeded");
            }

            node.AddNode(res);

            return(node);
        }
        private void AeroStressTab(GUIStyle buttonStyle, GUIStyle boxStyle)
        {
            int i = 0;
            int removeIndex = -1;
            GUILayout.BeginHorizontal();
            GUILayout.BeginVertical(boxStyle);

            for (i = 0; i < FARAeroStress.StressTemplates.Count; i++)
            {
                GUILayout.BeginHorizontal();
                bool active = GUILayout.Toggle(i == aeroStressIndex, FARAeroStress.StressTemplates[i].name, buttonStyle, GUILayout.Width(150));
                if (GUILayout.Button("-", buttonStyle, GUILayout.Width(30), GUILayout.Height(30)))
                    removeIndex = i;
                GUILayout.EndHorizontal();
                if (active)
                    aeroStressIndex = i;
            }
            if (removeIndex >= 0)
            {
                FARAeroStress.StressTemplates.RemoveAt(removeIndex);
                if (aeroStressIndex == removeIndex)
                    aeroStressIndex--;

                removeIndex = -1;
            }
            if (GUILayout.Button("+", buttonStyle, GUILayout.Width(30), GUILayout.Height(30)))
            {
                FARPartStressTemplate newTemplate = new FARPartStressTemplate();
                newTemplate.XZmaxStress = 500;
                newTemplate.YmaxStress = 500;
                newTemplate.name = "default";
                newTemplate.isSpecialTemplate = false;
                newTemplate.minNumResources = 0;
                newTemplate.resources = new List<string>();
                newTemplate.excludeResources = new List<string>();
                newTemplate.rejectUnlistedResources = false;
                newTemplate.crewed = false;
                newTemplate.flowModeNeeded = false;
                newTemplate.flowMode = ResourceFlowMode.NO_FLOW;

                FARAeroStress.StressTemplates.Add(newTemplate);
            }

            GUILayout.EndVertical();
            GUILayout.BeginVertical(boxStyle);

            FARPartStressTemplate activeTemplate = FARAeroStress.StressTemplates[aeroStressIndex];

            string tmp;

            TextEntryField("Name:", 80, ref activeTemplate.name);

            tmp = activeTemplate.YmaxStress.ToString();
            TextEntryField("Axial (Y-axis) Max Stress:", 240, ref tmp);
            tmp = Regex.Replace(tmp, @"[^-?\d*\.?\d*]", "");
            activeTemplate.YmaxStress = Convert.ToDouble(tmp);

            tmp = activeTemplate.XZmaxStress.ToString();
            TextEntryField("Lateral (X,Z-axis) Max Stress:", 240, ref tmp);
            tmp = Regex.Replace(tmp, @"[^-?\d*\.?\d*]", "");
            activeTemplate.XZmaxStress = Convert.ToDouble(tmp);

            activeTemplate.crewed = GUILayout.Toggle(activeTemplate.crewed, "Requires Crew Compartment");

            tmp = activeTemplate.minNumResources.ToString();
            TextEntryField("Min Num Resources:", 80, ref tmp);
            tmp = Regex.Replace(tmp, @"[^-?\d*\.?\d*]", "");
            activeTemplate.minNumResources = Convert.ToInt32(tmp);

            GUILayout.Label("Req Resources:");
            StringListUpdateGUI(activeTemplate.resources, buttonStyle, boxStyle);

            GUILayout.Label("Exclude Resources:");
            StringListUpdateGUI(activeTemplate.excludeResources, buttonStyle, boxStyle);

            activeTemplate.rejectUnlistedResources = GUILayout.Toggle(activeTemplate.rejectUnlistedResources, "Reject Unlisted Res");

            activeTemplate.flowModeNeeded = GUILayout.Toggle(activeTemplate.flowModeNeeded, "Requires Specific Flow Mode");
            if (activeTemplate.flowModeNeeded)
            {
                activeTemplate.flowMode = (ResourceFlowMode)GUILayout.SelectionGrid((int)activeTemplate.flowMode, FlowMode_str, 1);
            }

            activeTemplate.isSpecialTemplate = GUILayout.Toggle(activeTemplate.isSpecialTemplate, "Special Hardcoded Usage");

            FARAeroStress.StressTemplates[aeroStressIndex] = activeTemplate;

            GUILayout.EndVertical();
            GUILayout.EndHorizontal();
        }
        private void AeroStressTab(GUIStyle buttonStyle, GUIStyle boxStyle)
        {
            int i           = 0;
            int removeIndex = -1;

            GUILayout.BeginHorizontal();
            GUILayout.BeginVertical(boxStyle);

            for (i = 0; i < FARAeroStress.StressTemplates.Count; i++)
            {
                GUILayout.BeginHorizontal();
                bool active = GUILayout.Toggle(i == aeroStressIndex, FARAeroStress.StressTemplates[i].name, buttonStyle, GUILayout.Width(150));
                if (GUILayout.Button("-", buttonStyle, GUILayout.Width(30), GUILayout.Height(30)))
                {
                    removeIndex = i;
                }
                GUILayout.EndHorizontal();
                if (active)
                {
                    aeroStressIndex = i;
                }
            }
            if (removeIndex >= 0)
            {
                FARAeroStress.StressTemplates.RemoveAt(removeIndex);
                if (aeroStressIndex == removeIndex)
                {
                    aeroStressIndex--;
                }

                removeIndex = -1;
            }
            if (GUILayout.Button("+", buttonStyle, GUILayout.Width(30), GUILayout.Height(30)))
            {
                FARPartStressTemplate newTemplate = new FARPartStressTemplate();
                newTemplate.XZmaxStress             = 500;
                newTemplate.YmaxStress              = 500;
                newTemplate.name                    = "default";
                newTemplate.isSpecialTemplate       = false;
                newTemplate.minNumResources         = 0;
                newTemplate.resources               = new List <string>();
                newTemplate.excludeResources        = new List <string>();
                newTemplate.rejectUnlistedResources = false;
                newTemplate.crewed                  = false;
                newTemplate.flowModeNeeded          = false;
                newTemplate.flowMode                = ResourceFlowMode.NO_FLOW;

                FARAeroStress.StressTemplates.Add(newTemplate);
            }

            GUILayout.EndVertical();
            GUILayout.BeginVertical(boxStyle);

            FARPartStressTemplate activeTemplate = FARAeroStress.StressTemplates[aeroStressIndex];

            string tmp;

            FARGUIUtils.TextEntryField("Name:", 80, ref activeTemplate.name);

            activeTemplate.YmaxStress  = FARGUIUtils.TextEntryForDouble("Axial (Y-axis) Max Stress:", 240, activeTemplate.YmaxStress);
            activeTemplate.XZmaxStress = FARGUIUtils.TextEntryForDouble("Lateral (X,Z-axis) Max Stress:", 240, activeTemplate.XZmaxStress);

            activeTemplate.crewed = GUILayout.Toggle(activeTemplate.crewed, "Requires Crew Compartment");

            tmp = activeTemplate.minNumResources.ToString();
            FARGUIUtils.TextEntryField("Min Num Resources:", 80, ref tmp);
            tmp = Regex.Replace(tmp, @"[^\d]", "");
            activeTemplate.minNumResources = Convert.ToInt32(tmp);

            GUILayout.Label("Req Resources:");
            StringListUpdateGUI(activeTemplate.resources, buttonStyle, boxStyle);

            GUILayout.Label("Exclude Resources:");
            StringListUpdateGUI(activeTemplate.excludeResources, buttonStyle, boxStyle);

            activeTemplate.rejectUnlistedResources = GUILayout.Toggle(activeTemplate.rejectUnlistedResources, "Reject Unlisted Res");

            activeTemplate.flowModeNeeded = GUILayout.Toggle(activeTemplate.flowModeNeeded, "Requires Specific Flow Mode");
            if (activeTemplate.flowModeNeeded)
            {
                activeTemplate.flowMode = (ResourceFlowMode)GUILayout.SelectionGrid((int)activeTemplate.flowMode, FlowMode_str, 1);
            }

            activeTemplate.isSpecialTemplate = GUILayout.Toggle(activeTemplate.isSpecialTemplate, "Special Hardcoded Usage");

            FARAeroStress.StressTemplates[aeroStressIndex] = activeTemplate;


            GUILayout.EndVertical();
            GUILayout.EndHorizontal();
        }
        public static FARPartStressTemplate DetermineStressTemplate(Part p)
        {
            FARPartStressTemplate template = StressTemplates[0];

            int  resCount = p.Resources.Count;
            bool crewed   = p.CrewCapacity > 0;

            foreach (FARPartStressTemplate candidate in StressTemplates)
            {
                if (candidate.isSpecialTemplate)
                {
                    continue;
                }
                if (candidate.crewed != crewed)
                {
                    continue;
                }

                if (resCount < candidate.minNumResources)
                {
                    continue;
                }

                if (candidate.rejectUnlistedResources)
                {
                    bool cont   = true;
                    int  numRes = 0;
                    foreach (PartResource res in p.Resources.list)
                    {
                        if (candidate.resources.Contains(res.info.name))
                        {
                            numRes++;
                            cont = false;
                        }
                        else
                        {
                            cont = true;
                            break;
                        }
                    }

                    if (cont || numRes < candidate.minNumResources)
                    {
                        continue;
                    }
                }
                else
                {
                    int numRes = 0;
                    foreach (PartResource res in p.Resources.list)
                    {
                        if (!candidate.excludeResources.Contains(res.info.name))
                        {
                            if (!candidate.flowModeNeeded || res.info.resourceFlowMode == candidate.flowMode)
                            {
                                numRes++;
                            }
                        }
                    }



                    if (numRes < candidate.minNumResources)
                    {
                        continue;
                    }
                }

                template = candidate;
            }


            return(template);
        }
        private static FARPartStressTemplate CreateFARPartStressTemplate(ConfigNode template)
        {
            FARPartStressTemplate parsedTemplate = new FARPartStressTemplate();

            parsedTemplate.XZmaxStress             = 500;
            parsedTemplate.YmaxStress              = 500;
            parsedTemplate.name                    = "default";
            parsedTemplate.isSpecialTemplate       = false;
            parsedTemplate.minNumResources         = 0;
            parsedTemplate.resources               = new List <string>();
            parsedTemplate.excludeResources        = new List <string>();
            parsedTemplate.rejectUnlistedResources = false;
            parsedTemplate.crewed                  = false;
            parsedTemplate.flowModeNeeded          = false;
            parsedTemplate.flowMode                = ResourceFlowMode.NO_FLOW;

            if (template.HasValue("name"))
            {
                parsedTemplate.name = template.GetValue("name");
            }
            if (template.HasValue("isSpecialTemplate"))
            {
                bool.TryParse(template.GetValue("isSpecialTemplate"), out parsedTemplate.isSpecialTemplate);
            }
            if (template.HasValue("YmaxStress"))
            {
                double.TryParse(template.GetValue("YmaxStress"), out parsedTemplate.YmaxStress);
            }
            if (template.HasValue("XZmaxStress"))
            {
                double.TryParse(template.GetValue("XZmaxStress"), out parsedTemplate.XZmaxStress);
            }
            if (template.HasValue("requiresCrew"))
            {
                bool.TryParse(template.GetValue("requiresCrew"), out parsedTemplate.crewed);
            }

            if (template.HasNode("Resources"))
            {
                ConfigNode resources = template.GetNode("Resources");
                if (resources.HasValue("numReq"))
                {
                    int.TryParse(resources.GetValue("numReq"), out parsedTemplate.minNumResources);
                }

                if (resources.HasValue("rejectUnlistedResources"))
                {
                    bool.TryParse(resources.GetValue("rejectUnlistedResources"), out parsedTemplate.rejectUnlistedResources);
                }

                if (resources.HasValue("flowMode"))
                {
                    parsedTemplate.flowModeNeeded = true;
                    string flowString = resources.GetValue("flowMode").ToLowerInvariant();

                    if (flowString == "all_vessel")
                    {
                        parsedTemplate.flowMode = ResourceFlowMode.ALL_VESSEL;
                    }
                    else if (flowString == "stack_priority_search")
                    {
                        parsedTemplate.flowMode = ResourceFlowMode.STACK_PRIORITY_SEARCH;
                    }
                    else if (flowString == "stage_priority_flow")
                    {
                        parsedTemplate.flowMode = ResourceFlowMode.STAGE_PRIORITY_FLOW;
                    }
                    else if (flowString == "no_flow")
                    {
                        parsedTemplate.flowMode = ResourceFlowMode.NO_FLOW;
                    }
                    else
                    {
                        parsedTemplate.flowModeNeeded = false;
                    }
                }

                PartResourceLibrary l = PartResourceLibrary.Instance;
                foreach (string resString in resources.GetValues("res"))
                {
                    if (l.resourceDefinitions.Contains(resString))
                    {
                        parsedTemplate.resources.Add(resString);
                    }
                }
                foreach (string resString in resources.GetValues("excludeRes"))
                {
                    if (l.resourceDefinitions.Contains(resString))
                    {
                        parsedTemplate.excludeResources.Add(resString);
                    }
                }
            }

            return(parsedTemplate);
        }
        private static FARPartStressTemplate CreateFARPartStressTemplate(ConfigNode template)
        {
            FARPartStressTemplate parsedTemplate = new FARPartStressTemplate();
            parsedTemplate.XZmaxStress = 500;
            parsedTemplate.YmaxStress = 500;
            parsedTemplate.name = "default";
            parsedTemplate.isSpecialTemplate = false;
            parsedTemplate.minNumResources = 0;
            parsedTemplate.resources = new List<string>();
            parsedTemplate.excludeResources = new List<string>();
            parsedTemplate.rejectUnlistedResources = false;
            parsedTemplate.crewed = false;
            parsedTemplate.flowModeNeeded = false;
            parsedTemplate.flowMode = ResourceFlowMode.NO_FLOW;

            if (template.HasValue("name"))
                parsedTemplate.name = template.GetValue("name");
            if (template.HasValue("isSpecialTemplate"))
                bool.TryParse(template.GetValue("isSpecialTemplate"), out parsedTemplate.isSpecialTemplate);
            if (template.HasValue("YmaxStress"))
                double.TryParse(template.GetValue("YmaxStress"), out parsedTemplate.YmaxStress);
            if (template.HasValue("XZmaxStress"))
                double.TryParse(template.GetValue("XZmaxStress"), out parsedTemplate.XZmaxStress);
            if (template.HasValue("requiresCrew"))
                bool.TryParse(template.GetValue("requiresCrew"), out parsedTemplate.crewed);

            if (template.HasNode("Resources"))
            {
                ConfigNode resources = template.GetNode("Resources");
                if(resources.HasValue("numReq"))
                    int.TryParse(resources.GetValue("numReq"), out parsedTemplate.minNumResources);

                if (resources.HasValue("rejectUnlistedResources"))
                    bool.TryParse(resources.GetValue("rejectUnlistedResources"), out parsedTemplate.rejectUnlistedResources);

                if (resources.HasValue("flowMode"))
                {
                    parsedTemplate.flowModeNeeded = true;
                    string flowString = resources.GetValue("flowMode").ToLowerInvariant();

                    if (flowString == "all_vessel")
                        parsedTemplate.flowMode = ResourceFlowMode.ALL_VESSEL;
                    else if (flowString == "stack_priority_search")
                        parsedTemplate.flowMode = ResourceFlowMode.STACK_PRIORITY_SEARCH;
                    else if (flowString == "stage_priority_flow")
                        parsedTemplate.flowMode = ResourceFlowMode.STAGE_PRIORITY_FLOW;
                    else if (flowString == "no_flow")
                        parsedTemplate.flowMode = ResourceFlowMode.NO_FLOW;
                    else
                        parsedTemplate.flowModeNeeded = false;
                }

                PartResourceLibrary l = PartResourceLibrary.Instance;
                foreach (string resString in resources.GetValues("res"))
                {
                    if (l.resourceDefinitions.Contains(resString))
                        parsedTemplate.resources.Add(resString);
                }
                foreach (string resString in resources.GetValues("excludeRes"))
                {
                    if (l.resourceDefinitions.Contains(resString))
                        parsedTemplate.excludeResources.Add(resString);
                }
            }

            return parsedTemplate;
        }
        private static ConfigNode CreateAeroStressConfigNode(FARPartStressTemplate template, int index)
        {
            ConfigNode node = new ConfigNode("FARPartStressTemplate");
            node.AddValue("name", template.name);
            node.AddValue("YmaxStress", template.YmaxStress);
            node.AddValue("XZmaxStress", template.XZmaxStress);
            node.AddValue("requiresCrew", template.crewed.ToString());
            node.AddValue("isSpecialTemplate", template.isSpecialTemplate.ToString());

            ConfigNode res = new ConfigNode("Resources");

            res.AddValue("numReq", template.minNumResources);
            res.AddValue("rejectUnlistedResources", template.rejectUnlistedResources);

            //Make sure to update this whenever MM fixes how it goes through nodes and values
            int i = template.resources.Count - 1;
            foreach (string s in template.resources)
            {
                res.AddValue("res", s);
                i--;
            }
            i = template.excludeResources.Count - 1;
            foreach (string s in template.excludeResources)
            {
                res.AddValue("excludeRes", s);
                i++;
            }

            if (template.flowModeNeeded)
                res.AddValue("flowMode", FARDebugOptions.FlowMode_str[(int)template.flowMode]);
            else
                res.AddValue("flowMode", "unneeded");

            node.AddNode(res);

            return node;
        }