じ☆ve冰风 发表于 2026-4-8 00:14:23

泰拉瑞亚风格重铸系统

RUBY 代码
#==============================================================================
# ■ 泰拉瑞亚风格重铸系统 v2.4
#==============================================================================
# by MrRuigi2026.4.8
# 功能:
#   - 为武器/防具随机附加前缀,改变名称、价格、稀有度及战斗属性
#   - 属性加成通过 Game_BattlerBase 的参数累加实现,不影响数据库原始数据
#   - 支持折扣、存档,与其它脚本兼容(使用别名链)
#   -修复了超过一个装备进入重铸会崩溃的问题
#==============================================================================

#==============================================================================
# ■ 配置模块
#==============================================================================
module Reroll_Config
REROLL_COST_RATE = 1.6          # 重铸费用倍率
DISCOUNT_VARIABLE_ID = 10       # 打折变量ID(>0时8折)
DISCOUNT_RATE = 0.8
MAX_RARITY_FOR_REROLL = 0       # 0 = 无限制

HELP_TEXT = "选择一件武器或防具进行重铸"
COST_TEXT = "重铸费用:"
DISCOUNT_TEXT = " (已打折)"
NO_ITEM_TEXT = "请选择装备"
SUCCESS_TEXT = "重铸成功!获得前缀:「%s」"
NO_REROLL_TEXT = "这件装备无法重铸(稀有度过高)"
NO_MONEY_TEXT = "金钱不足!需要 %d G"
end

#==============================================================================
# ■ 前缀数据模块
#==============================================================================
module Prefix_Data
# 前缀ID => [名称, 攻击, 防御, 魔防, 敏捷, 价格倍率, 稀有度变化]
PREFIX_LIST = {
    1 => ["碎裂的 ",-10, 0,-5, 0, 0.69, -2],
    2 => ["破损的 ",   -8, 0,-3, 0, 0.74, -2],
    3 => ["糟糕的 ",   -6, 0,-2, 0, 0.79, -1],
    4 => ["恶毒的 ",    5, 0,   2, 0, 1.05,0],
    5 => ["精良的 ",    8, 0,   3, 0, 1.10,1],
    6 => ["强力的 ",   10, 0,   0, 0, 1.12,1],
    7 => ["超神的 ",   15, 0,   5, 0, 1.20,2],
    8 => ["神级的 ",   15, 0,   4, 0, 1.20,2],
    9 => ["恶魔的 ",   15, 0,   0, 0, 1.15,2],
    10=> ["传说的 ",   18, 0,   5, 5, 1.25,2],
    11=> ["坚固的 ",    0, 5,   0, 0, 1.05,1],
    12=> ["保护的 ",    0, 8,   0, 0, 1.10,1],
    13=> ["守卫的 ",    0, 3,   0, 0, 1.02,0],
    14=> ["幸运的 ",    0, 0,   5, 5, 1.08,1],
    15=> ["快速的 ",    0, 0,   0, 8, 1.05,1],
    16=> ["耐心的 ",    0, 0,   0, 0, 1.00,0],
    17=> ["凶猛的 ",    7, 0,   0, 0, 1.08,1],
    18=> ["致命的 ",   10, 0,   3, 0, 1.12,1],
    19=> ["灵活的 ",    5, 0,   2, 3, 1.05,1],
    20=> ["熟练的 ",    6, 0,   4, 0, 1.06,1],
}

defself.random_prefix_id
    PREFIX_LIST.keys.sample
end

defself.prefix_data(prefix_id)
    PREFIX_LIST || PREFIX_LIST
end

defself.prefix_name(prefix_id)
    prefix_data(prefix_id)
end

# param_id 对应 RPG::BaseItem 的 params 数组索引:
# 0=MHP,1=MMP,2=ATK,3=DEF,4=MAT,5=MDF,6=AGI,7=LUK
defself.get_param_bonus(prefix_id, param_id)
    data = prefix_data(prefix_id)
    return0unless data
    case param_id
    when2then data# ATK
    when3then data# DEF
    when5then data# MDF
    when6then data# AGI
    else0
    end
end

defself.price_rate(prefix_id)
    prefix_data(prefix_id)
end

defself.rarity_change(prefix_id)
    prefix_data(prefix_id)
end
end

#==============================================================================
# ■ 前缀存储模块(基于物品类型+ID)
#==============================================================================
module PrefixStorage
@prefix_map = {}

defself.key(item)
    "#{item.class.name}_#{item.id}"
end

defself.get_prefix(item)
    @prefix_map || 0
end

defself.set_prefix(item, prefix_id)
    @prefix_map = prefix_id.to_i
end

defself.remove_prefix(item)
    @prefix_map.delete(key(item))
end

defself.save_data
    @prefix_map
end

defself.load_data(data)
    @prefix_map = data.is_a?(Hash) ? data : {}
end
end

#==============================================================================
# ■ 扩展 RPG::BaseItem(定义基础稀有度)
#==============================================================================
classRPG::BaseItem
# 默认稀有度,可在备注中解析(如 )
def rarity
    # 若需从备注读取,可改为:
    # self.note =~ //i ? $1.to_i : 0
    0
