class PieceController(TileEventProcessor): """ Manages the display of pieces on the board for the ScreenController """ def __init__(self, eventId, session, tilePositionModel): super(PieceController, self).__init__(eventId, session) self.pieceViews = [] self.selectionController = SelectionController() self.moveSelectionsModel = None self.pathSelectionModel = None self.piecesModel = BoardPiecesModel() self.tilePositionModel = tilePositionModel def remove(self, id): data = self.piecesModel.removePieceWithId(id) self.pieceViews.remove(data.view) if self.moveSelectionsModel is not None and data.location == self.moveSelectionsModel.getPrimarySelection(): self.clearSelectEvent() return data.team def add(self, id, tilePosition, team): if not self.piecesModel.containsId(id): dm = PieceDataModel(tilePosition, team) self.piecesModel.addPieceWithId(id, dm) self.pieceViews.append(dm.view) def draw(self, drawSurface): for pieceView in self.pieceViews: pieceView.draw(drawSurface) self.selectionController.draw(drawSurface) def selectEvent(self, tilePosition): self.clearSelectEvent() if self.piecesModel.isPieceAt(tilePosition): logging.debug("Select event for %s", tilePosition) pieceData = self.piecesModel.getDataForPiecesAt(tilePosition)[0] self.moveSelectionsModel = self.selectionController.setSelectedTile( tilePosition, colour=ConfigReader.getColourForId("SelectedTile") ) self.selectionController.setInfoTiles( self.tilePositionModel.positionsOnBoardIn(HexCoordSys.getTilesWithin(pieceData.moves, tilePosition)), self.moveSelectionsModel, ConfigReader.getColourForId("Info1Tile"), type(OverlayView((), ())), ) self.pathSelectionModel = self.selectionController.setSelectedTile(tilePosition) def clearSelectEvent(self): logging.debug("Clear select event") self.selectionController.clearAllSelection(self.moveSelectionsModel) self.moveSelectionsModel = None self.selectionController.clearAllSelection(self.pathSelectionModel) self.pathSelectionModel = None def trialMoveSelectedEvent(self, tilePosition): # If a tile has been selected for the start of the path, and the specified path tile is on the board if ( self.pathSelectionModel is not None and self.tilePositionModel.contains(tilePosition) and not self.pathSelectionModel.doesExtendedSelectionContain(tilePosition) ): logging.debug("Trial move to %s", tilePosition) pieceData = self.piecesModel.getDataForPiecesAt(self.pathSelectionModel.getPrimarySelection())[0] self.selectionController.setInfoTiles( self.tilePositionModel.positionsOnBoardIn( HexCoordSys.getShortestTilePathBetween(self.pathSelectionModel.getPrimarySelection(), tilePosition) ), self.pathSelectionModel, pieceData.movingColour, type(PieceView((), ())), ) def moveSelectedEvent(self, tilePosition): if self.moveSelectionsModel is not None and self.tilePositionModel.containsTile(tilePosition): logging.debug("Move event to %s", tilePosition) team = None id = None for id in self.piecesModel.getIdForPiecesAt(self.moveSelectionsModel.getPrimarySelection()): team = self.remove(id) id = id self.add(id, tilePosition, team) self.createMoveEvent(id, tilePosition)