=begin #=============================================================================== Title: Parameter Bonuses Author: Hime Date: Aug 1, 2014 URL: http://himeworks.com/2013/12/09/parameter-bonuses/ -------------------------------------------------------------------------------- ** Change log Aug 1, 2014 - added a reference to the tagged object Jul 24, 2014 - added support for class, armors, weapons, and states Dec 20, 2013 - added support for "recursive" references - added support for passing in the base parameter - added support for enemy parameter bonuses Dec 9, 2013 - initial release -------------------------------------------------------------------------------- ** Terms of Use * Free to use in non-commercial projects * Contact me for commercial use * No real support. The script is provided as-is * Will do bug fixes, but no compatibility patches * Features may be requested but no guarantees, especially if it is non-trivial * Credits to Hime Works in your project * Preserve this header -------------------------------------------------------------------------------- ** Description This script allows you to define "Parameter bonuses" for your actors and enemies. A paramter bonus is simply a bonus that will be added to your parameters based on a formula. The bonus itself could be an increase, or even a decrease in stats if you provide a negative value. For example, suppose you had custom parameters that allowed you to define stats like "strength" or "intelligence", where str increases your atk and max HP params while int increases magic attack and magic defense stats. You can use parameter bonuses to define formulas that will allow your str and int stats to contribute to the other parameters. Since the parameter bonus can be any formula, you can define bonuses based on anything. Parameter bonuses can be defined in actors, classes, weapons, armors, states, and enemies. Actors will inherit any bonuses defined in their class, equips, and states. Enemies will inherit any bonuses defined in their states. Because equips and states can be changed, you can use this to create unique effects. -------------------------------------------------------------------------------- ** Installation In the script editor, place this script below Materials and above Main -------------------------------------------------------------------------------- ** Usage To define a parameter bonus, note-tag actors with FORMULA Where the TYPE is one of mhp - max HP mmp - max MP atk - attack def - defense mat - magic attack mdf - magic defense agi - agility luk - luck And the formula can be any valid ruby formula. The following formula variables are available a - the current battler (actor or enemy) obj - the tagged object p - game party t - game troop v - game variables s - game switches You can have a bonus reference itself. For example a.atk * 1.5 Will increase the battler's atk value by 50%. This atk value does not include the bonus, but includes base params and extra params. You can define multiple parameter bonuses for an actor, and you can define multiple bonuses for the same stat; simply add more of the note-tag. == Object Reference == The `obj` variable is a special variable that you can use to refer to the object that the bonus is attached to. For example, suppose you notetagged a weapon with obj.params[2] * 10 This means that you receive an HP bonus equal to the weapon's atk times 10. All of the attributes that you can access in a weapon is available. If the bonus is attached to an armor, then `obj` references that armor, and so on. -------------------------------------------------------------------------------- ** Example Suppose we have a custom stat called "str", and for each point of str, it increases HP by 10 and atk by 2. You would use two parameter bonuses: a.str * 10 a.str * 2 #=============================================================================== =end $imported = {} if $imported.nil? $imported["TH_ParameterBonus"] = true #=============================================================================== # ** Configuration #=============================================================================== module TH module Parameter_Bonuses Regex = /(.*?)<\/param[-_ ]bonus>/im #=============================================================================== # ** Rest of Script #=============================================================================== Table = { :mhp => 0, :mmp => 1, :atk => 2, :def => 3, :mat => 4, :mdf => 5, :agi => 6, :luk => 7 } end end module RPG class BaseItem def param_bonuses load_notetag_param_bonuses unless @param_bonuses return @param_bonuses end def load_notetag_param_bonuses @param_bonuses = [] results = self.note.scan(TH::Parameter_Bonuses::Regex) results.each do |res| param = res[0].downcase.to_sym formula = res[1].strip id = TH::Parameter_Bonuses::Table[param] data = Data_ParamBonus.new(id, formula, self) @param_bonuses << data end end end end class Data_ParamBonus attr_accessor :param_id attr_accessor :formula attr_accessor :obj def initialize(param_id, formula="0", obj) @param_id = param_id @formula = formula @obj = obj end def value(a, p=$game_party, t=$game_troop, s=$game_switches, v=$game_variables) eval(@formula) end end class Game_BattlerBase def param_bonus_objects states end alias :th_param_bonuses_param_plus :param_plus def param_plus(param_id) th_param_bonuses_param_plus(param_id) + param_bonus(param_id) end #----------------------------------------------------------------------------- # Calculates the bonus parameter. #----------------------------------------------------------------------------- def param_bonus(param_id) return 0 if @check_param_bonus @check_param_bonus = true val = param_bonus_objects.inject(0) do |r, bonus_obj| bonus_obj.param_bonuses.inject(r) do |r2, obj| obj.param_id == param_id ? r2 += obj.value(self) : r2 end end @check_param_bonus = false return val end end class Game_Actor < Game_Battler alias :th_parameter_bonuses_param_bonus_objects :param_bonus_objects def param_bonus_objects feature_objects end end class Game_Enemy < Game_Battler alias :th_parameter_bonuses_param_bonus_objects :param_bonus_objects def param_bonus_objects feature_objects end end