예제 #1
0
    def chooseMoveByAI(self, _gameTree, _agent):
        t.sleep(0.1)

        def fetchSimulationTrees(_moveTuple):
            self.retDict = {
                "index": _moveTuple[0],
                "description": _moveTuple[1].getDescription(),
                "tree": _moveTuple[1].getSimulateTree(),
            }
            return self.retDict
            pass

        self.gmFor = gmForAgent.gmForAgent(_world=w.visibleWorld(
            _gameTree.getWorld()),
                                           _state=_gameTree.getState())
        #self.argMoves=_gameTree.getMoves()
        self.state = _gameTree.getState()
        self.visibleWorld = w.visibleWorld(_gameTree.getWorld())
        self.simulationTrees = list(
            map(fetchSimulationTrees,
                enumerate(self.gmFor.getTree().getMoves())))
        #agentに選んでもらう
        self.m = _agent.chooseBestMove(self.visibleWorld, self.simulationTrees,
                                       self.state)
        return self.m
        pass
예제 #2
0
                def decideAttackObject(_defenseCreatureTuple):
                    def inner(_w):
                        self.wn = self.cloneWorld(_w)
                        self.tb = self.wn.getTurnPlayerBoard().getElements()
                        self.ob = self.wn.getOpponentPlayerBoard().getElements(
                        )
                        self.attackCard = self.tb[_state["playingCardTuple"]
                                                  [0]]
                        self.defenseCard = self.ob[_defenseCreatureTuple[0]]
                        combat(self.attackCard, self.defenseCard)
                        self.wn.sendDeadCreaturesFromBoards()
                        return self.makeGameTree(self.wn,
                                                 {"phase": _state["phase"]})
                        pass

                    def combat(_attackCard, _defenseCard):
                        _attackCard.dealDamage(_defenseCard.getCurrentPower())
                        _defenseCard.dealDamage(_attackCard.getCurrentPower())
                        _attackCard.tapThisCreature()

                    self.m = move.move()
                    self.m.setDescription("attack to {card}".format(
                        card=str(_defenseCreatureTuple[1])))
                    self.m.setGameTreePromise(self.delay(inner, _world))
                    self.m.setSimulateTree(
                        self.delay(inner, w.visibleWorld(_world)))
                    return self.m
예제 #3
0
                        def chooseObject(_opponentCardTuple):
                            def inner(_world):
                                self.wn = self.cloneWorld(_world)
                                self.wn.getOpponentPlayerBoard().getElements()[
                                    _opponentCardTuple[0]].dealDamage(3)
                                self.wn.sendDeadCreaturesFromBoards()
                                self.playingCard = self.wn.getTurnPlayerHand(
                                ).getElements().pop(
                                    _state["playingCardTuple"][0])
                                self.wn.addTurnPlayerGrave(
                                    copy.deepcopy(self.playingCard))
                                self.wn.getTurnPlayer().consumeMana(
                                    _state["playingCardTuple"]
                                    [1].getCurrentCost())
                                return self.makeGameTree(
                                    self.wn, _state={"phase": _state["phase"]})
                                pass

                            self.m = move.move()
                            self.m.setDescription(
                                "deal 3 damage for {card}".format(
                                    card=str(_opponentCardTuple[1])))
                            self.m.setGameTreePromise(self.delay(
                                inner, _world))
                            self.m.setSimulateTree(
                                self.delay(inner, w.visibleWorld(_world)))
                            return self.m
                            pass
예제 #4
0
                            def chooseDiscard(_handTuple):
                                def inner(_w):
                                    self.wn = self.cloneWorld(_w)
                                    self.wn.discardX(_handTuple[0])
                                    return self.makeGameTree(
                                        self.wn,
                                        _state={"phase": _state["phase"]})

                                self.m = move.move()
                                self.m.setDescription("discard {card}.".format(
                                    card=str(_handTuple[1])))
                                self.m.setGameTreePromise(
                                    self.delay(inner, _world))
                                self.m.setSimulateTree(
                                    self.delay(inner, w.visibleWorld(_world)))
                                return self.m
예제 #5
0
                def getBasicMoves(_opt):
                    def inner(_w):
                        self.wn = self.cloneWorld(_w)
                        self.optState = _opt.split(" ")[0]
                        return self.makeGameTree(self.wn,
                                                 _state={
                                                     "phase": _state["phase"],
                                                     "opt": self.optState
                                                 })
                        pass

                    self.m = move.move()
                    self.m.setDescription(_opt)
                    self.m.setGameTreePromise(self.delay(inner, _world))
                    self.m.setSimulateTree(
                        self.delay(inner, w.visibleWorld(_world)))
                    return self.m
                    pass
