| 
 
| 赞 | 160 |  
| VIP | 0 |  
| 好人卡 | 0 |  
| 积分 | 273 |  
| 经验 | 0 |  
| 最后登录 | 2025-10-31 |  
| 在线时间 | 5455 小时 |  
 Lv5.捕梦者 
	梦石0 星屑27250 在线时间5455 小时注册时间2016-3-8帖子1684 | 
| 本帖最后由 alexncf125 于 2020-9-1 10:45 编辑 
 先插入Hime的Feature Manager和Max TP
 http://himeworks.com/2012/10/feature-manager/
 https://www.rpgmakercentral.com/topic/7649-max-tp/
 
 之后在装备的备注栏写上
 <ft: max_tp x>
 
 P.S. 我没实际测试过, 不知是不是你要的效果, 也不知 x 能不能是负数
 
 
 =begin#=============================================================================== ** Feature Manager Author: Hime Date: Oct 3, 2013-------------------------------------------------------------------------------- ** Change log 2.0 Oct 3, 2013   - implemented the extended regex for feature note-tags 1.32 Nov 18, 2012   - added convenience wrapper for data elements 1.31 Nov 9, 2012   - fixed bug where item features didn't have conditions 1.3 Nov 8, 2012   - Added conditional features.   - Aliased default features for use with conditional features Oct 22, 2012   - No longer overwrites any methods Oct 21, 2012   - features_value_set should return set of values, not data_id's Oct 18, 2012   - added item_feature_set to collect all features for a given item Oct 14, 2012   - added max/min feature value collection Oct 13, 2012   - added some feature collection to check features of specific item   - re-wrote `equippable?` to do negative-checking Oct 12, 2012   - 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 * Preserve this header-------------------------------------------------------------------------------- ** Compatibility  This script does not overwrite any methods and aliases one method. Most features should not have conflicts with the following systems  -Tankentai SBS -Yanfly Ace Battle Engine-------------------------------------------------------------------------------- ** Description  This is a plugin-based feature system that allows you to define your own features easily and add them to database objects.  Register a feature using an idstring to identify your feature. Recommended strings or symbols, but anything hashable is valid.  You will use the idstring throughout your script, such as in notetags and also initializing the feature (optional).  If your script will be using params, xparams, or sparams, you should use standard data ID's that the rest of the script uses. These are defined in the tables below.  You should use data ID 0 for weapons, 1 for armors, and 2 for items.-------------------------------------------------------------------------------- ** Usage  To add a feature to a feature object, simply note-tag with a feature tag. The general syntax for a feature tag is     <ft: name arg1 arg2 ... >     Where    `name` is the name of the feature you wish to add   `arg1 arg2 ...` are a list of arguments that the plugin requires    You may specify conditional features as well, using the following note-tag     <cond_ft: name "cond" arg1 arg2 ... >     Where   `cond` is a ruby expression that evaluates to true or false. The condition          must be surrounded by quotation marks.           Conditional features can be applied to any feature that is supported by this system.  If you need more control over the note-tag, you can use the extended note-tag    <ft: FEATURE_NAME>     option1: value1     option2: value2     ...   </ft>    You can define any option name that you want. All options will be passed to your `add_feature` method as a hash, where the keys are the option names and the values are the corresponding values. For example, the above example would create a hash that looks like    {     :option1 => value1,     :option2 => value2   }    Which you can then use to grab values. To work with your extended note-tag, you need to define the following method in BaseItem or its child classes:    def add_feature_FEATURE_NAME_ext(code, data_id, args)          # do something with your args     value = ...     add_feature(code, data_id, value)   end #================================================================================end$imported = {} if $imported.nil?$imported["Feature_Manager"] = 2.0#===============================================================================# ** Rest of the script#===============================================================================module FeatureManager   # Format for all note tags  Feature_Regex = /<ft: (\w+)(.*)>/i  Cond_Feature_Regex = /<cond_ft: (\w+) ['"](.*)['"](.*)>/i   Ext_Regex = /<feature: (\w+)>(.*?)<\/feature>/im   # Default features.  FEATURE_ELEMENT_RATE  = 11              # Element Rate  FEATURE_DEBUFF_RATE   = 12              # Debuff Rate  FEATURE_STATE_RATE    = 13              # State Rate  FEATURE_STATE_RESIST  = 14              # State Resist  FEATURE_PARAM         = 21              # Parameter  FEATURE_XPARAM        = 22              # Ex-Parameter  FEATURE_SPARAM        = 23              # Sp-Parameter  FEATURE_ATK_ELEMENT   = 31              # Atk Element  FEATURE_ATK_STATE     = 32              # Atk State  FEATURE_ATK_SPEED     = 33              # Atk Speed  FEATURE_ATK_TIMES     = 34              # Atk Times+  FEATURE_STYPE_ADD     = 41              # Add Skill Type  FEATURE_STYPE_SEAL    = 42              # Disable Skill Type  FEATURE_SKILL_ADD     = 43              # Add Skill  FEATURE_SKILL_SEAL    = 44              # Disable Skill  FEATURE_EQUIP_WTYPE   = 51              # Equip Weapon  FEATURE_EQUIP_ATYPE   = 52              # Equip Armor  FEATURE_EQUIP_FIX     = 53              # Lock Equip  FEATURE_EQUIP_SEAL    = 54              # Seal Equip  FEATURE_SLOT_TYPE     = 55              # Slot Type  FEATURE_ACTION_PLUS   = 61              # Action Times+  FEATURE_SPECIAL_FLAG  = 62              # Special Flag  FEATURE_COLLAPSE_TYPE = 63              # Collapse Effect  FEATURE_PARTY_ABILITY = 64              # Party Ability   # Data ID's for consistency with the rest of the scripts  Weapon_ID = 0  Armor_ID = 1  Item_ID = 2   # Data ID's for basic parameters. Use this if you are going to  # use params in note tags  Param_Table = {    "mhp" => 0,    "mmp" => 1,    "atk" => 2,    "def" => 3,    "mat" => 4,    "mdf" => 5,    "agi" => 6,    "luk" => 7  }   # Data ID's for extra parameters.  XParam_Table = {    "hit" => 0,    "eva" => 1,    "cri" => 2,    "cev" => 3,    "mev" => 4,    "mrf" => 5,    "cnt" => 6,    "hrg" => 7,    "mrg" => 8,    "trg" => 9  }   # Data ID's for special parameters  SParam_Table = {    "tgr" => 0,    "grd" => 1,    "rec" => 2,    "pha" => 3,    "mcr" => 4,    "tcr" => 5,    "pdr" => 6,    "mdr" => 7,    "fdr" => 8,    "exr" => 9,  }   def self.register(idstring, api_version=1.0)    idstring = idstring.to_s    key = idstring.to_sym    if $imported["Feature_Manager"] < api_version      outdated_api_warn(idstring, api_version)    elsif @feature_table.include?(key)      dupe_entry_warn(key, @feature_table[key])     else      @feature_table[key] = idstring    end  end   def self.api_version(version)   end   # Each feature maps to a code, which is stored in the feature.  # It should be a symbol. Notice that this table is only used for  # mapping and is never referenced after an object has been setup.  def self.initialize_tables    @feature_table = {      FEATURE_ELEMENT_RATE  => 11,              # Element Rate      FEATURE_DEBUFF_RATE   => 12,              # Debuff Rate      FEATURE_STATE_RATE    => 13,              # State Rate      FEATURE_STATE_RESIST  => 14,              # State Resist      FEATURE_PARAM         => 21,              # Parameter      FEATURE_XPARAM        => 22,              # Ex-Parameter      FEATURE_SPARAM        => 23,              # Sp-Parameter      FEATURE_ATK_ELEMENT   => 31,              # Atk Element      FEATURE_ATK_STATE     => 32,              # Atk State      FEATURE_ATK_SPEED     => 33,              # Atk Speed      FEATURE_ATK_TIMES     => 34,              # Atk Times+      FEATURE_STYPE_ADD     => 41,              # Add Skill Type      FEATURE_STYPE_SEAL    => 42,              # Disable Skill Type      FEATURE_SKILL_ADD     => 43,              # Add Skill      FEATURE_SKILL_SEAL    => 44,              # Disable Skill      FEATURE_EQUIP_WTYPE   => 51,              # Equip Weapon      FEATURE_EQUIP_ATYPE   => 52,              # Equip Armor      FEATURE_EQUIP_FIX     => 53,              # Lock Equip      FEATURE_EQUIP_SEAL    => 54,              # Seal Equip      FEATURE_SLOT_TYPE     => 55,              # Slot Type      FEATURE_ACTION_PLUS   => 61,              # Action Times+      FEATURE_SPECIAL_FLAG  => 62,              # Special Flag      FEATURE_COLLAPSE_TYPE => 63,              # Collapse Effect      FEATURE_PARTY_ABILITY => 64,              # Party Ability       # Aliasing the above features with custom names to support conditionals      :element_rate         => "element_rate",      :debuff_rate          => "debuff_rate",      :state_rate           => "state_rate",      :state_resist         => "state_resist",      :param                => "param",      :xparam               => "xparam",      :sparam               => "sparam",      :atk_element          => "atk_element",      :atk_state            => "atk_state",      :atk_speed            => "atk_speed",      :atk_times            => "atk_times",      :stype_add            => "stype_add",      :stype_seal           => "stype_seal",      :skill_add            => "skill_add",      :skill_seal           => "skill_seal",      :equip_wtype          => "equip_wtype",      :equip_atype          => "equip_atype",      :equip_fix            => "equip_fix",      :equip_seal           => "equip_seal",      :slot_type            => "slot_type",      :action_plus          => "action_plus",      :special_flag         => "special_flag",      :collapse_type        => "collapse_type",      :party_ability        => "party_ability"    }     @element_tables = {}   end   # Returns the feature code for the particular string.  def self.get_feature_code(sym)    @feature_table[sym]  end   def self.dupe_entry_warn(your_id, existing_name)    msgbox("Warning: %s has already been reserved" %[existing_name.to_s])  end   def self.outdated_api_warn(idstring, version)    msgbox("Warning: `%s` feature requires version %.2f of the script" %[idstring, version])  end   def self.feature_table    @feature_table  end   # Table of elements, mapped to their ID's.  def self.element_table    return @element_table unless @element_table.nil?    @element_table = {}    $data_system.elements.each_with_index {|element, i|      next if element.empty?      @element_table[element.downcase] = i    }    return @element_table  end   # start things up  initialize_tablesend module RPG   class BaseItem::Feature    attr_accessor :condition  end   class BaseItem    def features      load_notetag_feature_manager unless @feature_checked      return @features    end     # Go through each line looking for custom features. Note that the data id    # is currently hardcoded to 0 since we don't really need it.    def load_notetag_feature_manager      @feature_checked = true       #check for features      results = self.note.scan(FeatureManager::Feature_Regex)      results.each { |code, args|        code = FeatureManager.get_feature_code(code.to_sym)        if code          check_feature(code, args)        end      }       # check for conditional features      results = self.note.scan(FeatureManager::Cond_Feature_Regex)      results.each {|code, cond, args|        code = FeatureManager.get_feature_code(code.to_sym)        if code          check_feature(code, args)          @features[-1].condition = cond        end      }       # check for features using extended regex.      results = self.note.scan(FeatureManager::Ext_Regex)      results.each do |res|        args = {}        code = FeatureManager.get_feature_code(res[0].to_sym)        if code          data = res[1].strip.split("\r\n")          data.each do |option|            name, value = option.split(":")            args[name.strip.to_sym] = value.strip          end          check_feature_ext(code, args)        end      end    end     def check_feature(code, args)      ft_code = code.is_a?(Fixnum) ? code : code.to_sym      if respond_to?("add_feature_#{code}")        send("add_feature_#{code}", ft_code, 0, args.split)      else        add_feature(ft_code, 0, args.split)       end    end     def check_feature_ext(code, args)      ft_code = code.is_a?(Fixnum) ? code : code.to_sym      if respond_to?("add_feature_#{code}_ext")        send("add_feature_#{code}_ext", ft_code, 0, args)      else        add_feature(ft_code, 0, args)       end    end     def add_feature(code, data_id, args)      @features.push(RPG::BaseItem::Feature.new(code, data_id, args))    end     # Register default features. Redundant, but the editor hardcodes values    # so we must do the same     # Args: element name (case-sensitive) or ID, float percentage    def add_feature_element_rate(code, data_id, args)      data_id = Integer(args[0]) rescue $data_system.elements.index(args[0])      add_feature(11, data_id, args[1].to_f)    end     # Args: param name, float percentage    def add_feature_debuff_rate(code, data_id, args)      data_id = FeatureManager::Param_Table[args[0].downcase]      add_feature(12, data_id, args[1].to_f)    end     # Args: state ID, float percentage    def add_feature_state_rate(code, data_id, args)      data_id = Integer(args[0])      add_feature(13, data_id, args[1].to_f)    end     # Args: state ID, float percentage    def add_feature_state_resist(code, data_id, args)      data_id = Integer(args[0])      add_feature(14, data_id, args[1].to_f)    end     # Args: param name, float percentage    def add_feature_param(code, data_id, args)      data_id = FeatureManager::Param_Table[args[0].downcase]      add_feature(21, data_id, args[1].to_f)    end     # Args: sparam name, float percentage    def add_feature_xparam(code, data_id, args)      data_id = FeatureManager::XParam_Table[args[0].downcase]      add_feature(22, data_id, args[1].to_f)    end     # Args: xparam name, float percentage    def add_feature_sparam(code, data_id, args)      data_id = FeatureManager::SParam_Table[args[0].downcase]      add_feature(23, data_id, args[1].to_f)    end     # Args: param name, float percentage    def add_feature_atk_element(code, data_id, args)      data_id = Integer(args[0]) rescue $data_system.elements.index(args[0])      add_feature(31, data_id, args[1].to_f)    end     # Args: state ID, float percentage    def add_feature_atk_state(code, data_id, args)      data_id = Integer(args[0])      add_feature(32, data_id, args[1].to_f)    end     # Args: float attack speed    def add_feature_atk_speed(code, data_id, args)      add_feature(33, 0, args[1].to_f)    end     # Args: float attack times    def add_feature_atk_times(code, data_id, args)      add_feature(34, 0, args[1].to_f)    end     # Args: stype ID or name    def add_feature_stype_add(code, data_id, args)      data_id = Integer(args[0]) rescue $data_system.skill_types.index(args[0])      add_feature(41, data_id, 0)    end     def add_feature_stype_seal(code, data_id, args)      data_id = Integer(args[0]) rescue $data_system.skill_types.index(args[0])      add_feature(42, data_id, 0.0)    end     def add_feature_skill_add(code, data_id, args)      add_feature(43, args[0].to_i, 0.0)    end     def add_feature_skill_seal(code, data_id, args)      add_feature(44, args[0].to_i, 0.0)    end     def add_feature_equip_wtype(code, data_id, args)      data_id = Integer(args[0]) rescue $data_system.weapon_types.index(args[0])      add_feature(51, data_id, 0)    end     def add_feature_equip_atype(code, data_id, args)      data_id = Integer(args[0]) rescue $data_system.armor_types.index(args[0])      add_feature(52, data_id, 0)    end     # args: etype_id    def add_feature_equip_fix(code, data_id, args)      add_feature(53, args[0].to_i, 0)    end     # args: etype_id    def add_feature_equip_seal(code, data_id, args)      add_feature(54, args[0].to_i, 0)    end     # args: slot type (1 for dual wield)    def add_feature_slot_type(code, data_id, args)      add_feature(55, args[0].to_i, 0)    end     def add_feature_action_plus(code, data_id, args)      add_feature(61, 0, args[0].to_f)    end     # args: flag_ID    def add_feature_special_flag(code, data_id, args)      add_feature(62, args[0].to_i, 0)    end     # args: collapse type ID    def add_feature_collapse_type(code, data_id, args)      add_feature(63, args[0].to_i, 0)    end     # args: party ability ID    def add_feature_party_ability(code, data_id, args)      add_feature(64, args[0].to_i, 0)    end  endend class Game_BattlerBase   #-----------------------------------------------------------------------------  # * Feature collection methods  #-----------------------------------------------------------------------------   def eval_feature_condition(condition, a, v=$game_variables, s=$game_switches)    eval(condition) rescue false  end   def feature_condition_met?(ft)    return true unless ft.condition    eval_feature_condition(ft.condition, self)  end   # May be inefficient since this method is called all the time  alias :th_feature_manager_all_features :all_features  def all_features    th_feature_manager_all_features.select {|ft| feature_condition_met?(ft)}  end   # Returns features for item filtered by code  def item_features(item, code)    item.features.select {|ft| ft.code == code && feature_condition_met?(ft)}  end   # Returns a set of all values for the given feature code  def features_value_set(code)    features(code).inject([]) {|r, ft| r |= [ft.value] }  end   # Returns a set of all values for the given feature code, filtered by data ID  def features_value_set_with_id(code, data_id)    features_with_id(code, data_id).inject([]) {|r, ft| r |= [ft.value]}  end   # Returns features for item filtered by code and data ID  def item_features_with_id(item, code, data_id)    item.features.select {|ft| ft.code == code && ft.data_id == data_id}  end   def item_features_set(item, code, data_id)    item_features_with_id(item, code, data_id).inject([]) {|r, ft| r |= [ft.value]}  end   # Returns sum of all features for item, by code and data ID  def item_features_sum(item, code, data_id)    item_features_with_id(item, code, data_id).inject(0.0) {|r, ft| r += ft.value }  end   # Returns the max value for the code  def features_max(code)    features(code).collect {|ft| ft.value}.max  end   # Returns the max value for the code, filtered by ID  def features_max_with_id(code, data_id)    features_with_id(code, data_id).collect {|ft| ft.value}.max  end   # Returns the min value for the given code  def features_min(code)    features(code).collect {|ft| ft.value}.min  end   # Returns the min value for the given code, filtered by ID  def features_min_with_id(code, data_id)    features_with_id(code, data_id).collect {|ft| ft.value}.min  end   # Returns the max value of features for item, filtered by code and ID  def item_features_max(item, code, data_id)    item_features_with_id(item, code, data_id).collect {|ft| ft.value}.max  end   # Returns the min value of features for item, filtered by code and ID  def item_features_min(item, code, data_id)    item_features_with_id(item, code, data_id).collect {|ft| ft.value}.min  end  #-----------------------------------------------------------------------------  # * Equip conditions  #-----------------------------------------------------------------------------   alias :feature_manager_equippable? :equippable?  def equippable?(item)    return false unless feature_manager_equippable?(item)    return false if item.is_a?(RPG::Weapon) && !feature_equip_weapon_ok?(item)     return false if item.is_a?(RPG::Armor) && !feature_equip_armor_ok?(item)    return true  end   def feature_equip_weapon_ok?(item)    return true  end   def feature_equip_armor_ok?(item)    return true  endend class Game_Party  attr_accessor :actorsend
