Пример #1
0
 private static int CompareTags(TagInstance lhs, TagInstance rhs)
 {
     var classCompare = lhs.Group.Tag.CompareTo(rhs.Group.Tag);
     if (classCompare != 0)
         return classCompare;
     return lhs.Index.CompareTo(rhs.Index);
 }
Пример #2
0
        private bool ImportAnimationResource(TagInstance tagIndex, string cachePath, string dataPath)
        {
            ModelAnimationGraph animation;
            ResourceCache resourceCache;
            uint compressedSize = 0;
            var data = File.ReadAllBytes(dataPath);

            using (var cacheStream = _info.OpenCacheReadWrite())
            {
                var tagContext = new TagSerializationContext(cacheStream, _info.Cache, _info.StringIDs, tagIndex);
                animation = _info.Deserializer.Deserialize<ModelAnimationGraph>(tagContext);
            }
            using (var stream = File.Open(_info.CacheFile.DirectoryName + "\\" + cachePath, FileMode.Open, FileAccess.ReadWrite))
            {
                resourceCache = new ResourceCache(stream);
                animation.ResourceGroups[0].Resource.Index = resourceCache.Add(stream, data, out compressedSize);
                animation.ResourceGroups[0].Resource.CompressedSize = compressedSize;
                animation.ResourceGroups[0].Resource.OldLocationFlags = (OldResourceLocationFlags)2;
            }
            using (var cacheStream = _fileInfo.Open(FileMode.Open, FileAccess.ReadWrite))
            {
                var context = new TagSerializationContext(cacheStream, _cache, _stringIds, tagIndex);
                _info.Serializer.Serialize(context, animation);
            }
            Console.WriteLine("{1}: Imported 0x{0}.", compressedSize, tagIndex);
            return true;
        }
 /// <summary>
 /// Creates a tag serialization context which serializes data into a tag.
 /// </summary>
 /// <param name="stream">The stream to write to.</param>
 /// <param name="cache">The cache file to write to.</param>
 /// <param name="stringIds">The stringID source to use.</param>
 /// <param name="tag">The tag to overwrite.</param>
 public TagSerializationContext(Stream stream, TagCache cache, StringIDCache stringIds, TagInstance tag)
 {
     _stream = stream;
     _cache = cache;
     _stringIds = stringIds;
     Tag = tag;
 }
Пример #4
0
 /// <summary>
 /// Allocates a new tag at the end of the tag list without updating the file.
 /// You can give the tag data by using one of the overwrite functions.
 /// </summary>
 /// <param name="type">The tag's type information.</param>
 /// <returns>The allocated tag.</returns>
 public TagInstance AllocateTag(TagGroup type)
 {
     var tagIndex = _tags.Count;
     var tag = new TagInstance(tagIndex, type);
     _tags.Add(tag);
     return tag;
 }
Пример #5
0
 public static void Populate(CommandContext context, OpenTagCache info, TagInstance tag, VFilesList vfsl)
 {
     context.AddCommand(new ListCommand(vfsl));
     context.AddCommand(new ExtractCommand(vfsl));
     context.AddCommand(new ExtractAllCommand(vfsl));
     context.AddCommand(new ImportCommand(info, tag, vfsl));
     context.AddCommand(new ImportAllCommand(info, tag, vfsl));
 }
Пример #6
0
        public static void Populate(CommandContext context, OpenTagCache info, TagInstance tag, MultilingualUnicodeStringList unic)
        {
            if (info.StringIDs == null)
                return;

            context.AddCommand(new ListCommand(info, unic));
            context.AddCommand(new GetCommand(info, tag, unic));
            context.AddCommand(new SetCommand(info, tag, unic));
        }
Пример #7
0
        public static CommandContext Create(CommandContext parent, OpenTagCache info, TagInstance tag, VFilesList vfsl)
        {
            var groupName = info.StringIDs.GetString(tag.Group.Name);

            var context = new CommandContext(parent,
                string.Format("{0:X8}.{1}", tag.Index, groupName));

            return context;
        }
        public static CommandContext Create(CommandContext parent, OpenTagCache info, TagInstance tag, RenderMethod renderMethod)
        {
            var groupName = info.StringIDs.GetString(tag.Group.Name);

            var context = new CommandContext(parent,
                string.Format("{0:X8}.{1}", tag.Index, groupName));

            Populate(context, info, tag, renderMethod);

            return context;
        }
