protected override void OnUpdate()
        {
            base.OnUpdate();

            float partCurrentFlightData;
            float newFlightData;

            TestFlightPartData partData = TestFlightUtil.GetPartDataForPart(partName);

            if (partData == null)
            {
                return;
            }

            if (Planetarium.GetUniversalTime() - lastUpdate > 1.0f)
            {
                partCurrentFlightData = float.Parse(partData.GetValue("flightData"));
                newFlightData         = partCurrentFlightData - lastData;
                lastData   = partCurrentFlightData;
                lastUpdate = Planetarium.GetUniversalTime();

                if (ReadyToComplete())
                {
                    flightData = flightData + newFlightData;
                    titleTracker.UpdateContractWindow(GetTitle());
                }
            }
        }
 protected void OnContractAccepted(Contract contract)
 {
     if (contract == Root)
     {
         SetState(ParameterState.Incomplete);
         flightData = 0;
         TestFlightPartData partData = TestFlightUtil.GetPartDataForPart(partName);
         if (partData != null)
         {
             lastData = float.Parse(partData.GetValue("flightData"));
         }
     }
 }
 public string SelectPart(string partQuery)
 {
     // Part can be specified directly wth a part name, or through a query expression to dynamically select a part at runtime
     // Lists of parts to choose from can be specified by a comma seperated list
     // the + character prepended means choose the part from the list with the most data
     // the - character prepended means choose the part from the list with the least data
     // the ! character prepended means choose the first part from the list with no data
     // The + and - options can also be used without a list, in which case they mean simply choose the part with the most or least data of all parts
     // If no operator is specified, then a random part from the list is chosen
     if (partQuery.Contains(","))
     {
         // we have a list
         if (partQuery[0] == '+')
         {
             string             newQuery = partQuery.Substring(1);
             float              maxData  = 0f;
             string             maxPart  = "";
             TestFlightPartData partData = null;
             string[]           parts    = newQuery.Split(new char[1] {
                 ','
             });
             foreach (string partName in parts)
             {
                 partData = TestFlightUtil.GetPartDataForPart(partName);
                 if (partData == null)
                 {
                     continue;
                 }
                 float partFlightData = float.Parse(partData.GetValue("flightData"));
                 if (partFlightData > maxData)
                 {
                     maxData = partFlightData;
                     maxPart = partData.PartName;
                 }
             }
             return(maxPart);
         }
         else if (partQuery[0] == '-')
         {
             string             newQuery = partQuery.Substring(1);
             float              minData  = float.MaxValue;
             string             minPart  = "";
             TestFlightPartData partData = null;
             string[]           parts    = newQuery.Split(new char[1] {
                 ','
             });
             foreach (string partName in parts)
             {
                 partData = TestFlightUtil.GetPartDataForPart(partName);
                 if (partData == null)
                 {
                     continue;
                 }
                 float partFlightData = float.Parse(partData.GetValue("flightData"));
                 if (partFlightData < minData)
                 {
                     minData = partFlightData;
                     minPart = partData.PartName;
                 }
             }
             return(minPart);
         }
         else if (partQuery[0] == '!')
         {
             return(TestFlightUtil.PartWithNoData(partQuery.Substring(1)));
         }
         else
         {
             // TODO not yet implemented
             return("");
         }
     }
     else
     {
         // no list, so this is either a direct part name, or a simple +/- operator
         if (partQuery == "+")
         {
             return(TestFlightUtil.PartWithMostData());
         }
         else if (partQuery == "-")
         {
             return(TestFlightUtil.PartWithLeastData());
         }
         else
         {
             TestFlightPartData partData = TestFlightUtil.GetPartDataForPart(partQuery);
             if (partData == null)
             {
                 return("");
             }
             return(partQuery);
         }
     }
 }