package net.zomis.cardshifter.ecs.usage;
import com.cardshifter.modapi.actions.ActionComponent;
import com.cardshifter.modapi.actions.ECSAction;
import com.cardshifter.modapi.attributes.Attributes;
import com.cardshifter.modapi.attributes.ECSAttributeMap;
import com.cardshifter.modapi.base.*;
import com.cardshifter.modapi.cards.*;
import com.cardshifter.modapi.phase.*;
import com.cardshifter.modapi.players.Players;
import com.cardshifter.modapi.resources.ECSResourceMap;
import com.cardshifter.modapi.resources.ResourceRetriever;
import java.util.Set;
/**
* Created by Simon on 2/12/2015.
*/
public class TestMod implements ECSMod {
public static final String END_TURN_ACTION = "End Turn";
@Override
public void setupGame(ECSGame game) {
PhaseController phaseController = new PhaseController();
game.newEntity().addComponent(phaseController);
for (int i = 0; i < 2; i++) {
final int playerIndex = i;
Entity player = game.newEntity();
PlayerComponent playerComponent = new PlayerComponent(i, "Player" + (i+1));
player.addComponent(playerComponent);
Phase playerPhase = new Phase(player, "Main");
phaseController.addPhase(playerPhase);
ActionComponent actions = new ActionComponent();
player.addComponent(actions);
ECSAction endTurnAction = new ECSAction(player, END_TURN_ACTION, act -> phaseController.getCurrentPhase() == playerPhase, act -> phaseController.nextPhase());
actions.addAction(endTurnAction);
ECSResourceMap.createFor(player)
.set(CyborgChroniclesGame.CyborgChroniclesResources.HEALTH, 30)
.set(CyborgChroniclesGame.CyborgChroniclesResources.MAX_HEALTH, 30);
ZoneComponent deck = new DeckComponent(player);
ZoneComponent hand = new HandComponent(player);
ZoneComponent battlefield = new BattlefieldComponent(player);
createCards(hand);
createCards(deck);
createCards(deck);
createCards(deck);
createCards(deck);
player.addComponents(hand, deck, battlefield);
deck.shuffle();
}
// Draw cards
game.addSystem(new LimitedHandSizeSystem(10, card -> card.getCardToDraw().destroy()));
game.addSystem(new DrawCardAtBeginningOfTurnSystem());
game.addSystem(new LimitedActionsPerTurnSystem(10, END_TURN_ACTION));
// General setup
game.addSystem(new LastPlayersStandingEndsGame());
game.addSystem(new RemoveDeadEntityFromZoneSystem());
game.addSystem(new PerformerMustBeCurrentPlayer());
}
private void createCards(ZoneComponent hand) {
for (int i = 0; i < 5; i++) {
Entity entity = hand.getOwner().getGame().newEntity();
ECSResourceMap.createFor(entity)
.set(CyborgChroniclesGame.CyborgChroniclesResources.HEALTH, 3)
.set(CyborgChroniclesGame.CyborgChroniclesResources.MAX_HEALTH, 3);
ECSAttributeMap.createFor(entity).set(Attributes.NAME, "Test");
ActionComponent action = new ActionComponent();
entity.addComponent(action);
action.addAction(moveAction("Field", entity, BattlefieldComponent.class, false));
action.addAction(moveAction("Hand", entity, HandComponent.class, false));
action.addAction(moveAction("Deck", entity, DeckComponent.class, false));
action.addAction(moveAction("2-Field", entity, BattlefieldComponent.class, true));
action.addAction(moveAction("2-Hand", entity, HandComponent.class, true));
action.addAction(moveAction("2-Deck", entity, DeckComponent.class, true));
action.addAction(damageAction(entity));
hand.addOnBottom(entity);
}
}
private ECSAction damageAction(Entity entity) {
ResourceRetriever health = ResourceRetriever.forResource(CyborgChroniclesGame.CyborgChroniclesResources.HEALTH);
return new ECSAction(entity, "Damage", act -> true, act -> {
health.resFor(entity).change(-1);
if (health.getFor(entity) == 0) {
entity.destroy();
}
});
}
private ECSAction moveAction(String name, Entity entity, Class<? extends ZoneComponent> zone, boolean switchPlayer) {
return new ECSAction(entity, name, act -> true, act -> {
CardComponent card = act.getOwner().getComponent(CardComponent.class);
Entity player = Players.findOwnerFor(act.getOwner());
final Entity origPlayer = player;
if (switchPlayer) {
Set<Entity> players = entity.getGame().getEntitiesWithComponent(PlayerComponent.class);
player = players.stream().filter(pl -> pl != origPlayer).findAny().get();
}
card.moveToBottom(player.getComponent(zone));
});
}
}