Exemplo n.º 1
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));
                }
            }
        }
Exemplo n.º 2
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();
            }
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
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);
        }