예제 #1
0
        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;
                    }
                }
            }
        }
예제 #2
0
        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();
        }
예제 #3
0
        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;
                }
            }
        }