Module World
[hide private]
[frames] | no frames]

Source Code for Module World

  1  ##################################################################### 
  2  # -*- coding: iso-8859-1 -*-                                        # 
  3  #                                                                   # 
  4  # Frets on Fire                                                     # 
  5  # Copyright (C) 2006 Sami Kyöstilä                                  # 
  6  #                                                                   # 
  7  # This program is free software; you can redistribute it and/or     # 
  8  # modify it under the terms of the GNU General Public License       # 
  9  # as published by the Free Software Foundation; either version 2    # 
 10  # of the License, or (at your option) any later version.            # 
 11  #                                                                   # 
 12  # This program is distributed in the hope that it will be useful,   # 
 13  # but WITHOUT ANY WARRANTY; without even the implied warranty of    # 
 14  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     # 
 15  # GNU General Public License for more details.                      # 
 16  #                                                                   # 
 17  # You should have received a copy of the GNU General Public License # 
 18  # along with this program; if not, write to the Free Software       # 
 19  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,        # 
 20  # MA  02110-1301, USA.                                              # 
 21  ##################################################################### 
 22   
 23  from Player import Player 
 24  from Session import MessageHandler, Message 
 25  import Network 
 26  import SceneFactory 
 27   
 28  STARTUP_SCENE = "SongChoosingScene" 
 29   
 30  # Messages from client to server 
