Drafting appears to be working

This commit is contained in:
marcin.sciesinski
2018-04-13 21:09:26 -07:00
parent e31a88db28
commit f9ae67377c
10 changed files with 444 additions and 22 deletions

View File

@@ -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<SoloDraft.DraftChoice> 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<SoloDraft.DraftChoice> 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();

View File

@@ -8,7 +8,7 @@
</layout>
</appender>
<appender name="R" class="org.apache.log4j.RollingFileAppender">
<param name="file" value="${catalina.base}/logs/gemp-lotr.log"/>
<param name="file" value="logs/gemp-lotr.log"/>
<param name="MaxFileSize" value="10MB"/>
<param name="MaxBackupIndex" value="20"/>
<layout class="org.apache.log4j.PatternLayout">
@@ -17,7 +17,7 @@
</appender>
<appender name="chat" class="org.apache.log4j.RollingFileAppender">
<param name="file" value="${catalina.base}/logs/chat.log"/>
<param name="file" value="logs/chat.log"/>
<param name="MaxFileSize" value="10MB"/>
<!-- Keep one backup file -->
<param name="MaxBackupIndex" value="20"/>

View File

@@ -73,3 +73,9 @@ body {
#filtering select {
font-size: 80%;
}
#messageDiv {
text-align: center;
color: #ffffff;
font-size: 180%;
}

View File

@@ -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"
});
}
});

View File

