private MedicalEvent UtworzZdarzenieMedyczneNaPodstawieWzorca(MedicalEvent newEvent, BodyPart newPlace, float sila, float zaostrzenie) { newEvent.Place = newPlace; newEvent.Strength = sila; newEvent.Intensity = zaostrzenie; return(newEvent); }
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)); } }
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)); }