额外战斗行动
# @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