示例#1
0
        public Map PrepareMap(string uid)
        {
            if (LoadScreen != null)
            {
                LoadScreen.Display();
            }

            if (MapCache[uid].Status != MapStatus.Available)
            {
                throw new InvalidDataException("Invalid map uid: {0}".F(uid));
            }

            // Operate on a copy of the map to avoid gameplay state leaking into the cache
            var map = new Map(MapCache[uid].Map.Path);

            LoadTranslations(map);

            // Reinit all our assets
            InitializeLoaders();
            GlobalFileSystem.LoadFromManifest(Manifest);

            // Mount map package so custom assets can be used. TODO: check priority.
            GlobalFileSystem.Mount(GlobalFileSystem.OpenPackage(map.Path, null, int.MaxValue));

            using (new Support.PerfTimer("Map.PreloadRules"))
                map.PreloadRules();
            using (new Support.PerfTimer("Map.SequenceProvider.Preload"))
                map.SequenceProvider.Preload();

            VoxelProvider.Initialize(Manifest.VoxelSequences, map.VoxelSequenceDefinitions);
            VoxelLoader.Finish();

            return(map);
        }
示例#2
0
        public static void RemapShp(string[] args)
        {
            var remap = new Dictionary <int, int>();

            /* the first 4 entries are fixed */
            for (var i = 0; i < 4; i++)
            {
                remap[i] = i;
            }

            var srcMod = args[1].Split(':')[0];

            Game.modData = new ModData(srcMod);
            GlobalFileSystem.LoadFromManifest(Game.modData.Manifest);
            var srcRules       = Game.modData.RulesetCache.LoadDefaultRules();
            var srcPaletteInfo = srcRules.Actors["player"].Traits.Get <PlayerColorPaletteInfo>();

            int[] srcRemapIndex = srcPaletteInfo.RemapIndex;

            var destMod = args[2].Split(':')[0];

            Game.modData = new ModData(destMod);
            GlobalFileSystem.LoadFromManifest(Game.modData.Manifest);
            var destRules       = Game.modData.RulesetCache.LoadDefaultRules();
            var destPaletteInfo = destRules.Actors["player"].Traits.Get <PlayerColorPaletteInfo>();
            var destRemapIndex  = destPaletteInfo.RemapIndex;
            var shadowIndex     = new int[] { };

            // the remap range is always 16 entries, but their location and order changes
            for (var i = 0; i < 16; i++)
            {
                remap[PlayerColorRemap.GetRemapIndex(srcRemapIndex, i)]
                    = PlayerColorRemap.GetRemapIndex(destRemapIndex, i);
            }

            // map everything else to the best match based on channel-wise distance
            var srcPalette  = Palette.Load(args[1].Split(':')[1], shadowIndex);
            var destPalette = Palette.Load(args[2].Split(':')[1], shadowIndex);

            var fullIndexRange = Exts.MakeArray <int>(256, x => x);

            for (var i = 0; i < 256; i++)
            {
                if (!remap.ContainsKey(i))
                {
                    remap[i] = fullIndexRange
                               .Where(a => !remap.ContainsValue(a))
                               .OrderBy(a => ColorDistance(destPalette.Values[a], srcPalette.Values[i]))
                               .First();
                }
            }

            var srcImage = ShpReader.Load(args[3]);

            using (var destStream = File.Create(args[4]))
                ShpReader.Write(destStream, srcImage.Size,
                                srcImage.Frames.Select(im => im.Data.Select(px => (byte)remap[px]).ToArray()));
        }
