#! /usr/bin/env python ''' Example server ''' from twisted.spread import pb def Debug( msg ): return #print msg DIRECTION_UP = 0 DIRECTION_RIGHT = 1 DIRECTION_LEFT = 2 DIRECTION_DOWN = 3 class Event: """this is a superclass for any events that might be generated by an object and sent to the EventManager""" def __init__(self): self.name = "Generic Event" class TickEvent(Event): def __init__(self): self.name = "CPU Tick Event" class QuitEvent(Event): def __init__(self): self.name = "Program Quit Event" class MapBuiltEvent(Event): def __init__(self, gameMap): self.name = "Map Finished Building Event" self.map = gameMap class GameStartRequest(Event): def __init__(self): self.name = "Game Start Request" class GameStartedEvent(Event): def __init__(self, game): self.name = "Game Started Event" self.game = game class CharactorMoveRequest(Event): def __init__(self, direction): self.name = "Charactor Move Request" self.direction = direction class CharactorPlaceEvent(Event): """this event occurs when a Charactor is *placed* in a sector, ie it doesn't move there from an adjacent sector.""" def __init__(self, charactor): self.name = "Charactor Placement Event" self.charactor = charactor class CharactorMoveEvent(Event): def __init__(self, charactor): self.name = "Charactor Move Event" self.charactor = charactor #------------------------------------------------------------------------------ class EventManager: """this object is responsible for coordinating most communication between the Model, View, and Controller.""" def __init__(self ): from weakref import WeakKeyDictionary self.listeners = WeakKeyDictionary() self.eventQueue= [] #---------------------------------------------------------------------- def RegisterListener( self, listener ): self.listeners[ listener ] = 1 #---------------------------------------------------------------------- def UnregisterListener( self, listener ): if listener in self.listeners: del self.listeners[ listener ] #---------------------------------------------------------------------- def Notify( self, event ): if not isinstance(event, TickEvent): Debug( " Message: " + event.name ) for listener in self.listeners: #NOTE: If the weakref has died, it will be #automatically removed, so we don't have #to worry about it. listener.Notify( event ) #------------------------------------------------------------------------------ class NetworkClientController(pb.Root): """We RECEIVE events from the CLIENT through this object""" def __init__(self, evManager): self.evManager = evManager self.evManager.RegisterListener( self ) #---------------------------------------------------------------------- def remote_GameStartRequest(self): ev = GameStartRequest( ) self.evManager.Notify( ev ) return 1 #---------------------------------------------------------------------- def remote_CharactorMoveRequest(self, direction): ev = CharactorMoveRequest( direction ) self.evManager.Notify( ev ) return 1 #---------------------------------------------------------------------- def Notify(self, event): pass #------------------------------------------------------------------------------ class TextLogView: """...""" def __init__(self, evManager): self.evManager = evManager self.evManager.RegisterListener( self ) #---------------------------------------------------------------------- def Notify(self, event): if isinstance( event, CharactorPlaceEvent ): print event.name, " at ", event.charactor.sector elif isinstance( event, CharactorMoveEvent ): print event.name, " to ", event.charactor.sector elif not isinstance( event, TickEvent ): print event.name #------------------------------------------------------------------------------ class Game: """...""" STATE_PREPARING = 0 STATE_RUNNING = 1 STATE_PAUSED = 2 #---------------------------------------------------------------------- def __init__(self, evManager): self.evManager = evManager self.evManager.RegisterListener( self ) self.state = Game.STATE_PREPARING self.players = [ Player(evManager) ] self.map = Map( evManager ) #---------------------------------------------------------------------- def Start(self): self.map.Build() self.state = Game.STATE_RUNNING ev = GameStartedEvent( self ) self.evManager.Notify( ev ) #---------------------------------------------------------------------- def Notify(self, event): if isinstance( event, GameStartRequest ): if self.state == Game.STATE_PREPARING: self.Start() #------------------------------------------------------------------------------ class Player: """...""" def __init__(self, evManager): self.evManager = evManager #self.evManager.RegisterListener( self ) self.charactors = [ Charactor(evManager) ] #------------------------------------------------------------------------------ class Charactor: """...""" STATE_INACTIVE = 0 STATE_ACTIVE = 1 def __init__(self, evManager): self.evManager = evManager self.evManager.RegisterListener( self ) self.sector = None self.state = Charactor.STATE_INACTIVE #---------------------------------------------------------------------- def Move(self, direction): if self.state == Charactor.STATE_INACTIVE: return if self.sector.MovePossible( direction ): newSector = self.sector.neighbors[direction] self.sector = newSector ev = CharactorMoveEvent( self ) self.evManager.Notify( ev ) #---------------------------------------------------------------------- def Place(self, sector): self.sector = sector ev = CharactorPlaceEvent( self ) self.evManager.Notify( ev ) #---------------------------------------------------------------------- def Notify(self, event): if isinstance( event, GameStartedEvent ): gameMap = event.game.map self.Place( gameMap.sectors[gameMap.startSectorIndex] ) self.state = Charactor.STATE_ACTIVE elif isinstance( event, CharactorMoveRequest ): self.Move( event.direction ) #------------------------------------------------------------------------------ class Map: """...""" def __init__(self, evManager): self.evManager = evManager #self.evManager.RegisterListener( self ) self.sectors = range(9) self.startSectorIndex = 0 #---------------------------------------------------------------------- def Build(self): for i in range(9): self.sectors[i] = Sector( self.evManager ) self.sectors[3].neighbors[DIRECTION_UP] = self.sectors[0] self.sectors[4].neighbors[DIRECTION_UP] = self.sectors[1] self.sectors[5].neighbors[DIRECTION_UP] = self.sectors[2] self.sectors[6].neighbors[DIRECTION_UP] = self.sectors[3] self.sectors[7].neighbors[DIRECTION_UP] = self.sectors[4] self.sectors[8].neighbors[DIRECTION_UP] = self.sectors[5] self.sectors[0].neighbors[DIRECTION_RIGHT] = self.sectors[1] self.sectors[1].neighbors[DIRECTION_RIGHT] = self.sectors[2] self.sectors[3].neighbors[DIRECTION_RIGHT] = self.sectors[4] self.sectors[4].neighbors[DIRECTION_RIGHT] = self.sectors[5] self.sectors[6].neighbors[DIRECTION_RIGHT] = self.sectors[7] self.sectors[7].neighbors[DIRECTION_RIGHT] = self.sectors[8] self.sectors[0].neighbors[DIRECTION_DOWN] = self.sectors[3] self.sectors[1].neighbors[DIRECTION_DOWN] = self.sectors[4] self.sectors[2].neighbors[DIRECTION_DOWN] = self.sectors[5] self.sectors[3].neighbors[DIRECTION_DOWN] = self.sectors[6] self.sectors[4].neighbors[DIRECTION_DOWN] = self.sectors[7] self.sectors[5].neighbors[DIRECTION_DOWN] = self.sectors[8] self.sectors[1].neighbors[DIRECTION_LEFT] = self.sectors[0] self.sectors[2].neighbors[DIRECTION_LEFT] = self.sectors[1] self.sectors[4].neighbors[DIRECTION_LEFT] = self.sectors[3] self.sectors[5].neighbors[DIRECTION_LEFT] = self.sectors[4] self.sectors[7].neighbors[DIRECTION_LEFT] = self.sectors[6] self.sectors[8].neighbors[DIRECTION_LEFT] = self.sectors[7] ev = MapBuiltEvent( self ) self.evManager.Notify( ev ) #------------------------------------------------------------------------------ class Sector: """...""" def __init__(self, evManager): self.evManager = evManager #self.evManager.RegisterListener( self ) self.neighbors = range(4) self.neighbors[DIRECTION_UP] = None self.neighbors[DIRECTION_RIGHT] = None self.neighbors[DIRECTION_DOWN] = None self.neighbors[DIRECTION_LEFT] = None #---------------------------------------------------------------------- def MovePossible(self, direction): if self.neighbors[direction]: return 1 #------------------------------------------------------------------------------ def main(): """...""" evManager = EventManager() log = TextLogView( evManager ) clientController = NetworkClientController( evManager ) game = Game( evManager ) from twisted.internet import reactor reactor.listenTCP( 8000, pb.PBServerFactory(clientController) ) reactor.run() if __name__ == "__main__": main()