public static void ProvjeriId(Dizajn dizajn) { if (dizajn.id >= _SlijedeciId) { _SlijedeciId = dizajn.id + 1; } }
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)); }
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; }
public UcinakSagradiBrod(Dizajn dizajn) { this.dizajn = dizajn; }
public Brod(Dizajn dizajn, long kolicina, double izdrzljivostOklopa) { this.dizajn = dizajn; this.kolicina = kolicina; this.izdrzljivostOklopa = izdrzljivostOklopa; }
public Brod(Dizajn dizajn, long kolicina) : this(dizajn, kolicina, dizajn.izdrzljivostOklopa *kolicina) { }
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); } } }
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 }