Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        private void Mix()
        {
            if (mixer == null)
            {
                return;
            }

            // Perform mix
            map = mixer.Mix(mixParams);

            DrawLayout();
        }
Ejemplo n.º 3
0
        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();
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        // 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);
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
 public MapDrawer(UnrealMap map)
 {
     this.map = map;
     zoom     = Double.NaN;
 }
Ejemplo n.º 8
0
 private void tmrFlash_Tick(object sender, EventArgs e)
 {
     tmrFlash.Stop();
     importantMap = null;
     DrawLayout();
 }
Ejemplo n.º 9
0
        // 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);
        }