예제 #6
0
                    def activateSkill(_skill):
                        def inner(_w):
                            self.wn = self.cloneWorld(_w)
                            return self.makeGameTree(
                                self.wn, {
                                    "phase": _state["phase"],
                                    "opt": _state["opt"],
                                    "playingCardTuple":
                                    _state["playingCardTuple"],
                                    "activateSkill": _skill
                                })
                            pass

                        self.m = move.move()
                        self.m.setDescription(
                            "activate {_skill}".format(_skill=_skill["name"]))
                        self.m.setGameTreePromise(self.delay(inner, _world))
                        self.m.setSimulateTree(
                            self.delay(inner, w.visibleWorld(_world)))
                        return self.m
                        pass
예제 #7
0
                def attackByCreature(_attackCardTuple):
                    def inner(_w):
                        self.wn = self.cloneWorld(_w)
                        return self.makeGameTree(self.wn,
                                                 _state={
                                                     "phase":
                                                     _state["phase"],
                                                     "opt":
                                                     _state["opt"],
                                                     "playingCardTuple":
                                                     _attackCardTuple
                                                 })
                        pass

                    self.m = move.move()
                    self.m.setDescription("attack by {card}".format(
                        card=str(_attackCardTuple[1])))
                    self.m.setGameTreePromise(self.delay(inner, _world))
                    self.m.setSimulateTree(
                        self.delay(inner, w.visibleWorld(_world)))
                    return self.m
예제 #8
0
                def playCard(playingCardTuple):
                    def inner(_w):
                        self.wn = self.cloneWorld(_w)
                        return self.makeGameTree(self.wn,
                                                 _state={
                                                     "phase":
                                                     _state["phase"],
                                                     "opt":
                                                     _state["opt"],
                                                     "playingCardTuple":
                                                     playingCardTuple
                                                 })
                        pass

                    self.m = move.move()
                    self.m.setDescription("play " + str(playingCardTuple[1]))
                    self.m.setGameTreePromise(self.delay(inner, _world))
                    self.m.setSimulateTree(
                        self.delay(inner, w.visibleWorld(_world)))
                    return self.m
                    pass
예제 #9
0
                            def chooseBurnObject(opponentCardTuple):
                                def inner(_w):
                                    self.wn = self.cloneWorld(_w)
                                    self.wn.getOpponentPlayerBoard(
                                    ).getElements()[
                                        opponentCardTuple[0]].dealDamage(2)
                                    self.wn.sendDeadCreaturesFromBoards()
                                    return self.makeGameTree(
                                        self.wn,
                                        _state={"phase": _state["phase"]})
                                    pass

                                self.m = move.move()
                                self.m.setDescription(
                                    "deal 2 damage for {card}".format(
                                        card=str(opponentCardTuple[1])))
                                self.m.setGameTreePromise(
                                    self.delay(inner, _world))
                                self.m.setSimulateTree(
                                    self.delay(inner, w.visibleWorld(_world)))
                                return self.m
                                pass
예제 #10
0
    def chooseMoveByAI(self, _gameTree, _agent):
        t.sleep(0.1)
        print("waiting...")

        def fetchSimulationTrees(_moveTuple):
            self.retDict = {
                "index": _moveTuple[0],
                "description": _moveTuple[1].getDescription(),
                "tree": _moveTuple[1].getSimulateTree(),
            }
            return self.retDict
            pass

        self.moves = _gameTree.getMoves()
        self.state = _gameTree.getState()
        self.visibleWorld = w.visibleWorld(_gameTree.getWorld())
        self.simulationTrees = list(
            map(fetchSimulationTrees, enumerate(self.moves)))
        #agentに選んでもらう
        self.m = _agent.chooseBestMove(self.visibleWorld,
                                       copy.deepcopy(self.simulationTrees),
                                       self.state)
        return self.m
        pass
