diff --git a/BaseLib/localization/eng/credits.json b/BaseLib/localization/eng/credits.json
new file mode 100644
index 0000000..e9cc49c
--- /dev/null
+++ b/BaseLib/localization/eng/credits.json
@@ -0,0 +1,7 @@
+{
+ "BASELIB-BANNER.name": "— MODS —",
+ "SLAY_THE_SPIRE": "Slay the Spire 2",
+ "BASELIB-BASELIB.title": "BaseLib",
+ "BASELIB-TEAM.header": "Developer",
+ "BASELIB-TEAM.names": "Alchyr"
+}
\ No newline at end of file
diff --git a/BaseLibMain.cs b/BaseLibMain.cs
index 3b13882..03ffb3a 100644
--- a/BaseLibMain.cs
+++ b/BaseLibMain.cs
@@ -66,6 +66,9 @@ public static void Initialize()
MainHarmony.TryPatchAll(assembly);
CustomLocTableManager.Register("card_modifiers");
+
+
+ ModCredits.Register(ModId, new ModCredits.Section("TEAM"));
}
//Hopefully temporary fix for linux
diff --git a/Patches/UI/NCreditsScreenPatch.cs b/Patches/UI/NCreditsScreenPatch.cs
new file mode 100644
index 0000000..f06a6db
--- /dev/null
+++ b/Patches/UI/NCreditsScreenPatch.cs
@@ -0,0 +1,350 @@
+using BaseLib.Utils;
+using Godot;
+using HarmonyLib;
+using MegaCrit.Sts2.addons.mega_text;
+using MegaCrit.Sts2.Core.ControllerInput;
+using MegaCrit.Sts2.Core.Nodes.CommonUi;
+using MegaCrit.Sts2.Core.Nodes.Screens.Credits;
+
+namespace BaseLib.Patches.UI;
+
+///
+/// Single Harmony patch class for . Each hook just
+/// delegates to .
+///
+[HarmonyPatch(typeof(NCreditsScreen))]
+public static class NCreditsScreenPatch
+{
+ /// Renders the modded blocks and side-nav after the screen is ready.
+ [HarmonyPatch("_Ready"), HarmonyPostfix]
+ public static void OnReady(NCreditsScreen __instance)
+ => CreditsNav.Render(__instance);
+
+ /// Redirects default focus onto the side-nav.
+ [HarmonyPatch("DefaultFocusedControl", MethodType.Getter), HarmonyPostfix]
+ public static void OnDefaultFocus(ref Control __result)
+ => CreditsNav.RedirectFocus(ref __result);
+
+ /// Cleans up the confirm binding when the screen leaves the tree.
+ [HarmonyPatch("_ExitTree"), HarmonyPostfix]
+ public static void OnExitTree()
+ => CreditsNav.RemoveBindings();
+}
+
+///
+/// Rendering and navigation logic for the modded credits screen. Holds all the
+/// non-Harmony work: building the (possibly nested) credit blocks, the fixed
+/// side-nav, jump-scrolling, focus seeding, and the controller confirm binding.
+/// Driven by .
+///
+internal static class CreditsNav
+{
+ private static readonly Color BannerColor = new(1f, 0.55f, 0.20f); // orange
+ private static readonly Color ModNameColor = new(0.53f, 0.81f, 0.92f); // blue
+ private static readonly Color NavColor = new(1f, 0.965f, 0.886f); // cream
+ private static readonly Color NavHoverColor = new(0.937f, 0.784f, 0.318f); // gold
+
+ /// Where a jumped-to node lands, measured from the top of the screen.
+ private const float NavTopPadding = 200f;
+
+ /// Confirm actions bound while the screen is open (last-wins over the screen's blockers).
+ private static readonly string[] ConfirmActions = [(string)MegaInput.select];
+
+ /// First side-nav button; used to seed controller/keyboard focus.
+ private static Button? _firstNavButton;
+
+ /// Confirm binding pushed into the hotkey manager while the screen is open.
+ private static Action? _confirmBinding;
+
+ /// Focused-button → jump action, so a confirm press triggers the right entry.
+ private static readonly Dictionary