泰拉瑞亚风格重铸系统
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]