Skip to content

Commit afba7c8

Browse files
committed
feat(CardPiles): add GetOrCreateCombatPiles method for combat-only pile management
- Introduced GetOrCreateCombatPiles method to retrieve and create combat-only card piles for a given PlayerCombatState, ensuring core combat systems can subscribe to them alongside vanilla piles. - Updated Postfix method to utilize the new GetOrCreateCombatPiles method, enhancing the integration of mod-specific combat piles.
1 parent 0a3f605 commit afba7c8

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

CardPiles/ModCardPileStorage.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,33 @@ public static IReadOnlyCollection<ModCardPile> GetCombatPiles(PlayerCombatState
8181
}
8282
}
8383

84+
/// <summary>
85+
/// Returns every registered combat-only pile for <paramref name="state" />, creating missing
86+
/// instances so core combat systems can subscribe to them at the same time as vanilla piles.
87+
/// 返回 <paramref name="state" /> 的所有已注册 combat-only 牌堆,并创建缺失实例,使核心战斗系统
88+
/// 能与原版牌堆在同一时机订阅它们。
89+
/// </summary>
90+
public static IReadOnlyCollection<ModCardPile> GetOrCreateCombatPiles(PlayerCombatState state)
91+
{
92+
ArgumentNullException.ThrowIfNull(state);
93+
94+
var definitions = ModCardPileRegistry.GetDefinitionsSnapshot()
95+
.Where(definition => definition.Scope == ModCardPileScope.CombatOnly)
96+
.ToArray();
97+
if (definitions.Length == 0)
98+
return [];
99+
100+
var dict = CombatPiles.GetValue(state, static _ => []);
101+
lock (dict)
102+
{
103+
foreach (var definition in definitions)
104+
if (!dict.ContainsKey(definition.PileType))
105+
dict[definition.PileType] = new(definition);
106+
107+
return [.. dict.Values];
108+
}
109+
}
110+
84111
/// <summary>
85112
/// Snapshot of persistent piles owned by <paramref name="player" />.
86113
/// <paramref name="player" /> 拥有的 persistent 牌堆快照。

CardPiles/Patches/ModCardPileAllPilesPatch.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public static ModPatchTarget[] GetTargets()
6060
/// </summary>
6161
public static void Postfix(PlayerCombatState __instance, ref IReadOnlyList<CardPile> __result)
6262
{
63-
var modPiles = ModCardPileStorage.GetCombatPiles(__instance);
63+
var modPiles = ModCardPileStorage.GetOrCreateCombatPiles(__instance);
6464
if (modPiles.Count == 0)
6565
return;
6666

0 commit comments

Comments
 (0)