Skip to content

Commit ddef6ef

Browse files
committed
chore(release): merge dev into main for v0.2.29
2 parents 56ca51d + 45286b8 commit ddef6ef

10 files changed

Lines changed: 72 additions & 18 deletions

File tree

Combat/HandSize/MaxHandSizePatchInstaller.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ internal static void EnsurePatched()
124124
"[MaxHandSize] RitsuLib hand-size patch set installed (compat 0.104.0 profile).");
125125
#else
126126
RitsuLibFramework.Logger.Info(
127-
"[MaxHandSize] RitsuLib hand-size patch set installed (0.105.0 profile).");
127+
"[MaxHandSize] RitsuLib hand-size patch set installed (0.105.1 profile).");
128128
#endif
129129
}
130130
}

Const.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public static class Const
1818
/// <summary>
1919
/// Assembly / manifest version string.
2020
/// </summary>
21-
public const string Version = "0.2.28";
21+
public const string Version = "0.2.29";
2222

2323
/// <summary>
2424
/// Root key for RitsuLib JSON settings under the mod’s user folder.

STS2-RitsuLib.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Godot.NET.Sdk/4.5.1">
22
<PropertyGroup Label="Compatibility (STS2 API, signatures, defines)">
3-
<RitsuLibCompatTargets>0.105.0;0.104.0;0.103.2</RitsuLibCompatTargets>
4-
<RitsuLibLatestApiCompat>0.105.0</RitsuLibLatestApiCompat>
3+
<RitsuLibCompatTargets>0.105.1;0.104.0;0.103.2</RitsuLibCompatTargets>
4+
<RitsuLibLatestApiCompat>0.105.1</RitsuLibLatestApiCompat>
55
<Sts2ApiCompat Condition="'$(Sts2ApiCompat)' == ''">$(RitsuLibLatestApiCompat)</Sts2ApiCompat>
66
<Sts2ApiSignatureDir Condition="'$(Sts2ApiSignatureRoot)' != ''">$(Sts2ApiSignatureRoot)\$(Sts2ApiCompat)</Sts2ApiSignatureDir>
77
<Sts2DataDir Condition="'$(Sts2ApiSignatureRoot)' != ''">$(Sts2ApiSignatureDir)</Sts2DataDir>
@@ -30,7 +30,7 @@
3030

3131
<PropertyGroup Label="NuGet package">
3232
<IsPackable>true</IsPackable>
33-
<Version>0.2.28</Version>
33+
<Version>0.2.29</Version>
3434
<Authors>OLC</Authors>
3535
<Description>Shared framework library for Slay the Spire 2 mods.</Description>
3636
<PackageReadmeFile>README.md</PackageReadmeFile>

Scaffolding/Cards/HandOutline/Patches/ModCardHandOutlinePatchHelper.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using MegaCrit.Sts2.Core.Combat;
44
using MegaCrit.Sts2.Core.Models;
55
using MegaCrit.Sts2.Core.Nodes.Cards.Holders;
6+
using STS2RitsuLib.Scaffolding.Combat;
67

