Пример #1
0
class CharacterBase(GameObject, Living, CharStats):
    """Base class for Characters"""

    def __init__(self, ID, agent_layer=None, inventory=None, text="", **kwargs):
        GameObject.__init__(self, ID, text=text, **kwargs)
        Living.__init__(self, **kwargs)
        CharStats.__init__(self, **kwargs)

        self.behaviour = None

        if inventory == None:
            self.inventory = Inventory()
        else:
            self.inventory = inventory

        self.state = _AGENT_STATE_NONE
        self.layer_id = agent_layer.getId()
        self.createBehaviour(agent_layer)

    def createBehaviour(self, layer):
        """Creates the behaviour for this actor.
           @return: None"""
        pass

    def setup(self):
        """@return: None"""
        self.behaviour.attachToLayer(self.ID)

    def start(self):
        """@return: None"""
        self.behaviour.idle()

    def teleport(self, location):
        """Teleports a Character instantly to the given location.
           @type location: fife.Location
           @param location: Target coordinates for Character.
           @return: None"""
        self.state = _AGENT_STATE_IDLE
        self.behaviour.nextAction = None
        self.behaviour.agent.setLocation(location)

    def give(self, item, actor):
        """Gives the specified item to the different actor. Raises an exception if the item was invalid or not found
           @type item: Carryable
           @param item: The item object to give
           @param actor: Person to give item to"""
        if item == None:
            raise ValueError("I don't have %s" % item.name)
        self.inventory.takeItem(item)
        actor.inventory.placeItem(item)

    def hasItem(self, item_type):
        """Returns wether an item is present in the players inventory or not
        @param item_type: ID of the item
        @type item_type: str
        @return: True when the item is present, False when not"""
        return self.inventory.findItem(item_type=item_type)

    def itemCount(self, item_type=""):
        """Returns number of all items or items specified by item_type 
        the player has.
        @param item_type: ID of the item, can be empty
        @type item_type: str
        @return: Number of items"""
        return self.inventory.count(item_type)

    def getLocation(self):
        """Get the NPC's position as a fife.Location object. Basically a
           wrapper.
           @rtype: fife.Location
           @return: the location of the NPC"""
        return self.behaviour.agent.getLocation()

    def run(self, location):
        """Makes the PC run to a certain location
           @type location: fife.ScreenPoint
           @param location: Screen position to run to.
           @return: None"""
        self.state = _AGENT_STATE_RUN
        self.behaviour.nextAction = None
        self.behaviour.agent.move("run", location, self.behaviour.speed + 1)

    def walk(self, location):
        """Makes the PC walk to a certain location.
           @type location: fife.ScreenPoint
           @param location: Screen position to walk to.
           @return: None"""
        self.state = _AGENT_STATE_RUN
        self.behaviour.nextAction = None
        self.behaviour.agent.move("walk", location, self.behaviour.speed - 1)

    def getStateForSaving(self):
        """Returns state for saving
        """
        ret_dict = GameObject.getStateForSaving(self)
        ret_dict["Inventory"] = self.inventory.serializeInventory()
        return ret_dict

    def _getCoords(self):
        """Get-er property function"""
        return (self.getLocation().getMapCoordinates().x, self.getLocation().getMapCoordinates().y)

    def _setCoords(self, coords):
        """Set-er property function"""
        map_coords = self.getLocation().getMapCoordinates()
        map_coords.X, map_coords.Y = float(coords[0]), float(coords[1])
        self.teleport(map_coords)

    coords = property(
        _getCoords,
        _setCoords,
        doc="Property allowing you to get and set the object's \
                coordinates via tuples",
    )