コード例 #1
0
        static void GetFace(bool inc, TI.IElementArray ea, int fi, int index, out string s0, out string s1, out string s2)
        {
            if (ea == null)
            {
                s0 = s1 = s2 = "";
                return;
            }

            TI.Field f0 = ea[index + 0, fi], f1 = ea[index + 1, fi], f2 = ea[index + 2, fi];
            var      ft = f0.FieldType;

            switch (ft)
            {
            case TI.FieldType.ShortInteger:
                s0 = ((f0 as TI.ShortInteger).Value + (inc ? 1 : 0)).ToString();
                s1 = ((f1 as TI.ShortInteger).Value + (inc ? 1 : 0)).ToString();
                s2 = ((f2 as TI.ShortInteger).Value + (inc ? 1 : 0)).ToString();
                break;

            case TI.FieldType.LongInteger:
                s0 = ((f0 as TI.LongInteger).Value + (inc ? 1 : 0)).ToString();
                s1 = ((f1 as TI.LongInteger).Value + (inc ? 1 : 0)).ToString();
                s2 = ((f2 as TI.LongInteger).Value + (inc ? 1 : 0)).ToString();
                break;

            default: throw new Debug.Exceptions.UnreachableException(ft);
            }
        }
コード例 #2
0
ファイル: Integers.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)							{ return new BlockIndex( from.FieldType ); }
コード例 #3
0
ファイル: Integers.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field (unused)</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)									{ return new ShortIntegerBounds(); }
コード例 #4
0
ファイル: Integers.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field (unused)</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)										{ return new Rectangle2D(); }
コード例 #5
0
ファイル: Reals.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)										{ return new RealBounds( from.FieldType ); }
コード例 #6
0
ファイル: Padding.cs プロジェクト: guardian2433/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from) { return new UselessPad((from as UselessPad).Value); }
コード例 #7
0
ファイル: String.cs プロジェクト: guardian2433/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field (unused)</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)							{ return new StringId(from.FieldType == FieldType.OldStringId); }
コード例 #8
0
ファイル: Integers.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)							{ return new Enum( from.FieldType ); }
コード例 #9
0
ファイル: Field.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field (unused in most cases)</param>
		/// <returns>new field of this type</returns>
		public abstract Field CreateInstance(Field from);
