private void Load(StructureValueCollection values)
 {
     Magic = (int)values.GetNumber("magic");
     ParentMagic = (int)values.GetNumber("parent magic");
     GrandparentMagic = (int)values.GetNumber("grandparent magic");
     Description = new StringID((int)values.GetNumberOrDefault("stringid", 0));
 }
        public ThirdGenGlobal(StructureValueCollection values, ExpressionTable allExpressions)
        {
            Name = values.GetString("name");
            Type = (short)values.GetNumber("type");

            DatumIndex valueIndex = new DatumIndex(values.GetNumber("expression index"));
            if (valueIndex.IsValid)
                Value = allExpressions.FindExpression(valueIndex);
        }
Beispiel #3
0
        void Load(StructureValueCollection values, ushort index, MetaAddressConverter converter, IList<ITagClass> classList)
        {
            int classIndex = (int)values.GetNumber("class index");
            if (classIndex >= 0)
                Class = classList[classIndex];

            ushort salt = (ushort)values.GetNumber("datum index salt");
            Index = new DatumIndex(salt, index);

            MetaLocation = new Pointer(values.GetNumber("memory address"), converter);
        }
        private void Load(IReader reader, StructureValueCollection values, MetaAddressConverter addrConverter, IStringIDSource stringIDs, ExpressionTable expressions, BuildInformation buildInfo)
        {
            Name = stringIDs.GetString(new StringID((int)values.GetNumber("name index")));
            ExecutionType = (short)values.GetNumber("execution type");
            ReturnType = (short)values.GetNumber("return type");
            DatumIndex rootExpr = new DatumIndex(values.GetNumber("first expression index"));
            if (rootExpr.IsValid)
                RootExpression = expressions.FindExpression(rootExpr);
            if (Name == null)
                Name = "script_" + rootExpr.Value.ToString("X8");

            Parameters = LoadParameters(reader, values, addrConverter, buildInfo);
        }
        private void Load(IReader reader, StructureValueCollection values, MetaAddressConverter converter, BuildInformation buildInfo)
        {
            if (values.GetNumber("magic") != CharConstant.FromString("tags"))
                throw new ArgumentException("Invalid index table header magic");

            // Classes
            int numClasses = (int)values.GetNumber("number of classes");
            Pointer classTableLocation = new Pointer(values.GetNumber("class table address"), converter);
            _classes = ReadClasses(reader, classTableLocation, numClasses, buildInfo);

            // Tags
            int numTags = (int)values.GetNumber("number of tags");
            Pointer tagTableLocation = new Pointer(values.GetNumber("tag table address"), converter);
            _tags = ReadTags(reader, tagTableLocation, numTags, buildInfo, converter);
        }
        private IList<IScriptParameter> LoadParameters(IReader reader, StructureValueCollection values, MetaAddressConverter addrConverter, BuildInformation buildInfo)
        {
            int paramCount = (int)values.GetNumber("number of parameters");
            Pointer paramListLocation = new Pointer(values.GetNumber("address of parameter list"), addrConverter);

            StructureLayout layout = buildInfo.GetLayout("script parameter entry");
            List<IScriptParameter> result = new List<IScriptParameter>();

            reader.SeekTo(paramListLocation.AsOffset());
            for (int i = 0; i < paramCount; i++)
            {
                StructureValueCollection paramValues = StructureReader.ReadStructure(reader, layout);
                result.Add(new ThirdGenScriptParameter(paramValues));
            }
            return result;
        }
        private List<IGlobalObject> LoadScriptObjects(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, IStringIDSource stringIDs, StructureLayout entryLayout)
        {
            int objectsCount = (int)values.GetNumber("number of script objects");
            ScriptObjectsLocation = new Pointer(values.GetNumber("script object table address"), addrConverter);

            List<IGlobalObject> result = new List<IGlobalObject>();
            reader.SeekTo(ScriptObjectsLocation.AsOffset());
            for (int i = 0; i < objectsCount; i++)
            {
                StructureValueCollection objValues = StructureReader.ReadStructure(reader, entryLayout);
                result.Add(new ThirdGenGlobalObject(objValues, stringIDs));
            }
            return result;
        }
        private void Load(StructureValueCollection values, ushort index, StringTableReader stringReader)
        {
            ushort salt = (ushort)values.GetNumber("datum index salt");
            Index = new DatumIndex(salt, index);

            Opcode = (ushort)values.GetNumber("opcode");
            ValueType = (short)values.GetNumber("value type");
            Type = (ExpressionType)values.GetNumber("expression type");
            _nextIndex = new DatumIndex(values.GetNumber("next expression index"));
            _stringTableOffset = (int)values.GetNumber("string table offset");
            Value = values.GetNumber("value");
            LineNumber = (short)values.GetNumber("source line");

            stringReader.RequestString(_stringTableOffset);
        }
        private HeaderOffsetConverter LoadHeaderOffsetConverter(StructureValueCollection values)
        {
            // Only apply a modifier if the original raw table offset wasn't zero
            StringOffsetMagic = (uint)HeaderSize;
            if (values.HasNumber("raw table offset") && values.GetNumber("raw table offset") > 0)
                StringOffsetMagic = values.GetNumberOrDefault("string offset magic", (uint)HeaderSize);

            return new HeaderOffsetConverter(this);
        }
