private void cmbSourceMap_SelectedIndexChanged(object sender, EventArgs e) { UpdateSourceMapControls(); // Mark the selected source map by a short flash importantMap = sourceMaps[cmbSourceMap.SelectedIndex]; DrawLayout(); tmrFlash.Stop(); tmrFlash.Start(); }
private void Mix() { if (mixer == null) { return; } // Perform mix map = mixer.Mix(mixParams); DrawLayout(); }
public frmMapLayout(UnrealMap map) { // We are viewing an existing map InitializeComponent(); this.map = map; // Update controls Text = map.Title + " - Layout Top View"; pnlMixOnly.Visible = false; FinalInit(); }
private void addMap(string path) { var map = UnrealMap.FromFile(path); sourceMaps[path] = map; string title = map.Title; string author = map.Author; string type = (map.Type.ToString() != "Unknown" ? map.Type.ToString() : ""); var item = new ListViewItem(new string[] { path, title, author, type }); lvwSourceFiles.Items.Add(item); }
// TODO: DRY protected override UnrealMap _Mix(MapMixParams mixParams) { var destMap = new UnrealMap(); // Get all actors var allActors = new List <UnrealActor>(); foreach (var map in maps) { var offset = mixParams.MapOffsets[map.FilePath]; allActors.AddRange(map.Actors.Select(a => UnrealActorFactory.Duplicate(a, offset))); } // Pick actors randomly var mixActors = new List <UnrealActor>(); foreach (var actor in allActors) { // Check exclusions if (mixParams.ExcludeZoneInfo && ZoneInfoNames.Contains(actor.Class)) { continue; } if (mixParams.ExcludeMore && mixParams.ExcludeMoreNames.Contains(actor.Class)) { continue; } // TODO: check brush probabilities // Get probability double prob; if (actor.Class.Contains("Light")) { prob = mixParams.LightProb; } else { prob = mixParams.OtherProb; } if (RandExp(prob)) { mixActors.Add(actor); } } // Shuffle Shuffle(mixActors); // Add selected actors foreach (var actor in mixActors) { destMap.AddActor(actor); } // Remove trapped PlayerStarts if (mixParams.RemoveTrappedPlayerStarts) { destMap.RemoveTrappedPlayerStarts(); } return(destMap); }
public void DrawLayout(Graphics gfx, int width, int height, View view, UnrealMap importantMap = null, UnrealMap draggedMap = null) { if (map.BrushCount == 0) { return; // nothing to be drawn } // Variables double halfWidth = width / 2.0; double halfHeight = height / 2.0; double xMin = map.Brushes.Min(b => view != View.Side ? b.GetXMin() : b.GetYMin()); double xMax = map.Brushes.Max(b => view != View.Side ? b.GetXMax() : b.GetYMax()); double yMin = map.Brushes.Min(b => view == View.Top ? b.GetYMin() : -b.GetZMax()); double yMax = map.Brushes.Max(b => view == View.Top ? b.GetYMax() : -b.GetZMin()); double xMid = (xMin + xMax) / 2.0; // at the center of the display double yMid = (yMin + yMax) / 2.0; // at the center of the display double xRan = xMax - xMin; double yRan = yMax - yMin; zoom = Math.Min(width / xRan, height / yRan) * 0.98; // pixels per world unit, set to 'Fill' mode var solidPen = new Pen(new SolidBrush(Color.FromArgb(64, 64, 255))); var semiSolidPen = new Pen(new SolidBrush(Color.FromArgb(255, 128, 0))); var nonSolidPen = new Pen(new SolidBrush(Color.FromArgb(0, 255, 0))); var subtractPen = new Pen(new SolidBrush(Color.FromArgb(255, 255, 0))); var moverPen = new Pen(new SolidBrush(Color.FromArgb(255, 0, 255))); var unknownPen = new Pen(new SolidBrush(Color.FromArgb(128, 128, 128))); var actorPen = new Pen(new SolidBrush(Color.FromArgb(0, 255, 255))); var importantPen = new Pen(new SolidBrush(Color.FromArgb(255, 255, 255))); var draggedPen = new Pen(new SolidBrush(Color.FromArgb(224, 224, 224))); draggedPen.DashPattern = new float[] { 1f, 1f }; gfx.Clear(Color.Black); // Draw brushes foreach (var brush in map.Brushes) { // Determine pen to use Pen usedPen; if (brush.Owners.Contains(importantMap)) { usedPen = importantPen; } else if (brush.Owners.Contains(draggedMap)) { usedPen = draggedPen; } else { switch (brush.Operation) { case BrushOperation.Solid: usedPen = solidPen; break; case BrushOperation.SemiSolid: usedPen = semiSolidPen; break; case BrushOperation.NonSolid: usedPen = nonSolidPen; break; case BrushOperation.Subtract: usedPen = subtractPen; break; case BrushOperation.Mover: usedPen = moverPen; break; default: usedPen = unknownPen; break; } } // Draw edges foreach (var edge in brush.Edges) { Project(edge.Point1, view, out double x1, out double y1); Project(edge.Point2, view, out double x2, out double y2); x1 = (x1 - xMid) * zoom + halfWidth; x2 = (x2 - xMid) * zoom + halfWidth; y1 = (y1 - yMid) * zoom + halfHeight; y2 = (y2 - yMid) * zoom + halfHeight; gfx.DrawLine(usedPen, (float)x1, (float)y1, (float)x2, (float)y2); } } // Draw actors foreach (var actor in map.Actors.Where(a => !(a is UnrealBrush))) { // Determine pen to use Pen usedPen; if (actor.Owners.Contains(importantMap)) { usedPen = importantPen; } else if (actor.Owners.Contains(draggedMap)) { usedPen = draggedPen; } else { usedPen = actorPen; } // Draw dot Project(actor.Location, view, out double x, out double y); x = (x - xMid) * zoom + halfWidth; y = (y - yMid) * zoom + halfHeight; gfx.DrawRectangle(usedPen, (float)x, (float)y, 1f, 1f); } }
public MapDrawer(UnrealMap map) { this.map = map; zoom = Double.NaN; }
private void tmrFlash_Tick(object sender, EventArgs e) { tmrFlash.Stop(); importantMap = null; DrawLayout(); }
// TODO: DRY protected override UnrealMap _Mix(MapMixParams mixParams) { var destMap = new UnrealMap(); // Get brush-rank pairs, actors and other features var brushRanks = new List <Tuple <UnrealBrush, double> >(); var allActors = new List <UnrealActor>(); // excluding brushes foreach (var map in maps) { var offset = mixParams.MapOffsets[map.FilePath]; brushRanks.AddRange(map.Brushes .Select( (b, i) => new Tuple <UnrealBrush, double> (UnrealActorFactory.Duplicate(b, offset), (double)i / map.BrushCount))); allActors.AddRange(map.Actors .Where(a => !(a is UnrealBrush)) .Select(a => UnrealActorFactory.Duplicate(a, offset))); } // Merge all brushes var allBrushes = brushRanks.OrderBy(t => t.Item2).Select(t => t.Item1); // Pick brushes randomly var mixBrushes = new List <UnrealBrush>(); mixBrushes.Add(maps.First().Brushes.First()); // add builder brush foreach (var brush in allBrushes) { // Check exclusions if (mixParams.ExcludeInvisible && brush.IsInvisible) { continue; } if (mixParams.ExcludePortal && brush.IsPortal) { continue; } // TODO: bug with exclusions? // TODO: add tests! // Get probability double prob; switch (brush.Operation) { case BrushOperation.Solid: prob = mixParams.SolidProb; break; case BrushOperation.SemiSolid: prob = mixParams.SemiSolidProb; break; case BrushOperation.NonSolid: prob = mixParams.NonSolidProb; break; case BrushOperation.Subtract: prob = mixParams.SubtractProb; break; case BrushOperation.Mover: prob = mixParams.MoverProb; break; default: prob = 0.0; break; // probably a builder brush, which is already included } if (RandExp(prob)) { mixBrushes.Add(brush); } } // Pick actors randomly var mixActors = new List <UnrealActor>(); foreach (var actor in allActors) { // Check exclusions if (mixParams.ExcludeZoneInfo && ZoneInfoNames.Contains(actor.Class)) { continue; } if (mixParams.ExcludeMore && mixParams.ExcludeMoreNames.Contains(actor.Class)) { continue; } // Get probability double prob; if (actor.Class.Contains("Light")) { prob = mixParams.LightProb; } else { prob = mixParams.OtherProb; } if (RandExp(prob)) { mixActors.Add(actor); } } // Add selected brushes & actors foreach (var brush in mixBrushes) { destMap.AddActor(brush); } foreach (var actor in mixActors) { destMap.AddActor(actor); } // Remove trapped PlayerStarts if (mixParams.RemoveTrappedPlayerStarts) { destMap.RemoveTrappedPlayerStarts(); } return(destMap); }