public Dizajn naciniDizajn(Dictionary <string, double> varijable)
        {
            Trup      trup             = this.trup.naciniKomponentu(varijable);
            Oruzje    primarnoOruzje   = (this.primarnoOruzje != null) ? this.primarnoOruzje.naciniKomponentu(varijable) : null;
            Oruzje    sekundarnoOruzje = (this.sekundarnoOruzje != null) ? this.sekundarnoOruzje.naciniKomponentu(varijable) : null;
            Oklop     oklop            = Oklop.OklopInfo.NajboljiOklop(varijable);
            Stit      stit             = (this.stit != null) ? this.stit.naciniKomponentu(varijable, trup.VelicinaStita) : null;
            Senzor    senzor           = Senzor.SenzorInfo.NajboljiSenzor(varijable);
            Potisnici potisnici        = Potisnici.PotisnikInfo.NajboljiPotisnici(varijable);
            Reaktor   reaktor          = Reaktor.ReaktorInfo.NajboljiReaktor(varijable, trup.VelicinaReaktora);

            Dictionary <SpecijalnaOprema, int> specijalnaOprema = new Dictionary <SpecijalnaOprema, int>();

            foreach (SpecijalnaOprema.SpecijalnaOpremaInfo soi in this.specijalnaOprema.Keys)
            {
                specijalnaOprema.Add(soi.naciniKomponentu(varijable, trup.velicina), this.specijalnaOprema[soi]);
            }

            MZPogon mzPogon = null;

            if (this.mzPogon)
            {
                mzPogon = MZPogon.MZPogonInfo.NajboljiMZPogon(varijable, trup.VelicinaMZPogona);
            }

            return(new Dizajn(naziv, trup, primarnoOruzje, sekundarnoOruzje,
                              udioPrimarnogOruzja, oklop, stit, specijalnaOprema,
                              senzor, potisnici, mzPogon, reaktor, pozeljnaPozicija));
        }
Пример #2
0
 public Dizajn(string ime, Trup trup,
               Oruzje primarnoOruzje, Oruzje sekundarnoOruzje, double udioPrimarnogOruzja,
               Oklop oklop, Stit stit, Dictionary <SpecijalnaOprema, int> specijalnaOprema,
               Senzor senzor, Potisnici potisnici, MZPogon MZPogon, Reaktor reaktor, int pozeljnaPozicija)
     :
     this(SlijedeciId(), ime, trup, primarnoOruzje, sekundarnoOruzje,
          udioPrimarnogOruzja, oklop, stit, specijalnaOprema, senzor, potisnici,
          MZPogon, reaktor, pozeljnaPozicija)
 {
 }
Пример #3
0
        public void traziNadogradnju(Dictionary <string, double> varijable)
        {
            if (nadogradnja != null)
            {
                if (nadogradnja.nadogradnja != null)
                {
                    nadogradnja = nadogradnja.nadogradnja;
                }
            }
            else
            {
                bool nadogradiv = false;

                Trup      trup      = this.trup.info.naciniKomponentu(varijable);
                Oklop     oklop     = this.oklop.info.naciniKomponentu(varijable);;
                Senzor    senzor    = this.senzor.info.naciniKomponentu(varijable);
                Potisnici potisnici = this.potisnici.info.naciniKomponentu(varijable);
                Reaktor   reaktor   = this.reaktor.info.naciniKomponentu(varijable, trup.VelicinaReaktora);

                nadogradiv |= trup.nivo > this.trup.nivo;
                nadogradiv |= oklop.nivo > this.oklop.nivo;
                nadogradiv |= senzor.nivo > this.senzor.nivo;
                nadogradiv |= potisnici.nivo > this.potisnici.nivo;
                nadogradiv |= reaktor.nivo > this.reaktor.nivo;

                Oruzje primarnoOruzje = null;
                if (this.primarnoOruzje != null)
                {
                    primarnoOruzje = this.primarnoOruzje.komponenta.info.naciniKomponentu(varijable);
                    nadogradiv    |= primarnoOruzje.nivo > this.primarnoOruzje.komponenta.nivo;
                }

                Oruzje sekundarnoOruzje = null;
                if (this.sekundarnoOruzje != null)
                {
                    sekundarnoOruzje = this.sekundarnoOruzje.komponenta.info.naciniKomponentu(varijable);
                    nadogradiv      |= sekundarnoOruzje.nivo > this.sekundarnoOruzje.komponenta.nivo;
                }

                Stit stit = null;
                if (this.stit != null)
                {
                    stit        = this.stit.info.naciniKomponentu(varijable, trup.VelicinaStita);
                    nadogradiv |= stit.nivo > this.stit.nivo;
                }

                MZPogon MZPogon = null;
                if (this.MZPogon != null)
                {
                    MZPogon     = this.MZPogon.info.naciniKomponentu(varijable, trup.VelicinaMZPogona);
                    nadogradiv |= MZPogon.nivo > this.MZPogon.nivo;
                }

                Dictionary <SpecijalnaOprema, int> specijalnaOprema = new Dictionary <SpecijalnaOprema, int>();
                foreach (KeyValuePair <SpecijalnaOprema, int> par in this.specijalnaOprema)
                {
                    SpecijalnaOprema so = par.Key.info.naciniKomponentu(varijable, trup.velicina);
                    specijalnaOprema.Add(so, par.Value);
                    nadogradiv |= so.nivo > par.Key.nivo;
                }

                if (nadogradiv)
                {
                    nadogradnja = new Dizajn(ime, trup, primarnoOruzje, sekundarnoOruzje,
                                             udioPrimarneMisije, oklop, stit, specijalnaOprema, senzor, potisnici,
                                             MZPogon, reaktor, pozeljnaPozicija);
                }
            }
        }
