home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 56 / CDPowerplay56Disc2.iso / demos / blade / data1.cab / Program_Executable_Files / Lib / GameStateAux.py < prev    next >
Encoding:
Python Source  |  2000-10-27  |  10.8 KB  |  502 lines

  1.  
  2.  
  3.  
  4.  
  5. import os
  6. import cPickle
  7. import BBLib
  8. import Bladex
  9. import Reference
  10. ##import ItemTypes
  11. import Breakings
  12. import PickInit
  13. import types
  14. import ObjStore
  15. import cStringIO
  16.  
  17.  
  18.  
  19.  
  20.  
  21. PickDataBase={}
  22. LoadedPickledData={}
  23. aux_dir='.'
  24.  
  25. ## Objetos que hay que ajustar en una segunda pasada
  26. FixDataBase=[]
  27.  
  28.  
  29.  
  30. ##class PersistentObject:
  31. ##  def __init__(self):
  32. ##    self.ObjId=str(id(self)) # Para identificarlo al grabar/guardar
  33. ##
  34. ##  def  __setstate__(self,parm):
  35. ##    self.ObjId=parm[1]
  36. ##    LoadedPickledData[self.ObjId]=self
  37. ##
  38. ##  def persistent_id(self):
  39. ##    return self.ObjId
  40.  
  41. def LoadGlobalCompVars(filename,dest_dict):
  42.  
  43.   file=open(filename)
  44.   u=cPickle.Unpickler(file)
  45.  
  46.   u.persistent_load=persistent_load
  47.   ret=u.load()
  48.   file.close()
  49.  
  50.   # ret es un diccionario con las variables globales de tipo lista, tupla y diccionario.
  51.   for i in ret.keys():
  52.     dest_dict[i]=ret[i]
  53.  
  54.  
  55.  
  56.  
  57. def InitGameState(aux_dir):
  58. ##  Bladex.SetCallCheck(1)
  59. ##  Bladex.OpenDebugChannel("Salida")
  60.  
  61.   global PickDataBase
  62.   PickDataBase={}
  63.  
  64.   filename="%s/PickDataBase.dat"%(aux_dir,)
  65.   funcfile=open(filename,"rt")
  66.   p=cPickle.Unpickler(funcfile)
  67.   PickDataBase=p.load()
  68.   funcfile.close()
  69.   print "PickDataBase read"
  70.  
  71.  
  72. def CleanLoadTemp():
  73.   global PickDataBase
  74.   PickDataBase={}
  75.  
  76.   global LoadedPickledData
  77.   LoadedPickledData={}
  78.  
  79.   global LoadedPickledData
  80.   LoadedPickledData={}
  81.  
  82.  
  83.  
  84. def EndGameState(aux_dir):
  85.  
  86.   filename="%s/PickDataBase.dat"%(aux_dir,)
  87.   funcfile=open(filename,"wt")
  88.   p=cPickle.Pickler(funcfile)
  89.   p.dump(PickDataBase)
  90.   funcfile.close()
  91.   print "PickDataBase written"
  92.  
  93.  
  94.  
  95.  
  96. def persistent_id(obj):
  97.   ret=None
  98.   try:
  99.     ret=obj.persistent_id()
  100.   except AttributeError:
  101.     pass
  102.   except Exception,exc:
  103.     print "GameStateAux.persistent_id()",exc
  104.   return ret
  105.  
  106.  
  107.  
  108. def persistent_load(obj_id):
  109.  
  110.   if ObjStore.ObjectsStore.has_key(obj_id):
  111.     #print "Found at ObjStore",ObjStore.ObjectsStore[obj_id],obj_id
  112.     return ObjStore.ObjectsStore[obj_id]
  113.  
  114. ##  if LoadedPickledData.has_key(filename):
  115. ##    print "GameStateAux.persistent_load Found in LoadedPickledData",obj_id
  116. ##    return LoadedPickledData[obj_id]
  117. ##  else:
  118. ##    filename="%s/%s.dat"%(aux_dir,obj_id)
  119.     filename="%s/%s.dat"%("f",obj_id)
  120.  
  121.     dat=GetPickledData(filename)
  122.  
  123.     try:
  124.       LoadedPickledData[dat.persistent_id()]=dat
  125.     except KeyError:
  126.       LoadedPickledData[obj_id]=dat
  127.     return dat
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. def SavePickData(filename,data):
  137. ##  print "SavePickData, saving",filename,data
  138.   if PickDataBase.has_key(filename):
  139.     return
  140.  
  141.   string_file=cStringIO.StringIO()
  142.   p=cPickle.Pickler(string_file)
  143.   p.persistent_id=persistent_id
  144.   p.dump(data)
  145.   PickDataBase[filename]=string_file.getvalue()
  146.  
  147.  
  148.  
  149.  
  150.  
  151. def GetPickledData(filename):
  152.  
  153.   string_file = cStringIO.StringIO(PickDataBase[filename])
  154.   u=cPickle.Unpickler(string_file)
  155.  
  156.   u.persistent_load=persistent_load
  157.   ret=u.load()
  158.   return ret
  159.  
  160.  
  161. def GetPickledObjects(filename):
  162.   "Loads the ObjStore file"
  163.  
  164.   f=open(filename,'rt')
  165.   u=cPickle.Unpickler(f)
  166.   ret=u.load()
  167.   f.close()
  168.  
  169.   global FixDataBase
  170.   for i in FixDataBase:
  171.     func_id=i[0]
  172.     ob_id=func_id[0]
  173.     if ObjStore.ObjectsStore.has_key(ob_id):
  174.       cl=ObjStore.ObjectsStore[ob_id]
  175.       cl_to_assign=ObjStore.ObjectsStore[i[1]]
  176.       #print "Fixing ",cl_to_assign,"with",i[1]
  177.       exec("cl_to_assign."+i[2]+"=cl."+func_id[1])
  178.     else:
  179.       print "Can't fix FixDataBase.",ob_id,"Nor found."
  180.  
  181.   FixDataBase=[]
  182.  
  183.  
  184.  
  185. def LoadAutoBODs(dir):
  186.   files=os.listdir(dir)
  187.   for i in files:
  188.     if i[-4:]==".BOD":
  189.       filename="%s/%s"%(dir,i)
  190.       BBLib.ReadAutoBOD(filename)
  191.  
  192.  
  193. def LoadMMPs(files):
  194.   for i in files:
  195.     BBLib.ReadMMP(i)
  196.  
  197.  
  198. def LoadAlphaBMPs(files):
  199.   for i in files:
  200.     Bladex.ReadAlphaBitMap(i[0],i[1])
  201.  
  202.  
  203. def LoadBMPs(files):
  204.   for i in files:
  205.     Bladex.ReadBitMap(i[0],i[1])
  206.  
  207.  
  208. def LoadBODs(files):
  209.   for i in files:
  210.     BBLib.ReadBOD(i)
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218. def AddWeaponToInventory(inv,weapon_name):
  219.  
  220.   object_flag=Reference.GiveObjectFlag(weapon_name)
  221.   if object_flag == Reference.OBJ_BOW:
  222.       inv.AddBow(weapon_name)
  223.   else:
  224.       flag=Reference.GiveWeaponFlag(weapon_name)
  225.       #inv.AddWeapon(i[0],flag)
  226.       inv.AddWeapon(weapon_name,flag)
  227.     
  228.  
  229. def LinkRight(weapon_name,inv,owner):
  230.     weapon = Bladex.GetEntity(weapon_name)
  231.     owner.Unlink(weapon)
  232.     inv.LinkRightHand(weapon_name)
  233.  
  234. def LinkLeft(weapon_name,inv,owner):
  235.     weapon = Bladex.GetEntity(weapon_name)
  236.     owner.Unlink(weapon)
  237.     inv.LinkLeftHand(weapon_name)
  238.  
  239.  
  240. def LinkBack(weapon_name,inv,owner):
  241.     weapon = Bladex.GetEntity(weapon_name)
  242.     owner.Unlink(weapon)
  243.     inv.LinkBack(weapon_name)
  244.  
  245. def LinkLeft2B(weapon_name,inv,owner):
  246.     weapon = Bladex.GetEntity(weapon_name)
  247.     owner.Unlink(weapon)
  248.     inv.LinkLeftHand2(weapon_name)
  249.  
  250. def AddQuiverToInventory(inv,quiver_name):
  251.   obj=Bladex.GetEntity(quiver_name)
  252. ##  ItemTypes.ItemDefaultFuncs(obj)
  253.   inv.AddQuiver(quiver_name)
  254.  
  255.  
  256. def SaveFunctionAux(func):
  257.  
  258.   try:
  259.     func_type=type(func)
  260.     if  func_type == types.MethodType:
  261.       ob_id=func.im_self.persistent_id()
  262.       return ("m",(ob_id,func.im_func.func_name))
  263.   ##    try:
  264.   ##      id=func.im_class.persistent_id()
  265.   ##      return (id,func.im_func.func_name)
  266.   ##    except:
  267.   ##      print "WARNING, SaveFunctionAux()-> Omiting method",func.im_func.func_name
  268.   ##      return None
  269.  
  270.     elif func_type==types.FunctionType:
  271.       return ("f",(func.func_name,GetFunctionFile(func)))
  272.     elif func_type==types.BuiltinFunctionType:
  273.       return ("cf",(func.__name__,"Builtin has no known lib"))
  274.  
  275.     return ("n",(None,None))
  276.  
  277.   except Exception,exc:
  278.     print "Exception in SaveFunctionAux()",exc," with function",func
  279.     return ("n",(None,None))
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286. def LoadFunctionAux(func_id_ex,res_obj=None,res_field=None):
  287.  
  288.   assign_func=None
  289.   
  290.   if type(func_id_ex) != types.TupleType:
  291.     print "LoadFunctionAux() ERROR, invalid parameters",type(func_id_ex)
  292.     return
  293.  
  294.   func_id=func_id_ex[1]
  295.  
  296.   func_kind=func_id_ex[0]
  297.   if func_kind=="m": # Metodo
  298.     ob_id=func_id[0]
  299.     if ObjStore.ObjectsStore.has_key(ob_id):
  300.       cl=ObjStore.ObjectsStore[ob_id]
  301.       #res_obj.__dict__[res_field]=eval("cl."+func_id[1])
  302.       assign_func=eval("cl."+func_id[1])
  303.     else:
  304.       if res_obj:
  305.         FixDataBase.append((func_id,res_obj.ObjId,res_field,ob_id))
  306.   elif func_kind=="f":  # Funcion
  307.     assign_func=(PickInit.ConstFunction(func_id[0],func_id[1]))
  308.   elif func_kind=="cf": # Funcion C
  309.     assign_func=(PickInit.ConstCFunction(func_id[0]))
  310.   elif func_kind=="n":  # None
  311.     assign_func=None
  312.  
  313.   #res_obj.__dict__[res_field]=assign_func
  314.   if res_obj:
  315.     exec("res_obj."+res_field+"=assign_func")
  316.   else:
  317.     return assign_func
  318.  
  319.  
  320. def SaveEntityAux(ent):
  321.   if ent:
  322.     try:
  323.       return ent.Name
  324.     except:
  325.       print "Error getting entity name",ent
  326.       return None
  327.   return None
  328.  
  329.  
  330. def LoadEntityAux(ent_id):
  331.   if ent_id:
  332.     return Bladex.GetEntity(ent_id)
  333.   return None
  334.  
  335.  
  336. def SaveExtraDataAux(file,aux_dir):
  337.     try:
  338.       import ExtraData
  339.  
  340.       filename="%s/ExtraData.dat"%(aux_dir,)
  341.       if ExtraData.SaveExtraData(filename):
  342.           file.write('try:\n')
  343.           file.write('  GameStateAux.LoadExtraDataAux("%s")\n'%(filename,))
  344.           file.write('except:\n')
  345.           file.write('  print "Can not load ExtraData"\n\n')
  346.     except:
  347.       pass
  348.  
  349.  
  350. def LoadExtraDataAux(filename):
  351.     import ExtraData
  352.  
  353.     ExtraData.LoadExtraData(filename)
  354.  
  355. def GetAllBases(check_class):
  356.   ret=[]
  357.   bases=check_class.__bases__
  358.   for i in bases:
  359.     ret.append(i)
  360.     bases_i=GetAllBases(i)
  361.     for j in bases_i:
  362.       ret.append(j)
  363.  
  364.   return ret
  365.  
  366.  
  367.  
  368.  
  369. def GetNewMembers(check_class):
  370.   "Obtiene los miembros nuevos de la clase y de sus clases base"
  371.  
  372.   class_dict={}
  373. ##  bases=check_class.__class__.__bases__
  374.   bases=GetAllBases(check_class.__class__)
  375.   for i in bases:
  376.     class_dict.update(i.__dict__)
  377.  
  378.   class_dict.update(check_class.__class__.__dict__)
  379.   check_dict=check_class.__dict__
  380.   new_members={}
  381.   for j in check_dict.keys():
  382.     if not class_dict.has_key(j):
  383.       new_members[j]=check_dict[j]
  384.  
  385.   return new_members
  386.  
  387.  
  388.  
  389. def SaveNewMembers(check_class):
  390.   if type(check_class)!=types.InstanceType:
  391.     return ()
  392.  
  393.   ret=[]
  394.   entity_type=type(Bladex.GetEntity(0))
  395.   members=GetNewMembers(check_class)
  396.   members_keys=members.keys()
  397.   for i in members_keys:
  398.     member=members[i]
  399.     member_t=type(member)
  400.     print check_class,i,member_t
  401.     if member_t==types.FunctionType or member_t==types.MethodType:
  402.       ret.append(("Function",i,SaveFunctionAux(member)))
  403.     elif member_t==entity_type:
  404.       ret.append(("Entity",i,SaveEntityAux(member)))
  405.     else:
  406.       ret.append(("Other",i,member))
  407.  
  408. ##  altered_methods=GetAlteredMethods(check_class)
  409. ##  altered_methods_keys=altered_methods.keys()
  410. ##  for i in altered_methods_keys:
  411. ##    member=altered_methods[i]
  412. ##    ret.append(("Function",i,SaveFunctionAux(member)))
  413.  
  414.   return tuple(ret)
  415.  
  416.  
  417. def LoadNewMembers(mod_class,new_members):
  418.  
  419.   try:
  420.     for i in new_members:
  421.       if i[0]=="Function":
  422.         LoadFunctionAux(i[2],mod_class,i[1])
  423.       elif i[1]=="Entity":
  424.         mod_class.__dict__[i[1]]=LoadEntityAux(i[2])
  425.       else:
  426.         mod_class.__dict__[i[1]]=i[2]
  427.   except Exception,exc:
  428.     print "LoadNewMembers() Error",exc,mod_class,new_members
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439. def GetBaseMethod(check_class,method_name,bases):
  440.  
  441.   for i in bases:
  442.     try:
  443.       tmp_string="i.__dict__['"+method_name+"']"
  444.       return eval(tmp_string)
  445.     except:
  446.       pass
  447.  
  448.   return None
  449.  
  450.  
  451. def GetAlteredMethods(check_class):
  452.   "Obtiene los metodos de una clase y de sus clases base que han sido cambiados"
  453.  
  454.   class_dict={}
  455.   bases=GetAllBases(check_class.__class__)
  456.   for i in bases:
  457.     class_dict.update(i.__dict__)
  458.  
  459.   class_dict.update(check_class.__class__.__dict__)
  460.  
  461.   altered_beast={}
  462.   for j in class_dict.keys():
  463.     member=eval("check_class."+j)
  464.  
  465.     if type(member)==types.MethodType:
  466.       found_func=eval("member.im_func")
  467.       tmp_string="check_class.__class__.__dict__['"+j+"']"
  468.       try:
  469.         reference_func=eval(tmp_string)
  470.       except:
  471.         reference_func=GetBaseMethod(check_class,j,bases)
  472.  
  473.       if found_func!=reference_func:
  474.         altered_beast[j]=member
  475.  
  476.  
  477.   return altered_beast
  478.  
  479.  
  480.  
  481. def GetFunctionFile(f):
  482.   if not f:
  483.     return "Error, None is not  a function"
  484.   try:
  485.     # No se si esto depende de W2000
  486.     import string
  487.     s=str(f.func_code)
  488.     s2=string.split(s,'"') # Siempre?
  489.     func_path=s2[1]  # Siempre?
  490.  
  491.     import os
  492.     filename=os.path.split(func_path)[1]
  493.     filename_noext=os.path.splitext(filename)[0]
  494.  
  495.     return filename_noext
  496.   except e:
  497.     print "Exception in GetFunctionFile",e
  498.     return "Error getting lib"
  499.  
  500.  
  501.  
  502.