Mercurial > pyntnclick
annotate gamelib/state.py @ 167:5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
author | Neil Muller <neil@dip.sun.ac.za> |
---|---|
date | Wed, 25 Aug 2010 12:21:16 +0200 |
parents | 0db92b3b5833 |
children | c6ea3b11514c |
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 |
107
5213b45fcc7e
Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents:
105
diff
changeset
|
3 from albow.resource import get_image |
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 |
133
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
5 from widgets import BoomLabel |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
6 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
|
7 from pygame.rect import Rect |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
8 from pygame.surface import Surface |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
9 from pygame.color import Color |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
10 |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
11 import constants |
107
5213b45fcc7e
Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents:
105
diff
changeset
|
12 from sound import get_sound |
129
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
13 from cursor import HAND |
11 | 14 |
124 | 15 |
78 | 16 class Result(object): |
17 """Result of interacting with a thing""" | |
18 | |
133
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
19 def __init__(self, message=None, soundfile=None, detail_view=None): |
78 | 20 self.message = message |
107
5213b45fcc7e
Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents:
105
diff
changeset
|
21 self.sound = None |
5213b45fcc7e
Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents:
105
diff
changeset
|
22 if soundfile: |
5213b45fcc7e
Initial event sound support
Neil Muller <neil@dip.sun.ac.za>
parents:
105
diff
changeset
|
23 self.sound = get_sound(soundfile) |
133
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
24 self.detail_view = detail_view |
78 | 25 |
133
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
26 def process(self, scene_widget): |
126
f125bb60d7de
Move result handling to result object
Neil Muller <neil@dip.sun.ac.za>
parents:
125
diff
changeset
|
27 """Helper function to do the right thing with a result object""" |
f125bb60d7de
Move result handling to result object
Neil Muller <neil@dip.sun.ac.za>
parents:
125
diff
changeset
|
28 if self.sound: |
f125bb60d7de
Move result handling to result object
Neil Muller <neil@dip.sun.ac.za>
parents:
125
diff
changeset
|
29 self.sound.play() |
f125bb60d7de
Move result handling to result object
Neil Muller <neil@dip.sun.ac.za>
parents:
125
diff
changeset
|
30 if self.message: |
133
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
31 scene_widget.show_message(self.message) |
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
32 if self.detail_view: |
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
33 scene_widget.show_detail(self.detail_view) |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
34 |
129
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
35 def initial_state(screen): |
9
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
36 """Load the initial state.""" |
129
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
37 state = State(screen) |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
38 state.load_scenes("cryo") |
56
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
39 state.load_scenes("bridge") |
132
686bb74a52f8
Map shows accessible areas.
Jeremy Thurgood <firxen@gmail.com>
parents:
130
diff
changeset
|
40 state.load_scenes("mess") |
150
5e5d71e40e54
Add bridge and mess to map and ways back.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
139
diff
changeset
|
41 state.load_scenes("engine") |
5e5d71e40e54
Add bridge and mess to map and ways back.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
139
diff
changeset
|
42 state.load_scenes("machine") |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
43 state.load_scenes("map") |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
44 state.set_current_scene("cryo") |
120 | 45 state.set_do_enter_leave() |
9
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
46 return state |
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
47 |
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
48 |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
49 class State(object): |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
50 """Complete game state. |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
51 |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
52 Game state consists of: |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
53 |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
54 * items |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
55 * scenes |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
56 """ |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
57 |
129
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
58 def __init__(self, screen): |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
59 # map of scene name -> Scene object |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
60 self.scenes = {} |
93
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
61 # map of detail view name -> DetailView object |
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
62 self.detail_views = {} |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
63 # map of item name -> Item object |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
64 self.items = {} |
33
f8e02d02c782
Convert inventory to list of item objects.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
32
diff
changeset
|
65 # list of item objects in inventory |
f8e02d02c782
Convert inventory to list of item objects.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
32
diff
changeset
|
66 self.inventory = [] |
73 | 67 # currently selected tool (item) |
68 self.tool = None | |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
69 # current scene |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
70 self.current_scene = None |
93
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
71 # current detail view |
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
72 self.current_detail = None |
120 | 73 # scene we came from, for enter and leave processing |
74 self.previous_scene = None | |
75 # scene transion helpers | |
76 self.do_check = None | |
77 self.old_pos = None | |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
78 |
129
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
79 self.screen = screen |
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
80 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
81 def add_scene(self, scene): |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
82 self.scenes[scene.name] = scene |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
83 |
93
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
84 def add_detail_view(self, detail_view): |
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
85 self.detail_views[detail_view.name] = detail_view |
350ce4ebe122
Detail view without any functionality.
Jeremy Thurgood <firxen@gmail.com>
parents:
88
diff
changeset
|
86 |
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
|
87 def add_item(self, item): |
35 | 88 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
|
89 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
90 def load_scenes(self, modname): |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
91 mod = __import__("gamelib.scenes.%s" % (modname,), fromlist=[modname]) |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
92 for scene_cls in mod.SCENES: |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
93 self.add_scene(scene_cls(self)) |
119
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
94 if hasattr(mod, 'DETAIL_VIEWS'): |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
95 for scene_cls in mod.DETAIL_VIEWS: |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
96 self.add_detail_view(scene_cls(self)) |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
97 |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
98 def set_current_scene(self, name): |
120 | 99 old_scene = self.current_scene |
29
6322d92dc8f0
Add state widget for rendering state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
28
diff
changeset
|
100 self.current_scene = self.scenes[name] |
120 | 101 if old_scene and old_scene != self.current_scene: |
102 self.previous_scene = old_scene | |
103 self.set_do_enter_leave() | |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
104 |
119
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
105 def set_current_detail(self, name): |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
106 if name is None: |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
107 self.current_detail = None |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
108 else: |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
109 self.current_detail = self.detail_views[name] |
136
d264850806dc
Better description handling in detail windows. (Sort of.)
Jeremy Thurgood <firxen@gmail.com>
parents:
135
diff
changeset
|
110 self.current_scene._current_description = None |
161
5184d30669b5
Fix handling of state on detail view dismissal.
Jeremy Thurgood <firxen@gmail.com>
parents:
150
diff
changeset
|
111 self.current_scene._current_thing = None |
125
d3ca34a664fd
Some detail view and data cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
124
diff
changeset
|
112 return self.current_detail.get_detail_size() |
119
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
113 |
30
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
114 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
|
115 self.inventory.append(self.items[name]) |
30
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
116 |
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
117 def remove_inventory_item(self, name): |
34
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
118 self.inventory.remove(self.items[name]) |
117
139864ce8bdb
removed items can't be the current tool
Neil Muller <neil@dip.sun.ac.za>
parents:
107
diff
changeset
|
119 # Unselect tool if it's removed |
139864ce8bdb
removed items can't be the current tool
Neil Muller <neil@dip.sun.ac.za>
parents:
107
diff
changeset
|
120 if self.tool == self.items[name]: |
139864ce8bdb
removed items can't be the current tool
Neil Muller <neil@dip.sun.ac.za>
parents:
107
diff
changeset
|
121 self.set_tool(None) |
30
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
122 |
167
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
123 def replace_inventory_item(self, old_item, new_item): |
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
124 """Try to replace an item in the inventory with a new one""" |
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
125 try: |
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
126 index = self.inventory.index(old_item) |
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
127 self.inventory[index] = new_item |
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
128 if self.tool == old_item: |
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
129 self.set_tool(new_item) |
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
130 except ValueError: |
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
131 return False |
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
132 return True |
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
133 |
73 | 134 def set_tool(self, item): |
135 self.tool = item | |
129
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
136 if item is None: |
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
137 self.screen.set_cursor(HAND) |
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
138 else: |
4223d66d88b4
Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents:
127
diff
changeset
|
139 self.screen.set_cursor(item.CURSOR) |
73 | 140 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
141 def draw(self, surface): |
120 | 142 if self.do_check and self.previous_scene and self.do_check == constants.LEAVE: |
143 # We still need to handle leave events, so still display the scene | |
144 self.previous_scene.draw(surface) | |
145 else: | |
146 self.current_scene.draw(surface) | |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
147 |
119
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
148 def draw_detail(self, surface): |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
149 self.current_detail.draw(surface) |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
150 |
73 | 151 def interact(self, pos): |
78 | 152 return self.current_scene.interact(self.tool, pos) |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
153 |
119
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
154 def interact_detail(self, pos): |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
155 return self.current_detail.interact(self.tool, pos) |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
156 |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
157 def animate(self): |
120 | 158 if not self.do_check: |
159 return self.current_scene.animate() | |
160 | |
161 def check_enter_leave(self): | |
162 if not self.do_check: | |
163 return None | |
164 if self.do_check == constants.LEAVE: | |
165 self.do_check = constants.ENTER | |
166 if self.previous_scene: | |
167 return self.previous_scene.leave() | |
168 return None | |
169 elif self.do_check == constants.ENTER: | |
170 self.do_check = None | |
171 # Fix descriptions, etc. | |
172 if self.old_pos: | |
173 self.current_scene.mouse_move(self.tool, self.old_pos) | |
174 return self.current_scene.enter() | |
175 raise RuntimeError('invalid do_check value %s' % self.do_check) | |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
176 |
73 | 177 def mouse_move(self, pos): |
178 self.current_scene.mouse_move(self.tool, pos) | |
120 | 179 # So we can do sensible things on enter and leave |
180 self.old_pos = pos | |
181 | |
182 def set_do_enter_leave(self): | |
183 """Flag that we need to run the enter loop""" | |
184 self.do_check = constants.LEAVE | |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
185 |
119
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
186 def mouse_move_detail(self, pos): |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
187 self.current_detail.mouse_move(self.tool, pos) |
d5f7cccfdb6c
Hook up "detail view" scenes.
Jeremy Thurgood <firxen@gmail.com>
parents:
117
diff
changeset
|
188 |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
189 |
55
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
190 class StatefulGizmo(object): |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
191 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
192 # initial data (optional, defaults to none) |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
193 INITIAL_DATA = None |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
194 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
195 def __init__(self): |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
196 self.data = {} |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
197 if self.INITIAL_DATA: |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
198 self.data.update(self.INITIAL_DATA) |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
199 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
200 def set_data(self, key, value): |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
201 self.data[key] = value |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
202 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
203 def get_data(self, key): |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
204 return self.data.get(key, None) |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
205 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
206 |
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
207 class Scene(StatefulGizmo): |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
208 """Base class for scenes.""" |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
209 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
210 # sub-folder to look for resources in |
22 | 211 FOLDER = None |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
212 |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
213 # name of background image resource |
22 | 214 BACKGROUND = None |
215 | |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
216 # name of scene (optional, defaults to folder) |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
217 NAME = None |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
218 |
125
d3ca34a664fd
Some detail view and data cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
124
diff
changeset
|
219 # size (for detail views) |
d3ca34a664fd
Some detail view and data cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
124
diff
changeset
|
220 SIZE = constants.SCENE_SIZE |
d3ca34a664fd
Some detail view and data cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
124
diff
changeset
|
221 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
222 def __init__(self, state): |
55
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
223 StatefulGizmo.__init__(self) |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
224 # scene name |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
225 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
|
226 # link back to state object |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
227 self.state = state |
22 | 228 # map of thing names -> Thing objects |
229 self.things = {} | |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
230 if self.BACKGROUND is not None: |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
231 self._background = get_image(self.FOLDER, self.BACKGROUND) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
232 else: |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
233 self._background = None |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
234 self._current_thing = None |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
235 self._current_description = None |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
236 |
35 | 237 def add_item(self, item): |
238 self.state.add_item(item) | |
239 | |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
240 def add_thing(self, thing): |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
241 self.things[thing.name] = thing |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
242 thing.set_scene(self) |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
243 |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
244 def remove_thing(self, thing): |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
245 del self.things[thing.name] |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
246 |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
247 def _make_description(self, text): |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
248 if text is None: |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
249 return None |
79
d7c0a702a0b4
Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
78
diff
changeset
|
250 label = BoomLabel(text) |
d7c0a702a0b4
Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
78
diff
changeset
|
251 label.set_margin(5) |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
252 label.border_width = 1 |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
253 label.border_color = (0, 0, 0) |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
254 label.bg_color = (127, 127, 127) |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
255 label.fg_color = (0, 0, 0) |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
256 return label |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
257 |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
258 def draw_description(self, surface): |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
259 if self._current_description is not None: |
137
17411b984dc2
Fix descriptions. And call Demeter's police down upon me.
Jeremy Thurgood <firxen@gmail.com>
parents:
136
diff
changeset
|
260 sub = self.state.screen.get_root().surface.subsurface( |
77
bb7c8072f8c0
Some hacks to make Label work.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
76
diff
changeset
|
261 Rect(5, 5, *self._current_description.size)) |
bb7c8072f8c0
Some hacks to make Label work.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
76
diff
changeset
|
262 self._current_description.draw_all(sub) |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
263 |
22 | 264 def draw_background(self, surface): |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
265 if self._background is not None: |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
266 surface.blit(self._background, (0, 0), None) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
267 else: |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
268 surface.fill((200, 200, 200)) |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
269 |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
270 def draw_things(self, surface): |
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
271 for thing in self.things.itervalues(): |
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
272 thing.draw(surface) |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
273 |
22 | 274 def draw(self, surface): |
275 self.draw_background(surface) | |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
276 self.draw_things(surface) |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
277 self.draw_description(surface) |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
278 |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
279 def interact(self, item, pos): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
280 """Interact with a particular position. |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
281 |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
282 Item may be an item in the list of items or None for the hand. |
78 | 283 |
284 Returns a Result object to provide feedback to the player. | |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
285 """ |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
286 for thing in self.things.itervalues(): |
94
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
287 if thing.contains(pos): |
78 | 288 result = thing.interact(item) |
289 if result: | |
290 if self._current_thing: | |
291 # Also update descriptions if needed | |
292 self._current_description = self._make_description( | |
293 self._current_thing.get_description()) | |
294 return result | |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
295 |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
296 def animate(self): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
297 """Animate all the things in the scene. |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
298 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
299 Return true if any of them need to queue a redraw""" |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
300 result = False |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
301 for thing in self.things.itervalues(): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
302 if thing.animate(): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
303 result = True |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
304 return result |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
305 |
120 | 306 def enter(self): |
307 return None | |
308 | |
309 def leave(self): | |
310 self._current_description = None | |
311 return None | |
312 | |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
313 def mouse_move(self, item, pos): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
314 """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
|
315 |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
316 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
|
317 """ |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
318 if self._current_thing is not None: |
94
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
319 if self._current_thing.contains(pos): |
139
a5972444ad1e
Improve cursor state handling, disable highlights on modal dialogs
Stefano Rivera <stefano@rivera.za.net>
parents:
137
diff
changeset
|
320 self.state.screen.cursor_highlight(True) |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
321 return |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
322 else: |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
323 self._current_thing.leave() |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
324 self._current_thing = None |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
325 self._current_description = None |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
326 for thing in self.things.itervalues(): |
94
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
327 if thing.contains(pos): |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
328 thing.enter(item) |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
329 self._current_thing = thing |
76
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
330 self._current_description = self._make_description( |
1a5fdc225939
Add description rendering to scene rendering.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
75
diff
changeset
|
331 thing.get_description()) |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
332 break |
139
a5972444ad1e
Improve cursor state handling, disable highlights on modal dialogs
Stefano Rivera <stefano@rivera.za.net>
parents:
137
diff
changeset
|
333 self.state.screen.cursor_highlight(self._current_thing is not None) |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
334 |
125
d3ca34a664fd
Some detail view and data cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
124
diff
changeset
|
335 def get_detail_size(self): |
127
9646e7c8bb97
Size detail window based on the Scene background image.
Jeremy Thurgood <firxen@gmail.com>
parents:
126
diff
changeset
|
336 return self._background.get_size() |
125
d3ca34a664fd
Some detail view and data cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents:
124
diff
changeset
|
337 |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
338 |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
339 class Interact(object): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
340 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
341 def __init__(self, image, rect, interact_rect): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
342 self.image = image |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
343 self.rect = rect |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
344 self.interact_rect = interact_rect |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
345 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
346 def set_thing(self, thing): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
347 pass |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
348 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
349 def draw(self, surface): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
350 if self.image is not None: |
88
053bc8e167fc
Don't render with BLEND_ADD, use normal overlay.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
86
diff
changeset
|
351 surface.blit(self.image, self.rect, None) |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
352 |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
353 def animate(self): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
354 return False |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
355 |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
356 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
357 class InteractNoImage(Interact): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
358 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
359 def __init__(self, x, y, w, h): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
360 super(InteractNoImage, self).__init__(None, None, Rect(x, y, w, h)) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
361 |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
362 |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
363 class InteractText(Interact): |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
364 """Display box with text to interact with -- mostly for debugging.""" |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
365 |
132
686bb74a52f8
Map shows accessible areas.
Jeremy Thurgood <firxen@gmail.com>
parents:
130
diff
changeset
|
366 def __init__(self, x, y, text, bg_color=None): |
686bb74a52f8
Map shows accessible areas.
Jeremy Thurgood <firxen@gmail.com>
parents:
130
diff
changeset
|
367 if bg_color is None: |
686bb74a52f8
Map shows accessible areas.
Jeremy Thurgood <firxen@gmail.com>
parents:
130
diff
changeset
|
368 bg_color = (127, 127, 127) |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
369 label = BoomLabel(text) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
370 label.set_margin(5) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
371 label.border_width = 1 |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
372 label.border_color = (0, 0, 0) |
132
686bb74a52f8
Map shows accessible areas.
Jeremy Thurgood <firxen@gmail.com>
parents:
130
diff
changeset
|
373 label.bg_color = bg_color |
130
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
374 label.fg_color = (0, 0, 0) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
375 image = Surface(label.size) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
376 rect = Rect((x, y), label.size) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
377 label.draw_all(image) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
378 super(InteractText, self).__init__(image, rect, rect) |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
379 |
11afefc4aeaf
InteractText for mocking up scenes. Allow backgrounds to be None. Mock up map.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
129
diff
changeset
|
380 |
94
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
381 class InteractRectUnion(Interact): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
382 |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
383 def __init__(self, rect_list): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
384 # pygame.rect.Rect.unionall should do this, but is broken |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
385 # in some pygame versions (including 1.8, it appears) |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
386 rect_list = [Rect(x) for x in rect_list] |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
387 union_rect = rect_list[0] |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
388 for rect in rect_list[1:]: |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
389 union_rect = union_rect.union(rect) |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
390 super(InteractRectUnion, self).__init__(None, None, union_rect) |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
391 self.interact_rect = rect_list |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
392 |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
393 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
394 class InteractImage(Interact): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
395 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
396 def __init__(self, x, y, image_name): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
397 super(InteractImage, self).__init__(None, None, None) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
398 self._pos = (x, y) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
399 self._image_name = image_name |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
400 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
401 def set_thing(self, thing): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
402 self.image = get_image(thing.folder, self._image_name) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
403 self.rect = Rect(self._pos, self.image.get_size()) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
404 self.interact_rect = self.rect |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
405 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
406 |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
407 class InteractAnimated(Interact): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
408 """Interactive with an animation rather than an image""" |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
409 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
410 # FIXME: Assumes all images are the same size |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
411 # anim_seq - sequence of image names |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
412 # delay - number of frames to wait between changing images |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
413 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
414 def __init__(self, x, y, anim_seq, delay): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
415 self._pos = (x, y) |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
416 self._anim_pos = 0 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
417 self._names = anim_seq |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
418 self._frame_count = 0 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
419 self._anim_seq = None |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
420 self._delay = delay |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
421 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
422 def set_thing(self, thing): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
423 self._anim_seq = [get_image(thing.folder, x) for x in self._names] |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
424 self.image = self._anim_seq[0] |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
425 self.rect = Rect(self._pos, self.image.get_size()) |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
426 self.interact_rect = self.rect |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
427 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
428 def animate(self): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
429 if self._anim_seq: |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
430 self._frame_count += 1 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
431 if self._frame_count > self._delay: |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
432 self._frame_count = 0 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
433 self._anim_pos += 1 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
434 if self._anim_pos >= len(self._anim_seq): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
435 self._anim_pos = 0 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
436 self.image = self._anim_seq[self._anim_pos] |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
437 # queue redraw |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
438 return True |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
439 return False |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
440 |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
441 |
55
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
442 class Thing(StatefulGizmo): |
22 | 443 """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
|
444 |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
445 # name of thing |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
446 NAME = None |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
447 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
448 # sub-folder to look for resources in (defaults to scenes folder) |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
449 FOLDER = None |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
450 |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
451 # list of Interact objects |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
452 INTERACTS = {} |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
453 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
454 # name first interact |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
455 INITIAL = None |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
456 |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
457 # 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
|
458 # (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
|
459 if constants.DEBUG: |
75 | 460 _interact_hilight_color = Color('red') |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
461 else: |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
462 _interact_hilight_color = None |
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
463 |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
464 def __init__(self): |
55
2e2f6ff54780
Part of the cryo door puzzle.
Jeremy Thurgood <firxen@gmail.com>
parents:
47
diff
changeset
|
465 StatefulGizmo.__init__(self) |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
466 # name of the thing |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
467 self.name = self.NAME |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
468 # folder for resource (None is overridden by scene folder) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
469 self.folder = self.FOLDER |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
470 # interacts |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
471 self.interacts = self.INTERACTS |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
472 # these are set by set_scene |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
473 self.scene = None |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
474 self.state = None |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
475 self.current_interact = None |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
476 self.rect = 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
|
477 # TODO: add masks |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
478 |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
479 def set_scene(self, scene): |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
480 assert self.scene is None |
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
481 self.scene = scene |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
482 if self.folder is None: |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
483 self.folder = scene.FOLDER |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
484 self.state = scene.state |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
485 for interact in self.interacts.itervalues(): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
486 interact.set_thing(self) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
487 self.set_interact(self.INITIAL) |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
488 |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
489 def set_interact(self, name): |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
490 self.current_interact = self.interacts[name] |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
491 self.rect = self.current_interact.interact_rect |
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
492 assert self.rect is not None, name |
39
088a101f5b94
Add an example Thing to cryo scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
35
diff
changeset
|
493 |
94
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
494 def contains(self, pos): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
495 if hasattr(self.rect, 'collidepoint'): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
496 return self.rect.collidepoint(pos) |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
497 else: |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
498 # FIXME: add sanity check |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
499 for rect in list(self.rect): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
500 if rect.collidepoint(pos): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
501 return True |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
502 return False |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
503 |
63
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
504 def get_description(self): |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
505 return None |
3087be3463e0
Some framework support for better message handling
Neil Muller <neil@dip.sun.ac.za>
parents:
56
diff
changeset
|
506 |
56
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
507 def is_interactive(self): |
133
0530547a131f
Better map handling, detail_view stuff in Result.
Jeremy Thurgood <firxen@gmail.com>
parents:
132
diff
changeset
|
508 return self.current_interact is not None |
56
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
509 |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
510 def enter(self, item): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
511 """Called when the cursor enters the Thing.""" |
139
a5972444ad1e
Improve cursor state handling, disable highlights on modal dialogs
Stefano Rivera <stefano@rivera.za.net>
parents:
137
diff
changeset
|
512 pass |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
513 |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
514 def leave(self): |
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
515 """Called when the cursr leaves the Thing.""" |
139
a5972444ad1e
Improve cursor state handling, disable highlights on modal dialogs
Stefano Rivera <stefano@rivera.za.net>
parents:
137
diff
changeset
|
516 pass |
71
99c5506de7ea
Start of interact handling.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
68
diff
changeset
|
517 |
22 | 518 def interact(self, item): |
56
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
519 if not self.is_interactive(): |
75bf3d3689e9
Refactor thing interactivity and add "fake" bridge scene.
Jeremy Thurgood <firxen@gmail.com>
parents:
55
diff
changeset
|
520 return |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
521 if item is None: |
78 | 522 return self.interact_without() |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
523 else: |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
524 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
|
525 if handler is not None: |
78 | 526 return handler(item) |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
527 else: |
78 | 528 return self.interact_default(item) |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
529 |
105
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
530 def animate(self): |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
531 return self.current_interact.animate() |
65976205fc2d
Rough Stab at basic animation support
Neil Muller <neil@dip.sun.ac.za>
parents:
101
diff
changeset
|
532 |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
533 def interact_without(self): |
78 | 534 return self.interact_default(None) |
41
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
535 |
ad6f56bfa8b7
Cryo door, titanium leg and some interaction prototypes.
Jeremy Thurgood <firxen@gmail.com>
parents:
39
diff
changeset
|
536 def interact_default(self, item): |
78 | 537 return Result("It doesn't work.") |
22 | 538 |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
539 def draw(self, surface): |
86
593bddfacf18
Refactor Things a bit to render images.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
79
diff
changeset
|
540 self.current_interact.draw(surface) |
68
158a13a48d48
Show interact rectangles when constants.DEBUG is True.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
65
diff
changeset
|
541 if self._interact_hilight_color is not None: |
94
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
542 if hasattr(self.rect, 'collidepoint'): |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
543 frame_rect(surface, self._interact_hilight_color, |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
544 self.rect.inflate(1, 1), 1) |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
545 else: |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
546 for rect in self.rect: |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
547 frame_rect(surface, self._interact_hilight_color, |
ce23fad8ecb3
More complex shaped interactables
Neil Muller <neil@dip.sun.ac.za>
parents:
93
diff
changeset
|
548 rect.inflate(1, 1), 1) |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
549 |
22 | 550 |
551 class Item(object): | |
552 """Base class for inventory items.""" | |
553 | |
35 | 554 # image for inventory |
555 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
|
556 |
35 | 557 def __init__(self, name): |
558 self.name = name | |
559 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
|
560 # TODO: needs cursor |
22 | 561 |
34
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
562 def get_inventory_image(self): |
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
563 return self.inventory_image |
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
564 |
167
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
565 def interact(self, tool, state): |
166
0db92b3b5833
Add inventory interactions
Neil Muller <neil@dip.sun.ac.za>
parents:
161
diff
changeset
|
566 handler = getattr(self, 'interact_with_' + tool.name, None) |
0db92b3b5833
Add inventory interactions
Neil Muller <neil@dip.sun.ac.za>
parents:
161
diff
changeset
|
567 inverse_handler = getattr(tool, 'interact_with_' + self.name, None) |
0db92b3b5833
Add inventory interactions
Neil Muller <neil@dip.sun.ac.za>
parents:
161
diff
changeset
|
568 if handler is not None: |
167
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
569 return handler(tool, state) |
166
0db92b3b5833
Add inventory interactions
Neil Muller <neil@dip.sun.ac.za>
parents:
161
diff
changeset
|
570 elif inverse_handler is not None: |
167
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
571 return inverse_handler(self, state) |
166
0db92b3b5833
Add inventory interactions
Neil Muller <neil@dip.sun.ac.za>
parents:
161
diff
changeset
|
572 else: |
167
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
573 return self.interact_default(tool, state) |
166
0db92b3b5833
Add inventory interactions
Neil Muller <neil@dip.sun.ac.za>
parents:
161
diff
changeset
|
574 |
167
5845a3ed4dad
Inventory interaction can (surprisingly) affect the inventory
Neil Muller <neil@dip.sun.ac.za>
parents:
166
diff
changeset
|
575 def interact_default(self, tool, state): |
166
0db92b3b5833
Add inventory interactions
Neil Muller <neil@dip.sun.ac.za>
parents:
161
diff
changeset
|
576 return Result("That doesn't do anything useful") |
0db92b3b5833
Add inventory interactions
Neil Muller <neil@dip.sun.ac.za>
parents:
161
diff
changeset
|
577 |