public void ReadFromFile(string filePath)
        {
            int count = Marshal.SizeOf(typeof(RegionPolygonData));

            Polygons.Clear();
            using (FileStream fs = new FileStream(filePath, FileMode.Open))
            {
                using (BinaryReader reader = new BinaryReader(fs))
                {
                    while (fs.Position < fs.Length)
                    {
                        byte[]            readBuffer = reader.ReadBytes(count);
                        GCHandle          handle     = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
                        RegionPolygonData data       = (RegionPolygonData)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(RegionPolygonData));
                        handle.Free();
                        Polygons.Add(data);
                    }
                }
            }
        }
Esempio n. 2
0
        private void Simulate(AnimStage stage = AnimStage.BEFORE_ANIM, bool icons = false)
        {
            try
            {
                // get regions
                RegionPolygonBinFile bin = new RegionPolygonBinFile();
                bin.ReadFromFile(@"assets\map\points.bin");
                Bitmap bmp = new Bitmap(pbPreview.Width, pbPreview.Height);

                House[] regionOwners = new House[bin.Polygons.Count];

                _uibWorkingCopy.GetRegionOwnership(ref regionOwners, (House)_house, _scenario, stage);

                // paint regions
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    g.DrawImage(new Bitmap(@"assets\map\dunemap2.png"), pbPreview.DisplayRectangle);

                    for (int r = 0; r < bin.Polygons.Count; r++)
                    {
                        RegionPolygonData data = bin.Polygons[r];
                        Point[]           pts  = new Point[data.Polygon.Length];
                        for (int i = 0; i < pts.Length; i++)
                        {
                            pts[i] = data.Polygon[i].ToPoint();
                        }

                        int owner = (int)regionOwners[r];
                        if (owner == owner.Clamp(0, 2))
                        {
                            using (Brush brush = new HatchBrush(HatchStyle.Percent50, Color.FromArgb(0xCF, _houseColors[owner]), Color.Transparent))
                            {
                                g.FillPolygon(brush, pts);
                            }
                        }

                        using (Pen pen = new Pen(Color.FromArgb(0x7F, Color.Black)))
                        {
                            g.DrawPolygon(pen, pts);
                        }

                        if (icons)
                        {
                            CampaignMissionData currData = _uibWorkingCopy.Houses[_house].Missions[_scenario];
                            Size sz = new Size(72, 70);
                            if (currData.RegionID1 == r + 1 || currData.RegionID2 == r + 1)
                            {
                                using (Pen pen = new Pen(Color.Blue, 2))
                                {
                                    g.DrawPolygon(pen, pts);
                                }
                            }

                            using (Pen pen = new Pen(Color.DarkBlue))
                            {
                                using (Brush brush = new SolidBrush(Color.DarkBlue))
                                {
                                    if (currData.RegionID1 > 0)
                                    {
                                        Point pt = currData.Region1IconPosition.ToPoint();
                                        g.DrawRectangle(pen, new Rectangle(pt, sz));
                                        g.DrawString(currData.MissionFile1, DefaultFont, brush, pt.X + 10, pt.Y + 10);
                                    }
                                    if (currData.RegionID2 > 0)
                                    {
                                        Point pt = currData.Region2IconPosition.ToPoint();
                                        g.DrawRectangle(pen, new Rectangle(pt, sz));
                                        g.DrawString(currData.MissionFile2, DefaultFont, brush, pt.X + 10, pt.Y + 10);
                                    }
                                }
                            }
                        }

                        using (Brush brush = new SolidBrush(Color.White))
                        {
                            g.DrawString("{0}, {1}".F(cbHouse.Text, cbScenario.Text), DefaultFont, brush, new Point(5, 5));
                        }
                    }
                }

                pbPreview.Image?.Dispose();
                pbPreview.Image = bmp;
            }
            catch { }
        }