end
end

#==============================================================================
# ■ 扩展 RPG::Weapon(仅显示相关)
#==============================================================================
classRPG::Weapon
# 显示名称
alias reroll_display_name name
def display_name
    prefix_id = PrefixStorage.get_prefix(self)
    prefix_id > 0 ? "#{Prefix_Data.prefix_name(prefix_id)}#{reroll_display_name}" : reroll_display_name
end

# 实际价格
alias reroll_price price
def real_price
    prefix_id = PrefixStorage.get_prefix(self)
    (reroll_price * (prefix_id > 0 ? Prefix_Data.price_rate(prefix_id) : 1.0)).to_i
end

# 稀有度
alias reroll_rarity rarity
def rarity
    base = reroll_rarity
    prefix_id = PrefixStorage.get_prefix(self)
    base + (prefix_id > 0 ? Prefix_Data.rarity_change(prefix_id) : 0)
end
end
#==============================================================================
# ■ 扩展 RPG::Weapon(名称、价格、稀有度)
#==============================================================================
classRPG::Weapon
# 保留原始名称
alias reroll_original_name name

# 覆盖 name 方法,所有界面显示前缀
def name
    prefix_id = PrefixStorage.get_prefix(self)
    if prefix_id > 0
      "#{Prefix_Data.prefix_name(prefix_id)}#{reroll_original_name}"
    else
      reroll_original_name
    end
end

# 兼容旧方法(直接调用 name)
def display_name
    name
end

# 实际价格(受前缀影响)
alias reroll_price price
def real_price
    prefix_id = PrefixStorage.get_prefix(self)
    (reroll_price * (prefix_id > 0 ? Prefix_Data.price_rate(prefix_id) : 1.0)).to_i
end

# 稀有度 = 基础稀有度 + 前缀修正(使用 super 而非别名,防止递归)
def rarity
    base = super# 调用 RPG::BaseItem#rarity
    prefix_id = PrefixStorage.get_prefix(self)
    base + (prefix_id > 0 ? Prefix_Data.rarity_change(prefix_id) : 0)
end
end

#==============================================================================
# ■ 扩展 RPG::Armor(同 Weapon)
#==============================================================================
classRPG::Armor
alias reroll_original_name name

def name
    prefix_id = PrefixStorage.get_prefix(self)
    if prefix_id > 0
      "#{Prefix_Data.prefix_name(prefix_id)}#{reroll_original_name}"
    else
      reroll_original_name
    end
end

def display_name
    name
end

alias reroll_price price
def real_price
    prefix_id = PrefixStorage.get_prefix(self)
    (reroll_price * (prefix_id > 0 ? Prefix_Data.price_rate(prefix_id) : 1.0)).to_i
end

def rarity
    base = super
    prefix_id = PrefixStorage.get_prefix(self)
    base + (prefix_id > 0 ? Prefix_Data.rarity_change(prefix_id) : 0)
end
end
#==============================================================================
# ■ 核心:在 Game_BattlerBase 中注入前缀属性加成
#==============================================================================
class Game_BattlerBase
# 别名:原 param_plus 方法
alias reroll_param_plus param_plus
def param_plus(param_id)
    base = reroll_param_plus(param_id)
    # 累加所有装备的前缀加成
    base + equip_prefix_bonus(param_id)
end

# 计算当前所有装备的前缀属性加成总和
def equip_prefix_bonus(param_id)
    equips.compact.inject(0)do |sum, item|
      if item.is_a?(RPG::Weapon) || item.is_a?(RPG::Armor)
      prefix_id = PrefixStorage.get_prefix(item)
      sum + Prefix_Data.get_param_bonus(prefix_id, param_id)
      else
      sum
      end
    end
end
end

#==============================================================================
# ■ 修正 Game_Party 的装备列表方法
#==============================================================================
class Game_Party
def all_weapons
    result = []
    @weapons.eachdo |item_id, count|
      weapon = $data_weapons
      nextunless weapon
      count.times{ result = 0 ? @data[@index] : nil
end

def item_max
    @data ? @data.size : 0
end

def refresh
    @data = $game_party.all_reroll_items
    create_contents
    draw_all_items
end

def draw_item(index)
    item = @data
    returnunless item
    rect = item_rect(index)
    change_color(normal_color)
    draw_text(rect.x, rect.y, rect.width - 60, line_height, item.display_name)
    draw_text(rect.x, rect.y, rect.width - 24, line_height, item.real_price, 2)
end

def update_help
    item = current_item
    if item
      text = "#{item.display_name}\n"
      text += "原价:#{item.price} G现价:#{item.real_price} G\n"
      text += "稀有度:#{item.rarity}"
      @help_window.set_text(text)
    else
      @help_window.set_text("")
    end
end
end

#==============================================================================
# ■ 存档/读档支持
#==============================================================================
module DataManager
class
页: [1]
查看完整版本: 泰拉瑞亚风格重铸系统