Mercurial > pyntnclick
annotate gamelib/state.py @ 72:d2250cf40ee7
Fix typo.
author | Simon Cross <hodgestar+bzr@gmail.com> |
---|---|
date | Mon, 23 Aug 2010 21:08:15 +0200 |
parents | 99c5506de7ea |
children | 932b0956e77a |
rev | line source |
---|---|
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
1 """Utilities and base classes for dealing with scenes.""" |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
2 |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
3 from albow.resource import get_image, get_sound |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
4 from albow.utils import frame_rect |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
5 from pygame.locals import BLEND_ADD |
63
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
6 from pygame.rect import Rect |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
7 from pygame.color import Color |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
8 |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
9 import constants |
11 | 10 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
11 |
9
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
12 def initial_state(): |
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
13 """Load the initial state.""" |
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
14 state = State() |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
15 state.load_scenes("cryo") |
56
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
16 state.load_scenes("bridge") |
47
8f1fccb8cadf
Skeletons for scenes in plot outline.
Simon Cross <simon@simonx>
parents:
41
diff
changeset
|
17 #state.load_scenes("mess") |
8f1fccb8cadf
Skeletons for scenes in plot outline.
Simon Cross <simon@simonx>
parents:
41
diff
changeset
|
18 #state.load_scenes("engine") |
8f1fccb8cadf
Skeletons for scenes in plot outline.
Simon Cross <simon@simonx>
parents:
41
diff
changeset
|
19 #state.load_scenes("machine") |
8f1fccb8cadf
Skeletons for scenes in plot outline.
Simon Cross <simon@simonx>
parents:
41
diff
changeset
|
20 #state.load_scenes("map") |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
21 state.set_current_scene("cryo") |
9
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
22 return state |
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
23 |
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
24 |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
25 class State(object): |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
26 """Complete game state. |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
27 |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
28 Game state consists of: |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
29 |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
30 * items |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
31 * scenes |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
32 """ |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
33 |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
34 def __init__(self): |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
35 # map of scene name -> Scene object |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
36 self.scenes = {} |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
37 # map of item name -> Item object |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
38 self.items = {} |
33
f8e02d02c782
Convert inventory to list of item objects.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
32
diff
changeset
|
39 # list of item objects in inventory |
f8e02d02c782
Convert inventory to list of item objects.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
32
diff
changeset
|
40 self.inventory = [] |
63
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
41 # Result of the most recent action |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
42 self.msg = None |
65
cab924519037
Move some description management from widget to state object
Neil Muller <neil@dip.sun.ac.za>
parents:
63
diff
changeset
|
43 self.description = None |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
44 # current scene |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
45 self.current_scene = None |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
46 |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
47 def add_scene(self, scene): |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
48 self.scenes[scene.name] = scene |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
49 |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
50 def add_item(self, item): |
35 | 51 self.items[item.name] = item |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
52 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
53 def load_scenes(self, modname): |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
54 mod = __import__("gamelib.scenes.%s" % (modname,), fromlist=[modname]) |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
55 for scene_cls in mod.SCENES: |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
56 self.add_scene(scene_cls(self)) |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
57 |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
58 def set_current_scene(self, name): |
29
6322d92dc8f0
Add state widget for rendering state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
28
diff
changeset
|
59 self.current_scene = self.scenes[name] |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
60 |
30
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
61 def add_inventory_item(self, name): |
33
f8e02d02c782
Convert inventory to list of item objects.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
32
diff
changeset
|
62 self.inventory.append(self.items[name]) |
30
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
63 |
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
64 def remove_inventory_item(self, name): |
34
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
65 self.inventory.remove(self.items[name]) |
30
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
66 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
67 def draw(self, surface): |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
68 self.current_scene.draw(surface) |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
69 |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
70 def interact(self, item, pos): |
72 | 71 self.current_scene.interact(item, pos) |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
72 |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
73 def mouse_move(self, item, pos): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
74 self.current_scene.mouse_move(item, pos) |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
75 |
63
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
76 def get_message(self): |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
77 return self.msg |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
78 |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
79 def clear_message(self): |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
80 self.msg = None |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
81 |
65
cab924519037
Move some description management from widget to state object
Neil Muller <neil@dip.sun.ac.za>
parents:
63
diff
changeset
|
82 # FIXME: sort out how state.interact and description updating should work |
cab924519037
Move some description management from widget to state object
Neil Muller <neil@dip.sun.ac.za>
parents:
63
diff
changeset
|
83 |
cab924519037
Move some description management from widget to state object
Neil Muller <neil@dip.sun.ac.za>
parents:
63
diff
changeset
|
84 def check_for_new_description(self, pos): |
cab924519037
Move some description management from widget to state object
Neil Muller <neil@dip.sun.ac.za>
parents:
63
diff
changeset
|
85 """Check if the current mouse position causes a new description""" |
cab924519037
Move some description management from widget to state object
Neil Muller <neil@dip.sun.ac.za>
parents:
63
diff
changeset
|
86 old_desc = self.description |
cab924519037
Move some description management from widget to state object
Neil Muller <neil@dip.sun.ac.za>
parents:
63
diff
changeset
|
87 self.description = self.current_scene.check_description(pos) |
cab924519037
Move some description management from widget to state object
Neil Muller <neil@dip.sun.ac.za>
parents:
63
diff
changeset
|
88 return old_desc != self.description |
cab924519037
Move some description management from widget to state object
Neil Muller <neil@dip.sun.ac.za>
parents:
63
diff
changeset
|
89 |
cab924519037
Move some description management from widget to state object
Neil Muller <neil@dip.sun.ac.za>
parents:
63
diff
changeset
|
90 def get_description(self): |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
91 # |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
92 # DEPRECATED |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
93 # |
65
cab924519037
Move some description management from widget to state object
Neil Muller <neil@dip.sun.ac.za>
parents:
63
diff
changeset
|
94 return self.description |
63
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
95 |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
96 def message(self, msg): |
63
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
97 self.msg = msg |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
98 |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
99 |
55
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
100 class StatefulGizmo(object): |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
101 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
102 # initial data (optional, defaults to none) |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
103 INITIAL_DATA = None |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
104 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
105 def __init__(self): |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
106 self.data = {} |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
107 if self.INITIAL_DATA: |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
108 self.data.update(self.INITIAL_DATA) |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
109 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
110 def set_data(self, key, value): |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
111 self.data[key] = value |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
112 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
113 def get_data(self, key): |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
114 return self.data.get(key, None) |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
115 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
116 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
117 class Scene(StatefulGizmo): |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
118 """Base class for scenes.""" |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
119 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
120 # sub-folder to look for resources in |
22 | 121 FOLDER = None |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
122 |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
123 # name of background image resource |
22 | 124 BACKGROUND = None |
125 | |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
126 # name of scene (optional, defaults to folder) |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
127 NAME = None |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
128 |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
129 def __init__(self, state): |
55
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
130 StatefulGizmo.__init__(self) |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
131 # scene name |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
132 self.name = self.NAME if self.NAME is not None else self.FOLDER |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
133 # link back to state object |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
134 self.state = state |
22 | 135 # map of thing names -> Thing objects |
136 self.things = {} | |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
137 self._background = get_image(self.FOLDER, self.BACKGROUND) |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
138 self._current_thing = None |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
139 |
35 | 140 def add_item(self, item): |
141 self.state.add_item(item) | |
142 | |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
143 def add_thing(self, thing): |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
144 self.things[thing.name] = thing |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
145 thing.set_scene(self) |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
146 |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
147 def remove_thing(self, thing): |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
148 del self.things[thing.name] |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
149 |
22 | 150 def draw_background(self, surface): |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
151 surface.blit(self._background, (0, 0), None, BLEND_ADD) |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
152 |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
153 def draw_things(self, surface): |
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
154 for thing in self.things.itervalues(): |
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
155 thing.draw(surface) |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
156 |
22 | 157 def draw(self, surface): |
158 self.draw_background(surface) | |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
159 self.draw_things(surface) |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
160 |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
161 def interact(self, item, pos): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
162 """Interact with a particular position. |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
163 |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
164 Item may be an item in the list of items or None for the hand. |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
165 """ |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
166 for thing in self.things.itervalues(): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
167 if thing.rect.collidepoint(pos): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
168 thing.interact(item) |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
169 break |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
170 |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
171 def mouse_move(self, item, pos): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
172 """Call to check whether the cursor has entered / exited a thing. |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
173 |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
174 Item may be an item in the list of items or None for the hand. |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
175 """ |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
176 if self._current_thing is not None: |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
177 if self._current_thing.rect.collidepoint(pos): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
178 return |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
179 else: |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
180 self._current_thing.leave() |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
181 self._current_thing = None |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
182 for thing in self.things.itervalues(): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
183 if thing.rect.collidepoint(pos): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
184 thing.enter(item) |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
185 self._current_thing = thing |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
186 break |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
187 |
65
cab924519037
Move some description management from widget to state object
Neil Muller <neil@dip.sun.ac.za>
parents:
63
diff
changeset
|
188 def check_description(self, pos): |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
189 # |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
190 # DEPRECATED |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
191 # |
63
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
192 desc = None |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
193 for thing in self.things.itervalues(): |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
194 # Last thing in the list that matches wins |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
195 if Rect(thing.rect).collidepoint(pos): |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
196 desc = thing.get_description() |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
197 return desc |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
198 |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
199 |
55
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
200 class Thing(StatefulGizmo): |
22 | 201 """Base class for things in a scene that you can interact with.""" |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
202 |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
203 # sub-folder to look for resources in |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
204 FOLDER = None |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
205 |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
206 # name of image resource |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
207 IMAGE = None |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
208 |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
209 # Interact rectangle hi-light color (for debugging) |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
210 # (set to None to turn off) |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
211 if constants.DEBUG: |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
212 _interact_hilight_color = Color('Red') |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
213 else: |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
214 _interact_hilight_color = None |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
215 |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
216 def __init__(self, name, rect): |
55
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
217 StatefulGizmo.__init__(self) |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
218 self.name = name |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
219 # area within scene to render to |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
220 self.rect = Rect(rect) |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
221 # area within scene that triggers calls to interact |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
222 self.interact_rect = Rect(rect) |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
223 # these are set by set_scene |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
224 self.scene = None |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
225 self.state = None |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
226 # TODO: add masks |
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
227 # TODO: add images |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
228 |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
229 def set_scene(self, scene): |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
230 assert self.scene is None |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
231 self.scene = scene |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
232 self.state = scene.state |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
233 |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
234 def message(self, msg): |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
235 self.state.message(msg) |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
236 |
63
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
237 def get_description(self): |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
238 return None |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
239 |
56
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
240 def is_interactive(self): |
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
241 return True |
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
242 |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
243 def enter(self, item): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
244 """Called when the cursor enters the Thing.""" |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
245 print "Enter %r -> %r" % (item, self) |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
246 |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
247 def leave(self): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
248 """Called when the cursr leaves the Thing.""" |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
249 print "Leaves %r" % self |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
250 |
22 | 251 def interact(self, item): |
56
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
252 if not self.is_interactive(): |
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
253 return |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
254 if item is None: |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
255 self.interact_without() |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
256 else: |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
257 handler = getattr(self, 'interact_with_' + item.name, None) |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
258 if handler is not None: |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
259 handler(item) |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
260 else: |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
261 self.interact_default(item) |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
262 |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
263 def interact_without(self): |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
264 self.interact_default(None) |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
265 |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
266 def interact_default(self, item): |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
267 self.message("It doesn't work.") |
22 | 268 |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
269 def draw(self, surface): |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
270 if self._interact_hilight_color is not None: |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
271 frame_rect(surface, self._interact_hilight_color, |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
272 self.interact_rect.inflate(1, 1), 1) |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
273 # TODO: draw image if there is one |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
274 |
22 | 275 |
276 class Item(object): | |
277 """Base class for inventory items.""" | |
278 | |
35 | 279 # image for inventory |
280 INVENTORY_IMAGE = None | |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
281 |
35 | 282 def __init__(self, name): |
283 self.name = name | |
284 self.inventory_image = get_image('items', self.INVENTORY_IMAGE) | |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
285 # TODO: needs cursor |
22 | 286 |
34
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
287 def get_inventory_image(self): |
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
288 return self.inventory_image |
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
289 |