Skip to content

Commit fa705fe

Browse files
committed
fix(Combat): refine power expiration logic in ModTemporaryPowerTemplate (Closes #48)
- Improved the expiration conditions for temporary powers based on the turn end of participants, ensuring accurate behavior during extra turns. - Enhanced clarity by differentiating between owner participation and side checks, preventing premature expiration of powers for non-participating creatures.
1 parent aae3df8 commit fa705fe

3 files changed

Lines changed: 133 additions & 9 deletions

File tree

Compat/Sts2ModManagerCompat.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,15 @@ internal static IReadOnlyList<Sts2ModInventoryEntry> BuildModInventoryEntries()
8282
.ToArray();
8383
}
8484

85+
internal static IReadOnlyList<Sts2ModInventoryEntry> BuildLoadedModInventoryEntries()
86+
{
87+
return EnumerateLoadedModsWithAssembly()
88+
.Select(TryBuildModInventoryEntry)
89+
.Where(entry => entry != null)
90+
.Select(entry => entry!)
91+
.ToArray();
92+
}
93+
8594
private static Sts2ModInventoryEntry? TryBuildModInventoryEntry(Mod mod)
8695
{
8796
try
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
using System.Text;
2+
using MegaCrit.Sts2.Core.Modding;
3+
using STS2RitsuLib.Compat;
4+
5+
namespace STS2RitsuLib.Diagnostics
6+
{
7+
internal static class StartupModListLogger
8+
{
9+
private const string Prefix = "[ModList]";
10+
private static readonly Lock SyncRoot = new();
11+
private static bool _initialized;
12+
private static bool _logged;
13+
14+
internal static void Initialize()
15+
{
16+
lock (SyncRoot)
17+
{
18+
if (_initialized)
19+
return;
20+
21+
_initialized = true;
22+
}
23+
24+
ModManager.OnModDetected += OnModDetected;
25+
TryLogAfterInitialModLoading();
26+
RitsuLibFramework.SubscribeLifecycleOnce<MainMenuReadyEvent>(_ => TryLogStartupModList());
27+
}
28+
29+
private static void OnModDetected(Mod _)
30+
{
31+
TryLogAfterInitialModLoading();
32+
}
33+
34+
private static void TryLogAfterInitialModLoading()
35+
{
36+
IReadOnlyList<Sts2ModInventoryEntry> registeredMods;
37+
try
38+
{
39+
registeredMods = Sts2ModManagerCompat.BuildModInventoryEntries();
40+
}
41+
catch (Exception ex)
42+
{
43+
RitsuLibFramework.Logger.Warn($"{Prefix} Failed to inspect mod loading state: {ex.Message}");
44+
return;
45+
}
46+
47+
if (registeredMods.Count == 0 ||
48+
registeredMods.Any(static mod => string.Equals(mod.State, "None", StringComparison.Ordinal)))
49+
return;
50+
51+
TryLogStartupModList();
52+
}
53+
54+
private static void TryLogStartupModList()
55+
{
56+
lock (SyncRoot)
57+
{
58+
if (_logged)
59+
return;
60+
61+
_logged = true;
62+
}
63+
64+
ModManager.OnModDetected -= OnModDetected;
65+
66+
try
67+
{
68+
var loadedMods = Sts2ModManagerCompat.BuildLoadedModInventoryEntries();
69+
var registeredMods = Sts2ModManagerCompat.BuildModInventoryEntries();
70+
var hostVersion = Sts2HostVersion.ReleaseLabel
71+
?? Sts2HostVersion.Numeric?.ToString()
72+
?? "unknown";
73+
74+
var text = new StringBuilder()
75+
.AppendLine()
76+
.AppendLine("=== RitsuLib Mod Debug Information ===")
77+
.AppendLine($"Host Version: {hostVersion}")
78+
.AppendLine($"RitsuLib {RitsuLibFramework.BuildVersionLogText()}")
79+
.AppendLine($"Loaded Mods: {loadedMods.Count}")
80+
.AppendLine($"Registered Mods: {registeredMods.Count}")
81+
.AppendLine("Mod List:");
82+
83+
if (loadedMods.Count == 0)
84+
{
85+
text.AppendLine(" <none>");
86+
RitsuLibFramework.Logger.Info(text.ToString());
87+
return;
88+
}
89+
90+
foreach (var mod in loadedMods)
91+
text.AppendLine($" * {FormatModName(mod)} ({FormatVersion(mod)})");
92+
93+
RitsuLibFramework.Logger.Info(text.ToString());
94+
}
95+
catch (Exception ex)
96+
{
97+
RitsuLibFramework.Logger.Warn($"{Prefix} Failed to print startup mod list: {ex.Message}");
98+
}
99+
}
100+
101+
private static string FormatModName(Sts2ModInventoryEntry mod)
102+
{
103+
var name = string.IsNullOrWhiteSpace(mod.Name) ? mod.Id : mod.Name.Trim();
104+
return string.Equals(name, mod.Id, StringComparison.Ordinal)
105+
? name
106+
: $"{name} [{mod.Id}]";
107+
}
108+
109+
private static string FormatVersion(Sts2ModInventoryEntry mod)
110+
{
111+
return string.IsNullOrWhiteSpace(mod.Version) ? "unknown version" : mod.Version.Trim();
112+
}
113+
}
114+
}

RitsuLibFramework.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ public static void Initialize()
314314
}
315315

316316
Logger = CreateLogger(Const.ModId);
317+
StartupModListLogger.Initialize();
317318

318319
Logger.Info($"Framework ID: {Const.ModId}");
319320
Logger.Info($"Framework Name: {Const.Name}");
@@ -387,12 +388,10 @@ public static void Initialize()
387388
}
388389
}
389390

390-
private static string BuildVersionLogText()
391+
internal static string BuildVersionLogText()
391392
{
392393
var compatBranchLabel = GetCompatBranchLabel();
393-
return string.IsNullOrWhiteSpace(compatBranchLabel)
394-
? $"Version: {Const.Version}"
395-
: $"Version: {Const.Version} [compat branch: {compatBranchLabel}]";
394+
return $"Version: {Const.Version} [compat branch: {compatBranchLabel}]";
396395
}
397396

398397
private static void EnsureFrameworkInteropBootstrapRegistered()
@@ -413,14 +412,16 @@ private static void ConfirmExternalFrameworkInterop()
413412
MaxHandSizePatchInstaller.EnsurePatched();
414413
}
415414

416-
private static string? GetCompatBranchLabel()
415+
private static string GetCompatBranchLabel()
417416
{
418-
#if !STS2_AT_LEAST_0_104_0
417+
#if STS2_AT_LEAST_0_106_1
418+
return "0.106.1";
419+
#elif STS2_AT_LEAST_0_105_1
420+
return "0.105.1";
421+
#elif STS2_AT_LEAST_0_103_2
419422
return "0.103.2";
420-
#elif !STS2_AT_LEAST_0_105_0
421-
return "0.104.0";
422423
#else
423-
return null;
424+
return "unknown";
424425
#endif
425426
}
426427

0 commit comments

Comments
 (0)