Exemple #1
0
        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();
            }
        }
Exemple #2
0
        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));
                }
            }
        }
Exemple #3
0
        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));
                }
            }
        }
Exemple #4
0
        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();
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
        }