Ejemplo n.º 1
0
 def createEngine(self):
     if self.game != 'Carcassonne':
         raise Exception("No engine for game {}".format(self.game))
         return
     self.engine = CarcassonneEngine()
Ejemplo n.º 2
0
class CarcassonneWidget(GameWidget):

    bgcolors = [0xFFCC99, 0xCCCCCC, 0xFFFF99, 0xCCFF99, 0xCCFFCC, 0xFFB6C1]

    def createEngine(self):
        if self.game != 'Carcassonne':
            raise Exception("No engine for game {}".format(self.game))
            return
        self.engine = CarcassonneEngine()

    def initUI(self):
        super(CarcassonneWidget, self).initUI()

        self.finishButton = QPushButton(self.roundGroup)
        self.buttonGroupLayout.addWidget(self.finishButton)
        self.finishButton.clicked.connect(self.finish)

        self.gameInput = CarcassonneInputWidget(
            self.engine, self.bgcolors, self)
        self.gameInput.enterPressed.connect(self.commitRound)
        self.focussc = QShortcut(
            QtGui.QKeySequence("Ctrl+A"), self, self.gameInput.setFocus)
        self.roundLayout.addWidget(self.gameInput)

        self.gameInput.placeCommitButton(self.commitRoundButton)

        self.detailGroup = CarcassonneEntriesDetail(
            self.engine, self.bgcolors, self)
        self.widgetLayout.addWidget(self.detailGroup, 1, 0)
        self.detailGroup.edited.connect(self.updatePanel)

        self.playerGroup = QGroupBox(self)
        self.widgetLayout.addWidget(self.playerGroup, 1, 1)

        self.playerGroup.setStyleSheet(
            "QGroupBox { font-size: 18px; font-weight: bold; }")
        self.playersLayout = QVBoxLayout(self.playerGroup)
        self.playersLayout.addStretch()
        self.playerGroupBox = {}
        dealer = self.engine.getDealer()
        for i, player in enumerate(self.engine.getListPlayers()):
            pw = GamePlayerWidget(player, PlayerColours[i], self.playerGroup)

            if self.engine.getNumRound() == 1 and player == dealer:
                pw.setDealer()
            pw.updateDisplay(self.engine.getScoreFromPlayer(player))
            self.playersLayout.addWidget(pw)
            self.playerGroupBox[player] = pw

        self.playersLayout.addStretch()
        self.retranslateUI()
        QtCore.QTimer.singleShot(1000, self.gameInput.setFocus)

    def retranslateUI(self):
        super(CarcassonneWidget, self).retranslateUI()
        self.finishButton.setText(
            i18n("GameWidget", "&Finish Game"))
        self.gameInput.retranslateUI()
        self.detailGroup.retranslateUI()

    def getPlayerExtraInfo(self, player):
        kind = self.gameInput.getKind()
        if kind:
            return {'kind': kind}
        else:
            return None

    def updatePanel(self):
        super(CarcassonneWidget, self).updatePanel()
        self.updateScores()
        if self.engine.getWinner():
            self.finishButton.setDisabled(True)
            self.detailGroup.updateStats()
        else:
            self.detailGroup.updateRound()

    def checkPlayerScore(self, player, score):
        if score > 0:
            return True
        else:
            return False

    def commitRound(self):
        player = self.gameInput.getPlayer()
        kind = self.gameInput.getKind()
        score = self.gameInput.getScore()
        if player == "":
            msg = i18n(
                "CarcassonneWidget", "You must select a player")
            QMessageBox.warning(self, self.game, msg)
            return

        if kind == "":
            msg = i18n(
                "CarcassonneWidget", "You must select a kind")
            QMessageBox.warning(self, self.game, msg)
            return

        if not self.checkPlayerScore(player, score):
            msg = i18n(
                "GameWidget", "{0} score is not valid").format(player)
            QMessageBox.warning(self, self.game, msg)
            return

        # Everything ok so far, let's confirm
        title = i18n(
            "CarcassonneWidget", 'Commit Entry')
        msg = i18n(
            "CarcassonneWidget", "Are you sure you want to commit this entry?")

        ret = QMessageBox.question(self, title, msg,
                                   QMessageBox.Yes | QMessageBox.No,
                                   QMessageBox.Yes)

        if ret == QMessageBox.No:
            return

        # Once here, we can commit round
        try:
            self.playerGroupBox[self.engine.getDealer()].unsetDealer()
        except KeyError:
            pass
        self.engine.addEntry(player, score, {'kind': kind})
        self.engine.printStats()

        self.updatePanel()

    def finish(self):
        title = i18n(
            "CarcassonneWidget", 'Finish game')
        msg = i18n(
            "CarcassonneWidget",
            "Are you sure you want to finish the current game?")
        ret = QMessageBox.question(self, title, msg,
                                   QMessageBox.Yes | QMessageBox.No,
                                   QMessageBox.Yes)

        if ret == QMessageBox.No:
            return
        self.engine.finishGame()
        self.updatePanel()

    def updateScores(self):
        for player in self.players:
            score = self.engine.getScoreFromPlayer(player)
            self.playerGroupBox[player].updateDisplay(score)

    def setWinner(self):
        super(CarcassonneWidget, self).setWinner()
        winner = self.engine.getWinner()
        if winner in self.players:
            self.playerGroupBox[winner].setWinner()

    def unsetDealer(
        self): self.playerGroupBox[self.engine.getDealer()].unsetDealer()

    def setDealer(
        self): self.playerGroupBox[self.engine.getDealer()].setDealer()

    def updatePlayerOrder(self):
        GameWidget.updatePlayerOrder(self)
        trash = QWidget()
        trash.setLayout(self.playersLayout)
        self.playersLayout = QVBoxLayout(self.playerGroup)
        self.playersLayout.addStretch()
        for i, player in enumerate(self.engine.getListPlayers()):
            trash.layout().removeWidget(self.playerGroupBox[player])
            self.playersLayout.addWidget(self.playerGroupBox[player])
            self.playerGroupBox[player].setColour(PlayerColours[i])
        self.playersLayout.addStretch()
        self.detailGroup.updateRound()