private void HourlyEventChanges(MedicalEvent anEvent) { foreach (Harm change in anEvent.GeneralHarm) { float wielkoscWplywu = change.Value * anEvent.Strength * BodyPartMechanics.BodyPartMultiplier(anEvent.Place); if (wielkoscWplywu <= -MINIMUM_WAZNEGO_ZDARZENIA && change.ResName == "Health") { ImportantEvents.Add(StringsTranslator.GetString("PowaznyWplyw") + anEvent.FriendlyName()); } _character.SetSkillValue(change.ResName, _character.getSkillValue(change.ResName) + wielkoscWplywu); } }
//obsluga zdarzen medycznych godzinowo public void OnHourPassed() { ImportantEvents.Clear(); List <MedicalEvent> allNewEvents = new List <MedicalEvent>(); //skumulowana lista nowych zdarzen medycznych List <MedicalEvent> eventsToBeDeleted = new List <MedicalEvent>(); //zdarzenia do usuniecia foreach (MedicalEvent anEvent in _currentEvents) { List <MedicalEvent> newEvent = HerbologyModuleManager.Instance.PreprocessMedicalEvent(anEvent); allNewEvents.AddRange(newEvent); //obsluzmy jeszcze witalnosc pacjenta anEvent.Strength = anEvent.Strength * (1 - _character.getSkillValue("Vitality") / 5000f) - 0.01f * (_character.getSkillValue("Vitality") / 50f); //oraz leczenie przedmiotami float treatment = GetHourTreatment(anEvent); anEvent.Strength -= 1f * treatment; anEvent.Intensity -= 0.5f * treatment; //obsluz wplyw zdarzenia na parametry ogolne HourlyEventChanges(anEvent); //smiertelnosc gwaltowna zdarzenia if ((float)anEvent["mortality"] > 0 && Random.Range(0f, 1f) < (1.5f * (float)anEvent["mortality"] * BodyPartMechanics.BodyPartMultiplier(anEvent.Place)) && Random.Range(0f, 100f) > _character.getSkillValue("Vitality") * 0.75f) { DeathReasons = string.Format("{0}", anEvent.FriendlyName()); _character.SetSkillValue("Zdrowie", -100); } //zdarzenie w wyniku przetworzenia moglo oslabnac do zera - do usuniecia if (anEvent.Strength <= (float)anEvent["min"]) { eventsToBeDeleted.Add(anEvent); } //zdarzenie jednorazowe bedzie usuniete po przetworzeniu if ((bool)anEvent["oneTimeEvent"]) { eventsToBeDeleted.Add(anEvent); } anEvent.Normalize(); } //efekty uboczne przedmiotow List <MedicalEvent> zdarzeniaUboczne = GetHourSideEffects(); _currentEvents.AddRange(zdarzeniaUboczne); _currentEvents.AddRange(allNewEvents); //wplyw na parametry ogolne od przedmiotow HourlyGeneralChangeOfItems(); //nowe zdarzenia powinny być osłabione o działanie aktualnych leków (daje to działanie zapobiegawcze) foreach (MedicalEvent anEvent in allNewEvents) { anEvent.Strength -= GetHourTreatment(anEvent); if (anEvent.Strength <= (float)anEvent["min"]) { _currentEvents.Remove(anEvent); } } //musimy jeszcze przejrzec liste aby polaczyc zdarzenia, ktore moga byc identyczne i dotyczyc tego samego miejsca (stworzone z dwoch roznych chorob) np. dwa zapalenia gardla redukuja sie do jednego mocniejszego for (int i = 0; i < _currentEvents.Count; i++) { for (int j = i + 1; j < _currentEvents.Count; j++) { if (_currentEvents[i].Type == _currentEvents[j].Type && (_currentEvents[i].Place & _currentEvents[j].Place) != 0) { //zdarzenie bedzie suma sil zdarzen i najwiekszym zaostrzeniem, a zdarzenie2 zostanie usuniete _currentEvents[i].Strength = _currentEvents[i].Strength + _currentEvents[j].Strength; _currentEvents[i].Intensity = _currentEvents[i].Intensity > _currentEvents[j].Intensity ? _currentEvents[i].Intensity : _currentEvents[j].Intensity; _currentEvents[i].Normalize(); eventsToBeDeleted.Add(_currentEvents[j]); } } } //obsluga amputacji foreach (MedicalEvent anEvent in _currentEvents) { if (anEvent.Type == "Amputacja" && !_amputatedPlaces.Contains(anEvent.Place)) { _amputatedPlaces.Add(anEvent.Place); } } foreach (MedicalEvent anEvent in _currentEvents) { if (_amputatedPlaces.Contains(anEvent.Place)) { eventsToBeDeleted.Add(anEvent); } } //usuniecie niepotrzebnych zdarzen foreach (MedicalEvent anEvent in eventsToBeDeleted) { _currentEvents.Remove(anEvent); } HourlyUseOfItems(); SortEvents(); }