package com.cardshifter.modapi.cards; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Consumer; import java.util.stream.Stream; import com.cardshifter.modapi.base.Component; import com.cardshifter.modapi.base.Entity; public class ZoneComponent extends Component { private final LinkedList<Entity> cards = new LinkedList<>(); private final Entity owner; private final Map<Entity, Boolean> known = new HashMap<>(); private final String name; private final Entity zoneEntity; private boolean publicKnown; public ZoneComponent(Entity owner, String name) { this.owner = Objects.requireNonNull(owner, "Zone Owner cannot be null"); this.name = Objects.requireNonNull(name, "Zone Name cannot be null"); this.zoneEntity = owner.getGame().newEntity(); } public Entity getOwner() { return owner; } public Entity getTopCard() { return cards.getFirst(); } public boolean isKnownTo(Entity player) { return known.getOrDefault(player, publicKnown); } public void addOnBottom(Entity entity) { if (entity.hasComponent(CardComponent.class)) { throw new IllegalArgumentException("Entity " + entity + " already has CardComponent"); } CardComponent comp = new CardComponent(null); entity.addComponent(comp); comp.moveToBottom(this); } public void shuffle() { Collections.shuffle(cards, getRandom()); } public void setGloballyKnown(boolean publicKnown) { this.publicKnown = publicKnown; } protected void setKnown(Entity owner, boolean known) { this.known.put(owner, known); } public boolean isEmpty() { return cards.isEmpty(); } public Entity getComponentEntity() { return this.getEntity(); } void cardMoveFrom(Entity card) { cards.remove(card); } void cardMoveAtTop(Entity card) { cards.addFirst(card); } void cardMoveAtBottom(Entity card) { cards.addLast(card); } public void forEach(Consumer<? super Entity> action) { this.cards.forEach(action); } public int size() { return cards.size(); } @Override public String toString() { return "Zone '" + name + "' [size=" + size() + ", owner=" + owner + ", known=" + known + ", publicKnown=" + publicKnown + "]"; } public Stream<Entity> stream() { return cards.stream(); } public List<Entity> getCards() { return new ArrayList<>(cards); } public String getName() { return name; } public int getZoneId() { return zoneEntity.getId(); } }