Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- =begin
- #===============================================================================
- Title: Custom Use Conditions
- Author: Hime
- Date: Jan 4, 2014
- Updated: Nov. 21, 2021
- Updated By: Roninator2, KBGaming as aid to MasterMoes
- URL: https://himeworks.com/2013/11/26/custom-use-conditions/
- For KBGaming: https://kbgamingmusic.itch.io/
- --------------------------------------------------------------------------------
- ** Change log
- Nov. 21, 2021
- - Allows one to use features to add skills and check
- for those skills as conditions
- - Considered a QoL update
- - Archived on RPG Maker Central because the internet is volatile
- Jan 4, 2014
- - allows for "recursive" calls. Recursive calls do not check custom use
- conditions
- - added "Actor" condition
- Nov 29, 2013
- - fixed bug where no use conditions caused it to always fail
- Nov 26, 2013
- - Initial release
- --------------------------------------------------------------------------------
- ** Terms of Use
- * Free to use in non-commercial projects
- * Contact me for commercial use
- * No additional commercial use contact necessary for KBGaming
- * 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
- * Credits also to Roninator2, and KBGaming (the latter is optional)
- * Preserve this header
- --------------------------------------------------------------------------------
- ** Description
- This script allows you to define custom skill requirements for your skills.
- By default, you can choose two require up to two weapon types. This script
- allows you to define requirements based on things like
- - actor's class
- - equipped weapons
- - equipped armors
- - equipped weapon types
- - equipped armor types
- - learned skills
- - New: skills given by features (if an equip/state gives a skill for example)
- - active states
- - formulas, for anything else
- You can create conditions to require multiple conditions to be met, or
- require at least one condition to be met.
- --------------------------------------------------------------------------------
- ** Installation
- In the script editor, place this script below Materials and above Main
- --------------------------------------------------------------------------------
- ** Usage
- -- Specifying Use Conditions --
- Note-tag your skills or items with the following
- <use conditions>
- TYPE1: VALUE1
- TYPE2: VALUE2
- </use conditions>
- Refer to the reference section for a list of available use conditions.
- There is a special "formula" type that allows you to evaluate any arbitrary
- formula. The following formula variables are available
- a - current actor
- p - game party
- t - game troop
- s - game switches
- v - game variables
- -- Use Condition Groups --
- All use conditions are organized into separate "use condition groups". The
- notetag that you see above describes a single condition group. You can
- have multiple condition groups by simply defining multiple notetags.
- A skill is said to be "usable" if at least one condition group is satisfied.
- A condition group is satisfied only if all conditions within the group are
- satisfied. That is, they evaluate to true. Therefore, if you have multiple
- condition groups, you are only required to satisfy one group in order to
- use the skill. See the example to understand how condition groups are used.
- --------------------------------------------------------------------------------
- ** Example
- Suppose you have a Fire Slash skill that can be used under two different
- conditions as follows
- 1. You must have the "fire enchant" state (state 7), and equip a sword type
- weapon (wtype 2)
- 2. You are using the "Fire Dragon Sword" (weapon 21)
- To accomplish this, you will define two use condition groups by notetagging
- your skill with
- <use conditions>
- state: 7
- wtype: 2
- </use conditions>
- <use conditions>
- weapon: 21
- </use conditions>
- --------------------------------------------------------------------------------
- ** Reference
- The following use condition types are available
- type: weapon
- value: ID
- desc: requires the weapon to be equipped
- type: armor
- value: ID
- desc: requires the armor to be equipped
- type: wtype
- value: ID
- desc: requires the weapon type to be equipped
- type: atype
- value: ID
- desc: requires the armor type to be equipped
- type: actor
- value: ID
- desc: requires the user to be a specific actor
- type: class
- value: ID
- desc: requires the actor to have the given class
- type: state
- value: ID
- desc: requires the state to be currently applied to the actor
- type: learned
- value: ID
- desc: requires the actor to have learned the specified skill
- # New. Looks for if a skill is added by any feature.
- type: osl (other skill learned)
- value: ID
- desc: requires the actor to have acquired the specified skill, via any means including features
- # end New
- type: formula
- value: ruby formula
- desc: requires the formula to evaluate to true
- --------------------------------------------------------------------------------
- ** Examples
- #===============================================================================
- =end
- $imported = {} if $imported.nil?
- $imported["TH_CustomUseConditions"] = true
- #===============================================================================
- # ** Configuration
- #===============================================================================
- module TH
- module Custom_Use_Conditions
- Regex = /<use[-_ ]conditions>(.*?)<\/use[-_ ]conditions>/im
- end
- end
- #===============================================================================
- # ** Rest of Script
- #===============================================================================
- module RPG
- class UsableItem < BaseItem
- def use_conditions
- load_notetag_use_conditions unless @use_conditions
- return @use_conditions
- end
- def load_notetag_use_conditions
- @use_conditions = []
- res = self.note.scan(TH::Custom_Use_Conditions::Regex)
- res.each do |result|
- group = Data_UseConditionGroup.new
- result[0].strip.split("\r\n").each do |option|
- case option.strip
- when /weapon:\s*(\d+)\s*/i
- cond = make_custom_use_condition(:weapon, $1.to_i)
- when /armor:\s*(\d+)\s*/i
- cond = make_custom_use_condition(:armor, $1.to_i)
- when /learned:\s*(\d+)\s*/i
- cond = make_custom_use_condition(:learned, $1.to_i)
- # New. Looks for if a skill is added by any feature.
- when /osl:\s*(\d+)\s*/i
- cond = make_custom_use_condition(:osl, $1.to_i)
- # end New
- when /wtype:\s*(\d+)\s*/i
- cond = make_custom_use_condition(:wtype, $1.to_i)
- when /atype:\s*(\d+)\s*/i
- cond = make_custom_use_condition(:atype, $1.to_i)
- when /actor:\s*(\d+)\s*/i
- cond = make_custom_use_condition(:actor, $1.to_i)
- when /class:\s*(\d+)\s*/i
- cond = make_custom_use_condition(:class, $1.to_i)
- when /state:\s*(\d+)\s*/i
- cond = make_custom_use_condition(:state, $1.to_i)
- when /formula:\s*(.*)\s*/i
- cond = make_custom_use_condition(:formula, $1)
- end
- group.conditions << cond
- end
- @use_conditions << group
- end
- end
- def make_custom_use_condition(type, value)
- return Data_UseCondition.new(type, value)
- end
- end
- end
- class Data_UseConditionGroup
- attr_reader :conditions
- def initialize
- @conditions = []
- end
- end
- class Data_UseCondition
- attr_reader :type
- attr_reader :value
- def initialize(type, value)
- @type = type
- @value = value
- end
- def eval_use_condition(a, p=$game_party, t=$game_troop, s=$game_switches, v=$game_variables)
- eval(@value)
- end
- end
- class Game_BattlerBase
- def custom_use_conditions_met?(item)
- true
- end
- end
- class Game_Actor < Game_Battler
- alias :th_use_conditions_usable? :usable?
- def usable?(item)
- bool = th_use_conditions_usable?(item)
- return false unless bool
- unless @check_use_custom_conditions
- @check_use_custom_conditions = true
- bool = custom_use_conditions_met?(item)
- @check_use_custom_conditions = false
- end
- return bool
- end
- #-----------------------------------------------------------------------------
- #
- #-----------------------------------------------------------------------------
- alias :th_use_conditions_custom_use_conditions_met? :custom_use_conditions_met?
- def custom_use_conditions_met?(item)
- return false unless th_use_conditions_custom_use_conditions_met?(item)
- return true if item.nil? || item.use_conditions.empty?
- weapons = self.weapons
- armors = self.armors
- weapon_ids = weapons.collect {|obj| obj.id}
- wtype_ids = weapons.collect {|obj| obj.wtype_id}
- armor_ids = armors.collect {|obj| obj.id}
- atype_ids = armors.collect {|obj| obj.atype_id}
- state_ids = self.states.collect {|obj| obj.id }
- # New. Looks for if a skill is added by any feature.
- skill_ids = skills.collect {|obj| obj.id}
- # end New
- # for each group
- item.use_conditions.each do |group|
- # skip if any are not satisfied
- next if group.conditions.any? do |cond|
- value = cond.value
- case cond.type
- when :weapon
- !weapon_ids.include?(value)
- when :armor
- !armor_ids.include?(value)
- when :state
- !state_ids.include?(value)
- when :class
- !(@class_id == value)
- when :actor
- !(@actor_id == value)
- when :wtype
- !wtype_ids.include?(value)
- when :atype
- !atype_ids.include?(value)
- when :learned
- !@skills.include?(value)
- # New. Looks for if a skill is added by any feature.
- when :osl
- !skill_ids.include?(value)
- # end New
- when :formula
- !cond.eval_use_condition(self)
- end
- end
- # all are satisfied, so this group is satisfied
- return true
- end
- return false
- end
- end
- class Window_BattleItem < Window_ItemList
- #--------------------------------------------------------------------------
- # Overwrite. Item usability is based on actor, not party
- #--------------------------------------------------------------------------
- def include?(item)
- BattleManager.actor.usable?(item)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement