private void paljba(Strana strana, Dizajn.Zbir <Oruzje> zbir, PopisMeta popisMeta, int pozicijaNapadaca) { Borac meta = null; double vjerotanostPogotka = 1; Pozicije.EfektUdaljenosti efektUdaljenosti = null; Oruzje oruzje = zbir.komponenta; for (int i = 0; i < zbir.kolicina; i++) { if (meta == null) { if (!popisMeta.jePrazan()) { meta = popisMeta.DajSlijedeci(zbir.komponenta.ciljanje, random.NextDouble()); efektUdaljenosti = Pozicije.EfektUdaljenosti.Izracunaj(Math.Abs(pozicijaNapadaca - Math.Round(meta.Pozicija))); double ometanje = Math.Max(meta.Dizajn.ometanje - strana.SnagaSenzora((int)Math.Round(-meta.Pozicija)), 0); vjerotanostPogotka = Vjerojatnost(oruzje.preciznost + efektUdaljenosti.Preciznost, meta.Dizajn.pokretljivost) * Math.Pow(sigmoidBase, ometanje); } else { break; } } if (vjerotanostPogotka > random.NextDouble()) { Dizajn dizajnMete = meta.Dizajn; double vatrenaMoc = oruzje.vatrenaMoc; if (meta.IzdrzljivostStita > 0) { double ulaznaSteta = Upijanje(vatrenaMoc, dizajnMete.debljinaStita); double ublazavanjeStete = Math.Max(0, dizajnMete.ublazavanjeSteteStita * Math.Sqrt(meta.IzdrzljivostStita / dizajnMete.izdrzljivostStita) - oruzje.penetracijaStita); double steta = Math.Min(meta.IzdrzljivostStita, Upijanje(ulaznaSteta, ublazavanjeStete)); meta.IzdrzljivostStita -= steta; vatrenaMoc -= steta; } meta.IzdrzljivostOklopa -= Upijanje(vatrenaMoc, dizajnMete.ublazavanjeSteteOklopa); if (meta.IzdrzljivostOklopa <= 0) { popisMeta.Ukloni(meta); meta = null; } } } }
private void fazaOporavka(Igrac igrac) { Strana igracevaStrana = strane[igrac]; igracevaStrana.PaliBorci.Clear(); foreach (Borac borac in igracevaStrana.Borci) { if (borac.IzdrzljivostOklopa > 0) { if (borac.Dizajn.izdrzljivostStita > 0) { borac.IzdrzljivostStita = Math.Min( borac.IzdrzljivostStita + borac.Dizajn.obnavljanjeStita, borac.Dizajn.izdrzljivostStita); } foreach (var strana in strane) { if (borac.Igrac != strana.Key) { double vjerojatnost = Vjerojatnost(strana.Value.SnagaSenzora((int)Math.Round(-borac.Pozicija)), borac.Dizajn.prikrivenost); borac.Vidljiv[strana.Key.id] = borac.Vidljiv[strana.Key.id] && ((vjerojatnost > random.NextDouble()) || (vjerojatnost > random.NextDouble())); } } if (Math.Abs(borac.CiljnaPozicija - borac.Pozicija) < borac.Dizajn.brzina) { borac.Pozicija = borac.CiljnaPozicija; } else { borac.Pozicija += borac.Dizajn.brzina * Math.Sign(borac.CiljnaPozicija - borac.Pozicija); } } else { igracevaStrana.Borci.PendRemove(borac); igracevaStrana.PaliBorci.Add(borac); } } igracevaStrana.Borci.ApplyRemove(); }
private void fazaPaljbe(Strana strana) { PopisMeta popisMeta = new PopisMeta(); foreach (var drugaStrana in strane.Values) { if (drugaStrana != strana) { foreach (var borac in drugaStrana.Borci) { if (borac.Vidljiv[strana.Igrac.id]) { popisMeta.Dodaj(borac); } } } } foreach (Borac borac in strana.Borci) { Dizajn dizajn = borac.Dizajn; if (dizajn.primarnoOruzje != null && dizajn.primarnaMisija == Misija.Tip.DirektnoOruzje) { paljba(strana, borac.Dizajn.primarnoOruzje, popisMeta, (int)Math.Round(borac.Pozicija)); } if (dizajn.sekundarnoOruzje != null && dizajn.sekundarnaMisija == Misija.Tip.DirektnoOruzje) { paljba(strana, borac.Dizajn.sekundarnoOruzje, popisMeta, (int)Math.Round(borac.Pozicija)); } if (popisMeta.jePrazan()) { break; } } }