コード例 #10
0
ファイル: FieldUtil.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Calculate the size (in bytes) of a certain field depending on certain factors
		/// </summary>
		/// <param name="f">Field instance</param>
		/// <param name="game">Game the field is for</param>
		/// <param name="cache">Is the field in a cache file?</param>
		/// <param name="flags"><see cref="IO.ITagStreamFlags"/></param>
		/// <returns>Size in bytes of the field instance</returns>
		public static int Sizeof(Field f, BlamVersion game, bool cache, uint flags)
		{
			switch (f.FieldType)
			{
				case FieldType.String:
					return (f as String).GetFieldSize();

				#region StringId
				case FieldType.OldStringId:
					if (Util.Flags.Test(flags, IO.ITagStreamFlags.Halo2OldFormat_StringId))
					{
						return 32; // 28 bytes are preview string, 4 bytes for the string_id
					}
					goto case FieldType.StringId;

				case FieldType.StringId:
					if ((game & BlamVersion.Halo1) != 0 || (game & BlamVersion.Stubbs) != 0)
					{
						return 20; // we treat string ids as tag data in these games
					}
					else if (game == BlamVersion.Halo2_Alpha)
					{
						return 32; // 28 bytes are preview string, 4 bytes for the string_id
					}
					else if ((game & BlamVersion.Halo2) != 0 || // even echo used this format
							(game & BlamVersion.Halo3) != 0)
					{
						return 4;
					}
					throw new Debug.ExceptionLog("Failed to handle a string id: {0}", game);
				#endregion

				#region sizeof(byte)
				case FieldType.ByteInteger:
				case FieldType.ByteEnum:
				case FieldType.ByteFlags:
				case FieldType.ByteBlockIndex:
					return 1;
				#endregion

				#region sizeof(word)
				case FieldType.ShortInteger:
				case FieldType.Enum:
				case FieldType.WordFlags:
				case FieldType.ShortBlockIndex:
					return 2;
				#endregion

				#region sizeof(dword)
				case FieldType.LongInteger:
				case FieldType.Angle:
				case FieldType.Tag:
				case FieldType.LongEnum:
				case FieldType.Point2D:
				case FieldType.LongFlags:
				case FieldType.RgbColor:
				case FieldType.ArgbColor:
				case FieldType.Real:
				case FieldType.RealFraction:
				case FieldType.ShortBounds:
				case FieldType.LongBlockIndex:
					return 4;
				#endregion

				#region sizeof(qword)
				case FieldType.Rectangle2D:
				case FieldType.RealPoint2D:
				case FieldType.RealVector2D:
				case FieldType.RealEulerAngles2D:
				case FieldType.AngleBounds:
				case FieldType.RealBounds:
				case FieldType.RealFractionBounds:
					return 4 + 4;
				#endregion

				#region sizeof(real_vector3d)
				case FieldType.RealPoint3D:
				case FieldType.RealVector3D:
				case FieldType.RealPlane2D:
				case FieldType.RealRgbColor:
				case FieldType.RealEulerAngles3D:
					return 4 + 4 + 4;
				#endregion

				#region sizeof(real_vector4d)
				case FieldType.RealQuaternion:
				case FieldType.RealPlane3D:
				case FieldType.RealArgbColor:
					return 4 + 4 + 4 + 4;
				#endregion

				#region TagReference
				case FieldType.TagReference:
					if ((game & (BlamVersion.Halo1 | BlamVersion.Stubbs)) != 0)
					{
						return 16;
					}
					else if (game == BlamVersion.Halo2_Alpha || game == BlamVersion.Halo2_Epsilon)
					{
						return 16;
					}
					else if ((game & BlamVersion.Halo2) != 0)
					{
						if (cache)	return 8;
						else		return 16;
					}
					else if ((game & (BlamVersion.Halo3 | BlamVersion.HaloOdst)) != 0)
					{
						return 16;
					}
					else if ((game & BlamVersion.HaloReach) != 0)
					{
						return 16; // TODO: update upon release
					}
					throw new Debug.ExceptionLog("Failed to handle a tag reference: {0}", game);
				#endregion

				#region TagBlock
				case FieldType.Block:
					if ((game & (BlamVersion.Halo1 | BlamVersion.Stubbs)) != 0)
					{
						return 12;
					}
					else if (game == BlamVersion.Halo2_Alpha || game == BlamVersion.Halo2_Epsilon)
					{
						return 12;
					}
					else if ((game & BlamVersion.Halo2) != 0)
					{
						if (cache) return 8;
						else return 12;
					}
					else if ((game & (BlamVersion.Halo3 | BlamVersion.HaloOdst)) != 0)
					{
						return 12;
					}
					else if ((game & BlamVersion.HaloReach) != 0)
					{
						return 12; // TODO: update upon release
					}
					throw new Debug.ExceptionLog("Failed to handle a tag block: {0}", game);
				#endregion

				#region TagData
				case FieldType.Data:
					if ((game & (BlamVersion.Halo1 | BlamVersion.Stubbs)) != 0)
					{
						return 20;
					}
					else if (game == BlamVersion.Halo2_Alpha || game == BlamVersion.Halo2_Epsilon)
					{
						return 20;
					}
					else if ((game & BlamVersion.Halo2) != 0)
					{
						if (cache) return 8;
						else return 20;
					}
					else if ((game & (BlamVersion.Halo3 | BlamVersion.HaloOdst)) != 0)
					{
						return 20;
					}
					else if ((game & BlamVersion.HaloReach) != 0)
					{
						return 20; // TODO: update upon release
					}
					throw new Debug.ExceptionLog("Failed to handle tag data: {0}", game);
				#endregion

				case FieldType.VertexBuffer:
					if ((game & BlamVersion.Halo2) != 0) return 32;
					else return 0;

				case FieldType.Struct:
					if (cache && ((game & BlamVersion.Halo2) != 0))
						return (f as IStruct).GetDefinition().RuntimeSizes.RuntimeSize;
					return (f as IStruct).GetDefinition().Attribute.SizeOf;
				case FieldType.StructReference:
					return 12;

				#region Padding\Skip
				case FieldType.Pad:
					return (f as Pad).Value;

				case FieldType.UnknownPad:
					return (f as UnknownPad).Value;

				case FieldType.UselessPad:
					if ((game & (BlamVersion.Halo1 | BlamVersion.Stubbs)) != 0 ||
						game == BlamVersion.Halo2_Alpha || game == BlamVersion.Halo2_Epsilon)
					{
						return (f as UselessPad).Value;
					}
					else if ((game & (BlamVersion.Halo2 | BlamVersion.Halo3 | BlamVersion.HaloOdst | BlamVersion.HaloReach)) != 0)
					{
						if(Util.Flags.Test(flags, IO.ITagStreamFlags.Halo2OldFormat_UselessPadding))
							return (f as UselessPad).Value;

						return 0;
					}
					throw new Debug.ExceptionLog("Failed to handle useless pad: {0}", game);

				case FieldType.Skip:
					return (f as Skip).Value;
				#endregion

				#region CustomData
				case FieldType.CustomData:
					return (f as CustomDataField).Sizeof(game, cache);
				#endregion

				#region Zero
				case FieldType.ArrayStart:
				case FieldType.ArrayEnd:
				case FieldType.Custom:
				case FieldType.Terminator:
					return 0;
				#endregion

				case FieldType.None:	throw new Debug.ExceptionLog("Found a field that says it has no type: {0}", f.GetType());
				default:				throw new Debug.ExceptionLog("Sizeof failed to handle a field type: {0:X}", (int)f.FieldType);
			}
		}