Пример #9
0
 public SpecifyBitmapsCommand(OpenTagCache info, TagInstance tag, RenderMethod definition)
     : base(CommandFlags.Inherit,
          "specifybitmaps",
          "Allows the bitmaps of the render_method to be respecified.",
          "specifybitmaps",
          "Allows the bitmaps of the render_method to be respecified.")
 {
     Info = info;
     Tag = tag;
     Definition = definition;
 }
Пример #10
0
 public GetResourceCommand(OpenTagCache info, TagInstance tag, RenderModel definition)
     : base(CommandFlags.None,
           "getresource",
           "",
           "getresource",
           "")
 {
     Info = info;
     Tag = tag;
     Definition = definition;
 }
Пример #11
0
 public GetResourcesCommand(OpenTagCache info, TagInstance tag, ModelAnimationGraph definition)
     : base(CommandFlags.None,
           "getresources",
           "",
           "getresources",
           "")
 {
     Info = info;
     Tag = tag;
     Definition = definition;
 }
Пример #12
0
        public static CommandContext Create(CommandContext parent, OpenTagCache info, TagInstance tag, MultilingualUnicodeStringList unic)
        {
            var groupName = info.StringIDs.GetString(tag.Group.Name);

            var context = new CommandContext(parent,
                string.Format("{0:X8}.{1}", tag.Index, groupName));

            Populate(context, info, tag, unic);

            return context;
        }
Пример #13
0
 public LoadResourcesCommand(OpenTagCache info, TagInstance tag, ScenarioStructureBsp bsp)
     : base(CommandFlags.Inherit,
           "loadresources",
           "",
           "loadresources",
           "")
 {
     Info = info;
     Tag = tag;
     BSP = bsp;
 }
Пример #14
0
 public ListBitmapsCommand(OpenTagCache info, TagInstance tag, RenderMethod definition)
     : base(CommandFlags.Inherit,
          "listbitmaps",
          "Lists the bitmaps used by the render_method.",
          "listbitmaps",
          "Lists the bitmaps used by the render_method.")
 {
     Info = info;
     Tag = tag;
     Definition = definition;
 }
Пример #15
0
 public SpecifyShadersCommand(OpenTagCache info, TagInstance tag, RenderModel definition)
     : base(CommandFlags.Inherit,
           "specifyshaders",
           "Allows the shaders of a render_model to be respecified.",
           "specifyshaders",
           "Allows the shaders of a render_model to be respecified.")
 {
     Info = info;
     Tag = tag;
     Definition = definition;
 }
Пример #16
0
 public GetCommand(OpenTagCache info, TagInstance tag, MultilingualUnicodeStringList unic)
     : base(CommandFlags.Inherit,
           "get",
           "",
           "get <language> <string_id>",
           "")
 {
     Info = info;
     Tag = tag;
     Definition = unic;
 }
Пример #17
0
 public ImportAllCommand(OpenTagCache info, TagInstance tag, VFilesList definition)
     : base(CommandFlags.None,
           "importall",
           "Replace all files stored in the tag",
           "importall [directory]",
           "Replaces all file stored in the tag. The tag will be resized as necessary.\n" +
           "If no directory is specified, files will be loaded from the current directory.")
 {
     Info = info;
     Tag = tag;
     Definition = definition;
 }
Пример #18
0
 public ImportCommand(OpenTagCache info, TagInstance tag, Bitmap bitmap)
     : base(CommandFlags.None,
           "import",
           "Imports an image from a DDS file.",
           "import <image index> <path>",
           "The image index must be in hexadecimal.\n" +
           "No conversion will be done on the data in the DDS file.\n" +
           "The pixel format must be supported by the game.")
 {
     Info = info;
     Tag = tag;
     Bitmap = bitmap;
 }
