Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/main/java/net/deckserver/dwr/DeckserverRemote.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,15 @@
import net.deckserver.dwr.creators.UpdateFactory;
import net.deckserver.dwr.model.GameModel;
import net.deckserver.dwr.model.GameView;
import net.deckserver.dwr.model.JolGame;
import net.deckserver.dwr.model.PlayerModel;
import net.deckserver.game.enums.GameFormat;
import net.deckserver.game.enums.RegionType;
import net.deckserver.services.*;
import net.deckserver.storage.json.deck.CardCount;
import net.deckserver.storage.json.deck.Deck;
import net.deckserver.storage.json.deck.ExtendedDeck;
import net.deckserver.storage.json.game.CardSimple;
import net.deckserver.storage.json.game.ChatData;
import net.deckserver.storage.json.system.DeckInfo;
import net.deckserver.storage.json.system.GameHistory;
Expand All @@ -26,6 +30,7 @@
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;

public class DeckserverRemote {

Expand Down Expand Up @@ -196,6 +201,14 @@ public Deck getGameDeck(String gameName) {
return null;
}

public List<CardCount> getLib(String gameName) {
JolGame game = GameService.getGameByName(gameName);
String playerName = getPlayer(request);
return game.data().getPlayerRegion(playerName, RegionType.LIBRARY).getCards().stream()
.map(card -> new CardCount(Integer.valueOf(card.getCardId()), card.getName(), 0, null))
.collect(Collectors.toList());
}

public Set<String> getGamePlayers(String gameName) {
String playerName = getPlayer(request);
if (gameName != null && !Strings.isNullOrEmpty(playerName)) {
Expand Down Expand Up @@ -395,6 +408,12 @@ public Map<String, Object> setMessage(String message) {
return UpdateFactory.getUpdate();
}

public List<CardSimple> removeShownCards(String name) {
String playerName = getPlayer(request);
GameService.getGameByName(name).setShownCards(playerName, null);
return null;
}

public String exportPastGamesAsCsv() throws IOException {
CSVFormat format = CSVFormat.DEFAULT.builder()
.setHeader("Game", "Started", "Ended", "Player", "Deck", "GW", "VP")
Expand Down
5 changes: 4 additions & 1 deletion src/main/java/net/deckserver/dwr/bean/GameBean.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.deckserver.dwr.bean;

import lombok.Getter;
import net.deckserver.storage.json.game.CardSimple;

import java.util.List;

Expand All @@ -13,6 +14,7 @@ public class GameBean {
private final String hand;
private final String globalNotes;
private final String privateNotes;
private final List<CardSimple> shownCards;
private final String label;
private final String phase;
private final List<String> turn;
Expand All @@ -29,7 +31,7 @@ public class GameBean {
private final int logLength;
private final String currentPlayer;

public GameBean(boolean isPlayer, boolean isAdmin, boolean isJudge, int refresh, String hand, String globalNotes, String privateNotes,
public GameBean(boolean isPlayer, boolean isAdmin, boolean isJudge, int refresh, String hand, String globalNotes, String privateNotes, List<CardSimple> shownCards,
String label, String phase, boolean resetChat, boolean turnChanged, List<String> turn, List<String> turns, String state, List<String> phases,
List<String> ping, List<String> pinged, String stamp, String name, int logLength, String currentPlayer) {
this.ping = ping;
Expand All @@ -41,6 +43,7 @@ public GameBean(boolean isPlayer, boolean isAdmin, boolean isJudge, int refresh,
this.hand = hand;
this.globalNotes = globalNotes;
this.privateNotes = privateNotes;
this.shownCards = shownCards;
this.label = label;
this.phase = phase;
this.resetChat = resetChat;
Expand Down
5 changes: 4 additions & 1 deletion src/main/java/net/deckserver/dwr/model/GameView.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import net.deckserver.services.ChatService;
import net.deckserver.services.GameService;
import net.deckserver.services.PlayerService;
import net.deckserver.storage.json.game.CardSimple;
import net.deckserver.storage.json.game.ChatData;
import org.directwebremoting.WebContextFactory;
import org.slf4j.Logger;
Expand Down Expand Up @@ -90,6 +91,7 @@ public GameBean create() {
String hand = null;
String globalNotes = null;
String privateNotes = null;
List<CardSimple> shownCards = null;
String label;
List<String> turn = new ArrayList<>();
List<String> turns = new ArrayList<>();
Expand Down Expand Up @@ -118,6 +120,7 @@ public GameBean create() {

if (privateNotesChanged) {
privateNotes = game.getPrivateNotes(playerName);
shownCards = game.getShownCards(playerName);
}

label = game.getTurnLabel() + " - " + game.getPhase();
Expand Down Expand Up @@ -160,7 +163,7 @@ public GameBean create() {
clearAccess();
String stamp = OffsetDateTime.now().format(ISO_OFFSET_DATE_TIME);
int logLength = ChatService.getTurn(id, game.getTurnLabel()).size();
return new GameBean(isPlayer, isAdmin, isJudge, refresh, hand, globalNotes, privateNotes, label, phase.getDescription(),
return new GameBean(isPlayer, isAdmin, isJudge, refresh, hand, globalNotes, privateNotes, shownCards,label, phase.getDescription(),
chatReset, tc, turn, turns, state, phases, ping, pinged, stamp, gameName, logLength, currentPlayer);
}

Expand Down
13 changes: 9 additions & 4 deletions src/main/java/net/deckserver/dwr/model/JolGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,7 @@
import net.deckserver.services.ParserService;
import net.deckserver.storage.json.cards.CardSummary;
import net.deckserver.storage.json.deck.Deck;
import net.deckserver.storage.json.game.CardData;
import net.deckserver.storage.json.game.GameData;
import net.deckserver.storage.json.game.PlayerData;
import net.deckserver.storage.json.game.RegionData;
import net.deckserver.storage.json.game.*;

import java.text.DecimalFormat;
import java.util.*;
Expand Down Expand Up @@ -379,6 +376,13 @@ public void setPrivateNotes(String player, String text) {
data.getPlayer(player).setNotes(text);
}

public List<CardSimple> getShownCards(String player) {
return Optional.ofNullable(data.getPlayer(player)).get().getShownCards();
}
public void setShownCards(String player, List<CardSimple> shownCards) {
data.getPlayer(player).setShownCards(shownCards);
}

public void setLabel(String player, String cardId, String text, boolean quiet) {
CardData card = data.getCard(cardId);
String cardName = getCardName(card);
Expand Down Expand Up @@ -626,6 +630,7 @@ public void show(String player, RegionType targetRegion, int amount, List<String
String privateNotes = recipientData.getNotes() == null ? "" : recipientData.getNotes();
privateNotes += notes;
recipientData.setNotes(privateNotes);
recipientData.setShownCards(cards.stream().map(card ->new CardSimple(card.getCardId(), card.getName(), card.getOwnerName(), targetRegion.description())).collect(Collectors.toList()));
}
String msg;
boolean self = recipients.size() == 1 && recipients.contains(player);
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/net/deckserver/storage/json/game/CardSimple.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package net.deckserver.storage.json.game;

import lombok.Data;

@Data
public class CardSimple {
String id;
String name;
String owner;
String region;

public CardSimple() {
}

public CardSimple(String cardId, String name, String ownerName, String region) {
this.id = cardId;
this.name = name;
this.owner = ownerName;
this.region = region;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import net.deckserver.game.enums.RegionType;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "name")
Expand All @@ -31,6 +32,7 @@ public class PlayerData {
private boolean ousted = false;
private String notes;
private String choice;
private List<CardSimple> shownCards;

public PlayerData(String name) {
this.name = name;
Expand Down
29 changes: 25 additions & 4 deletions src/main/webapp/WEB-INF/jsps/game/notes.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,30 @@
<div class="card-body p-0">
<label for="globalNotes" class="d-none"></label>
<textarea id="globalNotes" class="form-control scrollable" onblur="sendGlobalNotes();"
placeholder="Global Notes"></textarea>
<label for="privateNotes" class="d-none"></label>
<textarea id="privateNotes" class="form-control scrollable player-only" onblur="sendPrivateNotes();"
placeholder="Private Notes"></textarea>
placeholder="Global Notes" style="height: 150px;"></textarea>
<div class="border-top border-3 border-dark p-1" onclick="toggleDisplay('#quickAction')">
<a id="quickAction" class="text-decoration-none d-none" onclick="toggleDisplay('#quickAction')">
<button class="btn-sm btn-outline-secondary bg-secondary-subtle" onclick="sendCommand('unlock');" title="Unlock"><i class="bi bi-unlock m-1"></i></button>
<button class="btn-sm btn-outline-secondary bg-secondary-subtle" onclick="toggleDisplay('.shownCards');" title="Shown Cards"><i class="bi bi-stack m-1"></i></button>
<button class="btn-sm btn-outline-secondary bg-secondary-subtle" onclick="toggleDisplay('#privateNotesDiv');" title="Privates Notes"><i class="bi bi-journal m-1"></i></button>
<button type="button" class="btn-sm btn-outline-success bg-success-subtle" onclick="sendCommand('pool +1')">
+1
</button>
<button type="button" class="btn-sm btn-outline-danger bg-danger-subtle" onclick="sendCommand('pool -1')">
-1
</button>
</a>
</div>
</div>
<i id="cardOwner" class="bi bi-x-circle shownCards d-none" title="Clear Shown Cards" onclick="removeShownCards();"></i>
<div class="card-body d-flex p-0 scrollable">
<div id="deckBody" class="shownCards d-none d-flex w-100">
<ol id="deckBodyList" class="list-group list-group-numbered p-0 w-100"></ol>
</div>
<div id="privateNotesDiv" class="card-body d-flex p-0 w-100">
<label for="privateNotes" class="d-none"></label>
<textarea id="privateNotes" class="form-control player-only" onblur="sendPrivateNotes();"
placeholder="Private Notes" style="height: 150px;"></textarea>
</div>
</div>
</div>
4 changes: 4 additions & 0 deletions src/main/webapp/WEB-INF/jsps/game/quick-command-modal.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,11 @@
<button type="button" class="btn btn-outline-secondary m-1" onclick="sendCommand('shuffle')">
Shuffle
</button>
<button type="button" class="btn btn-outline-secondary m-1" onclick="sendCommand('show lib');">
Show Lib
</button>
</div>
<br/>
<h6 class="m-1 d-inline btn pe-none bg-secondary-subtle">Crypt</h6>
<div class="d-inline">
<button type="button" class="btn btn-outline-secondary m-1" onclick="sendCommand('draw crypt')">Draw
Expand Down
69 changes: 69 additions & 0 deletions src/main/webapp/js/ds.js
Original file line number Diff line number Diff line change
Expand Up @@ -1149,6 +1149,62 @@ function sendCommand(command, message = '') {
return false;
}

function callbackShowLib(data) {
let deckModal = $("#deckBodyList");
let deckBody = $("#deckBody");
let cardOwner = $("#cardOwner");
//empty owner/region of previous shown cards
deckModal.empty();
cardOwner.empty()
//display none all elements in case shown cards have been cleared
deckBody.addClass("d-none");
cardOwner.addClass("d-none");
//description who owns and where cards are from
if (data != null && data[0].owner==player) {
cardOwner.text(data[0].owner+" looks at "+data.length+" cards of their "+data[0].region+".");
} else if(data != null) {
cardOwner.text(data[0].owner+" shows "+data.length+" cards of their "+data[0].region+".");
}
//only display and render shown Cards if some are to show
if(data!=null) {
toggleDisplay(".shownCards")
$.each(data, function (index, card) {
const div = $("<div/>").addClass("mx-1 me-auto w-100 align-items-center");
const divLink = $("<div/>").addClass("d-flex justify-content-between align-items-center w-100");
const divButton = $("<div/>");
const cardRow = $("<li/>").addClass("flex-grow-1 list-group-item d-flex justify-content-between align-items-center p-1 shadow");
const cardLink = $("<a/>").text(card.name).attr("data-card-id", card.id).addClass("card-name");
if(card.owner==player) {
const sendHand = $("<a/>").attr("title", "Draw").addClass("link-dark").on("click", function () {
let target = cardRow.index()+1;
sendCommand('move '+card.region+' '+ target +' hand');
cardRow.remove();
}).append($("<i/>").addClass("bi bi-card-list text-decoration-none"));
const play = $("<a/>").attr("title", "Play").addClass("link-dark").on("click", function () {
let target = cardRow.index()+1;
sendCommand('move '+card.region+' '+ target +' ready');
cardRow.remove();
}).append($("<i/>").addClass("bi bi-play"));
const discard = $("<a/>").attr("title", "Discard").addClass("link-dark").on("click", function () {
let target = cardRow.index()+1;
sendCommand('move '+card.region+' '+ target +' ash');
cardRow.remove();
}).append($("<i/>").addClass("bi bi-trash"));
divButton.append(sendHand, play, discard);
}
divLink.append(cardLink, divButton);
div.append(divLink);
cardRow.append(div);
deckModal.append(cardRow);
})
addCardTooltips("#deckBodyList");
}
}

function closeShowLib() {
$("#deckBody").addClass("d-none");
}

function sendGlobalNotes() {
DS.updateGlobalNotes(game, $("#globalNotes").val());
return false;
Expand Down Expand Up @@ -1276,6 +1332,7 @@ function loadGame(data) {
//like another player has shown you some cards.
if (data.privateNotes) {
privateNotes.val(data.privateNotes);
callbackShowLib(data.shownCards);
}

if (data.turns.length > 0) {
Expand Down Expand Up @@ -1512,4 +1569,16 @@ function toggleMode() {
} else {
wrapper.removeAttr("data-bs-theme");
}
}
function toggleDisplay(identifier) {
$(identifier).toggleClass("d-none");
}
function addDnone(id) {
$("#"+id).addClass("d-none");
}
function removeDnone(id) {
$("#"+id).removeClass("d-none");
}
function removeShownCards() {
DS.removeShownCards(game, {callback: callbackShowLib, errorHandler: errorhandler});
}