private void CheckForSelfHeal(DiseaseStage stage, int stageIndex) { if (stage.SelfHealChance.WillHappen()) { //(Disease.Name + " will self-heal"); _isSelfHealActive = true; var symtomesToRemove = new List <DiseaseStage>(); // Let's work with chain copy to avoid strange behavior var chainCopy = Disease.Stages.ToList(); // Remove all stages next to the one that is marked as self-healing for (var i = stageIndex + 1; i < chainCopy.Count; i++) { symtomesToRemove.Add(chainCopy[i]); } symtomesToRemove.ForEach(s => chainCopy.Remove(s)); symtomesToRemove.Clear(); // Adding heal disease stage var healStage = HealthyStageFactory.Get(DiseaseLevels.HealthyStage, Helpers.RollDice(15, 65)); // Compute timing healStage.WillTriggerAt = stage.WillEndAt; healStage.VitalsTargetSeconds = (int)healStage.StageDuration.TotalSeconds; healStage.WillEndAt = healStage.WillTriggerAt + healStage.StageDuration; // Add healthy stage chainCopy.Add(healStage); // Swap active disease chains Disease.SwapChain(chainCopy); } }
public void Invert() { if (_isSelfHealActive) { return; } if (_isChainInverted) { return; } _isChainInverted = true; // Get the active stage var activeStage = GetActiveStage(_gc.WorldTime.Value); if (activeStage == null) { _isChainInverted = false; return; } // Treatment is started TreatedStage = activeStage; // Re-calculate disease begin time so that our current disease state will appear unchanged after time inverse var startCounting = false; var timeOffset = TimeSpan.FromSeconds(0); var healthState = _gc.Health.Status; // Let's work with chain copy to avoid strange behavior var chainCopy = Disease.Stages.ToList(); // Get time offset that equals the sum of durations of all the stages after the active one foreach (var stage in chainCopy) { if (stage.Level == DiseaseLevels.Critical) { _changedCritialStage = new ChangedVitalsInfo { Level = DiseaseLevels.Critical, InitialStageDuration = stage.StageDuration }; stage.StageDuration = TimeSpan.FromMinutes(1); } if (stage.Level == activeStage.Level) { _changedVitals = new ChangedVitalsInfo { Level = stage.Level, InitialStageDuration = stage.StageDuration }; if (stage.Level != DiseaseLevels.Critical) { stage.StageDuration = TimeSpan.FromMinutes(Helpers.RollDice(7, 14)); } } if (startCounting) { timeOffset += stage.StageDuration; } if (stage == activeStage) { startCounting = true; } } // New disease start time is a current time minus stages offset var timeOverall = _gc.WorldTime.Value.AddMinutes(-1) - timeOffset; DiseaseStartTime = timeOverall; // Reverse the chain chainCopy.Reverse(); // Add healthy stage chainCopy.Add(HealthyStageFactory.Get(DiseaseLevels.HealthyStage, (int)Disease.Stages.First().StageDuration.TotalHours)); // Recompute timing for all stages foreach (var stage in chainCopy) { ComputeStageTiming(timeOverall, stage); if (stage.Level == activeStage.Level) { _changedVitals.InitialBloodPressureBottom = stage.TargetBloodPressureBottom; _changedVitals.InitialBloodPressureTop = stage.TargetBloodPressureTop; _changedVitals.InitialBodyTemperature = stage.TargetBodyTemperature; _changedVitals.InitialHeartRate = stage.TargetHeartRate; stage.TargetBloodPressureTop = healthState.BloodPressureTop; stage.TargetBloodPressureBottom = healthState.BloodPressureBottom; stage.TargetBodyTemperature = healthState.BodyTemperature; stage.TargetHeartRate = healthState.HeartRate; } timeOverall = stage.WillEndAt.Value; } // Swap active disease chains Disease.SwapChain(chainCopy); }