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)