Exemple #1
0
    def move(self, d: Direction) -> MoveVerdict:
        """
        Executes a step of this player. If the player is already inactive, this
        won't cause any state changes in map.
        :param d: Direction the player should take
        :return: A verdict, which reflects the changes the move caused
        """
        if self._inactive:
            return MoveVerdict(verdict=MoveVerdictEnum.INACTIVE)

        verdict = super(Player, self).move(d)

        if verdict.verdict == MoveVerdictEnum.NO_MOVE or verdict.verdict == MoveVerdictEnum.CAPTURED:
            self._inactive = True
        elif verdict.verdict == MoveVerdictEnum.NO_VERDICT:
            raise RuntimeError("Inconclusive verdict when trying to move")
        elif verdict.verdict == MoveVerdictEnum.MOVE:
            self._momentum += 1

        self.set_facing(d)

        # If player is capable to move only one step,
        # it should finish moving no matter what.
        # Except if player is delayed.
        if self.__move_only_once and verdict.verdict != MoveVerdictEnum.DELAYED:
            self._inactive = True

        return verdict
Exemple #2
0
 def before_step(self, intruder: AbstractBlock, i: MoveInfo) -> MoveVerdict:
     """
     :return: Whether intruder can step on block
     """
     if not self._data:
         return MoveVerdict(MoveVerdictEnum.MOVE)
     top_verdict = self.top().before_step(intruder, i)
     return top_verdict
Exemple #3
0
 def before_step(self, intruder: AbstractBlock) -> MoveVerdict:
     verdict = MoveVerdict(verdict=MoveVerdictEnum.NO_MOVE)
     try:
         intruder: Player
         intruder.set_dead()
         verdict.reports.append(
             PlayerMoveReport(position=intruder.position, died=True))
     except AttributeError:
         pass  # Intruder is not player
     return verdict
Exemple #4
0
    def before_step(self, intruder: AbstractBlock, i: MoveInfo) -> MoveVerdict:
        walls_verdict = self._walls.before_step(intruder, i)
        if walls_verdict.verdict != MoveVerdictEnum.NO_VERDICT:
            return walls_verdict

        if self.free_space > 0 or self._capacity == -1:
            if isinstance(intruder, Player):
                # Accept block
                self._blocks_in_pool.append(intruder)
                return MoveVerdict(verdict=MoveVerdictEnum.CAPTURED)

        # If full, behaves like a rock
        return super(DuckPoolBlock, self).before_step(intruder, i)
Exemple #5
0
    def before_step(self, intruder: AbstractBlock,
                    _i: MoveInfo) -> MoveVerdict:
        verdict = MoveVerdict(verdict=MoveVerdictEnum.NO_MOVE)

        # Try to kill it
        try:
            intruder: 'Player'
            intruder.set_dead()
            verdict.reports.append(
                PlayerMoveReport(position=intruder.position, died=True))
        except AttributeError:
            pass

        return verdict
Exemple #6
0
    def move(self, d: Direction) -> MoveVerdict:
        """
        :param d: Direction the movable object takes
        :return: True, if state changed, false otherwise
        """
        if self._game_map is None:
            raise ValueError("Movable object is not initialized")
        elif self._position is None:
            # might be captured
            logging.warning("Movable tried to move without position set")
            return MoveVerdict(verdict=MoveVerdictEnum.INACTIVE)

        t = self._game_map.block(self._position).top()
        if type(t) != type(self):
            # I cannot find myself in game map
            raise ValueError(
                f"Cannot find movable object of type {type(self)} in position {self._position} Unexpected type: {type(t)}"
            )

        new_pos = dir_func_map.get(d)(self._position)
        move_info = MoveInfo(direction=d, target=new_pos)
        cell_to_interact = self._game_map.block(new_pos)
        result: MoveVerdict = cell_to_interact.before_step(self, move_info)
        cell_to_interact.after_step(self, move_info)

        if result.verdict == MoveVerdictEnum.MOVE:

            # Original position needs to be saved, because game map overrides it
            # when it moves player object
            original_position = self._position

            self._game_map.move(self._position, new_pos, self)
            result.reports.append(
                MovableMoveReport(position=original_position, target=new_pos))
        elif result.verdict == MoveVerdictEnum.CAPTURED:
            # Movable is captured by something, remove from map
            self._game_map.block(self._position).pop()
            result.reports.append(
                MovableMoveReport(position=self._position,
                                  target=None,
                                  captured=True))
            self._position = None

        return result
Exemple #7
0
    def before_step(self, intruder: AbstractBlock, i: MoveInfo) -> MoveVerdict:
        if self._life <= 0:
            return MoveVerdict(verdict=MoveVerdictEnum.MOVE)

        rock_block_verdict = super(MeltingIceBlock,
                                   self).before_step(intruder, i)

        # Ice only melts if intruder comes from a distance. If they don't have
        # a momentum property, assume that it cannot break
        try:
            if intruder.momentum > 0:
                self._life -= 1
                rock_block_verdict.reports.append(
                    MeltingIceReport(life_was=self._life + 1,
                                     life_now=self._life,
                                     position=i.target))
        except AttributeError:
            # only melt for 'player like' objects
            pass

        return rock_block_verdict
Exemple #8
0
 def before_step(self, intruder: AbstractBlock, _i: MoveInfo) -> MoveVerdict:
     """
     :return: Whether intruder can step on block
     """
     return MoveVerdict(verdict=MoveVerdictEnum.MOVE)
Exemple #9
0
 def before_step(self, intruder: 'AbstractBlock', i : MoveInfo) -> MoveVerdict:
     wall_side = Direction.opposite(i.direction)
     wall = self._walls.get(wall_side)
     if wall is None:
         return MoveVerdict(verdict=MoveVerdictEnum.NO_VERDICT)
     return self._walls[wall_side].before_step(intruder)
Exemple #10
0
 def before_step(self, intruder: 'AbstractBlock') -> MoveVerdict:
     return MoveVerdict(MoveVerdictEnum.NO_VERDICT)
Exemple #11
0
 def before_step(self, intruder: 'AbstractBlock',
                 move_info: MoveInfo) -> MoveVerdict:
     return MoveVerdict(verdict=MoveVerdictEnum.NO_MOVE)
Exemple #12
0
 def before_step(self, intruder: 'AbstractBlock',
                 move_info: MoveInfo) -> MoveVerdict:
     """
     :return: Whether intruder can step on block
     """
     return MoveVerdict(verdict=MoveVerdictEnum.NO_VERDICT)
Exemple #13
0
    def before_step(self, intruder: 'AbstractBlock',
                    i: MoveInfo) -> MoveVerdict:

        # When colliding with another player, that player should not stop,
        # because it might happen, that they move "simultaneously"
        return MoveVerdict(verdict=MoveVerdictEnum.DELAYED)