From 8022f891fb6471f303bb810bd971b26d58e42efb Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Mon, 12 Dec 2022 00:28:00 -0600 Subject: [PATCH] Added Help -> PC Errata screen, which permits the user to see each PC errata side-by-side with the original --- .../gempukku/lotro/async/ResponseWriter.java | 2 +- .../async/handler/HallRequestHandler.java | 11 +++ .../src/main/web/css/gemp-001/deckBuild.css | 16 ++++ .../src/main/web/css/gemp-001/hall.css | 5 ++ .../gemp-lotr-async/src/main/web/hall.html | 37 ++++++--- .../src/main/web/images/cultures/one_ring.png | Bin 0 -> 2117 bytes .../src/main/web/images/cultures/site.png | Bin 0 -> 2228 bytes .../src/main/web/images/cultures/site.svg | 17 ++++ .../src/main/web/includes/help.html | 1 + .../src/main/web/includes/help/pc-errata.html | 75 ++++++++++++++++++ .../src/main/web/js/gemp-022/communication.js | 13 +++ .../com/gempukku/lotro/common/JSONDefs.java | 9 +++ .../lotro/game/LotroCardBlueprintLibrary.java | 51 ++++++++++++ .../com/gempukku/lotro/logic/GameUtils.java | 25 ++++++ 14 files changed, 250 insertions(+), 12 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-async/src/main/web/images/cultures/one_ring.png create mode 100644 gemp-lotr/gemp-lotr-async/src/main/web/images/cultures/site.png create mode 100644 gemp-lotr/gemp-lotr-async/src/main/web/images/cultures/site.svg create mode 100644 gemp-lotr/gemp-lotr-async/src/main/web/includes/help/pc-errata.html diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/ResponseWriter.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/ResponseWriter.java index ad0f1c366..dca192beb 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/ResponseWriter.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/ResponseWriter.java @@ -12,7 +12,7 @@ public interface ResponseWriter { public void writeFile(File file, Map headers); public void writeHtmlResponse(String html); - public void writeJsonResponse(String html); + public void writeJsonResponse(String json); public void writeByteResponse(byte[] bytes, Map headers); diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/HallRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/HallRequestHandler.java index 298718ebe..4356d0424 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/HallRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/HallRequestHandler.java @@ -1,5 +1,6 @@ package com.gempukku.lotro.async.handler; +import com.alibaba.fastjson.JSON; import com.gempukku.lotro.SubscriptionConflictException; import com.gempukku.lotro.SubscriptionExpiredException; import com.gempukku.lotro.async.HttpProcessingException; @@ -65,6 +66,8 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri updateHall(request, responseWriter); } else if (uri.equals("/formats/html") && request.method() == HttpMethod.GET) { getFormats(request, responseWriter); + } else if (uri.equals("/errata/json") && request.method() == HttpMethod.GET) { + getErrataInfo(request, responseWriter); } else if (uri.startsWith("/format/") && request.method() == HttpMethod.GET) { getFormat(request, uri.substring(8), responseWriter); } else if (uri.startsWith("/queue/") && request.method() == HttpMethod.POST) { @@ -340,6 +343,14 @@ public class HallRequestHandler extends LotroServerRequestHandler implements Uri } } + private void getErrataInfo(HttpRequest request, ResponseWriter responseWriter) throws CardNotFoundException { + + var errata = _library.getErrata(); + String json = JSON.toJSONString(errata); + + responseWriter.writeJsonResponse(json); + } + private void getHall(HttpRequest request, ResponseWriter responseWriter) { QueryStringDecoder queryDecoder = new QueryStringDecoder(request.uri()); diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/css/gemp-001/deckBuild.css b/gemp-lotr/gemp-lotr-async/src/main/web/css/gemp-001/deckBuild.css index 4af556fb0..afeadbd4d 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/css/gemp-001/deckBuild.css +++ b/gemp-lotr/gemp-lotr-async/src/main/web/css/gemp-001/deckBuild.css @@ -55,6 +55,22 @@ body { font-size: 70%; } +button.navigation-butt { + padding: 0.5em; +} + +.navigation-butt.ui-button-icon-only > .ui-button-text{ + padding: 0; +} + +.navigation-butt.ui-button-icon-only { + width: 25px; +} + +.ui-button-icon-only .ui-button-icon-primary.ui-icon { + margin: auto auto auto -4px; +} + #set { width: 120px; } diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/css/gemp-001/hall.css b/gemp-lotr/gemp-lotr-async/src/main/web/css/gemp-001/hall.css index a111c677a..eb689fc2f 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/css/gemp-001/hall.css +++ b/gemp-lotr/gemp-lotr-async/src/main/web/css/gemp-001/hall.css @@ -172,6 +172,11 @@ button { opacity: 0.3; }*/ +.cultureHint { + position:relative; + top: 4px; +} + #gameHall { overflow-y: scroll; width: calc(100% ); diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/hall.html b/gemp-lotr/gemp-lotr-async/src/main/web/hall.html index 1758aa0a0..867e5535c 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/hall.html +++ b/gemp-lotr/gemp-lotr-async/src/main/web/hall.html @@ -89,7 +89,8 @@ autoOpen:false, closeOnEscape:true, resizable:false, - title:"Card information" + title:"Card information", + closeText: "" }); $("body").click( @@ -97,13 +98,20 @@ var tar = $(event.target); if (tar.hasClass("cardHint")) { - var blueprintId = tar.attr("value"); - var card = new Card(blueprintId, "SPECIAL", "hint", ""); - + var ids = tar.attr("value").split(","); + infoDialog.html(""); infoDialog.html("
"); - var floatCardDiv = $("
"); - floatCardDiv.append(createFullCardDiv(card.imageUrl, card.foil, card.horizontal)); + var floatCardDiv = $("
"); + + var horiz = false; + for(var i = 0; i < ids.length; i++) { + var bpid = ids[i]; + var card = new Card(bpid, "SPECIAL", "hint", ""); + horiz = horiz || card.horizontal; + floatCardDiv.append(createFullCardDiv(card.imageUrl, card.foil, card.horizontal)); + } + infoDialog.append(floatCardDiv); var windowWidth = $(window).width(); @@ -111,14 +119,21 @@ var horSpace = 30; var vertSpace = 45; + var height = 505; + var width = 340; - infoDialog.dialog({title:"Card information"}); - if (card.horizontal) { + infoDialog.dialog({ + title:"Card information", + + }); + if (horiz) { // 500x360 - infoDialog.dialog({width:Math.min(500 + horSpace, windowWidth), height:Math.min(360 + vertSpace, windowHeight)}); + infoDialog.dialog({width:Math.min((height + 10) * ids.length, windowWidth), + height:Math.min((width + 90), windowHeight)}); } else { // 360x500 - infoDialog.dialog({width:Math.min(360 + horSpace, windowWidth), height:Math.min(500 + vertSpace, windowHeight)}); + infoDialog.dialog({width:Math.min((width + 30) * ids.length, windowWidth), + height:Math.min((height + 45), windowHeight)}); } infoDialog.dialog("open"); @@ -325,7 +340,7 @@ -
+
diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/images/cultures/one_ring.png b/gemp-lotr/gemp-lotr-async/src/main/web/images/cultures/one_ring.png new file mode 100644 index 0000000000000000000000000000000000000000..998998616fd674c25a15de56d38a0cbe6dcffdb3 GIT binary patch literal 2117 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 literal 0 HcmV?d00001 diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/images/cultures/site.png b/gemp-lotr/gemp-lotr-async/src/main/web/images/cultures/site.png new file mode 100644 index 0000000000000000000000000000000000000000..de2b656eee555828532d4bbde58ff4342fa559e9 GIT binary patch literal 2228 zcmV;l2ut^gP)2000F5dQ@0+Qek%> zaB^>EX>4U6ba`-PAZ2)IW&i+q+U;0dcIzq({nse&5I{Tx!{NEsnZX_Y-C&$HX_`23 zd%mt+8zMjwdrN>z?cYD0{=sFevSghEAH7$&Y_yRRDnV^mns2S_d~ZM8YSY(p(sng4 zLuPc`X)i%SyyY)B`Ikz^x8PjZFI&L$|+a@5=Cro6$zici6l% z<6)B^+1`L^w4y$)A@LJmMW75WKyzH!Hg!Ss3Y)$B=At9hTH$a-_ocSNfcA!N?uUVI ztB1K^&tJ+Zr`rYu++DgSr=L6$yK212FN!Lwd^PFt@$_Cp?`@l1vK~|RYf}3ZHO*=D znnw`KVIH^Oaj46@Bkq87DWJNl0)rX#s2LP@ZFSX2chYTEiZ1Zca$`ZsT-Z!m02h&q z8Km2B>&{}LsR#i!1)*Xf<=$!eqNm+B?G+thxoUJ}4P|=9(vzExbb566K5|LxnIhdx z!0_e~_Hbh`H{R$5Ms#1Gx(V=pUkBtO)__7cVGfvJQh8I6o&Ja|Gl@3n=TL4rrloG< zhawBx4$dHxtX5tdr@dCfELsD|0D_WMfsN%12DEcr;UrsQJh(v;z%*fu=-HPYZ*r`X zV8R)11l&ZEK$f)*@gp`MhLSVRI_JC-7hH778*d32=Dql_+$J$%#fcY@AW>2sn2{scnCr=6e6C|0l$u_&}v*eItP6gppY;naGDWSxYDpymH z$JJM8yf%Je^grkEgQ=_VIL9!QMb;73|~btb%Ti5*t7Bk&vmI)=b=0O%M3&rA9V zga!a~41wnW(D5XA3;_KE^#>Il3jsQw1djor<4N$#*?&=VJP95HK>ek4@OuFMR`wqc z0eWp6{2l;$Z5{mO?7t}bi4dUI*1_)qp!)Z+|5ymn>s#S{0O<9t@VB%7^{wze0QCA+ zcpm_I?=vX#pRivwFCsR|njbrg_!zft<0h z*`$X<19FwZ{C2j!WYZV5_ZsOxH^jh7tZW^Y0004mX+uL$Nkc;*aB^>EX>4Tx z0C=2zkv&MmKp2MKrj?3R9PA+KkfAzR5EXHhRxE;r(pG5I!Q|3EXws0RxHt-~1qXi? zs}3&Cx;nTDg5VE`qmz@Oi6^Clb#y-LQx^h-Wt~o%23%n3W}k z_?&pcpbHW|a$R=$jdRIifoFz|Y&uRHCKgLwEO#+08!GV(aYRuy$`^7jE1b7DtJOMd z-;=*ERM1v3T&FdP1eTCQ3L<3GQ9%_JqO@zIm`Kxk%)>wI_*3MP$yEU(#{z0lAvu2V zKlt5Svp7BFCWT@^&x>t;i~+%2pw+PL?_=9;odEu4;7aTGYfWJ8lk`SMiyQ$1+rY(j zN0aw}%N=0oNtX=Ck^HoTVi9;hqi@OsgSSB6n%lSbIZhvdEcI&n1~@nb#!HmF?(y#4 z?!Nt7)9&9782566>iRP600006VoOIv00000008+zyMF)x010qNS#tmY3ljhU3ljkV znw%H_000McNliru<_rt~ArKPB1pxp602y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8() zNlj2!fese{00DqWL_t(I%e9ofN<%>qg}5J4;i8+`?df}K^c zu=NcrEPaM(VGi!Ur&g29AYuaar#sH-!Vso!zs0E@$@az<-6LZX+-0 zQc|JY-lU{CNj3e%y`;%*q^XG1A`Q$qBGSMiFz2i_fL-9jS!+h~R4Vm{veSNHK=L){1@{;OSBcF6yQpK>77~-;Fbx8$R z{wc5;khu(OSiWxaxLAsu(&ubG4{W{yD$dWZJbc!^k9HS5)pV!Vnnq(;QcKc!f_{Lc zF-c8HE1i7W0*1^^*)EpK01v>loeTPO(aB#s5NCi}U^EW&U&9Sh1=fHz@B-`y-u{H; zXFeF}QiIl1`hiU#2aF``Qc3&iwHdscq@Vsv=l=$FC{d3)CQ_pS0000; literal 0 HcmV?d00001 diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/images/cultures/site.svg b/gemp-lotr/gemp-lotr-async/src/main/web/images/cultures/site.svg new file mode 100644 index 000000000..e5486f188 --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/web/images/cultures/site.svg @@ -0,0 +1,17 @@ + + + + + + image/svg+xml + + + + + + + + + + + \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/includes/help.html b/gemp-lotr/gemp-lotr-async/src/main/web/includes/help.html index 240d81206..f17c4a036 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/includes/help.html +++ b/gemp-lotr/gemp-lotr-async/src/main/web/includes/help.html @@ -15,6 +15,7 @@
  • Code of Conduct
  • Format Rules
  • League Rules
  • +
  • PC Errata
  • diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/includes/help/pc-errata.html b/gemp-lotr/gemp-lotr-async/src/main/web/includes/help/pc-errata.html new file mode 100644 index 000000000..c406d24a6 --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/web/includes/help/pc-errata.html @@ -0,0 +1,75 @@ +
    + +
    +

    + All errata are indicated in-game with a red slash in their upper-right-hand corner. Errata that were issued by the Player's Council instead of Decipher also have this slash, but also include the errata date in the lower-left-hand corner of the card. +

    + Each of the released errata have had a full writeup on the PC's thoughts and justifications here on the LOTR-TCG wiki. +

    +

    + Below you can find a quick reference allowing you to quickly compare released errata. +

    +
    +
    +
    \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/communication.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/communication.js index e37fd1664..ee76385ea 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/communication.js +++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/communication.js @@ -684,6 +684,19 @@ var GempLotrCommunication = Class.extend({ }); }, + getErrata:function (callback, errorMap) { + $.ajax({ + type:"GET", + url:this.url + "/hall/errata/json", + cache:false, + data:{ + participantId:getUrlParam("participantId")}, + success:this.deliveryCheck(callback), + error:this.errorCheck(errorMap), + dataType:"json" + }); + }, + addTesterFlag:function (callback, errorMap) { $.ajax({ type:"POST", diff --git a/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/JSONDefs.java b/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/JSONDefs.java index a5f149818..5d0d5e76b 100644 --- a/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/JSONDefs.java +++ b/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/JSONDefs.java @@ -64,4 +64,13 @@ public class JSONDefs { public Map SealedTemplates; public Map DraftTemplates; } + + public static class ErrataInfo { + public static String PC_Errata = "PC"; + public String BaseID; + public String Name; + public String LinkText; + public Map ErrataIDs; + } + } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprintLibrary.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprintLibrary.java index 6c8a32489..0561f1ea3 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprintLibrary.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprintLibrary.java @@ -3,8 +3,10 @@ package com.gempukku.lotro.game; import com.gempukku.lotro.cards.build.InvalidCardDefinitionException; import com.gempukku.lotro.cards.build.LotroCardBlueprintBuilder; import com.gempukku.lotro.common.AppConfig; +import com.gempukku.lotro.common.JSONDefs; import com.gempukku.lotro.game.packs.DefaultSetDefinition; import com.gempukku.lotro.game.packs.SetDefinition; +import com.gempukku.lotro.logic.GameUtils; import com.gempukku.util.JsonUtils; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; @@ -91,6 +93,8 @@ public class LotroCardBlueprintLibrary { reloadSets(); reloadMappings(); reloadCards(); + errataMappings = null; + getErrata(); for(var callback : _refreshCallbacks) { callback.Invoke(); @@ -302,6 +306,53 @@ public class LotroCardBlueprintLibrary { } } + private Map errataMappings = null; + public Map getErrata() { + try { + if(errataMappings == null) { + collectionReady.acquire(); + errataMappings = new HashMap<>(); + for (String id : _blueprints.keySet()) { + var parts = id.split("_"); + int setID = Integer.parseInt(parts[0]); + String cardID = parts[1]; + JSONDefs.ErrataInfo card = null; + String base = id; + if(setID >= 50 && setID <= 69) { + base = "" + (setID - 50) + "_" + cardID; + } + else if(setID >= 70 && setID <= 89) { + base = "" + (setID - 70) + "_" + cardID; + } + else if(setID >= 150 && setID <= 199) { + base = "" + (setID - 50) + "_" + cardID; + } + else + continue; + + if(errataMappings.containsKey(base)) { + card = errataMappings.get(base); + } + else { + card = new JSONDefs.ErrataInfo(); + card.BaseID = base; + card.Name = GameUtils.getFullName(_blueprints.get(base)); + card.LinkText = GameUtils.getDeluxeCardLink(id, _blueprints.get(base)); + card.ErrataIDs = new HashMap<>(); + errataMappings.put(base, card); + } + + card.ErrataIDs.put(JSONDefs.ErrataInfo.PC_Errata, id); + } + + collectionReady.release(); + } + return errataMappings; + } catch (InterruptedException exp) { + throw new RuntimeException("LotroCardBlueprintLibrary.getErrata() interrupted: ", exp); + } + } + public boolean hasAlternateInSet(String blueprintId, int setNo) { try { collectionReady.acquire(); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/GameUtils.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/GameUtils.java index 76ba97ef4..87af021ca 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/GameUtils.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/GameUtils.java @@ -116,6 +116,24 @@ public class GameUtils { return "
    " + (blueprint.isUnique() ? "·" : "") + GameUtils.getFullName(blueprint) + "
    "; } + public static String getDeluxeCardLink(String blueprintId, LotroCardBlueprint blueprint) { + var culture = blueprint.getCulture(); + var cultureString = ""; + if(culture == null) { + if (blueprint.getTitle().equals("The One Ring")) { + cultureString = getCultureImage(culture, "one_ring"); + } + else { + cultureString = getCultureImage(culture, "site"); + } + } + else { + cultureString = getCultureImage(culture, null); + } + return "
    " + cultureString + + (blueprint.isUnique() ? "·" : "") + " " + GameUtils.getFullName(blueprint) + "
    "; + } + public static String getCultureImage(String cultureName) { Culture culture = Culture.findCulture(cultureName); if(culture == null) @@ -124,6 +142,13 @@ public class GameUtils { return getCultureImage(culture); } + public static String getCultureImage(Culture culture, String override) { + if(override == null || override.isEmpty()) { + override = culture.toString().toLowerCase(); + } + return ""; + } + public static String getCultureImage(Culture culture) { return " " + culture.getHumanReadable() + "";