Mercurial > parpg-core
view src/parpg/behaviours/base.py @ 145:3dddf09377b8
"Open" will now not be shown in the context menu when the lockable is locked.
"Lock" will not not be shown in the context menu when the lockable is open.
author | KarstenBock@gmx.net |
---|---|
date | Mon, 03 Oct 2011 14:12:17 +0200 |
parents | ecac92680bef |
children | 5d52f08633c0 |
line wrap: on
line source
# This file is part of PARPG. # PARPG is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # PARPG is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with PARPG. If not, see <http://www.gnu.org/licenses/>. from collections import deque from fife import fife _AGENT_STATE_NONE, _AGENT_STATE_IDLE, _AGENT_STATE_APPROACH, _AGENT_STATE_RUN, _AGENT_STATE_WANDER, _AGENT_STATE_TALK = xrange(6) class BaseBehaviour (fife.InstanceActionListener): """Fife agent listener""" def __init__(self): fife.InstanceActionListener.__init__(self) self.agent = None self.state = None self.animation_queue = deque() self.nextAction = None def attachToLayer(self, agent_ID, layer): """Attaches to a certain layer @type agent_ID: String @param agent_ID: ID of the layer to attach to. @type layer: Fife layer @param layer: Layer of the agent to attach the behaviour to @return: None""" self.agent = layer.getInstance(agent_ID) self.agent.addActionListener(self) self.state = _AGENT_STATE_NONE def getX(self): """Get the NPC's x position on the map. @rtype: integer" @return: the x coordinate of the NPC's location""" return self.agent.getLocation().getLayerCoordinates().x def getY(self): """Get the NPC's y position on the map. @rtype: integer @return: the y coordinate of the NPC's location""" return self.agent.getLocation().getLayerCoordinates().y def onNewMap(self, layer): """Sets the agent onto the new layer.""" if self.agent is not None: self.agent.removeActionListener(self) self.agent = layer.getInstance(self.parent.general.identifier) self.agent.addActionListener(self) self.state = _AGENT_STATE_NONE def idle(self): """@return: None""" self.state = _AGENT_STATE_IDLE def onInstanceActionFinished(self, instance, action): """@type instance: ??? @param instance: ??? @type action: ??? @param action: ??? @return: None""" # First we reset the next behavior act = self.nextAction self.nextAction = None self.idle() if act: act.execute() try: animtion = self.animation_queue.popleft() self.animate(**animtion) except IndexError: self.idle() def getLocation(self): """Get the agents position as a fife.Location object. @rtype: fife.Location @return: the location of the agent""" return self.agent.getLocation() def talk(self, pc): """Makes the agent ready to talk to the PC @return: None""" self.state = _AGENT_STATE_TALK self.pc = pc.behaviour.agent self.clear_animations() self.idle() def animate(self, action, direction = None, repeating = False): """Perform an animation""" direction = direction or self.agent.getFacingLocation() self.agent.act(action, direction, repeating) def queue_animation(self, action, direction = None, repeating = False): """Add an action to the queue""" self.animation_queue.append({"action": action, "direction": direction, "repeating": repeating}) def clear_animations(self): """Remove all actions from the queue""" self.animation_queue.clear()