def __init__(self, game, name): assert game self.handBoard = None # because Player.init calls clearHand() PlayingPlayer.__init__(self, game, name) VisiblePlayer.__init__(self) self.handBoard = PlayingHandBoard(self) self.voice = None
class VisiblePlayingPlayer(VisiblePlayer, PlayingPlayer): """this player instance has a visual representation""" # pylint: disable=too-many-public-methods def __init__(self, game, name): assert game self.handBoard = None # because Player.init calls clearHand() PlayingPlayer.__init__(self, game, name) VisiblePlayer.__init__(self) self.handBoard = PlayingHandBoard(self) self.voice = None def clearHand(self): """clears attributes related to current hand""" super(VisiblePlayingPlayer, self).clearHand() if self.game and self.game.wall: # is None while __del__ self.front = self.game.wall[self.idx] if self.handBoard: self.handBoard.setEnabled( self.game and self.game.belongsToHumanPlayer( ) and self == self.game.myself) def explainHand(self): """returns the hand to be explained. Same as current unless we need to discard. In that case, make an educated guess about the discard. For player==game.myself, use the focused tile.""" hand = self.hand if hand and hand.tiles and self._concealedTiles: if hand.lenOffset == 1 and not hand.won: if any(not x.isKnown for x in self._concealedTiles): hand -= Tile.unknown elif self.handBoard.focusTile: hand -= self.handBoard.focusTile.tile return hand def colorizeName(self): """set the color to be used for showing the player name on the wall""" if not isAlive(self.front.nameLabel): return if self == self.game.activePlayer and self.game.client: color = Qt.blue elif Internal.Preferences.tilesetName == 'jade': color = Qt.white else: color = Qt.black self.front.nameLabel.setBrush(QBrush(QColor(color))) def getsFocus(self, dummyResults=None): """give this player focus on his handBoard""" self.handBoard.setEnabled(True) self.handBoard.hasFocus = True def popupMsg(self, msg): """shows a yellow message from player""" if msg != Message.NoClaim: self.speak(msg.name.lower()) yellow = self.front.message yellow.setText( ' '.join([unicode(yellow.msg), m18nc('kajongg', msg.name)])) yellow.setVisible(True) def hidePopup(self): """hide the yellow message from player""" if isAlive(self.front.message): self.front.message.msg = '' self.front.message.setVisible(False) def speak(self, text): """speak if we have a voice""" if self.voice: self.voice.speak(text, self.front.rotation()) def robTileFrom(self, tile): """used for robbing the kong from this player""" PlayingPlayer.robTileFrom(self, tile) tile = tile.exposed hbTiles = self.handBoard.uiTiles lastDiscard = [x for x in hbTiles if x.tile == tile][-1] lastDiscard.tile = lastDiscard.tile.concealed Internal.scene.discardBoard.lastDiscarded = lastDiscard # remove from board of robbed player, otherwise syncHandBoard would # not fix display for the robbed player lastDiscard.setBoard(None) assert lastDiscard.tile.isConcealed self.syncHandBoard() def addConcealedTiles(self, uiTiles, animated=True): """add to my tiles and sync the hand board""" with MoveImmediate(animated): PlayingPlayer.addConcealedTiles( self, list(x.tile for x in uiTiles)) self.syncHandBoard(uiTiles) def declaredMahJongg(self, concealed, withDiscard, lastTile, lastMeld): """player declared mah jongg. Determine last meld, show concealed tiles grouped to melds""" PlayingPlayer.declaredMahJongg( self, concealed, withDiscard, lastTile, lastMeld) if withDiscard: # withDiscard is a Tile, we need the UITile discardTile = Internal.scene.discardBoard.lastDiscarded if discardTile.tile is not withDiscard: self.game.debug( '%s is not %s' % (discardTile.tile, withDiscard)) assert False self.syncHandBoard([discardTile]) else: # show concealed tiles self.syncHandBoard() def removeTile(self, tile): """remove from my melds or tiles""" PlayingPlayer.removeTile(self, tile) self.syncHandBoard() def makeTileKnown(self, tile): """give an unknown tileItem a name""" PlayingPlayer.makeTileKnown(self, tile) assert tile.isKnown matchingTiles = sorted( self.handBoard.tilesByElement(Tile.unknown), key=lambda x: x.xoffset) matchingTiles[-1].tile = tile def exposeMeld(self, meldTiles, calledTile=None): result = PlayingPlayer.exposeMeld( self, meldTiles, calledTile.tile if calledTile else None) adding = [calledTile] if calledTile else None self.syncHandBoard(adding=adding) return result
class VisiblePlayingPlayer(VisiblePlayer, PlayingPlayer): """this player instance has a visual representation""" # pylint: disable=too-many-public-methods def __init__(self, game, name): assert game self.handBoard = None # because Player.init calls clearHand() PlayingPlayer.__init__(self, game, name) VisiblePlayer.__init__(self) self.handBoard = PlayingHandBoard(self) self.voice = None def clearHand(self): """clears attributes related to current hand""" super(VisiblePlayingPlayer, self).clearHand() if self.game and self.game.wall: # is None while __del__ self.front = self.game.wall[self.idx] if self.handBoard: self.handBoard.setEnabled(self.game and self.game.belongsToHumanPlayer() and self == self.game.myself) def explainHand(self): """returns the hand to be explained. Same as current unless we need to discard. In that case, make an educated guess about the discard. For player==game.myself, use the focused tile.""" hand = self.hand if hand and hand.tiles and self._concealedTiles: if hand.lenOffset == 1 and not hand.won: if any(not x.isKnown for x in self._concealedTiles): hand -= Tile.unknown elif self.handBoard.focusTile: hand -= self.handBoard.focusTile.tile return hand def colorizeName(self): """set the color to be used for showing the player name on the wall""" if not isAlive(self.sideText): return if self == self.game.activePlayer and self.game.client: color = Qt.blue elif Internal.Preferences.tilesetName == 'jade': color = Qt.white else: color = Qt.black self.sideText.color = color def getsFocus(self, dummyResults=None): """give this player focus on his handBoard""" self.handBoard.setEnabled(True) self.handBoard.hasFocus = True def popupMsg(self, msg): """shows a yellow message from player""" if msg != Message.NoClaim: self.speak(msg.name.lower()) yellow = self.front.message yellow.setText('{} {}'.format(yellow.msg, i18nc('kajongg', msg.name))) yellow.setVisible(True) def hidePopup(self): """hide the yellow message from player""" if isAlive(self.front.message): self.front.message.msg = '' self.front.message.setVisible(False) def speak(self, text): """speak if we have a voice""" if self.voice: self.voice.speak(text, self.front.rotation()) def robTileFrom(self, tile): """used for robbing the kong from this player""" PlayingPlayer.robTileFrom(self, tile) tile = tile.exposed hbTiles = self.handBoard.uiTiles lastDiscard = [x for x in hbTiles if x.tile == tile][-1] lastDiscard.tile = lastDiscard.tile.concealed Internal.scene.discardBoard.lastDiscarded = lastDiscard # remove from board of robbed player, otherwise syncHandBoard would # not fix display for the robbed player lastDiscard.setBoard(None) assert lastDiscard.tile.isConcealed self.syncHandBoard() def addConcealedTiles(self, uiTiles, animated=True): """add to my tiles and sync the hand board""" with AnimationSpeed( speed=Internal.Preferences.animationSpeed if animated else 99): PlayingPlayer.addConcealedTiles(self, list(x.tile for x in uiTiles)) self.syncHandBoard(uiTiles) def declaredMahJongg(self, concealed, withDiscard, lastTile, lastMeld): """player declared mah jongg. Determine last meld, show concealed tiles grouped to melds""" PlayingPlayer.declaredMahJongg(self, concealed, withDiscard, lastTile, lastMeld) if withDiscard: # withDiscard is a Tile, we need the UITile discardTile = Internal.scene.discardBoard.lastDiscarded if discardTile.tile is not withDiscard: self.game.debug('%s is not %s' % (discardTile.tile, withDiscard)) assert False self.syncHandBoard([discardTile]) else: # show concealed tiles self.syncHandBoard() def removeTile(self, tile): """remove from my melds or tiles""" PlayingPlayer.removeTile(self, tile) self.syncHandBoard() def makeTileKnown(self, tile): """give an unknown tileItem a name""" PlayingPlayer.makeTileKnown(self, tile) assert tile.isKnown matchingTiles = sorted(self.handBoard.tilesByElement(Tile.unknown), key=lambda x: x.xoffset) matchingTiles[-1].tile = tile def exposeMeld(self, meldTiles, calledTile=None): result = PlayingPlayer.exposeMeld( self, meldTiles, calledTile.tile if calledTile else None) adding = [calledTile] if calledTile else None self.syncHandBoard(adding=adding) return result