class Board(AnimateBoard): def __init__(self, columns=COLUMNS, rows=ROWS, demo=False, fadeColor=(100, 100, 100)): self.tileBatch = pyglet.graphics.Batch() self.tokenBatch = pyglet.graphics.Batch() self.tiles = [] self.tokens = [] self.people = [] self.playerBoxes = [] self.dragTile = False self.moving = False self.movingTiles = [] self.columns = columns self.rows = rows self.ourTurn = False # make the colour dimmer if we're not running in a real game self.started = False self.demo = demo self.color = (255, 255, 255) self.fadeColor = fadeColor self.settings = settings.GameSettings() # XXX - fix me with something dynamic offset_x = OFFSET_X if columns == 7: offset_x = BOARD_OFFSET_X offset_y = OFFSET_Y if rows == 7: offset_y = BOARD_OFFSET_Y for y in range(rows): for x in range(columns): self.tiles.append(Tile(x * 81 + offset_x, 768 - (y * 81) - offset_y, x, y, color=self.color, tileType=random.randint(1, 3), tileRotation=random.randint(0, 3), batch=self.tileBatch)) self.floatingTile = Tile(-100, -100, -1, -1, color=self.color, tileType=random.randint(1, 3), tileRotation=random.randint(0, 3), batch=self.tileBatch) events.addListener(self) pyglet.clock.schedule(self.update) def getTile(self, column, row): for tile in self.tiles: if tile.column == column and tile.row == row: return tile def boardToSprites(self): gameBoard = self.settings.board self.rows = gameBoard.rows self.columns = gameBoard.columns # is this going to gc correctly? self.tiles = [] self.tokens = [] for y in range(gameBoard.rows): for x in range(gameBoard.columns): tile = gameBoard.board[y][x] self.tiles.append( Tile(x * 81 + BOARD_OFFSET_X, 768 - (y * 81) - BOARD_OFFSET_Y, x, y, color=(255, 255, 255), tileType=tile.tileType, tileRotation=tile.tileRotation, batch=self.tileBatch)) if tile.boardItem and not tile.boardItem.found: self.tokens.append( Token(int(tile.boardItem.itemNumber), self.tiles[-1].x, self.tiles[-1].y, x, y, batch=self.tokenBatch)) self.floatingTile = \ Tile(FLOATINGTILE_LOCATION_X, FLOATINGTILE_LOCATION_Y, -1, -1, color=(255, 255, 255), tileType=gameBoard.floatingTile.tileType, tileRotation=gameBoard.floatingTile.tileRotation, batch=self.tileBatch) for player in self.settings.board.players: column, row = player.getLocation() playerSprite = character.Character(column, row) tile = self.getTile(column, row) playerSprite.x, playerSprite.y = tile.xy self.people.append(playerSprite) self.playerBoxes.append(PlayerBox(player.playerNumber)) for item in player.boardItems: self.playerBoxes[-1].addToken(item.itemNumber) pass # XXX - remove this later def placePeople(self): positions = [(0, 0), (self.columns-1, self.rows-1), (0, self.rows-1), (self.columns-1, 0)] for count, person in enumerate(self.people): pos = positions[count] for tile in self.tiles: if tile.row == pos[1] and tile.column == pos[0]: person.x = tile.x person.y = tile.y def on_mousePress(self, args): print "!!! button pressed" x, y, button, modifiers = args #self.checkTileClicked(x, y) if self.ourTurn: self.pickupFloatingTile(x, y) def on_mouseRelease(self, args): print "!!! button released" x, y, button, modifiers = args if self.ourTurn: self.checkTileClicked(x, y) if self.dragTile: self.dropFloatingTile(x, y) def on_mouseDrag(self, args): x, y, dx, dy, buttons, modifiers = args if self.dragTile: self.dragFloatingTile(x, y) def on_keyPress(self, args): print "!!! key pressed" symbol, modifiers = args if symbol == key.RIGHT: self.settings.client.send('/rotate clockwise') elif symbol == key.LEFT: self.settings.client.send('/rotate counterclockwise') elif symbol == key.SPACE: if self.ourTurn: self.ourTurn = False self.settings.client.send('/end') def on_tileRotated(self, args): print "!!! tile rotated" print args self.floatingTile.rotate(int(args[0])) def on_playerSetup(self, args): print "!!! player setup" print args def on_turnChanged(self, args): print "!!! player turn changed" print args self.settings.board.playerTurn = int(args[1]) print "player turn = %d" % self.settings.board.playerTurn def on_playerTookObject(self, args): print "!!! player took object" print args playerNum = self.settings.board.playerTurn - 1 player = self.people[playerNum] for token in self.tokens: if token.column == player.column and \ token.row == player.row: tokenId = token.tokenId for player in self.playerBoxes: for playerToken in player.tokens: if playerToken.tokenId == tokenId: playerToken.setHighlight(True) self.tokens.remove(token) break def on_boardData(self, args): boardData = args[0] print "!!! board data = %s" % args[0] self.settings.board.deserialize(boardData) if not self.started: self.boardToSprites() self.started = True print "player turn = %d" % self.settings.board.playerTurn def on_startGame(self, args): print "!!! start game" self.demo = False #self.fallOut() #self.settings.fallingTiles = True def on_tilePushed(self, args): nick, pos, direction = args self.moveTiles(int(pos), int(direction)) self.settings.client.send('/data') def on_playerTurn(self, args): print "!!! your turn" self.ourTurn = True self.tilePushed = False def on_playerMoved(self, args): nick, column, row = args print "!!! player moved" print args column = int(column) row = int(row) traverseGraph = traverse.TraversalGraph(self.settings.board) playerNum = self.settings.board.playerTurn - 1 startLocation = self.settings.board.players[playerNum].location print [x.location for x in self.settings.board.players]