Exemplo n.º 1
0
        public DiseaseStage GetActiveStage(DateTime currentWorldTime)
        {
            var n = 0;

            DiseaseStage foundStage = null;

            foreach (var stage in Disease.Stages)
            {
                if (currentWorldTime >= stage.WillTriggerAt.Value && currentWorldTime <= stage.WillEndAt.Value)
                {
                    foundStage = stage;
                    break;
                }

                n++;
            }

            if (foundStage != null)
            {
                if (!_isDiseaseActivated)
                {
                    _isDiseaseActivated = true;
                    CheckForSelfHeal(foundStage, n);
                }
            }
            else
            {
                _isDiseaseActivated = false;
            }

            return(foundStage);
        }
Exemplo n.º 2
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);
            }
        }
        protected override Disease GetEntity(ModelBuilder builder)
        {
            Disease disease = GetDisease();

            builder.AddSourcePage(disease, GetSourcePage(), e => e.SourcePageId);
            builder.AddTraits(disease, GetTraits());

            DiseaseStage[] stages      = GetDiseaseStages().ToArray();
            Guid           currentGuid = disease.Id;

            for (int i = 0; i < stages.Length; i++)
            {
                currentGuid = currentGuid.Increment();

                DiseaseStage stage = stages[i];
                stage.Id        = currentGuid;
                stage.DiseaseId = disease.Id;
                stage.Stage     = i + 1;

                foreach (DiseaseStageEffect effect in stage.Effects)
                {
                    Type type = effect.GetType();
                    currentGuid           = currentGuid.Increment();
                    effect.Id             = currentGuid;
                    effect.DiseaseStageId = stage.Id;

                    builder.AddData(effect.GetType(), effect);
                }

                stage.Effects = new DiseaseStageEffect[] { };

                builder.AddData(stage);
            }

            return(disease);
        }
Exemplo n.º 4
0
 public StageBuilder()
 {
     _obj = new DiseaseStage();
 }
Exemplo n.º 5
0
 private void ComputeStageTiming(DateTime startTime, DiseaseStage stage)
 {
     stage.WillTriggerAt       = startTime;
     stage.VitalsTargetSeconds = (float)(stage.TargetVitalsTime.HasValue ? stage.TargetVitalsTime.Value.TotalSeconds : stage.StageDuration.TotalSeconds);
     stage.WillEndAt           = startTime + stage.StageDuration;
 }