@@ -66,8 +66,7 @@ var LeagueResultsUI = Class.extend({
var draftBut = $("<button>Go to draft</button>").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);

View File

@@ -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 = $("<div></div>")
.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<cards.length; i++) {
var card = cards[i];
var count = card.getAttribute("count");
var blueprintId = card.getAttribute("blueprintId");
for (var no = 0; no < count; no++) {
var card = new Card(blueprintId, "drafted", "deck", "player");
var cardDiv = createCardDiv(card.imageUrl, null, card.isFoil(), false, false, card.hasErrata());
cardDiv.data("card", card);
that.draftedDiv.append(cardDiv);
}
}
that.draftedCardGroup.layoutCards();
}
});
},
clickCardFunction:function (event) {
var that = this;
var tar = $(event.target);
if (tar.length == 1 && tar[0].tagName == "A")
return true;
if (!this.successfulDrag && this.infoDialog.dialog("isOpen")) {
this.infoDialog.dialog("close");
event.stopPropagation();
return false;
}
if (tar.hasClass("actionArea")) {
var selectedCardElem = tar.closest(".card");
if (event.which == 1) {
if (!this.successfulDrag) {
if (event.shiftKey) {
this.displayCardInfo(selectedCardElem.data("card"));
} else {
if (selectedCardElem.data("card").zone == "picks") {
var choiceId = selectedCardElem.data("choiceId");
that.comm.makeDraftPick(that.leagueType, choiceId, function (xml) {
var root = xml.documentElement;
if (root.tagName == "pickResult") {
var pickedCards = root.getElementsByTagName("pickedCard");
for (var i = 0; i < pickedCards.length; i++) {
var pickedCard = pickedCards[i];
var blueprintId = pickedCard.getAttribute("blueprintId");
var count = pickedCard.getAttribute("count");
for (var no = 0; no < count; no++) {
var card = new Card(blueprintId, "drafted", "deck", "player");
var cardDiv = createCardDiv(card.imageUrl, null, card.isFoil(), false, false, card.hasErrata());
cardDiv.data("card", card);
that.draftedDiv.append(cardDiv);
}
}
that.draftedCardGroup.layoutCards();
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");
}
});
$(".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("<div style='scroll: auto'></div>");
this.infoDialog.append(createFullCardDiv(card.imageUrl, card.foil, card.horizontal, card.isPack()));
if (card.hasWikiInfo())
this.infoDialog.append("<div><a href='" + card.getWikiLink() + "' target='_blank'>Wiki</a></div>");
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");
}
});

View File

@@ -207,8 +207,8 @@
</select><br/>
Series duration in days: <input type="text" name="serieDuration"><br/>
Maximum matches in series: <input type="text" name="maxMatches"><br/>
<input id="previewSoloDraft" type="button" value="Preview sealed league">
<input type="submit" value="Add sealed league">
<input id="previewSoloDraft" type="button" value="Preview solo draft league">
<input type="submit" value="Add solo draft league">
</form>
<h2>Add constructed league</h2>

View File

@@ -0,0 +1,81 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Gemp-LotR</title>
<link rel="stylesheet" type="text/css" href="css/gemp-001/deckBuild.css">
<link rel="stylesheet" type="text/css" href="css/dark-hive/jquery-ui-1.8.16.custom.css">
<link rel="stylesheet" type="text/css" href="css/jquery.contextMenu.css">
<link rel="stylesheet" type="text/css" href="js/jquery/styles/jquery.spinnercontrol.css">
<script type="text/javascript" src="js/jquery/jquery-1.6.2.js"></script>
<script type="text/javascript" src="js/jquery/jquery-ui-1.8.16.custom.min.js"></script>
<script type="text/javascript" src="js/jquery/jquery.cookie.js"></script>
<script type="text/javascript" src="js/jquery/jquery.spinnercontrol.js"></script>
<script type="text/javascript" src="js/jquery/jquery.layout.js"></script>
<script type="text/javascript" src="js/jquery/jquery.touchSwipe.js"></script>
<script type="text/javascript" src="js/gemp-019/inheritance.js"></script>
<script type="text/javascript" src="js/gemp-019/common.js"></script>
<script type="text/javascript" src="js/gemp-019/logging.js"></script>
<script type="text/javascript" src="js/gemp-019/chat.js"></script>
<script type="text/javascript" src="js/gemp-019/communication.js"></script>
<script type="text/javascript" src="js/gemp-019/deliveryService.js"></script>
<script type="text/javascript" src="js/gemp-019/commonUi.js"></script>
<script type="text/javascript" src="js/gemp-019/cardFilter.js"></script>
<script type="text/javascript" src="js/gemp-019/jCardGroup.js"></script>
<script type="text/javascript" src="js/gemp-019/set20.js"></script>
<script type="text/javascript" src="js/gemp-019/hobbit.js"></script>
<script type="text/javascript" src="js/gemp-019/jCards.js"></script>
<script type="text/javascript" src="js/gemp-019/hallUi.js"></script>
<script type="text/javascript" src="js/gemp-019/leagueResultsUi.js"></script>
<script type="text/javascript" src="js/gemp-019/tournamentResultsUi.js"></script>
<script type="text/javascript" src="js/gemp-019/statsUi.js"></script>
<script type="text/javascript" src="js/gemp-019/playerStatsUi.js"></script>
<script type="text/javascript" src="js/gemp-019/gameHistoryUi.js"></script>
<script type="text/javascript" src="js/gemp-019/deckBuildingUi.js"></script>
<script type="text/javascript" src="js/gemp-019/gameUi.js"></script>
<script type="text/javascript" src="js/gemp-019/gameAnimations.js"></script>
<script type="text/javascript" src="js/gemp-019/merchantUi.js"></script>
<script type="text/javascript" src="js/gemp-019/soloDraftUi.js"></script>
<script type="text/javascript">
$(document).ready(
function () {
var ui = new GempLotrSoloDraftUI();
$('body').layout({
applyDefaultStyles:true,
onresize:function () {
ui.layoutUI(true);
},
north__minSize:"30%"
});
$(".ui-layout-pane").css({"background-color":"#000000"});
$(window).resize(function () {
ui.layoutUI(true);
});
ui.layoutUI(true);
});
</script>
</head>
<body>
<div id="topDiv" class="ui-layout-north">
<div id="messageDiv"></div>
<div id="picksDiv"></div>
</div>
<div id="bottomDiv" class="ui-layout-center">
<div id="draftedDiv"></div>
</div>
</body>
</html>

View File

@@ -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<Type, Object> 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<Type, Object> 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();

View File

@@ -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"]
}
}
]