Mercurial > parpg-source
view behaviours/npc.py @ 120:adbcdb900fa9
Modified InventoryGrid to set a name for each slot containing the index.
Added getSlot method to InventoryGrid.
Renamed InventoryGUI class to CharacterGUI.
Added InventoryGUI class which handles the inventory part of the CharacterGUI.
An InventoryGUI instance is now created in CharacterGUI.
author | KarstenBock@gmx.net |
---|---|
date | Wed, 05 Oct 2011 12:59:22 +0200 |
parents | 57f1cff9a75d |
children | 90ad38b00f13 |
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 random import randrange from fife import fife import base from moving import MovingAgentBehaviour class NPCBehaviour(MovingAgentBehaviour): """This is a basic NPC behaviour""" def __init__(self, parent=None): super(NPCBehaviour, self).__init__() self.parent = parent self.state = base._AGENT_STATE_NONE self.pc = None self.target_loc = None # hard code these for now self.distRange = (2, 4) # these are parameters to lower the rate of wandering # wander rate is the number of "IDLEs" before a wander step # this could be set for individual NPCs at load time # or thrown out altogether. self.wanderCounter = 0 self.wanderRate = 9 def getTargetLocation(self): """@rtype: fife.Location @return: NPC's position""" x = self.getX() y = self.getY() if self.state == base._AGENT_STATE_WANDER: """ Random Target Location """ l = [0, 0] for i in range(len(l)): sign = randrange(0, 2) dist = randrange(self.distRange[0], self.distRange[1]) if sign == 0: dist *= -1 l[i] = dist x += l[0] y += l[1] # Random walk is # rl = randint(-1, 1);ud = randint(-1, 1);x += rl;y += ud l = fife.Location(self.agent.getLocation()) l.setLayerCoordinates(fife.ModelCoordinate(x, y)) return l def onInstanceActionFinished(self, instance, action): """What the NPC does when it has finished an action. Called by the engine and required for InstanceActionListeners. @type instance: fife.Instance @param instance: self.agent @type action: ??? @param action: ??? @return: None""" if self.state == base._AGENT_STATE_WANDER: self.target_loc = self.getTargetLocation() MovingAgentBehaviour.onInstanceActionFinished(self, instance, action) def idle(self): """Controls the NPC when it is idling. Different actions based on the NPC's state. @return: None""" if self.state == base._AGENT_STATE_NONE: self.state = base._AGENT_STATE_IDLE self.animate('stand') elif self.state == base._AGENT_STATE_IDLE: if self.wanderCounter > self.wanderRate: self.wanderCounter = 0 self.state = base._AGENT_STATE_WANDER else: self.wanderCounter += 1 self.state = base._AGENT_STATE_NONE self.target_loc = self.getTargetLocation() self.animate('stand') elif self.state == base._AGENT_STATE_WANDER: self.wander(self.target_loc) self.state = base._AGENT_STATE_NONE elif self.state == base._AGENT_STATE_TALK: self.animate('stand', self.pc.getLocation()) def wander(self, location): """Nice slow movement for random walking. @type location: fife.Location @param location: Where the NPC will walk to. @return: None""" self.agent.move('walk', location, self.speed - 1)