78
namespace STS2RitsuLib.Scaffolding.Cards.HandOutline.Patches
89
{
@@ -30,7 +31,10 @@ internal static void ApplyHighlight(NHandCardHolder holder, CardModel model, Mod
3031
if (CombatManager.Instance is not { IsInProgress: true })
3132
return;
3233

33-
var vanillaShow = model.CanPlay() || model.ShouldGlowRed || model.ShouldGlowGold;
34+
var inPlayPhase = model.IsOwnerPlayPhase();
35+
var shouldGlowRed = inPlayPhase && model.ShouldGlowRed;
36+
var shouldGlowGold = inPlayPhase && model.CanPlay() && model.ShouldGlowGold;
37+
var vanillaShow = model.CanPlay() || shouldGlowRed || shouldGlowGold;
3438
var force = rule.VisibleWhenUnplayable && !vanillaShow;
3539
if (!vanillaShow && !force)
3640
return;
@@ -39,7 +43,8 @@ internal static void ApplyHighlight(NHandCardHolder holder, CardModel model, Mod
3943
if (force)
4044
highlight.AnimShow();
4145

42-
highlight.Modulate = rule.ResolveColor(model);
46+
var c = rule.ResolveColor(model);
47+
highlight.Modulate = new(c.R, c.G, c.B, highlight.Modulate.A);
4348
}
4449

4550
internal static void ApplyFlash(NHandCardHolder holder, CardModel model, ModCardHandOutlineRule rule)
@@ -48,7 +53,16 @@ internal static void ApplyFlash(NHandCardHolder holder, CardModel model, ModCard
4853
!GodotObject.IsInstanceValid(flash))
4954
return;
5055

51-
flash.Modulate = rule.ResolveColor(model);
56+
var inPlayPhase = model.IsOwnerPlayPhase();
57+
var shouldGlowRed = inPlayPhase && model.ShouldGlowRed;
58+
var shouldGlowGold = inPlayPhase && model.CanPlay() && model.ShouldGlowGold;
59+
var vanillaShow = model.CanPlay() || shouldGlowRed || shouldGlowGold;
60+
var force = rule.VisibleWhenUnplayable && !vanillaShow;
61+
if (!vanillaShow && !force)
62+
return;
63+
64+
var c = rule.ResolveColor(model);
65+
flash.Modulate = new(c.R, c.G, c.B, flash.Modulate.A);
5266
}
5367
}
5468
}

Scaffolding/Characters/Patches/CharacterEnergyCounterRuntimeFactoryPatch.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ public static bool Prefix(Player player, ref NEnergyCounter? __result)
4646
if (!ResourceLoader.Exists(energyCounterPath))
4747
return true;
4848

49-
var created = RitsuGodotNodeFactories.CreateFromScenePath<NEnergyCounter>(energyCounterPath);
49+
var created = RitsuGodotNodeFactories.CreateFromScenePath<NEnergyCounter>(
50+
energyCounterPath,
51+
PackedScene.GenEditState.Disabled);
5052
PlayerField.SetValue(created, player);
5153
__result = created;
5254
return false;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using MegaCrit.Sts2.Core.Combat;
2+
using MegaCrit.Sts2.Core.Models;
3+
4+
namespace STS2RitsuLib.Scaffolding.Combat
5+
{
6+
/// <summary>
7+
/// Compatibility helpers for querying the current player turn phase.
8+
/// </summary>
9+
public static class CombatTurnPhaseExtensions
10+
{
11+
/// <summary>
12+
/// Returns whether <paramref name="model" />'s owner is currently in the "Play" turn phase.
13+
/// </summary>
14+
public static bool IsOwnerPlayPhase(this CardModel model)
15+
{
16+
ArgumentNullException.ThrowIfNull(model);
17+
18+
#if !STS2_AT_LEAST_0_104_0
19+
return CombatManager.Instance.IsPlayPhase;
20+
#else
21+
return model.Owner?.PlayerCombatState?.Phase == PlayerTurnPhase.Play;
22+
#endif
23+
}
24+
}
25+
}

Scaffolding/Godot/NodeFactories/RitsuNEnergyCounterNodeFactory.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,6 @@ protected override void GenerateNode(NEnergyCounter target, IRitsuGodotNodeSlot
7474
case "%EnergyVfxFront":
7575
target.AddUniqueChild(CreateParticlesContainer(null, "EnergyVfxFront"));
7676
break;
77-
case "%StarAnchor":
78-
target.AddUniqueChild(CreateParticlesContainer(null, "StarAnchor"));
79-
break;
8077
}
8178
}
8279