Beispiel #10
0
        private MetaAddressConverter LoadAddressConverter(StructureValueCollection values)
        {
            VirtualBaseAddress = values.GetNumber("virtual base address");

            if (values.HasNumber("raw table offset") && values.HasNumber("raw table size"))
            {
                // Load raw table info
                RawTableSize = values.GetNumber("raw table size");
                RawTableOffset = values.GetNumber("raw table offset");
                _originalRawTableOffset = RawTableOffset;

                // There are two ways to get the meta offset:
                // 1. Raw table offset + raw table size
                // 2. If raw table offset is zero, then the meta offset is directly stored in the header
                //    (The raw table offset can still be calculated in this case, but can't be used to find the meta the traditional way)
                if (RawTableOffset != 0)
                    MetaOffset = RawTableOffset + RawTableSize;
                else
                    RawTableOffset = values.GetNumber("raw table offset from header") + (uint)HeaderSize;
            }

            uint temp = MetaOffset;
            if (MetaOffset == 0 && !values.FindNumber("meta offset", out temp))
            {
                throw new ArgumentException("The XML layout file is missing information on how to calculate map magic.");
            }
            MetaOffset = temp;

            return new MetaAddressConverter(this);
        }
Beispiel #11
0
        private void Load(StructureValueCollection values)
        {
            _addrConverter = LoadAddressConverter(values);
            _indexConverter = LoadIndexOffsetConverter(values);
            _stringOffsetConverter = LoadHeaderOffsetConverter(values);

            FileSize = values.GetNumber("file size");
            IndexHeaderLocation = new Pointer(values.GetNumber("index header address"), _addrConverter);
            MetaSize = values.GetNumber("virtual size");
            Type = (CacheFileType)values.GetNumber("type");

            StringIDCount = (int)values.GetNumber("string table count");
            StringIDTableSize = (int)values.GetNumber("string table size");
            StringIDIndexTableLocation = new Pointer(values.GetNumber("string index table offset"), _stringOffsetConverter);
            StringIDDataLocation = new Pointer(values.GetNumber("string table offset"), _stringOffsetConverter);

            InternalName = values.GetString("internal name");
            ScenarioName = values.GetString("scenario name");

            FileNameCount = (int)values.GetNumber("file table count");
            FileNameDataLocation = new Pointer(values.GetNumber("file table offset"), _stringOffsetConverter);
            FileNameTableSize = (int)values.GetNumber("file table size");
            FileNameIndexTableLocation = new Pointer(values.GetNumber("file index table offset"), _stringOffsetConverter);

            XDKVersion = (int)values.GetNumber("xdk version");
            Partitions = LoadPartitions(values.GetArray("partitions"));

            LocaleDataLocation = new Pointer(values.GetNumberOrDefault("locale data index offset", (uint)HeaderSize), _indexConverter);
            LocaleDataSize = (int)values.GetNumberOrDefault("locale data size", 0);
        }
        private ExpressionTable LoadScriptExpressions(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, StringTableReader stringReader, StructureLayout entryLayout)
        {
            int exprCount = (int)values.GetNumber("number of script expressions");
            ScriptExpressionsLocation = new Pointer(values.GetNumber("script expression table address"), addrConverter);

            ExpressionTable result = new ExpressionTable();
            reader.SeekTo(ScriptExpressionsLocation.AsOffset());
            for (int i = 0; i < exprCount; i++)
            {
                StructureValueCollection exprValues = StructureReader.ReadStructure(reader, entryLayout);
                result.AddExpression(new ThirdGenExpression(exprValues, (ushort)i, stringReader));
            }

            foreach (IExpression expr in result)
            {
                // FIXME: hax
                if (expr != null)
                    ((ThirdGenExpression)expr).ResolveReferences(result);
            }
            return result;
        }
        private CachedStringTable LoadStrings(StructureValueCollection values, IReader reader, StringTableReader stringReader, MetaAddressConverter addrConverter)
        {
            int stringsSize = (int)values.GetNumber("script string table size");
            Pointer stringsLocation = new Pointer(values.GetNumber("script string table address"), addrConverter);

            CachedStringTable result = new CachedStringTable();
            stringReader.ReadRequestedStrings(reader, stringsLocation, result);
            return result;
        }
        private List<IScript> LoadScripts(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, IStringIDSource stringIDs, ExpressionTable expressions, StructureLayout entryLayout, BuildInformation buildInfo)
        {
            int script = (int)values.GetNumber("number of scripts");
            ScriptsLocation = new Pointer(values.GetNumber("script table address"), addrConverter);

            // Read all of the script entries first, then go back and create the objects
            // ThirdGenScript reads parameters from its constructor - this may or may not need cleaning up to make this more obvious
            reader.SeekTo(ScriptsLocation.AsOffset());
            List<StructureValueCollection> scriptData = new List<StructureValueCollection>();
            for (int i = 0; i < script; i++)
                scriptData.Add(StructureReader.ReadStructure(reader, entryLayout));

            List<IScript> result = new List<IScript>();
            foreach (StructureValueCollection scriptValues in scriptData)
                result.Add(new ThirdGenScript(reader, scriptValues, addrConverter, stringIDs, expressions, buildInfo));
            return result;
        }
        private List<IGlobal> LoadScriptGlobals(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, ExpressionTable expressions, StructureLayout entryLayout)
        {
            int globalsCount = (int)values.GetNumber("number of script globals");
            ScriptGlobalsLocation = new Pointer(values.GetNumber("script global table address"), addrConverter);

            List<IGlobal> result = new List<IGlobal>();
            reader.SeekTo(ScriptGlobalsLocation.AsOffset());
            for (int i = 0; i < globalsCount; i++)
            {
                StructureValueCollection globalValues = StructureReader.ReadStructure(reader, entryLayout);
                result.Add(new ThirdGenGlobal(globalValues, expressions));
            }
            return result;
        }
 public ThirdGenGlobalObject(StructureValueCollection values, IStringIDSource stringIDs)
 {
     Name = stringIDs.GetString(new StringID((int)values.GetNumber("name index")));
     Class = (short)values.GetNumber("type");
     PlacementIndex = (short)values.GetNumber("placement index");
 }
 private void Load(StructureValueCollection values)
 {
     Name = values.GetString("name");
     Type = (short)values.GetNumber("type");
 }
        private void Load(StructureValueCollection values, IndexOffsetConverter converter)
        {
            StringCount = (int)values.GetNumber("string count");
            LocaleTableSize = (int)values.GetNumber("locale table size");
            LocaleIndexTableLocation = new Pointer(values.GetNumber("locale index table offset"), converter);
            LocaleDataLocation = new Pointer(values.GetNumber("locale data index offset"), converter);

            // H3 beta doesn't have hashes
            if (values.HasRaw("index table hash"))
                IndexTableHash = values.GetRaw("index table hash");
            if (values.HasRaw("string data hash"))
                StringDataHash = values.GetRaw("string data hash");
        }