private MedicalEvent UtworzZdarzenieMedyczneNaPodstawieWzorca(MedicalEvent newEvent, BodyPart newPlace, float sila, float zaostrzenie)
 {
     newEvent.Place     = newPlace;
     newEvent.Strength  = sila;
     newEvent.Intensity = zaostrzenie;
     return(newEvent);
 }
Beispiel #2
0
 public MedicalEvent(MedicalEvent wzorzec) : base(wzorzec)
 {
     Place       = BodyPart.Dowolna;
     Strength    = 0.5f;
     Intensity   = 0;
     GeneralHarm = new List <Harm>();
     foreach (Harm harm in wzorzec.GeneralHarm)
     {
         GeneralHarm.Add(new Harm(harm));
     }
 }
Beispiel #3
0
 public float GetHourTreatment(MedicalEvent zdarzenie)
 {
     foreach (Substance subst in ActiveSubstances)
     {
         foreach (Treatment leczenie in subst.TreatmentBySubstance)
         {
             if (leczenie.MinimalDose <= subst.Ammount && leczenie.EventType == zdarzenie.Type && (leczenie.WhereTreats & zdarzenie.Place) != 0 && DurationRemained > 0)
             {
                 return(leczenie.TreatmentValue / Duration);
             }
         }
     }
     return(0);
 }
        /*
         * //losuje choroby tak dlugo az wylosuje conajmniej rowna poziomTrudnosci / 2, ale nie mniej niz 100 losowan i nie wiecej niz 1000 losowan, a takze nie wiecej chorob niz MAKSIMUM_CHOROB
         * public void CreateRandomDiseases(bool krytyczne, int poziomTrudnosci)
         * {
         *  int minimalnaLiczbaZdarzen = poziomTrudnosci < 2 ? 1 : poziomTrudnosci / 2;
         *  int liczbaLosowan = 0;
         *  do
         *  {
         *      MedicalEvent zdarzenie = MenedzerZielarstwa.Instancja.UtworzPierwotneMedicalEvent();
         *      if (zdarzenie != null && (! krytyczne || zdarzenie.Sila >= 0.5f) && (krytyczne || zdarzenie.Sila <= 0.5f))
         *          AddNewEvent(zdarzenie);
         *      liczbaLosowan++;
         *  } while (_currentEvents.Count < KonfiguratorGry.MaksimumChorobPacjenta && _currentEvents.Count < minimalnaLiczbaZdarzen && (liczbaLosowan < 100 || (liczbaLosowan < 1000 && _currentEvents.Count == 0)));
         *  SortujZdarzenia();
         *  if (krytyczne)
         *  {
         *      LicznikOczekiwania = -1;
         *      _pacjentLezacy = true;
         *  }
         *  else
         *  {
         *      LicznikOczekiwania = KonfiguratorGry.MaksimumOczekiwaniaPacjenta;
         *      _pacjentLezacy = false;
         *  }
         * }
         */

        /*
         * //tworzy nowe, losowe pierwotne zdarzenie medyczne (nowa chorobe), poniewaz bierze pod uwage prawdopodobienstwo zajscia chorob, moze zwrocic null oznaczajacy ze zadna nie zostala wylosowana
         * public ZdarzenieMedyczne UtworzPierwotneZdarzenieMedyczne()
         * {
         *  SzansaNaZdarzenie wylosowaneZdarzenie = null;
         *  foreach (SzansaNaZdarzenie szansa in _wzorceChorobPierwotnych)
         *      if (Random.Range(0, 1f) < szansa.Prawdopodobienstwo)
         *          wylosowaneZdarzenie = szansa;
         *  if (wylosowaneZdarzenie != null)
         *  {
         *      float noweZaostrzenie = Random.Range(0.05f, 0.5f);
         *      ZdarzenieMedyczne noweZdarzenie = UtworzZdarzenieMedyczneNaPodstawieSzansy(wylosowaneZdarzenie, wylosowaneZdarzenie.LokalizacjaNastepna, 0, noweZaostrzenie);
         *      noweZdarzenie.Sila = Random.Range(noweZdarzenie.MinimalnaSila + (noweZdarzenie.MinimalnaSila < 0.1f ? 0.1f : 0), noweZdarzenie.MaksymalnaSila);
         *
         *      return noweZdarzenie;
         *  }
         *  else return null;
         * }*/

        // Na zlecenie pacjenta wykonuje cogodzinna zmiane stanu zdarzenia medycznego.
        // Zdarzenie podane jako parametr moze zmienic swoj status, jesli jego sila spadnie do 0 - powinno byc usuniete
        // Zwracana wartosc to lista nowych zdarzen wyniklych z rozwoju choroby (moze byc pusta)
        public List <MedicalEvent> PreprocessMedicalEvent(MedicalEvent anEvent)
        {
            //proba wylosowania nowego zdarzenia
            List <MedicalEvent> newEventList = new List <MedicalEvent>();

            foreach (BaseDataAddon szansa in _derivedDiseasesTemplates)
            {
                if (((BodyPart)szansa["lastPlace"] & anEvent.Place) != 0 && (string)szansa["last"] == anEvent.Type && Random.Range(0, 1f) < (float)szansa["prob"])
                {
                    MedicalEvent newEvent = CreateMedicalEventOfChance(szansa, (BodyPart)szansa["lastPlace"] == BodyPart.Dowolna ? anEvent.Place : (BodyPart)szansa["nextPlace"], anEvent.Strength, anEvent.Intensity);
                    newEventList.Add(newEvent);
                }
            }
            //zmiana stanu istniejacego zdarzenia
            anEvent.OnHourPassed();
            return(newEventList);
        }
 public void OnConfigure()
 {
     if (_medicalEventTemplates.Count == 0)
     {
         //zdarzenia
         XmlDataInfo eventsInfo = Utils.LoadXmlAssetFile("data/medical_events", "medical_events");
         if (eventsInfo != null)
         {
             foreach (XElement element in eventsInfo.MainNodeElements)
             {
                 MedicalEvent noweZdarzenie = new MedicalEvent();
                 noweZdarzenie.LoadData(eventsInfo, element);
                 _medicalEventTemplates.Add(noweZdarzenie.Type, noweZdarzenie);
             }
         }
         //substancje
         XmlDataInfo substancesInfo = Utils.LoadXmlAssetFile("data/medical_substances", "substances");
         if (substancesInfo != null)
         {
             foreach (XElement element in substancesInfo.MainNodeElements)
             {
                 Substance nowaSubstancja = new Substance();
                 nowaSubstancja.LoadData(substancesInfo, element);
                 _substancesTemplates.Add(nowaSubstancja);
             }
         }
         //przedmioty lecznicze (ladowanie substancji musi tu byc skonczone poniewaz sa one uzywane do tworzenia klonow substancji aktywnych w przedmiotach)
         XmlDataInfo medicalItemsInfo = Utils.LoadXmlAssetFile("data/medical_items", "medical_items");
         if (medicalItemsInfo != null)
         {
             foreach (XElement element in medicalItemsInfo.MainNodeElements)
             {
                 MedicalItemDataAddon nowyPrzedmiot = new MedicalItemDataAddon();
                 nowyPrzedmiot.LoadData(medicalItemsInfo, element, _substancesTemplates);
                 _medicalItemTemplates.Add(nowyPrzedmiot.Type, nowyPrzedmiot);
             }
         }
     }
     if (_primalDiseasesTemplates.Count == 0)
     {
         try
         {
             //szanse
             XmlDataInfo chancesInfo = Utils.LoadXmlAssetFile("data/medical_chances", "chances");
             if (chancesInfo != null)
             {
                 foreach (XElement element in chancesInfo.MainNodeElements)
                 {
                     BaseDataAddon nowaSzansaNaZdarzenie = new BaseDataAddon();
                     nowaSzansaNaZdarzenie.LoadData(chancesInfo, element);
                     if ((string)nowaSzansaNaZdarzenie["last"] == "")
                     {
                         _primalDiseasesTemplates.Add(nowaSzansaNaZdarzenie);
                     }
                     else
                     {
                         _derivedDiseasesTemplates.Add(nowaSzansaNaZdarzenie);
                     }
                 }
             }
         }
         catch (System.Exception wyjatek)
         {
             Debug.LogError("Ogólny wyjątek: " + wyjatek.Message);
         }
     }
 }
        //tworzy ZdarzenieMedyczne na podstawie szansy
        private MedicalEvent CreateMedicalEventOfChance(BaseDataAddon chance, BodyPart newPlace, float sila, float zaostrzenie)
        {
            MedicalEvent eventTemplate = FindMedicalEvent((string)chance["next"]);

            return(UtworzZdarzenieMedyczneNaPodstawieWzorca(eventTemplate, newPlace, sila, zaostrzenie));
        }
        //tworzy ZdarzenieMedyczne na podstawie typu
        public MedicalEvent CreateMedicalEventOfType(string eventName, BodyPart lokalizacjaZdarzenia, float sila, float zaostrzenie)
        {
            MedicalEvent eventTemplate = FindMedicalEvent(eventName);

            return(UtworzZdarzenieMedyczneNaPodstawieWzorca(eventTemplate, lokalizacjaZdarzenia, sila, zaostrzenie));
        }