protected CrestLayer(CrestLayer other) { this.Image = (other.Image == null)?null:(Bitmap)other.Image.Clone(); this.MaxCres = other.MaxCres; this.Mirror = other.Mirror; this.Flip = other.Flip; this.Prob = other.Prob; }
public Flag Generate(int seed = 0x7777777) { try { Random r = new Random(seed); //setup int numLayers = layerDistrib.GetRandomItem(r); Flag flag = new Flag(); flag.FieldCol = Color.FromArgb(flagCols.GetRandomItem(r)); //generate layers for (int i = 0; i < numLayers; i++) { int layer = pickRandomLayer(flag.FlagLayers, r); int color = flagCols.GetRandomItem(r); LayerSettings ls = new LayerSettings(color); flag.FlagLayers.Add(new Tuple <FlagLayer, LayerSettings>(Layers[layer], ls)); } flag.FlagLayers = (from L in flag.FlagLayers orderby L.Item1.Priority ascending select L).ToList(); //draw crest if (r.Next(100) < 50) { CrestLayer cl = (CrestLayer)Layers.Where(L => L is CrestLayer).ToList().GetRandomItem(r); if (cl == null) { return(null); } //is ther a graphic that accomidates a crest var crestsHolders = (from L in flag.FlagLayers where (L.Item1.CanHoldCrest) select L).ToList(); if (crestsHolders.Count > 0) { //crest in middle int crestSize = crestsHolders.Min(L => L.Item1.MaxCres); var crestHolder = flag.FlagLayers.FirstOrDefault(L => L.Item1.MaxCres == crestSize); //move the crest holder to the end flag.FlagLayers.Remove(crestHolder); flag.FlagLayers.Add(crestHolder); LayerSettings ls = new LayerSettings(crestCols.GetRandomItem(r)); ls.nominalSize = crestSize; ls.crestPosition = CrestPositions.Central; if (r.Next(100) < 50) { //paint the back ls.BackColor = crestBackCols.GetRandomItem(); } flag.FlagLayers.Add(new Tuple <FlagLayer, LayerSettings>(cl, ls)); } else { //crest in top left LayerSettings ls = new LayerSettings(crestCols.GetRandomItem(r)); ls.nominalSize = 0; ls.crestPosition = (r.Next(100) < 50) ? CrestPositions.TopLeft : CrestPositions.Left; flag.FlagLayers.Add(new Tuple <FlagLayer, LayerSettings>(cl, ls)); } } return(flag); } catch (Exception e) { Console.WriteLine(e); throw; } }