diff --git a/gradle.properties b/gradle.properties index 9fd3025..e3e61d9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,5 +19,5 @@ loader_version_range=[1,) mod_id=bnstoolkit mod_name=Brass and Sigil Toolkit mod_license=All Rights Reserved -mod_version=0.6.1 +mod_version=0.6.2 mod_group_id=uk.sijbers.bnstoolkit diff --git a/src/main/java/uk/sijbers/bnstoolkit/client/screens/BaseBnsScreen.java b/src/main/java/uk/sijbers/bnstoolkit/client/screens/BaseBnsScreen.java index 87e47d2..5ceda35 100644 --- a/src/main/java/uk/sijbers/bnstoolkit/client/screens/BaseBnsScreen.java +++ b/src/main/java/uk/sijbers/bnstoolkit/client/screens/BaseBnsScreen.java @@ -1,7 +1,9 @@ package uk.sijbers.bnstoolkit.client.screens; import dev.ftb.mods.ftblibrary.icon.Color4I; +import dev.ftb.mods.ftblibrary.icon.Icons; import dev.ftb.mods.ftblibrary.ui.BaseScreen; +import dev.ftb.mods.ftblibrary.ui.SimpleTextButton; import dev.ftb.mods.ftblibrary.ui.Theme; import dev.ftb.mods.ftblibrary.ui.WidgetType; import net.minecraft.client.gui.GuiGraphics; @@ -59,4 +61,20 @@ public abstract class BaseBnsScreen extends BaseScreen { protected int contentBottom() { return getHeight() - 24; } + + /** + * Build a smart close button: labelled "Back" with a back-arrow icon + * if there's a previous screen registered (e.g. opened from the Hub), + * otherwise labelled "Close". In both cases the button calls + * {@code closeGui()} — FTB Library's BaseScreen returns to the + * registered previous screen automatically when one was set. + */ + public static SimpleTextButton makeBackOrClose(BaseBnsScreen screen) { + boolean hasPrev = screen.getPrevScreen() != null; + String label = hasPrev ? "Back" : "Close"; + return SimpleTextButton.create(screen, + Component.literal(label), + hasPrev ? Icons.BACK : Icons.CLOSE, + btn -> screen.closeGui()); + } } diff --git a/src/main/java/uk/sijbers/bnstoolkit/client/screens/HubScreen.java b/src/main/java/uk/sijbers/bnstoolkit/client/screens/HubScreen.java index cfc365a..2277f0b 100644 --- a/src/main/java/uk/sijbers/bnstoolkit/client/screens/HubScreen.java +++ b/src/main/java/uk/sijbers/bnstoolkit/client/screens/HubScreen.java @@ -6,7 +6,9 @@ import dev.ftb.mods.ftblibrary.ui.Panel; import dev.ftb.mods.ftblibrary.ui.SimpleTextButton; import dev.ftb.mods.ftblibrary.ui.Theme; import dev.ftb.mods.ftblibrary.ui.Widget; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import uk.sijbers.bnstoolkit.client.ClientBnsState; import uk.sijbers.bnstoolkit.data.CivicTier; @@ -43,8 +45,14 @@ public final class HubScreen extends BaseBnsScreen { sp.setSize(getWidth() - 16, getHeight() - 50); add(sp); - add(SimpleTextButton.create(this, Component.literal("Quest Log"), Icons.INFO, - btn -> { NetSend.requestSnapshot("ALL"); new QuestLogScreen().openGui(); })); + add(SimpleTextButton.create(this, Component.literal("Journal"), Icons.INFO, + btn -> { + NetSend.requestSnapshot("ALL"); + QuestLogScreen ql = new QuestLogScreen(); + Screen prev = Minecraft.getInstance().screen; // current screen wrapper + if (prev != null) ql.setPreviousScreen(prev); + ql.openGui(); + })); add(SimpleTextButton.create(this, Component.literal("Refresh"), Icons.REFRESH, btn -> NetSend.requestSnapshot("ALL"))); add(SimpleTextButton.create(this, Component.literal("Close"), Icons.CLOSE, diff --git a/src/main/java/uk/sijbers/bnstoolkit/client/screens/QuestLogScreen.java b/src/main/java/uk/sijbers/bnstoolkit/client/screens/QuestLogScreen.java index 73a1144..57a9b26 100644 --- a/src/main/java/uk/sijbers/bnstoolkit/client/screens/QuestLogScreen.java +++ b/src/main/java/uk/sijbers/bnstoolkit/client/screens/QuestLogScreen.java @@ -1,6 +1,7 @@ package uk.sijbers.bnstoolkit.client.screens; import dev.ftb.mods.ftblibrary.icon.Color4I; +import dev.ftb.mods.ftblibrary.icon.Icon; import dev.ftb.mods.ftblibrary.icon.Icons; import dev.ftb.mods.ftblibrary.ui.Panel; import dev.ftb.mods.ftblibrary.ui.SimpleTextButton; @@ -8,22 +9,33 @@ import dev.ftb.mods.ftblibrary.ui.Theme; import dev.ftb.mods.ftblibrary.ui.Widget; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import uk.sijbers.bnstoolkit.client.ClientBnsState; import uk.sijbers.bnstoolkit.data.Bounty; -import uk.sijbers.bnstoolkit.data.CivicTier; import uk.sijbers.bnstoolkit.data.Plot; +import uk.sijbers.bnstoolkit.data.SellCatalogue; import uk.sijbers.bnstoolkit.network.NetSend; import java.util.Map; /** - * Read-only "what am I doing right now" overview. + * Adventurer's Journal — at-a-glance overview of the player's active + * adventure. Read-only; no economy mutation happens here. * - * Shows the player's tier + balance summary at the top, then three - * sections: active bounties with progress bars, owned plots, and the - * shop fee preview. FTB Quests integration deferred — when the quest - * book lands we'll add a fourth section that mirrors the player's - * current chapter progress here. + *
Three sections, top to bottom: + *
Not to be confused with FTB Quests, which is a separate
+ * chapter-based progression mod with its own Quest Book item. A footer
+ * line points players there.
*/
public final class QuestLogScreen extends BaseBnsScreen {
public QuestLogScreen() {
@@ -32,58 +44,84 @@ public final class QuestLogScreen extends BaseBnsScreen {
@Override
public void addWidgets() {
- SummaryPanel summary = new SummaryPanel(this);
- summary.setPos(8, contentTop());
- summary.setSize(getWidth() - 16, getHeight() - 30);
- add(summary);
+ // Pre-size the content panel so its children get correct
+ // dimensions during the recursive refreshWidgets.
+ ContentPanel content = new ContentPanel(this);
+ content.setPos(8, contentTop());
+ content.setSize(getWidth() - 16, getHeight() - 32);
+ add(content);
add(SimpleTextButton.create(this, Component.literal("Refresh"), Icons.REFRESH,
btn -> NetSend.requestSnapshot("ALL")));
+ add(BaseBnsScreen.makeBackOrClose(this));
}
@Override
public void alignWidgets() {
- Widget rf = getWidgets().get(1);
- rf.setSize(60, 16);
- rf.setPos(getWidth() - 68, getHeight() - 22);
+ int btnY = getHeight() - 22;
+ Widget refresh = getWidgets().get(1);
+ refresh.setSize(60, 16); refresh.setPos(8, btnY);
+ Widget close = getWidgets().get(2);
+ close.setSize(60, 16); close.setPos(getWidth() - 68, btnY);
}
- private static final class SummaryPanel extends Panel {
- SummaryPanel(Panel parent) { super(parent); }
+ /** Three-section journal body. */
+ private static final class ContentPanel extends Panel {
+ ContentPanel(Panel parent) { super(parent); }
@Override public void addWidgets() {
- CivicTier cfg = CivicTier.byId(ClientBnsState.tier);
- add(new Header(this, "§e=== Status ==="));
- add(new Header(this, "Tier: §" + cfg.colour().getChar() + cfg.name() + "§r ("
- + ClientBnsState.tier + " / " + CivicTier.MAX + ")"));
- add(new Header(this, "Balance: §6" + TierUpgradeScreen.formatSpurs(ClientBnsState.spurs) + " spurs§r"));
- add(new Header(this, "Shop fee: §c" + ClientBnsState.effectiveFeePct + "%§r"));
-
- add(new Header(this, ""));
- add(new Header(this, "§e=== Active bounties ==="));
+ // Section 1: Active Bounties
+ int activeCount = ClientBnsState.activeBounties.size();
+ int cap = ClientBnsState.bountySlotCap;
+ add(new Header(this,"§e=== Active Bounties (" + activeCount + " / " + cap + ") ==="));
if (ClientBnsState.activeBounties.isEmpty()) {
- add(new Header(this, "§7none — visit the Bounty Board (B)"));
+ add(new Header(this,"§8 none — visit the Bounty Board at spawn"));
} else {
for (Map.Entry