예제 #1
0
    def get(self, source):
        if self.msg: prompt=self.msg
        else:
            if self.zone != "battlefield":
                if self.player == None: zl = " in any %s"%self.zone
                elif self.player == "you": zl = " in your %s"%self.zone
                else: zl = " in opponent %s"%self.zone
            else:
                if self.player == None: zl = ""
                elif self.player == "you": zl = " you control"
                else: zl = " opponent controls"
            prompt="Target %s%s for %s"%(' or '.join([str(t) for t in self.target_types]), zl, source)
        if self.selector == "opponent": selector = source.controller.choose_opponent()
        elif self.selector == "active_player":
            from engine.GameKeeper import Keeper
            selector = Keeper.active_player
        else: selector = source.controller
        # If required, make sure there is actually a target available
        if self.required and not self.targeting_player:
            perm = []
            if self.zone != "battlefield":
                zones = [getattr(selector, self.zone)] + [getattr(opponent, self.zone) for opponent in selector.opponents]
                if self.player == "you": zones = zones[:1]
                elif self.player == "opponent": zones = zones[1:]
                for ttype in self.target_types:
                    for zone in zones:
                        perm.extend([p for p in zone.get(ttype) if p.canBeTargetedBy(source)])
            else:
                for ttype in self.target_types:
                    if self.player == None:
                        perm.extend([p for p in selector.battlefield.get(ttype, all=True) if p.canBeTargetedBy(source)])
                    elif self.player == "you":
                        perm.extend([p for p in selector.battlefield.get(ttype) if p.canBeTargetedBy(source)])
                    else:
                        for opponent in selector.opponents:
                            perm.extend([p for p in opponent.battlefield.get(ttype) if p.canBeTargetedBy(source)])

            numtargets = len(perm)
            if numtargets == 0: return False
            elif numtargets == 1: self.target = perm[0]
            else:
                while True:
                    self.target = selector.getTarget(self.target_types,zone=self.zone,from_player=self.player,required=self.required,prompt=prompt)
                    if self.target.canBeTargetedBy(source): break
        else:
            self.target = selector.getTarget(self.target_types,zone=self.zone,from_player=self.player,required=False,prompt=prompt)
            if self.target == False: return False
        if self.target.canBeTargetedBy(source):
            self.target.isTargetedBy(source)
            self.is_valid = True
            return True
        else:
            selector.send(InvalidTargetEvent(), target=self.target)
            return False
예제 #2
0
 def compute(self, source, player):
     self._cards = []
     if self.cardtype == None:
         if str(source.zone) == self.from_zone: self._cards.append(source)
         else: return False
     else:
         prompt = "Select %d %s(s) to %s" % (self.number - len(
             self._cards), self.cardtype, self.action_txt % '')
         while True:
             card = player.getTarget(self.cardtype,
                                     zone=self.from_zone,
                                     from_player="you",
                                     required=False,
                                     prompt=prompt)
             if card == False: return False
             if card in self._cards:
                 prompt = "%s already selected - select again" % card
                 player.send(InvalidTargetEvent(), target=card)
             else:
                 self._cards.append(card)
                 prompt = "Select %d %s(s) to %s" % (self.number - len(
                     self._cards), self.cardtype, self.action_txt % '')
             if len(self._cards) == self.number: break
     return True