Пример #4
0
        private Dizajn(int id, string ime, Trup trup,
                       Oruzje primarnoOruzje, Oruzje sekundarnoOruzje, double udioPrimarnogOruzja,
                       Oklop oklop, Stit stit, Dictionary <SpecijalnaOprema, int> specijalnaOprema,
                       Senzor senzor, Potisnici potisnici, MZPogon MZPogon, Reaktor reaktor, int pozeljnaPozicija)
        {
            if (primarnoOruzje != null && sekundarnoOruzje != null)
            {
                if (Misija.Opisnici[primarnoOruzje.misija].jednokratna &&
                    Misija.Opisnici[sekundarnoOruzje.misija].jednokratna)
                {
                    sekundarnoOruzje = null;
                }
            }

            if (sekundarnoOruzje == null)
            {
                udioPrimarnogOruzja = 1;
            }

            this.id                 = id;
            brojBrodova             = 0;
            nadogradnja             = null;
            this.ime                = ime;
            this.ikona              = Slike.NaciniIkonuBroda(trup.info, primarnoOruzje, sekundarnoOruzje);
            this.trup               = trup;
            this.oklop              = oklop;
            this.specijalnaOprema   = specijalnaOprema;
            this.senzor             = senzor;
            this.potisnici          = potisnici;
            this.MZPogon            = MZPogon;
            this.stit               = stit;
            this.reaktor            = reaktor;
            this.pozeljnaPozicija   = pozeljnaPozicija;
            this.udioPrimarneMisije = udioPrimarnogOruzja;

            Dictionary <string, double> privremeniEfekti = new Dictionary <string, double>();

            #region Postavljanje primarnog i sekundarnog oružja/misije
            {
                privremeniEfekti[Koef.Nosivost] = 1;
                foreach (SpecijalnaOprema so in specijalnaOprema.Keys)
                {
                    if (so.efekti.ContainsKey(Koef.Nosivost))
                    {
                        privremeniEfekti[Koef.Nosivost] += so.efekti[Koef.Nosivost] * specijalnaOprema[so];
                    }
                }
                efekti[Iznos.Nosivost] = trup.Nosivost * privremeniEfekti[Koef.Nosivost];

                /*
                 * slobodan prostor za oruzja/misije
                 */
                double preostaliProstor = efekti[Iznos.Nosivost];
                if (stit != null)
                {
                    preostaliProstor -= trup.VelicinaStita;
                }
                if (MZPogon != null)
                {
                    preostaliProstor -= trup.VelicinaMZPogona;
                }
                foreach (SpecijalnaOprema so in specijalnaOprema.Keys)
                {
                    preostaliProstor -= so.velicina * specijalnaOprema[so];
                }

                /*
                 * kolicina (velicina) primarnog oruzja/misije
                 */
                double zaPrimarnoOruzje = preostaliProstor;
                if (sekundarnoOruzje != null)
                {
                    zaPrimarnoOruzje *= udioPrimarnogOruzja;
                }
                if (primarnoOruzje != null)
                {
                    long kolicinaPrimarnog = (long)Math.Round(zaPrimarnoOruzje / primarnoOruzje.velicina);
                    kolicinaPrimarnog = (long)Math.Min(kolicinaPrimarnog, Math.Floor(preostaliProstor / primarnoOruzje.velicina));
                    preostaliProstor -= primarnoOruzje.velicina * kolicinaPrimarnog;

                    if (kolicinaPrimarnog > 0)
                    {
                        this.primarnoOruzje = new Zbir <Oruzje>(primarnoOruzje, kolicinaPrimarnog);
                    }
                    else
                    {
                        this.primarnoOruzje = null;
                    }
                }
                else
                {
                    preostaliProstor   -= zaPrimarnoOruzje;
                    this.primarnoOruzje = null;
                }

                /*
                 * kolicina (velicina) sekundarnog oruzja/misije
                 */
                if (sekundarnoOruzje != null)
                {
                    long kolicinaSekundarnog = (long)Math.Round(preostaliProstor / sekundarnoOruzje.velicina);
                    if (kolicinaSekundarnog > 0)
                    {
                        this.sekundarnoOruzje = new Zbir <Oruzje>(sekundarnoOruzje, kolicinaSekundarnog);
                    }
                    else
                    {
                        this.sekundarnoOruzje = null;
                    }
                }
                else
                {
                    this.sekundarnoOruzje = null;
                }
            }
            #endregion

            #region Cijena
            {
                cijena = trup.Cijena;
                if (MZPogon != null)
                {
                    cijena += MZPogon.cijena;
                }
                if (this.primarnoOruzje != null)
                {
                    cijena += primarnoOruzje.cijena * this.primarnoOruzje.kolicina;
                }
                if (this.sekundarnoOruzje != null)
                {
                    cijena += sekundarnoOruzje.cijena * this.sekundarnoOruzje.kolicina;
                }
                if (stit != null)
                {
                    cijena += stit.cijena;
                }
                foreach (SpecijalnaOprema so in specijalnaOprema.Keys)
                {
                    cijena += so.cijena * specijalnaOprema[so];
                }
            }
            #endregion

            #region Efekti
            {
                privremeniEfekti[Koef.Izdrzljivosti]        = 1;
                privremeniEfekti[Koef.InvIzdrzljivosti]     = 1;
                privremeniEfekti[Koef.UblazavanjeStete]     = 1;
                privremeniEfekti[Koef.StitDebljina]         = 1;
                privremeniEfekti[Koef.StitIzdrzljivost]     = 1;
                privremeniEfekti[Koef.StitObnavljanje]      = 1;
                privremeniEfekti[Koef.StitUblazavanjeStete] = 1;
                privremeniEfekti[Plus.Brzina]           = 0;
                privremeniEfekti[Plus.Pokretljivost]    = 0;
                privremeniEfekti[Plus.SnagaSenzora]     = 0;
                privremeniEfekti[Plus.Inercija]         = 0;
                privremeniEfekti[Plus.Ometanje]         = (stit != null) ? stit.ometanje : 0;
                privremeniEfekti[Plus.Prikrivanje]      = (stit != null) ? stit.prikrivanje : 0;
                privremeniEfekti[Plus.VelicinaReaktora] = 0;
                foreach (SpecijalnaOprema so in specijalnaOprema.Keys)
                {
                    foreach (string e in so.efekti.Keys)
                    {
                        privremeniEfekti[e] += so.efekti[e] * specijalnaOprema[so];
                    }
                }

                #region Reaktor
                double snagaReaktora = reaktor.snaga * (trup.VelicinaReaktora + privremeniEfekti[Plus.VelicinaReaktora]) / trup.VelicinaReaktora;
                {
                    double opterecenjeReaktora = 0;
                    if (stit != null)
                    {
                        opterecenjeReaktora += stit.snaga;
                    }
                    if (this.primarnoOruzje != null)
                    {
                        opterecenjeReaktora += this.primarnoOruzje.kolicina * primarnoOruzje.snaga;
                    }
                    if (this.sekundarnoOruzje != null)
                    {
                        opterecenjeReaktora += this.sekundarnoOruzje.kolicina * sekundarnoOruzje.snaga;
                    }
                    efekti[Iznos.OpterecenjeReaktora] = opterecenjeReaktora;
                    efekti[Iznos.SnageReaktora]       = snagaReaktora;
                    if (snagaReaktora >= opterecenjeReaktora)
                    {
                        efekti[Iznos.KoefSnage] = 1;
                    }
                    else
                    {
                        efekti[Iznos.KoefSnage] = snagaReaktora / opterecenjeReaktora;
                    }
                }
                #endregion

                #region Oklop
                efekti[Iznos.Izdrzljivosti]    = Math.Round(trup.BazaOklopa * oklop.izdrzljivost * privremeniEfekti[Koef.Izdrzljivosti] / privremeniEfekti[Koef.InvIzdrzljivosti]);
                efekti[Iznos.UblazavanjaStete] = Math.Min(oklop.ublazavanjeSteteMax, oklop.ublazavanjeSteteKoef * trup.BazaOklopUblazavanja * privremeniEfekti[Koef.UblazavanjeStete]);
                #endregion

                #region MZ pogon
                if (MZPogon != null)
                {
                    efekti[Iznos.MZBrzina] = MZPogon.brzina * Math.Min(snagaReaktora / MZPogon.snaga, 1);
                }
                else
                {
                    efekti[Iznos.MZBrzina] = 0;
                }
                #endregion

                #region Pokretljivost
                {
                    double inercija = Math.Max(Math.Round(trup.Tromost + privremeniEfekti[Plus.Inercija]), 0);
                    efekti[Iznos.Inercija]       = inercija;
                    efekti[Iznos.Brzina]         = potisnici.brzina + privremeniEfekti[Plus.Brzina];
                    efekti[Iznos.Pokretljivosti] = potisnici.pokretljivost - inercija + privremeniEfekti[Plus.Pokretljivost];
                }
                #endregion

                #region Senzori
                {
                    efekti[Iznos.SnageSenzora] = Math.Round(trup.SenzorPlus + senzor.razlucivost + privremeniEfekti[Plus.SnagaSenzora]);
                }
                #endregion

                #region Štit
                {
                    if (stit != null)
                    {
                        efekti[Iznos.StitDebljina]         = Math.Round(stit.debljina * Math.Max(privremeniEfekti[Koef.StitDebljina], 0));
                        efekti[Iznos.StitIzdrzljivost]     = Math.Round(trup.BazaStita * stit.izdrzljivost * Math.Max(privremeniEfekti[Koef.StitIzdrzljivost], 0));
                        efekti[Iznos.StitObnavljanje]      = Math.Round(trup.BazaStita * stit.obnavljanje * Math.Max(privremeniEfekti[Koef.StitObnavljanje], 0));
                        efekti[Iznos.StitUblazavanjaStete] = stit.ublazavanjeStete * privremeniEfekti[Koef.StitUblazavanjeStete];
                    }
                    else
                    {
                        efekti[Iznos.StitDebljina]         = 0;
                        efekti[Iznos.StitIzdrzljivost]     = 0;
                        efekti[Iznos.StitObnavljanje]      = 0;
                        efekti[Iznos.StitUblazavanjaStete] = 0;
                    }
                }
                #endregion

                #region Prikrivanje
                {
                    efekti[Iznos.Ometanje]    = Math.Round(trup.OmetanjeBaza + Math.Max(privremeniEfekti[Plus.Ometanje], 0));
                    efekti[Iznos.Prikrivanje] = Math.Round(trup.PrikrivanjeBaza + Math.Max(privremeniEfekti[Plus.Prikrivanje], 0));
                }
                #endregion
            }
            #endregion

            #region Stil / sažetak
            {
                List <SpecijalnaOprema> specOprema = new List <SpecijalnaOprema>(specijalnaOprema.Keys);
                specOprema.Sort(delegate(SpecijalnaOprema a, SpecijalnaOprema b) { return(a.info.indeks.CompareTo(b.info.indeks)); });

                List <uint> brElemenata = new List <uint>();
                brElemenata.Add(2);                 // MZ pogon
                brElemenata.Add(2);                 // primarna misija
                brElemenata.Add(2);                 // sekundarna misija
                brElemenata.Add(2);                 // štit
                brElemenata.Add(101);
                brElemenata.Add(trup.info.brojIndeksa());
                if (primarnoOruzje != null)
                {
                    brElemenata.Add(primarnoOruzje.info.brojIndeksa());
                }
                if (sekundarnoOruzje != null)
                {
                    brElemenata.Add(sekundarnoOruzje.info.brojIndeksa());
                }
                if (stit != null)
                {
                    brElemenata.Add(stit.info.brojIndeksa());
                }
                foreach (SpecijalnaOprema so in specOprema)
                {
                    brElemenata.Add(so.info.brojIndeksa());
                    brElemenata.Add((uint)so.info.maxKolicinaIkako);
                }

                List <uint> sadrzaj = new List <uint>();
                if (MZPogon == null)
                {
                    sadrzaj.Add(0);
                }
                else
                {
                    sadrzaj.Add(1);
                }
                if (primarnoOruzje == null)
                {
                    sadrzaj.Add(0);
                }
                else
                {
                    sadrzaj.Add(1);
                }
                if (sekundarnoOruzje == null)
                {
                    sadrzaj.Add(0);
                }
                else
                {
                    sadrzaj.Add(1);
                }
                if (stit == null)
                {
                    sadrzaj.Add(0);
                }
                else
                {
                    sadrzaj.Add(1);
                }

                sadrzaj.Add((uint)(Math.Round(udioPrimarnogOruzja * 100)));
                sadrzaj.Add(trup.info.indeks);

                if (primarnoOruzje != null)
                {
                    sadrzaj.Add(primarnoOruzje.info.indeks);
                }
                if (sekundarnoOruzje != null)
                {
                    sadrzaj.Add(sekundarnoOruzje.info.indeks);
                }

                if (stit != null)
                {
                    sadrzaj.Add(stit.info.indeks);
                }

                foreach (SpecijalnaOprema so in specOprema)
                {
                    sadrzaj.Add(so.info.indeks);
                    sadrzaj.Add((uint)specijalnaOprema[so]);
                }

                this.stil = new Sazetak(sadrzaj, brElemenata);
            }
            #endregion
        }