示例#1
0
        static void Convert(string input, string outputDir)
        {
            if (outputDir == null)
            {
                outputDir = Path.GetDirectoryName(input);
            }


            var bmp = FalloutFRMLoader.Load(File.ReadAllBytes(input));
            var c   = new Bitmap(bmp[0]);

            c.MakeTransparent(Color.FromArgb(11, 0, 11));
            var filename = Path.GetFileNameWithoutExtension(input);
            var outpath  = outputDir + "\\" + filename + ".png";

            Console.WriteLine($"Saving file to {outpath}");
            c.Save(outpath, ImageFormat.Png);
            Console.WriteLine($"Saved {outpath}");
        }
示例#2
0
        public bool LoadDir(string DirPath, List <string> crFiles, Color Transparency)
        {
            List <string> filenames = new List <string>();

            foreach (var path in this.EditorData.GraphicsPaths)
            {
                var fullPath = DirPath + Path.DirectorySeparatorChar + path;
                if (Directory.Exists(fullPath))
                {
                    filenames.AddRange(Directory.GetFiles(fullPath));
                }
            }
            foreach (var crFile in crFiles)
            {
                foreach (var filename in filenames)
                {
                    string ext = Path.GetExtension(filename).ToLower();
                    if (!(ext == ".frm" || ext == ".png"))
                    {
                        continue;
                    }
                    byte[] bytes = File.ReadAllBytes(filename);
                    if (ext == ".frm")
                    {
                        var frm = FalloutFRMLoader.LoadFRM(bytes, Transparency);
                        Frms[filename] = frm;
                    }
                    else
                    {
                        System.ComponentModel.TypeConverter tc = System.ComponentModel.TypeDescriptor.GetConverter(typeof(Bitmap));
                        Bitmap bitmap = (Bitmap)tc.ConvertFrom(bytes);
                        Frms[filename]        = new FalloutFRM();
                        Frms[filename].Frames = new List <Bitmap>();
                        Frms[filename].Frames.Add(bitmap);
                        Frms[filename].FileName = filename.Remove(filename.IndexOf(DirPath), DirPath.Length);
                    }
                }
            }
            return(true);
        }
