From 93454250ade6aeae77adaf054e579c379c27faa0 Mon Sep 17 00:00:00 2001 From: theHostileNegotiator <61142710+theHostileNegotiator@users.noreply.github.com> Date: Mon, 5 Aug 2024 09:53:27 +1000 Subject: [PATCH 1/3] Sort ModelCondition Bitflag --- .../Marshaler.BitFlagsData.cs | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/source/BinaryAssetBuilder.XmlCompiler/Marshaler.BitFlagsData.cs b/source/BinaryAssetBuilder.XmlCompiler/Marshaler.BitFlagsData.cs index 83aed5eb..74347fcc 100644 --- a/source/BinaryAssetBuilder.XmlCompiler/Marshaler.BitFlagsData.cs +++ b/source/BinaryAssetBuilder.XmlCompiler/Marshaler.BitFlagsData.cs @@ -1565,7 +1565,7 @@ public static unsafe void Marshal(Value value, LogicCommandOptionsBitFlags* objT Marshal(value.GetText(), objT, state); } - public static unsafe void Marshal(string text, ModelConditionBitFlags* objT, Tracker state) + public static unsafe void Marshal(string text, MapObjectBitFlags* objT, Tracker state) { string[] tokens = text.Split(WhiteSpaces, System.StringSplitOptions.RemoveEmptyEntries); if (tokens.Length == 0) @@ -1586,37 +1586,46 @@ public static unsafe void Marshal(string text, ModelConditionBitFlags* objT, Tra } if (string.Equals(token, "ALL", System.StringComparison.Ordinal)) { - for (int idx = 0; idx < ModelConditionBitFlags.NumSpans; ++idx) + for (int idx = 0; idx < MapObjectBitFlags.NumSpans; ++idx) { objT->Value[idx] = uint.MaxValue; } continue; } - ModelConditionFlagType value = (ModelConditionFlagType)(-1); + MapObjectFlagType value = (MapObjectFlagType)(-1); Marshal(token, &value, state); - if (value != (ModelConditionFlagType)(-1)) + if (value != (MapObjectFlagType)(-1)) { uint uintValue = (uint)value; - if (uintValue < ModelConditionBitFlags.Count) + if (uintValue < MapObjectBitFlags.Count) { if (includeToken) { - objT->Value[uintValue / ModelConditionBitFlags.BitsInSpan] |= (uint)(1 << (int)(uintValue % ModelConditionBitFlags.BitsInSpan)); + objT->Value[uintValue / MapObjectBitFlags.BitsInSpan] |= (uint)(1 << (int)(uintValue % MapObjectBitFlags.BitsInSpan)); } else { - objT->Value[uintValue / ModelConditionBitFlags.BitsInSpan] ^= (uint)(1 << (int)(uintValue % ModelConditionBitFlags.BitsInSpan)); + objT->Value[uintValue / MapObjectBitFlags.BitsInSpan] ^= (uint)(1 << (int)(uintValue % MapObjectBitFlags.BitsInSpan)); } } } } - for (int idx = 0; idx < ModelConditionBitFlags.NumSpans; ++idx) + for (int idx = 0; idx < MapObjectBitFlags.NumSpans; ++idx) { state.InplaceEndianToPlatform(&objT->Value[idx]); } } - public static unsafe void Marshal(string text, MapObjectBitFlags* objT, Tracker state) + public static unsafe void Marshal(Value value, MapObjectBitFlags* objT, Tracker state) + { + if (value is null) + { + return; + } + Marshal(value.GetText(), objT, state); + } + + public static unsafe void Marshal(string text, ModelConditionBitFlags* objT, Tracker state) { string[] tokens = text.Split(WhiteSpaces, System.StringSplitOptions.RemoveEmptyEntries); if (tokens.Length == 0) @@ -1637,45 +1646,36 @@ public static unsafe void Marshal(string text, MapObjectBitFlags* objT, Tracker } if (string.Equals(token, "ALL", System.StringComparison.Ordinal)) { - for (int idx = 0; idx < MapObjectBitFlags.NumSpans; ++idx) + for (int idx = 0; idx < ModelConditionBitFlags.NumSpans; ++idx) { objT->Value[idx] = uint.MaxValue; } continue; } - MapObjectFlagType value = (MapObjectFlagType)(-1); + ModelConditionFlagType value = (ModelConditionFlagType)(-1); Marshal(token, &value, state); - if (value != (MapObjectFlagType)(-1)) + if (value != (ModelConditionFlagType)(-1)) { uint uintValue = (uint)value; - if (uintValue < MapObjectBitFlags.Count) + if (uintValue < ModelConditionBitFlags.Count) { if (includeToken) { - objT->Value[uintValue / MapObjectBitFlags.BitsInSpan] |= (uint)(1 << (int)(uintValue % MapObjectBitFlags.BitsInSpan)); + objT->Value[uintValue / ModelConditionBitFlags.BitsInSpan] |= (uint)(1 << (int)(uintValue % ModelConditionBitFlags.BitsInSpan)); } else { - objT->Value[uintValue / MapObjectBitFlags.BitsInSpan] ^= (uint)(1 << (int)(uintValue % MapObjectBitFlags.BitsInSpan)); + objT->Value[uintValue / ModelConditionBitFlags.BitsInSpan] ^= (uint)(1 << (int)(uintValue % ModelConditionBitFlags.BitsInSpan)); } } } } - for (int idx = 0; idx < MapObjectBitFlags.NumSpans; ++idx) + for (int idx = 0; idx < ModelConditionBitFlags.NumSpans; ++idx) { state.InplaceEndianToPlatform(&objT->Value[idx]); } } - public static unsafe void Marshal(Value value, MapObjectBitFlags* objT, Tracker state) - { - if (value is null) - { - return; - } - Marshal(value.GetText(), objT, state); - } - public static unsafe void Marshal(Value value, ModelConditionBitFlags* objT, Tracker state) { if (value is null) From 697ce14ac3f8fd1148c489d5fb7f62e26abcc0ec Mon Sep 17 00:00:00 2001 From: theHostileNegotiator <61142710+theHostileNegotiator@users.noreply.github.com> Date: Mon, 5 Aug 2024 10:20:27 +1000 Subject: [PATCH 2/3] Added SpecialPowerTemplate --- README.md | 2 +- .../BinaryAssetBuilder/XmlCompiler/Plugin.cs | 9 + .../Marshaler.BitFlagsData.cs | 141 +++++++++++ .../Marshaler.SpecialPowerTemplate.cs | 10 + .../SageBinaryData/SpecialPowerTemplate.cs | 232 +++++++++++------- 5 files changed, 299 insertions(+), 95 deletions(-) diff --git a/README.md b/README.md index ac6bd345..cc850335 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ BinaryAssetBuilder implementation for Kane's Wrath in .Net * [ ] FXList 0xEBE8A8A4 * [ ] ObjectCreationList 0x683D4DE5 * [ ] ObjectFilterAsset 0x25970AF7 -* [ ] SpecialPowerTemplate 0x5EF0ACA9 +* [x] SpecialPowerTemplate * [ ] UpgradeTemplate 0x1E53F384 * [ ] SkirmishOpeningMove 0x21EE29FA * [ ] AIStateDefinition 0x262BE85F diff --git a/source/BinaryAssetBuilder.XmlCompiler/BinaryAssetBuilder/XmlCompiler/Plugin.cs b/source/BinaryAssetBuilder.XmlCompiler/BinaryAssetBuilder/XmlCompiler/Plugin.cs index 92c7f28d..764f8223 100644 --- a/source/BinaryAssetBuilder.XmlCompiler/BinaryAssetBuilder/XmlCompiler/Plugin.cs +++ b/source/BinaryAssetBuilder.XmlCompiler/BinaryAssetBuilder/XmlCompiler/Plugin.cs @@ -142,6 +142,15 @@ public void Initialize(TargetPlatform platform) 0x6D59C409u, #endif false), + + + (typeof(SpecialPowerTemplate), +#if TIBERIUMWARS + 0x5EF0ACA9u, +#elif KANESWRATH + 0xC4DCAF5Au, +#endif + false), }) { CreateTypeInfo(type, num, hash, hasCustomData); diff --git a/source/BinaryAssetBuilder.XmlCompiler/Marshaler.BitFlagsData.cs b/source/BinaryAssetBuilder.XmlCompiler/Marshaler.BitFlagsData.cs index 74347fcc..a0ec8940 100644 --- a/source/BinaryAssetBuilder.XmlCompiler/Marshaler.BitFlagsData.cs +++ b/source/BinaryAssetBuilder.XmlCompiler/Marshaler.BitFlagsData.cs @@ -1625,6 +1625,147 @@ public static unsafe void Marshal(Value value, MapObjectBitFlags* objT, Tracker Marshal(value.GetText(), objT, state); } +#if KANESWRATH + public static unsafe void Marshal(string text, MetaGameDependenciesType* objT, Tracker state) + { + string[] tokens = text.Split(WhiteSpaces, System.StringSplitOptions.RemoveEmptyEntries); + if (tokens.Length == 0) + { + return; + } + for (int idy = 0; idy < tokens.Length; ++idy) + { + string token = tokens[idy]; + bool includeToken = true; + if (token[0] == '+') + { + includeToken = true; + } + else if (token[0] == '-') + { + includeToken = false; + } + if (string.Equals(token, "ALL", System.StringComparison.Ordinal)) + { + for (int idx = 0; idx < MetaGameDependenciesType.NumSpans; ++idx) + { + objT->Value[idx] = uint.MaxValue; + } + continue; + } + MetaGameDependencyEnum value = (MetaGameDependencyEnum)(-1); + Marshal(token, &value, state); + if (value != (MetaGameDependencyEnum)(-1)) + { + uint uintValue = (uint)value; + if (uintValue < MetaGameDependenciesType.Count) + { + if (includeToken) + { + objT->Value[uintValue / MetaGameDependenciesType.BitsInSpan] |= (uint)(1 << (int)(uintValue % MetaGameDependenciesType.BitsInSpan)); + } + else + { + objT->Value[uintValue / MetaGameDependenciesType.BitsInSpan] ^= (uint)(1 << (int)(uintValue % MetaGameDependenciesType.BitsInSpan)); + } + } + } + } + for (int idx = 0; idx < MetaGameDependenciesType.NumSpans; ++idx) + { + state.InplaceEndianToPlatform(&objT->Value[idx]); + } + } + + public static unsafe void Marshal(Value value, MetaGameDependenciesType* objT, Tracker state) + { + if (value is null) + { + return; + } + Marshal(value.GetText(), objT, state); + } + + public static unsafe void Marshal(Value value, MetaGameDependenciesType** objT, Tracker state) + { + if (value is null) + { + return; + } + using Tracker.Context context = state.Push((void**)objT, (uint)sizeof(MetaGameDependenciesType), 1u); + Marshal(value, *objT, state); + } + + public static unsafe void Marshal(Node node, MetaGameDependenciesType** objT, Tracker state) + { + if (node is null) + { + return; + } + Marshal(node.GetValue(), objT, state); + } + + public static unsafe void Marshal(string text, MetagamePhaseBitflags* objT, Tracker state) + { + string[] tokens = text.Split(WhiteSpaces, System.StringSplitOptions.RemoveEmptyEntries); + if (tokens.Length == 0) + { + return; + } + for (int idy = 0; idy < tokens.Length; ++idy) + { + string token = tokens[idy]; + bool includeToken = true; + if (token[0] == '+') + { + includeToken = true; + } + else if (token[0] == '-') + { + includeToken = false; + } + if (string.Equals(token, "ALL", System.StringComparison.Ordinal)) + { + for (int idx = 0; idx < MetagamePhaseBitflags.NumSpans; ++idx) + { + objT->Value[idx] = uint.MaxValue; + } + continue; + } + MetagamePhaseEnum value = (MetagamePhaseEnum)(-1); + Marshal(token, &value, state); + if (value != (MetagamePhaseEnum)(-1)) + { + uint uintValue = (uint)value; + if (uintValue < MetagamePhaseBitflags.Count) + { + if (includeToken) + { + objT->Value[uintValue / MetagamePhaseBitflags.BitsInSpan] |= (uint)(1 << (int)(uintValue % MetagamePhaseBitflags.BitsInSpan)); + } + else + { + objT->Value[uintValue / MetagamePhaseBitflags.BitsInSpan] ^= (uint)(1 << (int)(uintValue % MetagamePhaseBitflags.BitsInSpan)); + } + } + } + } + for (int idx = 0; idx < MetagamePhaseBitflags.NumSpans; ++idx) + { + state.InplaceEndianToPlatform(&objT->Value[idx]); + } + } + + public static unsafe void Marshal(Value value, MetagamePhaseBitflags* objT, Tracker state) + { + if (value is null) + { + return; + } + Marshal(value.GetText(), objT, state); + } +#endif + public static unsafe void Marshal(string text, ModelConditionBitFlags* objT, Tracker state) { string[] tokens = text.Split(WhiteSpaces, System.StringSplitOptions.RemoveEmptyEntries); diff --git a/source/BinaryAssetBuilder.XmlCompiler/Marshaler.SpecialPowerTemplate.cs b/source/BinaryAssetBuilder.XmlCompiler/Marshaler.SpecialPowerTemplate.cs index cb24094b..15d323b1 100644 --- a/source/BinaryAssetBuilder.XmlCompiler/Marshaler.SpecialPowerTemplate.cs +++ b/source/BinaryAssetBuilder.XmlCompiler/Marshaler.SpecialPowerTemplate.cs @@ -45,9 +45,19 @@ public static unsafe void Marshal(Node node, SpecialPowerTemplate* objT, Tracker Marshal(node.GetAttributeValue(nameof(SpecialPowerTemplate.WaypointModeTerminal), "true"), &objT->WaypointModeTerminal, state); Marshal(node.GetAttributeValue(nameof(SpecialPowerTemplate.TimerImage), null), &objT->TimerImage, state); Marshal(node.GetAttributeValue(nameof(SpecialPowerTemplate.ReachableTargetsCircleDisplayRadius), null), &objT->ReachableTargetsCircleDisplayRadius, state); +#if KANESWRATH + Marshal(node.GetAttributeValue(nameof(SpecialPowerTemplate.MetaGameOperation), "INVALID"), &objT->MetaGameOperation, state); + Marshal(node.GetAttributeValue(nameof(SpecialPowerTemplate.ActiveMetaGamePhases), ""), &objT->ActiveMetaGamePhases, state); + Marshal(node.GetAttributeValue(nameof(SpecialPowerTemplate.StrikeForceRejectStatus), ""), &objT->StrikeForceRejectStatus, state); + Marshal(node.GetAttributeValue(nameof(SpecialPowerTemplate.StrikeForceRejectMatchAll), "false"), &objT->StrikeForceRejectMatchAll, state); +#endif Marshal(node.GetChildNode(nameof(SpecialPowerTemplate.ObjectFilter), null), &objT->ObjectFilter, state); Marshal(node.GetChildNode(nameof(SpecialPowerTemplate.ForbiddenObjectFilter), null), &objT->ForbiddenObjectFilter, state); Marshal(node.GetChildNode(nameof(SpecialPowerTemplate.GameDependency), null), &objT->GameDependency, state); +#if KANESWRATH + Marshal(node.GetChildNode(nameof(SpecialPowerTemplate.MetaGameDependencies), null), &objT->MetaGameDependencies, state); + Marshal(node.GetChildNode(nameof(SpecialPowerTemplate.MetaUpgradeToGrant), null), &objT->MetaUpgradeToGrant, state); +#endif Marshal(node, (BaseInheritableAsset*)objT, state); } } diff --git a/source/SageBinaryData/SageBinaryData/SpecialPowerTemplate.cs b/source/SageBinaryData/SageBinaryData/SpecialPowerTemplate.cs index 2ad346ab..74891635 100644 --- a/source/SageBinaryData/SageBinaryData/SpecialPowerTemplate.cs +++ b/source/SageBinaryData/SageBinaryData/SpecialPowerTemplate.cs @@ -3,104 +3,148 @@ using Relo; using AnsiString = Relo.String; -namespace SageBinaryData +namespace SageBinaryData; + +public enum SpecialPowerTemplateFlag +{ + NEEDS_TARGET, + NEEDS_OBJECT_FILTER, + NO_FORBIDDEN_OBJECTS, + NO_FORBIDDEN_MODEL_STATES, + WATER_OK, + LIMIT_DISTANCE, + RESPECT_RECHARGE_TIME_DISCOUNT, + PATHABLE_ONLY, + IS_TAINTABLE, + NOT_CLIFF_CELL, + FOGGED_SHROUDED_CELLS_OK, + KILL_SPECIAL_OBJECTS, + TARGET_NEEDS_OBJECT_STATUS, + SHARED_SYNC, + HAS_PUBLIC_TIMER, + IS_PLAYER_POWER, + FIND_REACHABLE_TARGETS, + IGNORE_MAP_EXTENTS, + IGNORE_SELF_IN_NEEDED_OBJECT_FILTER, + NOT_ON_BRIDGE, + NOT_BENEATH_BRIDGE, + NOT_WHILE_BENEATH_BRIDGE, + DISABLE_FOR_MULTIPLE_SELECTION, + CHECK_SPECIALPOWERSTORE_CANUSE, +#if KANESWRATH + USE_CASTER_RANGE, + CAN_PATH_TO, + RECHARGE_ALL_OBJECT_POWERS_ON_USE, + SCALE_AOI_RADIUS, + SPECIAL_TRAVEL_POWER, +#endif + USE_CHAINED_COMMAND_MONEY +} + +[StructLayout(LayoutKind.Sequential)] +public struct SpecialPowerTemplateBitFlag +{ +#if TIBERIUMWARS + public const int Count = 25; +#elif KANESWRATH + public const int Count = 30; +#endif + public const int BitsInSpan = 32; + public const int NumSpans = (Count + (BitsInSpan - 1)) / BitsInSpan; + + public unsafe fixed uint Value[NumSpans]; +} + +public enum SpecialPowerTemplateTargetType { - public enum SpecialPowerTemplateFlag - { - NEEDS_TARGET, - NEEDS_OBJECT_FILTER, - NO_FORBIDDEN_OBJECTS, - NO_FORBIDDEN_MODEL_STATES, - WATER_OK, - LIMIT_DISTANCE, - RESPECT_RECHARGE_TIME_DISCOUNT, - PATHABLE_ONLY, - IS_TAINTABLE, - NOT_CLIFF_CELL, - FOGGED_SHROUDED_CELLS_OK, - KILL_SPECIAL_OBJECTS, - TARGET_NEEDS_OBJECT_STATUS, - SHARED_SYNC, - HAS_PUBLIC_TIMER, - IS_PLAYER_POWER, - FIND_REACHABLE_TARGETS, - IGNORE_MAP_EXTENTS, - IGNORE_SELF_IN_NEEDED_OBJECT_FILTER, - NOT_ON_BRIDGE, - NOT_BENEATH_BRIDGE, - NOT_WHILE_BENEATH_BRIDGE, - DISABLE_FOR_MULTIPLE_SELECTION, - CHECK_SPECIALPOWERSTORE_CANUSE, - USE_CHAINED_COMMAND_MONEY - } + LOCATION, + OBJECT, + OBJECT_OR_LOCATION, + NONE +} - [StructLayout(LayoutKind.Sequential)] - public struct SpecialPowerTemplateBitFlag - { - public const int Count = 25; - public const int BitsInSpan = 32; - public const int NumSpans = (Count + (BitsInSpan - 1)) / BitsInSpan; +public enum SpecialPowerRestrictionType +{ + UNRESTRICTED, + [Display(Name = "1")] SPECIALPOWER_RESTRICTION_1, + [Display(Name = "2")] SPECIALPOWER_RESTRICTION_2 +} - public unsafe fixed uint Value[NumSpans]; - } +#if KANESWRATH +public enum MetagamePhaseEnum +{ + UNRESTRICTED, + [Display(Name = "OPERATIONS")] METAGAME_PHASE_OPERATIONS, + [Display(Name = "RESOLVE_POWERS")] METAGAME_PHASE_RESOLVE_POWERS, + [Display(Name = "MOVEMENT")] METAGAME_PHASE_MOVEMENT, + [Display(Name = "BATTLE")] METAGAME_PHASE_BATTLE, + [Display(Name = "UPKEEP")] METAGAME_PHASE_UPKEEP +} - public enum SpecialPowerTemplateTargetType - { - LOCATION, - OBJECT, - OBJECT_OR_LOCATION, - NONE - } +[StructLayout(LayoutKind.Sequential)] +public struct MetagamePhaseBitflags +{ + public const int Count = 5; + public const int BitsInSpan = 32; + public const int NumSpans = (Count + (BitsInSpan - 1)) / BitsInSpan; - public enum SpecialPowerRestrictionType - { - UNRESTRICTED, - [Display(Name = "1")] SPECIALPOWER_RESTRICTION_1, - [Display(Name = "2")] SPECIALPOWER_RESTRICTION_2 - } + public unsafe fixed uint Value[NumSpans]; +} +#endif - [StructLayout(LayoutKind.Sequential)] - public struct SpecialPowerTemplate - { - public BaseInheritableAsset Base; - public AnsiString DisplayName; - public AnsiString Description; - public SpecialPowerTemplateTargetType TargetType; - public SpecialPowerTemplateBitFlag Flags; - public Time ReloadTime; - public AssetReference InitiateSound; - public AssetReference InitiateAtLocationSound; - public Time ViewObjectDuration; - public float ViewObjectRange; - public float RadiusCursorRadius; - public ObjectStatusBitFlags PreventConditions; - public ObjectStatusBitFlags RequiredConditions; - public ModelConditionBitFlags DisallowedTargetModelStates; - public ObjectStatusBitFlags RequiredTargetObjectStatus; - public ObjectStatusBitFlags DisallowedTargetObjectStatus; - public float MaxCastRange; - public float MinCastRange; - public float ForbiddenObjectRange; - public AnsiString EvaEventToPlayOnSuccess; - public AnsiString EvaEventToPlayWhenSelectingTarget; - public AnsiString EvaEventToPlayOnInitiateOwner; - public AnsiString EvaEventToPlayOnInitiateAlly; - public AnsiString EvaEventToPlayOnInitiateEnemy; - public unsafe StringHash* NameOfVoiceNameToUseAsInitiateIntendToDoVoice; - public unsafe StringHash* NameOfVoiceNameToUseAsInitiateIntendToDoAfterMoveVoice; - public unsafe StringHash* NameOfVoiceNameToUseAsInitiateIntendToDoWhileUnderAttackVoice; - public unsafe StringHash* NameOfVoiceNameToUseAsInitiateIntendToDoAfterMoveWhileUnderAttackVoice; - public unsafe StringHash* NameOfVoiceNameToUseAsEnterStateInitiateIntendToDoVoice; - public unsafe StringHash* NameOfVoiceNameToUseAsEnterStateInitiateIntendToDoAfterMoveVoice; - public unsafe StringHash* NameOfVoiceNameToUseAsEnterStateInitiateIntendToDoWhileUnderAttackVoice; - public unsafe StringHash* NameOfVoiceNameToUseAsEnterStateInitiateIntendToDoAfterMoveWhileUnderAttackVoice; - public SpecialPowerRestrictionType RestrictionType; - public int Money; - public AssetReference TimerImage; - public float ReachableTargetsCircleDisplayRadius; - public ObjectFilter ObjectFilter; - public ObjectFilter ForbiddenObjectFilter; - public unsafe GameDependencyType* GameDependency; - public SageBool WaypointModeTerminal; - } +[StructLayout(LayoutKind.Sequential)] +public struct SpecialPowerTemplate +{ + public BaseInheritableAsset Base; + public AnsiString DisplayName; + public AnsiString Description; + public SpecialPowerTemplateTargetType TargetType; + public SpecialPowerTemplateBitFlag Flags; + public Time ReloadTime; + public AssetReference InitiateSound; + public AssetReference InitiateAtLocationSound; + public Time ViewObjectDuration; + public float ViewObjectRange; + public float RadiusCursorRadius; + public ObjectStatusBitFlags PreventConditions; + public ObjectStatusBitFlags RequiredConditions; + public ModelConditionBitFlags DisallowedTargetModelStates; + public ObjectStatusBitFlags RequiredTargetObjectStatus; + public ObjectStatusBitFlags DisallowedTargetObjectStatus; + public float MaxCastRange; + public float MinCastRange; + public float ForbiddenObjectRange; + public AnsiString EvaEventToPlayOnSuccess; + public AnsiString EvaEventToPlayWhenSelectingTarget; + public AnsiString EvaEventToPlayOnInitiateOwner; + public AnsiString EvaEventToPlayOnInitiateAlly; + public AnsiString EvaEventToPlayOnInitiateEnemy; + public unsafe StringHash* NameOfVoiceNameToUseAsInitiateIntendToDoVoice; + public unsafe StringHash* NameOfVoiceNameToUseAsInitiateIntendToDoAfterMoveVoice; + public unsafe StringHash* NameOfVoiceNameToUseAsInitiateIntendToDoWhileUnderAttackVoice; + public unsafe StringHash* NameOfVoiceNameToUseAsInitiateIntendToDoAfterMoveWhileUnderAttackVoice; + public unsafe StringHash* NameOfVoiceNameToUseAsEnterStateInitiateIntendToDoVoice; + public unsafe StringHash* NameOfVoiceNameToUseAsEnterStateInitiateIntendToDoAfterMoveVoice; + public unsafe StringHash* NameOfVoiceNameToUseAsEnterStateInitiateIntendToDoWhileUnderAttackVoice; + public unsafe StringHash* NameOfVoiceNameToUseAsEnterStateInitiateIntendToDoAfterMoveWhileUnderAttackVoice; + public SpecialPowerRestrictionType RestrictionType; + public int Money; + public AssetReference TimerImage; + public float ReachableTargetsCircleDisplayRadius; +#if KANESWRATH + public MetagameOperationsEnums MetaGameOperation; + public MetagamePhaseBitflags ActiveMetaGamePhases; + public ObjectStatusBitFlags StrikeForceRejectStatus; +#endif + public ObjectFilter ObjectFilter; + public ObjectFilter ForbiddenObjectFilter; + public unsafe GameDependencyType* GameDependency; +#if KANESWRATH + public unsafe MetaGameDependenciesType* MetaGameDependencies; + public unsafe TypedAssetId* MetaUpgradeToGrant; +#endif + public SageBool WaypointModeTerminal; +#if KANESWRATH + public SageBool StrikeForceRejectMatchAll; +#endif } From fe7c587da570b8cfa01450f8aba0037d1a402e1b Mon Sep 17 00:00:00 2001 From: theHostileNegotiator <61142710+theHostileNegotiator@users.noreply.github.com> Date: Thu, 18 Sep 2025 00:46:17 +1000 Subject: [PATCH 3/3] Special Power, remove wrong enum entry --- source/SageBinaryData/SageBinaryData/SpecialPowerTemplate.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/source/SageBinaryData/SageBinaryData/SpecialPowerTemplate.cs b/source/SageBinaryData/SageBinaryData/SpecialPowerTemplate.cs index 74891635..7a4136ec 100644 --- a/source/SageBinaryData/SageBinaryData/SpecialPowerTemplate.cs +++ b/source/SageBinaryData/SageBinaryData/SpecialPowerTemplate.cs @@ -73,7 +73,6 @@ public enum SpecialPowerRestrictionType #if KANESWRATH public enum MetagamePhaseEnum { - UNRESTRICTED, [Display(Name = "OPERATIONS")] METAGAME_PHASE_OPERATIONS, [Display(Name = "RESOLVE_POWERS")] METAGAME_PHASE_RESOLVE_POWERS, [Display(Name = "MOVEMENT")] METAGAME_PHASE_MOVEMENT,