IceDragon200

ZI-DamageFormulae

Jul 5th, 2011
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 10.54 KB | None | 0 0
  1. # // Well its a total rewrite @___@
  2. #==============================================================================#
  3. # ** Z
  4. #==============================================================================#
  5. module Z
  6.  
  7.   # NORMAL_DAMAGE
  8.   # // Added by IceDragon
  9.   # // "NORMAL_DAMAGE", "NORMALDAMAGE", "NORMAL DAMAGE", "NORMAL"
  10.   # // "OBJ_DAMAGE", "OBJDAMAGE", "OBJ DAMAGE", "OBJ"
  11.   # // Sonic: (+/-)n              # // Sonic: 20, Sonic: -20
  12.   # // Percent: (+/-)n% host stat # // Percent: 20% user hp
  13.  
  14.   # // <damage: Sonic: 20>
  15.   # // <dam: Percent: -20%> # // Healing effect
  16.   def self.damage_formulae( attacker, target, params=[], obj=nil )
  17.     user = attacker
  18.     formula = obj.nil?() ? attacker.damage_formulae : obj.damage
  19.     damage               = 0.0
  20.     hp_damage, mp_damage = 0, 0
  21.     critical             = false
  22.     variance             = 0
  23.     element_set          = attacker.element_set
  24.     element_set          = obj.element_set unless obj.nil?()
  25.     # // Param extracts
  26.     allow_critical   = !params.include?( "NO_CRIT" )
  27.     allow_variance   = !params.include?( "NO_VARI" )
  28.     allow_guard      = !params.include?( "NO_GUARD" )
  29.     allow_element    = !params.include?( "NO_ELEMENT" )
  30.     allow_multiplier = !params.include?( "NO_MULT" )
  31.     allow_divider    = !params.include?( "NO_DIV" )
  32.     use_mp_damage    =  params.include?( "MP_DAM" )
  33.     use_hp_damage    =  params.include?( "HP_DAM" )
  34.    
  35.     # // Some Procs
  36.     get_host = Proc.new { |host|
  37.       case host.upcase
  38.       when "USER" ; attacker
  39.       when "TARGET" ; target
  40.       end
  41.     }
  42.    
  43.     formula = attacker.damage_formulae if obj.physical_attack unless obj.nil?()
  44.     # // Formulaes
  45.     case formula.upcase
  46.     # // <dam: stat: min, max, speed>
  47.     when /STAT:[ ](.*),[ ](.*),[ ](.*)/i
  48.       min, max, spd = $1.to_i, $2.to_i, $3.to_f
  49.       da = min + rand(max-min) / spd
  50.      
  51.       if obj.nil?()
  52.         da = da + ((attacker.atk*0.6) - (target.def*0.2))
  53.         damage += da
  54.         damage = obj.nil? ? rand(2) : 0 if damage < 0
  55.       else
  56.         damage = obj.base_damage.to_f
  57.         da = da + ((attacker.spi*0.55) - (target.def*0.15))
  58.         if damage > 0
  59.           damage += da
  60.           damage = obj.nil? ? rand(2) : 0 if damage < 0
  61.         elsif damage < 0
  62.           damage -= da
  63.         end
  64.       end  
  65.      
  66.       # Object Atk_F and Spi_F calculations
  67.       if damage > 0
  68.         if obj.physical_attack
  69.           damage = damage * obj.atk_f / 100.0  
  70.           damage = damage * obj.spi_f / 100.0
  71.         else  
  72.           damage += (user.atk*0.6) * obj.atk_f / 100.0  
  73.           damage += (user.spi*0.55) * obj.spi_f / 100.0
  74.         end
  75.         unless obj.ignore_defense                    
  76.           damage -= (target.def*0.2) * obj.atk_f / 100.0  
  77.           damage -= (target.spi*0.15) * obj.spi_f / 100.0  
  78.         end
  79.       elsif damage < 0
  80.         if obj.physical_attack
  81.           damage = damage * obj.atk_f / 100.0  
  82.           damage = damage * obj.spi_f / 100.0
  83.         else  
  84.           damage -= (user.atk*0.6) * obj.atk_f / 100.0
  85.           damage -= (user.spi*0.55) * obj.spi_f / 100.0
  86.         end  
  87.       end unless obj.nil?()  
  88.       variance = obj.variance unless obj.nil?()  
  89.       #damage /= 2.0 unless obj.nil?()
  90.       allow_critical   = obj.nil?() ? true : obj.physical_attack
  91.       allow_multiplier = false # // * 4.0
  92.       allow_divider    = true  # // / 100.0
  93.     # // Default Attack Damage Formulae
  94.     when "NORMAL_DAMAGE", "NORMALDAMAGE", "NORMAL DAMAGE", "NORMAL"
  95.       damage = attacker.atk - target.def
  96.       damage = rand(2) if damage <= 0                      
  97.       allow_multiplier = true
  98.       variance = 20          
  99.     # // Default Skill/Item Damage Formulae      
  100.     when "OBJ_DAMAGE", "OBJDAMAGE", "OBJ DAMAGE", "OBJ"
  101.       damage = obj.base_damage                      
  102.       if damage > 0                                  
  103.         damage += user.atk * obj.atk_f / 100.0    
  104.         damage += user.spi * obj.spi_f / 100.0    
  105.         unless obj.ignore_defense                    
  106.           damage -= target.def * obj.atk_f / 100.0  
  107.           damage -= target.spi * obj.spi_f / 100.0  
  108.         end
  109.         damage = 0 if damage < 0                    
  110.       elsif damage < 0                              
  111.         damage -= user.atk * obj.atk_f / 100.0    
  112.         damage -= user.spi * obj.spi_f / 100.0    
  113.       end  
  114.       damage /= 100.0
  115.       variance = obj.variance      
  116.     # // Sonic: +/-n
  117.     # // Always inflicts n damage
  118.     when /SONIC:[ ]([\+\-]?\d+)/i
  119.       damage = $1.to_i
  120.       allow_critical   = false
  121.       allow_variance   = false
  122.       allow_guard      = false
  123.       allow_element    = false
  124.       allow_multiplier = false
  125.       allow_divider    = false
  126.     # // Percent: +/-n% stat
  127.     # // Inflicts n% damage  
  128.     when /(?:PERCENT|PERC):[ ]([\+\-]?\d+)(?:[%%]),[ ](.*),[ ](.*)/i
  129.       perc = $1.to_i
  130.       host = $2
  131.       stat = $3  
  132.       case stat.upcase
  133.       when "HP"
  134.         damage += get_host.call(host).hp.to_f * perc.to_f / 100.0
  135.       when "MAXHP"
  136.         damage += get_host.call(host).maxhp.to_f * perc.to_f / 100.0
  137.       when "MP"
  138.         damage += get_host.call(host).mp.to_f * perc.to_f / 100.0
  139.       when "MAXMP"
  140.         damage += get_host.call(host).maxmp.to_f * perc.to_f / 100.0
  141.       when "ATK"
  142.         damage += get_host.call(host).atk.to_f * perc.to_f / 100.0
  143.       when "DEF"
  144.         damage += get_host.call(host).def.to_f * perc.to_f / 100.0
  145.       when "SPI"
  146.         damage += get_host.call(host).spi.to_f * perc.to_f / 100.0
  147.       when "AGI"
  148.         damage += get_host.call(host).agi.to_f * perc.to_f / 100.0
  149.       end
  150.     end
  151.     if allow_critical
  152.       critical = (rand(100) < attacker.cri)      
  153.       critical = false if target.prevent_critical      
  154.       damage *= 3.0 if critical                    
  155.     end if damage > 0
  156.     damage   *= target.elements_max_rate(element_set) if allow_element
  157.     damage    = target.apply_variance(damage, variance) if allow_variance  
  158.     damage    = target.apply_guard(damage) if allow_guard
  159.     damage   *= 4.0 if allow_multiplier
  160.     damage   /= 100.0 if allow_divider
  161.     hp_damage = Integer(damage) if use_hp_damage                            
  162.     mp_damage = Integer(damage) if use_mp_damage
  163.     return [hp_damage, mp_damage, critical]
  164.   end
  165.  
  166. end
  167.  
  168. #==============================================================================#
  169. # ** RPG::BaseItem
  170. #==============================================================================#
  171. class RPG::BaseItem
  172.  
  173.   attr_accessor :damage
  174.  
  175.   def zi_baseitemcache()
  176.     self.note.gsub!(/<stats:[ ](.*) (.*) (.*)>/i) {
  177.       "<dam: Stat: #{$1}, #{$2}, #{$3}>"
  178.     }
  179.     case self
  180.     when RPG::Skill, RPG::Item
  181.       @damage = "OBJ_DAMAGE"
  182.     else  
  183.       @damage = "NORMAL_DAMAGE"
  184.     end  
  185.     @damage = self.note =~ /<(?:DAMAGE|DMG|DAM):[ ](.*)>/i ? $1 : @damage
  186.   end
  187.  
  188. end
  189.  
  190. #==============================================================================#
  191. # ** RPG::Enemy
  192. #==============================================================================#
  193. class RPG::Enemy
  194.  
  195.   attr_accessor :damage
  196.  
  197.   def zi_baseenemycache()
  198.     @damage = "NORMAL_DAMAGE"
  199.     @damage = self.note =~ /<(?:DAMAGE|DMG|DAM):[ ](.*)>/i ? $1 : @damage
  200.   end
  201.  
  202. end
  203.  
  204. #==============================================================================#
  205. # ** Game_Battler
  206. #==============================================================================#
  207. class Game_Battler
  208.  
  209.   #--------------------------------------------------------------------------
  210.   # * Calculation of Damage From Normal Attack
  211.   #     attacker : Attacker
  212.   #    The results are substituted for @hp_damage
  213.   #--------------------------------------------------------------------------
  214.   def make_attack_damage_value( attacker )
  215.     damara = Z.damage_formulae(
  216.      attacker, self,
  217.      [ "HP_DAM" ],
  218.      nil ) # // Get Damage Array
  219.     @hp_damage, @mp_damage, @critical = *damara
  220.   end
  221.  
  222.   #--------------------------------------------------------------------------
  223.   # * Calculation of Damage Caused by Skills or Items
  224.   #     user : User of skill or item
  225.   #     obj  : Skill or item (for normal attacks, this is nil)
  226.   #    The results are substituted for @hp_damage or @mp_damage.
  227.   #--------------------------------------------------------------------------
  228.   def make_obj_damage_value( user, obj )
  229.     damara = Z.damage_formulae(
  230.      user, self,
  231.      [ obj.damage_to_mp ? "MP_DAM" : "HP_DAM" ],
  232.      obj ) # // Get Damage Array
  233.     @hp_damage, @mp_damage, @critical = *damara
  234.   end
  235.    
  236. end
  237.  
  238. #==============================================================================#
  239. # ** Game_Enemy
  240. #==============================================================================#
  241. class Game_Enemy < Game_Battler
  242.  
  243.   def damage_formulae
  244.     return enemy.damage
  245.   end  
  246.  
  247. end
  248.  
  249. #==============================================================================#
  250. # ** Game_Actor
  251. #==============================================================================#
  252. class Game_Actor < Game_Battler
  253.  
  254.   def damage_formulae
  255.     return weapons[0].nil? ? "NORMAL_DAMAGE" : weapons[0].damage
  256.   end  
  257.  
  258. end
  259.  
  260. #==============================================================================#
  261. # ** Scene_Title
  262. #==============================================================================#
  263. class Scene_Title < Scene_Base
  264.  
  265.   #--------------------------------------------------------------------------#
  266.   # * alias method :load_database
  267.   #--------------------------------------------------------------------------#
  268.   alias :zi_sct_load_database :load_database unless $@
  269.   def load_database()
  270.     zi_sct_load_database()
  271.     load_zi_cache()
  272.   end
  273.  
  274.   #--------------------------------------------------------------------------#
  275.   # * alias method :load_bt_database
  276.   #--------------------------------------------------------------------------#
  277.   alias :zi_sct_load_bt_database :load_database unless $@
  278.   def load_bt_database()
  279.     zi_sct_load_bt_database()
  280.     load_zi_cache()
  281.   end  
  282.  
  283.   #--------------------------------------------------------------------------#
  284.   # * new method :load_zi_cache
  285.   #--------------------------------------------------------------------------#
  286.   def load_zi_cache()
  287.     objs = [$data_items, $data_skills, $data_weapons, $data_enemies]
  288.     objs.each { |group| group.each { |obj| next if obj.nil?
  289.       obj.zi_baseitemcache() if obj.is_a?(RPG::BaseItem)
  290.       obj.zi_baseenemycache() if obj.is_a?(RPG::Enemy) } }
  291.   end
  292.  
  293. end
Advertisement
Add Comment
Please, Sign In to add comment