Пример #19
0
 public EditBlockCommand(CommandContextStack stack, OpenTagCache info, TagInstance tag, object value)
     : base(CommandFlags.Inherit,
           "edit",
           "Edit the fields of a particular block element.",
           "edit <block name> [block index (if block)]",
           "Edit the fields of a particular block element.")
 {
     Info = info;
     Stack = stack;
     Tag = tag;
     Structure = new TagStructureInfo(value.GetType(), Info.Version);
     Owner = value;
 }
Пример #20
0
 public PasteElementsCommand(CommandContextStack stack, OpenTagCache info, TagInstance tag, TagStructureInfo structure, object owner)
     : base(CommandFlags.Inherit,
           "pasteelements",
           $"Pastes block element(s) to a specific tag block in the current {structure.Types[0].Name} definition.",
           "pasteelements <tag block name> [index = *]",
           $"Pastes block element(s) to a specific tag block in the current {structure.Types[0].Name} definition.")
 {
     Stack = stack;
     Info = info;
     Tag = tag;
     Structure = structure;
     Owner = owner;
 }
Пример #21
0
 public SetFieldCommand(CommandContextStack stack, OpenTagCache info, TagInstance tag, TagStructureInfo structure, object owner)
     : base(CommandFlags.Inherit,
           "setfield",
           $"Sets the value of a specific field in the current {structure.Types[0].Name} definition.",
           "setfield <field name> <field value>",
           $"Sets the value of a specific field in the current {structure.Types[0].Name} definition.")
 {
     Stack = stack;
     Info = info;
     Tag = tag;
     Structure = structure;
     Owner = owner;
 }
Пример #22
0
 public SetCommand(OpenTagCache info, TagInstance tag, MultilingualUnicodeStringList unic)
     : base(CommandFlags.None,
           "set",
           "Set the value of a string",
           "set <language> <stringid> <value>",
           "Sets the string associated with a stringID in a language.\n" +
           "Remember to put the string value in quotes if it contains spaces.\n" +
           "If the string does not exist, it will be added.")
 {
     Info = info;
     Tag = tag;
     Definition = unic;
 }
Пример #23
0
 public RemoveFromCommand(CommandContextStack stack, OpenTagCache info, TagInstance tag, TagStructureInfo structure, object owner)
     : base(CommandFlags.Inherit,
           "removefrom",
           $"Removes block element(s) from a specified index of a specific tag block in the current {structure.Types[0].Name} definition.",
           "removefrom <tag block name> [* | <tag block index> [* | amount = 1]]",
           $"Removes block element(s) from a specified index of a specific tag block in the current {structure.Types[0].Name} definition.")
 {
     Stack = stack;
     Info = info;
     Tag = tag;
     Structure = structure;
     Owner = owner;
 }
Пример #24
0
        private void ImportTagInstance(TagInstance instance, string path)
        {
            byte[] data;

            using (var inStream = File.OpenRead(path))
            {
                data = new byte[inStream.Length];
                inStream.Read(data, 0, data.Length);
            }

            using (var stream = Info.OpenCacheReadWrite())
                Info.Cache.SetTagDataRaw(stream, instance, data);

            Console.WriteLine($"Imported 0x{data.Length:X} bytes.");
        }
Пример #25
0
        private void ExtractTagInstance(TagInstance tag, string path)
        {
            var info = new FileInfo(path);

            if (!info.Directory.Exists)
                info.Directory.Create();

            byte[] data;

            using (var stream = Info.OpenCacheRead())
                data = Info.Cache.ExtractTagRaw(stream, tag);

            using (var outStream = File.Open(path, FileMode.Create, FileAccess.Write))
            {
                outStream.Write(data, 0, data.Length);
                Console.WriteLine("Wrote 0x{0:X} bytes to {1}.", outStream.Position, path);
                Console.WriteLine("The tag's main struct will be at offset 0x{0:X}.", tag.MainStructOffset);
            }
        }
