protected override void OnLoad(ConfigNode node)
 {
     base.OnLoad(node);
     readAnomalyConfig();
     chosenAnomaly = KourageousAnomaly.Load(node, anomalies);
 }
        internal static void readAnomalyConfig()
        {
            if (anomalies != null)
            {
                return;
            }

            anomalies = new Dictionary <String, KourageousAnomaly> ();
            ConfigNode config = GameDatabase.Instance.GetConfigNodes(KourageousTouristsAddOn.cfgRoot).FirstOrDefault();

            if (config == null)
            {
                return;
            }


            String distanceNode = config.GetValue(anomalyDistance);

            if (distanceNode != null)
            {
                try {
                    anomalyDiscoveryDistance = (float)Convert.ToDouble(distanceNode);
                }
                catch (Exception e) {
                    Log.error(e, "KourageousAnomalyContract readAnomalyConfig");
                }
            }

            ConfigNode[] nodes = config.GetNodes(anomalyCfgNode);
            foreach (ConfigNode node in nodes)
            {
                KourageousAnomaly anomaly = new KourageousAnomaly();

                Log.dbg("cfg node: {0}", node);
                String name = node.GetValue("name");
                if (name == null)
                {
                    continue;
                }
                anomaly.name = name;

                Log.dbg("anomaly name: {0}", name);
                String anomalyDescription = node.GetValue("anomalyDescription");
                if (anomalyDescription == null)
                {
                    continue;
                }
                anomaly.anomalyDescription = anomalyDescription;

                String contractDescription = node.GetValue("contractDescription");
                if (contractDescription == null)
                {
                    continue;
                }
                anomaly.contractDescription = contractDescription;

                String contractSynopsis = node.GetValue("contractSynopsis");
                if (contractSynopsis == null)
                {
                    continue;
                }
                anomaly.contractSynopsis = contractSynopsis;

                String bodyStr = node.GetValue("body");
                Log.dbg("anomaly body: {0}", bodyStr);

                foreach (CelestialBody b in FlightGlobals.Bodies)
                {
                    Log.dbg("list body name: {0}", b.name);
                    if (b.name.Equals(bodyStr))
                    {
                        anomaly.body = b;
                        break;
                    }
                }
                Log.dbg("anomaly body obj: {0}", anomaly.body == null);
                if (anomaly.body == null)
                {
                    continue;
                }

                String payoutModifierStr = node.GetValue("payoutModifier");
                Log.dbg("payout modifier str: {0}", payoutModifierStr);
                if (payoutModifierStr == null)
                {
                    continue;
                }
                float payoutModifier = 1.0f;
                try {
                    payoutModifier = (float)Convert.ToDouble(payoutModifierStr);
                    Log.dbg("payout modifier: {0}", payoutModifier);
                }
                catch (Exception e) {
                    Log.error(e, "readAnomalyConfig");
                }
                anomaly.payoutModifier = payoutModifier;

                anomalies.Add(bodyStr + ":" + name, anomaly);
                Log.dbg("added: {0}", bodyStr + ":" + name);
            }
        }
        protected override bool Generate()
        //System.Type contractType, Contract.ContractPrestige difficulty, int seed, State state)
        {
            Log.dbg("entered KourageousAnomallyContract Generate");

            targetBody = selectNextCelestialBody();
            if (targetBody == null)
            {
                return(false);
            }

            chosenAnomaly = chooseAnomaly(targetBody);
            if (chosenAnomaly == null)
            {
                return(false);
            }

            this.numTourists = UnityEngine.Random.Range(2, 5);
            Log.dbg("num tourists: {0}", numTourists);
            for (int i = 0; i < this.numTourists; i++)
            {
                ProtoCrewMember tourist = CrewGenerator.RandomCrewMemberPrototype(ProtoCrewMember.KerbalType.Tourist);

                this.tourists.Add(tourist);
                Log.dbg("generated: {0}", tourist.name);

                // TODO: Add support for gender for 1.3 build
                KerbalTourParameter itinerary = new KerbalTourParameter(tourist.name, tourist.gender);
                // TODO: Add difficulty multiplier
                itinerary.FundsCompletion      = 25000.0;
                itinerary.ReputationCompletion = 0.0f;
                itinerary.ReputationFailure    = 0.0f;
                itinerary.ScienceCompletion    = 0.0f;
                this.AddParameter(itinerary);

                KerbalDestinationParameter dstParameter = new KerbalDestinationParameter(
                    targetBody, FlightLog.EntryType.Land, tourist.name
                    );
                dstParameter.FundsCompletion      = 1000.0f;
                dstParameter.FundsFailure         = 0.0f;
                dstParameter.ReputationCompletion = 0.0f;
                dstParameter.ReputationFailure    = 0.0f;
                dstParameter.ScienceCompletion    = 0.0f;

                /*dstParameter.NestToParent (itinerary);
                 * dstParameter.CreateID ();
                 * dstParameter.AddParameter (new Contracts.Parameters.LandOnBody (targetBody));*/
                itinerary.AddParameter(dstParameter);


                KourageousAnomalyParameter anomalyParameter = new KourageousAnomalyParameter(
                    targetBody, tourist.name, chosenAnomaly.name, chosenAnomaly.anomalyDescription
                    );
                anomalyParameter.FundsCompletion      = 1300.0;
                anomalyParameter.FundsFailure         = 0.0;
                anomalyParameter.ReputationCompletion = 1.0f;
                anomalyParameter.ReputationFailure    = 1.0f;
                anomalyParameter.ScienceCompletion    = 0.0f;
                itinerary.AddParameter(anomalyParameter);
            }

            GenerateHashString();

            base.SetExpiry();
            base.SetScience(0.0f, targetBody);
            base.SetDeadlineYears(1, targetBody);
            base.SetReputation(2, 5, targetBody);
            base.SetFunds(
                3000 * chosenAnomaly.payoutModifier,
                9000 * chosenAnomaly.payoutModifier,
                21000 * chosenAnomaly.payoutModifier,
                targetBody);

            return(true);
        }