=begin 
#=============================================================================== 
 ** Feature Manager 
 Author: Hime 
 Date: Oct 3, 2013 
-------------------------------------------------------------------------------- 
 ** Change log 
 2.0 Oct 3, 2013 
   - implemented the extended regex for feature note-tags 
 1.32 Nov 18, 2012 
   - added convenience wrapper for data elements 
 1.31 Nov 9, 2012 
   - fixed bug where item features didn't have conditions 
 1.3 Nov 8, 2012 
   - Added conditional features. 
   - Aliased default features for use with conditional features 
 Oct 22, 2012 
   - No longer overwrites any methods 
 Oct 21, 2012 
   - features_value_set should return set of values, not data_id's 
 Oct 18, 2012 
   - added item_feature_set to collect all features for a given item 
 Oct 14, 2012 
   - added max/min feature value collection 
 Oct 13, 2012 
   - added some feature collection to check features of specific item 
   - re-wrote `equippable?` to do negative-checking 
 Oct 12, 2012 
   - 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 
 * Preserve this header 
-------------------------------------------------------------------------------- 
 ** Compatibility 
  
 This script does not overwrite any methods and aliases one method. 
 Most features should not have conflicts with the following systems 
  
 -Tankentai SBS 
 -Yanfly Ace Battle Engine 
