/// <summary> /// Stream the field from a tag stream /// </summary> /// <param name="ts"></param> /// <exception cref="Exceptions.InvalidStringId"></exception> public override void Read(IO.ITagStream ts) { if (Handle.Set == -1) // HACK used to tell Read that we already read the string data (as this is an old halo 2 tag) { Handle = new Blam.StringId(Handle.Description, Handle.Index, Handle.Length, 0); return; } if (!ts.Flags.Test(IO.ITagStreamFlags.DontStreamStringData)) // stream the string id value if we can { IO.EndianReader s = ts.GetInputStream(); relativeOffset = s.PositionUnsigned; string value = null; try { value = new string(s.ReadChars(Handle.Length)); if (Handle != Blam.StringId.Null) { Program.GetTagIndex(OwnerId).StringIds.TryAndGetStringId(value, out Handle); } } catch (Exception ex) { throw new Exceptions.InvalidStringId(ex, base.headerOffset, base.relativeOffset, ts, Handle.Length, value); } } }
/// <summary> /// Stream the field header data from a tag stream /// </summary> /// <param name="ts"></param> /// <exception cref="Exceptions.InvalidStringId"></exception> public override void ReadHeader(IO.ITagStream ts) { IO.EndianReader s = ts.GetInputStream(); headerOffset = s.PositionUnsigned; // nifty for debugging OwnerId = ts.OwnerId; string value = null; try { if (fieldType == FieldType.OldStringId && ts.Flags.Test(IO.ITagStreamFlags.Halo2OldFormat_StringId)) { value = s.ReadAsciiString(28); // max of 28 characters in the string id in old builds } var owner = Program.GetTagIndex(OwnerId); Handle.Read(s, owner.StringIds.Definition.Description); if (value != null /*&& Handle != Blam.StringID.Null*/) { owner.StringIds.TryAndGetStringId(value, out Handle); Handle = new Blam.StringId(Handle.Description, Handle.Index, Handle.Length, -1); // HACK used to tell Read that we already read the string data (as this is an old halo 2 tag) } } catch (Exception ex) { throw new Exceptions.InvalidStringId(ex, base.headerOffset, uint.MaxValue, ts, Handle.Length, value); } }
public static void Output(CacheFileBase c, System.IO.StreamWriter s, sound_cache_file_gestalt_group owner, TI.Block <sound_gestalt_permutations_block> block) { const string format = "\t{0}\t\t{1}\t{2}\t{3}\t{4}\t{5}"; s.WriteLine("{0}\tsound_gestalt_permutations_block", block.Count); int x = 0; foreach (sound_gestalt_permutations_block def in block) { int name_index = def.Name.Value; Blam.StringId name = name_index >= 0 ? owner.ImportNames[name_index].ImportName.Handle : Blam.StringId.Null; s.WriteLine(format, (x++).ToString(), def.PermutationInfoIndex.ToString(), def.FirstChunk.Value.ToString(), def.ChunkCount.Value.ToString(), def.GetPermutationIndex().ToString(), c.StringIds.GetStringIdValue(name)); } }
public static void Output(CacheFileBase c, System.IO.StreamWriter s, sound_cache_file_gestalt_group owner, TI.Block <sound_gestalt_pitch_ranges_block> block) { const string format = "\t{0}\t\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}"; s.WriteLine("{0}\tsound_gestalt_pitch_ranges_block", block.Count); int x = 0; foreach (sound_gestalt_pitch_ranges_block def in block) { int name_index = def.Name.Value; Blam.StringId name = name_index >= 0 ? owner.ImportNames[name_index].ImportName.Handle : Blam.StringId.Null; s.WriteLine(format, (x++).ToString(), def.Parameters.Value.ToString(), def.Unknown04.Value.ToString(), def.EncodedPermutationData.Value.ToString("X4"), def.FirstPermutation.Value.ToString(), def.GetPermutationCount().ToString(), c.StringIds.GetStringIdValue(name)); } }
/// <summary> /// Copy constructor /// </summary> /// <param name="value">field to copy</param> public StringId(StringId value) : base(value.fieldType) { Handle = value.Handle; OwnerId = value.OwnerId; }
/// <summary> /// Copy the string data of <paramref name="reference_index"/> into the <paramref name="dst"/> array /// at starting index <paramref name="dst_offset"/> and return the total bytes copied. Also provides the /// string id name of <paramref name="reference_index"/>. /// </summary> /// <param name="reference_index"></param> /// <param name="dst"></param> /// <param name="dst_offset"></param> /// <param name="name"></param> /// <returns></returns> internal int CopyStringReferenceData(int reference_index, byte[] dst, int dst_offset, out Blam.StringId name) { int offset = GetStringBaseOffset(reference_index); int size = GetStringBufferSize(reference_index); Array.Copy(stringData, offset, dst, dst_offset, size); name = stringReferences[reference_index].NameId; return(size); }
static multilingual_unicode_string_reference_block AddOrGetReferenceByName(multilingual_unicode_string_list_group def, Blam.StringId name) { // See if a reference already exists for [name]... foreach (var sref in def.StringRefs) { if (sref.StringId.Handle == name) { return(sref); } } // one doesn't, so add it and return the new block data multilingual_unicode_string_reference_block sr; def.StringRefs.Add(out sr); // Initialize name id sr.StringId.Handle = name; // Initialize all the offsets to be invalid foreach (var lang_offset in sr.LanguageOffsets) { lang_offset.Value = -1; } return(sr); }
/// <summary> /// Stream the field from a tag stream /// </summary> /// <param name="ts"></param> /// <exception cref="Exceptions.InvalidStringId"></exception> public override void Read(IO.ITagStream ts) { if (Handle.Set == -1) // HACK used to tell Read that we already read the string data (as this is an old halo 2 tag) { Handle = new Blam.StringId(Handle.Description, Handle.Index, Handle.Length, 0); return; } if (!ts.Flags.Test(IO.ITagStreamFlags.DontStreamStringData)) // stream the string id value if we can { IO.EndianReader s = ts.GetInputStream(); relativeOffset = s.PositionUnsigned; string value = null; try { value = new string(s.ReadChars(Handle.Length)); if (Handle != Blam.StringId.Null) Program.GetTagIndex(OwnerId).StringIds.TryAndGetStringId(value, out Handle); } catch (Exception ex) { throw new Exceptions.InvalidStringId(ex, base.headerOffset, base.relativeOffset, ts, Handle.Length, value); } } }
/// <summary> /// Stream the field header data from a tag stream /// </summary> /// <param name="ts"></param> /// <exception cref="Exceptions.InvalidStringId"></exception> public override void ReadHeader(IO.ITagStream ts) { IO.EndianReader s = ts.GetInputStream(); headerOffset = s.PositionUnsigned; // nifty for debugging OwnerId = ts.OwnerId; string value = null; try { if (fieldType == FieldType.OldStringId && ts.Flags.Test(IO.ITagStreamFlags.Halo2OldFormat_StringId)) value = s.ReadAsciiString(28); // max of 28 characters in the string id in old builds var owner = Program.GetTagIndex(OwnerId); Handle.Read(s, owner.StringIds.Definition.Description); if (value != null /*&& Handle != Blam.StringID.Null*/) { owner.StringIds.TryAndGetStringId(value, out Handle); Handle = new Blam.StringId(Handle.Description, Handle.Index, Handle.Length, -1); // HACK used to tell Read that we already read the string data (as this is an old halo 2 tag) } } catch (Exception ex) { throw new Exceptions.InvalidStringId(ex, base.headerOffset, uint.MaxValue, ts, Handle.Length, value); } }
static IMultilingualUnicodeStringReference AddOrGetReferenceByName(Blam.CacheFile c, IMultilingualUnicodeStringList list, Blam.StringId name) { // See if a reference already exists for [name]... foreach (var sref in list.StringRefs) { if (sref.Name.Handle == name) { return(sref); } } // one doesn't, so add it and return the new block data IMultilingualUnicodeStringReference sr = list.NewReference(); // Initialize name id sr.Name.Handle = name; sr.Name.OwnerId = c.TagIndexManager.IndexId; // Initialize all the offsets to be invalid foreach (var lang_offset in sr.LanguageOffsets) { lang_offset.Value = -1; } return(sr); }
public CacheFileLanguagePackStringReference(Blam.StringIdDesc desc) { NameId = new Blam.StringId(desc, 0); Offset = 0; }