comparison src/parpg/gamemap.py @ 0:1fd2201f5c36

Initial commit of parpg-core.
author M. George Hansen <technopolitica@gmail.com>
date Sat, 14 May 2011 01:12:35 -0700
parents
children d60f1dab8469
comparison
equal deleted inserted replaced
-1:000000000000 0:1fd2201f5c36
1 # This file is part of PARPG.
2
3 # PARPG is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation, either version 3 of the License, or
6 # (at your option) any later version.
7
8 # PARPG is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12
13 # You should have received a copy of the GNU General Public License
14 # along with PARPG. If not, see <http://www.gnu.org/licenses/>.
15
16 from fife import fife
17
18 from fife.extensions.loaders import loadMapFile
19
20 class GameMap(fife.MapChangeListener):
21 """Map class used to flag changes in the map"""
22 def __init__(self, engine, model):
23 # init mapchange listener
24 fife.MapChangeListener.__init__(self)
25 self.map = None
26 self.engine = engine
27 self.model = model
28
29 # init map attributes
30 self.my_cam_id = None
31 self.cameras = {}
32 self.agent_layer = None
33 self.top_layer = None
34 self.fife_model = engine.getModel()
35 self.transitions = []
36 self.cur_cam2_x = 0
37 self.initial_cam2_x = 0
38 self.cam2_scrolling_right = True
39 self.target_rotation = 0
40 self.outline_renderer = None
41
42 def reset(self):
43 """Reset the model to default settings.
44 @return: None"""
45 # We have to delete the map in Fife.
46 if self.map:
47 self.model.deleteObjects()
48 self.model.deleteMap(self.map)
49 self.transitions = []
50 self.map = None
51 self.agent_layer = None
52 self.top_layer = None
53 # We have to clear the cameras in the view as well, or we can't reuse
54 # camera names like 'main'
55 #self.view.clearCameras()
56 self.initial_cam2_x = 0
57 self.cam2_scrolling_right = True
58 #self.cameras = {}
59 self.cur_cam2_x = 0
60 self.target_rotation = 0
61 self.outline_renderer = None
62
63 def makeActive(self):
64 """Makes this map the active one.
65 @return: None"""
66 self.cameras[self.my_cam_id].setEnabled(True)
67
68 def load(self, filename):
69 """Load a map given the filename.
70 @type filename: String
71 @param filename: Name of map to load
72 @return: None"""
73 self.reset()
74 self.map = loadMapFile(filename, self.engine)
75 self.agent_layer = self.map.getLayer('ObjectLayer')
76 self.top_layer = self.map.getLayer('TopLayer')
77
78 # it's possible there's no transition layer
79 size = len('TransitionLayer')
80 for layer in self.map.getLayers():
81 # could be many layers, but hopefully no more than 3
82 if(layer.getId()[:size] == 'TransitionLayer'):
83 self.transitions.append(self.map.getLayer(layer.getId()))
84
85 """ Initialize the camera.
86 Note that if we have more than one camera in a map file
87 we will have to rework how self.my_cam_id works. To make sure
88 the proper camera is set as the 'main' camera.
89 At this point we also set the viewport to the current resolution."""
90 for cam in self.map.getCameras():
91 width = self.model.settings.fife.ScreenWidth
92 height = self.model.settings.fife.ScreenHeight
93 viewport = fife.Rect(0, 0, width, height)
94 cam.setViewPort(viewport)
95 self.my_cam_id = cam.getId()
96 self.cameras[self.my_cam_id] = cam
97 cam.resetRenderers()
98
99 self.target_rotation = self.cameras[self.my_cam_id].getRotation()
100
101 self.outline_renderer = fife.InstanceRenderer.\
102 getInstance(
103 self.cameras[
104 self.my_cam_id
105 ])
106
107 # set the render text
108 rend = fife.FloatingTextRenderer.getInstance(self.cameras[
109 self.my_cam_id
110 ])
111 text = self.engine.getGuiManager().\
112 createFont('fonts/rpgfont.png', 0, \
113 self.model.settings.fife.FontGlyphs)
114 rend.changeDefaultFont(text)
115 rend.activateAllLayers(self.map)
116 rend.setEnabled(True)
117
118 # Activate the grid renderer on all layers
119 rend = self.cameras['map_camera'].getRenderer('GridRenderer')
120 rend.activateAllLayers(self.map)
121
122 # Activate the grid renderer on all layers
123 rend = fife.CoordinateRenderer.getInstance(self.cameras[
124 self.my_cam_id
125 ])
126 rend.setColor(0, 0, 0)
127 rend.addActiveLayer(self.map.getLayer("GroundLayer"))
128
129 # Make World aware that this is now the active map.
130 self.model.active_map = self
131
132 def addPC(self):
133 """Add the player character to the map
134 @return: None"""
135 # Update gamestate.player_character
136 self.model.game_state.player_character.behaviour.onNewMap(self.agent_layer)
137 self.centerCameraOnPlayer()
138
139 def toggleRenderer(self, r_name):
140 """Enable or disable a renderer.
141 @return: None"""
142 renderer = self.cameras[self.my_cam_id].getRenderer(str(r_name))
143 renderer.setEnabled(not renderer.isEnabled())
144
145 def isPaused(self):
146 """Returns wheter the map is currentply paused or not"""
147 # Time multiplier is a float, never do equals on floats
148 return not self.map.getTimeMultiplier() >= 1.0
149
150 def pause(self, paused):
151 """ Pause/Unpause the game.
152 @return: nothing"""
153 if paused:
154 self.map.setTimeMultiplier(0.0)
155 if not paused and self.isPaused():
156 self.map.setTimeMultiplier(1.0)
157
158 def togglePause(self):
159 """ Toggle paused state.
160 @return: nothing"""
161 self.pause(not self.isPaused())
162
163 def centerCameraOnPlayer(self):
164 """Center the camera on the player"""
165 camera = self.cameras[self.my_cam_id]
166 player_agent = self.model.game_state.player_character.behaviour.agent
167 camera.setLocation(player_agent.getLocation())