public void Check(ActiveDisease disease, IGameController gc) { if (_consumedTimes.Count == 0) { return; } if (!disease.IsHealing) { return; } if (disease.IsSelfHealing) { return; } if (!gc.WorldTime.HasValue) { return; } if (disease.TreatedStage == null) { return; } var activeStage = disease.GetActiveStage(gc.WorldTime.Value); if (activeStage == null || activeStage.Level == DiseaseLevels.HealthyStage) { return; } var currentTime = gc.WorldTime.Value; var lastConsumedTime = _consumedTimes.Last(); var minutes = (currentTime - lastConsumedTime).TotalMinutes; if (minutes > _timingInGameMinutes + TimingDeltaBetweenAllowedConsuming) { //("You missed your treatment. You sick again."); if (!IsNodePart) { Events.NotifyAll(l => l.DiseaseStartProgressing(disease.Disease)); } Reset(); IsFinished = false; IsFailed = true; if (OnTreatmentFailed != null) { OnTreatmentFailed.Invoke(); } disease.InvertBack(); } }
private void CheckIfTreatmentFinished(ActiveDisease disease) { if (_inTimeConsumedCount == _countToConsume) { IsFinished = true; if (OnTreatmentEnded != null) { OnTreatmentEnded.Invoke(); } if (!IsNodePart) { disease.DeclareDiseaseTreated(); disease.Invert(); Events.NotifyAll(l => l.DiseaseHealed(disease.Disease)); } //("Disease treatment finished."); } else { //("Disease treatment continued. Healing."); if (!IsNodePart && IsStarted) { Events.NotifyAll(l => l.DiseaseHealingContinued(disease.Disease)); } } }
public void Check(ActiveDisease disease, IGameController gc) { var treatedStage = disease.TreatedStage; if (treatedStage == null) { treatedStage = disease.GetActiveStage(gc.WorldTime.Value); } if (treatedStage == null) { return; } var isTreatedLevel = treatedStage.Level == _treatedLevel; _treatments.ForEach(x => x.Check(disease, gc)); if (isTreatedLevel) { if (_treatments.Any(x => x.IsFailed)) { _treatments.ForEach(x => x.IsFailed = false); Events.NotifyAll(l => l.DiseaseStartProgressing(disease.Disease)); } } }
private void CreateAndLinkActiveDiseasesAndInjuries(Guid?worstDiseaseId, List <ActiveDiseaseSnippet> diseasesData, List <ActiveInjurySnippet> injuriesData) { ActiveInjuries.Clear(); ActiveDiseases.Clear(); var injuriesMapping = new Dictionary <Guid, Guid>(); // old id, new id foreach (var injData in injuriesData) { var inj = new ActiveInjury(_gc); inj.RestoreState(injData); injuriesMapping.Add(injData.InjuryId, inj.Injury.Id); ActiveInjuries.Add(inj); } var diseasesMapping = new Dictionary <Guid, Guid>(); // old id, new id foreach (var diseaseData in diseasesData) { var injKey = diseaseData.InjuryId.HasValue ? (injuriesMapping.ContainsKey(diseaseData.InjuryId.Value) ? injuriesMapping[diseaseData.InjuryId.Value] : (Guid?)null) : (Guid?)null; var linkedInj = injKey.HasValue ? ActiveInjuries.FirstOrDefault(x => x.Injury.Id == injKey.Value) : null; var disease = new ActiveDisease(_gc, linkedInj); disease.RestoreState(diseaseData); diseasesMapping.Add(diseaseData.DiseaseId, disease.Disease.Id); ActiveDiseases.Add(disease); } var diseaseKey = worstDiseaseId.HasValue ? (diseasesMapping.ContainsKey(worstDiseaseId.Value) ? diseasesMapping[worstDiseaseId.Value] : (Guid?)null) : (Guid?)null; var worstDisease = diseaseKey.HasValue ? ActiveDiseases.FirstOrDefault(x => x.Disease.Id == diseaseKey.Value) : null; WorstDisease = worstDisease?.Disease; injuriesMapping.Clear(); diseasesMapping.Clear(); }
public bool OnItemConsumed(IGameController gc, InventoryConsumableItemBase consumable, ActiveDisease disease) { if (IsFinished) { return(false); } if (!gc.WorldTime.HasValue) { return(false); } if (disease.IsSelfHealing) { return(false); } var treatedStage = disease.TreatedStage; if (treatedStage == null) { treatedStage = disease.GetActiveStage(gc.WorldTime.Value); } if (treatedStage == null) { return(false); } var isTreatedLevel = treatedStage.Level == _treatedLevel; if (_consumables.Items.Contains(consumable.Name)) { var currentTime = gc.WorldTime.Value; if (_consumedTimes.Count == 0) { // First consume _inTimeConsumedCount++; _consumedTimes.Add(currentTime); if (isTreatedLevel) { IsFinished = false; CheckIfTreatmentFinished(disease); if (OnTreatmentStarted != null) { OnTreatmentStarted.Invoke(); } //("Disease consumables treatment started."); IsStarted = true; if (!IsNodePart && !IsFinished) { //("Overall disease treatment started."); Events.NotifyAll(l => l.DiseaseTreatmentStarted(disease.Disease)); // We're starting to heal disease.Invert(); } } } else { IsFinished = false; var lastTime = _consumedTimes.Last(); var minutes = (currentTime - lastTime).TotalMinutes; if (minutes <= _timingInGameMinutes + TimingDeltaBetweenAllowedConsuming && minutes >= _timingInGameMinutes - TimingDeltaBetweenAllowedConsuming) { _inTimeConsumedCount++; _consumedTimes.Add(currentTime); if (isTreatedLevel) { CheckIfTreatmentFinished(disease); } } } return(true); } return(false); }
public bool OnApplianceTaken(IGameController gc, ApplianceInfo applianceInfo, ActiveDisease disease) { var treatedStage = disease.TreatedStage; if (treatedStage == null) { treatedStage = disease.GetActiveStage(gc.WorldTime.Value); } if (treatedStage == null) { return(false); } var isTreatedLevel = treatedStage.Level == _treatedLevel; var isApplied = _treatments.Any(treatment => treatment.OnApplianceTaken(gc, applianceInfo, disease)); if (isTreatedLevel) { if (_treatments.All(x => x.IsFinished)) { _isOverallHealingStarted = true; disease.Invert(); disease.DeclareDiseaseTreated(); Events.NotifyAll(l => l.DiseaseHealed(disease.Disease)); return(true); } if (_treatments.All(x => x.IsStarted) && !_isOverallHealingStarted) { _isOverallHealingStarted = true; disease.Invert(); Events.NotifyAll(l => l.DiseaseTreatmentStarted(disease.Disease)); return(true); } if (isApplied && _isOverallHealingStarted) { Events.NotifyAll(l => l.DiseaseHealingContinued(disease.Disease)); } } return(isApplied); }
public bool OnItemConsumed(IGameController gc, InventoryConsumableItemBase consumable, ActiveDisease disease) { if (disease.TreatedStage == null) { return(false); } var isApplied = _treatments.Any(treatment => treatment.OnItemConsumed(gc, consumable, disease)); var isTreatedLevel = disease.TreatedStage.Level == _treatedLevel; if (isTreatedLevel) { if (_treatments.All(x => x.IsFinished)) { _isOverallHealingStarted = true; disease.Invert(); disease.DeclareDiseaseTreated(); Events.NotifyAll(l => l.DiseaseHealed(disease.Disease)); return(true); } if (_treatments.All(x => x.IsStarted) && !_isOverallHealingStarted) { _isOverallHealingStarted = true; disease.Invert(); Events.NotifyAll(l => l.DiseaseTreatmentStarted(disease.Disease)); return(true); } if (isApplied && _isOverallHealingStarted) { Events.NotifyAll(l => l.DiseaseHealingContinued(disease.Disease)); } } return(isApplied); }