示例#3
0
        public void Run(ModData modData, string[] args)
        {
            var remap = new Dictionary <int, int>();

            /* the first 4 entries are fixed */
            for (var i = 0; i < 4; i++)
            {
                remap[i] = i;
            }

            var srcMod = args[1].Split(':')[0];

            Game.ModData = new ModData(srcMod);
            GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest);
            var srcRules       = Game.ModData.RulesetCache.Load();
            var srcPaletteInfo = srcRules.Actors["player"].Traits.Get <PlayerColorPaletteInfo>();
            var srcRemapIndex  = srcPaletteInfo.RemapIndex;

            var destMod = args[2].Split(':')[0];

            Game.ModData = new ModData(destMod);
            GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest);
            var destRules       = Game.ModData.RulesetCache.Load();
            var destPaletteInfo = destRules.Actors["player"].Traits.Get <PlayerColorPaletteInfo>();
            var destRemapIndex  = destPaletteInfo.RemapIndex;
            var shadowIndex     = new int[] { };

            // the remap range is always 16 entries, but their location and order changes
            for (var i = 0; i < 16; i++)
            {
                remap[PlayerColorRemap.GetRemapIndex(srcRemapIndex, i)]
                    = PlayerColorRemap.GetRemapIndex(destRemapIndex, i);
            }

            // map everything else to the best match based on channel-wise distance
            var srcPalette  = new ImmutablePalette(args[1].Split(':')[1], shadowIndex);
            var destPalette = new ImmutablePalette(args[2].Split(':')[1], shadowIndex);

            for (var i = 0; i < Palette.Size; i++)
            {
                if (!remap.ContainsKey(i))
                {
                    remap[i] = Enumerable.Range(0, Palette.Size)
                               .Where(a => !remap.ContainsValue(a))
                               .MinBy(a => ColorDistance(destPalette[a], srcPalette[i]));
                }
            }

            using (var s = File.OpenRead(args[3]))
                using (var destStream = File.Create(args[4]))
                {
                    var srcImage = new ShpTDSprite(s);
                    ShpTDSprite.Write(destStream, srcImage.Size,
                                      srcImage.Frames.Select(im => im.Data.Select(px => (byte)remap[px]).ToArray()));
                }
        }
示例#4
0
文件: Form1.cs 项目: ushalin/OpenRA
        public Form1(string[] args)
        {
            InitializeComponent();
            AppDomain.CurrentDomain.AssemblyResolve += GlobalFileSystem.ResolveAssembly;

            currentMod = args.FirstOrDefault() ?? "ra";

            toolStripComboBox1.Items.AddRange(ModMetadata.AllMods.Keys.ToArray());

            toolStripComboBox1.SelectedIndexChanged += (_, e) =>
            {
                tilePalette.SuspendLayout();
                actorPalette.SuspendLayout();
                resourcePalette.SuspendLayout();
                tilePalette.Controls.Clear();
                actorPalette.Controls.Clear();
                resourcePalette.Controls.Clear();
                tilePalette.ResumeLayout();
                actorPalette.ResumeLayout();
                resourcePalette.ResumeLayout();
                surface1.Bind(null, null, null, null, null);
                miniMapBox.Image = null;
                currentMod       = toolStripComboBox1.SelectedItem as string;

                Game.InitializeSettings(Arguments.Empty);
                Game.ModData = new ModData(currentMod);
                GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest);
                Program.Rules = Game.ModData.RulesetCache.LoadDefaultRules();

                var mod = Game.ModData.Manifest.Mod;
                Text = "{0} Mod Version: {1} - OpenRA Editor".F(mod.Title, mod.Version);

                loadedMapName = null;
            };

            toolStripComboBox1.SelectedItem = currentMod;

            surface1.AfterChange          += OnMapChanged;
            surface1.MousePositionChanged += s => toolStripStatusLabelMousePosition.Text = s;
            surface1.ActorDoubleClicked   += ActorDoubleClicked;

            if (args.Length >= 2)
            {
                LoadMap(args[1]);
            }
        }
示例#5
0
        public void Run(ModData modData, string[] args)
        {
            var files = args.Skip(1);

            GlobalFileSystem.LoadFromManifest(modData.Manifest);

            foreach (var f in files)
            {
                var src = GlobalFileSystem.Open(f);
                if (src == null)
                {
                    throw new InvalidOperationException("File not found: {0}".F(f));
                }
                var data = src.ReadAllBytes();
                File.WriteAllBytes(f, data);
                Console.WriteLine(f + " saved.");
            }
        }
示例#6
0
        public static void ExtractFiles(string[] args)
        {
            var mod   = args[1];
            var files = args.Skip(2);

            var manifest = new Manifest(mod);

            GlobalFileSystem.LoadFromManifest(manifest);

            foreach (var f in files)
            {
                var src = GlobalFileSystem.Open(f);
                if (src == null)
                {
                    throw new InvalidOperationException("File not found: {0}".F(f));
                }
                var data = src.ReadAllBytes();
                File.WriteAllBytes(f, data);
                Console.WriteLine(f + " saved.");
            }
        }