Пример #26
0
        private bool ExecuteAddRemove(TagInstance tag, List<string> args)
        {
            if (args.Count < 3)
                return false;

            var dependencies = args.Skip(2).Select(a => ArgumentParser.ParseTagIndex(Info, a)).ToList();

            if (dependencies.Count == 0 || dependencies.Any(d => d == null))
                return false;

            using (var stream = Info.OpenCacheReadWrite())
            {
                var data = Info.Cache.ExtractTag(stream, tag);

                if (args[0] == "add")
                {
                    foreach (var dependency in dependencies)
                    {
                        if (data.Dependencies.Add(dependency.Index))
                            Console.WriteLine("Added dependency on tag {0:X8}.", dependency.Index);
                        else
                            Console.Error.WriteLine("Tag {0:X8} already depends on tag {1:X8}.", tag.Index, dependency.Index);
                    }
                }
                else
                {
                    foreach (var dependency in dependencies)
                    {
                        if (data.Dependencies.Remove(dependency.Index))
                            Console.WriteLine("Removed dependency on tag {0:X8}.", dependency.Index);
                        else
                            Console.Error.WriteLine("Tag {0:X8} does not depend on tag {1:X8}.", tag.Index, dependency.Index);
                    }
                }

                Info.Cache.SetTagData(stream, tag, data);
            }

            return true;
        }
Пример #27
0
 /// <summary>
 /// Serializes a tag reference.
 /// </summary>
 /// <param name="writer">The writer to write to.</param>
 /// <param name="referencedTag">The referenced tag.</param>
 /// <param name="valueInfo">Information about the value. Can be <c>null</c>.</param>
 private static void SerializeTagReference(BinaryWriter writer, TagInstance referencedTag, TagFieldAttribute valueInfo)
 {
     // Write the reference out
     if (valueInfo == null || (valueInfo.Flags & TagFieldFlags.Short) == 0)
     {
         writer.Write((referencedTag != null) ? referencedTag.Group.Tag.Value : -1);
         writer.Write(0);
         writer.Write(0);
     }
     writer.Write((referencedTag != null) ? referencedTag.Index : -1);
 }
Пример #28
0
 public static void Populate(CommandContext context, OpenTagCache info, TagInstance tag, ScenarioStructureBsp bsp)
 {
     context.AddCommand(new LoadResourcesCommand(info, tag, bsp));
 }
Пример #29
0
        private bool ImportBitmapResource(TagInstance tagIndex, string cachePath, string dataPath)
        {
            Bitmap bitmap;
            ResourceCache resourceCache;
            uint compressedSize = 0;

            using (var cacheStream = _info.OpenCacheRead())
            {
                var tagContext = new TagSerializationContext(cacheStream, _info.Cache, _info.StringIDs, tagIndex);
                bitmap = _info.Deserializer.Deserialize<Bitmap>(tagContext);
            }
            using (var stream = File.Open(_info.CacheFile.DirectoryName + "\\" + cachePath, FileMode.Open, FileAccess.ReadWrite))
            {
                int imageIndex = 0;
                foreach (string file in Directory.EnumerateFiles(dataPath, "*.bitm"))
                {
                    byte[] inBitmapData = File.ReadAllBytes(file);
                    resourceCache = new ResourceCache(stream);
                    bitmap.Resources[imageIndex].Resource.Index = resourceCache.Add(stream, inBitmapData, out compressedSize);
                    bitmap.Resources[imageIndex].Resource.CompressedSize = compressedSize;
                    imageIndex++;
                }
            }
            using (var cacheStream = _fileInfo.Open(FileMode.Open, FileAccess.ReadWrite))
            {
                var context = new TagSerializationContext(cacheStream, _cache, _stringIds, tagIndex);
                _info.Serializer.Serialize(context, bitmap);
            }
            Console.WriteLine("{1}: Imported 0x{0}.", compressedSize, tagIndex);
            return true;
        }
 public static void Populate(CommandContext context, OpenTagCache info, TagInstance tag, RenderMethod renderMethod)
 {
     context.AddCommand(new ListArgumentsCommand(info, tag, renderMethod));
     context.AddCommand(new ListBitmapsCommand(info, tag, renderMethod));
     context.AddCommand(new SpecifyBitmapsCommand(info, tag, renderMethod));
 }