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
25 changes: 16 additions & 9 deletions src/main/java/ti4/game/Player.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@
import ti4.service.leader.CommanderUnlockCheckService;
import ti4.service.map.FractureService;
import ti4.service.strategycard.PlayStrategyCardService;
import ti4.service.transaction.TransactionItem;
import ti4.service.turn.EndTurnService;
import ti4.service.turn.StartTurnService;
import ti4.service.unit.CheckUnitContainmentService;
Expand Down Expand Up @@ -373,8 +374,8 @@ public int getSpentTgsThisWindow() {
return 0;
}

public List<String> getTransactionItemsWithPlayer(Player player) {
List<String> transactionItemsWithPlayer = new ArrayList<>();
public List<TransactionItem> getTransactionItemsWithPlayer(Player player) {
List<TransactionItem> transactionItemsWithPlayer = new ArrayList<>();
List<Player> players = new ArrayList<>();
players.add(this);
players.add(player);
Expand All @@ -383,9 +384,8 @@ public List<String> getTransactionItemsWithPlayer(Player player) {
if (sender == player) {
receiver = this;
}
for (String item : getTransactionItems()) {
if (item.contains("sending" + sender.getFaction())
&& item.contains("receiving" + receiver.getFaction())) {
for (TransactionItem item : getTransactionItems()) {
if (item.isSentFromTo(sender.getFaction(), receiver.getFaction())) {
transactionItemsWithPlayer.add(item);
}
}
Expand All @@ -395,9 +395,9 @@ public List<String> getTransactionItemsWithPlayer(Player player) {

public void clearTransactionItemsWithPlayer(Player player) {
List<String> newTransactionItems = new ArrayList<>();
for (String item : getTransactionItems()) {
if (!item.contains("ing" + player.getFaction())) {
newTransactionItems.add(item);
for (TransactionItem item : getTransactionItems()) {
if (!item.involves(player.getFaction())) {
newTransactionItems.add(item.serialize());
}
}
game.setStoredValue(player.getFaction() + "NothingMessage", "");
Expand All @@ -406,7 +406,14 @@ public void clearTransactionItemsWithPlayer(Player player) {
}

public void addTransactionItem(String thing) {
getTransactionItems().add(thing);
TransactionItem transactionItem = TransactionItem.parse(thing);
if (transactionItem != null) {
addTransactionItem(transactionItem);
}
}

public void addTransactionItem(TransactionItem item) {
getSerializedTransactionItems().add(item.serialize());
}

public void addBreakthrough(String bt) {
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/ti4/game/PlayerProperties.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,14 @@
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import javax.annotation.Nullable;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import ti4.service.transaction.TransactionItem;

@Data
public class PlayerProperties {
Expand Down Expand Up @@ -123,7 +128,11 @@ public class PlayerProperties {
private Set<String> unitsOwned = new HashSet<>();
private Set<Integer> followedSCs = new HashSet<>();
private Set<Integer> SCs = new LinkedHashSet<>();

@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private List<String> transactionItems = new ArrayList<>();

private List<String> promissoryNotesInPlayArea = new ArrayList<>();
private List<String> techs = new ArrayList<>();
private List<String> spentThingsThisWindow = new ArrayList<>();
Expand All @@ -146,4 +155,19 @@ public class PlayerProperties {
public void loadCommodities(int commodities) {
this.commodities = commodities;
}

public List<TransactionItem> getTransactionItems() {
return transactionItems.stream()
.map(TransactionItem::parse)
.filter(Objects::nonNull)
.toList();
}

public List<String> getSerializedTransactionItems() {
return transactionItems;
}

public void setTransactionItems(List<String> transactionItems) {
this.transactionItems = new ArrayList<>(transactionItems);
}
}
2 changes: 1 addition & 1 deletion src/main/java/ti4/game/persistence/GameSaveService.java
Original file line number Diff line number Diff line change
Expand Up @@ -934,7 +934,7 @@ private static void saveGameInfo(Writer writer, Game game) throws IOException {
writer.write(System.lineSeparator());
writer.write(Constants.BOMBARD_UNITS + " " + String.join(",", player.getBombardUnits()));
writer.write(System.lineSeparator());
writer.write(Constants.TRANSACTION_ITEMS + " " + String.join(",", player.getTransactionItems()));
writer.write(Constants.TRANSACTION_ITEMS + " " + String.join(",", player.getSerializedTransactionItems()));
writer.write(System.lineSeparator());
writer.write(Constants.TEAMMATE_IDS + " " + String.join(",", player.getTeamMateIDs()));
writer.write(System.lineSeparator());
Expand Down
112 changes: 58 additions & 54 deletions src/main/java/ti4/helpers/TransactionHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import ti4.service.leader.CommanderUnlockCheckService;
import ti4.service.relic.SendRelicService;
import ti4.service.transaction.SendPromissoryService;
import ti4.service.transaction.TransactionItem;
import ti4.settings.users.UserSettingsManager;
import ti4.spring.service.gameevent.GameEventService;
import ti4.spring.service.gameevent.GameEventType;
Expand Down Expand Up @@ -89,12 +90,18 @@ public class TransactionHelper {
"Dane's Torment Engine LLC");

private static void acceptTransactionOffer(Player p1, Player p2, Game game, ButtonInteractionEvent event) {
List<String> transactionItems = p1.getTransactionItemsWithPlayer(p2);
List<TransactionItem> transactionItems = p1.getTransactionItemsWithPlayer(p2);
GameEventService.commit(
game,
GameEventType.TRANSACTION,
p1,
Map.of("from", p1.getFaction(), "to", p2.getFaction(), "items", transactionItems));
Map.of(
"from",
p1.getFaction(),
"to",
p2.getFaction(),
"items",
hidePrivateCardIdsForPublicEvent(transactionItems)));
List<Player> players = new ArrayList<>();
players.add(p1);
players.add(p2);
Expand All @@ -118,19 +125,11 @@ private static void acceptTransactionOffer(Player p1, Player p2, Game game, Butt
if (sender == p2) {
receiver = p1;
}
for (String item : transactionItems) {
if (item.contains("sending" + sender.getFaction())
&& item.contains("receiving" + receiver.getFaction())) {
String thingToTransact = item.split("_")[2];
String furtherDetail = item.replace(
item.split("_")[0] + "_" + item.split("_")[1] + "_" + item.split("_")[2] + "_", "");
int amountToTransact = 1;
boolean isGeneralized =
List.of("PNs", "ACs", "SOs").contains(thingToTransact) && furtherDetail.contains("generic");
if (isGeneralized) {
amountToTransact = Integer.parseInt("" + furtherDetail.charAt(furtherDetail.length() - 1));
furtherDetail = furtherDetail.substring(0, furtherDetail.length() - 1);
}
for (TransactionItem item : transactionItems) {
if (item.isSentFromTo(sender.getFaction(), receiver.getFaction())) {
String thingToTransact = item.type();
String furtherDetail = item.detailWithoutQuantity();
int amountToTransact = item.quantity();
String spoofedButtonID =
"send_" + thingToTransact + "_" + receiver.getFaction() + "_" + furtherDetail;
if (!thingToTransact.toLowerCase().contains("debt")) {
Expand Down Expand Up @@ -239,8 +238,14 @@ private static void acceptTransactionOffer(Player p1, Player p2, Game game, Butt
}
}

static List<String> hidePrivateCardIdsForPublicEvent(List<TransactionItem> transactionItems) {
return transactionItems.stream()
.map(item -> item.hidePrivateCardIdForPublicEvent().serialize())
.toList();
}

private static String buildTransactionOffer(Player p1, Player p2, Game game, boolean hidePrivateCardText) {
List<String> transactionItems = p1.getTransactionItemsWithPlayer(p2);
List<TransactionItem> transactionItems = p1.getTransactionItemsWithPlayer(p2);
StringBuilder trans = new StringBuilder();
List<Player> players = new ArrayList<>();
players.add(p1);
Expand All @@ -253,22 +258,15 @@ private static String buildTransactionOffer(Player p1, Player p2, Game game, boo
.append(player.getRepresentation(false, false, true))
.append(" gives:\n");
boolean sendingNothing = true;
for (String item : transactionItems) {
if (!item.contains("sending" + player.getFaction())) {
for (TransactionItem item : transactionItems) {
if (!item.isSentBy(player.getFaction())) {
continue;
}
trans.append("> - ");
sendingNothing = false;
String thingToTransact = item.split("_")[2];
String furtherDetail = item.replace(
item.split("_")[0] + "_" + item.split("_")[1] + "_" + item.split("_")[2] + "_", "");
int amountToTransact = 1;
boolean isGeneralized =
List.of("PNs", "ACs", "SOs").contains(thingToTransact) && furtherDetail.contains("generic");
if ("frags".equalsIgnoreCase(thingToTransact) || isGeneralized) {
amountToTransact = Integer.parseInt("" + furtherDetail.charAt(furtherDetail.length() - 1));
furtherDetail = furtherDetail.substring(0, furtherDetail.length() - 1);
}
String thingToTransact = item.type();
String furtherDetail = item.detailWithoutQuantity();
int amountToTransact = item.quantity();
switch (thingToTransact) {
case "TGs" -> {
amountToTransact = Integer.parseInt(furtherDetail);
Expand Down Expand Up @@ -416,7 +414,10 @@ private static String buildTransactionOffer(Player p1, Player p2, Game game, boo
trans.append(furtherDetail.replace("fin777", " "));
}
}
default -> trans.append(" some odd thing: `").append(item).append('`');
default ->
trans.append(" some odd thing: `")
.append(item.serialize())
.append('`');
}
trans.append('\n');
}
Expand Down Expand Up @@ -1090,9 +1091,13 @@ private static boolean resolveAgeOfCommerceTechCheck(Player owner, Player receiv
public static void finishDealDetails(ModalInteractionEvent event, Game game, Player player, String modalID) {
ModalMapping mapping = event.getValue("details");
String thoughts = mapping.getAsString();
Player opposing = game.getPlayerFromColorOrFaction(modalID.split("_")[1]);
player.addTransactionItem("sending" + player.getFaction() + "_receiving" + modalID.split("_")[1] + "_details_"
+ thoughts.replace("_", "").replace(",", "").replace("\n", "").replace(" ", "fin777"));
String receiver = modalID.split("_")[1];
Player opposing = game.getPlayerFromColorOrFaction(receiver);
player.addTransactionItem(TransactionItem.of(
player.getFaction(),
receiver,
"details",
thoughts.replace("_", "").replace(",", "").replace("\n", "").replace(" ", "fin777")));
String message = "Current transaction offer is:\n"
+ buildTransactionOffer(player, opposing, game, false)
+ "### Click something that you wish to __offer to__ " + opposing.getRepresentation(false, false);
Expand All @@ -1115,9 +1120,13 @@ public static void finishTrackRecord(ModalInteractionEvent event, String modalID
public static void finishDealDetailsInvert(ModalInteractionEvent event, Game game, Player player, String modalID) {
ModalMapping mapping = event.getValue("details");
String thoughts = mapping.getAsString();
Player opposing = game.getPlayerFromColorOrFaction(modalID.split("_")[1]);
player.addTransactionItem("sending" + modalID.split("_")[1] + "_receiving" + player.getFaction() + "_details_"
+ thoughts.replace("_", "").replace(",", "").replace("\n", "").replace(" ", "fin777"));
String sender = modalID.split("_")[1];
Player opposing = game.getPlayerFromColorOrFaction(sender);
player.addTransactionItem(TransactionItem.of(
sender,
player.getFaction(),
"details",
thoughts.replace("_", "").replace(",", "").replace("\n", "").replace(" ", "fin777")));
String message = "Current transaction offer is:\n"
+ buildTransactionOffer(player, opposing, game, false)
+ "### Click something that you wish to __request from__ " + opposing.getRepresentation(false, false);
Expand Down Expand Up @@ -1154,24 +1163,22 @@ public static void resolveOfferToTransact(Game game, Player player, String butto
int tgP2Sent = commsOfP1Washed - commsOfP2Washed;
if (commsOfP1Washed > 0) {
player.addTransactionItem(
"sending" + p1.getFaction() + "_receiving" + p2.getFaction() + "_Comms_" + commsOfP1Washed);
TransactionItem.of(p1.getFaction(), p2.getFaction(), "Comms", commsOfP1Washed));
}
if (commsOfP2Washed > 0) {
player.addTransactionItem(
"sending" + p2.getFaction() + "_receiving" + p1.getFaction() + "_Comms_" + commsOfP2Washed);
TransactionItem.of(p2.getFaction(), p1.getFaction(), "Comms", commsOfP2Washed));
}
if (tgP1Sent > 0) {
player.addTransactionItem(
"sending" + p1.getFaction() + "_receiving" + p2.getFaction() + "_TGs_" + tgP1Sent);
player.addTransactionItem(TransactionItem.of(p1.getFaction(), p2.getFaction(), "TGs", tgP1Sent));
}
if (tgP2Sent > 0) {
player.addTransactionItem(
"sending" + p2.getFaction() + "_receiving" + p1.getFaction() + "_TGs_" + tgP2Sent);
player.addTransactionItem(TransactionItem.of(p2.getFaction(), p1.getFaction(), "TGs", tgP2Sent));
}
} else {
String itemS = "sending" + sender + "_receiving" + receiver + "_" + item + "_" + extraDetail;
if (!player.getTransactionItems().contains(itemS) || !itemS.contains("dmz")) {
player.addTransactionItem(itemS);
TransactionItem transactionItem = TransactionItem.of(sender, receiver, item, extraDetail);
if (!player.getTransactionItems().contains(transactionItem) || !"dmz".equals(transactionItem.type())) {
player.addTransactionItem(transactionItem);
}
}
var userSettings = UserSettingsManager.get(player.getUserID());
Expand All @@ -1181,7 +1188,7 @@ public static void resolveOfferToTransact(Game game, Player player, String butto
&& userSettings.isPrefersAutoDebtClearance()
&& !p2.hasAbility("data_recovery")) {
int amount = Math.min(p2.getDebtTokenCount(p1.getColor()), Integer.parseInt(extraDetail));
String clear = "sending" + receiver + "_receiving" + sender + "_ClearDebt_" + amount;
TransactionItem clear = TransactionItem.of(receiver, sender, "ClearDebt", amount);
if (!player.getTransactionItems().contains(clear)) {
player.addTransactionItem(clear);
}
Expand Down Expand Up @@ -1324,27 +1331,24 @@ private static String buildPillageNotice(Game game, Player p1, Player p2) {
int p2TgAfter = p2.getTg();
boolean debtOnlyTransaction = true;
// compute TGs after transaction is complete
for (String item : p1.getTransactionItemsWithPlayer(p2)) {
String[] parts = item.split("_");
if (parts.length < 4) continue;
String type = parts[2];
for (TransactionItem item : p1.getTransactionItemsWithPlayer(p2)) {
String type = item.type();
if (!"SendDebt".equals(type) && !"ClearDebt".equals(type)) {
debtOnlyTransaction = false;
}
String detail = item.replace(parts[0] + "_" + parts[1] + "_" + type + "_", "");
try {
if ("TGs".equals(type)) {
int amount = Integer.parseInt(detail);
if (item.contains("sending" + p1.getFaction())) {
int amount = Integer.parseInt(item.detail());
if (item.isSentBy(p1.getFaction())) {
p1TgAfter -= amount;
p2TgAfter += amount;
} else {
p2TgAfter -= amount;
p1TgAfter += amount;
}
} else if ("Comms".equals(type)) {
int amount = Integer.parseInt(detail);
if (item.contains("sending" + p1.getFaction())) {
int amount = Integer.parseInt(item.detail());
if (item.isSentBy(p1.getFaction())) {
if (!p1.isPlayerMemberOfAlliance(p2)) p2TgAfter += amount;
} else {
if (!p2.isPlayerMemberOfAlliance(p1)) p1TgAfter += amount;
Expand Down
Loading
Loading