Esempio n. 1
0
        public Mapper(List <Color> MapColors = null)
        {
            FoundLandblocks = 0;
            foreach (var entry in DatManager.CellDat.AllFiles)
            {
                if ((entry.Key & 0x0000FFFF) == 0x0000FFFF)
                {
                    var block_x = entry.Key >> 24;
                    var block_y = (entry.Key & 0x00FF0000) >> 16;

                    int startX = (int)(block_x * 8);
                    int startY = (int)(LANDSIZE - block_y * 8 - 1);

                    CellLandblock landblock = DatManager.CellDat.ReadFromDat <CellLandblock>(entry.Key);

                    for (var x = 0; x < 9; x++)
                    {
                        for (var y = 0; y < 9; y++)
                        {
                            var type = landblock.Terrain[x * 9 + y];
                            var newZ = landblock.Height[x * 9 + y];

                            // Write new data point
                            land[startY - y, startX + x].Type = type;
                            land[startY - y, startX + x].Z    = RegionHelper.GetLandheight(newZ);
                            land[startY - y, startX + x].Used = true;
                            uint itex = (uint)((type >> 2) & 0x3F);
                            if (itex < 16 || itex > 20)
                            {
                                land[startY - y, startX + x].Blocked = false;
                            }
                            else
                            {
                                land[startY - y, startX + x].Blocked = true;
                            }
                        }
                    }

                    FoundLandblocks++;
                }
            }

            CreateMap(MapColors);
        }
Esempio n. 2
0
        private void CreateMap(List <Color> MapColors = null)
        {
            var emptyColor = Properties.Settings.Default.EmptyLandblockColor;

            double[] v           = new double[3];
            double[] lightVector = new double[3] {
                -1.0, -1.0, 0.0
            };
            byte[,,] topo = new byte[LANDSIZE, LANDSIZE, 3];

            double       color, light;
            ushort       type;
            List <Color> landColor;

            if (MapColors == null)
            {
                landColor = RegionHelper.GetMapColors();
            }
            else
            {
                landColor = MapColors;
            }

            for (var y = 0; y < LANDSIZE; y++)
            {
                for (var x = 0; x < LANDSIZE; x++)
                {
                    if (land[y, x].Used)
                    {
                        // Calculate normal by using surrounding z values, if they exist
                        v[0] = 0.0;
                        v[1] = 0.0;
                        v[2] = 0.0;
                        if ((x < LANDSIZE - 1) && (y < LANDSIZE - 1))
                        {
                            if (land[y, x + 1].Used && land[y + 1, x].Used)
                            {
                                v[0] -= land[y, x + 1].Z - land[y, x].Z;
                                v[1] -= land[y + 1, x].Z - land[y, x].Z;
                                v[2] += 12.0;
                            }
                        }
                        if ((x > 0) && (y < LANDSIZE - 1))
                        {
                            if (land[y, x - 1].Used && land[y + 1, x].Used)
                            {
                                v[0] += land[y, x - 1].Z - land[y, x].Z;
                                v[1] -= land[y + 1, x].Z - land[y, x].Z;
                                v[2] += 12.0;
                            }
                        }
                        if ((x > 0) && (y > 0))
                        {
                            if (land[y, x - 1].Used && land[y - 1, x].Used)
                            {
                                v[0] += land[y, x - 1].Z - land[y, x].Z;
                                v[1] += land[y - 1, x].Z - land[y, x].Z;
                                v[2] += 12.0;
                            }
                        }
                        if ((x < LANDSIZE - 1) && (y > 0))
                        {
                            if (land[y, x + 1].Used && land[y - 1, x].Used)
                            {
                                v[0] -= land[y, x + 1].Z - land[y, x].Z;
                                v[1] += land[y - 1, x].Z - land[y, x].Z;
                                v[2] += 12.0;
                            }
                        }

                        // Check for road bit(s)
                        if ((land[y, x].Type & 0x0003) != 0)
                        {
                            type = 32;
                        }
                        else
                        {
                            type = (ushort)((land[y, x].Type & 0xFF) >> 2);
                        }

                        // Calculate lighting scalar
                        light = (((lightVector[0] * v[0] + lightVector[1] * v[1] + lightVector[2] * v[2]) /
                                  Math.Sqrt((lightVector[0] * lightVector[0] + lightVector[1] * lightVector[1] + lightVector[2] * lightVector[2]) *
                                            (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]))) * 128.0 + 128.0) * LIGHTCORRECTION + AMBIENTLIGHT;

                        // Apply lighting scalar to base colors
                        double r = (landColor[type].R * COLORCORRECTION / 100) * light / 256.0;
                        double g = (landColor[type].G * COLORCORRECTION / 100) * light / 256.0;
                        double b = (landColor[type].B * COLORCORRECTION / 100) * light / 256.0;
                        r = ColorCheck(r);
                        g = ColorCheck(g);
                        b = ColorCheck(b);

                        topo[y, x, 0] = (byte)r;
                        topo[y, x, 1] = (byte)g;
                        topo[y, x, 2] = (byte)b;
                    }
                    else
                    {
                        // If data is not present for a point on the map, the resultant pixel is green
                        topo[y, x, 0] = emptyColor.R; // R
                        topo[y, x, 1] = emptyColor.G; // G
                        topo[y, x, 2] = emptyColor.B; // B
                    }
                }
            }

            MapImage = new Bitmap(LANDSIZE, LANDSIZE);

            for (var y = 0; y < LANDSIZE; y++)
            {
                for (var x = 0; x < LANDSIZE; x++)
                {
                    Color pixColor = Color.FromArgb(topo[y, x, 0], topo[y, x, 1], topo[y, x, 2]);
                    MapImage.SetPixel(x, y, pixColor);
                }
            }

            //map.Save(mapFile, ImageFormat.Png);
        }