Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
175 changes: 158 additions & 17 deletions source/BinaryAssetBuilder.XmlCompiler/Marshaler.BitFlagsData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -1586,37 +1586,47 @@ 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);
}

#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)
Expand All @@ -1637,44 +1647,175 @@ 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 < MetaGameDependenciesType.NumSpans; ++idx)
{
objT->Value[idx] = uint.MaxValue;
}
continue;
}
MapObjectFlagType value = (MapObjectFlagType)(-1);
MetaGameDependencyEnum value = (MetaGameDependencyEnum)(-1);
Marshal(token, &value, state);
if (value != (MapObjectFlagType)(-1))
if (value != (MetaGameDependencyEnum)(-1))
{
uint uintValue = (uint)value;
if (uintValue < MapObjectBitFlags.Count)
if (uintValue < MetaGameDependenciesType.Count)
{
if (includeToken)
{
objT->Value[uintValue / MapObjectBitFlags.BitsInSpan] |= (uint)(1 << (int)(uintValue % MapObjectBitFlags.BitsInSpan));
objT->Value[uintValue / MetaGameDependenciesType.BitsInSpan] |= (uint)(1 << (int)(uintValue % MetaGameDependenciesType.BitsInSpan));
}
else
{
objT->Value[uintValue / MapObjectBitFlags.BitsInSpan] ^= (uint)(1 << (int)(uintValue % MapObjectBitFlags.BitsInSpan));
objT->Value[uintValue / MetaGameDependenciesType.BitsInSpan] ^= (uint)(1 << (int)(uintValue % MetaGameDependenciesType.BitsInSpan));
}
}
}
}
for (int idx = 0; idx < MapObjectBitFlags.NumSpans; ++idx)
for (int idx = 0; idx < MetaGameDependenciesType.NumSpans; ++idx)
{
state.InplaceEndianToPlatform(&objT->Value[idx]);
}
}

public static unsafe void Marshal(Value value, MapObjectBitFlags* objT, Tracker state)
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);
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 < ModelConditionBitFlags.NumSpans; ++idx)
{
objT->Value[idx] = uint.MaxValue;
}
continue;
}
ModelConditionFlagType value = (ModelConditionFlagType)(-1);
Marshal(token, &value, state);
if (value != (ModelConditionFlagType)(-1))
{
uint uintValue = (uint)value;
if (uintValue < ModelConditionBitFlags.Count)
{
if (includeToken)
{
objT->Value[uintValue / ModelConditionBitFlags.BitsInSpan] |= (uint)(1 << (int)(uintValue % ModelConditionBitFlags.BitsInSpan));
}
else
{
objT->Value[uintValue / ModelConditionBitFlags.BitsInSpan] ^= (uint)(1 << (int)(uintValue % ModelConditionBitFlags.BitsInSpan));
}
}
}
}
for (int idx = 0; idx < ModelConditionBitFlags.NumSpans; ++idx)
{
state.InplaceEndianToPlatform(&objT->Value[idx]);
}
}

public static unsafe void Marshal(Value value, ModelConditionBitFlags* objT, Tracker state)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Loading