Exemplo n.º 1
0
        /// <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);
                }
            }
        }
Exemplo n.º 2
0
        /// <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);
            }
        }
Exemplo n.º 3
0
        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));
            }
        }
Exemplo n.º 4
0
        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));
            }
        }
Exemplo n.º 5
0
 /// <summary>
 /// Copy constructor
 /// </summary>
 /// <param name="value">field to copy</param>
 public StringId(StringId value) :                               base(value.fieldType)
 {
     Handle = value.Handle; OwnerId = value.OwnerId;
 }
Exemplo n.º 6
0
        /// <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);
        }
Exemplo n.º 7
0
            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);
            }
Exemplo n.º 8
0
		/// <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);
				}
			}
		}
Exemplo n.º 9
0
		/// <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);
			}
		}
Exemplo n.º 10
0
		/// <summary>
		/// Copy constructor
		/// </summary>
		/// <param name="value">field to copy</param>
		public StringId(StringId value) :				base(value.fieldType)		{ Handle = value.Handle; OwnerId = value.OwnerId; }
        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;
 }