Code:
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Alternative Attack Algorithms  by Xelias
# Version: 1.00
# Type: Battle Add-ON
# Date v1.00:   7.11.2009
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#  
#  This work is protected by the following license:
# #----------------------------------------------------------------------------
# #  
# #  Creative Commons - Attribution-NonCommercial-ShareAlike 3.0 Unported
# #  ( http://creativecommons.org/licenses/by-nc-sa/3.0/ )
# #  
# #  You are free:
# #  
# #  to Share - to copy, distribute and transmit the work
# #  to Remix - to adapt the work
# #  
# #  Under the following conditions:
# #  
# #  Attribution. You must attribute the work in the manner specified by the
# #  author or licensor (but not in any way that suggests that they endorse you
# #  or your use of the work).
# #  
# #  Noncommercial. You may not use this work for commercial purposes.
# #  
# #  Share alike. If you alter, transform, or build upon this work, you may
# #  distribute the resulting work only under the same or similar license to
# #  this one.
# #  
# #  - For any reuse or distribution, you must make clear to others the license
# #    terms of this work. The best way to do this is with a link to this web
# #    page.
# #  
# #  - Any of the above conditions can be waived if you get permission from the
# #    copyright holder.
# #  
# #  - Nothing in this license impairs or restricts the author's moral rights.
# #  
# #----------------------------------------------------------------------------
#   How to use this script :
# This allows your weapons to follow different damage algorithms. Before that, you
# MUST place your weapons following a normal algorithm in the
# NORMAL_WEAPONS_IDS, or else... It wouldn't be good for your game.
# Also place all weapons ID except SP damaging and absorbing ones, into the
# "ALL_WEAPONS_IDS", because if you don't, a nasty bug will prevent you from
# dealing damage with normal attack. Cool, huh ?
#
# ATMA_WEAPON_IDS = [X,X...] : A weapon with an ID equal to X will inflict
# more damage depending on the user’s HP. If HP are full, attack power is doubled.
# If HP are at minimum, attack power is normal. If HP are equal to half, attack power
# is equal to 1,5 of the normal Attack power, and so on...
# VALIANT_KNIFE_IDS = [X, X...] : The opposite effect of Atma Weapon.
# If HP are at minimum, attack power is doubled, and so on...
# LIMITED_MOON_IDS = [X, X...] : Follows the same formula than Atma Weapon
# but works with SP
# CONFORMER_IDS = [X, X...] : Deals damage based on user’s Level.
#At Level 1, attack power is normal. At Level 99, attack power is doubled. You get
# the idea
# MASAMUNE_IDS = [X, X...] : Deals more damage the weaker the enemy is
# For an enemy with 100% HP, attack power is normal. For an enemy with 1 HP,
# attack power is doubled (which is pretty useless). For an enemy with half HP,
# attack power is equal to 1,5 of the normal attack power, and so on...
# PROJECTILE_IDS = [X, X...] : Ignores the opponent's defense in the damage
# calculation. However, the Attack power is halved, preventing an attack to inflict
# max damage at an opponent with max defense. Otherwise, it wouldn't be fair.
# FFXII_KATANA_IDS = [X, X...] : Acts like a Final Fantasy XII Katana, which
# means it inflicts damage based on user's Intelligence instead of Strength
# FFXII_NINJA_SWORDS_IDS = [X, X...] : Acts like a Final Fantasy XII Ninja Sword,
# which means it inflicts damage based on user's Agility instead of Strength
# MIND_BLASTER_IDS = [X, X...] : Damage is inflicted to SP. Damage
# relies also on the opponent's Magic Defense and your Intelligence
# BLOOD_SWORD_IDS = [X, X...] & PERCENT_DRAINED = X :  
# some damage is absorbed from the attack. How many? PERCENT_DRAINED %
# GUARD_BREAKER_IDS = [X, X...] : Damage ignores if enemy is defending.  
# As simple as that.
# GENJI_WEAPON_IDS = [X, X...] : Critical Hit Ratio is doubled.
# KIKU_ICHIMONJI_IDS = [X, X...] : Critical Hit power is doubled.
#
#
#
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
  OTHER_WEAPONS_IDS = [11]
  ALL_WEAPONS_IDS = [10,12,13,14,15,16,17,18,21,22,23,24]
  ATMA_WEAPON_IDS = [10]
  VALIANT_KNIFE_IDS = [12]
  LIMITED_MOON_IDS = [13]
  CONFORMER_IDS = [14]
  MASAMUNE_IDS = [15]
  PROJECTILE_IDS = [16]
  FFXII_KATANA_IDS = [17]
  FFXII_NINJA_SWORDS_IDS = [18]
  MIND_BLASTER_IDS = [19]
  BLOOD_SWORD_IDS = [20]
  PERCENT_DRAINED = 50
  GUARD_BREAKER_IDS = [21]
  GENJI_WEAPON_IDS = [23]
  KIKU_ICHIMONJI_IDS = [24]
  
