git.fiddlerwoaroof.com
Browse code

ais wait for player to move

edwlan authored on 01/08/2013 21:12:37
Showing 4 changed files
... ...
@@ -14,6 +14,7 @@ class Overlay(object):
14 14
 	def pos(self):
15 15
 		return self.x, self.y
16 16
 	def __init__(self, x,y, map):
17
+		super(Overlay, self).__init__()
17 18
 		print self.handled_events
18 19
 		self.events = collections.OrderedDict()
19 20
 		self.x = x
... ...
@@ -32,10 +33,7 @@ class Overlay(object):
32 33
 		self.events.setdefault(event, []).append(cb)
33 34
 
34 35
 	def trigger_event(self, event, *args, **kw):
35
-		if event not in self.events:
36
-			raise ValueError('%r has no event %r' % (self, event))
37
-
38
-		for cb in self.events[event]:
36
+		for cb in self.events.get(event, []):
39 37
 			result = cb(self, *args, **kw)
40 38
 			result = result is None or result # if the event returns a false value besides None, break
41 39
 			if result == False: break
... ...
@@ -95,6 +93,7 @@ class Actor(Overlay):
95 93
 			self.char = ord('%')
96 94
 			self.blocks = False
97 95
 		else:
96
+			self.act()
98 97
 			ractions = {}
99 98
 			for nleft, actions in self.repeated_actions.items():
100 99
 				for (action,args,kwargs) in actions:
... ...
@@ -102,9 +101,12 @@ class Actor(Overlay):
102 101
 					action(*args, **kwargs)
103 102
 					if nleft > 1:
104 103
 						ractions.setdefault(nleft-1, []).append( (action,args,kwargs) )
104
+				print ractions
105 105
 			self.repeated_actions = ractions
106 106
 		return result
107 107
 
108
+	def act(self): pass
109
+
108 110
 	def ishostile(self, other):
109 111
 		return self.adventurer.state < 2 #TODO: implement factions
110 112
 
... ...
@@ -134,6 +136,12 @@ class Actor(Overlay):
134 136
 	def bumped_by(self, other):
135 137
 		print '%s was bumped by %s' % (type(self).__name__, type(other).__name__)
136 138
 
139
+import random
140
+class AIActor(Actor):
141
+	def act(self):
142
+		print 'wiggly %s' % self.adventurer.name
143
+		self.move(random.choice([-1,0,1]), random.choice([-1,0,1]))
144
+
137 145
 @Overlay.add_event('picked_up',  'picked_up_by')
138 146
 @Overlay.add_event('bumped',  'bumped_by')
139 147
 class Object(Overlay):
... ...
@@ -46,7 +46,8 @@ class Application(object):
46 46
 
47 47
 		self.actors = [self.player]
48 48
 		for x in range(40):
49
-			self.actors.append(overlay.Actor(random.randrange(WIDTH), random.randrange(HEIGHT), self.map))
49
+			self.actors.append(overlay.AIActor(random.randrange(WIDTH), random.randrange(HEIGHT), self.map))
50
+		self.player.register_event('update', self.tick_actors)
50 51
 
51 52
 		self.objects = []
52 53
 		for x in range(50):
... ...
@@ -54,9 +55,19 @@ class Application(object):
54 55
 
55 56
 		tc.sys_set_fps(30)
56 57
 
58
+	def tick_actor(self, actor):
59
+		keep = actor.tick()
60
+		if not keep:
61
+			self.actors.remove(actor)
62
+			self.objects.append(actor)
63
+
57 64
 	def update_actors(self):
65
+		self.player.tick()
66
+
67
+	def tick_actors(self, player):
68
+		print 'actor_tick'
58 69
 		to_pop = []
59
-		for idx,actor in enumerate(self.actors):
70
+		for idx,actor in enumerate(self.actors[1:],1):
60 71
 			if not actor.tick():
61 72
 				bisect.insort(to_pop, idx)
62 73
 		for pop in reversed(to_pop):
... ...
@@ -67,7 +78,6 @@ class Application(object):
67 78
 		self.screen.init("test")
68 79
 		self.message_console.fill(0,0,128)
69 80
 		#self.player.draw()
70
-		self.update_actors()
71 81
 		for overlay in self.actors + self.objects:
72 82
 			overlay.draw()
73 83
 
... ...
@@ -128,6 +128,7 @@ class Map(object):
128 128
 		color_mask = np.ones( (con.width, con.height, 3) )
129 129
 		char_mask = np.ones( (con.width, con.height) ).astype('bool')
130 130
 
131
+		self.pov = None
131 132
 		if self.pov is not None:
132 133
 			origin, radius = self.pov
133 134
 			ox, oy = origin
... ...
@@ -2,6 +2,14 @@ import libtcodpy as tc
2 2
 import libs.combat
3 3
 import libs.overlay
4 4
 
5
+def trigger_update(func):
6
+	def _inner(self, *a, **kw):
7
+		self.trigger_event('preupdate')
8
+		result = func(self, *a, **kw)
9
+		self.trigger_event('update')
10
+		return result
11
+	return _inner
12
+
5 13
 class Player(libs.overlay.Actor):
6 14
 	char = ord('@')
7 15
 	color = (255,255,255)
... ...
@@ -11,14 +19,16 @@ class Player(libs.overlay.Actor):
11 19
 		print 'Player\'s name is %s' % self.adventurer.name
12 20
 		self.map.set_pov((self.pos, self.light_radius))
13 21
 		self.display = None
22
+
23
+	@trigger_update
14 24
 	def move(self, dx, dy):
15 25
 		libs.overlay.Actor.move(self, dx,dy)
16 26
 		self.map.set_pov((self.pos, self.light_radius))
17 27
 
18 28
 	def claim_display(self, display):
19 29
 		self.display = display
30
+
20 31
 	def tick(self):
21
-		print 'player_tick'
22 32
 		return libs.overlay.Actor.tick(self)
23 33
 
24 34
 class ArrowHandler(object):