Example #1
0
        private void SwitchState()
        {
            switch (status)
            {
            case MedPodStatus.Idle:
                status = MedPodStatus.DiagnosisStarted;
                break;

            case MedPodStatus.DiagnosisStarted:
                status = MedPodStatus.DiagnosisFinished;
                break;

            case MedPodStatus.DiagnosisFinished:
                status = MedPodStatus.HealingStarted;
                break;

            case MedPodStatus.HealingStarted:
                status = MedPodStatus.HealingFinished;
                break;

            case MedPodStatus.HealingFinished:
                status = MedPodStatus.PatientDischarged;
                break;

            case MedPodStatus.PatientDischarged:
                status = MedPodStatus.Idle;
                break;

            default:
                status = MedPodStatus.Error;
                break;
            }
        }
Example #2
0
        public override void Tick()
        {
            base.Tick();

            if (!powerComp.PowerOn)
            {
                if (PatientPawn != null)
                {
                    if ((status == MedPodStatus.DiagnosisFinished) || (status == MedPodStatus.HealingStarted) || (status == MedPodStatus.HealingFinished))
                    {
                        // Wake patient up abruptly, as power was interrupted during treatment
                        WakePatient(PatientPawn, false);
                    }

                    if (status == MedPodStatus.PatientDischarged)
                    {
                        // Wake patient up normally, as treatment was already completed when power was interrupted
                        WakePatient(PatientPawn);
                    }
                }

                status = MedPodStatus.Idle;

                return;
            }

            powerComp.PowerOutput = -125f;

            if (this.IsHashIntervalTick(60))
            {
                if (PatientPawn != null)
                {
                    switch (status)
                    {
                    case MedPodStatus.Idle:
                        DiagnosingTicks = MaxDiagnosingTicks;
                        SwitchState();
                        break;

                    case MedPodStatus.DiagnosisFinished:
                        DiagnosePatient(PatientPawn);

                        if (patientTreatableHediffs.NullOrEmpty())
                        {
                            // Skip treatment if no treatable hediffs are found
                            status = MedPodStatus.PatientDischarged;
                        }
                        else
                        {
                            // Scale healing time for current hediff according to its (normalized) severity
                            // i.e. More severe hediffs take longer
                            HealingTicks = (int)Math.Ceiling(GetHediffNormalizedSeverity() * MaxHealingTicks);
                            SwitchState();
                        }
                        break;

                    case MedPodStatus.HealingFinished:
                        // Don't remove 'good' treatable Hediffs but instead treat them with 100% quality
                        if (!patientTreatableHediffs.First().def.isBad)
                        {
                            patientTreatableHediffs.First().Tended(1);
                        }
                        else
                        {
                            PatientPawn.health.hediffSet.hediffs.Remove(patientTreatableHediffs.First());
                        }

                        patientTreatableHediffs.RemoveAt(0);
                        if (!patientTreatableHediffs.NullOrEmpty())
                        {
                            // Scale healing time for current hediff according to its (normalized) severity
                            // i.e. More severe hediffs take longer
                            HealingTicks = (int)Math.Ceiling(GetHediffNormalizedSeverity() * MaxHealingTicks);
                            status       = MedPodStatus.HealingStarted;
                        }
                        else
                        {
                            SwitchState();
                        }
                        break;

                    case MedPodStatus.PatientDischarged:
                        WakePatient(PatientPawn);
                        SwitchState();
                        ProgressHealingTicks = 0;
                        TotalHealingTicks    = 0;
                        break;
                    }
                }
                else
                {
                    status = MedPodStatus.Idle;
                }
            }

            if (this.IsHashIntervalTick(2))
            {
                if (GantryMoving())
                {
                    if (gantryDirectionForwards)
                    {
                        gantryPositionPercentInt++;

                        if (gantryPositionPercentInt == 100)
                        {
                            gantryDirectionForwards = false;
                        }
                    }
                    else
                    {
                        gantryPositionPercentInt--;

                        if (gantryPositionPercentInt == 0)
                        {
                            gantryDirectionForwards = true;
                        }
                    }

                    if (wickSustainer == null)
                    {
                        StartWickSustainer();
                    }
                    else if (wickSustainer.Ended)
                    {
                        StartWickSustainer();
                    }
                    else
                    {
                        wickSustainer.Maintain();
                    }
                }
                else
                {
                    // Reset gantry
                    gantryPositionPercentInt = 0;
                    gantryDirectionForwards  = true;
                }
            }

            if (DiagnosingTicks > 0)
            {
                DiagnosingTicks--;
                powerComp.PowerOutput = -DiagnosingPowerConsumption;

                if (DiagnosingTicks == 0)
                {
                    SwitchState();
                }
            }

            if (HealingTicks > 0)
            {
                HealingTicks--;
                ProgressHealingTicks++;
                powerComp.PowerOutput = -HealingPowerConsumption;

                if (HealingTicks == 0)
                {
                    SwitchState();
                }
            }
        }