示例#7
0
        public void Run(ModData modData, string[] args)
        {
            // HACK: The engine code assumes that Game.modData is set.
            Game.ModData = modData;
            GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest);
            Game.ModData.SpriteSequenceLoader.OnMissingSpriteError = s => Console.WriteLine("\t" + s);

            foreach (var t in Game.ModData.Manifest.TileSets)
            {
                var ts = new TileSet(Game.ModData, t);
                Console.WriteLine("Tileset: " + ts.Name);
                var sc            = new SpriteCache(modData.SpriteLoaders, new SheetBuilder(SheetType.Indexed));
                var sequenceFiles = modData.Manifest.Sequences;

                var nodes = sequenceFiles
                            .Select(s => MiniYaml.FromFile(s))
                            .Aggregate(MiniYaml.MergeLiberal);

                foreach (var n in nodes)
                {
                    Game.ModData.SpriteSequenceLoader.ParseSequences(Game.ModData, ts, sc, n);
                }
            }
        }
示例#8
0
 public void MountFiles()
 {
     GlobalFileSystem.LoadFromManifest(Manifest);
 }
示例#9
0
        public void Run(ModData modData, string[] args)
        {
            // HACK: The engine code assumes that Game.modData is set.
            Game.modData = modData;

            GlobalFileSystem.LoadFromManifest(Game.modData.Manifest);

            var file = new IniFile(File.Open(args[1], FileMode.Open));

            var templateIndex = 0;
            var extension     = "tem";

            var terrainTypes = new Dictionary <int, string>()
            {
                { 1, "Clear" },                 // Desert sand(?)
                { 5, "Road" },                  // Paved road
                { 6, "Rail" },                  // Monorail track
                { 7, "Impassable" },            // Building
                { 9, "Water" },                 // Deep water(?)
                { 10, "Water" },                // Shallow water
                { 11, "Road" },                 // Paved road (again?)
                { 12, "DirtRoad" },             // Dirt road
                { 13, "Clear" },                // Regular clear terrain
                { 14, "Rough" },                // Rough terrain (cracks etc)
                { 15, "Cliff" },                // Cliffs
            };

            // Loop over template sets
            try
            {
                for (var tilesetGroupIndex = 0; ; tilesetGroupIndex++)
                {
                    var section = file.GetSection("TileSet{0:D4}".F(tilesetGroupIndex));

                    var sectionCount    = int.Parse(section.GetValue("TilesInSet", "1"));
                    var sectionFilename = section.GetValue("FileName", "");
                    var sectionCategory = section.GetValue("SetName", "");

                    // Loop over templates
                    for (var i = 1; i <= sectionCount; i++, templateIndex++)
                    {
                        var templateFilename = "{0}{1:D2}.{2}".F(sectionFilename, i, extension);
                        if (!GlobalFileSystem.Exists(templateFilename))
                        {
                            continue;
                        }

                        using (var s = GlobalFileSystem.Open(templateFilename))
                        {
                            Console.WriteLine("\tTemplate@{0}:", templateIndex);
                            Console.WriteLine("\t\tCategory: {0}", sectionCategory);
                            Console.WriteLine("\t\tId: {0}", templateIndex);
                            Console.WriteLine("\t\tImage: {0}{1:D2}", sectionFilename, i);

                            var templateWidth  = s.ReadUInt32();
                            var templateHeight = s.ReadUInt32();
                            /* var tileWidth = */ s.ReadInt32();
                            /* var tileHeight = */ s.ReadInt32();
                            var offsets = new uint[templateWidth * templateHeight];
                            for (var j = 0; j < offsets.Length; j++)
                            {
                                offsets[j] = s.ReadUInt32();
                            }

                            Console.WriteLine("\t\tSize: {0}, {1}", templateWidth, templateHeight);
                            Console.WriteLine("\t\tTiles:");

                            for (var j = 0; j < offsets.Length; j++)
                            {
                                if (offsets[j] == 0)
                                {
                                    continue;
                                }

                                s.Position = offsets[j] + 40;
                                /* var height = */ s.ReadUInt8();
                                var terrainType = s.ReadUInt8();
                                /* var rampType = */ s.ReadUInt8();
                                /* var height = */ s.ReadUInt8();
                                if (!terrainTypes.ContainsKey(terrainType))
                                {
                                    throw new InvalidDataException("Unknown terrain type {0} in {1}".F(terrainType, templateFilename));
                                }

                                Console.WriteLine("\t\t\t{0}: {1}", j, terrainTypes[terrainType]);
                                // Console.WriteLine("\t\t\t\tHeight: {0}", height);
                                // Console.WriteLine("\t\t\t\tTerrainType: {0}", terrainType);
                                // Console.WriteLine("\t\t\t\tRampType: {0}", rampType);
                                // Console.WriteLine("\t\t\t\tLeftColor: {0},{1},{2}", s.ReadUInt8(), s.ReadUInt8(), s.ReadUInt8());
                                // Console.WriteLine("\t\t\t\tRightColor: {0},{1},{2}", s.ReadUInt8(), s.ReadUInt8(), s.ReadUInt8());
                            }
                        }
                    }
                }
            }
            catch (InvalidOperationException)
            {
                // GetSection will throw when we run out of sections to import
            }
        }
