def execute_piece_movement(self, piece: Piece) -> int: target_x, target_y = piece.get_target_coordinates() target_tile = self.get_tile(target_x, target_y) if target_tile.piece is None: self.commit_piece_movement(piece, piece.tile, target_tile) return 1 elif piece.is_pusher(): push_movements = self.get_chained_push_movements(piece.tile, target_tile) for push_source_tile, push_target_tile in reversed(push_movements): if push_target_tile is None: push_source_tile.piece.remove_from_play() push_source_tile.remove_piece() else: self.commit_piece_movement(push_source_tile.piece, push_source_tile, push_target_tile) return len(push_movements) elif target_tile.piece.is_pushable() and not piece.is_pushable(): dx, dy = piece.get_movement_offsets() push_target_tile = self.get_tile(x=target_tile.x + dx, y=target_tile.y + dy) if push_target_tile is None or push_target_tile.piece is None: self.commit_piece_movement(target_tile.piece, target_tile, push_target_tile) self.commit_piece_movement(piece, piece.tile, target_tile) return 2 else: self.remove_piece_stuck_in_perimeter(piece.tile, piece) else: self.remove_piece_stuck_in_perimeter(piece.tile, piece) return 0
def draw_piece(self, piece: Piece, x, y): pygame.draw.circle(self.screen, PLAYER_COLOR[piece.owner_id], (x + DX / 2, y + DY / 2), DX * 0.3) dir_x, dir_y = piece.get_movement_offsets() pygame.draw.polygon(self.screen, PLAYER_COLOR[piece.owner_id], points=self.get_poli_points( x, y, DX, DY, dir_x, dir_y)) self.screen.blit(self.piece_type_image[piece.type], (x + DX / 2.5, y + DY / 3))