DoubleX RMVXA Linked Battlers
Version: v1.00b
Introduction
Lets users set some states to make their owners share some stats together
Prerequisites
* Some RGSS3 scripting proficiency to fully utilize this script
Script
"script"
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
))
}
#------------------------------------------------------------------------------|
#==============================================================================|
Instructions
Open the script editor and put this script into an open slot between Materials and Main. Save to take effect.
FAQ
None so far
Credits and Thanks
None
Author's Notes
None
Terms and Conditions
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
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