示例#1
0
 public static void ProvjeriId(Dizajn dizajn)
 {
     if (dizajn.id >= _SlijedeciId)
     {
         _SlijedeciId = dizajn.id + 1;
     }
 }
示例#2
0
        public static Brod Ucitaj(PodaciCitac ulaz, Dictionary <int, Dizajn> dizajnovi)
        {
            Dizajn dizajn             = dizajnovi[ulaz.podatakInt(PohDizajn)];
            long   kolicina           = ulaz.podatakLong(PohKolicina);
            double izdrzljivostOklopa = ulaz.podatakDouble(PohIzdrzljivost);

            return(new Brod(dizajn, kolicina, izdrzljivostOklopa));
        }
示例#3
0
 public DizajnZgrada(Dizajn dizajn)
     : base(Zgrada.ZadnjiId() + dizajn.id, dizajn.ime, Grupa,
            new KonstantnaFormula(dizajn.cijena),
            new KonstantnaFormula(int.MaxValue),
            new KonstantnaFormula(int.MaxValue),
            new KonstantnaFormula(0),
            dizajn.trup.info.slika,
            "",
            dizajn.trup.info.opis,
            new List <Zgrada.Ucinak>(),
            "PONAVLJA_SE NE_OSTAJE ORBITALNA BROD",
            new List <Preduvjet>())
 {
     ucinci.Add(new UcinakSagradiBrod(dizajn));
     this.dizajn = dizajn;
 }
示例#4
0
 public UcinakSagradiBrod(Dizajn dizajn)
 {
     this.dizajn = dizajn;
 }
示例#5
0
 public Brod(Dizajn dizajn, long kolicina, double izdrzljivostOklopa)
 {
     this.dizajn             = dizajn;
     this.kolicina           = kolicina;
     this.izdrzljivostOklopa = izdrzljivostOklopa;
 }
示例#6
0
 public Brod(Dizajn dizajn, long kolicina)
     : this(dizajn, kolicina, dizajn.izdrzljivostOklopa *kolicina)
 {
 }
示例#7
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);
                }
            }
        }
示例#8
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
        }