示例#1
0
        public override byte[] GetRawFromID(DatumHandle ID, int DataLength)
        {
            EndianReader er;
            string       fName = "";

            long cIndex = (ID.Value & 0xC0000000) >> 30;
            int  offset = (int)ID.Value & 0x3FFFFFFF;

            if (cIndex != 0)
            {
                switch (cIndex)
                {
                case 1:
                    fName = Path.Combine(File.Directory.FullName, "mainmenu.map");
                    break;

                case 2:
                    fName = Path.Combine(File.Directory.FullName, "shared.map");
                    break;

                case 3:
                    fName = Path.Combine(File.Directory.FullName, "single_player_shared.map");
                    break;
                }
                FileStream fs = new FileStream(fName, FileMode.Open, FileAccess.Read);
                er = new EndianReader(fs, EndianFormat.LittleEndian);
            }
            else
            {
                er = Reader;
            }

            er.SeekTo(offset);

            var data = er.ReadBytes(DataLength);

            if (er != Reader)
            {
                er.Close();
                er.Dispose();
            }

            return(data);
        }
示例#2
0
        private byte[] GetSecondaryResource(DatumHandle ID)
        {
            var resource = ResourceGestalt.TagResources[ID.Index];

            if (resource.SegmentIndex == -1)
            {
                return(null);
            }

            var segment = ResourceLayoutTable.Sections[resource.SegmentIndex];

            if (segment.OptionalPageIndex == -1 || segment.OptionalSegmentOffset == -1)
            {
                return(null);
            }

            if (ResourceLayoutTable.Pages[segment.OptionalPageIndex].CrcChecksum == -1)
            {
                return(null);
            }

            return(ReadSegmentData(resource, segment.OptionalPageIndex, segment.OptionalSegmentOffset, segment.OptionalSizeIndex));
        }
示例#3
0
        public override object Execute(List <string> args)
        {
            if (args.Count > 2)
            {
                return(false);
            }

            var  csvFileName    = $"{Cache.Version.ToString()}_{Definition.MapId}_scripts.csv";
            bool printToConsole = false;

            if (args.Count > 0 && args[0].ToLower() == "print")
            {
                printToConsole = true;
                if (args.Count == 2)
                {
                    csvFileName = args[1];
                }
            }
            else if (args.Count == 1)
            {
                csvFileName = args[0];
            }

            var globals = new Dictionary <DatumHandle, string>();

            CsvAdd("Globals", printToConsole);
            for (int index = 0; index < Definition.Globals.Count; index++)
            {
                CsvAdd($"{index:D4}," +
                       $"{index:X4}," +
                       $"{Definition.Globals[index].InitializationExpressionHandle:X8}," +
                       $"{Definition.Globals[index].InitializationExpressionHandle.Salt:X4}," +
                       $"{Definition.Globals[index].Name,-0x20}," +
                       $"{GetHsTypeAsString(Cache.Version, Definition.Globals[index].Type)}",
                       printToConsole);

                globals.Add(Definition.Globals[index].InitializationExpressionHandle, Definition.Globals[index].Name);
            }

            CsvAdd("Scripts", printToConsole);
            for (int index = 0; index < Definition.Scripts.Count; index++)
            {
                CsvAdd($"{index:D4}," +
                       $"{index:X4}," +
                       $"{Definition.Scripts[index].Type.ToString()}," +
                       $"{GetHsTypeAsString(Cache.Version, Definition.Scripts[index].ReturnType)}," +
                       $"{Definition.Scripts[index].ScriptName}," +
                       $"A:{Definition.Scripts[index].RootExpressionHandle:X8}",
                       printToConsole);
            }

            for (int index = 0; index < Definition.ScriptExpressions.Count; index++)
            {
                if (Definition.ScriptExpressions[index].Opcode == 0xBABA)
                {
                    continue;
                }

                string scriptGroupName = "";

                if (Definition.ScriptExpressions[index].NextExpressionHandle == DatumHandle.None &&
                    Definition.ScriptExpressions[index].Flags == HsSyntaxNodeFlags.Group &&
                    Definition.ScriptExpressions[index].Opcode == 0x0)
                {
                    var relativeHsScript = Definition.Scripts.Find(x => x.RootExpressionHandle.Salt == Definition.ScriptExpressions[index].Identifier);
                    if (relativeHsScript != null)
                    {
                        scriptGroupName = $",S:{relativeHsScript.ScriptName}";
                    }
                }

                DatumHandle expressionHandle = new DatumHandle((uint)((Definition.ScriptExpressions[index].Identifier << 16) + index));

                if (globals.ContainsKey(expressionHandle))
                {
                    scriptGroupName = $"G:{globals[expressionHandle]}";
                }

                string opcodeName = "";

                if (ScriptExpressionIsValue(Definition.ScriptExpressions[index]) && ScriptInfo.ValueTypes[Cache.Version].ContainsKey(Definition.ScriptExpressions[index].Opcode))
                {
                    opcodeName = $"{ScriptInfo.ValueTypes[Cache.Version][Definition.ScriptExpressions[index].Opcode]},value";
                }

                else if (ScriptInfo.Scripts[Cache.Version].ContainsKey(Definition.ScriptExpressions[index].Opcode))
                {
                    opcodeName = ScriptInfo.Scripts[Cache.Version][Definition.ScriptExpressions[index].Opcode].Name;
                }

                if ((Definition.ScriptExpressions[index].Flags == HsSyntaxNodeFlags.ScriptReference) || (index > 0 && Definition.ScriptExpressions[index - 1].Flags == HsSyntaxNodeFlags.ScriptReference))
                {
                    opcodeName = "";
                }

                CsvAdd($"{index:D8}," +
                       $"{((Definition.ScriptExpressions[index].Identifier << 16) | index):X8}," +
                       $"{Definition.ScriptExpressions[index].NextExpressionHandle.Value:X8}," +
                       $"{Definition.ScriptExpressions[index].Opcode:X4}," +
                       $"{Definition.ScriptExpressions[index].Data[0]:X2}" +
                       $"{Definition.ScriptExpressions[index].Data[1]:X2}" +
                       $"{Definition.ScriptExpressions[index].Data[2]:X2}" +
                       $"{Definition.ScriptExpressions[index].Data[3]:X2}," +
                       $"{Definition.ScriptExpressions[index].Flags}," +
                       $"{GetHsTypeAsString(Cache.Version, Definition.ScriptExpressions[index].ValueType)}," +
                       $"{opcodeName}," +
                       $"{scriptGroupName}",
                       printToConsole);
            }

            CsvDumpQueueToFile(CsvQueue1, csvFileName);
            return(true);
        }
示例#4
0
 public virtual byte[] GetSecondaryResource(DatumHandle ID, int dataLength, int offset = 0, bool padding = false)
 {
     throw new NotImplementedException();
 }
示例#5
0
 public virtual byte[] GetSoundRaw(DatumHandle ID, int size)
 {
     throw new NotImplementedException();
 }
示例#6
0
 public virtual byte[] GetRawFromID(DatumHandle ID, int DataLength)
 {
     throw new NotImplementedException();
 }
示例#7
0
 public byte[] GetRawFromID(DatumHandle ID)
 {
     return(GetRawFromID(ID, -1));
 }
示例#8
0
 public static void Write(this BinaryWriter writer, DatumHandle value, EndianFormat format = EndianFormat.LittleEndian)
 {
     writer.Write(value.Value, format);
 }
示例#9
0
 public static byte[] GetXMAData(CacheFile cache, DatumHandle handle, int size)
 {
     return(cache.GetSoundRaw(handle, size));
 }