/// <summary> /// Check if we should trigger due symptoms /// </summary> private void CheckSymptomOccurence(SicknessAffliction sicknessAffliction, LivingHealthMasterBase playerHealth) { Sickness sickness = sicknessAffliction.Sickness; // Loop on each reached stage to see if a symptom should trigger for (int stage = 0; stage < sickness.SicknessStages.Count; stage++) { if (stage < sicknessAffliction.CurrentStage) { float?stageNextOccurence = sicknessAffliction.GetStageNextOccurence(stage); if ((stageNextOccurence != null) && (startedTime > stageNextOccurence)) { SicknessStage sicknessStage = sickness.SicknessStages[stage]; // Since many symptoms need to be called within the main thread, we invoke it sicknessManager.blockingCollectionSymptoms.Add(new SymptomManifestation(sicknessAffliction, stage, playerHealth)); if (sicknessStage.RepeatSymptom) { ScheduleStageSymptom(sicknessAffliction, stage); } } } } }
/// <summary> /// Schedule the next occurence of the symptom of a particular stage /// </summary> /// <param name="sicknessAffliction">A sickness afflicting a player</param> /// <param name="stage">The stage for which the symptom must be scheduled</param> private void ScheduleStageSymptom(SicknessAffliction sicknessAffliction, int stage) { Sickness sickness = sicknessAffliction.Sickness; SicknessStage sicknessStage = sickness.SicknessStages[stage]; if (sicknessStage.RepeatMaxDelay < sicknessStage.RepeatMinDelay) { Logger.LogError($"Sickness: {sickness.SicknessName}. Repeatable sickness symptoms should always have a RepeatMaxDelay ({sicknessStage.RepeatMaxDelay}) >= RepeatMinDelay ({sicknessStage.RepeatMinDelay})", Category.Health); return; } if (sicknessStage.RepeatMinDelay < 5) { Logger.LogError($"Sickness: {sickness.SicknessName}. Repeatable sickness symptoms should have a RepeatMinDelay ({sicknessStage.RepeatMinDelay}) >= 5. Think of the server performance.", Category.Health); return; } sicknessAffliction.ScheduleStageNextOccurence(stage, startedTime + random.Next((int)sicknessStage.RepeatMinDelay, (int)sicknessStage.RepeatMaxDelay)); }