package fr.lyrgard.hexScape.model.card; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.TreeSet; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import fr.lyrgard.hexScape.model.marker.MarkerInstance; import fr.lyrgard.hexScape.model.marker.StackableMarkerInstance; import fr.lyrgard.hexScape.model.piece.PieceInstance; public class CardInstance { private String id; private String cardTypeId; private int number; private TreeSet<MarkerInstance> markers; private Queue<String> pieceLeftToPlace = new LinkedList<String>(); private List<PieceInstance> pieces = new ArrayList<PieceInstance>(); @JsonCreator public CardInstance( @JsonProperty("id") String id, @JsonProperty("cardTypeId") String cardTypeId, @JsonProperty("number") int number) { super(); this.id = id; this.cardTypeId = cardTypeId; this.number = number; } public void addPiece(PieceInstance piece) { piece.setCard(this); pieces.add(piece); } public PieceInstance getPiece(String pieceId) { for (PieceInstance piece : pieces) { if (piece.getId().equals(pieceId)) { return piece; } } return null; } public void addMarker(MarkerInstance marker) { if (marker instanceof StackableMarkerInstance) { Iterator<MarkerInstance> it = getMarkers().iterator(); while (it.hasNext()) { MarkerInstance markerOnCard = it.next(); if (markerOnCard.getMarkerDefinitionId().equals(marker.getMarkerDefinitionId())) { // a marker of this type is already on the card. Add "number" to it int newNumber = ((StackableMarkerInstance)markerOnCard).getNumber() + ((StackableMarkerInstance)marker).getNumber(); if (newNumber <= 0) { it.remove(); } else { ((StackableMarkerInstance)markerOnCard).setNumber(newNumber); } return; } } markers.add(marker); } else { markers.add(marker); } } public MarkerInstance getMarker(String markerId) { for (MarkerInstance m : markers) { if (m.getId().equals(markerId)) { return m; } } return null; } public MarkerInstance getMarkerByType(String markerTypeId) { for (MarkerInstance m : markers) { if (m.getMarkerDefinitionId().equals(markerTypeId)) { return m; } } return null; } public String getId() { return id; } public void setId(String id) { this.id = id; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public TreeSet<MarkerInstance> getMarkers() { if (markers == null) { markers = new TreeSet<>(); } return markers; } public String getCardTypeId() { return cardTypeId; } public void setCardTypeId(String cardTypeId) { this.cardTypeId = cardTypeId; } public Queue<String> getPieceLeftToPlace() { return pieceLeftToPlace; } public List<PieceInstance> getPieces() { return pieces; } public void setPieces(List<PieceInstance> pieces) { if (pieces != null) { for (PieceInstance piece : pieces) { addPiece(piece); } } } }