示例#3
0
        public bool LoadZip(string ZipPath, List <string> crFiles, Color Transparency)
        {
            if (!File.Exists(ZipPath))
            {
                MessageBox.Show("Unable to load " + ZipPath + ", doesn't exist.", "Mapper", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return(false);
            }

            var zip = ZipStorer.Open(ZipPath, FileAccess.Read);

            if (zip == null)
            {
                MessageBox.Show("Unable to load " + ZipPath + ".", "Mapper", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return(false);
            }

            var patternToCheck = new List <string>();

            foreach (var cr in crFiles)
            {
                patternToCheck.Add(cr);
            }
            foreach (var path in this.EditorData.GraphicsPaths)
            {
                patternToCheck.Add(path);
            }

            var filesToLoad = new List <ZipStorer.ZipFileEntry>();

            var entries = zip.ReadCentralDir();

            foreach (var entry in entries)
            {
                foreach (var path in patternToCheck)
                {
                    if (!entry.FilenameInZip.Replace('/', '\\').Contains(path))
                    {
                        continue;
                    }
                    if (entry.CompressedSize == 0)
                    {
                        continue;
                    }

                    string filename = entry.FilenameInZip.ToLower().Replace('/', '\\');
                    string ext      = Path.GetExtension(filename).ToLower();

                    if (!(ext == ".frm" || ext == ".png"))
                    {
                        continue;
                    }

                    filesToLoad.Add(entry);
                }
            }

            this.BeginInvoke((MethodInvoker) delegate
            {
                frmLoading.SetNextFile(Path.GetFileName(ZipPath));
                frmLoading.SetResourceNum(filesToLoad.Count);
            });

            foreach (var entry in filesToLoad)
            {
                string filename = entry.FilenameInZip.ToLower().Replace('/', '\\');
                string ext      = Path.GetExtension(filename).ToLower();

                this.BeginInvoke((MethodInvoker) delegate
                {
                    frmLoading.SetNextResource(filename);
                });

                byte[] bytes;
                using (MemoryStream stream = new MemoryStream())
                {
                    zip.ExtractFile(entry, stream);
                    bytes = stream.ToArray();
                }
                if (ext == ".frm")
                {
                    var frm = FalloutFRMLoader.LoadFRM(bytes, Transparency);
                    Frms[filename] = frm;
                }
                else
                {
                    System.ComponentModel.TypeConverter tc = System.ComponentModel.TypeDescriptor.GetConverter(typeof(Bitmap));
                    Bitmap bitmap = (Bitmap)tc.ConvertFrom(bytes);
                    Frms[filename]        = new FalloutFRM();
                    Frms[filename].Frames = new List <Bitmap>();
                    Frms[filename].Frames.Add(bitmap);
                    Frms[filename].FileName = entry.FilenameInZip;
                }
            }
            return(true);
        }
示例#4
0
        public bool LoadDat(string DatPath, List <string> crFiles, Color Transparency)
        {
            DatReaderError status;
            DAT            loadedDat = DATReader.ReadDat(DatPath, out status);

            if (status.Error != DatError.Success)
            {
                MessageBox.Show("Error loading " + DatPath + ": " + Environment.NewLine + status.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return(false);
            }

            List <DATFile> files = new List <DATFile>();

            foreach (string path in this.EditorData.GraphicsPaths)
            {
                files.AddRange(loadedDat.GetFilesByPattern(path));

                // Critters to load
                foreach (var crType in critterData.crTypeGraphic.Values)
                {
                    var file = loadedDat.GetFileByName("art\\critters\\" + crType.ToUpper() + "AA.FRM"); // Idle anim
                    if (file == null)
                    {
                        file = loadedDat.GetFileByName("art\\critters\\" + crType.ToLower() + "aa.frm");
                    }
                    if (file == null)
                    {
                        continue;
                    }
                    files.Add(file);
                }
            }

            this.BeginInvoke((MethodInvoker) delegate {
                frmLoading.SetNextFile(Path.GetFileName(DatPath));
                frmLoading.SetResourceNum(files.Count);
            });

            foreach (DATFile file in files)
            {
                this.BeginInvoke((MethodInvoker) delegate { frmLoading.SetNextResource(file.FileName); });

                string ext = Path.GetExtension(file.FileName).ToLower();
                if (!(ext == ".frm" || ext == ".png"))
                {
                    continue;
                }

                byte[] data = file.GetData();
                if (data == null)
                {
                    WriteLog("Error opening " + file.FileName + ": " + file.ErrorMsg);
                    continue;
                }

                if (ext == ".frm")
                {
                    var frm = FalloutFRMLoader.LoadFRM(data, Transparency);
                    frm.FileName       = file.Path.ToLower();
                    Frms[frm.FileName] = frm;
                }
                else
                {
                    System.ComponentModel.TypeConverter tc = System.ComponentModel.TypeDescriptor.GetConverter(typeof(Bitmap));
                    Bitmap bitmap = (Bitmap)tc.ConvertFrom(data);
                }
            }
            loadedDat.Close();
            return(true);
        }
示例#5
0
        static void Main(string[] args)
        {
            var mapDir = @"D:\Fallout\maps\";

            List <string>       gfx       = new List <string>();
            List <string>       load      = new List <string>();
            List <string>       tiles     = new List <string>();
            List <string>       roofs     = new List <string>();
            List <string>       scenery   = new List <string>();
            List <FOnlineProto> protos    = new List <FOnlineProto>();
            List <MapObject>    mapobject = new List <MapObject>();
            List <FRMData>      frmData   = new List <FRMData>();
            var gfxDict = new Dictionary <int, int>();

            var loadMap = "ul_junkyard.fomap";

            foreach (var proto in Directory.GetFiles(@"C:\Users\Markus\Documents\GitHub\fo2238\Server\proto\items", "*.fopro"))
            {
                int    pid    = 0;
                string picMap = "";
                foreach (var line in File.ReadAllLines(proto))
                {
                    if (line.StartsWith("ProtoId="))
                    {
                        pid = int.Parse(line.Split('=')[1]);
                    }
                    if (line.StartsWith("PicMap="))
                    {
                        picMap = line.Split('=')[1].Replace(@"art\", "").Replace(@"\", "/");
                        protos.Add(new FOnlineProto
                        {
                            pid    = pid,
                            picMap = picMap
                        });
                    }
                }
            }


            bool          parsingObjects = false;
            int           containerUID   = 0;
            MapObjectType mapType        = 0;
            int           mapPid         = 0;
            int           mapX           = 0;
            int           mapY           = 0;

            foreach (var line in File.ReadAllLines(@"D:\Fallout\maps\" + loadMap))
            {
                if (line.StartsWith("tile") || line.StartsWith("roof"))
                {
                    if (line.StartsWith("tile_l"))
                    {
                        continue;
                    }

                    var spl = line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
                    var img = spl[3].Replace(@"art\tiles\", "tiles/").ToUpper().Replace(".FRM", ".png").Replace("TILES", "tiles");
                    var idx = gfx.IndexOf(img);
                    if (idx == -1)
                    {
                        gfx.Add(img);
                        idx = gfx.Count - 1;
                        load.Add($"'{img}'");
                        if (!File.Exists(mapDir + img))
                        {
                            var falloutFRM = FalloutFRMLoader.LoadFRM(File.ReadAllBytes(mapDir + img.Replace(".png", ".frm")), Color.FromArgb(11, 0, 11));
                            var c          = new Bitmap(falloutFRM.Frames[0]);
                            c.MakeTransparent(Color.FromArgb(11, 0, 11));
                            c.Save(mapDir + img, ImageFormat.Png);
                        }
                    }
                    var x = int.Parse(spl[1]);
                    var y = int.Parse(spl[2]);

                    if (line.StartsWith("tile"))
                    {
                        tiles.Add(idx.ToString());
                        tiles.Add(x.ToString());
                        tiles.Add(y.ToString());
                    }
                    else if (line.StartsWith("roof"))
                    {
                        roofs.Add(idx.ToString());
                        roofs.Add(x.ToString());
                        roofs.Add(y.ToString());
                    }
                }

                if (line.StartsWith("[Objects]"))
                {
                    parsingObjects = true;
                }

                if (parsingObjects)
                {
                    if (line.StartsWith("MapObjType"))
                    {
                        mapType = (MapObjectType)int.Parse(ParseMapVal(line));
                    }
                    if (line.StartsWith("ProtoId"))
                    {
                        mapPid = int.Parse(ParseMapVal(line));
                    }
                    if (line.StartsWith("MapX"))
                    {
                        mapX = int.Parse(ParseMapVal(line));
                    }
                    if (line.StartsWith("MapY"))
                    {
                        mapY = int.Parse(ParseMapVal(line));
                    }
                    if (line.StartsWith("ContainerUID"))
                    {
                        containerUID = int.Parse(ParseMapVal(line));
                    }

                    if (line == "")
                    {
                        if (mapType == MapObjectType.Scenery || mapType == MapObjectType.Item)
                        {
                            // items in containers, don't render.
                            if (mapType == MapObjectType.Scenery || (mapType == MapObjectType.Item && containerUID == 0))
                            {
                                mapobject.Add(new MapObject
                                {
                                    pid  = mapPid,
                                    type = (int)mapType,
                                    x    = mapX,
                                    y    = mapY
                                });
                            }
                            containerUID = 0;
                            mapType      = 0;
                            mapPid       = 0;
                            mapX         = 0;
                            mapY         = 0;
                        }
                    }
                }
            }

            /*protos.Add(new FOnlineProto
             * {
             *  pid = 1207,
             *  picMap = "scenery/fo-rotators.png"
             * });
             *
             * mapobject.Add(new MapObject()
             * {
             *  pid = 1207,
             *  type = 2,
             *  x = 119,
             *  y = 236,
             * });*/

            var mapObjList = new List <string>();

            foreach (var m in mapobject.OrderBy(m => m.x + m.y * 2))
            {
                var proto = protos.Where(x => x.pid == m.pid).FirstOrDefault();
                var idx   = gfx.IndexOf(proto.picMap);

                if (proto.picMap.Contains("fofrm"))
                {
                    continue;
                }

                var frmIdx = 0;
                if (idx == -1)
                {
                    gfx.Add(proto.picMap);
                    load.Add($"'{proto.picMap.Replace("frm", "png")}'");
                    if (proto.picMap.Contains(".png"))
                    {
                        int shiftY = 0;
                        int shiftX = 0;

                        /*if (proto.picMap.Contains("rotators"))
                         * {
                         *  shiftY = -25;
                         *  shiftX = 8;
                         * }*/

                        Image img  = Image.FromFile(mapDir + proto.picMap);
                        var   data = new FRMData
                        {
                            gfx    = gfx.Count - 1,
                            height = img.Height,
                            width  = img.Width,
                            shiftX = shiftX,
                            shiftY = shiftY
                        };
                        frmData.Add(data);
                        gfxDict[gfx.Count - 1] = frmData.Count - 1;
                        frmIdx = frmData.Count - 1;
                    }
                    else
                    {
                        // load frmData
                        var        file       = mapDir + proto.picMap;
                        FalloutFRM falloutFRM = null;
                        try
                        {
                            falloutFRM = FalloutFRMLoader.LoadFRM(File.ReadAllBytes(file), Color.FromArgb(11, 0, 11));
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine($"Unable to open {file}: {ex.Message}");
                        }

                        // No png on disk? save it...
                        var pngPath = (mapDir + proto.picMap).Replace("frm", "png");
                        if (!File.Exists(pngPath))
                        {
                            var c = new Bitmap(falloutFRM.Frames[0]);
                            c.MakeTransparent(Color.FromArgb(11, 0, 11));
                            c.Save(pngPath, ImageFormat.Png);
                        }


                        var shift = falloutFRM.PixelShift;
                        var data  = new FRMData
                        {
                            gfx    = gfx.Count - 1,
                            height = falloutFRM.Frames[0].Height,
                            width  = falloutFRM.Frames[0].Width,
                            shiftX = shift.X,
                            shiftY = shift.Y
                        };
                        frmData.Add(data);
                        gfxDict[gfx.Count - 1] = frmData.Count - 1;
                        frmIdx = frmData.Count - 1;
                    }
                }
                else
                {
                    frmIdx = gfxDict[idx];
                }
                mapObjList.Add(frmIdx.ToString());
                mapObjList.Add(m.x.ToString());
                mapObjList.Add(m.y.ToString());
            }
            var frm = new List <string>();

            foreach (var f in frmData)
            {
                frm.Add(f.gfx.ToString());
                frm.Add(f.height.ToString());
                frm.Add(f.width.ToString());
                frm.Add(f.shiftX.ToString());
                frm.Add(f.shiftY.ToString());
            }

            var mapNameNoExt = loadMap.Split('.')[0];

            var template = File.ReadAllText(@"C:\Users\Markus\Documents\GitHub\junktown\fomap\template.html");

            template = template.Replace("[LOAD_CODE]", "var images = [" + string.Join(",", load) + "];");
            template = template.Replace("[TILES]", "var tiles = [" + string.Join(",", tiles) + "];");
            template = template.Replace("[ROOFS]", "var roofs = [" + string.Join(",", roofs) + "];");
            //template = template.Replace("[ROOFS]", "var roofs = [];");
            template = template.Replace("[FRM_DATA]", "var frmData = [" + string.Join(",", frm) + "];");
            template = template.Replace("[MAP_OBJECTS]", "var mapObj = [" + string.Join(",", mapObjList) + "];");
            //template = template.Replace("[MAP_OBJECTS]", "var mapObj = [];");
            template = template.Replace("[MAP_NAME]", loadMap);
            File.WriteAllText(@"D:\Fallout\maps\" + mapNameNoExt + ".html", template);
        }