-------------------------------------------------------------------------------- 
 ** Description 
  
 This is a plugin-based feature system that allows you to define your own 
 features easily and add them to database objects. 
  
 Register a feature using an idstring to identify your feature. Recommended 
 strings or symbols, but anything hashable is valid. 
  
 You will use the idstring throughout your script, such as in notetags 
 and also initializing the feature (optional). 
  
 If your script will be using params, xparams, or sparams, you should use 
 standard data ID's that the rest of the script uses. These are defined in 
 the tables below. 
  
 You should use data ID 0 for weapons, 1 for armors, and 2 for items. 
-------------------------------------------------------------------------------- 
 ** Usage 
  
 To add a feature to a feature object, simply note-tag with a feature tag. 
 The general syntax for a feature tag is 
  
    <ft: name arg1 arg2 ... > 
     
 Where  
   `name` is the name of the feature you wish to add 
   `arg1 arg2 ...` are a list of arguments that the plugin requires 
    
 You may specify conditional features as well, using the following note-tag 
  
    <cond_ft: name "cond" arg1 arg2 ... > 
     
 Where 
   `cond` is a ruby expression that evaluates to true or false. The condition 
          must be surrounded by quotation marks. 
           
 Conditional features can be applied to any feature that is supported by this 
 system. 
  
 If you need more control over the note-tag, you can use the extended note-tag 
  
   <ft: FEATURE_NAME> 
     option1: value1 
     option2: value2 
     ... 
   </ft> 
    
 You can define any option name that you want. All options will be passed to 
 your `add_feature` method as a hash, where the keys are the option names and 
 the values are the corresponding values. For example, the above example 
 would create a hash that looks like 
  
   { 
     :option1 => value1, 
     :option2 => value2 
   } 
    
 Which you can then use to grab values. 
 To work with your extended note-tag, you need to define the following method 
 in BaseItem or its child classes: 
  
   def add_feature_FEATURE_NAME_ext(code, data_id, args) 
      
     # do something with your args 
     value = ... 
     add_feature(code, data_id, value) 
   end 
  
