Code:
#==============================================================================|
# ** Script Info |
#------------------------------------------------------------------------------|
# * Script Name |
# DoubleX RMVXA Linked Battlers |
#------------------------------------------------------------------------------|
# * Functions |
# Lets users set some states to make their owners share some stats together |
#------------------------------------------------------------------------------|
# * Terms Of Use |
# You shall keep this script's Script Info part's contents intact |
# You shalln't claim that this script is written by anyone other than |
# DoubleX or his aliases |
# None of the above applies to DoubleX or his aliases |
#------------------------------------------------------------------------------|
# * Prerequisites |
# Abilities: |
# 1. Some RGSS3 scripting proficiency to fully utilize this script |
#------------------------------------------------------------------------------|
# * Instructions |
# 1. Open the script editor and put this script into an open slot between |
# Materials and Main, save to take effect. |
#------------------------------------------------------------------------------|
# * Links |
# Script Usage 101: |
# 1. forums.rpgmakerweb.com/index.php?/topic/32752-rmvxa-script-usage-101/ |
# 2. rpgmakervxace.net/topic/27475-rmvxa-script-usage-101/ |
# This script: |
# 1. http://pastebin.com/bfCuAkKT |
# Mentioned Patreon Supporters: |
# https://www.patreon.com/posts/71738797 |
#------------------------------------------------------------------------------|
# * Authors |
# DoubleX |
#------------------------------------------------------------------------------|
# * Changelog |
# v1.00b(GMT 0400 8-11-2015): |
# 1. Notetag values are now symbols of methods in the configuration regions |
# 2. This script doesn't need DoubleX RMVXA Linked Battlers Compatibility to|
# be compatible with all its addressed scripts |
# 3. Further improved this script's compatibility, efficiency and simplicity|
# v1.00a(GMT 1500 7-8-2015): |
# 1. 1st version of this script finished |
#==============================================================================|
#==============================================================================|
# ** Notetag Info |
#------------------------------------------------------------------------------|
# * State Notetags: |
# 1. <linked battlers: lbcx, lbsx, lbwx> |
# - Sets the owners of this state meeting lbcx to share stats included in|
# lbsx with weight lbwx applied to each of them when any included stat |
# of any included battler changes |
# - Only the 1st applicable notetag of the state with the highest |
# priority will be applied to the stat change of the linked battler |
# - If a linked battler can't take all of that battler's share due to |
# hitting the minimum or maximum stat value, thost not being taken by |
# that battler will be shared by the rest of the linked battlers also |
# - The battler having a stat to be changed is the last linked battler |
# taking that battler's share |
# - lbcx can be set in Linked Battler Condition Notetag Values |
# - lbsx can be set in Linked Battler Stat Notetag Values |
# - lbwx can be set in Linked Battler Weight Notetag Values |
#==============================================================================|
($doublex_rmvxa ||= {})[:Linked_Battlers] = "v1.00b"
#==============================================================================|
# ** Script Configurations |
# You only need to edit this part as it's about what this script does |
#------------------------------------------------------------------------------|
module DoubleX_RMVXA
module Linked_Battlers
#--------------------------------------------------------------------------|
# Linked Battler Condition Notetag Values |
# - Setups lbcx used by <linked battlers: lbcx, lbsx, lbwx> |
#--------------------------------------------------------------------------|
# lbcx are read at:
# 1. RPG::State
# - @linked_battlers << [$1.downcase.to_sym, $2.downcase.to_sym,
# $3.downcase.to_sym] in load_linked_battlers_notes
# lbcx are used at:
# 1. Game_BattlerBase
# - mem.state?(state_id) && lb.send(cond, mem, self) in
# get_linked_battlers
# lbcx are strings of names of methods under DoubleX_RMVXA::Linked_Battlers
# lbcx names can only use alphanumeric characters and can't use uppercase
# letters
# The battler having a stat to be changed can be referenced by target
# Each of the rest of the linked battlers can be referenced by battler
# The below lbcx are examples added to help you set your lbcx
# You can freely use, rewrite and/or delete these examples
# Sets the linked battler condition to include all linked battlers
def self.lbc1(battler, target)
true
end
# Sets the linked battler condition to include all and no linked battlers if
# switch with id x is on and off respectively
def self.lbc2(battler, target)
$game_switches[x]
end
# Sets the linked battler condition to include all linked battlers that are
# opponents of the battler having a stat to be changed
def self.lbc3(battler, target)
target.opposite?(battler)
end
# Adds new lbcx here
#--------------------------------------------------------------------------|
# Linked Battler Stat Notetag Values |
# - Setups lbsx used by <linked battlers: lbcx, lbsx, lbwx> |
#--------------------------------------------------------------------------|
# lbsx are read at:
# 1. RPG::State
# - @linked_battlers << [$1.downcase.to_sym, $2.downcase.to_sym,
# $3.downcase.to_sym] in load_linked_battlers_notes
# lbsx are used at:
# 1. Game_BattlerBase
# - return [l_b, state_id] if lb.send(l_b[1], self).include?(stat) in
# linked_battler_state_id
# lbsx are strings of names of methods under DoubleX_RMVXA::Linked_Battlers
# lbsx names can only use alphanumeric characters and can't use uppercase
# letters
# The battler having a stat to be changed can be referenced by battler
# It must return an array, which should include strings of a getter method
# of each stat to be included
# The below lbsx are examples added to help you set your lbsx
# You can freely use, rewrite and/or delete these examples
# Sets the linked battler stat to include hp, mp and tp
def self.lbs1(battler)
["hp", "mp", "tp"]
end
# Sets the linked battler stat to always include hp and mp, and include tp
# only if it's displayed in battle
def self.lbs2(battler)
["hp", "mp", $data_system.opt_display_tp ? "tp" : nil]
end
# Sets the linked battler stat to include nothing
def self.lbs3(battler)
[]
end
# Adds new lbsx here
#--------------------------------------------------------------------------|
# Linked Battler Weight Notetag Values |
# - Setups lbwx used by <linked battlers: lbcx, lbsx, lbwx> |
#--------------------------------------------------------------------------|
# lbwx are read at:
# 1. RPG::State
# - @linked_battlers << [$1.downcase.to_sym, $2.downcase.to_sym,
# $3.downcase.to_sym] in load_linked_battlers_notes
# lbwx are used in methods included in LINKED_STAT
# lbwx are strings of names of methods under DoubleX_RMVXA::Linked_Battlers
# lbwx names can only use alphanumeric characters and can't use uppercase
# letters
# It must return a real number
# The battler having a stat to be changed can be referenced by target
# Each of the rest of the linked battlers can be referenced by battler
# The below lbwx are examples added to help you set your lbwx
# You can freely use, rewrite and/or delete these examples
# Sets the linked battler weight to be the same for all linked battlers
def self.lbw1(battler, target)
1
end
# Sets the linked battler weight to be multiplied by x if the linked battler
# is the one having a stat to be changed
def self.lbw2(battler, target)
battler == target ? x : 1
end
# Sets the linked battler weight to be 0 for all linked battlers
def self.lbw3(battler, target)
0
end
# Adds new lbwx here
# Sets the battler methods to be used by linked battlers
# Its keys must be the battler stat getter method string
# Its values must be an array containing the battler stat setter method,
# its argument list, the one being modified, and the minimum and maximum
# value of that battler stat of each linked battler
# The methods returning those minimum and maximum values must be referenced
# by battler
# Methods with name method_name will be aliased to
# linked_battlers_method_name
LINKED_STATS = {
# General form:
# [:def_class, :super_class] => {
# "getter" => ["setter", "args", "mod arg", "stat_min", "stat_max"]
# }
[:Game_BattlerBase] => {
# General form:
# "getter" => ["setter", "args", "mod arg", "stat_min", "stat_max"]
"hp" => ["hp=", "hp", "hp", "0", "battler.mhp"],
"mp" => ["mp=", "mp", "mp", "0", "battler.mmp"],
"tp" => ["tp=", "tp", "tp", "0", "battler.max_tp"]
# Adds new methods here
}
# Adds new classes here
}
end # Linked_Battlers
end # DoubleX_RMVXA
#==============================================================================|
# ** Script Implementations |
# You need not edit this part as it's about how this script works |
#------------------------------------------------------------------------------|
# * Script Support Info: |
# 1. Prerequisites |
# - Decent RGSS3 scripting proficiency to fully comprehend this script |
# 2. Method documentation |
# - The 1st part describes why this method's rewritten/aliased for |
# rewritten/aliased methods or what the method does for new methods |
# - The 2nd part describes what the arguments of the method are |
# - The 3rd part informs which version rewritten, aliased or created this|
# method |
# - The 4th part informs whether the method's rewritten or new |
# - The 5th part informs whether the method's a real or potential hotspot|
# - The 6th part describes how this method works for new methods only, |
# and describes the parts added, removed or rewritten for rewritten or |
# aliased methods only |
# Example: |
# #--------------------------------------------------------------------------| |
# # Why rewrite/alias/What this method does | |
# #--------------------------------------------------------------------------| |
# # *argv: What these variables are |
# # &argb: What this block is |
# def def_name(*argv, &argb) # Version X+; Rewrite/New; Hotspot |
# # Added/Removed/Rewritten to do something/How this method works |
# def_name_code |
# # |
# end # def_name |
#------------------------------------------------------------------------------|
class << DataManager # Edit
alias load_database_linked_battlers load_database
def load_database(*argv, &argb)
load_database_linked_battlers(*argv, &argb)
$data_states.each { |obj| obj.load_linked_battlers_notes if obj } # Added
end # load_database
end # DataManager
class RPG::State < RPG::BaseItem # Edit
#----------------------------------------------------------------------------|
# New public instance variable |
#----------------------------------------------------------------------------|
attr_accessor :linked_battlers # An array of all linked battler notetag values
def load_linked_battlers_notes # New
@linked_battlers = []
# Stores all lbcx, lbsx and lbwx triples from matching lines sequentially
@note.split(/[\r\n]+/).each { |l|
next unless l =~ /< *linked +battlers *: *(\w+) *, *(\w+) *, *(\w+) *>/i
@linked_battlers << [$1.downcase.to_sym, $2.downcase.to_sym,
$3.downcase.to_sym]
}
#
end # load_linked_battlers_notes
end # RPG::State
#------------------------------------------------------------------------------|
# * Adds helper methods used by methods used by linked battlers |
#------------------------------------------------------------------------------|
class Game_BattlerBase # Edit
# state_id: The id of the state to be included by all linked battlers
# cond: The conditions for a linked battlers to be included
def get_linked_battlers(state_id, cond) # New
lb = DoubleX_RMVXA::Linked_Battlers
($game_party.alive_members + $game_troop.alive_members).select! { |mem|
mem.state?(state_id) && lb.send(cond, mem, self)
}
end # get_linked_battlers
# stat: The stat of a linked battler to be changed
def linked_battler_state_id(stat) # New
lb = DoubleX_RMVXA::Linked_Battlers
@states.each { |state_id|
$data_states[state_id].linked_battlers.each { |l_b|
return [l_b, state_id] if lb.send(l_b[1], self).include?(stat)
}
}
nil
end # linked_battler_state_id
end # Game_BattlerBase
# Aliases methods used by linked battlers
DoubleX_RMVXA::Linked_Battlers::LINKED_STATS.each { |klass, defs|
klass_def = %Q(
class #{klass[0].id2name}#{klass[1] ? " < #{klass[1].id2name}" : ""}
)
defs.each { |get, stat|
klass_def += %Q(
alias linked_battlers_#{stat[0]} #{stat[0]}
def #{stat[0]}(#{stat[1]})
lb_si = linked_battler_state_id("#{get}")
return self.linked_battlers_#{stat[0]}(#{stat[1]}) unless lb_si
get_linked_battlers_#{get}(#{stat[1]}, lb_si[0], lb_si[1])
end
def get_linked_battlers_#{get}(#{stat[1]}, linked_battler, state_id)
battlers = get_linked_battlers(state_id, linked_battler[0])
index = battlers.index(self)
battlers[index], battlers[-1] = battlers[-1], battlers[index]
lb = DoubleX_RMVXA::Linked_Battlers
weights = battlers.collect { |b| lb.send(linked_battler[2], b, self) }
return if (sum = weights.inject(:+)) == 0
diff = #{stat[2]} - self.#{get}
set_linked_battlers_#{get}(#{stat[1]}, battlers, diff, sum, weights)
end
def set_linked_battlers_#{get}(#{stat[1]}, battlers, diff, sum, weights)
battlers.each_with_index { |battler, index|
change = diff * (weight = weights[index]) / sum
if (new_stat = battler.#{get} + change) < min = #{stat[3]}
change = battler.#{get} - min
#{stat[2]} = min
elsif new_stat > max = #{stat[4]}
change = max - battler.#{get}
#{stat[2]} = max
else
#{stat[2]} = new_stat
end
battler.linked_battlers_#{stat[0]}(#{stat[1]})
diff -= change
sum -= weight
}
end
)
}
eval(klass_def + %Q(
end
))
}
#------------------------------------------------------------------------------|
#==============================================================================|