示例#10
0
        public void Run(ModData modData, string[] args)
        {
            // HACK: The engine code assumes that Game.modData is set.
            Game.ModData = modData;
            GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest);

            var imageField             = typeof(TerrainTemplateInfo).GetField("Image");
            var pickAnyField           = typeof(TerrainTemplateInfo).GetField("PickAny");
            var tileInfoField          = typeof(TerrainTemplateInfo).GetField("tileInfo", BindingFlags.NonPublic | BindingFlags.Instance);
            var terrainTypeField       = typeof(TerrainTileInfo).GetField("TerrainType");
            var terrainLeftColorField  = typeof(TerrainTileInfo).GetField("LeftColor");
            var terrainRightColorField = typeof(TerrainTileInfo).GetField("RightColor");
            var empty = new Size(0, 0);
            var single = new int2(1, 1);
            var exts = new[] { "" }.Concat(args[1].Split(','));

            foreach (var t in Game.ModData.Manifest.TileSets)
            {
                var ts         = new TileSet(Game.ModData, t);
                var frameCache = new FrameCache(Game.ModData.SpriteLoaders);

                Console.WriteLine("Tileset: " + ts.Name);
                foreach (var template in ts.Templates.Values)
                {
                    // Find the sprite associated with this template
                    foreach (var ext in exts)
                    {
                        Stream s;
                        if (!GlobalFileSystem.TryOpen(template.Images[0] + ext, out s))
                        {
                            continue;
                        }

                        // Rewrite the template image (normally readonly) using reflection
                        imageField.SetValue(template, template.Images[0] + ext);

                        // Fetch the private tileInfo array so that we can write new entries
                        var tileInfo = (TerrainTileInfo[])tileInfoField.GetValue(template);

                        // Open the file and search for any implicit frames
                        var allFrames = frameCache[template.Images[0]];
                        var frames    = template.Frames != null?template.Frames.Select(f => allFrames[f]).ToArray() : allFrames;

                        // Resize array for new entries
                        if (frames.Length > template.TilesCount)
                        {
                            var ti = new TerrainTileInfo[frames.Length];
                            Array.Copy(tileInfo, ti, template.TilesCount);
                            tileInfoField.SetValue(template, ti);
                            tileInfo = ti;
                        }

                        for (var i = 0; i < template.TilesCount; i++)
                        {
                            if (template[i] == null && frames[i] != null && frames[i].Size != empty)
                            {
                                tileInfo[i] = new TerrainTileInfo();
                                var ti = ts.GetTerrainIndex("Clear");
                                terrainTypeField.SetValue(tileInfo[i], ti);
                                terrainLeftColorField.SetValue(tileInfo[i], ts[ti].Color);
                                terrainRightColorField.SetValue(tileInfo[i], ts[ti].Color);
                                Console.WriteLine("Fixing entry for {0}:{1}", template.Images[0], i);
                            }
                        }

                        if (template.TilesCount > 1 && template.Size == single)
                        {
                            pickAnyField.SetValue(template, true);
                        }

                        s.Dispose();
                    }
                }

                ts.Save(t);
            }
        }