예제 #11
0
    def listPossibleMovesByRules(self, _world, _state):
        #フェイズも記録した方がよさげ―
        def shiftNextPhase(_w):
            self.wn = self.cloneWorld(_w)
            return self.makeGameTree(
                self.wn, _state={"phase": self.nextPhaseDict[_state["phase"]]})
            pass

        def doNothing(_w):
            self.wn = self.cloneWorld(_w)
            return self.makeGameTree(self.wn,
                                     _state={"phase": _state["phase"]})
            pass

        self.retMoves = move.move()
        if self.isGameEnded(_world):
            return []
        if _state["phase"] == "init":
            self.retMoves.setDescription("untap, upkeep")

            def inner(_w):
                #untap and upkeep.
                self.wn = self.cloneWorld(_w)
                self.wn.untapTurnPlayerCreatures()
                if self.wn.getTurnPlayer().getMaxMana() < self.manaLimit:
                    self.wn.expandTurnPlayerMana()
                    pass
                self.wn.recoverTurnPlayerMana()
                return self.makeGameTree(
                    self.wn,
                    _state={"phase": self.nextPhaseDict[_state["phase"]]})
                pass

            self.retMoves.setGameTreePromise(self.delay(inner, _world))
            self.retMoves.setSimulateTree(
                self.delay(inner, w.visibleWorld(_world)))

            return [self.retMoves]
            pass
        if _state["phase"] == "draw":
            self.retMoves.setDescription("draw a card.")

            def inner(_w):
                self.wn = self.cloneWorld(_w)
                self.wn.dealCardsX(1)
                return self.makeGameTree(
                    self.wn,
                    _state={"phase": self.nextPhaseDict[_state["phase"]]})

            self.retMoves.setGameTreePromise(self.delay(inner, _world))
            self.retMoves.setSimulateTree(
                self.delay(inner, w.visibleWorld(_world)))
            return [self.retMoves]
            pass
        if _state["phase"] == "main":
            if not ("opt" in _state.keys()):

                def getBasicMoves(_opt):
                    def inner(_w):
                        self.wn = self.cloneWorld(_w)
                        self.optState = _opt.split(" ")[0]
                        return self.makeGameTree(self.wn,
                                                 _state={
                                                     "phase": _state["phase"],
                                                     "opt": self.optState
                                                 })
                        pass

                    self.m = move.move()
                    self.m.setDescription(_opt)
                    self.m.setGameTreePromise(self.delay(inner, _world))
                    self.m.setSimulateTree(
                        self.delay(inner, w.visibleWorld(_world)))
                    return self.m
                    pass

                def canPayCosts(_card, _skill):
                    if _skill["cost"]["tap"] and not (_card.isStand()):
                        return False
                    if _skill["cost"]["mana"] > _world.getTurnPlayer(
                    ).getCurrentMana():
                        return False
                    if _skill["cost"]["discard"] > _world.getTurnPlayerHand(
                    ).getNumOfElements():
                        return False
                    return True

                def hasActivatableSkill(_card):
                    self.skill = _card.getSkillsByType("activate")
                    return len(
                        list(
                            filter(lambda s: canPayCosts(_card, s),
                                   self.skill))) > 0
                    pass

                def isPlayableAction(_opt):
                    if _opt.split(" ")[0] == "play":

                        def isPlayableCard(cardTuple):
                            self.currentMana = _world.getTurnPlayer(
                            ).getCurrentMana()
                            self.turnPlayerBoard = _world.getTurnPlayerBoard()
                            if cardTuple[1].getCurrentCost(
                            ) > self.currentMana:
                                return False
                                pass
                            if cardTuple[1].getMainCardType() == "creature":
                                return not (self.turnPlayerBoard.isBoardFull())
                                pass
                            if cardTuple[1].getMainCardType() == "sorcery":
                                return True
                            return False
                            pass

                        self.turnPlayerHand = _world.getTurnPlayerHand(
                        ).getElements()
                        self.playableHand = list(
                            filter(lambda item: isPlayableCard(item),
                                   enumerate(self.turnPlayerHand)))
                        return len(self.playableHand) > 0
                        pass
                    if _opt.split(" ")[0] == "activate":
                        self.turnPlayerBoard = _world.getTurnPlayerBoard(
                        ).getElements()
                        self.skillCreatures = list(
                            filter(
                                lambda item: item.hasSkillsByType("activate"),
                                self.turnPlayerBoard))
                        self.activatableCreatures = list(
                            filter(hasActivatableSkill, self.skillCreatures))
                        return len(self.activatableCreatures) > 0
                        pass
                    if _opt.split(" ")[0] == "attack":
                        self.turnPlayerBoard = _world.getTurnPlayerBoard(
                        ).getElements()
                        return len(
                            list(
                                filter(lambda item: item.isStand(),
                                       self.turnPlayerBoard))) > 0
                        pass
                    return False
                    pass

                self.playableActions = list(
                    filter(isPlayableAction, self.mainAction))
                self.retMoves = list(map(getBasicMoves, self.playableActions))
                self.additionalMove = move.move()
                self.additionalMove.setDescription("do nothing.")
                self.additionalMove.setGameTreePromise(
                    self.delay(shiftNextPhase, _world))
                self.additionalMove.setSimulateTree(
                    self.delay(shiftNextPhase, w.visibleWorld(_world)))
                self.retMoves.append(self.additionalMove)
                return self.retMoves
                pass
            if _state["opt"] == "play":

                def isPlayableCard(cardTuple):
                    self.currentMana = _world.getTurnPlayer().getCurrentMana()
                    self.turnPlayerBoard = _world.getTurnPlayerBoard()
                    if cardTuple[1].getCurrentCost() > self.currentMana:
                        return False
                        pass
                    if cardTuple[1].getMainCardType() == "creature":
                        return not (self.turnPlayerBoard.isBoardFull())
                        pass
                    if cardTuple[1].getMainCardType() == "sorcery":
                        return True
                    return False
                    pass

                def playCard(playingCardTuple):
                    def inner(_w):
                        self.wn = self.cloneWorld(_w)
                        return self.makeGameTree(self.wn,
                                                 _state={
                                                     "phase":
                                                     _state["phase"],
                                                     "opt":
                                                     _state["opt"],
                                                     "playingCardTuple":
                                                     playingCardTuple
                                                 })
                        pass

                    self.m = move.move()
                    self.m.setDescription("play " + str(playingCardTuple[1]))
                    self.m.setGameTreePromise(self.delay(inner, _world))
                    self.m.setSimulateTree(
                        self.delay(inner, w.visibleWorld(_world)))
                    return self.m
                    pass

                self.turnPlayerHand = _world.getTurnPlayerHand().getElements()
                self.playableHand = list(
                    filter(lambda item: isPlayableCard(item),
                           enumerate(self.turnPlayerHand)))
                self.retMoves = list(map(playCard, self.playableHand))
                return self.retMoves
                pass

            if _state["opt"] == "activate":

                def canPayCosts(_card, _skill):
                    if _skill["cost"]["tap"] and not (_card.isStand()):
                        return False
                    if _skill["cost"]["mana"] > _world.getTurnPlayer(
                    ).getCurrentMana():
                        return False
                    if _skill["cost"]["discard"] > _world.getTurnPlayerHand(
                    ).getNumOfElements():
                        return False
                    return True

                def hasActivatableSkill(_card):
                    self.skill = _card.getSkillsByType("activate")
                    return len(
                        list(
                            filter(lambda s: canPayCosts(_card, s),
                                   self.skill))) > 0
                    pass

                def activateSkill(_actionCardTuple):
                    def inner(_w):
                        self.wn = self.cloneWorld(_w)
                        return self.makeGameTree(self.wn,
                                                 _state={
                                                     "phase":
                                                     _state["phase"],
                                                     "opt":
                                                     _state["opt"],
                                                     "playingCardTuple":
                                                     _actionCardTuple
                                                 })
                        pass

                    self.m = move.move()
                    self.m.setDescription("activate {card}'s skill".format(
                        card=str(_actionCardTuple[1])))
                    self.m.setGameTreePromise(self.delay(inner, _world))
                    self.m.setSimulateTree(
                        self.delay(inner, w.visibleWorld(_world)))
                    return self.m
                    pass

                self.turnPlayerBoard = _world.getTurnPlayerBoard().getElements(
                )
                self.skillCreatures = list(
                    filter(lambda item: item[1].hasSkillsByType("activate"),
                           list(enumerate(self.turnPlayerBoard))))
                self.actionableCreatures = list(
                    filter(lambda item: hasActivatableSkill(item[1]),
                           self.skillCreatures))
                self.retMoves = list(
                    map(activateSkill, self.actionableCreatures))
                return self.retMoves
                pass
            if _state["opt"] == "attack":

                def attackByCreature(_attackCardTuple):
                    def inner(_w):
                        self.wn = self.cloneWorld(_w)
                        return self.makeGameTree(self.wn,
                                                 _state={
                                                     "phase":
                                                     _state["phase"],
                                                     "opt":
                                                     _state["opt"],
                                                     "playingCardTuple":
                                                     _attackCardTuple
                                                 })
                        pass

                    self.m = move.move()
                    self.m.setDescription("attack by {card}".format(
                        card=str(_attackCardTuple[1])))
                    self.m.setGameTreePromise(self.delay(inner, _world))
                    self.m.setSimulateTree(
                        self.delay(inner, w.visibleWorld(_world)))
                    return self.m

                def noAction(_w):
                    self.wn = self.cloneWorld(_w)
                    return self.makeGameTree(self.wn,
                                             _state={"phase": _state["phase"]})
                    pass

                self.retMoves = []
                self.turnPlayerBoard = _world.getTurnPlayerBoard().getElements(
                )
                self.attackableUnitTuple = list(
                    filter(lambda item: item[1].isStand(),
                           enumerate(self.turnPlayerBoard)))
                self.retMoves = list(
                    map(attackByCreature, list(self.attackableUnitTuple)))
                return self.retMoves
                pass
        if _state["phase"] == "end":
            self.retMoves.setDescription("end your turn.")

            def inner(_w):
                self.wn = self.cloneWorld(_w)
                self.wn.shiftNextTurn()
                return self.makeGameTree(
                    self.wn,
                    _state={"phase": self.nextPhaseDict[_state["phase"]]})
                pass

            self.retMoves.setGameTreePromise(self.delay(inner, _world))
            self.retMoves.setSimulateTree(
                self.delay(inner, w.visibleWorld(_world)))
            #終了時の処理は迷いマイマイ
            return [self.retMoves]
            pass
        pass
