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 99f35c092..b91c8eb72 100644
--- a/gemp-lotr/gemp-lotr-async/src/main/web/hall.html
+++ b/gemp-lotr/gemp-lotr-async/src/main/web/hall.html
@@ -63,7 +63,7 @@
$("#latestNews").append(
"If you find any problems with specific card or rules in general, please report it on TLHH forum - Report a bug, please include game replay link.");
- chat = new ChatBoxUI("Game Hall", $("#chat"), "/gemp-lotr-server", true, null, false, true);
+ chat = new ChatBoxUI("Game Hall", $("#chat"), "/gemp-lotr-server", true, null, false, true, null);
chat.setBounds(2, 2, 780 - 4, 200 - 4);
chat.showTimestamps = true;
diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/chat.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/chat.js
index 3ae6255b4..a1df00b1e 100644
--- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/chat.js
+++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/chat.js
@@ -21,11 +21,14 @@ var ChatBoxUI = Class.extend({
lockChat:false,
stopUpdates: false,
+
+ dialogListener: null,
- init:function (name, div, url, showList, playerListener, showHideSystemButton, showLockButton) {
+ init:function (name, div, url, showList, playerListener, showHideSystemButton, showLockButton, displayChatListener) {
var that = this;
this.hiddenClasses = new Array();
this.playerListener = playerListener;
+ this.dialogListener = displayChatListener,
this.name = name;
this.div = div;
this.communication = new GempLotrCommunication(url, function (xhr, ajaxOptions, thrownError) {
@@ -149,6 +152,19 @@ var ChatBoxUI = Class.extend({
this.chatTalkDiv.css({ position:"absolute", left:x + talkBoxPadding + "px", top:y - 2 * talkBoxPadding + (height - this.talkBoxHeight) + "px", width:width - 3 * talkBoxPadding - leftTextBoxPadding, height:this.talkBoxHeight });
}
},
+
+ checkForEnd:function (message, msgClass) {
+ // if(msgClass != "systemMessage")
+ // {
+ // return;
+ // }
+
+ if(message.includes("Thank you for playtesting!")) {
+ if (this.dialogListener != null) {
+ this.dialogListener("Give us feedback!", message);
+ }
+ }
+ },
appendMessage:function (message, msgClass) {
if (msgClass == undefined)
@@ -166,6 +182,8 @@ var ChatBoxUI = Class.extend({
}
if (!this.lockChat)
this.chatMessagesDiv.prop({ scrollTop:this.chatMessagesDiv.prop("scrollHeight") });
+
+ this.checkForEnd(message, msgClass);
},
monthNames:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
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 38b48dba8..601c10397 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
@@ -510,9 +510,20 @@ var GempLotrGameUI = Class.extend({
$("a[href='#playersInRoomBox']").html("Players(" + players.length + ")");
$("#playersInRoomBox").html(val);
};
+
+ var displayChatListener = function(title, message) {
+
+ var dialog = $("
").dialog({
+ title: title,
+ resizable: true,
+ height: 200,
+ modal: true,
+ buttons: {}
+ }).html(message);
+ }
var chatRoomName = (this.replayMode ? null : ("Game" + getUrlParam("gameId")));
- this.chatBox = new ChatBoxUI(chatRoomName, $("#chatBox"), this.communication.url, false, playerListener, false, true);
+ this.chatBox = new ChatBoxUI(chatRoomName, $("#chatBox"), this.communication.url, false, playerListener, false, true, displayChatListener);
this.chatBox.chatUpdateInterval = 3000;
if (!this.spectatorMode && !this.replayMode) {
diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroFormat.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroFormat.java
index 89453db90..d8cc7c761 100644
--- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroFormat.java
+++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroFormat.java
@@ -18,6 +18,8 @@ public interface LotroFormat {
public boolean winOnControlling5Sites();
+ public boolean isPlaytest();
+
public String getName();
public void validateCard(String cardId) throws DeckInvalidException;
diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GameRecorder.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GameRecorder.java
index 6cf6f2097..3e486fb55 100644
--- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GameRecorder.java
+++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GameRecorder.java
@@ -49,7 +49,7 @@ public class GameRecorder {
return new InflaterInputStream(new FileInputStream(file));
}
- public GameRecordingInProgress recordGame(LotroGameMediator lotroGame, final String formatName, final String tournament, final Map deckNames) {
+ public GameRecordingInProgress recordGame(LotroGameMediator lotroGame, LotroFormat format, final String tournament, final Map deckNames) {
final Date startData = new Date();
final Map recordingChannels = new HashMap();
for (String playerId : lotroGame.getPlayersPlaying()) {
@@ -58,17 +58,24 @@ public class GameRecorder {
recordingChannels.put(playerId, recordChannel);
}
- return new GameRecordingInProgress() {
- @Override
- public void finishRecording(String winner, String winReason, String loser, String loseReason) {
- Map playerRecordingId = saveRecordedChannels(recordingChannels);
- _gameHistoryService.addGameHistory(winner, loser, winReason, loseReason, playerRecordingId.get(winner), playerRecordingId.get(loser), formatName, tournament, deckNames.get(winner), deckNames.get(loser), startData, new Date());
+ return (winner, winReason, loser, loseReason) -> {
+ Map playerRecordingId = saveRecordedChannels(recordingChannels);
+ _gameHistoryService.addGameHistory(winner, loser, winReason, loseReason, playerRecordingId.get(winner), playerRecordingId.get(loser), format.getName(), tournament, deckNames.get(winner), deckNames.get(loser), startData, new Date());
+
+ if(format.isPlaytest())
+ {
+ String url = "https://docs.google.com/forms/d/e/1FAIpQLSdKJrCmjoyUqDTusDcpNoWAmvkGdzQqTxWGpdNIFX9biCee-A/viewform?usp=pp_url&entry.1592109986=";
+ String winnerURL = "https://play.lotrtcgpc.net/gemp-lotr/game.html%3FreplayId%3D" + winner + "$" + playerRecordingId.get(winner);
+ String loserURL = "https://play.lotrtcgpc.net/gemp-lotr/game.html%3FreplayId%3D" + loser + "$" + playerRecordingId.get(loser);
+ url += winnerURL + "%20" + loserURL;
+ lotroGame.sendMessageToPlayers("Thank you for playtesting! If you have any feedback, bugs, or other issues to report about this match, please do so using this form.");
}
+
};
}
public interface GameRecordingInProgress {
- public void finishRecording(String winner, String winReason, String loser, String loseReason);
+ void finishRecording(String winner, String winReason, String loser, String loseReason);
}
private File getRecordingFile(String playerId, String gameId) {
diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroServer.java
index a16c495cf..0569997b0 100644
--- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroServer.java
+++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroServer.java
@@ -128,13 +128,14 @@ public class LotroServer extends AbstractServer {
lotroGameMediator.sendMessageToPlayers("Players in the game are: " + players.toString());
- final GameRecorder.GameRecordingInProgress gameRecordingInProgress = _gameRecorder.recordGame(lotroGameMediator, gameSettings.getLotroFormat().getName(), tournamentName, deckNames);
+ final GameRecorder.GameRecordingInProgress gameRecordingInProgress = _gameRecorder.recordGame(lotroGameMediator, gameSettings.getLotroFormat(), tournamentName, deckNames);
lotroGameMediator.addGameResultListener(
new GameResultListener() {
@Override
public void gameFinished(String winnerPlayerId, String winReason, Map loserPlayerIdsWithReasons) {
final Map.Entry loserEntry = loserPlayerIdsWithReasons.entrySet().iterator().next();
+
gameRecordingInProgress.finishRecording(winnerPlayerId, winReason, loserEntry.getKey(), loserEntry.getValue());
}
diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/DefaultLotroFormat.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/DefaultLotroFormat.java
index 9e11b88c4..af0a3f649 100644
--- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/DefaultLotroFormat.java
+++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/DefaultLotroFormat.java
@@ -40,6 +40,7 @@ public class DefaultLotroFormat implements LotroFormat {
private List _validSets = new ArrayList();
private List _restrictedCardNames = new ArrayList();
private String _surveyUrl;
+ private boolean _isPlaytest;
//Additional Hobbit Draft parameters
private List _limit2Cards = new ArrayList();
@@ -49,7 +50,7 @@ public class DefaultLotroFormat implements LotroFormat {
LotroCardBlueprintLibrary library, String name, String surveyUrl,
SitesBlock siteBlock,
boolean validateShadowFPCount, int minimumDeckSize, int maximumSameName, boolean mulliganRule,
- boolean canCancelRingBearerSkirmish, boolean hasRuleOfFour, boolean winAtEndOfRegroup, boolean winOnControlling5Sites) {
+ boolean canCancelRingBearerSkirmish, boolean hasRuleOfFour, boolean winAtEndOfRegroup, boolean winOnControlling5Sites, boolean playtest) {
_adventure = adventure;
_library = library;
_name = name;
@@ -63,6 +64,7 @@ public class DefaultLotroFormat implements LotroFormat {
_hasRuleOfFour = hasRuleOfFour;
_winAtEndOfRegroup = winAtEndOfRegroup;
_winOnControlling5Sites = winOnControlling5Sites;
+ _isPlaytest = playtest;
}
@Override
@@ -105,6 +107,11 @@ public class DefaultLotroFormat implements LotroFormat {
return _winOnControlling5Sites;
}
+ @Override
+ public boolean isPlaytest() {
+ return _isPlaytest;
+ }
+
@Override
public List getValidSets() {
return Collections.unmodifiableList(_validSets);
diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/LotroFormatLibrary.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/LotroFormatLibrary.java
index 060141f40..b914f3fa3 100644
--- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/LotroFormatLibrary.java
+++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/formats/LotroFormatLibrary.java
@@ -46,12 +46,15 @@ public class LotroFormatLibrary {
Boolean winOnControlling5Sites = (Boolean) formatDef.get("winOnControlling5Sites");
if (winOnControlling5Sites == null)
winOnControlling5Sites = false;
+ Boolean isPlaytest = (Boolean) formatDef.get("playtest");
+ if (isPlaytest == null)
+ isPlaytest = false;
Number maximumSameNameCount = (Number) formatDef.get("maximumSameName");
int maximumSameName = (maximumSameNameCount != null) ? maximumSameNameCount.intValue() : 4;
final DefaultLotroFormat format = new DefaultLotroFormat(adventure, library, name, surveyUrl, block, true, 60, maximumSameName, true,
- cancelRingBearerSkirmish, hasRuleOfFour, winAtEndOfRegroup, winOnControlling5Sites);
+ cancelRingBearerSkirmish, hasRuleOfFour, winAtEndOfRegroup, winOnControlling5Sites, isPlaytest);
JSONArray sets = (JSONArray) formatDef.get("set");
for (Object set : sets)