示例#11
0
        public void Run(ModData modData, string[] args)
        {
            // HACK: The engine code assumes that Game.modData is set.
            Game.ModData = modData;

            GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest);

            var file      = new IniFile(File.Open(args[1], FileMode.Open));
            var extension = args[2];

            var templateIndex = 0;

            var terrainTypes = new string[]
            {
                "Clear",
                "Clear",                 // Note: sometimes "Ice"
                "Ice",
                "Ice",
                "Ice",
                "Road",                 // TS defines this as "Tunnel", but we don't need this
                "Rail",
                "Impassable",           // TS defines this as "Rock", but also uses it for buildings
                "Impassable",
                "Water",
                "Water",                 // TS defines this as "Beach", but uses it for water...?
                "Road",
                "DirtRoad",              // TS defines this as "Road", but we may want different speeds
                "Clear",
                "Rough",
                "Cliff"                 // TS defines this as "Rock"
            };

            // Loop over template sets
            try
            {
                for (var tilesetGroupIndex = 0;; tilesetGroupIndex++)
                {
                    var section = file.GetSection("TileSet{0:D4}".F(tilesetGroupIndex));

                    var sectionCount    = int.Parse(section.GetValue("TilesInSet", "1"));
                    var sectionFilename = section.GetValue("FileName", "");
                    var sectionCategory = section.GetValue("SetName", "");

                    // Loop over templates
                    for (var i = 1; i <= sectionCount; i++, templateIndex++)
                    {
                        var templateFilename = "{0}{1:D2}.{2}".F(sectionFilename, i, extension);
                        if (!GlobalFileSystem.Exists(templateFilename))
                        {
                            continue;
                        }

                        using (var s = GlobalFileSystem.Open(templateFilename))
                        {
                            Console.WriteLine("\tTemplate@{0}:", templateIndex);
                            Console.WriteLine("\t\tCategory: {0}", sectionCategory);
                            Console.WriteLine("\t\tId: {0}", templateIndex);

                            var images = new List <string>();

                            images.Add("{0}{1:D2}.{2}".F(sectionFilename, i, extension));
                            for (var v = 'a'; v <= 'z'; v++)
                            {
                                var variant = "{0}{1:D2}{2}.{3}".F(sectionFilename, i, v, extension);
                                if (GlobalFileSystem.Exists(variant))
                                {
                                    images.Add(variant);
                                }
                            }

                            Console.WriteLine("\t\tImage: {0}", images.JoinWith(", "));

                            var templateWidth  = s.ReadUInt32();
                            var templateHeight = s.ReadUInt32();
                            /* var tileWidth = */ s.ReadInt32();
                            /* var tileHeight = */ s.ReadInt32();
                            var offsets = new uint[templateWidth * templateHeight];
                            for (var j = 0; j < offsets.Length; j++)
                            {
                                offsets[j] = s.ReadUInt32();
                            }

                            Console.WriteLine("\t\tSize: {0}, {1}", templateWidth, templateHeight);
                            Console.WriteLine("\t\tTiles:");

                            for (var j = 0; j < offsets.Length; j++)
                            {
                                if (offsets[j] == 0)
                                {
                                    continue;
                                }

                                s.Position = offsets[j] + 40;
                                var height      = s.ReadUInt8();
                                var terrainType = s.ReadUInt8();
                                var rampType    = s.ReadUInt8();

                                if (terrainType >= terrainTypes.Length)
                                {
                                    throw new InvalidDataException("Unknown terrain type {0} in {1}".F(terrainType, templateFilename));
                                }

                                Console.WriteLine("\t\t\t{0}: {1}", j, terrainTypes[terrainType]);
                                if (height != 0)
                                {
                                    Console.WriteLine("\t\t\t\tHeight: {0}", height);
                                }

                                if (rampType != 0)
                                {
                                    Console.WriteLine("\t\t\t\tRampType: {0}", rampType);
                                }

                                Console.WriteLine("\t\t\t\tLeftColor: {0},{1},{2}", s.ReadUInt8(), s.ReadUInt8(), s.ReadUInt8());
                                Console.WriteLine("\t\t\t\tRightColor: {0},{1},{2}", s.ReadUInt8(), s.ReadUInt8(), s.ReadUInt8());
                            }
                        }
                    }
                }
            }
            catch (InvalidOperationException)
            {
                // GetSection will throw when we run out of sections to import
            }
        }