예제 #12
0
    def listPossibleMovesByCards(self, _world, _state):
        self.retMoves = move.move()

        def doNothing(_w):
            self.wn = self.cloneWorld(_w)
            return self.makeGameTree(self.wn,
                                     _state={"phase": _state["phase"]})
            pass

        if _state["phase"] == "init":
            self.retMoves.setDescription("untap, upkeep")

            def inner(_w):
                #untap and upkeep.
                self.wn = self.cloneWorld(_w)
                return self.makeGameTree(
                    self.wn, {"phase": self.nextPhaseDict[_state["phase"]]})
                pass

            self.retMoves.setGameTreePromise(self.delay(inner, _world))
            return [self.retMoves]
        if _state["phase"] == "draw":
            self.retMoves.setDescription("untap, upkeep")

            def inner(_w):
                #untap and upkeep.
                self.wn = self.cloneWorld(_w)
                return self.makeGameTree(
                    self.wn, {"phase": self.nextPhaseDict[_state["phase"]]})
                pass

            self.retMoves.setGameTreePromise(self.delay(inner, _world))
            return [self.retMoves]
        if _state["phase"] == "main":
            if _state["opt"] == "play":
                #カードを使用。
                #_state["playingCardTuple"]に使っているカードが収納されている。
                if _state["playingCardTuple"][1].getMainCardType(
                ) == "creature":
                    if "step" in _state.keys():
                        if _state["step"] == "burn":
                            #とりあえずburn 能力は個別で発動させよう(?)
                            def chooseBurnObject(opponentCardTuple):
                                def inner(_w):
                                    self.wn = self.cloneWorld(_w)
                                    self.wn.getOpponentPlayerBoard(
                                    ).getElements()[
                                        opponentCardTuple[0]].dealDamage(2)
                                    self.wn.sendDeadCreaturesFromBoards()
                                    return self.makeGameTree(
                                        self.wn,
                                        _state={"phase": _state["phase"]})
                                    pass

                                self.m = move.move()
                                self.m.setDescription(
                                    "deal 2 damage for {card}".format(
                                        card=str(opponentCardTuple[1])))
                                self.m.setGameTreePromise(
                                    self.delay(inner, _world))
                                self.m.setSimulateTree(
                                    self.delay(inner, w.visibleWorld(_world)))
                                return self.m
                                pass

                            self.opponentBoard = _world.getOpponentPlayerBoard(
                            ).getElements()
                            if len(self.opponentBoard) > 0:
                                self.retMoves = list(
                                    map(chooseBurnObject,
                                        enumerate(self.opponentBoard)))
                                return self.retMoves
                                pass
                            else:
                                self.retMoves.setDescription(
                                    "there is no object.")
                                self.retMoves.setGameTreePromise(
                                    self.delay(doNothing, _world))
                                self.retMoves.setSimulateTree(
                                    self.delay(doNothing,
                                               w.visibleWorld(_world)))
                                return [self.retMoves]
                        if _state["playingCardTuple"][1].hasSkillsByType(
                                "permanent"):
                            #permanent-->常在型能力
                            pass
                        if _state["playingCardTuple"][1].hasSkillsByType(
                                "cip"):
                            #cip-->召喚時
                            def solveCip(_w):
                                #cipを定義していく。
                                #複数cipを持っていて、選択の余地がある場合に困っている
                                self.wn = self.cloneWorld(_w)
                                self.cip = _state["playingCardTuple"][
                                    1].getSkillNamesByType("cip")
                                self.objectCreature = self.wn.getTurnPlayerBoard(
                                ).getElements()[-1]
                                if "haste" in self.cip:
                                    self.objectCreature.standUp()
                                    pass
                                if "cantrip" in self.cip:
                                    self.wn.dealCardsX(1)
                                    pass
                                if "burn" in self.cip:
                                    return self.makeGameTree(
                                        self.wn,
                                        _state={
                                            "phase":
                                            _state["phase"],
                                            "opt":
                                            _state["opt"],
                                            "playingCardTuple":
                                            _state["playingCardTuple"],
                                            "step":
                                            "burn"
                                        })
                                    pass
                                pass
                                return self.makeGameTree(
                                    self.wn, _state={"phase": _state["phase"]})

                            self.cipMove = move.move()
                            self.cipMove.setDescription("solve cip.")
                            self.cipMove.setGameTreePromise(
                                self.delay(solveCip, _world))
                            self.cipMove.setSimulateTree(
                                self.delay(solveCip, w.visibleWorld(_world)))

                            return [self.cipMove]
                            pass
                        else:
                            pass
                            self.retMoves.setDescription("nothing happened.")
                            self.retMoves.setGameTreePromise(
                                self.delay(doNothing, _world))
                            self.retMoves.setSimulateTree(
                                self.delay(doNothing, w.visibleWorld(_world)))
                            return [self.retMoves]
                    else:

                        def inner(_w):
                            #playingCardを盤面に加える
                            self.wn = self.cloneWorld(_w)
                            self.playedCard = self.wn.getTurnPlayerHand(
                            ).getElements().pop(_state["playingCardTuple"][0])
                            self.wn.addTurnPlayerBoard(
                                self.makeCreature(self.playedCard))
                            self.wn.getTurnPlayer().consumeMana(
                                self.playedCard.getCurrentCost())
                            return self.makeGameTree(
                                self.wn,
                                _state={
                                    "phase": _state["phase"],
                                    "opt": _state["opt"],
                                    "playingCardTuple":
                                    _state["playingCardTuple"],
                                    "step": "solveEffect"
                                })
                            pass

                        self.retMoves.setDescription(
                            "solve playing {card}".format(
                                card=_state["playingCardTuple"][1]))
                        self.retMoves.setGameTreePromise(
                            self.delay(inner, _world))
                        self.retMoves.setSimulateTree(
                            self.delay(inner, w.visibleWorld(_world)))
                        return [self.retMoves]
                        pass
                elif _state["playingCardTuple"][1].getMainCardType() == "land":
                    pass
                elif _state["playingCardTuple"][1].getMainCardType(
                ) == "sorcery":
                    if _state["playingCardTuple"][1].getCardName() == "impact":

                        def chooseObject(_opponentCardTuple):
                            def inner(_world):
                                self.wn = self.cloneWorld(_world)
                                self.wn.getOpponentPlayerBoard().getElements()[
                                    _opponentCardTuple[0]].dealDamage(3)
                                self.wn.sendDeadCreaturesFromBoards()
                                self.playingCard = self.wn.getTurnPlayerHand(
                                ).getElements().pop(
                                    _state["playingCardTuple"][0])
                                self.wn.addTurnPlayerGrave(
                                    copy.deepcopy(self.playingCard))
                                self.wn.getTurnPlayer().consumeMana(
                                    _state["playingCardTuple"]
                                    [1].getCurrentCost())
                                return self.makeGameTree(
                                    self.wn, _state={"phase": _state["phase"]})
                                pass

                            self.m = move.move()
                            self.m.setDescription(
                                "deal 3 damage for {card}".format(
                                    card=str(_opponentCardTuple[1])))
                            self.m.setGameTreePromise(self.delay(
                                inner, _world))
                            self.m.setSimulateTree(
                                self.delay(inner, w.visibleWorld(_world)))
                            return self.m
                            pass

                        def burnOpponent(_world):
                            self.wn = self.cloneWorld(_world)
                            self.playingCard = self.wn.getTurnPlayerHand(
                            ).getElements().pop(_state["playingCardTuple"][0])
                            self.wn.addTurnPlayerGrave(
                                copy.deepcopy(self.playingCard))
                            self.wn.getTurnPlayer().consumeMana(
                                _state["playingCardTuple"][1].getCurrentCost())
                            self.wn.getOpponentPlayer().dealDamage(3)
                            return self.makeGameTree(
                                self.wn, _state={"phase": _state["phase"]})
                            pass

                        self.opponentBoard = _world.getOpponentPlayerBoard(
                        ).getElements()
                        self.retMoves = list(
                            map(chooseObject, enumerate(self.opponentBoard)))
                        self.additionalMove = move.move()
                        self.additionalMove.setDescription(
                            "deal 3 damage for opponent.")
                        self.additionalMove.setGameTreePromise(
                            self.delay(burnOpponent, _world))

                        self.additionalMove.setSimulateTree(
                            self.delay(burnOpponent, w.visibleWorld(_world)))
                        self.retMoves.append(self.additionalMove)
                        return self.retMoves
                        pass
                    elif _state["playingCardTuple"][1].getCardName(
                    ) == "knowledge":

                        def inner(_world):
                            self.wn = self.cloneWorld(_world)
                            self.playingCard = self.wn.getTurnPlayerHand(
                            ).getElements().pop(_state["playingCardTuple"][0])
                            self.wn.addTurnPlayerGrave(
                                copy.deepcopy(self.playingCard))
                            self.wn.dealCardsX(2)
                            self.wn.getTurnPlayer().consumeMana(
                                _state["playingCardTuple"][1].getCurrentCost())
                            return self.makeGameTree(
                                self.wn, _state={"phase": _state["phase"]})
                            pass

                        self.retMoves.setDescription("draw 2 cards.")
                        self.retMoves.setGameTreePromise(
                            self.delay(inner, _world))
                        self.retMoves.setSimulateTree(
                            self.delay(inner, w.visibleWorld(_world)))
                        return [self.retMoves]
                    elif _state["playingCardTuple"][1].getCardName(
                    ) == "growth":

                        def inner(_world):
                            self.wn = self.cloneWorld(_world)
                            self.playingCard = self.wn.getTurnPlayerHand(
                            ).getElements().pop(_state["playingCardTuple"][0])
                            self.wn.addTurnPlayerGrave(
                                copy.deepcopy(self.playingCard))
                            self.wn.getTurnPlayer().consumeMana(
                                _state["playingCardTuple"][1].getCurrentCost())
                            self.turnPlayerBoard = self.wn.getTurnPlayerBoard(
                            ).getElements()
                            for item in self.turnPlayerBoard:
                                item.addBonus(_bothBonus=1)
                                pass
                            return self.makeGameTree(
                                self.wn, _state={"phase": _state["phase"]})
                            pass

                        self.retMoves.setDescription(
                            "put +1/+1 to your creatures.")
                        self.retMoves.setGameTreePromise(
                            self.delay(inner, _world))
                        self.retMoves.setSimulateTree(
                            self.delay(inner, w.visibleWorld(_world)))
                        return [self.retMoves]
                    pass
                else:

                    def inner(_w):
                        self.wn = self.cloneWorld(_w)
                        self.wn.getTurnPlayerHand().getElements().pop(
                            _state["playingCardTuple"][0])
                        print("use dummy card?")
                        return self.makeGameTree(
                            self.wn, _state={"phase": _state["phase"]})
                        pass

                    self.retMoves.setDescription("")
                    self.retMoves.setGameTreePromise(self.delay(inner, _world))
                    self.retMoves.setSimulateTree(
                        self.delay(inner, w.visibleWorld(_world)))
                    return [self.retMoves]
            if _state["opt"] == "activate":
                if "step" in _state.keys():
                    if _state["activateSkill"]["name"] == "research":
                        if _state["step"] == "discard":

                            def chooseDiscard(_handTuple):
                                def inner(_w):
                                    self.wn = self.cloneWorld(_w)
                                    self.wn.discardX(_handTuple[0])
                                    return self.makeGameTree(
                                        self.wn,
                                        _state={"phase": _state["phase"]})

                                self.m = move.move()
                                self.m.setDescription("discard {card}.".format(
                                    card=str(_handTuple[1])))
                                self.m.setGameTreePromise(
                                    self.delay(inner, _world))
                                self.m.setSimulateTree(
                                    self.delay(inner, w.visibleWorld(_world)))
                                return self.m

                            self.turnPlayerHand = _world.getTurnPlayerHand(
                            ).getElements()
                            self.retMoves = list(
                                map(chooseDiscard,
                                    enumerate(self.turnPlayerHand)))
                            return self.retMoves
                            pass
                        if _state["step"] == "paid":

                            def inner(_w):
                                self.wn = self.cloneWorld(_w)
                                self.wn.dealCardsX(1)
                                self.argState = _state
                                self.argState["step"] = "discard"
                                return self.makeGameTree(self.wn,
                                                         _state=self.argState)
                                pass

                            self.retMoves.setDescription("draw a card.")
                            self.retMoves.setGameTreePromise(
                                self.delay(inner, _world))
                            self.retMoves.setSimulateTree(
                                self.delay(inner, _world))
                            return [self.retMoves]
                    if _state["activateSkill"]["name"] == "heal":
                        if _state["step"] == "paid":

                            def inner(_w):
                                self.wn = self.cloneWorld(_w)
                                self.wn.gainTurnPlayerX(3)
                                return self.makeGameTree(
                                    self.wn, _state={"phase": _state["phase"]})
                                pass

                            self.retMoves.setDescription("gain 3 life.")
                            self.retMoves.setGameTreePromise(
                                self.delay(inner, _world))
                            self.retMoves.setSimulateTree(
                                self.delay(inner, _world))
                            return [self.retMoves]

                        pass
                if "activateSkill" in _state.keys():

                    def activateSkill(_w):
                        self.wn = self.cloneWorld(_w)
                        if _state["activateSkill"]["cost"]["tap"]:
                            #起動しているクリーチャー情報が欲しいからタプルにする必要あるかも
                            self.wn.getTurnPlayerBoard().getElements(
                            )[_state["playingCardTuple"][0]].tapThisCreature()
                            pass
                        self.wn.getTurnPlayer().consumeMana(
                            _state["activateSkill"]["cost"]["mana"])
                        return self.makeGameTree(
                            self.wn,
                            _state={
                                "phase": _state["phase"],
                                "opt": _state["opt"],
                                "playingCardTuple": _state["playingCardTuple"],
                                "activateSkill": _state["activateSkill"],
                                "step": "paid"
                            })
                        pass

                    self.retMoves = []
                    self.activateMove = move.move()
                    self.activateMove.setDescription("pay {skillCost}".format(
                        skillCost=_state["playingCardTuple"][1].
                        skillCostToString(_state["activateSkill"]["cost"])))
                    self.activateMove.setGameTreePromise(
                        self.delay(activateSkill, _world))
                    self.activateMove.setSimulateTree(
                        self.delay(activateSkill, w.visibleWorld(_world)))
                    self.retMoves.append(self.activateMove)
                    return self.retMoves
                else:

                    def canPayCosts(_card, _skill):
                        if _skill["cost"]["tap"] and not (
                                _state["playingCardTuple"][1].isStand()):
                            return False
                        if _skill["cost"]["mana"] > _world.getTurnPlayer(
                        ).getCurrentMana():
                            return False
                        if _skill["cost"]["discard"] > _world.getTurnPlayerHand(
                        ).getNumOfElements():
                            return False
                        return True
                        pass

                    def activateSkill(_skill):
                        def inner(_w):
                            self.wn = self.cloneWorld(_w)
                            return self.makeGameTree(
                                self.wn, {
                                    "phase": _state["phase"],
                                    "opt": _state["opt"],
                                    "playingCardTuple":
                                    _state["playingCardTuple"],
                                    "activateSkill": _skill
                                })
                            pass

                        self.m = move.move()
                        self.m.setDescription(
                            "activate {_skill}".format(_skill=_skill["name"]))
                        self.m.setGameTreePromise(self.delay(inner, _world))
                        self.m.setSimulateTree(
                            self.delay(inner, w.visibleWorld(_world)))
                        return self.m
                        pass

                    self.skills = _state["playingCardTuple"][
                        1].getSkillsByType("activate")
                    self.activatableSkills = list(
                        filter(
                            lambda s: canPayCosts(
                                _state["playingCardTuple"][1], s),
                            self.skills))  #
                    self.retMoves = list(
                        map(activateSkill, self.activatableSkills))
                    return self.retMoves
                    pass
            if _state["opt"] == "attack":

                def decideAttackObject(_defenseCreatureTuple):
                    def inner(_w):
                        self.wn = self.cloneWorld(_w)
                        self.tb = self.wn.getTurnPlayerBoard().getElements()
                        self.ob = self.wn.getOpponentPlayerBoard().getElements(
                        )
                        self.attackCard = self.tb[_state["playingCardTuple"]
                                                  [0]]
                        self.defenseCard = self.ob[_defenseCreatureTuple[0]]
                        combat(self.attackCard, self.defenseCard)
                        self.wn.sendDeadCreaturesFromBoards()
                        return self.makeGameTree(self.wn,
                                                 {"phase": _state["phase"]})
                        pass

                    def combat(_attackCard, _defenseCard):
                        _attackCard.dealDamage(_defenseCard.getCurrentPower())
                        _defenseCard.dealDamage(_attackCard.getCurrentPower())
                        _attackCard.tapThisCreature()

                    self.m = move.move()
                    self.m.setDescription("attack to {card}".format(
                        card=str(_defenseCreatureTuple[1])))
                    self.m.setGameTreePromise(self.delay(inner, _world))
                    self.m.setSimulateTree(
                        self.delay(inner, w.visibleWorld(_world)))
                    return self.m

                def bodyAttack(_w):
                    self.wn = self.cloneWorld(_w)
                    self.tb = self.wn.getTurnPlayerBoard().getElements()
                    self.attackCard = self.tb[_state["playingCardTuple"][0]]
                    self.op = self.wn.getOpponentPlayer()
                    self.op.dealDamage(self.attackCard.getCurrentPower())
                    self.attackCard.tapThisCreature()
                    return self.makeGameTree(self.wn,
                                             {"phase": _state["phase"]})
                    pass

                self.opponentBoard = _world.getOpponentPlayerBoard()
                self.targetableCreatures = list(
                    filter(
                        lambda item: "guardian" in item[1].getSkillNamesByType(
                            "passive"),
                        enumerate(self.opponentBoard.getElements())))
                self.isThereGuardian = len(self.targetableCreatures) > 0
                if not self.isThereGuardian:
                    self.targetableCreatures = enumerate(
                        self.opponentBoard.getElements())
                    pass
                self.retMoves = list(
                    map(decideAttackObject, self.targetableCreatures))
                if self.opponentBoard.isBoardFull() or self.isThereGuardian:
                    pass
                else:
                    self.additionalMove = move.move()
                    self.additionalMove.setDescription("attack body")
                    self.additionalMove.setGameTreePromise(
                        self.delay(bodyAttack, _world))
                    self.additionalMove.setSimulateTree(
                        self.delay(bodyAttack, w.visibleWorld(_world)))
                    self.retMoves.append(self.additionalMove)
                return self.retMoves
                pass
        if _state["phase"] == "end":
            self.retMoves.setDescription("untap, upkeep")

            def inner(_w):
                #untap and upkeep.
                self.wn = self.cloneWorld(_w)
                self.wn.shiftNextTurn()
                return self.makeGameTree(
                    self.wn, {"phase": self.nextPhaseDict[_state["phase"]]})
                pass

            self.retMoves.setGameTreePromise(self.delay(inner, _world))
            self.retMoves.setSimulateTree(
                self.delay(inner, w.visibleWorld(_world)))
            #終了時の処理をどうするかは迷いマイマイ
            return [self.retMoves]
            pass
        pass