#=============================================================================== 
=end 
$imported = {} if $imported.nil? 
$imported["Feature_Manager"] = 2.0 
#=============================================================================== 
# ** Rest of the script 
#=============================================================================== 
module FeatureManager 
  
  # Format for all note tags 
  Feature_Regex = /<ft: (\w+)(.*)>/i 
  Cond_Feature_Regex = /<cond_ft: (\w+) ['"](.*)['"](.*)>/i 
  
  Ext_Regex = /<feature: (\w+)>(.*?)<\/feature>/im 
  
  # Default features. 
  FEATURE_ELEMENT_RATE  = 11              # Element Rate 
  FEATURE_DEBUFF_RATE   = 12              # Debuff Rate 
  FEATURE_STATE_RATE    = 13              # State Rate 
  FEATURE_STATE_RESIST  = 14              # State Resist 
  FEATURE_PARAM         = 21              # Parameter 
  FEATURE_XPARAM        = 22              # Ex-Parameter 
  FEATURE_SPARAM        = 23              # Sp-Parameter 
  FEATURE_ATK_ELEMENT   = 31              # Atk Element 
  FEATURE_ATK_STATE     = 32              # Atk State 
  FEATURE_ATK_SPEED     = 33              # Atk Speed 
  FEATURE_ATK_TIMES     = 34              # Atk Times+ 
  FEATURE_STYPE_ADD     = 41              # Add Skill Type 
  FEATURE_STYPE_SEAL    = 42              # Disable Skill Type 
  FEATURE_SKILL_ADD     = 43              # Add Skill 
  FEATURE_SKILL_SEAL    = 44              # Disable Skill 
  FEATURE_EQUIP_WTYPE   = 51              # Equip Weapon 
  FEATURE_EQUIP_ATYPE   = 52              # Equip Armor 
  FEATURE_EQUIP_FIX     = 53              # Lock Equip 
  FEATURE_EQUIP_SEAL    = 54              # Seal Equip 
  FEATURE_SLOT_TYPE     = 55              # Slot Type 
  FEATURE_ACTION_PLUS   = 61              # Action Times+ 
  FEATURE_SPECIAL_FLAG  = 62              # Special Flag 
  FEATURE_COLLAPSE_TYPE = 63              # Collapse Effect 
  FEATURE_PARTY_ABILITY = 64              # Party Ability 
  
  # Data ID's for consistency with the rest of the scripts 
  Weapon_ID = 0 
  Armor_ID = 1 
  Item_ID = 2 
  
  # Data ID's for basic parameters. Use this if you are going to 
  # use params in note tags 
  Param_Table = { 
    "mhp" => 0, 
    "mmp" => 1, 
    "atk" => 2, 
    "def" => 3, 
    "mat" => 4, 
    "mdf" => 5, 
    "agi" => 6, 
    "luk" => 7 
  } 
  
  # Data ID's for extra parameters. 
  XParam_Table = { 
    "hit" => 0, 
    "eva" => 1, 
    "cri" => 2, 
    "cev" => 3, 
    "mev" => 4, 
    "mrf" => 5, 
    "cnt" => 6, 
    "hrg" => 7, 
    "mrg" => 8, 
    "trg" => 9 
  } 
  
  # Data ID's for special parameters 
  SParam_Table = { 
    "tgr" => 0, 
    "grd" => 1, 
    "rec" => 2, 
    "pha" => 3, 
    "mcr" => 4, 
    "tcr" => 5, 
    "pdr" => 6, 
    "mdr" => 7, 
    "fdr" => 8, 
    "exr" => 9, 
  } 
  
  def self.register(idstring, api_version=1.0) 
    idstring = idstring.to_s 
    key = idstring.to_sym 
    if $imported["Feature_Manager"] < api_version 
      outdated_api_warn(idstring, api_version) 
    elsif @feature_table.include?(key) 
      dupe_entry_warn(key, @feature_table[key])  
    else 
      @feature_table[key] = idstring 
    end 
  end 
  
  def self.api_version(version) 
  
  end 
  
  # Each feature maps to a code, which is stored in the feature. 
  # It should be a symbol. Notice that this table is only used for 
  # mapping and is never referenced after an object has been setup. 
  def self.initialize_tables 
    @feature_table = { 
      FEATURE_ELEMENT_RATE  => 11,              # Element Rate 
      FEATURE_DEBUFF_RATE   => 12,              # Debuff Rate 
      FEATURE_STATE_RATE    => 13,              # State Rate 
      FEATURE_STATE_RESIST  => 14,              # State Resist 
      FEATURE_PARAM         => 21,              # Parameter 
      FEATURE_XPARAM        => 22,              # Ex-Parameter 
      FEATURE_SPARAM        => 23,              # Sp-Parameter 
      FEATURE_ATK_ELEMENT   => 31,              # Atk Element 
      FEATURE_ATK_STATE     => 32,              # Atk State 
      FEATURE_ATK_SPEED     => 33,              # Atk Speed 
      FEATURE_ATK_TIMES     => 34,              # Atk Times+ 
      FEATURE_STYPE_ADD     => 41,              # Add Skill Type 
      FEATURE_STYPE_SEAL    => 42,              # Disable Skill Type 
      FEATURE_SKILL_ADD     => 43,              # Add Skill 
      FEATURE_SKILL_SEAL    => 44,              # Disable Skill 
      FEATURE_EQUIP_WTYPE   => 51,              # Equip Weapon 
      FEATURE_EQUIP_ATYPE   => 52,              # Equip Armor 
      FEATURE_EQUIP_FIX     => 53,              # Lock Equip 
      FEATURE_EQUIP_SEAL    => 54,              # Seal Equip 
      FEATURE_SLOT_TYPE     => 55,              # Slot Type 
      FEATURE_ACTION_PLUS   => 61,              # Action Times+ 
      FEATURE_SPECIAL_FLAG  => 62,              # Special Flag 
      FEATURE_COLLAPSE_TYPE => 63,              # Collapse Effect 
      FEATURE_PARTY_ABILITY => 64,              # Party Ability 
  
      # Aliasing the above features with custom names to support conditionals 
      :element_rate         => "element_rate", 
      :debuff_rate          => "debuff_rate", 
      :state_rate           => "state_rate", 
      :state_resist         => "state_resist", 
      :param                => "param", 
      :xparam               => "xparam", 
      :sparam               => "sparam", 
      :atk_element          => "atk_element", 
      :atk_state            => "atk_state", 
      :atk_speed            => "atk_speed", 
      :atk_times            => "atk_times", 
      :stype_add            => "stype_add", 
      :stype_seal           => "stype_seal", 
      :skill_add            => "skill_add", 
      :skill_seal           => "skill_seal", 
      :equip_wtype          => "equip_wtype", 
      :equip_atype          => "equip_atype", 
      :equip_fix            => "equip_fix", 
      :equip_seal           => "equip_seal", 
      :slot_type            => "slot_type", 
      :action_plus          => "action_plus", 
      :special_flag         => "special_flag", 
      :collapse_type        => "collapse_type", 
      :party_ability        => "party_ability" 
    } 
  
    @element_tables = {} 
  
  end 
  
  # Returns the feature code for the particular string. 
  def self.get_feature_code(sym) 
    @feature_table[sym] 
  end 
  
  def self.dupe_entry_warn(your_id, existing_name) 
    msgbox("Warning: %s has already been reserved" %[existing_name.to_s]) 
  end 
  
  def self.outdated_api_warn(idstring, version) 
    msgbox("Warning: `%s` feature requires version %.2f of the script" %[idstring, version]) 
  end 
  
  def self.feature_table 
    @feature_table 
  end 
  
  # Table of elements, mapped to their ID's. 
  def self.element_table 
    return @element_table unless @element_table.nil? 
    @element_table = {} 
    $data_system.elements.each_with_index {|element, i| 
      next if element.empty? 
      @element_table[element.downcase] = i 
    } 
    return @element_table 
  end 
  
  # start things up 
  initialize_tables 
end 
  
module RPG 
  
  class BaseItem::Feature 
    attr_accessor :condition 
  end 
  
  class BaseItem 
    def features 
      load_notetag_feature_manager unless @feature_checked 
      return @features 
    end 
  
    # Go through each line looking for custom features. Note that the data id 
    # is currently hardcoded to 0 since we don't really need it. 
    def load_notetag_feature_manager 
      @feature_checked = true 
  
      #check for features 
      results = self.note.scan(FeatureManager::Feature_Regex) 
      results.each { |code, args| 
        code = FeatureManager.get_feature_code(code.to_sym) 
        if code 
          check_feature(code, args) 
        end 
      } 
  
      # check for conditional features 
      results = self.note.scan(FeatureManager::Cond_Feature_Regex) 
      results.each {|code, cond, args| 
        code = FeatureManager.get_feature_code(code.to_sym) 
        if code 
          check_feature(code, args) 
          @features[-1].condition = cond 
        end 
      } 
  
      # check for features using extended regex. 
      results = self.note.scan(FeatureManager::Ext_Regex) 
      results.each do |res| 
        args = {} 
        code = FeatureManager.get_feature_code(res[0].to_sym) 
        if code 
          data = res[1].strip.split("\r\n") 
          data.each do |option| 
            name, value = option.split(":") 
            args[name.strip.to_sym] = value.strip 
          end 
          check_feature_ext(code, args) 
        end 
      end 
    end 
  
    def check_feature(code, args) 
      ft_code = code.is_a?(Fixnum) ? code : code.to_sym 
      if respond_to?("add_feature_#{code}") 
        send("add_feature_#{code}", ft_code, 0, args.split) 
      else 
        add_feature(ft_code, 0, args.split)  
      end 
    end 
  
    def check_feature_ext(code, args) 
      ft_code = code.is_a?(Fixnum) ? code : code.to_sym 
      if respond_to?("add_feature_#{code}_ext") 
        send("add_feature_#{code}_ext", ft_code, 0, args) 
      else 
        add_feature(ft_code, 0, args)  
      end 
    end 
  
    def add_feature(code, data_id, args) 
      @features.push(RPG::BaseItem::Feature.new(code, data_id, args)) 
    end 
  
    # Register default features. Redundant, but the editor hardcodes values 
    # so we must do the same 
  
    # Args: element name (case-sensitive) or ID, float percentage 
    def add_feature_element_rate(code, data_id, args) 
      data_id = Integer(args[0]) rescue $data_system.elements.index(args[0]) 
      add_feature(11, data_id, args[1].to_f) 
    end 
  
    # Args: param name, float percentage 
    def add_feature_debuff_rate(code, data_id, args) 
      data_id = FeatureManager::Param_Table[args[0].downcase] 
      add_feature(12, data_id, args[1].to_f) 
    end 
  
    # Args: state ID, float percentage 
    def add_feature_state_rate(code, data_id, args) 
      data_id = Integer(args[0]) 
      add_feature(13, data_id, args[1].to_f) 
    end 
  
    # Args: state ID, float percentage 
    def add_feature_state_resist(code, data_id, args) 
      data_id = Integer(args[0]) 
      add_feature(14, data_id, args[1].to_f) 
    end 
  
    # Args: param name, float percentage 
    def add_feature_param(code, data_id, args) 
      data_id = FeatureManager::Param_Table[args[0].downcase] 
      add_feature(21, data_id, args[1].to_f) 
    end 
  
    # Args: sparam name, float percentage 
    def add_feature_xparam(code, data_id, args) 
      data_id = FeatureManager::XParam_Table[args[0].downcase] 
      add_feature(22, data_id, args[1].to_f) 
    end 
  
    # Args: xparam name, float percentage 
    def add_feature_sparam(code, data_id, args) 
      data_id = FeatureManager::SParam_Table[args[0].downcase] 
      add_feature(23, data_id, args[1].to_f) 
    end 
  
    # Args: param name, float percentage 
    def add_feature_atk_element(code, data_id, args) 
      data_id = Integer(args[0]) rescue $data_system.elements.index(args[0]) 
      add_feature(31, data_id, args[1].to_f) 
    end 
  
    # Args: state ID, float percentage 
    def add_feature_atk_state(code, data_id, args) 
      data_id = Integer(args[0]) 
      add_feature(32, data_id, args[1].to_f) 
    end 
  
    # Args: float attack speed 
    def add_feature_atk_speed(code, data_id, args) 
      add_feature(33, 0, args[1].to_f) 
    end 
  
    # Args: float attack times 
    def add_feature_atk_times(code, data_id, args) 
      add_feature(34, 0, args[1].to_f) 
    end 
  
    # Args: stype ID or name 
    def add_feature_stype_add(code, data_id, args) 
      data_id = Integer(args[0]) rescue $data_system.skill_types.index(args[0]) 
      add_feature(41, data_id, 0) 
    end 
  
    def add_feature_stype_seal(code, data_id, args) 
      data_id = Integer(args[0]) rescue $data_system.skill_types.index(args[0]) 
      add_feature(42, data_id, 0.0) 
    end 
  
    def add_feature_skill_add(code, data_id, args) 
      add_feature(43, args[0].to_i, 0.0) 
    end 
  
    def add_feature_skill_seal(code, data_id, args) 
      add_feature(44, args[0].to_i, 0.0) 
    end 
  
    def add_feature_equip_wtype(code, data_id, args) 
      data_id = Integer(args[0]) rescue $data_system.weapon_types.index(args[0]) 
      add_feature(51, data_id, 0) 
    end 
  
    def add_feature_equip_atype(code, data_id, args) 
      data_id = Integer(args[0]) rescue $data_system.armor_types.index(args[0]) 
      add_feature(52, data_id, 0) 
    end 
  
    # args: etype_id 
    def add_feature_equip_fix(code, data_id, args) 
      add_feature(53, args[0].to_i, 0) 
    end 
  
    # args: etype_id 
    def add_feature_equip_seal(code, data_id, args) 
      add_feature(54, args[0].to_i, 0) 
    end 
  
    # args: slot type (1 for dual wield) 
    def add_feature_slot_type(code, data_id, args) 
      add_feature(55, args[0].to_i, 0) 
    end 
  
    def add_feature_action_plus(code, data_id, args) 
      add_feature(61, 0, args[0].to_f) 
    end 
  
    # args: flag_ID 
    def add_feature_special_flag(code, data_id, args) 
      add_feature(62, args[0].to_i, 0) 
    end 
  
    # args: collapse type ID 
    def add_feature_collapse_type(code, data_id, args) 
      add_feature(63, args[0].to_i, 0) 
    end 
  
    # args: party ability ID 
    def add_feature_party_ability(code, data_id, args) 
      add_feature(64, args[0].to_i, 0) 
    end 
  end 
end 
  
class Game_BattlerBase 
  
  #----------------------------------------------------------------------------- 
  # * Feature collection methods 
  #----------------------------------------------------------------------------- 
  
  def eval_feature_condition(condition, a, v=$game_variables, s=$game_switches) 
    eval(condition) rescue false 
  end 
  
  def feature_condition_met?(ft) 
    return true unless ft.condition 
    eval_feature_condition(ft.condition, self) 
  end 
  
  # May be inefficient since this method is called all the time 
  alias :th_feature_manager_all_features :all_features 
  def all_features 
    th_feature_manager_all_features.select {|ft| feature_condition_met?(ft)} 
  end 
  
  # Returns features for item filtered by code 
  def item_features(item, code) 
    item.features.select {|ft| ft.code == code && feature_condition_met?(ft)} 
  end 
  
  # Returns a set of all values for the given feature code 
  def features_value_set(code) 
    features(code).inject([]) {|r, ft| r |= [ft.value] } 
  end 
  
  # Returns a set of all values for the given feature code, filtered by data ID 
  def features_value_set_with_id(code, data_id) 
    features_with_id(code, data_id).inject([]) {|r, ft| r |= [ft.value]} 
  end 
  
  # Returns features for item filtered by code and data ID 
  def item_features_with_id(item, code, data_id) 
    item.features.select {|ft| ft.code == code && ft.data_id == data_id} 
  end 
  
  def item_features_set(item, code, data_id) 
    item_features_with_id(item, code, data_id).inject([]) {|r, ft| r |= [ft.value]} 
  end 
  
  # Returns sum of all features for item, by code and data ID 
  def item_features_sum(item, code, data_id) 
    item_features_with_id(item, code, data_id).inject(0.0) {|r, ft| r += ft.value } 
  end 
  
  # Returns the max value for the code 
  def features_max(code) 
    features(code).collect {|ft| ft.value}.max 
  end 
  
  # Returns the max value for the code, filtered by ID 
  def features_max_with_id(code, data_id) 
    features_with_id(code, data_id).collect {|ft| ft.value}.max 
  end 
  
  # Returns the min value for the given code 
  def features_min(code) 
    features(code).collect {|ft| ft.value}.min 
  end 
  
  # Returns the min value for the given code, filtered by ID 
  def features_min_with_id(code, data_id) 
    features_with_id(code, data_id).collect {|ft| ft.value}.min 
  end 
  
  # Returns the max value of features for item, filtered by code and ID 
  def item_features_max(item, code, data_id) 
    item_features_with_id(item, code, data_id).collect {|ft| ft.value}.max 
  end 
  
  # Returns the min value of features for item, filtered by code and ID 
  def item_features_min(item, code, data_id) 
    item_features_with_id(item, code, data_id).collect {|ft| ft.value}.min 
  end 
  #----------------------------------------------------------------------------- 
  # * Equip conditions 
  #----------------------------------------------------------------------------- 
  
  alias :feature_manager_equippable? :equippable? 
  def equippable?(item) 
    return false unless feature_manager_equippable?(item) 
    return false if item.is_a?(RPG::Weapon) && !feature_equip_weapon_ok?(item)  
    return false if item.is_a?(RPG::Armor) && !feature_equip_armor_ok?(item) 
    return true 
  end 
  
  def feature_equip_weapon_ok?(item) 
    return true 
  end 
  
  def feature_equip_armor_ok?(item) 
    return true 
  end 
end 
  
class Game_Party 
  attr_accessor :actors 
end 
 =begin#============================================================================== ** Feature: Max TP Author: Hime Date: Oct 13, 2012------------------------------------------------------------------------------ ** Change log Oct 13, 2012   - 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 * Preserve this header------------------------------------------------------------------------------ ** Required -Feature Manager ([url]http://xtsukihime.com/2012/10/13/feature-manager/[/url])  -Core: Damage Processing  ([url]http://xtsukihime.com/2012/10/13/core-damage-processing/[/url])------------------------------------------------------------------------------ Increases your max TP by some value  Tag objects with     <ft: max_tp x>     For some integer x. Your max TP will be increased by x.#===============================================================================end$imported = {} if $imported.nil?$imported["Feature_MaxTP"] = true#==============================================================================# ** Rest of the script#==============================================================================module Features  module Max_TP    FeatureManager.register(:max_tp)  endend class RPG::BaseItem   def add_feature_max_tp(code, data_id, args)    data_id = 0    value = args[0].to_i    add_feature(code, data_id, value)  endend class Game_BattlerBase   def tp_rate    #@tp.to_f / 100    max_tp > 0 ? @tp.to_f / max_tp : 0  end   alias :ft_max_tp_max :max_tp  def max_tp    return [ft_max_tp_max + features_sum(:max_tp, 0), 0].max  endend
=begin 
#============================================================================== 
 ** Feature: Max TP 
 Author: Hime 
 Date: Oct 13, 2012 
------------------------------------------------------------------------------ 
 ** Change log 
 Oct 13, 2012 
   - 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 
 * Preserve this header 
------------------------------------------------------------------------------ 
 ** Required 
 -Feature Manager 
 ([url]http://xtsukihime.com/2012/10/13/feature-manager/[/url]) 
  
 -Core: Damage Processing  
 ([url]http://xtsukihime.com/2012/10/13/core-damage-processing/[/url]) 
------------------------------------------------------------------------------ 
 Increases your max TP by some value 
  
 Tag objects with  
    <ft: max_tp x> 
     
 For some integer x. Your max TP will be increased by x. 
#============================================================================== 
=end 
$imported = {} if $imported.nil? 
$imported["Feature_MaxTP"] = true 
#============================================================================== 
# ** Rest of the script 
#============================================================================== 
module Features 
  module Max_TP 
    FeatureManager.register(:max_tp) 
  end 
end 
  
class RPG::BaseItem 
  
  def add_feature_max_tp(code, data_id, args) 
    data_id = 0 
    value = args[0].to_i 
    add_feature(code, data_id, value) 
  end 
end 
  
class Game_BattlerBase 
  
  def tp_rate 
    #@tp.to_f / 100 
    max_tp > 0 ? @tp.to_f / max_tp : 0 
  end 
  
  alias :ft_max_tp_max :max_tp 
  def max_tp 
    return [ft_max_tp_max + features_sum(:max_tp, 0), 0].max 
  end 
end 
 | 
 |