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); }
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); }
public StageBuilder() { _obj = new DiseaseStage(); }
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; }