private void Load(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, IStringIDSource stringIDs, BuildInformation buildInfo) { StringTableReader stringReader = new StringTableReader(); ScriptExpressions = LoadScriptExpressions(values, reader, addrConverter, stringReader, buildInfo.GetLayout("script expression entry")); ScriptObjects = LoadScriptObjects(values, reader, addrConverter, stringIDs, buildInfo.GetLayout("script object entry")); ScriptGlobals = LoadScriptGlobals(values, reader, addrConverter, ScriptExpressions, buildInfo.GetLayout("script global entry")); Scripts = LoadScripts(values, reader, addrConverter, stringIDs, ScriptExpressions, buildInfo.GetLayout("script entry"), buildInfo); CachedStringTable strings = LoadStrings(values, reader, stringReader, addrConverter); foreach (IExpression expr in ScriptExpressions) { // FIXME: hax if (expr != null) ((ThirdGenExpression)expr).ResolveStrings(strings); } }
public ThirdGenLanguage(ThirdGenLanguageGlobals languageGlobals, StructureValueCollection values, IndexOffsetConverter converter, BuildInformation buildInfo) { _languageGlobals = languageGlobals; _pointerLayout = buildInfo.GetLayout("locale index table entry"); _encryptionKey = buildInfo.LocaleKey; _symbols = buildInfo.LocaleSymbols; _converter = converter; _pageSize = buildInfo.LocaleAlignment; Load(values, 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 ThirdGenTagTable LoadTags(IReader reader, BuildInformation buildInfo) { reader.SeekTo(_header.IndexHeaderLocation.AsOffset()); StructureValueCollection values = StructureReader.ReadStructure(reader, buildInfo.GetLayout("index header")); return new ThirdGenTagTable(reader, values, _header.MetaPointerConverter, buildInfo); }
private ThirdGenScenarioMeta LoadScenario(IReader reader, BuildInformation buildInfo) { if (!buildInfo.HasLayout("scnr")) return null; ITag scnr = FindTagByClass(ScnrMagic); if (scnr == null) throw new InvalidOperationException("The cache file is missing a scnr tag."); reader.SeekTo(scnr.MetaLocation.AsOffset()); StructureValueCollection values = StructureReader.ReadStructure(reader, buildInfo.GetLayout("scnr")); return new ThirdGenScenarioMeta(values, reader, _header.MetaPointerConverter, _stringIds, buildInfo); }
private List<ILocaleGroup> LoadLocaleGroups(IReader reader, BuildInformation buildInfo) { List<ILocaleGroup> result = new List<ILocaleGroup>(); // Locale groups are stored in unic tags StructureLayout layout = buildInfo.GetLayout("unic"); foreach (ITag tag in _tags.Tags) { if (tag != null && tag.Class != null && tag.Class.Magic == UnicMagic && tag.MetaLocation.AsAddress() > 0) { reader.SeekTo(tag.MetaLocation.AsOffset()); StructureValueCollection values = StructureReader.ReadStructure(reader, layout); result.Add(new ThirdGenLocaleGroup(values, tag.Index)); } } return result; }
private ThirdGenHeader LoadHeader(IReader reader, BuildInformation buildInfo, string buildString) { reader.SeekTo(0); StructureValueCollection values = StructureReader.ReadStructure(reader, buildInfo.GetLayout("header")); return new ThirdGenHeader(values, buildInfo, buildString); }
private void FindLanguageTable(BuildInformation buildInfo, out ITag tag, out StructureLayout layout) { // Check for a PATG tag, and if one isn't found, then use MATG tag = null; layout = null; if (buildInfo.HasLayout("patg")) { tag = FindTagByClass(PatgMagic); layout = buildInfo.GetLayout("patg"); } if (tag == null) { tag = FindTagByClass(MatgMagic); layout = buildInfo.GetLayout("matg"); } if (tag == null || layout == null) throw new InvalidOperationException("The cache file is missing locale information."); }
private List<ITagClass> ReadClasses(IReader reader, Pointer classTableLocation, int numClasses, BuildInformation buildInfo) { StructureLayout layout = buildInfo.GetLayout("class entry"); List<ITagClass> result = new List<ITagClass>(); reader.SeekTo(classTableLocation.AsOffset()); for (int i = 0; i < numClasses; i++) { StructureValueCollection values = StructureReader.ReadStructure(reader, layout); result.Add(new ThirdGenTagClass(values)); } return result; }
private List<ITag> ReadTags(IReader reader, Pointer tagTableLocation, int numTags, BuildInformation buildInfo, MetaAddressConverter converter) { StructureLayout layout = buildInfo.GetLayout("tag entry"); List<ITag> result = new List<ITag>(); reader.SeekTo(tagTableLocation.AsOffset()); for (int i = 0; i < numTags; i++) { StructureValueCollection values = StructureReader.ReadStructure(reader, layout); result.Add(new ThirdGenTag(values, (ushort)i, converter, _classes)); } return result; }