Browse code
ais wait for player to move
edwlan authored on 01/08/2013 21:12:37
Showing 4 changed files
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 |
|
... | ... |
@@ -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): |