扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 63|回复: 0

[转载发布] 泰拉瑞亚风格重铸系统

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    昨天 05:36
  • 签到天数: 190 天

    连续签到: 2 天

    [LV.7]常住居民III

    2592

    主题

    767

    回帖

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    17352
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    20741

    灌水之王

    发表于 昨天 00:14 | 显示全部楼层 |阅读模式
    RUBY 代码
    [code]#==============================================================================
    # ■ 泰拉瑞亚风格重铸系统 v2.4
    #==============================================================================
    # by MrRuigi  2026.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_id] || PREFIX_LIST[1]
      end

      defself.prefix_name(prefix_id)
        prefix_data(prefix_id)[0]
      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[1]  # ATK
        when3then data[2]  # DEF
        when5then data[3]  # MDF
        when6then data[4]  # AGI
        else0
        end
      end

      defself.price_rate(prefix_id)
        prefix_data(prefix_id)[5]
      end

      defself.rarity_change(prefix_id)
        prefix_data(prefix_id)[6]
      end
    end

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

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

      defself.get_prefix(item)
        @prefix_map[key(item)] || 0
      end

      defself.set_prefix(item, prefix_id)
        @prefix_map[key(item)] = 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[item_id]
          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[index]
        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
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-4-9 00:57 , Processed in 0.117473 second(s), 53 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表