31 -class CreatePlayer(Message): pass
32 -class StartGame(Message): pass
33 -class CreateScene(Message): pass
34 -class DeleteScene(Message): pass
35 -class GameFinished(Message): pass
36 37 # Messages from server to client
38 -class PlayerJoined(Message): pass
39 -class PlayerLeft(Message): pass
40 -class GameStarted(Message): pass
41 -class SceneCreated(Message): pass
42 -class SceneDeleted(Message): pass
43 -class EnterScene(Message): pass
44 -class LeaveScene(Message): pass
45 46 # Internal messages
47 -class SceneEntered(Message): pass
48 -class SceneLeft(Message): pass
49
50 -class World(MessageHandler):
51 # TODO: abstract away the network details somehow
52 - def __init__(self, engine, broker):
53 self.objects = Network.ObjectCollection() 54 self.engine = engine 55 self.broker = broker 56 self.players = [] 57 self.scenes = []
58
59 - def handlePlayerJoined(self, sender, id, owner, name):
60 player = Player(owner, name) 61 self.players.append(player) 62 self.objects[id] = player
63
64 - def handlePlayerLeft(self, sender, id):
65 player = self.objects[id] 66 self.players.remove(player) 67 del self.objects[id] 68 self.finishGameIfNeeded()
69
70 - def finishGameIfNeeded(self):
71 if not self.players and not self.scenes: 72 self.broker.signalMessage(0, GameFinished())
73
74 - def handleSceneDeleted(self, sender, id):
75 try: 76 scene = self.objects[id] 77 self.broker.removeMessageHandler(scene) 78 self.engine.removeTask(scene) 79 if scene in self.scenes: 80 self.scenes.remove(scene) 81 del self.objects[id] 82 except KeyError: 83 pass 84 self.finishGameIfNeeded()
85
86 - def handleSceneEntered(self, sender, sceneId, playerId):
87 scene = self.objects[sceneId] 88 player = self.objects[playerId] 89 scene.addPlayer(player)
90
91 - def handleSceneLeft(self, sender, sceneId, playerId):
92 try: 93 scene = self.objects[sceneId] 94 player = self.objects[playerId] 95 scene.removePlayer(player) 96 except KeyError: 97 pass
98
99 -class WorldServer(World):
100 - def __init__(self, engine, server):
101 World.__init__(self, engine, server.broker) 102 self.server = server
103
104 - def handleCreatePlayer(self, sender, name):
105 id = self.objects.generateId() 106 self.server.broadcastMessage(PlayerJoined(id = id, owner = sender, name = name)) 107 return id
108
109 - def handleCreateScene(self, sender, name, args):
110 id = self.objects.generateId() 111 self.server.broadcastMessage(SceneCreated(id = id, owner = sender, name = name, args = args)) 112 return id
113
114 - def handleDeleteScene(self, sender, id):
115 try: 116 scene = self.objects[id] 117 self.deleteScene(scene) 118 except KeyError: 119 pass
120
121 - def deletePlayer(self, player):
122 id = self.objects.id(player) 123 self.server.broadcastMessage(PlayerLeft(id = id))
124
125 - def deleteScene(self, scene):
126 id = self.objects.id(scene) 127 self.server.broadcastMessage(SceneDeleted(id = id))
128
129 - def createScene(self, name, **args):
130 id = self.objects.generateId() 131 self.server.broadcastMessage(SceneCreated(id = id, owner = None, name = name, args = args)) 132 return id
133
134 - def enterScene(self, scene, player):
135 sceneId = self.objects.id(scene) 136 playerId = self.objects.id(player) 137 self.server.broadcastMessage(SceneEntered(sceneId = sceneId, playerId = playerId))
138
139 - def leaveScene(self, scene, player):
140 sceneId = self.objects.id(scene) 141 playerId = self.objects.id(player) 142 self.server.broadcastMessage(SceneLeft(sceneId = sceneId, playerId = playerId))
143
144 - def handleSessionOpened(self, session):
145 # TODO: make this more automatic 146 for player in self.players: 147 id = self.objects.id(player) 148 session.sendMessage(PlayerJoined(id = id, owner = player.owner, name = player.name)) 149 for scene in self.scenes: 150 id = self.objects.id(scene) 151 session.sendMessage(SceneCreated(id = id, owner = scene.owner, name = scene.__name__, args = scene.args))
152
153 - def handleSessionClosed(self, session):
154 # TODO: make this more automatic 155 for player in self.players: 156 if player.owner == session.id: 157 self.deletePlayer(player) 158 for scene in self.scenes: 159 if scene.owner == session.id: 160 self.deleteScene(scene)
161
162 - def handleStartGame(self, sender, args):
163 self.server.broadcastMessage(GameStarted()) 164 id = self.createScene(STARTUP_SCENE, **args) 165 if id: 166 for player in self.players: 167 playerId = self.objects.id(player) 168 self.server.broadcastMessage(EnterScene(sceneId = id, playerId = playerId))
169
170 - def handleEnterScene(self, sender, sceneId, playerId):
171 scene = self.objects[sceneId] 172 player = self.objects[playerId] 173 self.enterScene(scene, player)
174
175 - def handleLeaveScene(self, sender, sceneId, playerId):
176 scene = self.objects[sceneId] 177 player = self.objects[playerId] 178 self.leaveScene(scene, player)
179
180 - def handleSceneCreated(self, sender, id, owner, name, args):
181 scene = SceneFactory.create(engine = self.engine, name = name, owner = owner, server = self.server, **args) 182 self.broker.addMessageHandler(scene) 183 self.engine.addTask(scene) 184 self.scenes.append(scene) 185 self.objects[id] = scene
186
187 - def handleSceneDeleted(self, sender, id):
188 try: 189 scene = self.objects[id] 190 for player in scene.players: 191 self.leaveScene(scene, player) 192 except KeyError: 193 pass 194 World.handleSceneDeleted(self, sender, id)
195
196 - def finishGameIfNeeded(self):
197 if not self.players and not self.scenes: 198 self.server.broadcastMessage(GameFinished()) 199 World.finishGameIfNeeded(self)
200
201 -class WorldClient(World):
202 - def __init__(self, engine, session):
203 World.__init__(self, engine, session.broker) 204 self.session = session
205
206 - def finishGame(self):
207 for scene in self.scenes: 208 self.deleteScene(scene) 209 for player in self.players: 210 self.deletePlayer(player)
211
212 - def createPlayer(self, name):
213 self.session.sendMessage(CreatePlayer(name = name))
214
215 - def deletePlayer(self, player):
216 id = self.objects.id(player) 217 self.session.sendMessage(PlayerLeft(id = id))
218
219 - def createScene(self, name, **args):
220 self.session.sendMessage(CreateScene(name = name, args = args))
221
222 - def enterScene(self, player, scene):
223 sceneId = self.objects.id(scene) 224 playerId = self.objects.id(player) 225 self.session.sendMessage(EnterScene(sceneId = sceneId, playerId = playerId))
226
227 - def leaveScene(self, player, scene):
228 sceneId = self.objects.id(scene) 229 playerId = objects.id(player) 230 self.session.sendMessage(LeaveScene(sceneId = sceneId, playerId = playerId))
231
232 - def deleteScene(self, scene):
233 id = self.objects.id(scene) 234 self.session.sendMessage(DeleteScene(id = id))
235
236 - def startGame(self, **args):
237 self.session.sendMessage(StartGame(args = args))
238
239 - def getLocalPlayer(self):
240 for player in self.players: 241 if player.owner == self.session.id: 242 return player
243
244 - def handleSceneCreated(self, sender, id, owner, name, args):
245 scene = SceneFactory.create(engine = self.engine, name = name, owner = owner, session = self.session, **args) 246 self.broker.addMessageHandler(scene) 247 self.scenes.append(scene) 248 self.objects[id] = scene 249 if owner == self.session.id: 250 for player in self.players: 251 if player.owner == self.session.id: 252 self.enterScene(player, scene)
253