=begin
#===============================================================================
Title: Scope Conditions
Author: Hime
Date: Apr 25, 2015
--------------------------------------------------------------------------------
** Change log
Apr 25, 2015
- updated note-tag to support > in formulas
Nov 28, 2014
- fixed bug where target filtering does not check for nil objects
Apr 6, 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 specify a scope condition for your items and skills.
A scope condition is a formula that is used to determine whether a skill
or item has an effect on a target or not. If it has no effect on a target then
the action not do anything to that target.
--------------------------------------------------------------------------------
** Installation
Place this script below Materials and above Main
--------------------------------------------------------------------------------
** Usage
To specify a generic scope condition, note-tag skills/items with
Where the formula is some valid ruby statement.
The following variables are available for your formula
a - current attacker
b - target
f - friends unit
o - opponents unit
v - game variables
s - game switches
The target is all of the targets that the skill/item can affect. For example,
if a skill affects all enemies, then `b` will be replaced with each enemy
during action execution.
The f and o variables depend on who the current attacker is.
If the attacker is an actor, then the friends unit is the game party.
#===============================================================================
=end
$imported = {} if $imported.nil?
$imported[:TH_ScopeConditions] = true
#===============================================================================
# ** Configuration
#===============================================================================
module TH
module Scope_Conditions
Regex = //im
Ext_Regex = /(.*?)<\/scope[-_ ]condition>/im
Battler_Regex = /(.*?)<\/scope[-_ ]condition>/im
end
end
#===============================================================================
# ** Rest of script
#===============================================================================
module RPG
class UsableItem
#---------------------------------------------------------------------------
# Returns the scope condition for the item/skill
#---------------------------------------------------------------------------
def scope_condition
return @scope_condition unless @scope_condition.nil?
load_notetag_scope_condition
return @scope_condition
end
#---------------------------------------------------------------------------
# Parse scope condition
#---------------------------------------------------------------------------
def load_notetag_scope_condition
res = self.note.match(TH::Scope_Conditions::Regex)
@scope_condition = res ? res[1] : ""
end
end
end
class Game_Action
alias :th_scope_conditions_make_targets :make_targets
def make_targets
targets = th_scope_conditions_make_targets
return targets.select {|target| target && target.scope_condition_met?(@subject, item)}
end
end
class Game_Battler < Game_BattlerBase
alias :th_scope_conditions_item_test :item_test
def item_test(user, item)
return false unless scope_condition_met?(user, item)
th_scope_conditions_item_test(user, item)
end
def scope_condition(user, item)
return item.scope_condition
end
#-----------------------------------------------------------------------------
# Test on the item's scope condition
#-----------------------------------------------------------------------------
def scope_condition_met?(user, item)
condition = scope_condition(user, item)
return true if condition.empty?
return eval_scope_condition(condition, user, self, user.friends_unit, user.opponents_unit)
end
def eval_scope_condition(formula, a, b, f, o, v=$game_variables, s=$game_switches)
eval(formula)
end
end