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