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; } }
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(); } } }
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(); } } }