コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }