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

  1. #
  2. #
  3. # Basic funcions that are launch trough the code
  4. # Both for the main player/s AND the Non Playing Characters !
  5. #
  6. #
  7.  
  8. import Bladex
  9. import AuxTran
  10. import Actions
  11. import Blood
  12. import Damage
  13. import AniSound
  14. import Reference
  15. import pdb
  16. import CharStats
  17. import copy
  18. import ItemTypes
  19. import netgame
  20. import whrandom
  21. import MenuText
  22. import AuxFuncs
  23. import GenFX
  24. import Auras
  25. import ObjStore
  26. import GameStateAux
  27. import BInput
  28. import InitDataField
  29.  
  30. new_combo_sound = Bladex.CreateSound('..\\..\\Sounds\\sesgado-lava.wav', 'NewComboSound')
  31. new_combo_sound.Volume=1.0
  32. new_combo_sound.MinDistance=5000
  33. new_combo_sound.MaxDistance=20000
  34.  
  35. # Useful general functions
  36.  
  37. ############################  Energy Functions  ############################
  38.  
  39. RestoreEnergyTime= 1.0/20.0
  40. EnergyMin= 14.0
  41. #RestoreEnergyRateMin= 0.005*EnergyMin
  42. #RestoreEnergyRateMin= 0.095*EnergyMin
  43. #RestoreEnergyRateMax= 0.095*EnergyMin
  44. RestoreEnergyRateMin= 0.005
  45. RestoreEnergyRateMax= 0.095
  46.  
  47. def RestoreEnergyFunc(EntityName):
  48.     Bladex.AddScheduledFunc(Bladex.GetTime()+RestoreEnergyTime, RestoreEnergyFunc,(EntityName,),"PlayerRestoreEnergy")
  49.     pj=Bladex.GetEntity(EntityName)
  50.     if pj:
  51.         max_energy= CharStats.GetCharMaxEnergy(pj.Kind, pj.Level)
  52.         prev_energy= pj.Energy
  53.         if pj.InAttack:
  54.             energy2lose= min (pj.Data.LoseEnergyRate*RestoreEnergyTime, pj.Data.Energy2Lose)
  55.             pj.Energy= max(prev_energy-energy2lose, -max_energy*Reference.ENERGY_LOW_LEVEL)
  56.             pj.Data.Energy2Lose= pj.Data.Energy2Lose-energy2lose
  57.             if pj.Energy<=0.0 and pj.AnmPos>0.8:
  58.                 pj.Gof=0
  59.                 pj.Gob=0
  60.                 pj.Tl=0
  61.                 pj.Tr=0
  62.                 pj.InterruptCombat()
  63.                 pj.RaiseEvent("Interrupt")
  64.             
  65.             """
  66.             if pj.Energy<=0.0 and not prev_energy<=0.0 and pj.AnimName!='Rlx_vt':
  67.                 #pj.DoActionWI("Rlx_vt",  0, 0.65, 0.0)
  68.                 pj.Gof=0
  69.                 pj.Gob=0
  70.                 pj.Tl=0
  71.                 pj.Tr=0
  72.                 
  73.                 pj.LaunchAnmType("Rlx_vt")
  74.             """
  75.         else:
  76.             energyF= pow(1.0-(pj.Level/(CharStats.GetMaxLevel()*1.0)), 2)
  77.             RestoreEnergyRate= energyF*(RestoreEnergyRateMax-RestoreEnergyRateMin)+RestoreEnergyRateMin
  78.             new_energy= max(min((prev_energy+RestoreEnergyRate*max_energy)-pj.Data.Energy2Lose, max_energy),-max_energy*Reference.ENERGY_LOW_LEVEL)
  79.             
  80.             
  81.             pj.Energy= new_energy
  82.             pj.Data.Energy2Lose= 0.0
  83.             """
  84.             if (new_energy/max_energy) > Reference.ENERGY_LOW_LEVEL and pj.AnimName=='Rlx_vt':
  85.                 pj.InterruptCombat()
  86.                 pj.Attack=0
  87.                 pj.RaiseEvent("Recover")
  88.             """
  89.  
  90.  
  91. ############################                 ############################
  92.  
  93.  
  94. # Define the base python person class
  95. class PlayerPerson:
  96.  
  97.     ObjId=0
  98.     NPC = 0
  99.     Name = "Unnamed"
  100.     DamageFactorNone  = -0.001
  101.     DamageFactorLight = 0.1
  102.     DamageFactorHeavy = 0.35
  103.     TakeBleedingImpact= 0
  104.     ThrownBy= None
  105.     PowerPotion = 0
  106.     FAttack = 1.0
  107.     FDefense = 1.0
  108.     AimPressed= 0
  109.     stuff_onback_b4= 0
  110.     toggle4t_clearback= 0
  111.     LoseEnergyRate= 0.0    
  112.     Energy2Lose= 0.0
  113.     last_frwdup=-1
  114.     last_brwdup=-1
  115.     armour_level=0
  116.     armour_prot_factor=0
  117.     Poisoned=0
  118.     NoFXOnHit= 1    
  119.     Resistances=None    
  120.     ObjectsTaken= []
  121.     LevelUpParticleData=[]
  122.     Invincibility= 0
  123.     InventoryActive=1
  124.  
  125.     def __init__(self, me):
  126.  
  127.         
  128.         self.InventoryActive = me.Name[0:6] != "Player"
  129.         self.ObjId=ObjStore.GetNewId() # Para identificarlo al grabar/guardar
  130.         ObjStore.ObjectsStore[self.ObjId]=self
  131.  
  132.         self.ObjectsTaken= []
  133.         self.LevelUpParticleData=[]
  134.         #_________________________________________#
  135.         #  Record some personal data              #
  136.         #_________________________________________#        
  137.  
  138.         self.Name = me.Name
  139.  
  140.         #_________________________________________#
  141.         # Set up the core functions               #
  142.         #_________________________________________#
  143.         me.DamageFunc = Damage.CalculateDamage
  144.         me.AttackFunc= Damage.CalculateFatigue
  145.         me.TakeFunc = self.TakeFunc
  146.         me.ThrowFunc = self.ThrowFunc        
  147.         me.HitFunc = self.HitFunc        
  148.         me.ImDeadFunc = self.PCImDead
  149.         me.NewComboFunc=self.StdNewCombo
  150.         me.BigFallFunc=self.StdBigFall
  151.         #me.ToggleCombatFunc=self.StdToggleCombat
  152.  
  153.         me.Life= CharStats.GetCharMaxLife(me.Kind, me.Level)
  154.         me.Energy= CharStats.GetCharMaxEnergy(me.Kind, me.Level)
  155.  
  156.         #_________________________________________#
  157.         # Initialise core                         #
  158.         #_________________________________________#        
  159.         me.AddAnmEventFunc("TakeArrow", Actions.TakeArrowEventHandler)
  160.         me.AddAnmEventFunc("CheckRefireBow", Actions.CheckRefireBowEventHandler)
  161.  
  162.         me.AddAnmEventFunc("W2hToLeft", Actions.W2hToLeftHandler)
  163.         me.AddAnmEventFunc("W2hToRight", Actions.W2hToRightHandler)
  164.         me.AddAnmEventFunc("LaunchTrail", self.LaunchTrail)
  165.  
  166.         me.AddAnmEventFunc("Start_Weapon", Actions.Start_Weapon)
  167.         me.AddAnmEventFunc("Stop_Weapon", Actions.Stop_Weapon)
  168.         me.AddAnmEventFunc("Start_Trail", Actions.Start_Trail)
  169.         me.AddAnmEventFunc("Stop_Trail", Actions.Stop_Trail)
  170.         me.AddAnmEventFunc("GraspString", Actions.GraspString)
  171.         me.AddAnmEventFunc("UnGraspString", Actions.UnGraspString)
  172.         me.MutilateFunc= self.MutilateFunc
  173.  
  174.         self.Resistances= copy.copy(CharStats.GetCharResistances(me.Kind))
  175.         self.ResetSounds(self.Name)
  176.  
  177.         ##### Energy Fuctions ####
  178.         if self.Name[0:6] == "Player":
  179.             self.LevelUpParticleData=[]
  180.             for i in range(30):
  181.                 if i>25:
  182.                     traux=(30.0-i)/5.0 #va de 0 a 1
  183.                     aux=traux**0.5
  184.                 else:
  185.                     traux=i/25.0 #va de 1 a 0
  186.                     aux=traux**2.0
  187.                 r=255
  188.                 g=255
  189.                 b=255
  190.                 a=255.0*traux
  191.                 size=200.0*aux
  192.                 self.LevelUpParticleData.append(a)
  193.                 self.LevelUpParticleData.append(size)
  194.                 Bladex.SetParticleGVal("LevelUpParticle",i,r,g,b,a,size)
  195.             Bladex.AddScheduledFunc(Bladex.GetTime()+RestoreEnergyTime, RestoreEnergyFunc,(self.Name,),"PlayerRestoreEnergy")
  196.  
  197.  
  198.     def __del__(self):
  199.         del ObjStore.ObjectsStore[self.ObjId]
  200.  
  201.  
  202.     def ResetSounds(self, EntityName):
  203.         me=Bladex.GetEntity(EntityName)
  204.         kind=me.Kind[:len(me.Kind)-2]
  205.         if kind=="Barbarian":
  206.             AniSound.AsignarSonidosBarbaro(EntityName)
  207.         elif kind=="Knight":
  208.             AniSound.AsignarSonidosCaballero(EntityName)
  209.         elif kind=="Dwarf":
  210.             AniSound.AsignarSonidosEnano(EntityName)
  211.         elif kind=="Amazon":
  212.             AniSound.AsignarSonidosAmazona(EntityName)
  213.  
  214.     def GetNewMembers(self):
  215.         bases=self.__class__.__bases__
  216.         new_members={}
  217.         for i in bases:
  218.             base_dict=i.__dict__
  219.             for j in base_dict.keys():
  220.                 if type(base_dict[j])==types.IntType:
  221.                     new_members[j]=base_dict[j]
  222.  
  223.  
  224.     def persistent_id(self):
  225.         return self.ObjId
  226.  
  227.     def __getstate__(self):
  228.         # Tiene que devolver c≤mo poder guardar el estado de la clase
  229.  
  230.         return (1,{"PlayerPerson":(self.ObjId,
  231.                                    self.NPC,
  232.                                    self.Name,
  233.                                    self.DamageFactorNone,
  234.                                    self.DamageFactorLight,
  235.                                    self.DamageFactorHeavy,
  236.                                    self.TakeBleedingImpact,
  237.                                    self.ThrownBy,
  238.                                    self.PowerPotion,
  239.                                    self.FAttack,
  240.                                    self.FDefense,
  241.                                    self.AimPressed,
  242.                                    self.stuff_onback_b4,
  243.                                    self.toggle4t_clearback,
  244.                                    self.last_frwdup,
  245.                                    self.last_brwdup,
  246.                                    self.LoseEnergyRate,
  247.                                    self.Energy2Lose,
  248.                                    self.Resistances,
  249.                                    self.armour_level,
  250.                                    self.armour_prot_factor,
  251.                                    self.Poisoned,                                   
  252.                                    self.ObjectsTaken,
  253.                                    self.Invincibility,
  254.                                    self.InventoryActive,
  255.                                    GameStateAux.SaveNewMembers(self))
  256.                    }
  257.                 )
  258.  
  259.     def persistent_check(self):
  260.         me=Bladex.GetEntity(self.Name)
  261.         if not me:
  262.             return 0
  263.         return 1
  264.  
  265.     def __setstate__(self,parm):
  266.         # Toma como parßmetro lo que devuelve __getstate__() y debe recrear la clase
  267.         version=parm[0]
  268.         if version==1:
  269.             parms=parm[1]["PlayerPerson"]
  270.             self.ObjId=parms[0]
  271.             ObjStore.ObjectsStore[self.ObjId]=self
  272.             self.NPC=parms[1]
  273.             self.Name=parms[2]
  274.             self.DamageFactorNone=parms[3]
  275.             self.DamageFactorLight=parms[4]
  276.             self.DamageFactorHeavy=parms[5]
  277.             self.TakeBleedingImpact=parms[6]
  278.             self.ThrownBy=parms[7]
  279.             self.PowerPotion=parms[8]
  280.             self.FAttack=parms[9]
  281.             self.FDefense=parms[10]
  282.             self.AimPressed=parms[11]
  283.             self.stuff_onback_b4=parms[12]
  284.             self.toggle4t_clearback=parms[13]
  285.             self.last_frwdup=parms[14]
  286.             self.last_brwdup=parms[15]
  287.             self.LoseEnergyRate=parms[16]
  288.             self.Energy2Lose=parms[17]
  289.             self.Resistances=parms[18]            
  290.             self.armour_level=parms[19]            
  291.             self.armour_prot_factor=parms[20]
  292.             self.Poisoned=parms[21]
  293.             self.ObjectsTaken=parms[22]
  294.             self.Invincibility=parms[23]
  295.             self.InventoryActive=parms[24]
  296.             GameStateAux.LoadNewMembers(self,parms[25])
  297.             
  298.         else:
  299.             print "ERROR, Incorrect version"
  300.             self.ObjId=ObjStore.GetNewId()
  301.             ObjStore.ObjectsStore[self.ObjId]=self
  302.         
  303.         if self.Name[0:6] == "Player":
  304.             self.LevelUpParticleData=[]
  305.             for i in range(30):
  306.                 if i>25:
  307.                     traux=(30.0-i)/5.0 #va de 0 a 1
  308.                     aux=traux**0.5
  309.                 else:
  310.                     traux=i/25.0 #va de 1 a 0
  311.                     aux=traux**2.0
  312.                 r=255
  313.                 g=255
  314.                 b=255
  315.                 a=255.0*traux
  316.                 size=200.0*aux
  317.                 self.LevelUpParticleData.append(a)
  318.                 self.LevelUpParticleData.append(size)
  319.                 Bladex.SetParticleGVal("LevelUpParticle",i,r,g,b,a,size)
  320.             Bladex.AddScheduledFunc(Bladex.GetTime()+RestoreEnergyTime, RestoreEnergyFunc,(self.Name,),"PlayerRestoreEnergy")
  321.         
  322.         me=Bladex.GetEntity(self.Name)
  323.         if not me:
  324.             print "PlayerPerson.__setstate__() Warning, can not get entity", self.Name
  325.             return
  326.         #_________________________________________#
  327.         # Set up the core functions               #
  328.         #_________________________________________#
  329.         me.DamageFunc = Damage.CalculateDamage
  330.         me.TakeFunc = self.TakeFunc
  331.         me.ThrowFunc = self.ThrowFunc        
  332.         me.HitFunc = self.HitFunc        
  333.         me.ImDeadFunc = self.PCImDead
  334.         me.NewComboFunc=self.StdNewCombo
  335.         me.BigFallFunc=self.StdBigFall
  336.         me.AttackFunc= Damage.CalculateFatigue        
  337.         
  338.         #_________________________________________#
  339.         # Initialise core                         #
  340.         #_________________________________________#        
  341.         me.AddAnmEventFunc("TakeArrow", Actions.TakeArrowEventHandler)
  342.         me.AddAnmEventFunc("CheckRefireBow", Actions.CheckRefireBowEventHandler)
  343.  
  344.         me.AddAnmEventFunc("W2hToLeft", Actions.W2hToLeftHandler)
  345.         me.AddAnmEventFunc("W2hToRight", Actions.W2hToRightHandler)
  346.         me.AddAnmEventFunc("LaunchTrail", self.LaunchTrail)
  347.         me.AddAnmEventFunc("Start_Weapon", Actions.Start_Weapon)
  348.         me.AddAnmEventFunc("Stop_Weapon", Actions.Stop_Weapon)
  349.         me.AddAnmEventFunc("Start_Trail", Actions.Start_Trail)
  350.         me.AddAnmEventFunc("Stop_Trail", Actions.Stop_Trail)
  351.         me.MutilateFunc= self.MutilateFunc
  352.  
  353.         self.NoFXOnHit= 1
  354.         self.ResetSounds(self.Name)
  355.  
  356.     #_________________________________________#
  357.     # Define our functions                    #
  358.     #_________________________________________#    
  359.     def MutilateFunc(self,EntityName,obj_name,x,y,z,nx,ny,nz,node):
  360.         print EntityName+": MutilateFunc"
  361.         me = Bladex.GetEntity(EntityName)
  362.         if me and me.Kind!="Skeleton":
  363.             Blood.Mutilate (EntityName,obj_name,x,y,z,nx,ny,nz,node)
  364.         limb= Bladex.GetEntity(obj_name)
  365.         InitDataField.Initialise(limb)
  366.         limb.Data.NoFXOnHit= 1
  367.         print limb.Mass, node
  368.         if limb.Mass > 1.5 and limb.Mass < 7.0:
  369.             Reference.EntitiesSelectionData[obj_name]= Reference.DefaultSelectionData["Limb"]
  370.             Reference.EntitiesObjectData[obj_name]= Reference.DefaultObjectData['Limb']
  371.  
  372.     def TakeFunc (self, MyName):
  373.         Actions.StdUse (MyName)
  374.  
  375.     def ThrowFunc (self, MyName):
  376.         Actions.StdThrowObject (MyName)
  377.  
  378.     def HitFunc (self, EntityName, WeaponName, Cx, Cy, Cz, Px, Py, Pz, WeaponCx, WeaponCy, WeaponCz,WeaponDx, WeaponDy, WeaponDz):
  379.         if self.TakeBleedingImpact:            
  380.             Blood.BleedingImpact(Bladex.GetEntity(EntityName), Cx, Cy, Cz, Px, Py, Pz,Bladex.GetEntity(WeaponName),WeaponCx, WeaponCy, WeaponCz,WeaponDx, WeaponDy, WeaponDz)
  381.             self.TakeBleedingImpact= 0
  382.             #print "BloodImpact"
  383.         #else:
  384.             #print "NoBloodImpact"
  385.     
  386.     def ReSpawn (self, EntityName):        
  387.         print "Respawn Func"
  388.         me = Bladex.GetEntity(EntityName)
  389.         
  390.         right= me.InvRight
  391.         left= me.InvLeft
  392.         rightback= me.InvRightBack
  393.         leftback= me.InvLeftBack
  394.         
  395.         self.UnlinkAll (EntityName, "")  # Dettatch arrows        
  396.         
  397.         inv= me.GetInventory()
  398.         # Right Back
  399.         if rightback:
  400.             inv.LinkRightHand (rightback)
  401.             inv.LinkBack(rightback)        
  402.         # Left Back
  403.         if leftback:
  404.             inv.LinkLeftHand (leftback)
  405.             inv.LinkBack(leftback)
  406.         # Right hand        
  407.         if right:
  408.             inv.LinkRightHand (right)
  409.         # Left hand
  410.         if left:
  411.             inv.LinkLeftHand (left)
  412.         
  413.         me.Life= CharStats.GetCharMaxLife(me.Kind, me.Level)
  414.         me.Energy= CharStats.GetCharMaxEnergy(me.Kind, me.Level)
  415.         me.ResetWounds()
  416.                 
  417.         if self.Poisoned:
  418.             self.UnVenom ()
  419.         
  420.         x,y,z= me.Position
  421.         import darfuncs
  422.         darfuncs.CleanArea(x,y,z, 5000.0)
  423.         
  424.         # Link camera
  425.         if(netgame.GetNetState()==0):
  426.             Bladex.AddScheduledFunc(Bladex.GetTime()+0.2, self.RelinkCamera,(),"RelinkCamera")
  427.         angle= me.Angle
  428.         me.Orientation= (0.0, 3.62407746479e-007, 0.707107365131, -0.707106947899)
  429.         me.Angle= angle
  430.     
  431.     def RelinkCamera(self):
  432.         cam=Bladex.GetEntity("Camera")
  433.         cam.SetPersonView("Player1")
  434.     
  435.     def UnlinkAll (self, EntityName,EventName):        
  436.         me = Bladex.GetEntity(EntityName)
  437.         # Usually done on the last frame of a death animation        
  438.         me.UnlinkChildren()        
  439.         
  440.     def GetResistance(self, DamageType):
  441.         if self.Resistances.has_key(DamageType): resistance= self.Resistances[DamageType]
  442.         else: resistance= 0.0
  443.         resistance= min(max(resistance,0.0),1.0)
  444.         
  445.         # Do we have any items that offer protections aginst this damage
  446.         me=Bladex.GetEntity(self.Name)
  447.         if me:
  448.             inv= me.GetInventory()
  449.             for i in range (inv.nKindObjects):
  450.                 obj_name= inv.GetObject(i)
  451.                 object= Bladex.GetEntity(obj_name)
  452.                 try:
  453.                     if object.Data:
  454.                         if object.Data.Resistances:
  455.                             if object.Data.Resistances.has_key(DamageType):
  456.                                 # Adding 0.5 to 0.5 gives 0.75 !!!
  457.                                 extra_resistance= object.Data.Resistances[DamageType]*(1.0-resistance)
  458.                                 resistance= resistance+extra_resistance
  459.                                 resistance= min(max(resistance,0.0),1.0)
  460.                 except AttributeError: pass        
  461.         return resistance
  462.         
  463.         
  464.     def UnVenom (self):
  465.         self.Poisoned= 0        
  466.         
  467.     def ReVenom (self, EntityName, VenomStrength, TimeRemaining, Frequency, Poisoner):
  468.         if self.Poisoned:
  469.             
  470.             if BInput.GetInputManager().GetInputActionsSet()!= "Default":
  471.                 Bladex.AddScheduledFunc(Bladex.GetTime()+Frequency, self.ReVenom,(EntityName,VenomStrength, TimeRemaining, Frequency, Poisoner),self.Name+"ReVenom")
  472.             else:
  473.                 NextTimeRemaining= TimeRemaining-Frequency
  474.                         
  475.                 me= Bladex.GetEntity(EntityName)
  476.                 if me and me.Life>0:
  477.                     special_resistance= self.GetResistance('Venom')
  478.                     if special_resistance < 1.0:
  479.                         if NextTimeRemaining>0.0:
  480.                             Bladex.AddScheduledFunc(Bladex.GetTime()+Frequency, self.ReVenom,(EntityName,VenomStrength, NextTimeRemaining, Frequency, Poisoner),self.Name+"ReVenom")
  481.                         else:
  482.                         
  483.                             VenomStrength= VenomStrength*(TimeRemaining/Frequency)
  484.                         
  485.                             # remove this poison source
  486.                             self.Poisoned= self.Poisoned-1
  487.                             if not self.Poisoned:
  488.                                 self.UnVenom ()
  489.                         
  490.                         current_venom_damage= VenomStrength-(VenomStrength*special_resistance)
  491.                         me.Life= me.Life- current_venom_damage
  492.                         if me.Life<=0:
  493.                             enemy= Bladex.GetEntity(Poisoner)
  494.                             if enemy:
  495.                                 try: enemy.Data.OnKilledEnemy(EntityName)
  496.                                 except: pass
  497.                     else:
  498.                         self.UnVenom ()
  499.                         
  500.     def EnVenom (self, EntityName, VenomStrength, Poisoner):
  501.         me= Bladex.GetEntity(EntityName)
  502.         if me and me.Life>0:
  503.             # Are we immune to poison?
  504.             special_resistance= self.GetResistance('Venom')
  505.             if special_resistance < 1.0:
  506.                 time=Bladex.GetTime()
  507.                 if not self.Poisoned:
  508.                     # Set message on the health bar if we are "Player1"
  509.                     # visual effect (green flash)
  510.                     aura= Auras.MakeAura (EntityName,0.7,   (55,0.1,1.0,1,0,0), (),(),(2,  0.0,0.35,0.0, 0.2, 0.0  , 0.0,0.35,0.0, 0.1, 1.0))
  511.                     aura.Data.AddEvent(time+0.2,           (45,1.0,1.0,1,0,0), (),(),(2,  0.0,0.35,0.0, 0.2, 0.0  , 0.0,0.35,0.0, 0.1, 1.0))
  512.                     aura.Data.AddEvent(time+0.7,           (5,0.1,1.0,1,0,0),  (),(),(2,  0.0,0.35,0.0, 0.2, 0.0  , 0.0,0.35,0.0, 0.1, 1.0))
  513.                 
  514.                 # Add another poison source
  515.                 self.Poisoned= self.Poisoned+1
  516.                 # add a scheduled function to suffer poison damage
  517.                 VenomTime= 60.0
  518.                 Frequency= 5.0
  519.                 Bladex.AddScheduledFunc(time+Frequency, self.ReVenom,(EntityName,VenomStrength, VenomTime, Frequency, Poisoner),self.Name+"ReVenom")
  520.         
  521.     
  522.     def LaunchTrail (self, EntityName,EventName):
  523.         me = Bladex.GetEntity(EntityName)
  524.         if me and me.InvRight:
  525.             x, y, z= me.Rel2AbsPoint(1000.0, 0.0, 0.0)
  526.             trail= ItemTypes.MakeHalfmoonTrail (EntityName+"Trail", x,y,z,EntityName)
  527.             trail.Data.ThrowReleaseEventHandler (EntityName,"")
  528.                 
  529.     def PCImDead (self, EntityName):
  530.         me = Bladex.GetEntity(EntityName)
  531.         me.AddAnmEventFunc("UnlinkAll", self.UnlinkAll)
  532.  
  533.         already_death=0
  534.         Damage.DropInvalidObjectsOnImpact(EntityName)
  535.         anim_name=me.AnimName
  536.         if (anim_name[0]=="D" or anim_name[0]=="d") and (anim_name[1]=="T" or anim_name[1]=="t") and (anim_name[2]=="H" or anim_name[2]=="h"):
  537.             already_death=1
  538.             #print "Already death!"
  539.  
  540.         if already_death==0:
  541.             death_anim="dth0"
  542.             if me.MutilationsMask==2:
  543.                 dth_prob=whrandom.uniform(0.0, 1.0)
  544.                 if (dth_prob<0.142):
  545.                     death_anim="dth_c1"
  546.                 elif (dth_prob<0.286):
  547.                     death_anim="dth_c2"
  548.                 elif (dth_prob<0.428):
  549.                     death_anim="dth_c3"
  550.                 elif (dth_prob<0.571):
  551.                     death_anim="dth_c4"
  552.                 elif (dth_prob<0.714):
  553.                     death_anim="dth_c5"
  554.                 elif (dth_prob<0.857):
  555.                     death_anim="dth_c6"
  556.                 else:
  557.                     death_anim="dth_c7"
  558.             else:
  559.                 dth_prob=whrandom.uniform(0.0, 1.0)
  560.                 if (dth_prob<0.142):
  561.                     death_anim="dth_n00"
  562.                 elif (dth_prob<0.286):
  563.                     death_anim="dth_n01"
  564.                 elif (dth_prob<0.428):
  565.                     death_anim="dth_n02"
  566.                 elif (dth_prob<0.571):
  567.                     death_anim="dth_n03"
  568.                 elif (dth_prob<0.714):
  569.                     death_anim="dth_n04"
  570.                 elif (dth_prob<0.857):
  571.                     death_anim="dth_n05"
  572.                 else:
  573.                     death_anim="dth_n06"
  574.  
  575.             me.Wuea=Reference.WUEA_ENDED
  576.             launch_new=1
  577.             #print "Dth_Anim " + death_anim + " has Rsteps " + str(Bladex.AnmTypeRSteps(EntityName,death_anim)) + " and Lsteps " +str(Bladex.AnmTypeLSteps(EntityName,death_anim))
  578.             if (me.MutilationsMask==512 or me.MutilationsMask==256) and Bladex.AnmTypeRSteps(EntityName,death_anim)>1:
  579.                 #print "No dth due to not having right leg!"
  580.                 launch_new=0
  581.             elif (me.MutilationsMask==128 or me.MutilationsMask==64) and Bladex.AnmTypeLSteps(EntityName,death_anim)>1:
  582.                 #print "No dth due to not having left leg!"
  583.                 launch_new=0
  584.  
  585.             if launch_new==1:
  586.                 me.LaunchAnmType(death_anim)
  587.  
  588.             if me.AnimName<>death_anim:
  589.                 me.LaunchAnmType("dth0")
  590.                 if me.AnimName<>"dth0":
  591.                     #pdb.set_trace()
  592.                     print "BUG? -> Basdic_Funcs.py , def PCImDead()"
  593.  
  594.  
  595.         # unlink the camera
  596.         cam=Bladex.GetEntity("Camera")
  597.         if EntityName==cam.ETarget:
  598.             cam.SType=0
  599.             cam.TType=2
  600.             cam.ETarget='Player1'
  601.  
  602.         #Do NOT respawn in demo_mode
  603.         if Reference.DEMO_MODE==0:
  604.             if (not self.NPC) and (netgame.GetNetState()==0): # "and 0" by Dario (don't killme please)
  605.                 if Reference.PYTHON_DEBUG >= 2:
  606.                     if me.Wuea==Reference.WUEA_ENDED:
  607.                         print "Respawning now!, no death anim"
  608.                         self.ReSpawn(EntityName)
  609.                     else:
  610.                         #print "Respawning after anim ends"
  611.                         me.AnmEndedFunc= self.ReSpawn
  612.                 else:
  613.                     import SaveGame
  614.  
  615.                     # DROP WEAPONS
  616.                     try:
  617.                         object = Bladex.GetEntity(me.InvLeft)
  618.                         if me.InvLeft and object and not object.TestHit:
  619.                             Actions.RemoveFromInventory (me, object,"DropLeftEvent")
  620.                             object.Impulse(0.0, 0.0, 0.0) 
  621.                     except AttributeError: 
  622.                         pdb.set_trace()
  623.                     
  624.                     try:
  625.                         object = Bladex.GetEntity(me.InvRight)
  626.                         if me.InvRight and object and not object.TestHit:
  627.                             Actions.RemoveFromInventory (me, object,"DropRightEvent")
  628.                             object.Impulse(0.0, 0.0, 0.0) 
  629.                     except AttributeError: 
  630.                         pdb.set_trace()
  631.  
  632.                     # Call the Load Menu
  633.                     if me.Wuea==Reference.WUEA_ENDED:
  634.                         print "no death anim... So Fade an go!"
  635.                         SaveGame.MenuStart(EntityName)
  636.                     else:
  637.                         #print "after anim ends the menu will be true.."
  638.                         me.AnmEndedFunc= SaveGame.MenuStart
  639.         else:
  640.             if (not self.NPC) and (netgame.GetNetState()==0): # "and 0" by Dario (don't killme please)
  641.                 Bladex.AddScheduledFunc(Bladex.GetTime()+5.0, Bladex.LoadLevel,(Bladex.GetCurrentMap(),),"ReloadAfterDeath")
  642.  
  643.  
  644.     def OnKilledEnemy(self,KilledEntityName):
  645.         Reference.debugprint("OnKilledEnemy")
  646.         KilledEntity=Bladex.GetEntity(KilledEntityName)
  647.         if KilledEntity is None:
  648.             print "OnKilledEnemy(): Error: None Entity"
  649.             return
  650.         me=Bladex.GetEntity(self.Name)
  651.         #import CharStats # Necesario para la recarga de partida. ┐Paron?
  652.         me.PartialLevel=me.PartialLevel+CharStats.GetCharExperienceReward(KilledEntity.CharType,KilledEntity.Level)
  653.  
  654.         LevelLimit=CharStats.GetCharExperienceCost(me.CharType,me.Level)
  655.  
  656.         if self.Name=="Player1":  #REVISAR
  657.             import Scorer
  658.             # Ahora compruebo si sube de nivel
  659.             if me.PartialLevel>=LevelLimit:
  660.                 me.PartialLevel=me.PartialLevel-LevelLimit
  661.                 me.Level=me.Level+1
  662.                 Scorer.LevelUp()
  663.                 Scorer.SetLevelLimits(0,CharStats.GetCharExperienceCost(me.CharType,me.Level))
  664.                 maxsize=40+5*me.Level # 40->190
  665.                 maxPPS=60+22*me.Level # 60->720
  666.                 maxint=0.2+0.15*me.Level # 0.2->4.7
  667.                 AuraParams=(5, 0, 1, 0, 0, 1)
  668.                 AuraGradient=(2, 0.4, 0.6, 1.0, 0.5, 0.0, 0.1, 0.2, 1.0, 0.0, 0.8)
  669.                 AuraVar1Args=(5, maxsize, 0, 1, 0.5)
  670.                 AuraVar2Args=(maxsize, 5, 1, 0, 1.0)
  671.                 PSParams=(self.LevelUpParticleData, "LevelUpParticle", 30, 50, 150, 255, maxPPS, -600, 0.0, 2, 2, 0.4, 30, 0.5)
  672.                 GenFX.LevelUpFX("Player1", 0, AuraParams, AuraGradient, AuraVar1Args, AuraVar2Args, PSParams, maxint, "Timer15", 15, "..\\..\\Sounds\\aparicion-escudo.wav")
  673.                 
  674.                 # Restore state of the player.
  675.                 if me.Life >0: # If an enemy death by poison or trowed weapons and.. You are death!
  676.                     me.ResetWounds()
  677.                     me.Life = CharStats.GetCharMaxLife(me.Kind, me.Level)
  678.                 
  679.                 Scorer.SlideTBS(0)
  680.  
  681.             if netgame.GetNetState() == 0:
  682.                 Scorer.SetLevelBarValue(me.PartialLevel)
  683. #        else:
  684. #            # Ahora compruebo si sube de nivel
  685. #            if me.PartialLevel>LevelLimit:
  686. #                me.PartialLevel=me.PartialLevel-LevelLimit
  687. #                me.Level=me.Level+1
  688.  
  689.  
  690.  
  691.     # Launch animations in response to being hit.  Called internally in Python from the damage func
  692.     # These animations are for a standard human skeleton.  Replace this func for other race types.
  693.     def RespondToHit(self, EntityName, AttackerName, DamagePoints, DamageZone, Shielded):
  694.         me = Bladex.GetEntity(EntityName)
  695.  
  696.         weapon_flag=Reference.W_FLAG_1H
  697.         if me.InvRight:
  698.             weapon_flag=Reference.GiveWeaponFlag(me.InvRight)
  699.  
  700.         if DamagePoints<=0 and Shielded and me.GetInventory().GetMagicShield():
  701.             return
  702.         if me and me.Life > 0:
  703.             damage_factor = DamagePoints / (me.Life+DamagePoints)
  704.  
  705.             if damage_factor > me.Data.DamageFactorNone:
  706.                 if DamageZone >= 0 and DamageZone < 32:
  707.                     me.SetWoundedZone(DamageZone, 1)
  708.  
  709.                 do_not_abort=0
  710.                 if me.AnimName == "df_s_broken" or me.AnimName == "sword_broken":
  711.                     do_not_abort=1
  712.                 if do_not_abort==0:
  713.                     
  714.                     Damage.DropInvalidObjectsOnImpact (EntityName)
  715.                     me.Wuea=Reference.WUEA_ENDED
  716.     
  717.                     if me.InCombat:
  718.                         me.InterruptCombat()
  719.                         if Shielded:
  720.                             # Launch Blocking damage animations
  721.                             if damage_factor <= (me.Data.DamageFactorLight+me.Data.DamageFactorHeavy) / 2.0:
  722.                                 Reference.debugprint("Launching .df_01")
  723.                                 if weapon_flag==Reference.W_FLAG_2W:
  724.                                     me.LaunchAnmType("df_01_2w")
  725.                                 elif weapon_flag==Reference.W_FLAG_AXE:
  726.                                     me.LaunchAnmType("df_01_axe")
  727.                                 elif weapon_flag==Reference.W_FLAG_SP:
  728.                                     me.LaunchAnmType("df_01_spear")
  729.                                 else:
  730.                                     me.LaunchAnmType("df_01")
  731.                             else:
  732.                                 Reference.debugprint("Launching .df_02")
  733.                                 if weapon_flag==Reference.W_FLAG_2W:
  734.                                     me.LaunchAnmType("df_02_2w")
  735.                                 elif weapon_flag==Reference.W_FLAG_AXE:
  736.                                     me.LaunchAnmType("df_02_axe")
  737.                                 elif weapon_flag==Reference.W_FLAG_SP:
  738.                                     me.LaunchAnmType("df_02_spear")
  739.                                 else:
  740.                                     me.LaunchAnmType("df_02")
  741.                         else:
  742.                             if damage_factor <= me.Data.DamageFactorLight:    
  743.                                 Reference.debugprint("Launching .hurt_f_lite")
  744.                                 me.LaunchAnmType("hurt_f_lite")
  745.                             elif damage_factor >= me.Data.DamageFactorHeavy:
  746.                                 Reference.debugprint("Launching .hurt_f_big")
  747.                                 me.LaunchAnmType("hurt_f_big")
  748.                             elif DamageZone==Reference.BODY_HEAD:
  749.                                 Reference.debugprint("Launching .hurt_f_head")
  750.                                 me.LaunchAnmType("hurt_f_head")
  751.                             elif DamageZone==Reference.BODY_FRONT:
  752.                                 Reference.debugprint("Launching .hurt_f_breast")
  753.                                 me.LaunchAnmType("hurt_f_breast")
  754.                             elif DamageZone==Reference.BODY_BACK:
  755.                                 Reference.debugprint("Launching .hurt_f_back")
  756.                                 me.LaunchAnmType("hurt_f_back")
  757.                             elif DamageZone==Reference.BODY_RARM or DamageZone==Reference.BODY_RHAND:
  758.                                 Reference.debugprint("Launching .hurt_f_r_arm")
  759.                                 me.LaunchAnmType("hurt_f_r_arm")
  760.                             elif DamageZone==Reference.BODY_LARM or DamageZone==Reference.BODY_LHAND:
  761.                                 Reference.debugprint("Launching .hurt_f_l_arm")
  762.                                 me.LaunchAnmType("hurt_f_l_arm")
  763.                             elif DamageZone==Reference.BODY_RLEG or DamageZone==Reference.BODY_RFOOT:
  764.                                 Reference.debugprint("Launching .hurt_f_r_leg")
  765.                                 me.LaunchAnmType("hurt_f_r_leg")
  766.                             elif DamageZone==Reference.BODY_LLEG or DamageZone==Reference.BODY_LFOOT:
  767.                                 Reference.debugprint("Launching .hurt_f_l_leg")
  768.                                 me.LaunchAnmType("hurt_f_l_leg")
  769.                     else:
  770.                         if me.Run:
  771.                             Reference.debugprint("Launching .hurt_jog")
  772.                             me.LaunchAnmType("hurt_jog")
  773.                         else:
  774.                             if Shielded:
  775.                                 # Launch Blocking damage animations
  776.                                 if damage_factor <= (me.Data.DamageFactorLight+me.Data.DamageFactorHeavy) / 2.0:
  777.                                     Reference.debugprint("Launching .df_01")
  778.                                     if weapon_flag==Reference.W_FLAG_2W:
  779.                                         me.LaunchAnmType("df_01_2w")
  780.                                     elif weapon_flag==Reference.W_FLAG_AXE:
  781.                                         me.LaunchAnmType("df_01_axe")
  782.                                     elif weapon_flag==Reference.W_FLAG_SP:
  783.                                         me.LaunchAnmType("df_01_spear")
  784.                                     else:
  785.                                         me.LaunchAnmType("df_01")
  786.                                 else:
  787.                                     Reference.debugprint("Launching .df_02")
  788.                                     if weapon_flag==Reference.W_FLAG_2W:
  789.                                         me.LaunchAnmType("df_02_2w")
  790.                                     elif weapon_flag==Reference.W_FLAG_AXE:
  791.                                         me.LaunchAnmType("df_02_axe")
  792.                                     elif weapon_flag==Reference.W_FLAG_SP:
  793.                                         me.LaunchAnmType("df_02_spear")
  794.                                     else:
  795.                                         me.LaunchAnmType("df_02")
  796.                             elif DamageZone==Reference.BODY_HEAD:
  797.                                 Reference.debugprint("Launching .hurt_head")
  798.                                 me.LaunchAnmType("hurt_head")
  799.                             elif DamageZone==Reference.BODY_FRONT:
  800.                                 Reference.debugprint("Launching .hurt_breast")
  801.                                 me.LaunchAnmType("hurt_breast")
  802.                             elif DamageZone==Reference.BODY_BACK:
  803.                                 Reference.debugprint("Launching .hurt_back")        
  804.                                 me.LaunchAnmType("hurt_back")
  805.                             elif DamageZone==Reference.BODY_RARM or DamageZone==Reference.BODY_RHAND:
  806.                                 Reference.debugprint("Launching .hurt_r_arm")        
  807.                                 me.LaunchAnmType("hurt_r_arm")
  808.                             elif DamageZone==Reference.BODY_LARM or DamageZone==Reference.BODY_LHAND:
  809.                                 Reference.debugprint("Launching .hurt_l_arm")        
  810.                                 me.LaunchAnmType("hurt_l_arm")
  811.                             elif DamageZone==Reference.BODY_RLEG or DamageZone==Reference.BODY_RFOOT:
  812.                                 Reference.debugprint("Launching .hurt_r_leg")
  813.                                 me.LaunchAnmType("hurt_r_leg")
  814.                             elif DamageZone==Reference.BODY_LLEG or DamageZone==Reference.BODY_LFOOT:
  815.                                 Reference.debugprint("Launching .hurt_l_leg")        
  816.                                 me.LaunchAnmType("hurt_l_leg")
  817.                             else:
  818.                                 # Shouldn't get here
  819.                                 #pdb.set_trace()
  820.                                 pass                        
  821.  
  822.  
  823.     #
  824.     # Standatd function for printing ...
  825.     #
  826.     def StdNewCombo(self,EntityName,ComboName):
  827.         if netgame.GetNetState() == 0:
  828.             import GameText
  829.             
  830.             me = Bladex.GetEntity(EntityName)
  831.             if EntityName<>"Player1":
  832.                 return
  833.             
  834.             ComboTXT = GameText.GetComboName(EntityName,ComboName)
  835.             if ComboTXT:    
  836.                 GameText.WriteTextAux(MenuText.GetMenuText("New Attack")+": "+ ComboTXT,2.0,255,255,255,[])
  837.                 
  838.                 new_combo_sound.Stop()
  839.                 #new_combo_sound.Play(me.Position[0],me.Position[1],me.Position[2],0);
  840.                 new_combo_sound.PlayStereo()
  841.  
  842.  
  843.  
  844.     def StdBigFall(self,EntityName,Dist):
  845.         me = Bladex.GetEntity(EntityName)
  846.         chartype = Bladex.GetCharType(me.CharType,me.CharTypeExt)
  847.  
  848.         if Dist>=chartype.DieFall:
  849.             return
  850.         if Dist<5000:
  851.             return
  852.  
  853.         diff=(Dist-5000.0)*0.001
  854.         fall_damage=((Dist-5000.0)/(chartype.DieFall-5000))*70.0
  855.         
  856.         me.Life=me.Life-fall_damage
  857.         if netgame.GetNetState()==1: # juego de red -> servidor 
  858.             if me.Life <=0:
  859.                 Damage.PlayerHitFunc(me.Name,"Fall", me.Life, 1)
  860.  
  861.  
  862.     #def StdToggleCombat(self,EntityName):
  863.     #    import DMusic
  864.     #    #print "Hola! Toggle Combat"
  865.     #    me = Bladex.GetEntity(EntityName)
  866.     #    if self.NPC==1:
  867.     #        DMusic.notifyCombat(EntityName)
  868.  
  869.     def RegisterObjectAsTaken(self, ObjectName):
  870.         object= Bladex.GetEntity(ObjectName)
  871.         if object:
  872.             kind= object.Kind
  873.             if not self.ObjectsTaken.count(kind):
  874.                 self.ObjectsTaken.append(kind)
  875.     
  876.     def WasObjectAlreadyTaken(self, ObjectName):
  877.         object= Bladex.GetEntity(ObjectName)
  878.         if object:
  879.             kind= object.Kind
  880.             return self.ObjectsTaken.count(kind)
  881.             
  882.     def GetObjectsTaken (self):
  883.         return self.ObjectsTaken
  884.