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

  1. import Bladex
  2. import B3DLib
  3. import EnemyTypes
  4. import Actions
  5. import ItemTypes
  6. import math
  7. import Sounds
  8. import darfuncs
  9. import GameStateAux
  10. import ObjStore
  11.  
  12. def EnemyReady(ent_name):
  13.     print "Borrando '"+ent_name + "quad'"
  14.     o = Bladex.GetEntity(ent_name + "quad")    
  15.     if o:
  16.         o.SubscribeToList("Pin")
  17.     char=Bladex.GetEntity("Player1")
  18.     enm=Bladex.GetEntity(ent_name)    
  19.     Bladex.AddScheduledFunc(Bladex.GetTime(),enm.SetOnFloor,())
  20.     enm.InitPos=pos=enm.Position
  21.     v=char.Position[0]-pos[0], 0.0, char.Position[2]-pos[2]
  22.     v=B3DLib.Normalize(v)
  23.     alfa=-(3.14159/2.0)*(v[0]/abs(v[0]))+math.atan(v[2]/v[0])
  24.     enm.Face(alfa)
  25.     enm.Blind=0
  26.     enm.Deaf=0    
  27.     #enm.Position = 0,0,0
  28.     #enm.RemoveFromWorld()
  29.     #Bladex.AddScheduledFunc(Bladex.GetTime() + 2.0,enm.Data.enmgendata.GeneratorReady,(ent_name,))
  30.  
  31. class Point:
  32.     def __init__(self):
  33.         self.Name="Skl"
  34.         self.EnemyType="Skeleton"
  35.         self.WeaponType=""
  36.         self.WeaponBreak=0
  37.         self.ShieldType=""
  38.         self.ShieldBreak=0
  39.         self.Animation=""
  40.         self.Position = [0,0,0]
  41.         self.Level=None
  42.  
  43.  
  44. class EnmGenRnd:
  45.  
  46.     ObjId=0
  47.     Active=0
  48.     Ready=0        
  49.     NEnemies=4
  50.     NextEnemy=0        
  51.     InitGenFunc=""
  52.     GenerateNotifyFunc=""
  53.     FinishGenFunc=""
  54.     InitGenArgs=()
  55.     NPoints = 0
  56.     OnceEnm = 1
  57.     EnmActivates = 0
  58.     FinishGen = 0
  59.     Points = [0]
  60.     Enemies = [0]
  61.     p = 0
  62.     N_EnmGen = 0
  63.     DifTime = 0
  64.     VirGenPos = [0,0,0]
  65.     Last_Point = 0
  66.     NumDeaths  = 0
  67.     Level = 0
  68.     SonidoGen=None
  69.  
  70.     def __init__(self):
  71.         self.ObjId=ObjStore.GetNewId() # Para identificarlo al grabar/guardar
  72.         ObjStore.ObjectsStore[self.ObjId]=self
  73.         self.VirGenPos=[0,0,0]
  74.         self.Points = [0]
  75.         self.Enemies = [0]
  76.  
  77.     def GeneratorReady(self,ent_name):        
  78.         #enm=Bladex.GetEntity(ent_name)
  79.         #enmgen=enm.Data.enmgendata
  80.         #enmgen.Ready=1
  81.         print "Enemigo muero"
  82.         
  83.         self.NumDeaths = self.NumDeaths-1
  84.         
  85.         if self.NumDeaths == 0:
  86.             if self.OnEnd:
  87.                 self.OnEnd()
  88.         else:
  89.             print "Quedan ",self.NumDeaths,"Enemigos"
  90.  
  91.         enm = Bladex.GetEntity(ent_name)
  92.         enm.Data.ImDeadFuncX(ent_name)
  93.         
  94.         self.Enemies[enm.Data.NEnemy] = 0
  95.         self.EnmActivates = self.EnmActivates - 1        
  96.  
  97.         self.GenerateEnemy()
  98.  
  99.         
  100.         if (self.FinishGen and self.EnmActivates == 0):
  101.             if self.FinishGenFunc:
  102.                 apply(self.FinishGenFunc, (self,))
  103.  
  104.     def ActivateEnemy(self,point):        
  105.         enm = self.Enemies[self.NextEnemy]
  106.         if enm:            
  107.             darfuncs.UnhideBadGuy(enm.Name)
  108.             enm.Blind = 1
  109.             enm.Deaf  = 1
  110.             enm.Position = self.Points[point].Position
  111.             enm.Data.NEnemy = self.NextEnemy
  112.         return enm
  113.  
  114.     def GenerateEnemy(self):
  115.         enmgen = self
  116.         char=Bladex.GetEntity("Player1")
  117.         charpos = char.Position
  118.         lpt = self.Last_Point
  119.         point = self.GetBestGenerationPoint(charpos)
  120.         self.Last_Point = lpt
  121.         if not darfuncs.ValidAppear(self.Points[point].Position):
  122.             Bladex.AddScheduledFunc(Bladex.GetTime()+5.0, self.GenerateEnemy,())
  123.             
  124.             return
  125.         
  126.  
  127.         if enmgen.Ready:
  128.             nenemies = enmgen.OnceEnm - enmgen.EnmActivates
  129.  
  130.             if self.DifTime == 0:
  131.                 if nenemies > 1:
  132.                     if enmgen.NextEnemy + nenemies >= enmgen.NEnemies:
  133.                         nenemies = enmgen.NEnemies - enmgen.NextEnemy
  134.                         enmgen.Deactivate()
  135.                         enmgen.FinishGen = 1
  136.                 elif enmgen.NextEnemy + 1 >= enmgen.NEnemies:
  137.                     enmgen.Deactivate()
  138.                     enmgen.FinishGen = 1
  139.             elif nenemies > 1:
  140.                 if enmgen.NextEnemy + nenemies >= enmgen.NEnemies:
  141.                     nenemies = enmgen.NEnemies - enmgen.NextEnemy
  142.                     enmgen.Deactivate()
  143.                     enmgen.FinishGen = 1
  144.  
  145.                 if nenemies > 1:                    
  146.                     Bladex.AddScheduledFunc(Bladex.GetTime() + self.DifTime,self.GenerateEnemy,())
  147.                     nenemies = 1
  148.             elif enmgen.NextEnemy + 1 >= enmgen.NEnemies:
  149.                 enmgen.Deactivate()
  150.                 enmgen.FinishGen = 1
  151.  
  152.                 
  153.             enmgen.EnmActivates = enmgen.EnmActivates + nenemies
  154.  
  155.             t = 0
  156.  
  157.             for t in range(nenemies):                
  158.                 point = self.GetBestGenerationPoint(charpos)
  159.                 enm = self.ActivateEnemy(point)
  160.                 pos = enm.Position
  161.  
  162.                 enmgen.NextEnemy=enmgen.NextEnemy+1
  163.                 v=charpos[0]-pos[0], 0.0, charpos[2]-pos[2]                
  164.                 v=B3DLib.Normalize(v)                
  165.                 
  166.                 if v[0] > 0:
  167.                     alfa=-(3.14159/2.0)*(v[0]/abs(v[0]))+math.atan(v[2]/v[0])
  168.                 else:
  169.                     alfa = 3.14 * -v[1]
  170.  
  171.                 enm.Angle=alfa
  172.  
  173.                 if enmgen.Points[point].Animation:
  174.                     enm.SetTmpAnmFlags(1,1,1,0,5,1)
  175.                     enm.LaunchAnimation(enmgen.Points[point].Animation)                    
  176.                     enm.AnmEndedFunc=EnemyReady
  177.                     darfuncs.CreateFalseCube(enm.Position,-1,enm.Name)
  178.                 else:
  179.                     EnemyReady(enm.Name)
  180.                 
  181.                 Actions.TurnToFaceEntityNow(enm.Name,"Player1")                
  182.                 enm.Data.ImDeadFuncX = enm.ImDeadFunc
  183.                 enm.ImDeadFunc=self.GeneratorReady                
  184.  
  185.                 if enmgen.InitGenFunc:                    
  186.                     enmgen.SonidoGen.Position = pos
  187.                     enmgen.SonidoGen.PlaySound(0)
  188.  
  189.                     apply(enmgen.InitGenFunc, (enm,))
  190.  
  191.     def GetBestGenerationPoint(self,charpos):
  192.         point = self.p
  193.  
  194.         if point + 1 >= self.NPoints:
  195.             self.p = 0
  196.         else:
  197.             self.p = self.p + 1            
  198.  
  199.         for i in range(self.NPoints):
  200.             if point <> self.Last_Point:
  201.                 pos = self.Points[point].Position
  202.                 v=charpos[0]-pos[0], 0.0, charpos[2]-pos[2]
  203.  
  204.                 dist = v[0] * v[0] + v[2] * v[2]
  205.  
  206.                 if dist > 3000000:
  207.                     self.Last_Point = point
  208.                     return point
  209.  
  210.             point = point + 1
  211.  
  212.             if point >= self.NPoints:
  213.                 point = 0
  214.  
  215.         self.Last_Point = point
  216.         return point
  217.  
  218.     def AddPoint(self,pos,enemydscr=("Skl", "Skeleton", "", 0, "", 0), animation="", Level=None):
  219.         point = Point()
  220.         
  221.         point.Position = pos
  222.         point.Name=enemydscr[0]
  223.         point.EnemyType=enemydscr[1]
  224.         point.WeaponBreak=enemydscr[3]
  225.         point.WeaponType=enemydscr[2]
  226.         point.ShieldType=enemydscr[4]
  227.         point.ShieldBreak=enemydscr[5]
  228.         point.Animation=animation                
  229.         point.Level=Level
  230.         
  231.         self.Points[self.NPoints:self.NPoints] = [point]
  232.         self.NPoints = self.NPoints + 1
  233.         
  234.         self.NumDeaths  = self.NumDeaths+1
  235.  
  236.     def CreateEnemy(self,i):
  237.         Rage = self.Points[i].EnemyType
  238.         #Name = self.Points[i].Name
  239.         #pos = self.Points[point].Position
  240.         Name = self.Points[0].Name + `self.N_EnmGen`
  241.  
  242.         self.Points[i].Enm = enm=Bladex.CreateEntity(Name, Rage, self.VirGenPos[0],self.VirGenPos[1],self.VirGenPos[2],"Person")        
  243.         if self.Points[i].Level!=None: enm.Level= self.Points[i].Level
  244.         else: enm.Level= self.Level
  245.         enm.Blind=1
  246.         enm.Deaf=1
  247.  
  248.         if self.Points[i].WeaponType:
  249.             weapon=Bladex.CreateEntity("Weapon"+Name, self.Points[i].WeaponType, 0.0, 0.0, 0.0,"Weapon")
  250.             ItemTypes.ItemDefaultFuncs(weapon)
  251.             Actions.TakeObject(Name, weapon.Name)
  252.  
  253.             weapon.RemoveFromWorld()
  254.                 
  255.         if self.Points[i].ShieldType:
  256.             shield=Bladex.CreateEntity("Shield"+Name, self.Points[i].ShieldType, 0.0, 0.0, 0.0,"Weapon")
  257.             ItemTypes.ItemDefaultFuncs(shield)
  258.             Actions.TakeObject(Name, shield.Name)
  259.             shield.RemoveFromWorld()
  260.                 
  261.         
  262.         EnemyTypes.EnemyDefaultFuncs(enm)
  263.                 
  264.         enm.Data.enmgendata=self
  265.         darfuncs.HideBadGuy(enm.Name)
  266.         self.N_EnmGen = self.N_EnmGen + 1
  267.         
  268.         return enm        
  269.  
  270.  
  271.     def Activate(self):
  272.         if self.NextEnemy<=self.NEnemies:
  273.             self.Active=1
  274.             self.Ready=1
  275.             
  276.             j = i = 0
  277.             
  278.             for i in range(self.NEnemies):
  279.                 if (j >= self.NPoints):
  280.                     j = 0
  281.                 
  282.                 en = self.CreateEnemy(j)
  283.                 if self.CallBak:
  284.                     self.CallBak(en)
  285.  
  286.                 self.Enemies[i:i] = [en]
  287.                 j = j + 1
  288.  
  289.     def Deactivate(self):
  290.         self.Active=0
  291.         self.Ready=0
  292.         #Bladex.RemoveTriggerSectorFunc(self.TrSector, "OnEnter")
  293.  
  294.     def persistent_id(self):
  295.         return self.ObjId
  296.  
  297.     def __del__(self):
  298.         del ObjStore.ObjectsStore[self.ObjId]
  299.  
  300.     def __GetNameEnemies__(self):
  301.         Names = []
  302.         for i in range (self.NEnemies):
  303.             if self.Enemies[i]:
  304.                 Names.append(self.Enemies[i].Name)
  305.             else:
  306.                 Names.append(None)
  307.         
  308.         return Names
  309.  
  310.     def __GetPointsGeneration__(self):
  311.         Points = []        
  312.         for i in range(self.NPoints):
  313.             Points.append((self.Points[i].Position,self.Points[i].Animation))
  314.         return Points
  315.  
  316.     def __SetEnemies__(self,enemies):
  317.         self.Enemies = []
  318.         
  319.         for i in range(self.NEnemies):
  320.             if enemies[i] <> None:
  321.                 self.Enemies.append(Bladex.GetEntity(enemies[i]))
  322.             else:
  323.                 self.Enemies.append(0)
  324.  
  325.     def __SetPoints__(self,points):
  326.         self.Points = []
  327.  
  328.         for i in range(self.NPoints):
  329.             p = Point()
  330.             p.Position = points[i][0]
  331.             p.Animation = points[i][1]
  332.             self.Points.append(p)
  333.  
  334.     def __getstate__(self):
  335.         # Tiene que devolver c≤mo poder guardar el estado de la clase
  336.         stick_objId=None
  337.         return (1,
  338.                 self.ObjId,
  339.                 self.Ready,
  340.                 self.OnceEnm,
  341.                 self.EnmActivates,
  342.                 self.DifTime,
  343.                 self.NextEnemy,
  344.                 self.NEnemies,
  345.                 self.FinishGen,
  346.                 self.p,
  347.                 self.Active,
  348.                 self.NPoints,
  349.                 self.Last_Point,
  350.                 self.NumDeaths,                
  351.                 GameStateAux.SaveFunctionAux(self.InitGenFunc),
  352.                 self.InitGenArgs,
  353.                 GameStateAux.SaveFunctionAux(self.GenerateNotifyFunc),
  354.                 GameStateAux.SaveFunctionAux(self.FinishGenFunc),
  355.                 self.__GetNameEnemies__(),
  356.                 self.__GetPointsGeneration__(),
  357.                 GameStateAux.SaveEntityAux(self.SonidoGen),
  358.                 GameStateAux.SaveNewMembers(self)
  359.                 )
  360.  
  361.     def __setstate__(self,parm):
  362.         # Toma como parßmetro lo que devuelve __getstate__() y debe recrear la clase
  363.         if parm[0]==1:
  364.             #self.ObjId=parm[1] En GameStateAux.PersistentObject()
  365. ##            GameStateAux.PersistentObject.__setstate__(self,parm)
  366.             self.ObjId=parm[1]
  367. ##            GameStateAux.LoadedPickledData[self.ObjId]=self
  368.             ObjStore.ObjectsStore[self.ObjId]=self
  369.             self.Ready=parm[2]
  370.             self.OnceEnm=parm[3]
  371.             self.EnmActivates=parm[4]
  372.             self.DifTime=parm[5]
  373.             self.NextEnemy=parm[6]
  374.             self.NEnemies=parm[7]
  375.             self.FinishGen=parm[8]
  376.             self.p=parm[9]
  377.             self.Active=parm[10]
  378.             self.NPoints=parm[11]
  379.             self.Last_Point=parm[12]
  380.             self.NumDeaths=parm[13]            
  381.             GameStateAux.LoadFunctionAux(parm[14],self,"InitGenFunc")
  382.             self.InitGenArgs=parm[15]
  383.             GameStateAux.LoadFunctionAux(parm[16],self,"GenerateNotifyFunc")
  384.             GameStateAux.LoadFunctionAux(parm[17],self,"FinishGenFunc")
  385.             self.__SetEnemies__(parm[18])
  386.             self.__SetPoints__(parm[19])
  387.             self.SonidoGen = GameStateAux.LoadEntityAux(parm[20])
  388.             print "EnmGenRnd.__setstate__ self.SonidoGen",self.SonidoGen
  389.             GameStateAux.LoadNewMembers(self,parm[21])
  390.  
  391.         else:
  392.             print "Warning -> Version mismatch in EnmGenRnd."
  393.             # Valores de creaci≤n por si valen para algo.
  394.             self.Ready=0
  395.             self.OnceEnm=0
  396.             self.EnmActivates=0
  397.             self.DifTime=0
  398.             self.NextEnemy=0
  399.             self.NEnemies=0
  400.             self.FinisGen=0
  401.             self.p=0
  402.             self.Active=0
  403.             self.NPoints=0
  404.             self.Last_Point=0
  405.             self.NumDeaths=0
  406.             self.InitGenArgs=()
  407.             self.InitGenFunc=None
  408.             self.GenerateNotifyFunc=None
  409.             self.FinishGenFunc=None
  410.             self.ObjId=ObjStore.GetNewId()
  411.             ObjStore.ObjectsStore[self.ObjId]=self
  412.  
  413. def CreateEnemiesGenerator(nenemies=4, enmonce=2,SonidoGen = '..\\..\\Sounds\\M-GENERADOR-ENTIERRA3.wav'):
  414.     enmgen=EnmGenRnd()    
  415.     #enmgen.TrSector=trsector    
  416.     enmgen.NEnemies=nenemies
  417.     enmgen.OnceEnm = enmonce
  418.  
  419.     enmgen.SonidoGen = Sounds.CreateEntitySound(SonidoGen, 'GenTierra')
  420.     enmgen.SonidoGen.Volume=0.3
  421.     enmgen.SonidoGen.MinDistance=5000
  422.     enmgen.SonidoGen.MaxDistance=20000
  423.     enmgen.CallBak = None
  424.     enmgen.OnEnd   = None
  425.  
  426.     #enmgen.AddPoint((x,y,z))
  427.     #Bladex.SetTriggerSectorData(trsector, enmgen)
  428.  
  429.     return enmgen
  430.  
  431. def CreateEnemy(pos,Name,Rage,WeaponType,WeaponBreak,ShieldType,ShieldBreak,Level=0):
  432.     enm=Bladex.CreateEntity(Name, Rage, pos[0],pos[1],pos[2],"Person")
  433.     enm.Blind=1
  434.     enm.Deaf=1
  435.     enm.Level=Level
  436.  
  437.     if WeaponType:
  438.         weapon=Bladex.CreateEntity("Weapon"+Name, WeaponType, pos[0], pos[1], pos[2],"Weapon")
  439.         ItemTypes.ItemDefaultFuncs(weapon)        
  440.         Actions.TakeObject(Name, weapon.Name)
  441.  
  442.     if ShieldType:
  443.         shield=Bladex.CreateEntity("Shield"+Name, ShieldType, 0.0, 0.0, 0.0)
  444.         ItemTypes.ItemDefaultFuncs(shield)
  445.         Actions.TakeObject(Name, shield.Name)
  446.     
  447.     EnemyTypes.EnemyDefaultFuncs(enm)
  448.     enm.Data.Position = pos    
  449.     
  450.     #enm.Position = 0,0,0
  451.     darfuncs.HideBadGuy(enm.Name)
  452.  
  453.     return enm
  454.  
  455. def ActivateEnemy(enm):
  456.     enm.Position = enm.Data.Position
  457.     darfuncs.UnhideBadGuy(enm.Name)
  458.