objmgr.py
上传用户:ghyvgy
上传日期:2009-05-26
资源大小:547k
文件大小:4k
源码类别:

其他游戏

开发平台:

Python

  1. # objmgr.py
  2. #
  3. # Implements the ability to address objects by an 
  4. # id, avoiding the need to hold on to object references.
  5. # This prevents reference counting and garbage collection
  6. # problems associated with circular references.
  7. # The deferred call implementation uses object ids to
  8. # identify the recipient of a deferred method call.
  9. #
  10. # Author: Matthew Walker
  11. #         mwalker@softhome.net
  12. #
  13. import string
  14. import types
  15. def __ModuleInit__():
  16.   """
  17.   Set up module-level attributes
  18.   """
  19.   global g_gameobjects
  20.   global g_ids
  21.   global g_players_clients
  22.   global g_clients_players
  23.   global g_rooms
  24.   g_gameobjects = {}
  25.   g_ids = 0
  26.   g_players_clients = {}
  27.   g_clients_players = {}
  28.   g_rooms = {}
  29. __ModuleInit__()  # at first import
  30. #
  31. # Module functions - for managing all objects in the game
  32. #
  33. def NextId():
  34.   """
  35.   Generate a new object id.
  36.   """
  37.   global g_ids
  38.   g_ids = g_ids + 1
  39.   return g_ids
  40. def AddObject(ob, id):
  41.   """
  42.   Add a game object to the manager using the id provided.
  43.   """
  44.   assert(type(id) == types.IntType)
  45.   g_gameobjects[id] = ob
  46. def RemoveObject(ob):
  47.   """
  48.   Remove an object from the game, None if it fails.
  49.   """
  50.   try:
  51.     del g_gameobjects[ob.id]
  52.     return ob.id
  53.   except KeyError:
  54.     print 'Cannot remove %s: not in map.' % (ob,)
  55.     return None
  56.  
  57. def GetObject(id):
  58.   """
  59.   Return the object with the requested id, or None 
  60.   if it doesn't exist.
  61.   """
  62.   try:
  63.     return g_gameobjects[id]
  64.   except KeyError:
  65.     import traceback
  66.     traceback.print_exc()
  67.     print 'Invalid object id: %s' % (id,)
  68.     return None
  69. def RegisterPlayer(clientid, playerid):
  70.   """
  71.   Associate a player with a specific client.
  72.   """
  73.   if g_clients_players.get(clientid) or g_players_clients.get(playerid):
  74.     raise RuntimeError("Duplicate player registration.")
  75.   g_clients_players[clientid] = playerid
  76.   g_players_clients[playerid] = clientid
  77. def UnregisterPlayer(clientid, playerid):
  78.   """
  79.   Dis-associate a player with a specific client.
  80.   """
  81.   del g_players_clients[playerid]
  82.   del g_clients_players[clientid]
  83. def GetPlayerByClientId(clientid):
  84.   """
  85.   Get a player object based on a client id.
  86.   """
  87.   playerid = g_clients_players[clientid]
  88.   player = GetObject(playerid)
  89.   return player
  90. def GetPlayerByName(name):
  91.   """
  92.   Get a player object based on its name.
  93.   NOTE: there is no enforcement of unique names.
  94.   """
  95.   for playerid in g_players_clients.keys():
  96.     player = GetObject(playerid)
  97.     if player.name == name:
  98.       return player
  99.   return None
  100. def GetObjectByName(name):
  101.   """
  102.   Get a generic object based on its name. Player
  103.   objects are also included.
  104.   NOTE: there is no enforcement of unique names.
  105.   """
  106.   for objectid in g_gameobjects.keys():
  107.     object = GetObject(objectid)
  108.     try:
  109.       if object.name == name:
  110.         return object
  111.     except:
  112.       # some objects don't have a name - that's okay
  113.       pass
  114.   return None
  115. def RegisterRoom(room):
  116.   """
  117.   Provide the ability to identify a room by its name.
  118.   """
  119.   if g_rooms.get(string.upper(room.name)):
  120.     raise RuntimeError('Registering duplicate room %s' % (room.name,))
  121.   g_rooms[string.upper(room.name)] = room.id
  122. def GetRoomIds():
  123.   """
  124.   Return a list of all room ids.
  125.   """
  126.   return g_rooms.values()
  127. def GetRoomByName(roomname):
  128.   """
  129.   Get a room (sandbox) object based on its name.
  130.   NOTE: there is no enforcement of unique names.
  131.   """
  132.   roomid = g_rooms[string.upper(roomname)]
  133.   room = GetObject(roomid)
  134.   return room