# @taroxd metadata 1.0
# @id extra_action
# @require taroxd_core
# @display 额外战斗行动
# @help
# 在战斗公式或事件指令-脚本中输入
# battler.extra_skill(skill_id, target_index)
# 即可产生一次额外的行动(对应 skill_id 的技能)。
# target_index 省略时,目标默认为 battler 上次的目标。
#
# battler.extra_item(item_id, target_index)
# 与 extra_skill 相同。行动内容为对应 item_id 的物品。
#
# battler.extra_action(skill_id, target_index)
# 与 extra_skill 相同。
#
# 注意,额外的行动也是有消耗的(包括 MP、物品等)
# 当消耗不满足,或者因为其他原因无法行动时,额外行动无效。
class Taroxd::ExtraAction < Game_Action
# 默认目标。-2: 上次目标, -1: 随机
DEFAULT_TARGET_INDEX = -2
class << self
def new(_, _)
super.tap { |action| @actions.push action }
end
# 获取最后生成的 action 对象并移除这个对象。
# 如果没有 action,返回 nil。
def current!
@actions.pop
end
def clear
@actions = []
end
end
def initialize(subject, target_index)
super(subject)
@target_index = target_index
end
def make_targets
@target_index = @subject.last_target_index if @target_index == -2
super
end
end
class Game_Battler < Game_BattlerBase
ExtraAction = Taroxd::ExtraAction
def extra_skill(id, target_index = ExtraAction::DEFAULT_TARGET_INDEX)
ExtraAction.new(self, target_index).set_skill(id)
end
alias_method :extra_action, :extra_skill
def extra_item(id, target_index = ExtraAction::DEFAULT_TARGET_INDEX)
ExtraAction.new(self, target_index).set_item(id)
end
end
class Scene_Battle < Scene_Base
def_before :battle_start, Taroxd::ExtraAction.method(:clear)
def_before :process_forced_action do
action = Taroxd::ExtraAction.current!
return unless action
last_subject = @subject
@subject = action.subject
@subject.actions.unshift(action)
process_action
@subject = last_subject
end
end
额外战斗行动
导出脚本
# @taroxd metadata 1.0
# @display 导出脚本
# @id export_scripts
# @require metadata
module Taroxd
module ExportScripts
Success = Class.new(StandardError)
PATH = 'rgss3'
EXT = '.rb'
def self.call
if File.directory?(PATH)
Dir.glob("#{PATH}/*#{EXT}", &File.method(:delete))
else
Dir.mkdir(PATH)
end
$RGSS_SCRIPTS.each do |(_, tag, _, contents)|
next unless contents.force_encoding('utf-8')[/\S/]
metadata = Taroxd::Metadata.read(contents)
next unless metadata
filename = metadata[:id]
if filename
File.open("#{PATH}/#{filename}#{EXT}", 'wb', encoding: 'utf-8') do |f|
f.write contents.delete("\r")
end
end
end
# raise in order to navigate to this page
raise Success, 'Scripts are exported successfully.'
end
call if $TEST && !$BTEST
end
end
自定义经验公式
# @taroxd metadata 1.0
# @display 自定义经验公式
# @id exp_formula
# @help
# <exp>
# 升级到等级 lv 所需要的总经验值公式
# </exp>
# 可以使用的参数:
# lv: 等级
# basis:基础值
# extra:修正值
# acc_a:增加度 a
# acc_b:增加度 b
#
# 例(默认公式):
# <exp>
# basis*((lv-1)**(0.9+acc_a/250))*
# lv*(lv+1)/(6+lv**2/50/acc_b)+
# (lv-1)*extra
# </exp>
#
# 注意事项:
# 如果需要使用转职功能,则 lv 为 1 时的经验值请不要大于 0 !
module Taroxd
EXPFormula = /<exp>\s*(.+)\s*<\/exp>/mi
end
class RPG::Class < RPG::BaseItem
include Math
original_formula = instance_method(:exp_for_level)
define_method :exp_for_level do |level|
@exp_formula ||= if @note =~ Taroxd::EXPFormula
basis, extra, acc_a, acc_b = @exp_params.map(&:to_f)
eval("->lv{lv=lv.to_f;(#{$1}).round}")
else
original_formula.bind(self)
end
@exp_formula.call(level)
end
end