class Game_Battler
def attack_effect(attacker)
    # Clear critical flag
    self.critical = false
    # First hit detection
    hit_result = (rand(100) < attacker.hit)
    # If hit occurs
    if hit_result == true
      # Calculate basic damage
          if attacker.is_a?(Game_Actor)
    if OTHER_WEAPONS_IDS.include?(attacker.weapon_id)
    atk = [attacker.atk - self.pdef / 2, 0].max
     self.damage = atk * (20 + attacker.str) / 20
   end
   if ATMA_WEAPON_IDS.include?(attacker.weapon_id)
     atk = [attacker.atk - self.pdef / 2,0].max
     atk2 = atk * (20 + attacker.str) / 20
    self.damage = atk2 + ((atk2*((attacker.hp*100)/attacker.maxhp))/100)
    end
       if VALIANT_KNIFE_IDS.include?(attacker.weapon_id)
     atk = [attacker.atk - self.pdef / 2,0].max
     atk2 = atk * (20 + attacker.str) / 20
     minushp = attacker.maxhp - attacker.hp
    self.damage = atk2 + ((atk2*((minushp*100)/attacker.maxhp))/100)
    end
     if LIMITED_MOON_IDS.include?(attacker.weapon_id)
     atk = [attacker.atk - self.pdef / 2,0].max
     atk2 = atk * (20 + attacker.str) / 20
    self.damage = atk2 + ((atk2*((attacker.sp*100)/attacker.maxsp))/100)
  end
       if CONFORMER_IDS.include?(attacker.weapon_id)
     atk = [attacker.atk - self.pdef / 2,0].max
     atk2 = atk * (20 + attacker.str) / 20
    self.damage = atk2 + (atk2*(((attacker.level*100) / 99)/100))
  end
      if MASAMUNE_IDS.include?(attacker.weapon_id)
     atk = [attacker.atk - self.pdef / 2,0].max
     atk2 = atk * (20 + attacker.str) / 20
     minushp = self.maxhp - self.hp
    self.damage = atk2 + ((atk2*((minushp*100)/self.maxhp))/100)
  end
        if PROJECTILE_IDS.include?(attacker.weapon_id)
     atk = [attacker.atk,0].max
     self.damage = atk * (20 + attacker.str) / 20
   end
      if FFXII_KATANA_IDS.include?(attacker.weapon_id)
    atk = [attacker.atk - self.pdef / 2, 0].max
     self.damage = atk * (20 + attacker.int) / 20
   end
      if FFXII_NINJA_SWORDS_IDS.include?(attacker.weapon_id)
    atk = [attacker.atk - self.pdef / 2, 0].max
     self.damage = atk * (20 + attacker.agi) / 20
   end
      if BLOOD_SWORD_IDS.include?(attacker.weapon_id)
    atk = [attacker.atk - self.pdef / 2, 0].max
     self.damage = atk * (20 + attacker.str) / 20
   end
      if MIND_BLASTER_IDS.include?(attacker.weapon_id)
    atk = [attacker.atk - ((self.pdef+self.mdef)) / 4, 0].max
     self.damage = atk * (20 + ((attacker.str + attacker.int)/2)) / 20
   end
      if GUARD_BREAKER_IDS.include?(attacker.weapon_id)
    atk = [attacker.atk - self.pdef / 2, 0].max
     self.damage = atk * (20 + attacker.str) / 20
   end
      if GENJI_WEAPON_IDS.include?(attacker.weapon_id)
    atk = [attacker.atk - self.pdef / 2, 0].max
     self.damage = atk * (20 + attacker.str) / 20
   end
      if KIKU_ICHIMONJI_IDS.include?(attacker.weapon_id)
    atk = [attacker.atk - self.pdef / 2, 0].max
     self.damage = atk * (20 + attacker.str) / 20
   end
      end
   if attacker.is_a?(Game_Enemy)
      atk = [attacker.atk - self.pdef / 2, 0].max
     self.damage = atk * (20 + attacker.str) / 20
   end
      # Element correction
    self.damage *= elements_correct(attacker.element_set)
      self.damage /= 100
      # If damage value is strictly positive
      if self.damage > 0
        # Critical correction
        if attacker.is_a?(Game_Actor)
    if GENJI_WEAPON_IDS.include?(attacker.weapon_id)
        if rand(100) < 8 * attacker.dex / self.agi
          self.damage *= 2
          self.critical = true
        end
        end
      if KIKU_ICHIMONJI_IDS.include?(attacker.weapon_id)
        if rand(100) < 4 * attacker.dex / self.agi
          self.damage *= 4
          self.critical = true
        end
      end
    elsif rand(100) < 4 * attacker.dex / self.agi
          self.damage *= 2
          self.critical = true
        end
        # Guard correction
        if self.guarding?
        if GUARD_BREAKER_IDS.include?(attacker.weapon_id)
       self.damage /=1
          end
     else
       self.damage /=2
     end
      # Dispersion
   if self.damage.abs > 0
        amp = [self.damage.abs * 15 / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # Second hit detection
      eva = 8 * self.agi / attacker.dex + self.eva
      hit = self.damage < 0 ? 100 : 100 - eva
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(100) < hit)
    end
     # If hit occurs
    if hit_result == true
      # State Removed by Shock
      remove_states_shock
      # Substract damage from HP
       if attacker.is_a?(Game_Actor)
      if MIND_BLASTER_IDS.include?(attacker.weapon_id)
        self.sp -= self.damage
        self.damage = sprintf('%+d %s', -self.damage, $data_system.words.sp)
        end
      if BLOOD_SWORD_IDS.include?(attacker.weapon_id)
       healing = (self.damage*PERCENT_DRAINED)/100
        self.hp -= self.damage
        attacker.hp += healing
      end
      if ALL_WEAPONS_IDS.include?(attacker.weapon_id)
        self.hp -= self.damage
    end
    else self.hp -= self.damage
  end
  end
      # State change
      @state_changed = false
      states_plus(attacker.plus_state_set)
      states_minus(attacker.minus_state_set)
    # When missing
    else
      # Set damage to "Miss"
      self.damage = "Miss"
      # Clear critical flag
      self.critical = false
    end
    # End Method
    return true
  end
end