Scaffolding/Godot/RitsuGodotNodeFactory.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ protected virtual void TransferAndCreateNodes(T target, Node? source)
136136
foreach (var child in source.GetChildren())
137137
{
138138
source.RemoveChild(child);
139+
ClearSubtreeOwnersForReparent(child);
139140
target.AddChild(child);
140141
child.Owner = target;
141142
SetChildrenOwner(target, child);
@@ -220,6 +221,19 @@ protected virtual Node ConvertNodeType(Node node, Type targetType)
220221

221222
protected abstract void GenerateNode(T target, IRitsuGodotNodeSlot required);
222223

224+
/// <summary>
225+
/// Packed-scene children often still reference the old root as <see cref="Node.Owner" /> after
226+
/// <c>RemoveChild</c>. Godot warns and can break unique-name resolution if reparenting under a new root with
227+
/// the same scene name without clearing first (matches Godot log: inconsistent owner).
228+
/// </summary>
229+
private static void ClearSubtreeOwnersForReparent(Node node)
230+
{
231+
foreach (var descendant in node.GetChildren())
232+
ClearSubtreeOwnersForReparent(descendant);
233+
234+
node.Owner = null;
235+
}
236+
223237
protected static void SetChildrenOwner(Node target, Node child)
224238
{
225239
foreach (var grandchild in child.GetChildren())

build/RitsuLib.CompatDefines.targets

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,20 @@
1919
-->
2020

2121
<PropertyGroup>
22-
<_RitsuLibSupportedApiVersions>0.103.2;0.104.0;0.105.0</_RitsuLibSupportedApiVersions>
23-
<_RitsuLibSupportedApiList>|0.103.2|0.104.0|0.105.0|</_RitsuLibSupportedApiList>
22+
<_RitsuLibSupportedApiVersions>0.103.2;0.104.0;0.105.1</_RitsuLibSupportedApiVersions>
23+
<_RitsuLibSupportedApiList>|0.103.2|0.104.0|0.105.1|</_RitsuLibSupportedApiList>
2424

25-
<_RitsuLib_AtLeast_0_103_2_HostList>|0.103.2|0.104.0|0.105.0|</_RitsuLib_AtLeast_0_103_2_HostList>
26-
<_RitsuLib_AtLeast_0_104_0_HostList>|0.104.0|0.105.0|</_RitsuLib_AtLeast_0_104_0_HostList>
27-
<_RitsuLib_AtLeast_0_105_0_HostList>|0.105.0|</_RitsuLib_AtLeast_0_105_0_HostList>
25+
<_RitsuLib_AtLeast_0_103_2_HostList>|0.103.2|0.104.0|0.105.1|</_RitsuLib_AtLeast_0_103_2_HostList>
26+
<_RitsuLib_AtLeast_0_104_0_HostList>|0.104.0|0.105.1|</_RitsuLib_AtLeast_0_104_0_HostList>
27+
<_RitsuLib_AtLeast_0_105_0_HostList>|0.105.1|</_RitsuLib_AtLeast_0_105_0_HostList>
28+
<_RitsuLib_AtLeast_0_105_1_HostList>|0.105.1|</_RitsuLib_AtLeast_0_105_1_HostList>
2829
</PropertyGroup>
2930

3031
<PropertyGroup>
3132
<DefineConstants Condition="$(_RitsuLib_AtLeast_0_103_2_HostList.Contains('|$(Sts2ApiCompat)|'))">$(DefineConstants);STS2_AT_LEAST_0_103_2</DefineConstants>
3233
<DefineConstants Condition="$(_RitsuLib_AtLeast_0_104_0_HostList.Contains('|$(Sts2ApiCompat)|'))">$(DefineConstants);STS2_AT_LEAST_0_104_0</DefineConstants>
3334
<DefineConstants Condition="$(_RitsuLib_AtLeast_0_105_0_HostList.Contains('|$(Sts2ApiCompat)|'))">$(DefineConstants);STS2_AT_LEAST_0_105_0</DefineConstants>
35+
<DefineConstants Condition="$(_RitsuLib_AtLeast_0_105_1_HostList.Contains('|$(Sts2ApiCompat)|'))">$(DefineConstants);STS2_AT_LEAST_0_105_1</DefineConstants>
3436
</PropertyGroup>
3537

3638
<Target Name="ValidateRitsuLibCompatTarget" BeforeTargets="CoreCompile">

mod_manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"name": "RitsuLib",
55
"author": "OLC",
66
"description": "A shared Slay the Spire 2 mod framework library providing reusable patching, persistence, lifecycle, localization, and utility APIs for other mods.",
7-
"version": "0.2.28",
7+
"version": "0.2.29",
88
"has_pck": false,
99
"has_dll": true,
1010
"affects_gameplay": false,

0 commit comments

Comments
 (0)