public void IzvrsiKolonizacije() { foreach (KeyValuePair <Zvijezda, Flota> flotaStac in floteStacionarne) { Zvijezda zvijezda = flotaStac.Key; Flota flota = flotaStac.Value; #region Kolonizacija foreach (Flota.Kolonizacija kolonizacija in flota.kolonizacije) { zvijezda.Naseli(this); Planet planet = zvijezda.planeti[kolonizacija.planet]; double maxDodatnaPopulacija = 0; if (planet.kolonija == null) { Kolonija kolonija = new Kolonija(this, planet, 10, 0); maxDodatnaPopulacija = kolonija.Efekti[Kolonija.PopulacijaMax]; } else { maxDodatnaPopulacija = (planet.kolonija.Efekti[Kolonija.PopulacijaMax] - planet.kolonija.Populacija); } long populacijaBroda = kolonizacija.brod.dizajn.populacija; long radnaMjestaBroda = kolonizacija.brod.dizajn.radnaMjesta; long brBrodova = (long)(Math.Min(kolonizacija.brBrodova, Math.Ceiling(maxDodatnaPopulacija / populacijaBroda))); if (planet.kolonija == null) { planet.kolonija = new Kolonija( this, planet, populacijaBroda * brBrodova, radnaMjestaBroda * brBrodova); poruke.AddLast(Poruka.NovaKolonija(planet.kolonija)); } else { planet.kolonija.dodajKolonizator( populacijaBroda * brBrodova, radnaMjestaBroda * brBrodova); } flota.ukloniBrod(kolonizacija.brod.dizajn, brBrodova); } flota.kolonizacije.Clear(); #endregion if (flota.brodovi.Count == 0) { floteStacionarne.PendRemove(zvijezda); } } floteStacionarne.ApplyRemove(); }
private void postaviIgraca(Igrac igrac, Zvijezda pocetnaZvj, PocetnaPopulacija pocetnaPop) { igrac.odabranaZvijezda = pocetnaZvj; igrac.posjeceneZvjezde.Add(pocetnaZvj); pocetnaZvj.Naseli(igrac); List <PotencijalnaPocetnaKolonija> potencijalneKolonije = new List <PotencijalnaPocetnaKolonija>(); foreach (Planet pl in pocetnaZvj.planeti) { if (pl.tip != Planet.Tip.NIKAKAV) { Dictionary <string, double> efekti = new Kolonija(igrac, pl, 1000, 1000).maxEfekti(); potencijalneKolonije.Add(new PotencijalnaPocetnaKolonija( pl, efekti[Kolonija.BrRadnika] / efekti[Kolonija.PopulacijaBr], efekti[Kolonija.PopulacijaMax], efekti[Kolonija.RudePoRudaru])); } } potencijalneKolonije.Sort( (k1, k2) => (k1.prikladnost != k2.prikladnost) ? -(k1.prikladnost).CompareTo(k2.prikladnost) : -(k1.rudePoRudaru).CompareTo(k2.rudePoRudaru)); if (potencijalneKolonije.Count > pocetnaPop.BrKolonija) { potencijalneKolonije.RemoveRange(pocetnaPop.BrKolonija, potencijalneKolonije.Count - pocetnaPop.BrKolonija); } double[] dodjeljenaPop = new double[potencijalneKolonije.Count]; double preostalaPop = pocetnaPop.Populacija; double ukupnaPop = pocetnaPop.Populacija; double sumaDobrota = 0; for (int i = 0; i < dodjeljenaPop.Length; i++) { sumaDobrota += potencijalneKolonije[i].prikladnost; } for (int i = 0; i < dodjeljenaPop.Length; i++) { double dodjela = ukupnaPop * potencijalneKolonije[i].prikladnost / sumaDobrota; dodjela = Math.Floor(Math.Min(dodjela, potencijalneKolonije[i].populacijaMax)); preostalaPop -= dodjela; dodjeljenaPop[i] = dodjela; } int najboljiPlanet = 0; for (int i = 0; i < dodjeljenaPop.Length; i++) { double dodjela = Math.Floor( Math.Min( preostalaPop, potencijalneKolonije[i].populacijaMax - dodjeljenaPop[i]) ); preostalaPop -= dodjela; dodjeljenaPop[i] += dodjela; if (dodjeljenaPop[i] > dodjeljenaPop[najboljiPlanet]) { najboljiPlanet = i; } } for (int i = 0; i < dodjeljenaPop.Length; i++) { Planet pl = potencijalneKolonije[i].planet; pl.kolonija = new Kolonija( igrac, pl, (long)dodjeljenaPop[i], (long)Math.Floor(dodjeljenaPop[i] * pocetnaPop.UdioRadnihMjesta)); igrac.kolonije.Add(pl.kolonija); } igrac.OdabranPlanet = potencijalneKolonije[najboljiPlanet].planet; }