Cleaned up event serialization

This commit is contained in:
marcin.sciesinski
2021-03-17 05:28:07 -07:00
parent 7f6553ce34
commit 9b9f7cfacc

View File

@@ -7,12 +7,15 @@ import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class EventSerializer {
public Node serializeEvent(Document doc, GameEvent gameEvent) {
Element eventElem = doc.createElement("ge");
eventElem.setAttribute("type", gameEvent.getType().getCode());
if (gameEvent.getBlueprintId() != null)
eventElem.setAttribute("blueprintId", gameEvent.getBlueprintId());
if (gameEvent.getCardId() != null)
@@ -23,16 +26,8 @@ public class EventSerializer {
eventElem.setAttribute("controllerId", gameEvent.getControllerId());
if (gameEvent.getParticipantId() != null)
eventElem.setAttribute("participantId", gameEvent.getParticipantId());
if (gameEvent.getAllParticipantIds() != null) {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String participantId : gameEvent.getAllParticipantIds()) {
if (!first) sb.append(",");
sb.append(participantId);
first = false;
}
eventElem.setAttribute("allParticipantIds", sb.toString());
}
if (gameEvent.getAllParticipantIds() != null)
eventElem.setAttribute("allParticipantIds", listToCommaSeparated(gameEvent.getAllParticipantIds()));
if (gameEvent.getPhase() != null)
eventElem.setAttribute("phase", gameEvent.getPhase());
if (gameEvent.getTargetCardId() != null)
@@ -43,89 +38,109 @@ public class EventSerializer {
eventElem.setAttribute("token", gameEvent.getToken().name());
if (gameEvent.getCount() != null)
eventElem.setAttribute("count", gameEvent.getCount().toString());
if (gameEvent.getOtherCardIds() != null) {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (int cardId : gameEvent.getOtherCardIds()) {
if (!first) sb.append(",");
sb.append(cardId);
first = false;
}
eventElem.setAttribute("otherCardIds", sb.toString());
}
if (gameEvent.getOtherCardIds() != null)
eventElem.setAttribute("otherCardIds", arrayToCommaSeparated(gameEvent.getOtherCardIds()));
if (gameEvent.getMessage() != null)
eventElem.setAttribute("message", gameEvent.getMessage());
if (gameEvent.getGameStats() != null) {
GameStats gameStats = gameEvent.getGameStats();
if (gameStats.getWearingRing() != null)
eventElem.setAttribute("wearingRing", String.valueOf(gameStats.getWearingRing()));
eventElem.setAttribute("fellowshipArchery", String.valueOf(gameStats.getFellowshipArchery()));
eventElem.setAttribute("shadowArchery", String.valueOf(gameStats.getShadowArchery()));
eventElem.setAttribute("fellowshipStrength", String.valueOf(gameStats.getFellowshipSkirmishStrength()));
eventElem.setAttribute("shadowStrength", String.valueOf(gameStats.getShadowSkirmishStrength()));
eventElem.setAttribute("fellowshipDamageBonus", String.valueOf(gameStats.getFellowshipSkirmishDamageBonus()));
eventElem.setAttribute("shadowDamageBonus", String.valueOf(gameStats.getShadowSkirmishDamageBonus()));
eventElem.setAttribute("fpOverwhelmed", String.valueOf(gameStats.isFpOverwhelmed()));
eventElem.setAttribute("moveLimit", String.valueOf(gameStats.getMoveLimit()));
eventElem.setAttribute("moveCount", String.valueOf(gameStats.getMoveCount()));
for (Map.Entry<String, Map<Zone, Integer>> playerZoneSizes : gameStats.getZoneSizes().entrySet()) {
final Element playerZonesElem = doc.createElement("playerZones");
playerZonesElem.setAttribute("name", playerZoneSizes.getKey());
for (Map.Entry<Zone, Integer> zoneSizes : playerZoneSizes.getValue().entrySet())
playerZonesElem.setAttribute(zoneSizes.getKey().name(), zoneSizes.getValue().toString());
eventElem.appendChild(playerZonesElem);
}
for (Map.Entry<String, Integer> playerThreatEntry : gameStats.getThreats().entrySet()) {
Element threatsElem = doc.createElement("threats");
threatsElem.setAttribute("name", playerThreatEntry.getKey());
threatsElem.setAttribute("value", playerThreatEntry.getValue().toString());
eventElem.appendChild(threatsElem);
}
Map<Integer, Integer> charVitalities = gameStats.getCharVitalities();
Map<Integer, Integer> charSiteNumbers = gameStats.getSiteNumbers();
Map<Integer, String> charResistances = gameStats.getCharResistances();
StringBuilder charStr = new StringBuilder();
for (Map.Entry<Integer, Integer> characters : gameStats.getCharStrengths().entrySet()) {
Integer charCardId = characters.getKey();
charStr.append("," + charCardId + "=" + characters.getValue() + "|" + charVitalities.get(charCardId));
if (charSiteNumbers.containsKey(charCardId))
charStr.append("|" + charSiteNumbers.get(charCardId));
else if (charResistances.containsKey(charCardId))
charStr.append("|R" + charResistances.get(charCardId));
}
if (charStr.length() > 0)
charStr.delete(0, 1);
if (charStr.length() > 0)
eventElem.setAttribute("charStats", charStr.toString());
}
if (gameEvent.getAwaitingDecision() != null) {
AwaitingDecision decision = gameEvent.getAwaitingDecision();
eventElem.setAttribute("id", String.valueOf(decision.getAwaitingDecisionId()));
eventElem.setAttribute("decisionType", decision.getDecisionType().name());
if (decision.getText() != null)
eventElem.setAttribute("text", decision.getText());
for (Map.Entry<String, String[]> paramEntry : decision.getDecisionParameters().entrySet()) {
for (String value : paramEntry.getValue()) {
Element decisionParam = doc.createElement("parameter");
decisionParam.setAttribute("name", paramEntry.getKey());
decisionParam.setAttribute("value", value);
eventElem.appendChild(decisionParam);
}
}
}
if (gameEvent.getGameStats() != null)
serializeGameStats(doc, eventElem, gameEvent.getGameStats());
if (gameEvent.getAwaitingDecision() != null)
serializeDecision(doc, eventElem, gameEvent.getAwaitingDecision());
return eventElem;
}
private String arrayToCommaSeparated(int[] integers) {
int iMax = integers.length - 1;
if (iMax == -1)
return "";
StringBuilder b = new StringBuilder();
for (int i = 0; ; i++) {
b.append(integers[i]);
if (i == iMax)
return b.toString();
}
}
private String listToCommaSeparated(List<String> strings) {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String participantId : strings) {
if (!first) sb.append(",");
sb.append(participantId);
first = false;
}
return sb.toString();
}
private void serializeDecision(Document doc, Element eventElem, AwaitingDecision decision) {
eventElem.setAttribute("id", String.valueOf(decision.getAwaitingDecisionId()));
eventElem.setAttribute("decisionType", decision.getDecisionType().name());
if (decision.getText() != null)
eventElem.setAttribute("text", decision.getText());
for (Map.Entry<String, String[]> paramEntry : decision.getDecisionParameters().entrySet()) {
for (String value : paramEntry.getValue()) {
Element decisionParam = doc.createElement("parameter");
decisionParam.setAttribute("name", paramEntry.getKey());
decisionParam.setAttribute("value", value);
eventElem.appendChild(decisionParam);
}
}
}
private void serializeGameStats(Document doc, Element eventElem, GameStats gameStats) {
if (gameStats.getWearingRing() != null)
eventElem.setAttribute("wearingRing", String.valueOf(gameStats.getWearingRing()));
eventElem.setAttribute("fellowshipArchery", String.valueOf(gameStats.getFellowshipArchery()));
eventElem.setAttribute("shadowArchery", String.valueOf(gameStats.getShadowArchery()));
eventElem.setAttribute("fellowshipStrength", String.valueOf(gameStats.getFellowshipSkirmishStrength()));
eventElem.setAttribute("shadowStrength", String.valueOf(gameStats.getShadowSkirmishStrength()));
eventElem.setAttribute("fellowshipDamageBonus", String.valueOf(gameStats.getFellowshipSkirmishDamageBonus()));
eventElem.setAttribute("shadowDamageBonus", String.valueOf(gameStats.getShadowSkirmishDamageBonus()));
eventElem.setAttribute("fpOverwhelmed", String.valueOf(gameStats.isFpOverwhelmed()));
eventElem.setAttribute("moveLimit", String.valueOf(gameStats.getMoveLimit()));
eventElem.setAttribute("moveCount", String.valueOf(gameStats.getMoveCount()));
for (Map.Entry<String, Map<Zone, Integer>> playerZoneSizes : gameStats.getZoneSizes().entrySet()) {
final Element playerZonesElem = doc.createElement("playerZones");
playerZonesElem.setAttribute("name", playerZoneSizes.getKey());
for (Map.Entry<Zone, Integer> zoneSizes : playerZoneSizes.getValue().entrySet())
playerZonesElem.setAttribute(zoneSizes.getKey().name(), zoneSizes.getValue().toString());
eventElem.appendChild(playerZonesElem);
}
for (Map.Entry<String, Integer> playerThreatEntry : gameStats.getThreats().entrySet()) {
Element threatsElem = doc.createElement("threats");
threatsElem.setAttribute("name", playerThreatEntry.getKey());
threatsElem.setAttribute("value", playerThreatEntry.getValue().toString());
eventElem.appendChild(threatsElem);
}
Map<Integer, Integer> charVitalities = gameStats.getCharVitalities();
Map<Integer, Integer> charSiteNumbers = gameStats.getSiteNumbers();
Map<Integer, String> charResistances = gameStats.getCharResistances();
StringBuilder charStr = new StringBuilder();
for (Map.Entry<Integer, Integer> characters : gameStats.getCharStrengths().entrySet()) {
Integer charCardId = characters.getKey();
charStr.append(",").append(charCardId).append("=").append(characters.getValue()).append("|").append(charVitalities.get(charCardId));
if (charSiteNumbers.containsKey(charCardId))
charStr.append("|").append(charSiteNumbers.get(charCardId));
else if (charResistances.containsKey(charCardId))
charStr.append("|R").append(charResistances.get(charCardId));
}
if (charStr.length() > 0)
charStr.delete(0, 1);
if (charStr.length() > 0)
eventElem.setAttribute("charStats", charStr.toString());
}
}