From 633b0e0d194c32ecfb651203e805f45711c56836 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Tue, 26 Nov 2024 15:19:56 -0600 Subject: [PATCH] New UI features - Added Initiative readout to the game screen - Added Rule of 4 readout to the game screen (only during the Fellowship phase) - Increased the size of the action box as a hack for situations where long messages went off the edge - Fixed the twilight filter not working in the deckbuilder --- .../main/web/js/gemp-022/gameAnimations.js | 28 +++++++++++++++++ .../src/main/web/js/gemp-022/gameUi.js | 10 +++++-- .../lotro/game/state/EventSerializer.java | 10 +++++-- .../lotro/logic/modifiers/ModifiersLogic.java | 8 +++++ .../logic/modifiers/ModifiersQuerying.java | 1 + .../lotro/logic/timing/GameStats.java | 30 ++++++++++++++++--- .../lotro/game/SortAndFilterCards.java | 2 +- 7 files changed, 78 insertions(+), 11 deletions(-) diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/gameAnimations.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/gameAnimations.js index 5abaaecd5..71c024e3b 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/gameAnimations.js +++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/gameAnimations.js @@ -835,6 +835,34 @@ var GameAnimations = Class.extend({ $(".shadowArchery").html(shadowArchery); $(".move").html(moveCount + "/" + moveLimit); + + var initiative = element.getAttribute("initiative"); + var ruleof4 = element.getAttribute("ruleof4"); + + if(initiative == "FREE_PEOPLE") { + $("#initiative-player").html("Free Peoples"); + } + else { + $("#initiative-player").html("Shadow"); + } + + if(ruleof4 == null || ruleof4 == "-1") { + $("#ruleof4").hide(); + } + else { + $("#ruleof4").show(); + $("#ruleof4-count").html(ruleof4); + if(ruleof4 >= "4") { + $("#ruleof4-status").html(" cards.
(Rule of 4 limit reached!)"); + } + else if(ruleof4 == "1"){ + $("#ruleof4-status").html(" card"); + } + else { + $("#ruleof4-status").html(" card"); + } + } + var playerZones = element.getElementsByTagName("playerZones"); for (var i = 0; i < playerZones.length; i++) { diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/gameUi.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/gameUi.js index 41148259a..5593d3993 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/gameUi.js +++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/gameUi.js @@ -335,6 +335,10 @@ var GempLotrGameUI = Class.extend({ this.gameStateElem.append("
0
"); this.gameStateElem.append("
"); this.gameStateElem.append("
"); + + this.gameStateElem.append("
"); + this.gameStateElem.append("
Initiative:
"); + this.gameStateElem.append("
Rule of 4:
"); $("#main").append(this.gameStateElem); @@ -437,7 +441,7 @@ var GempLotrGameUI = Class.extend({ left: "0px", top: "0px", width: "100%", - height: "50px", + height: "150px", scroll: "auto" }); @@ -445,7 +449,7 @@ var GempLotrGameUI = Class.extend({ this.alertButtons.css({ position: "absolute", left: "0px", - top: "50px", + top: "150px", width: "100%", height: "30px", scroll: "auto" @@ -915,7 +919,7 @@ var GempLotrGameUI = Class.extend({ var advPathWidth = Math.min(150, width * 0.1); var specialUiWidth = 150; - var alertHeight = 80; + var alertHeight = 180; var chatHeight = 200; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/EventSerializer.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/EventSerializer.java index 941f85016..b0ab38654 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/EventSerializer.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/EventSerializer.java @@ -4,7 +4,6 @@ import com.gempukku.lotro.common.Zone; import com.gempukku.lotro.logic.decisions.AwaitingDecision; import com.gempukku.lotro.logic.timing.GameStats; import com.gempukku.lotro.logic.vo.LotroDeck; -import com.mysql.cj.LicenseConfiguration; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -157,6 +156,11 @@ public class EventSerializer { eventElem.setAttribute("moveLimit", String.valueOf(gameStats.getMoveLimit())); eventElem.setAttribute("moveCount", String.valueOf(gameStats.getMoveCount())); + eventElem.setAttribute("initiative", String.valueOf(gameStats.getInitiativeSide())); + if(gameStats.getFellowshipCardsDrawn() != -1) { + eventElem.setAttribute("ruleof4", String.valueOf(gameStats.getFellowshipCardsDrawn())); + } + for (Map.Entry> playerZoneSizes : gameStats.getZoneSizes().entrySet()) { final Element playerZonesElem = doc.createElement("playerZones"); @@ -188,10 +192,10 @@ public class EventSerializer { else if (charResistances.containsKey(charCardId)) charStr.append("|R").append(charResistances.get(charCardId)); } - if (charStr.length() > 0) + if (!charStr.isEmpty()) charStr.delete(0, 1); - if (charStr.length() > 0) + if (!charStr.isEmpty()) eventElem.setAttribute("charStats", charStr.toString()); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java index be8b65b50..10b2b2732 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersLogic.java @@ -918,6 +918,14 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying { return true; } + @Override + public int getFellowshipDrawnCards(LotroGame game) { + if(game.getGameState().getCurrentPhase() != Phase.FELLOWSHIP) + return 0; + + return _drawnThisPhaseCount; + } + /** * Rule of 4. "You cannot draw (or take into hand) more than 4 cards during your fellowship phase." * diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java index 86aa22210..e15b2a94a 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/modifiers/ModifiersQuerying.java @@ -133,6 +133,7 @@ public interface ModifiersQuerying { boolean canDrawCardNoIncrement(LotroGame game, String playerId); boolean canDrawCardAndIncrementForRuleOfFour(LotroGame game, String playerId); + int getFellowshipDrawnCards(LotroGame game); boolean canLookOrRevealCardsInHand(LotroGame game, String revealingPlayerId, String performingPlayerId); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/GameStats.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/GameStats.java index 7b95a42a2..a7d414b58 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/GameStats.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/GameStats.java @@ -1,9 +1,6 @@ package com.gempukku.lotro.logic.timing; -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Phase; -import com.gempukku.lotro.common.Signet; -import com.gempukku.lotro.common.Zone; +import com.gempukku.lotro.common.*; import com.gempukku.lotro.filters.Filters; import com.gempukku.lotro.game.LotroCardBlueprint; import com.gempukku.lotro.game.PhysicalCard; @@ -24,6 +21,9 @@ public class GameStats { private int _moveLimit; private int _moveCount; + private Side _initiative = Side.FREE_PEOPLE; + private int _fellowshipCardsDrawn; + private int _fellowshipSkirmishStrength; private int _shadowSkirmishStrength; @@ -87,6 +87,23 @@ public class GameStats { _moveCount = newMoveCount; } + if(playerOrder != null) { + Side newInitiative = game.getModifiersQuerying().hasInitiative(game); + if(newInitiative != _initiative) { + changed = true; + _initiative = newInitiative; + } + } + + int newFellowshipCardsDrawn = game.getModifiersQuerying().getFellowshipDrawnCards(game); + if(game.getGameState().getCurrentPhase() != Phase.FELLOWSHIP) { + newFellowshipCardsDrawn = -1; + } + if(newFellowshipCardsDrawn != _fellowshipCardsDrawn) { + changed = true; + _fellowshipCardsDrawn = newFellowshipCardsDrawn; + } + int newFellowshipStrength = RuleUtils.getFellowshipSkirmishStrength(game); if (newFellowshipStrength != _fellowshipSkirmishStrength) { changed = true; @@ -231,6 +248,9 @@ public class GameStats { return _moveCount; } + public Side getInitiativeSide() { return _initiative; } + public int getFellowshipCardsDrawn() { return _fellowshipCardsDrawn; } + public int getFellowshipSkirmishStrength() { return _fellowshipSkirmishStrength; } @@ -283,6 +303,8 @@ public class GameStats { copy._fellowshipSkirmishDamageBonus = _fellowshipSkirmishDamageBonus; copy._moveCount = _moveCount; copy._moveLimit = _moveLimit; + copy._initiative = _initiative; + copy._fellowshipCardsDrawn = _fellowshipCardsDrawn; copy._shadowArchery = _shadowArchery; copy._shadowSkirmishStrength = _shadowSkirmishStrength; copy._shadowSkirmishDamageBonus = _shadowSkirmishDamageBonus; diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SortAndFilterCards.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SortAndFilterCards.java index f6e23f09a..7fd6665a0 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SortAndFilterCards.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SortAndFilterCards.java @@ -40,7 +40,7 @@ public class SortAndFilterCards { var races = getEnumFilter(Race.values(), Race.class, params.get("race"), true); var itemClasses = getEnumFilter(PossessionClass.values(), PossessionClass.class, params.get("itemclass"), true); - var twilight = getStat(params.get("sitenumber")); + var twilight = getStat(params.get("twilight")); var twilightComparator = getSingleton(params.get("twilightcompare")); var siteNumber = getStat(params.get("sitenumber")); var siteNumberComparator = getSingleton(params.get("sitenumbercompare"));