public static ExperimentState FromStrimg(string stateString)
 {
     ExperimentState newState = new ExperimentState();
     StateEnum state = (StateEnum)int.Parse(stateString);
     newState.CurrentState = state;
     return newState;
 }
        public override void OnLoad(ConfigNode node)
        {
            base.OnLoad(node);
            if (node.HasValue("state"))
            {
                state = ExperimentState.FromStrimg(node.GetValue("state"));
            }
            else
            {
                state = new ExperimentState();
                state.CurrentState = ExperimentState.StateEnum.IDLE;
            }

            if (!node.HasValue("analysisTimeRemaining"))
            {
                analysisTimeRemaining = analysisTime;
            }

            if (!node.HasValue("lastMET"))
            {
                if (this.vessel != null)
                    lastMET = (float)this.vessel.missionTime;
            }

            // Load bare conditions if present
            if (node.HasNode("condition"))
            {
                LogFormatted_DebugOnly("RealScience: OnLoad: Loading conditions...");
                if (conditions == null)
                    conditions = new List<IScienceCondition>();
                conditions.Clear();
                foreach(ConfigNode conditionNode in node.GetNodes("condition"))
                {
                    if (conditionNode.HasValue("conditionType"))
                    {
                        string conditionType = conditionNode.GetValue("conditionType");
                        LogFormatted_DebugOnly("RealScience: OnLoad: Creating condition of type: " + conditionType);
                        RealScienceCondition newCondition = null;
                        System.Runtime.Remoting.ObjectHandle conditionObj = null;
                        conditionObj = Activator.CreateInstance(null, "RealScience.Conditions.RealScienceCondition_" + conditionType);
                        if (conditionObj == null)
                            LogFormatted_DebugOnly("RealScience: OnLoad: Failed to create Condition ObjectHandle");
                        else
                            newCondition = (RealScienceCondition)conditionObj.Unwrap();
                        if (newCondition != null)
                        {
                            newCondition.Load(conditionNode);
                            conditions.Add(newCondition);
                        }
                        else
                            LogFormatted_DebugOnly("RealScience: OnLoad: Failed to create Condition instance");
                    }
                }
            }
            // otherwise load groups
            else if (node.HasNode("conditionGroup"))
            {
                if (conditionGroups == null)
                    conditionGroups = new List<RealScienceConditionGroup>();
                conditionGroups.Clear();
                foreach(ConfigNode groupNode in node.GetNodes("conditionGroup"))
                {
                    RealScienceConditionGroup group = new RealScienceConditionGroup();
                    group.Load(groupNode);
                    conditionGroups.Add(group);
                }
            }
            loaded = true;
        }
 public override void Start()
 {
     // We need to re-load our data from the prefab
     Part prefab = this.part.partInfo.partPrefab;
     foreach (PartModule pm in prefab.Modules)
     {
         RealScienceExperiment modulePrefab = pm as RealScienceExperiment;
         if (modulePrefab != null)
         {
             experimentName = modulePrefab.experimentName;
             experimentTitle = modulePrefab.experimentTitle;
             description = modulePrefab.description;
             discipline = modulePrefab.discipline;
             requiredData = modulePrefab.requiredData;
             maximumData = modulePrefab.maximumData;
             analysisTime = modulePrefab.analysisTime;
             scienceValue = modulePrefab.scienceValue;
             scienceValuePerData = modulePrefab.scienceValuePerData;
             researchDataRate = modulePrefab.researchDataRate;
             multiFlight = modulePrefab.multiFlight;
             autoAnalyze = modulePrefab.autoAnalyze;
             autoTransmit = modulePrefab.autoTransmit;
             dataSize = modulePrefab.dataSize;
             dataPerPacket = modulePrefab.dataPerPacket;
             canFailAtAnyTime = modulePrefab.canFailAtAnyTime;
             transmitValue = modulePrefab.transmitValue;
             conditions = modulePrefab.conditions;
             conditionGroups = modulePrefab.conditionGroups;
         }
     }
     // In case OnLoad never happened, we need to properly intialize our values
     if (!loaded)
     {
         analysisTimeRemaining = analysisTime;
         lastMET = (float)this.vessel.missionTime;
         state = new ExperimentState();
         state.CurrentState = ExperimentState.StateEnum.IDLE;
     }
     if (transmitValue < 1f)
         GameEvents.onVesselSituationChange.Add(OnVesselSituationChange);
 }
        public EvalState Evaluate(Part part, float deltaTime, ExperimentState state)
        {
            if (groupType.ToLower() == "or")
            {
                foreach (IScienceCondition condition in conditions)
                {
                    EvalState eval = condition.Evaluate(part, deltaTime, state);
                    if (eval == EvalState.INVALID)
                    {
                        Debug.Log(String.Format("RealScience: Group: Evaluate: {0} is not valid", condition.Name));
                        continue;
                    }

                    if (eval == EvalState.VALID)
                    {
                        dataRateModifier *= condition.DataRateModifier;
                        maximumDataModifier *= condition.MaximumDataModifier;
                        maximumDataBonus += condition.MaximumDataBonus;
                        return EvalState.VALID;
                    }

                    return eval;
                }
                return EvalState.INVALID;
            }
            else
            {
                foreach (IScienceCondition condition in conditions)
                {
                    EvalState eval = condition.Evaluate(part, deltaTime, state);
                    if (eval == EvalState.VALID)
                    {
                        dataRateModifier *= condition.DataRateModifier;
                        maximumDataModifier *= condition.MaximumDataModifier;
                        maximumDataBonus += condition.MaximumDataBonus;
                    }
                    else if (eval == EvalState.INVALID)
                    {
                        Debug.Log(String.Format("RealScience: Group: Evaluate: {0} is not valid", condition.Name));
                        return eval;
                    }
                    else
                        return eval;
                }
                return EvalState.VALID;
            }
        }