annotate src/parpg/behaviours/npc.py @ 150:3fc7cfa80771

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 ecac92680bef
children 704145b96171
rev   line source
133
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
1 # This file is part of PARPG.
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
2
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
3 # PARPG is free software: you can redistribute it and/or modify
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
4 # it under the terms of the GNU General Public License as published by
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
5 # the Free Software Foundation, either version 3 of the License, or
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
6 # (at your option) any later version.
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
7
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
8 # PARPG is distributed in the hope that it will be useful,
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
11 # GNU General Public License for more details.
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
12
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
13 # You should have received a copy of the GNU General Public License
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
14 # along with PARPG. If not, see <http://www.gnu.org/licenses/>.
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
15
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
16 from random import randrange
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
17
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
18 from fife import fife
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
19
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
20 import base
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
21 from moving import MovingAgentBehaviour
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
22
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
23 class NPCBehaviour(MovingAgentBehaviour):
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
24 """This is a basic NPC behaviour"""
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
25 def __init__(self, parent=None):
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
26 super(NPCBehaviour, self).__init__()
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
27
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
28 self.parent = parent
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
29 self.state = base._AGENT_STATE_NONE
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
30 self.pc = None
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
31 self.target_loc = None
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
32
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
33 # hard code these for now
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
34 self.distRange = (2, 4)
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
35 # these are parameters to lower the rate of wandering
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
36 # wander rate is the number of "IDLEs" before a wander step
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
37 # this could be set for individual NPCs at load time
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
38 # or thrown out altogether.
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
39 self.wanderCounter = 0
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
40 self.wanderRate = 9
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
41
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
42 def getTargetLocation(self):
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
43 """@rtype: fife.Location
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
44 @return: NPC's position"""
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
45 x = self.getX()
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
46 y = self.getY()
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
47 if self.state == base._AGENT_STATE_WANDER:
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
48 """ Random Target Location """
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
49 l = [0, 0]
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
50 for i in range(len(l)):
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
51 sign = randrange(0, 2)
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
52 dist = randrange(self.distRange[0], self.distRange[1])
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
53 if sign == 0:
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
54 dist *= -1
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
55 l[i] = dist
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
56 x += l[0]
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
57 y += l[1]
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
58 # Random walk is
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
59 # rl = randint(-1, 1);ud = randint(-1, 1);x += rl;y += ud
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
60 l = fife.Location(self.agent.getLocation())
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
61 l.setLayerCoordinates(fife.ModelCoordinate(x, y))
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
62 return l
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
63
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
64 def onInstanceActionFinished(self, instance, action):
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
65 """What the NPC does when it has finished an action.
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
66 Called by the engine and required for InstanceActionListeners.
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
67 @type instance: fife.Instance
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
68 @param instance: self.agent
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
69 @type action: ???
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
70 @param action: ???
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
71 @return: None"""
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
72 if self.state == base._AGENT_STATE_WANDER:
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
73 self.target_loc = self.getTargetLocation()
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
74 MovingAgentBehaviour.onInstanceActionFinished(self, instance, action)
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
75
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
76
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
77 def idle(self):
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
78 """Controls the NPC when it is idling. Different actions
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
79 based on the NPC's state.
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
80 @return: None"""
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
81 if self.state == base._AGENT_STATE_NONE:
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
82 self.state = base._AGENT_STATE_IDLE
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
83 self.animate('stand')
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
84 elif self.state == base._AGENT_STATE_IDLE:
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
85 if self.wanderCounter > self.wanderRate:
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
86 self.wanderCounter = 0
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
87 self.state = base._AGENT_STATE_WANDER
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
88 else:
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
89 self.wanderCounter += 1
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
90 self.state = base._AGENT_STATE_NONE
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
91
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
92 self.target_loc = self.getTargetLocation()
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
93 self.animate('stand')
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
94 elif self.state == base._AGENT_STATE_WANDER:
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
95 self.wander(self.target_loc)
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
96 self.state = base._AGENT_STATE_NONE
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
97 elif self.state == base._AGENT_STATE_TALK:
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
98 self.animate('stand', self.pc.getLocation())
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
99
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
100 def wander(self, location):
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
101 """Nice slow movement for random walking.
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
102 @type location: fife.Location
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
103 @param location: Where the NPC will walk to.
ecac92680bef Added animation queue and method the base behaviour class.
KarstenBock@gmx.net
parents: 83
diff changeset
104 @return: None"""
74
47e1345fbac2 Fixed NPC behaviour. NPCs are wandering around again.
KarstenBock@gmx.net
parents: 73
diff changeset
105 self.agent.move('walk', location, self.speed - 1)