コード例 #11
0
ファイル: Reals.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field (unused)</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)											{ return new RealQuaternion(); }
コード例 #12
0
ファイル: Reals.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field (unused)</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)									{ return new RealVector3D(); }
コード例 #13
0
ファイル: Reals.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field (unused)</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)							{ return new RealPoint3D(); }
コード例 #14
0
ファイル: Integers.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field (unused)</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)					{ return new Tag(); }
コード例 #15
0
ファイル: Field.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Copy this field's contents to another field of the same type, without creating an entire new Field object
		/// </summary>
		/// <param name="field"></param>
		public virtual void CopyTo(Field field)
		{
			Debug.Assert.If(field.fieldType == this.fieldType, "field was of another type, {0}. Should be {1}", field.fieldType, this.fieldType);
			// TODO: why did I have this following statement: ?
			//field.FieldValue = this.FieldValue;
		}
コード例 #16
0
ファイル: Integers.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field (unused)</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)							{ return new ByteInteger(); }
コード例 #17
0
ファイル: Field.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Checks to see if the field uses the recursive I\O scheme (a la tag files)
		/// </summary>
		/// <param name="fi"></param>
		/// <returns></returns>
		public static bool UsesRecursiveIo(Field fi) { return fi.fieldType.UsesRecursiveIo(); }
コード例 #18
0
ファイル: String.cs プロジェクト: guardian2433/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)										{ return new String( (from as String).StringType ); }
コード例 #19
0
ファイル: Field.cs プロジェクト: CodeAsm/open-sauce
		public override Field CreateInstance(Field from) { return new EditorField(); }
コード例 #20
0
ファイル: Padding.cs プロジェクト: guardian2433/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field </param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from) { return new UnknownPad((from as UnknownPad).Value); }
コード例 #21
0
ファイル: Integers.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field (unused)</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)						{ return new Point2D(); }
コード例 #22
0
ファイル: Padding.cs プロジェクト: guardian2433/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from) { return new Skip( (from as Skip).Value ); }
コード例 #23
0
ファイル: Reals.cs プロジェクト: CodeAsm/open-sauce
		/// <summary>
		/// Creates a object that inherits from Field, using <paramref name="from"/> to pull any needed extra data.
		/// </summary>
		/// <param name="from">reference field (unused)</param>
		/// <returns>new field of this type</returns>
		public override Field CreateInstance(Field from)											{ return new RealEulerAngles3D(); }