Example #3
0
        public override void Tick()
        {
            base.Tick();

            if (!powerComp.PowerOn)
            {
                if (PatientPawn != null)
                {
                    if ((status == MedPodStatus.DiagnosisFinished) || (status == MedPodStatus.HealingStarted) || (status == MedPodStatus.HealingFinished))
                    {
                        // Wake patient up abruptly, as power was interrupted during treatment
                        WakePatient(PatientPawn, false);
                    }

                    if (status == MedPodStatus.PatientDischarged)
                    {
                        // Wake patient up normally, as treatment was already completed when power was interrupted
                        WakePatient(PatientPawn);
                    }
                }

                status = MedPodStatus.Idle;

                return;
            }

            powerComp.PowerOutput = -powerComp.Props.basePowerConsumption;

            if (this.IsHashIntervalTick(60))
            {
                if (PatientPawn != null)
                {
                    PatientBodySizeScaledMaxDiagnosingTicks = (int)(MaxDiagnosingTicks * PatientPawn.BodySize);
                    PatientBodySizeScaledMaxHealingTicks    = (int)(MaxHealingTicks * PatientPawn.BodySize);

                    switch (status)
                    {
                    case MedPodStatus.Idle:
                        DiagnosingTicks = PatientBodySizeScaledMaxDiagnosingTicks;
                        if (PatientPawn.needs.food != null)
                        {
                            patientSavedFoodNeed = PatientPawn.needs.food.CurLevelPercentage;
                        }
                        SwitchState();
                        break;

                    case MedPodStatus.DiagnosisFinished:
                        DiagnosePatient(PatientPawn);

                        if (patientTreatableHediffs.NullOrEmpty())
                        {
                            // Skip treatment if no treatable hediffs are found
                            status = MedPodStatus.PatientDischarged;
                        }
                        else
                        {
                            // Scale healing time for current hediff according to its (normalized) severity and patient body size
                            // i.e. More severe hediffs take longer, bigger pawns also take longer
                            HealingTicks = (int)Math.Ceiling(GetHediffNormalizedSeverity() * PatientBodySizeScaledMaxHealingTicks);

                            SwitchState();
                        }
                        break;

                    case MedPodStatus.HealingFinished:
                        // Don't remove 'good' treatable Hediffs but instead treat them with 100% quality (unless the 'good' Hediff is whitelisted as always treatable)
                        if (!patientTreatableHediffs.First().def.isBad&& !AlwaysTreatableHediffs.Contains(patientTreatableHediffs.First().def))
                        {
                            patientTreatableHediffs.First().Tended(1);     // TODO - Replace with new method name once it no longer has a temporary name
                        }
                        else
                        {
                            PatientPawn.health.hediffSet.hediffs.Remove(patientTreatableHediffs.First());
                        }

                        patientTreatableHediffs.RemoveAt(0);
                        if (!patientTreatableHediffs.NullOrEmpty())
                        {
                            // Scale healing time for current hediff according to its (normalized) severity and patient body size
                            // i.e. More severe hediffs take longer, bigger pawns also take longer
                            HealingTicks = (int)Math.Ceiling(GetHediffNormalizedSeverity() * PatientBodySizeScaledMaxHealingTicks);

                            status = MedPodStatus.HealingStarted;
                        }
                        else
                        {
                            SwitchState();
                        }
                        break;

                    case MedPodStatus.PatientDischarged:
                        WakePatient(PatientPawn);
                        SwitchState();
                        ProgressHealingTicks = 0;
                        TotalHealingTicks    = 0;
                        break;
                    }
                }
                else
                {
                    status = MedPodStatus.Idle;
                    ProgressHealingTicks = 0;
                    TotalHealingTicks    = 0;
                    Aborted = false;
                }
            }

            if (this.IsHashIntervalTick(2))
            {
                if (GantryMoving())
                {
                    if (gantryDirectionForwards)
                    {
                        gantryPositionPercentInt++;

                        if (gantryPositionPercentInt == 100)
                        {
                            gantryDirectionForwards = false;
                        }
                    }
                    else
                    {
                        gantryPositionPercentInt--;

                        if (gantryPositionPercentInt == 0)
                        {
                            gantryDirectionForwards = true;
                        }
                    }

                    if (wickSustainer == null)
                    {
                        StartWickSustainer();
                    }
                    else if (wickSustainer.Ended)
                    {
                        StartWickSustainer();
                    }
                    else
                    {
                        wickSustainer.Maintain();
                    }
                }
                else
                {
                    // Reset gantry
                    gantryPositionPercentInt = 0;
                    gantryDirectionForwards  = true;
                }
            }

            if (DiagnosingTicks > 0)
            {
                DiagnosingTicks--;
                powerComp.PowerOutput = -DiagnosingPowerConsumption;
                if (PatientPawn != null && PatientPawn.needs.food != null)
                {
                    PatientPawn.needs.food.CurLevelPercentage = 1f;
                }

                if (DiagnosingTicks == 0)
                {
                    SwitchState();
                }
            }

            if (HealingTicks > 0)
            {
                HealingTicks--;
                ProgressHealingTicks++;
                powerComp.PowerOutput = -HealingPowerConsumption;
                if (PatientPawn != null && PatientPawn.needs.food != null)
                {
                    PatientPawn.needs.food.CurLevelPercentage = 1f;
                }

                if (HealingTicks == 0)
                {
                    SwitchState();
                }
            }
        }