package com.captstudios.games.tafl.core.es.systems.passive; import com.artemis.ComponentMapper; import com.artemis.Entity; import com.artemis.systems.PassiveEntitySystem; import com.badlogic.gdx.math.Vector2; import com.captstudios.games.tafl.core.consts.Constants; import com.captstudios.games.tafl.core.enums.LifeCycle; import com.captstudios.games.tafl.core.es.components.movement.PositionComponent; import com.captstudios.games.tafl.core.es.model.TaflMatch; import com.captstudios.games.tafl.core.es.model.TaflMatchObserver; import com.captstudios.games.tafl.core.es.model.ai.optimization.BitBoard; import com.captstudios.games.tafl.core.es.model.ai.optimization.moves.Move; public class EntityPieceSystem extends PassiveEntitySystem implements TaflMatchObserver { public Entity[] pieceEntities; EntityFactorySystem efs; ComponentMapper<PositionComponent> positionMapper; @Override public void initialize() { efs = world.getSystem(EntityFactorySystem.class); positionMapper = world.getMapper(PositionComponent.class); } public Entity get(int piece) { return pieceEntities[piece]; } @Override public void applyMove(TaflMatch match, Move move) { Entity e = pieceEntities[move.source]; pieceEntities[move.source] = null; pieceEntities[move.destination] = e; Entity entity = pieceEntities[move.destination]; Vector2 newPosition = match.board.getCellPositionCenter(move.destination); PositionComponent position = positionMapper.get(entity); position.position.set(newPosition); } @Override public void undoMove(TaflMatch match, Move move) { Entity e = pieceEntities[move.destination]; pieceEntities[move.destination] = null; pieceEntities[move.source] = e; Entity entity = pieceEntities[move.source]; if (entity != null) { Vector2 newPosition = match.board.getCellPositionCenter(move.source); PositionComponent position = positionMapper.get(entity); position.position.set(newPosition); } else { pieceEntities[move.source] = efs.createPiece(match, move.pieceType, move.source); } for (int i = move.capturedPieces.nextSetBit(0); i >= 0; i = move.capturedPieces.nextSetBit(i+1)) { entity = pieceEntities[i]; if (entity == null) { pieceEntities[i] = efs.createPiece(match, (move.pieceType + 1) % 2, i); } } } @Override public void initializeMatch(TaflMatch match) { pieceEntities = new Entity[match.board.boardSize]; BitBoard board = match.board.whiteBitBoard(); for (int i = board.nextSetBit(0); i >= 0; i = board.nextSetBit(i+1)) { pieceEntities[i] = efs.createPiece(match, Constants.BoardConstants.WHITE_TEAM, i); } board = match.board.blackBitBoard(); for (int i = board.nextSetBit(0); i >= 0; i = board.nextSetBit(i+1)) { pieceEntities[i] = efs.createPiece(match, Constants.BoardConstants.BLACK_TEAM, i); } board = match.board.kingBitBoard(); for (int i = board.nextSetBit(0); i >= 0; i = board.nextSetBit(i+1)) { pieceEntities[i] = efs.createPiece(match, Constants.BoardConstants.KING, i); } } @Override public void removePieces(TaflMatch match, int team, BitBoard capturedPieces) { for (int i = capturedPieces.nextSetBit(0); i >= 0; i = capturedPieces.nextSetBit(i+1)) { Entity e = pieceEntities[i]; if (e != null) { e.deleteFromWorld(); pieceEntities[i] = null; } } } @Override public void changeTurn(TaflMatch match) { } @Override public void gameOver(TaflMatch match, LifeCycle status) { } }