From f9ae67377c1a79bb37eef2b19b5e6845ee5fc75f Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Fri, 13 Apr 2018 21:09:26 -0700 Subject: [PATCH] Drafting appears to be working --- .../handler/SoloDraftRequestHandler.java | 20 +- .../src/main/resources/test-log4j.xml | 4 +- .../src/main/web/css/gemp-001/deckBuild.css | 6 + .../src/main/web/js/gemp-019/communication.js | 25 ++ .../main/web/js/gemp-019/leagueResultsUi.js | 3 +- .../src/main/web/js/gemp-019/soloDraftUi.js | 299 ++++++++++++++++++ .../src/main/web/leagueAdmin.html | 4 +- .../src/main/web/soloDraft.html | 81 +++++ .../gempukku/lotro/builder/ServerBuilder.java | 12 +- .../src/main/resources/draft/hobbit.json | 12 +- 10 files changed, 444 insertions(+), 22 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-019/soloDraftUi.js create mode 100644 gemp-lotr/gemp-lotr-async/src/main/web/soloDraft.html diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/SoloDraftRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/SoloDraftRequestHandler.java index c8a404eb0..5a5704499 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/SoloDraftRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/SoloDraftRequestHandler.java @@ -23,6 +23,7 @@ import org.w3c.dom.Element; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.lang.reflect.Type; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -70,16 +71,19 @@ public class SoloDraftRequestHandler extends LotroServerRequestHandler implement Player resourceOwner = getResourceOwnerSafely(request, participantId); CardCollection collection = _collectionsManager.getPlayerCollection(resourceOwner, collectionType.getCode()); + + Iterable availableChoices; + boolean finished = (Boolean) collection.getExtraInformation().get("finished"); - if (finished) - responseWriter.writeError(404); - - int stage = ((Number) collection.getExtraInformation().get("stage")).intValue(); - long playerSeed = ((Number) collection.getExtraInformation().get("seed")).longValue(); - - SoloDraft soloDraft = soloDraftLeagueData.getSoloDraft(); - Iterable availableChoices = soloDraft.getAvailableChoices(playerSeed, stage); + if (!finished) { + int stage = ((Number) collection.getExtraInformation().get("stage")).intValue(); + long playerSeed = ((Number) collection.getExtraInformation().get("seed")).longValue(); + SoloDraft soloDraft = soloDraftLeagueData.getSoloDraft(); + availableChoices = soloDraft.getAvailableChoices(playerSeed, stage); + } else { + availableChoices = Collections.emptyList(); + } DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); diff --git a/gemp-lotr/gemp-lotr-async/src/main/resources/test-log4j.xml b/gemp-lotr/gemp-lotr-async/src/main/resources/test-log4j.xml index 662d114f0..9cd6ca66d 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/resources/test-log4j.xml +++ b/gemp-lotr/gemp-lotr-async/src/main/resources/test-log4j.xml @@ -8,7 +8,7 @@ - + @@ -17,7 +17,7 @@ - + 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 3eff1aec8..c34b74ed9 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 @@ -73,3 +73,9 @@ body { #filtering select { font-size: 80%; } + +#messageDiv { + text-align: center; + color: #ffffff; + font-size: 180%; +} diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-019/communication.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-019/communication.js index 3796fd0e6..91d362196 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-019/communication.js +++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-019/communication.js @@ -654,5 +654,30 @@ var GempLotrCommunication = Class.extend({ error:this.errorCheck(errorMap), dataType:"html" }); + }, + getDraft:function (leagueType, callback, errorMap) { + $.ajax({ + type:"GET", + url:this.url + "/soloDraft/"+leagueType, + cache:false, + data:{ + participantId:getUrlParam("participantId")}, + success:callback, + error:this.errorCheck(errorMap), + dataType:"xml" + }); + }, + makeDraftPick:function (leagueType, choiceId, callback, errorMap) { + $.ajax({ + type:"POST", + url:this.url + "/soloDraft/"+leagueType, + cache:false, + data:{ + choiceId:choiceId, + participantId:getUrlParam("participantId")}, + success:callback, + error:this.errorCheck(errorMap), + dataType:"xml" + }); } }); diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-019/leagueResultsUi.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-019/leagueResultsUi.js index c93d08b0b..0e5bcd141 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-019/leagueResultsUi.js +++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-019/leagueResultsUi.js @@ -66,8 +66,7 @@ var LeagueResultsUI = Class.extend({ var draftBut = $("").button(); var draftFunc = (function (leagueCode) { return function() { - var participantId = getUrlParam("participantId"); - location.href = "/gemp-lotr/soloDraft.html?leagueType="+leagueCode+"&participantId="+participantId; + location.href = "/gemp-lotr/soloDraft.html?leagueType="+leagueCode; }; })(leagueType); draftBut.click(draftFunc); diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-019/soloDraftUi.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-019/soloDraftUi.js new file mode 100644 index 000000000..ee7c37f8f --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-019/soloDraftUi.js @@ -0,0 +1,299 @@ +var GempLotrSoloDraftUI = Class.extend({ + comm:null, + + topDiv:null, + bottomDiv:null, + + messageDiv:null, + picksDiv:null, + draftedDiv:null, + + picksCardGroup:null, + draftedCardGroup:null, + + leagueType:null, + + init:function () { + var that = this; + + this.comm = new GempLotrCommunication("/gemp-lotr-server", that.processError); + + this.leagueType = getUrlParam("leagueType"); + + this.topDiv = $("#topDiv"); + this.bottomDiv = $("#bottomDiv"); + + this.messageDiv = $("#messageDiv"); + this.picksDiv = $("#picksDiv"); + this.draftedDiv = $("#draftedDiv"); + + this.picksCardGroup = new NormalCardGroup(this.picksDiv, function (card) { + return true; + }); + this.picksCardGroup.maxCardHeight = 200; + + this.draftedCardGroup = new NormalCardGroup(this.draftedDiv, function (card) { + return true; + }); + this.draftedCardGroup.maxCardHeight = 200; + + this.selectionFunc = this.addCardToDeckAndLayout; + + $("body").click( + function (event) { + return that.clickCardFunction(event); + }); + $("body").mousedown( + function (event) { + return that.dragStartCardFunction(event); + }); + $("body").mouseup( + function (event) { + return that.dragStopCardFunction(event); + }); + + var width = $(window).width(); + var height = $(window).height(); + + this.infoDialog = $("
") + .dialog({ + autoOpen:false, + closeOnEscape:true, + resizable:false, + title:"Card information" + }); + + var swipeOptions = { + threshold:20, + swipeUp:function (event) { + that.infoDialog.prop({ scrollTop:that.infoDialog.prop("scrollHeight") }); + return false; + }, + swipeDown:function (event) { + that.infoDialog.prop({ scrollTop:0 }); + return false; + } + }; + this.infoDialog.swipe(swipeOptions); + + this.getDraftState(); + }, + + getDraftState:function () { + var that = this; + this.comm.getDraft(this.leagueType, + function (xml) { + var root = xml.documentElement; + if (root.tagName == "availablePicks") { + var availablePicks = root.getElementsByTagName("availablePick"); + for (var i = 0; i < availablePicks.length; i++) { + var availablePick = availablePicks[i]; + var id = availablePick.getAttribute("id"); + var url = availablePick.getAttribute("url"); + var blueprintId = availablePick.getAttribute("blueprintId"); + + if (blueprintId != null) { + var card = new Card(blueprintId, "picks", "deck", "player"); + var cardDiv = createCardDiv(card.imageUrl, null, card.isFoil(), false, false, card.hasErrata()); + cardDiv.data("card", card); + cardDiv.data("choiceId", id); + that.picksDiv.append(cardDiv); + } else { + var card = new Card("rules", "picks", "deck", "player"); + var cardDiv = createCardDiv(url, null, false, false, true, false); + cardDiv.data("card", card); + cardDiv.data("choiceId", id); + that.picksDiv.append(cardDiv); + } + } + that.picksCardGroup.layoutCards(); + if (availablePicks.length > 0) + that.messageDiv.text("Make a pick"); + else + that.messageDiv.text("Draft is finished"); + } + }); + + this.comm.getCollection(this.leagueType, null, 0, 1000, + function (xml) { + var root = xml.documentElement; + if (root.tagName == "collection") { + var cards = root.getElementsByTagName("card"); + for (var i=0; i 0) + that.messageDiv.text("Make a pick"); + else + that.messageDiv.text("Draft is finished"); + } + }); + $(".card", that.picksDiv).remove(); + } + } + + event.stopPropagation(); + } + } + return false; + } + return true; + }, + + dragCardData:null, + dragStartX:null, + dragStartY:null, + successfulDrag:null, + + dragStartCardFunction:function (event) { + this.successfulDrag = false; + var tar = $(event.target); + if (tar.hasClass("actionArea")) { + var selectedCardElem = tar.closest(".card"); + if (event.which == 1) { + this.dragCardData = selectedCardElem.data("card"); + this.dragStartX = event.clientX; + this.dragStartY = event.clientY; + return false; + } + } + return true; + }, + + dragStopCardFunction:function (event) { + if (this.dragCardData != null) { + if (this.dragStartY - event.clientY >= 20) { + this.displayCardInfo(this.dragCardData); + this.successfulDrag = true; + } + this.dragCardData = null; + this.dragStartX = null; + this.dragStartY = null; + return false; + } + return true; + }, + + displayCardInfo:function (card) { + this.infoDialog.html(""); + this.infoDialog.html("
"); + this.infoDialog.append(createFullCardDiv(card.imageUrl, card.foil, card.horizontal, card.isPack())); + if (card.hasWikiInfo()) + this.infoDialog.append(""); + var windowWidth = $(window).width(); + var windowHeight = $(window).height(); + + var horSpace = 30; + var vertSpace = 45; + + if (card.horizontal) { + // 500x360 + this.infoDialog.dialog({width:Math.min(500 + horSpace, windowWidth), height:Math.min(380 + vertSpace, windowHeight)}); + } else { + // 360x500 + this.infoDialog.dialog({width:Math.min(360 + horSpace, windowWidth), height:Math.min(520 + vertSpace, windowHeight)}); + } + this.infoDialog.dialog("open"); + }, + + layoutUI:function (layoutDivs) { + if (layoutDivs) { + var messageHeight = 40; + var padding = 5; + + var topWidth = this.topDiv.width(); + var topHeight = this.topDiv.height(); + + var bottomWidth = this.bottomDiv.width(); + var bottomHeight = this.bottomDiv.height(); + + this.picksDiv.css({position:"absolute", left:padding, top:messageHeight+padding, width:topWidth-padding*2, height:topHeight-messageHeight-padding*2}); + this.picksCardGroup.setBounds(0, 0, topWidth-padding*2, topHeight-messageHeight-padding*2); + + this.draftedDiv.css({position:"absolute", left:padding, top:padding, width:bottomWidth-padding*2, height:bottomHeight-padding*2}); + this.draftedCardGroup.setBounds(0, 0, bottomWidth-padding*2, bottomHeight-padding*2); + } else { + this.picksCardGroup.layoutCards(); + this.draftedCardGroup.layoutCards(); + } + }, + + processError:function (xhr, ajaxOptions, thrownError) { + if (thrownError != "abort") + alert("There was a problem during communication with server"); + } +}); diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/leagueAdmin.html b/gemp-lotr/gemp-lotr-async/src/main/web/leagueAdmin.html index d429ba9ec..dd33b83e3 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/leagueAdmin.html +++ b/gemp-lotr/gemp-lotr-async/src/main/web/leagueAdmin.html @@ -207,8 +207,8 @@
Series duration in days:
Maximum matches in series:
- - + +

Add constructed league

diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/soloDraft.html b/gemp-lotr/gemp-lotr-async/src/main/web/soloDraft.html new file mode 100644 index 000000000..1d4826271 --- /dev/null +++ b/gemp-lotr/gemp-lotr-async/src/main/web/soloDraft.html @@ -0,0 +1,81 @@ + + + + Gemp-LotR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+ + diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/builder/ServerBuilder.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/builder/ServerBuilder.java index 04850eb18..48db69a21 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/builder/ServerBuilder.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/builder/ServerBuilder.java @@ -4,6 +4,7 @@ import com.gempukku.lotro.cards.CardSets; import com.gempukku.lotro.chat.ChatServer; import com.gempukku.lotro.collection.CollectionsManager; import com.gempukku.lotro.collection.TransferDAO; +import com.gempukku.lotro.common.ApplicationConfiguration; import com.gempukku.lotro.db.CollectionDAO; import com.gempukku.lotro.db.DeckDAO; import com.gempukku.lotro.db.GameHistoryDAO; @@ -135,14 +136,21 @@ public class ServerBuilder { } public static void constructObjects(Map objectMap) { - extract(objectMap, MtgCardServer.class).startServer(); + if (isMtgEnabled()) + extract(objectMap, MtgCardServer.class).startServer(); extract(objectMap, HallServer.class).startServer(); extract(objectMap, LotroServer.class).startServer(); extract(objectMap, ChatServer.class).startServer(); } + private static boolean isMtgEnabled() { + String mtgEnabled = ApplicationConfiguration.getProperty("mtg.enabled"); + return mtgEnabled == null || mtgEnabled.equals("true"); + } + public static void destroyObjects(Map objectMap) { - extract(objectMap, MtgCardServer.class).stopServer(); + if (isMtgEnabled()) + extract(objectMap, MtgCardServer.class).stopServer(); extract(objectMap, HallServer.class).stopServer(); extract(objectMap, LotroServer.class).stopServer(); extract(objectMap, ChatServer.class).stopServer(); diff --git a/gemp-lotr/gemp-lotr-server/src/main/resources/draft/hobbit.json b/gemp-lotr/gemp-lotr-server/src/main/resources/draft/hobbit.json index ff0d335a3..36e269ba7 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/resources/draft/hobbit.json +++ b/gemp-lotr/gemp-lotr-server/src/main/resources/draft/hobbit.json @@ -5,8 +5,8 @@ "data": { "seed": 0, "randomResult": [ - ["card1", "card2"], - ["card1", "card2"] + ["1_1", "1_2"], + ["1_3", "1_4"] ] } }, @@ -19,12 +19,12 @@ { "choiceId": "starter1", "url": "/images/draft1_starter1.jpg", - "cards": ["card1", "card2"] + "cards": ["1_5", "1_6"] }, { "choiceId": "starter2", "url": "/images/draft1_starter2.jpg", - "cards": ["card1", "card2"] + "cards": ["1_7", "1_8"] } ] } @@ -40,7 +40,7 @@ "data": { "seed": 2, "count": 3, - "availableCards": ["card1", "card2", "card3", "card4"] + "availableCards": ["1_9", "1_10", "1_11", "1_12"] } }, { @@ -48,7 +48,7 @@ "data": { "seed": 2, "count": 3, - "availableCards": ["card1", "card2", "card3", "card4"] + "availableCards": ["1_13", "1_14", "1_15", "1_16"] } } ]