查看: 2477|回复: 4

[已经过期] SailCat大神的铁匠铺脚本修理消耗的修改

[复制链接]
梦石
0
星屑
423
在线时间
37 小时
注册时间
2013-7-1
回帖
16
发表于 2020-3-17 16:26:04 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 774204155 于 2020-3-17 16:29 编辑

在用SailCat大神写的铁匠铺脚本,其中进行修理操作的时候[消耗金钱]
我想把它修改成[消耗4号变量]
在依赖插件《装备穿戴耐久》中做了一部分修改:
[pre lang="ruby" line="186"]   #--------------------------------------------------------------------------
  # ● 修理状态检定
  #--------------------------------------------------------------------------
  def repair_state
    return 1 unless broken?
    return 2 unless repairable?
    return 3 unless $game_variables[4] >= repair_cost
    return 0
  end
  #--------------------------------------------------------------------------
  # ● 执行修理
  #--------------------------------------------------------------------------
  def repair
    $game_variables[4] -= repair_cost
    self.durability = [self.max_durability.factor(repair_efficiency), 1].max
    self.max_durability -= repair_wear
    # 恢复装备的自动状态
    if self.is_a?(Game_Armor) or $sailcat_import[:EquipStatBonus]
      $game_party.actors.each do |actor|
        actor.update_auto_state(nil, self) if actor.equipment.include?(self)
      end
    end
  end[/pre]
修理的时候应该是可以改成消耗变量了,
但是铁匠铺的界面不知道该怎么修改,贴上两个脚本的完整代码:

装备穿戴耐久
[pre lang="ruby" line="1"]#==============================================================================
# ■ 装备增强-装备穿戴耐久 v1.0 by SailCat
#------------------------------------------------------------------------------
#   方法:本脚本插入到Main之前、并在所有依赖项之后使用
#   依赖:
#     1. 数据库通用备注接口插件(2.1版以上)
#     2. 装备实体接口(1.0版以上)
#   版本:v1.0 (Build 180217)
#   效果:装备具有耐久度,随装备经战斗逐渐减少,不装备不会减少耐久
#   配置:装备耐久度默认数值,修理行为,耐久减损行为,相关用语
#   冲突:同类功能脚本
#   说明:
#     0. 备注均写在描述里,具体格式见依赖的通用备注接口插件相关说明
#        (当[XX集]内容只有一条时,方括号可省略)
#        (备注太长写不下时,可用超长备注法)
#     1. 装备的初始耐久度:du=值,若不设定的话,取配置中的默认值。
#     2. 装备的耐久分散度:dv=值,若不设定取配置值。
#     3. 装备是否允许修理:dr+(允许)或dr-(不允许),默认允许修理。
#     4. 装备的最大耐久和当前耐久均为可读写属性。
#        可以用装备.max_durability和装备.durability来读写耐久属性。
#     5. 装备的耐久度会影响其价格。
#     6. 当装备耐久度为0时,其所有属性均无效,但仍然可以如常装备。
#     7. 装备的耐久减损行为主要兼顾主流,过于细节和非主流的设置并未包含。
#     8. 本脚本中,装备的耐久减损是一个固定行为,而非随机行为。
#==============================================================================
#==============================================================================
# ■ SailCat's 插件公用
#==============================================================================
module SailCat
  $sailcat_import ||= {}
  #--------------------------------------------------------------------------
  # ● 脚本配置区
  #--------------------------------------------------------------------------
  module Equip_Config
    DURABILITY_DEFAULT    = 50                  # 默认耐久度
    DURABILITY_VARIANCE   = 0                   # 耐久度分散度
    SPAWN_MAX_DURABILITY  = true                # 初始满耐久(true/false/开关ID)
    REMOVE_BROKEN_AUTO    = false               # 是否自动解除损坏的装备
    REPAIR_EFFICIENCY     = 100                 # 修复效率(设为0全局禁用修理)
    REPAIR_WEAR_OUT       = 0                   # 修复后最大耐久的减损值
    REMAINDER_VALUE       = 0                   # 装备耐久用完后的残值
    REPAIR_COST_FACTOR    = 70                  # 修复所需金钱比率
    WEAR_FACTOR           = 100                 # 耐久减损的精算系数,不能为0
    WEAROUT_IN_BATTLE     = false               # 战斗中是否允许当场损毁
    WEAPON_WEAR_FACTORS   = {                   # 武器不同场合下耐久的减损因子
      :attack             => 25,                  # 执行攻击指令时
      :guard              => 0,                   # 执行防御指令时
      :skill_physical     => 75,                  # 执行物理特技时
      :skill_magical      => 25,                  # 执行魔法特技时
      :striking           => 25,                  # 击中目标时
      :missing            => 5,                   # 打空时
      :skill_hit          => 25,                  # 特技击中时
      :skill_miss         => 5,                   # 特技打空时
      :critical           => 100,                 # 造成会心一击时
      :turn               => 1,                   # 每回合后
      :combat             => 5,                   # 每场战斗后
    }
    ARMOR_WEAR_FACTORS    = {                   # 防具不同场合下耐久的减损因子
    # 以下每组4个值分别对应盾、头部、身体、饰品
    # 如果扩展了栏位,可以增加此处的值;若不增加,扩展栏位全视为饰品
      :attack             => [0, 0, 0, 0],        # 执行攻击指令时
      :guard              => [100, 0, 0, 0],      # 执行防御指令时
      :skill_physical     => [0, 0, 0, 0],        # 执行物理特技时
      :skill_magical      => [0, 0, 0, 0],        # 执行魔法特技时
      :struck             => [25, 25, 50, 25],    # 被击中时
      :evaded             => [100, 0, 0, 0],      # 被回避时
      :critical_struck    => [0, 50, 100, 50],    # 被会心一击时
      :turn               => [1, 1, 1, 1],        # 每回合后
      :combat             => [5, 5, 5, 5],        # 每场战斗后
    }
    VOCAB_DURABILITY      = "耐久度"            # 耐久度 用语
    VOCAB_DURABILITY_A    = "[%s/%d]"           # 耐久度 用语 简写
    VOCAB_BROKEN          = "损坏的"            # 损坏的 用语
    VOCAB_SCRAPPED        = "损毁的"            # 损毁的 用语
    VOCAB_INDESTRUCTIBLE  = "不可磨损"          # 不可磨损 用语
    VOCAB_UNREPAIRABLE    = "不可修复"          # 不可修复 用语
  end
  #--------------------------------------------------------------------------
  # ● 植入与依赖检查
  #--------------------------------------------------------------------------
  dependency = []
  unless $sailcat_import[:DataNoteCore].to_f >= 2.1
    dependency.push "[DataNoteCore] 通用数据库备注接口(v2.1以上版本)"
  end
  unless $sailcat_import[:EquipInstantiate].to_f >= 1.0
    dependency.push "[EquipInstantiate] 装备实体接口(v1.0以上版本)"
  end
  raise "缺少依赖插件:\n" + dependency.join("\n") unless dependency.empty?
  $sailcat_import[:EquipDurability] = 1.0
end

module RPG
  #============================================================================
  # ■ EquipDurability
  #----------------------------------------------------------------------------
  #  备注定义通用模块。
  #============================================================================
  module EquipDurability
    include SailCat::Equip_Config
    #--------------------------------------------------------------------------
    # ● 备注定义
    #--------------------------------------------------------------------------
    def init_durability;  _du(DURABILITY_DEFAULT);                        end
    def var_durability;   _dv(DURABILITY_VARIANCE);                       end
    def allow_repair;     _dr(true);                                      end
    def repair_efficiency;_de(REPAIR_EFFICIENCY);                         end
    def repair_wear;      _dw(REPAIR_WEAR_OUT);                           end
  end
  #============================================================================
  # ■ RPG::Weapon
  #----------------------------------------------------------------------------
  #  数据库的武器类扩展。
  #============================================================================
  class Weapon
    include EquipDurability
  end
  #============================================================================
  # ■ RPG::Armor
  #----------------------------------------------------------------------------
  #  数据库的防具类扩展。
  #============================================================================
  class Armor
    include EquipDurability
  end
end

#==============================================================================
# ■ EquipDurability
#------------------------------------------------------------------------------
#   耐久处理模块。
#==============================================================================
module SailCat::EquipDurability
  include SailCat::Equip_Config
  #--------------------------------------------------------------------------
  # ● 后续设置扩展方法处理 9000
  #--------------------------------------------------------------------------
  def post_setup_9000
    unless @max_durability
      @max_durability = init_durability.variance(var_durability, 100)
      @max_durability_plus = 0
      if @max_durability > 0
        if SPAWN_MAX_DURABILITY.is_a?(Numeric)
          full = $game_switches[SPAWN_MAX_DURABILITY]
        else
          full = SPAWN_MAX_DURABILITY
        end
        @durability = full ? max_durability : rand(max_durability) + 1
        @durability *= WEAR_FACTOR
      else
        @durability = 0
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 无法损毁判定
  #--------------------------------------------------------------------------
  def indestructible?
    self.max_durability == 0
  end
  #--------------------------------------------------------------------------
  # ● 获取最大耐久度
  #--------------------------------------------------------------------------
  def max_durability
    get_value(@max_durability, :durability) + @max_durability_plus
  end
  #--------------------------------------------------------------------------
  # ● 设置最大耐久度
  #     value : 最大耐久度
  #--------------------------------------------------------------------------
  def max_durability=(value)
    @max_durability_plus += value - self.max_durability
    @durability = [@durability, value * WEAR_FACTOR].min
  end
  #--------------------------------------------------------------------------
  # ● 损坏的判定
  #--------------------------------------------------------------------------
  def broken?
    @durability == 0 and self.max_durability > 0
  end
  #--------------------------------------------------------------------------
  # ● 可以修理判定
  #--------------------------------------------------------------------------
  def repairable?
    max_durability > repair_wear and repair_efficiency > 0 and allow_repair
  end
  #--------------------------------------------------------------------------
  # ● 修理状态检定
  #--------------------------------------------------------------------------
  def repair_state
    return 1 unless broken?
    return 2 unless repairable?
    return 3 unless $game_variables[4] >= repair_cost
    return 0
  end
  #--------------------------------------------------------------------------
  # ● 执行修理
  #--------------------------------------------------------------------------
  def repair
    $game_variables -= repair_cost
    self.durability = [self.max_durability.factor(repair_efficiency), 1].max
    self.max_durability -= repair_wear
    # 恢复装备的自动状态
    if self.is_a?(Game_Armor) or $sailcat_import[:EquipStatBonus]
      $game_party.actors.each do |actor|
        actor.update_auto_state(nil, self) if actor.equipment.include?(self)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 获取当前耐久度
  #--------------------------------------------------------------------------
  def durability
    @durability == 0 ? 0 : [@durability / WEAR_FACTOR, 1].max
  end
  #--------------------------------------------------------------------------
  # ● 设置当前耐久度
  #     value : 当前耐久度
  #--------------------------------------------------------------------------
  def durability=(value)
    # 装备可用状态有变化的情况下,清除缓存
    clear_value_cache if @durability * value <= 0
    @durability = value.limit(0, self.max_durability) * WEAR_FACTOR
  end
  #--------------------------------------------------------------------------
  # ● 耐久度的消耗
  #     value_lost : 磨损度
  #     flag       : 允许损毁标记
  #--------------------------------------------------------------------------
  def wear(value_lost, flag)
    # 防止战斗中途损坏
    min = [@durability, flag ? 0 : 1].min
    # 耐久度的精算减损
    @durability = [@durability - value_lost, min].max
    # 磨坏了的情况下,清除缓存
    clear_value_cache if broken?
  end
  #--------------------------------------------------------------------------
  # ● 获得残值
  #--------------------------------------------------------------------------
  def remain_value
    sailcat_equipdu_price.factor(REMAINDER_VALUE)
  end
  #--------------------------------------------------------------------------
  # ● 获得使用价值
  #--------------------------------------------------------------------------
  def consumable_value
    sailcat_equipdu_price.factor(100 - REMAINDER_VALUE)
  end
  #--------------------------------------------------------------------------
  # ● 获得修理费
  #--------------------------------------------------------------------------
  def repair_cost
    consumable_value.factor(REPAIR_COST_FACTOR)
  end
  #--------------------------------------------------------------------------
  # ● 前缀(第四部分)
  #--------------------------------------------------------------------------
  def prefix_part4
    broken? ? (repairable? ? Vocab.broken : Vocab.scrapped) : ""
  end
  #--------------------------------------------------------------------------
  # ● 获得耐久度字符串
  #--------------------------------------------------------------------------
  def durability_s
    if $sailcat_import[:WindowCore]
      if broken?
        color = 18
      elsif durability < max_durability >> 2
        color = 17
      elsif durability == max_durability
        color = 24
      else
        color = 0
      end
      "\\C[#{color}]#{durability}\\C[0]"
    else
      durability.to_s
    end
  end
  #--------------------------------------------------------------------------
  # ● 详情信息 耐久度
  #--------------------------------------------------------------------------
  def info_02
    return nil if indestructible?
    text_s(Vocab.durability, sprintf("%s/%d", durability_s, max_durability))
  end
  #--------------------------------------------------------------------------
  # ● 详情信息 不可磨损
  #--------------------------------------------------------------------------
  def info_97
    indestructible? && init_durability > 0 ? Vocab.indestructible : nil
  end
  #--------------------------------------------------------------------------
  # ● 详情信息 不可修复
  #--------------------------------------------------------------------------
  def info_98
    !indestructible? && !allow_repair ? Vocab.unrepairable : nil
  end
end

#==============================================================================
# ■ Game_Weapon
#==============================================================================
class Game_Weapon
  include SailCat::EquipDurability
  #--------------------------------------------------------------------------
  # ● 方法重定义
  #--------------------------------------------------------------------------
  unless method_defined?(:sailcat_equidu_price)
    alias sailcat_equipdu_price price
  end
  #--------------------------------------------------------------------------
  # ● 获得磨损值
  #     symbol : 磨损场合的标识符
  #--------------------------------------------------------------------------
  def wear_value(symbol)
    WEAPON_WEAR_FACTORS[symbol] || 0
  end
  #--------------------------------------------------------------------------
  # ● 获得价格
  #--------------------------------------------------------------------------
  def price
    if init_durability > 0
      remain_value + consumable_value.factor(durability, init_durability)
    else
      sailcat_equipdu_price
    end
  end
  #--------------------------------------------------------------------------
  # ● 说明文字
  #--------------------------------------------------------------------------
  def description
    if max_durability > 0
      super + sprintf(Vocab.durability_a, durability_s, max_durability)
    else
      super
    end
  end
  #--------------------------------------------------------------------------
  # ● 名称的颜色索引
  #--------------------------------------------------------------------------
  def name_color
    broken? ? 18 : super
  end
end

#==============================================================================
# ■ Game_Armor
#==============================================================================
class Game_Armor
  include SailCat::EquipDurability
  #--------------------------------------------------------------------------
  # ● 方法重定义
  #--------------------------------------------------------------------------
  unless method_defined?(:sailcat_equidu_price)
    alias sailcat_equipdu_price price
  end
  #--------------------------------------------------------------------------
  # ● 获得磨损值
  #     symbol : 磨损场合的标识符
  #--------------------------------------------------------------------------
  def wear_value(symbol)
    (set = ARMOR_WEAR_FACTORS[symbol]) ? set[kind] || set[-1] : 0
  end
  #--------------------------------------------------------------------------
  # ● 获得价格
  #--------------------------------------------------------------------------
  def price
    if init_durability > 0
      remain_value + consumable_value.factor(durability, init_durability)
    else
      sailcat_equipdu_price
    end
  end
  #--------------------------------------------------------------------------
  # ● 说明文字
  #--------------------------------------------------------------------------
  def description
    if max_durability > 0
      super + sprintf(Vocab.durability_a, durability_s, max_durability)
    else
      super
    end
  end
  #--------------------------------------------------------------------------
  # ● 名称的颜色索引
  #--------------------------------------------------------------------------
  def name_color
    broken? ? 18 : super
  end
end

#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
  #--------------------------------------------------------------------------
  # ● 攻击收尾扩展方法处理 4000
  #--------------------------------------------------------------------------
  def post_attack_4000(attacker)
    # 不是强制行动的情况下,执行磨损
    unless attacker.current_action.forcing
      # 攻击者是角色的情况下
      if attacker.actor?
        # 击中/打空磨损
        attacker.wear_equipment(@damage == Vocab.miss ? :missing : :striking)
        # 会心磨损
        attacker.wear_equipment(:critical) if @critical
      end
      # 被攻击者是角色的情况下
      if actor?
        # 挨打/闪避磨损
        wear_equipment(@damage == Vocab.miss ? :evaded : :struck)
        # 会心磨损
        wear_equipment(:critical_struck) if @critical
      end
    end   
  end
  #--------------------------------------------------------------------------
  # ● 特技收尾扩展方法处理 4000
  #--------------------------------------------------------------------------
  def post_skill_4000(user, skill)
    # 不是强制行动的情况下,执行磨损
    unless user.current_action.forcing
      # 攻击者是角色的情况下
      if user.actor?
        # 击中/打空磨损
        user.wear_equipment(@damage == Vocab.miss ? :skill_miss : :skill_hit)
        # 会心磨损
        user.wear_equipment(:critical) if @critical
      end
      # 被攻击者是角色的情况下
      if actor?
        # 挨打/闪避磨损
        wear_equipment(@damage == Vocab.miss ? :evaded : :struck)
        # 会心磨损
        wear_equipment(:critical_struck) if @critical
      end
    end   
  end
end

#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor
  #--------------------------------------------------------------------------
  # ● 方法重定义
  #--------------------------------------------------------------------------
  unless method_defined?(:sailcat_equidu_weapons)
    alias sailcat_equipdu_weapons weapons
    alias sailcat_equipdu_armors armors
    alias sailcat_equipdu_equipment equipment
    alias sailcat_equipdu_weapon weapon
    alias sailcat_equipdu_update_auto_state update_auto_state
  end
  #--------------------------------------------------------------------------
  # ● 全身的有效装备
  #--------------------------------------------------------------------------
  def equipment
    sailcat_equipdu_equipment.reject {|equip| equip.broken?}
  end
  #--------------------------------------------------------------------------
  # ● 装备的有效武器
  #--------------------------------------------------------------------------
  def weapons
    sailcat_equipdu_weapons.reject {|weapon| weapon.broken?}
  end
  #--------------------------------------------------------------------------
  # ● 装备的武器(RPG::Weapon)
  #--------------------------------------------------------------------------
  def weapon
    (w = sailcat_equipdu_weapon) && w.broken? ? nil : w
  end
  #--------------------------------------------------------------------------
  # ● 装备的有效防具
  #--------------------------------------------------------------------------
  def armors
    sailcat_equipdu_armors.reject {|armor| armor.broken?}
  end
  #--------------------------------------------------------------------------
  # ● 获取来自装备的数值
  #--------------------------------------------------------------------------
  def equip_param(scope, symbol, default = 0)
    scope.to_a.sum do |e|
      e.respond_to?(symbol) && !e.broken? ? e.send(symbol) : default
    end
  end
  #--------------------------------------------------------------------------
  # ● 磨损装备处理
  #     symbol : 磨损场合标识符
  #--------------------------------------------------------------------------
  def wear_equipment(symbol)
    equipment.each do |e|
      next if e.indestructible? or (value = e.wear_value(symbol)) == 0
      flag = e.broken?
      e.wear(value, WEAROUT_IN_BATTLE || symbol == :combat)
      # 本次磨损损坏的情况下
      if e.broken? and not flag
        if REMOVE_BROKEN_AUTO
          equip(all_equipment.index(e), 0)
        else
          # 取消装备的自动状态效果
          if e.is_a?(Game_Armor) or $sailcat_import[:EquipStatBonus]
            sailcat_equipdu_update_auto_state(e, nil)
          end
          fix_hp
          fix_sp
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新自动状态
  #     old_equip : 卸下防具/武器
  #     new_equip : 装备防具/武器
  #--------------------------------------------------------------------------
  def update_auto_state(old_equip, new_equip)
    # 取消损坏的装备
    old_equip = nil if old_equip.respond_to?(:broken?) and old_equip.broken?
    new_equip = nil if new_equip.respond_to?(:broken?) and new_equip.broken?
    sailcat_equipdu_update_auto_state(old_equip, new_equip)
  end
end

#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 方法重定义
  #--------------------------------------------------------------------------
  unless method_defined?(:sailcat_equipdu_make_attack_action_result)
    alias sailcat_equipdu_make_attack_action_result make_attack_action_result
    alias sailcat_equipdu_make_guard_action_result make_guard_action_result
    alias sailcat_equipdu_make_skill_action_result make_skill_action_result
    alias sailcat_equipdu_update_phase4_step6 update_phase4_step6
    alias sailcat_equipdu_battle_end battle_end
  end
  #--------------------------------------------------------------------------
  # ● 生成攻击行动结果
  #--------------------------------------------------------------------------
  def make_attack_action_result
    sailcat_equipdu_make_attack_action_result
    # 攻击者是角色的情况下,执行攻击行动磨损
    @active_battler.wear_equipment(:attack) if @active_battler.actor?
  end
  #--------------------------------------------------------------------------
  # ● 生成防御行动结果
  #--------------------------------------------------------------------------
  def make_guard_action_result
    sailcat_equipdu_make_guard_action_result
    # 防御者是角色的情况下,执行防御行动磨损
    @active_battler.wear_equipment(:guard) if @active_battler.actor?
  end
  #--------------------------------------------------------------------------
  # ● 生成特技行动结果
  #--------------------------------------------------------------------------
  def make_skill_action_result
    sailcat_equipdu_make_skill_action_result
    skill = $data_skills[@active_battler.current_action.skill_id]
    # 特技确实有效的情况下,执行特技行动磨损
    unless @phase4_step == 1 or not @active_battler.actor?
      symbol = skill.atk_f > 0 ? :skill_physical : :skill_magical
      @active_battler.wear_equipment(symbol)
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 6 : 刷新)
  #--------------------------------------------------------------------------
  def update_phase4_step6
    sailcat_equipdu_update_phase4_step6
    # 回合磨损
    if @active_battler and @active_battler.actor?
      @active_battler.wear_equipment(:turn)
    end
  end
  #--------------------------------------------------------------------------
  # ● 战斗结束
  #--------------------------------------------------------------------------
  def battle_end(result)
    # 战斗结束磨损
    $game_party.actors.each {|a| a.wear_equipment(:combat)}
    sailcat_equipdu_battle_end(result)
  end
end
[/pre]

铁匠铺界面:
[pre lang="ruby" line="1"]#==============================================================================
# ■ 装备增强-铁匠铺界面 v1.0 by SailCat
#------------------------------------------------------------------------------
#   方法:本脚本插入到Main之前、并在所有依赖项之后使用
#   依赖:
#     1. 装备实体接口(1.0版以上)
#     2. 消息对话框(1.0版以上)
#     3. 上下文菜单(1.0版以上)
#     4. 详情窗口(1.0版以上)
#     5. 以下装备实体增强至少其一:
#        穿戴耐久、质量分等、附魔词缀、锻造升级、镶嵌道具、随机生成
#   版本:v1.0 (Build 180716)
#   效果:支持装备实体化的可视化功能操作
#   配置:界面的表现和用语设置
#   冲突:同类功能脚本
#   说明:
#     1. 使用$scene = Scene_Smith.new来开启铁匠界面。
#==============================================================================
#==============================================================================
# ■ SailCat's 插件公用
#==============================================================================
module SailCat
  $sailcat_import ||= {}
  #--------------------------------------------------------------------------
  # ● 脚本配置区
  #--------------------------------------------------------------------------
  module Equip_Config
    GOLD_WINDOW_DELAY     = 60                  # 金钱窗口的切换延迟
    GOLD_WINDOW_FADE      = 10                  # 金钱窗口的淡入速度
    REROLL_COST_RATIO     = [0, 33, 300]        # 幻化消费比例(低/中/高级)
    DESTROY_GAIN_RATIO    = 33                  # 熔毁回收比例
    VOCAB_REPAIR          = "修理"              # 修理 用语
    VOCAB_ENCHANT         = "附魔"              # 附魔 用语
    VOCAB_REFINE          = "锤炼"              # 锤炼 用语
    VOCAB_FORGE           = "锻造"              # 锻造 用语
    VOCAB_PUNCH           = "打孔"              # 打孔 用语
    VOCAB_EMBED           = "镶嵌"              # 镶嵌 用语
    VOCAB_REROLL          = "幻化"              # 幻化 用语
    VOCAB_DESTROY         = "熔毁"              # 熔毁 用语
    HELP_REPAIR           = "修理损坏的装备。"  # 修理 帮助文字
    HELP_ENCHANT          = "为装备加持魔法。"  # 附魔 帮助文字
    HELP_REFINE           = "锤炼装备提升质量。"# 锤炼 帮助文字
    HELP_FORGE            = "锻造装备提高等级。"# 锻造 帮助文字
    HELP_PUNCH            = "在装备上开镶孔。"  # 打孔 帮助文字
    HELP_EMBED            = "在镶孔中镶嵌道具。"# 镶嵌 帮助文字
    HELP_REROLL           = "将装备随机幻化。"  # 幻化 帮助文字
    HELP_DESTROY          = "熔毁装备回收金钱。"# 熔毁 帮助文字
    # 修理部分的提示用语
    VOCAB_REPAIR_FAIL_1   = "装备状态良好。"
    VOCAB_REPAIR_FAIL_2   = "无法修理。"
    VOCAB_REPAIR_FAIL_3   = "所需零件不足。"
    VOCAB_REPAIR_CONFIRM  = "修理装备:%s\n需要零件:%d\\C[16]\枚\n要修理吗?"
    VOCAB_REPAIR_INFO     = "修理完成。\n现耐久度为:%d/%d。"
    # 附魔部分的提示用语
    VOCAB_ENCHANT_FAIL_1  = "无法附魔这个装备。"
    VOCAB_ENCHANT_FAIL_2  = "附魔词缀数已达上限。"
    VOCAB_ENCHANT_FAIL_3  = "该词缀已被锁定。"
    VOCAB_ENCHANT_FAIL_4  = "附魔费用不足。"
    VOCAB_ENCHANT_CONFIRM = "附魔装备:%s\n附魔费用:%d\\C[16]\\$\n要附魔吗?"
    VOCAB_ENCHANT_INFO    = "附魔完成。\n删除词缀%d个,新增词缀%d个。"
    # 锤炼部分的提示用语
    VOCAB_REFINE_FAIL_1   = "装备质量已达极致。"
    VOCAB_REFINE_FAIL_2   = "技术所限,无法进一步锤炼。"
    VOCAB_REFINE_FAIL_3   = "锤炼材料不足。"
    VOCAB_REFINE_CONFIRM  = "锤炼装备:%s\n所用材料:\\D[I%d] × %d\n继续吗?"
    VOCAB_REFINE_INFO     = "锤炼完成。\n现质量为:%s。"
    # 锻造部分的提示用语
    VOCAB_FORGE_FAIL_1    = "装备等级已达上限。"
    VOCAB_FORGE_FAIL_2    = "消费过低,无法锻造。"
    VOCAB_FORGE_FAIL_3    = "锻造失败。\n返还了消费的一半。"
    VOCAB_FORGE_FAIL_4    = "锻造失败。\n装备等级没有变化。"
    VOCAB_FORGE_FAIL_5    = "锻造失败。\n装备的等级下降了。"
    VOCAB_FORGE_INFO      = "锻造成功。\n现等级为:%+d。"
    VOCAB_FORGE_TEXT_GOLD = "消费%s"
    VOCAB_FORGE_TEXT_ITEM = "消费道具"
    VOCAB_FORGE_TEXT_BONUS= "额外道具"
    VOCAB_FORGE_TEXT_RATE = "锻造成功率"
    VOCAB_FORGE_NO_BONUS  = "(不使用额外道具)"
    VOCAB_FORGE_NO_RATE   = "无法锻造"
    # 打孔部分的提示用语
    VOCAB_PUNCH_FAIL_1    = "装备无法打孔。"
    VOCAB_PUNCH_FAIL_2    = "打孔材料不足。"
    VOCAB_PUNCH_OPEN      = "开启镶孔"
    VOCAB_PUNCH_CLOSE     = "封闭镶孔"
    VOCAB_PUNCH_CONFIRM   = "%s:%s\n所用材料:\\D[I%d] × 1\n继续吗?"
    VOCAB_PUNCH_INFO      = "%s成功。\n现镶孔数为:%d个。"
    # 镶嵌部分的提示用语
    VOCAB_EMBED_FAIL_1    = "装备没有镶孔。"
    VOCAB_EMBED_FAIL_2    = "装备镶嵌已满。"
    VOCAB_EMBED_FAIL_3    = "这个装备不允许拆解镶嵌物。"
    VOCAB_EMBED_EMPTY     = "这个镶嵌孔是空的。"
    # 幻化部分的提示用语
    VOCAB_REROLL_FAIL_1   = "无法幻化这个装备。"
    VOCAB_REROLL_FAIL_2   = "幻化消费不足。"
    VOCAB_REROLL_GRADE_1  = "基础"
    VOCAB_REROLL_GRADE_2  = "普通"
    VOCAB_REROLL_GRADE_3  = "专家"
    VOCAB_REROLL_CONFIRM  = "幻化装备:%s\n幻化费用:%d\\C[16]\\$\n" +
      "\\C[18]\\*警告\\*\\C[0]:装备将丢失原先所有属性!\n继续吗?"
    VOCAB_REROLL_INFO     = "幻化成功。\n新装备为:%s"
    # 熔毁部分的提示用语
    VOCAB_DESTROY_CONFIRM = "熔毁装备:%s\n回收金钱:%d\\C[16]\\$\n继续吗?"
    VOCAB_DESTROY_INFO    = "熔毁完成。"
  end
  #--------------------------------------------------------------------------
  # ● 植入与依赖检查
  #--------------------------------------------------------------------------
  dependency = []
  unless $sailcat_import[:EquipInstantiate].to_f >= 1.0
    dependency.push "[EquipInstantiate] 装备实体接口(v1.0以上版本)"
  end
  unless $sailcat_import[:WindowMessageBox].to_f >= 1.0
    dependency.push "[WindowMessageBox] 消息对话框(v1.0以上版本)"
  end
  unless $sailcat_import[:WindowContextMenu].to_f >= 1.0
    dependency.push "[WindowContextMenu] 上下文菜单(v1.0以上版本)"
  end
  unless $sailcat_import[:WindowInfo].to_f >= 1.0
    dependency.push "[WindowInfo] 详情窗口(v1.0以上版本)"
  end
  raise "缺少依赖插件:\n" + dependency.join("\n") unless dependency.empty?
  $sailcat_import[:EquipSmithery] = 1.0
end

#==============================================================================
# ■ Vocab
#------------------------------------------------------------------------------
#   所有用语的整合模块。
#==============================================================================
module Vocab
  self.help_text.merge!({
    :smith_repair => HELP_REPAIR,
    :smith_enchant => HELP_ENCHANT,
    :smith_refine => HELP_REFINE,
    :smith_forge => HELP_FORGE,
    :smith_punch => HELP_PUNCH,
    :smith_embed => HELP_EMBED,
    :smith_reroll => HELP_REROLL,
  })
end

#==============================================================================
# ■ Window_SmithCommand
#------------------------------------------------------------------------------
#   铁匠铺界面,显示铁匠指令列表的窗口。
#==============================================================================
class Window_SmithCommand < Window_HorzCommand
  #--------------------------------------------------------------------------
  # ● 初期化
  #--------------------------------------------------------------------------
  def initialize
    @commands = []
    @commands.push(Vocab.repair)  if $sailcat_import[:EquipDurability]
    @commands.push(Vocab.enchant) if $sailcat_import[:EquipEnchant]
    @commands.push(Vocab.refine)  if $sailcat_import[:EquipQuality]
    @commands.push(Vocab.forge)   if $sailcat_import[:EquipLevel]
    @commands.push(Vocab.embed)   if $sailcat_import[:EquipSocket]
    @commands.push(Vocab.reroll)  if $sailcat_import[:EquipRandomize]
    super(SCREEN_W, @commands)
  end
  #--------------------------------------------------------------------------
  # ● 选中的命令文字
  #--------------------------------------------------------------------------
  def command_text
    @commands[@index]
  end
  #--------------------------------------------------------------------------
  # ● 刷新帮助文本
  #--------------------------------------------------------------------------
  def update_help
    case command_text
    when Vocab.repair
      @help_window.set_text(Vocab.help_text[:smith_repair])
    when Vocab.enchant
      @help_window.set_text(Vocab.help_text[:smith_enchant])
    when Vocab.refine
      @help_window.set_text(Vocab.help_text[:smith_refine])
    when Vocab.forge
      @help_window.set_text(Vocab.help_text[:smith_forge])
    when Vocab.embed
      @help_window.set_text(Vocab.help_text[:smith_embed])
    when Vocab.reroll
      @help_window.set_text(Vocab.help_text[:smith_reroll])
    end
  end
end

#==============================================================================
# ■ Window_SmithItem
#------------------------------------------------------------------------------
#   铁匠铺界面,显示装备列表的窗口。
#==============================================================================
class Window_SmithItem < Window_Data
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :mode                     # 模式
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    @mode = 0
    super(0, window_h << 1, SCREEN_W >> 1, -window_h * 3, nil, 1)
  end
  #--------------------------------------------------------------------------
  # ● 生成数据
  #--------------------------------------------------------------------------
  def make_data
    super
    @data = $game_party.sorted_weapons + $game_party.sorted_armors
    @enable_proc = Proc.new {|item|
      case @mode
      when 0
        true
      when 1
        item.broken? and item.repairable?
      when 2
        item.prototype.available_enchants.size > 0
      when 3
        item.quality < item.max_quality
      when 4
        item.level < item.max_level
      when 5
        item.sockets > 0 and (item.embed_removable or item.empty_sockets > 0)
      end}
  end
  #--------------------------------------------------------------------------
  # ● 设置模式
  #     mode : 模式
  #--------------------------------------------------------------------------
  def set_mode(mode)
    @mode = mode
    refresh
  end
end

#==============================================================================
# ■ Window_SmithGold
#------------------------------------------------------------------------------
#   铁匠铺界面,显示金钱或所需道具的窗口。
#==============================================================================
class Window_SmithGold < Window_Base
  include SailCat::Equip_Config
  #--------------------------------------------------------------------------
  # ● 初始化窗口
  #--------------------------------------------------------------------------
  def initialize
    super(0, SCREEN_H - window_h, SCREEN_W >> 1, window_h)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item_ids = [-1]
    @index = 0
    @frame_count = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    self.contents_opacity = 255
    @frame_count = 0
    if @item_ids[@index] == -1
      draw_currency_value(number, Vocab.gold, 4, 0, width - 40)
    elsif @item_ids[@index] > 0
      rect = contents.rect.inflate(-4, 0)
      number_width = text_size(ITEM_MAX).width.limit(24, 66) + 16
      draw_item_name($data_items[@item_ids[@index]], 4, 0, true,
        rect.width - number_width)
      draw_text(rect.right - number_width, 0, 16, rect.height, ":", 1)
      draw_text(rect.right - number_width + 16, 0,
        number_width - 16, rect.height, number, 2)
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置要显示的道具ID
  #     item_id : 道具ID
  #--------------------------------------------------------------------------
  def set_item_id(item_id)
    if @item_ids != item_id.to_a
      @item_ids = item_id.to_a
      @index = 0
      refresh
    end
  end
  #--------------------------------------------------------------------------
  # ● 获取数目
  #--------------------------------------------------------------------------
  def number
    item_id = @item_ids[@index]
    item_id == -1 ? $game_party.gold : $game_party.item_number(item_id)
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    if @item_ids.size > 1
      @frame_count += 1
      if @frame_count >= GOLD_WINDOW_DELAY
        self.contents_opacity -= (255.to_f / GOLD_WINDOW_FADE).ceil
        if @frame_count == GOLD_WINDOW_DELAY + GOLD_WINDOW_FADE
          @index = (@index + 1) % @item_ids.size
          refresh
          self.contents_opacity = 0
          @frame_count = -GOLD_WINDOW_FADE
        end
      elsif @frame_count < 0
        self.contents_opacity += (255.to_f / GOLD_WINDOW_FADE).ceil
      end
    end
  end
end

#==============================================================================
# ■ Window_SmithEnchant
#------------------------------------------------------------------------------
#   铁匠铺界面,显示附魔词缀的选择窗口。
#==============================================================================
class Window_SmithEnchant < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化窗口
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 576, 416)
    center.hide.deactivate.z += 3
    @selected = []
    @column_max = 3
  end
  #--------------------------------------------------------------------------
  # ● 设置显示的装备
  #     item : 装备
  #--------------------------------------------------------------------------
  def show_enchant(item)
    return unless item
    @data = item.prototype.available_enchants
    main_set = item.main_set
    sub_set = item.sub_set
    available_set = item.available_enchants
    @selected = @data.map {|k|
      if main_set.include?(k) or main_set.include?(-k)
        1
      elsif sub_set.include?(k) or sub_set.include?(-k)
        3
      elsif not available_set.include?(k)
        2
      else
        0
      end}
    @item_max = @data.size
    @max_sel = item.max_enchant
    refresh
    self.height = [contents.height + 32, 416].min
    center.show.activate.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    create_contents
    @item_max.times {|n| draw_state(n)}
  end
  #--------------------------------------------------------------------------
  # ● 设置选择状态
  #     index  : 索引
  #     select : 选择状态(0-3)
  #--------------------------------------------------------------------------
  def set_select(index, select)
    @selected[index] = select
    draw_state(index)
  end
  #--------------------------------------------------------------------------
  # ● 获得词缀状态
  #     index  : 索引
  #--------------------------------------------------------------------------
  def enchant_state(index = @index)
    n = @selected[index]
    n == 0 ? (selected_enchants.size >= @max_sel ? -1 : 0) : n
  end
  #--------------------------------------------------------------------------
  # ● 切换所选附魔开关
  #--------------------------------------------------------------------------
  def toggle_enchant
    return unless state = $data_states[@data[@index]]
    if @selected[@index] == 0
      set_select(@index, 1)
      state.chain_enchant_set.each do |x|
        set_select(i, 3) if i = @data.index(x) and x != @data[@index]
      end
      state.reject_enchant_set.each do |x|
        set_select(i, 2) if i = @data.index(x) and x != @data[@index]
      end
    elsif @selected[@index] == 1
      set_select(@index, 0)
      state.chain_enchant_set.each do |x|
        set_select(i, 0) if i = @data.index(x) and x != @data[@index]
      end
      state.reject_enchant_set.each do |x|
        set_select(i, 0) if i = @data.index(x) and x != @data[@index]
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 绘制词缀名
  #--------------------------------------------------------------------------
  def draw_state(index)
    contents.clear_rect(item_rect(index))
    text = $data_states[@data[index]].enchant_name
    text = "[" + text + "]" if @selected[index] & 1 == 1
    change_color(@selected[index] > 1 ? disabled_color : normal_color)
    draw_text(item_rect(index), text, 1)
  end
  #--------------------------------------------------------------------------
  # ● 获得选中的词缀集
  #--------------------------------------------------------------------------
  def selected_enchants
    (0...@item_max).map {|i| @selected == 1 ? @data : nil}.compact
  end
end

#==============================================================================
# ■ Window_SmithForge
#------------------------------------------------------------------------------
#   铁匠铺界面,显示锻造消费情况的确认窗口。
#==============================================================================
class Window_SmithForge < Window_Base
  include Window_Handler
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :index                    # 光标位置
  attr_reader   :item_max                 # 项目数
  attr_reader   :gold                     # 变量
  #--------------------------------------------------------------------------
  # ● 初始化窗口
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, SCREEN_W >> 1, 320)
    @handler = {}
    center.hide.deactivate.z += 3
  end
  #--------------------------------------------------------------------------
  # ● 设置显示的装备
  #     item : 装备
  #--------------------------------------------------------------------------
  def show_forge(item)
    # 设置锻造目标
    @target = item
    # 锻造用物品
    @items = item.accept_items
    @sub_items = {}
    # 额外物品
    @bonus_items = $game_party.sorted_items.select {|item|
      item.equip_bonus_rate != 0}.map {|item| item.id}
    @bonus_items.unshift(0)
    @item_max = @items.size + 4
    resize(SCREEN_W >> 1, window_h(@item_max + 2))
    create_contents
    reset_cost
    refresh
    center.show.activate.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 重设消费数值
  #--------------------------------------------------------------------------
  def reset_cost
    @gold = 0
    @items.each {|item_id| @sub_items[item_id] = 0}
    @bonus_item_id = 0
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    # 清除内容
    contents.clear
    # 绘制各提示语文字
    change_color(system_color)
    w = contents.width
    h = line_height
    x = @items.size
    draw_text(0, 0, w, h, Vocab.forge, 1)
    contents.fill_rect(0, h - 1, w, 1, system_color)
    gold_text = sprintf(Vocab.forge_text_gold, Vocab.gold)
    draw_text(0, line_height(1), w, h, gold_text)
    draw_text(0, line_height(2), w, h, Vocab.forge_text_item)
    draw_text(0, line_height(3 + x), w, h, Vocab.forge_text_bonus)
    draw_text(0, line_height(4 + x), w, h, Vocab.forge_text_rate)
    # 绘制物品名称
    w = text_size(ITEM_MAX).width.limit(24, 66) + 32
    x.times do |i|
      item = $data_items[@items]
      draw_item_name(item, 0, line_height(3 + i), true, contents.width - w)
      change_color(normal_color)
      draw_text(contents.width - w - 32, line_height(3 + i), 24, h, "×", 1)
    end
    # 绘制各项可调数值
    draw_gold
    x.times {|i| draw_item_number(i)}
    draw_bonus_item
    update_rate
    # 绘制确定和取消按钮
    change_color(normal_color)
    w = contents.width - CURSOR_PADDING >> 1
    draw_text(0, line_height(5 + x), w, h, Vocab.ok, 1)
    draw_text(w + CURSOR_PADDING, line_height(5 + x), w, h, Vocab.cancel, 1)
  end
  #--------------------------------------------------------------------------
  # ● 绘制变量数量
  #--------------------------------------------------------------------------
  def draw_gold
    change_color(normal_color)
    w = text_size(GOLD_MAX).width.limit(48, 100) + 4
    contents.redraw_text(contents.width - w, line_height(1),
      w - 4, line_height, @gold, 2)
  end
  #--------------------------------------------------------------------------
  # ● 绘制物品数量
  #--------------------------------------------------------------------------
  def draw_item_number(i = @index - 1)
    change_color(normal_color)
    w = text_size(ITEM_MAX).width.limit(24, 66) + 4
    contents.redraw_text(contents.width - w, line_height(3 + i),
      w - 4, line_height, @sub_items[@items], 2)
  end
  #--------------------------------------------------------------------------
  # ● 绘制额外物品
  #--------------------------------------------------------------------------
  def draw_bonus_item
    x = text_size(Vocab.forge_text_bonus).width + 8
    w = contents.width - x - 4
    rect = Rect.new(x, line_height(3 + @items.size), w, line_height)
    if @bonus_item_id == 0
      change_color(disabled_color)
      contents.redraw_text(rect, Vocab.forge_no_bonus)
    else
      item = $data_items[@bonus_item_id]
      contents.clear_rect(rect)
      draw_item_name(item, rect.x, rect.y, true, rect.width)
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    update_keypress if self.active
  end
  #--------------------------------------------------------------------------
  # ● 设置光标的位置
  #     index : 新的光标位置
  #--------------------------------------------------------------------------
  def index=(index)
    @index = index
    update_cursor_rect
  end
  #--------------------------------------------------------------------------
  # ● 上键处理
  #--------------------------------------------------------------------------
  def update_up(force)
    if @index > 0 or force
      $game_system.se_play($data_system.cursor_se)
      self.index = @index > 0 ? [@index - 1, @item_max - 3].min : @item_max - 2
    end
  end
  #--------------------------------------------------------------------------
  # ● 下键处理
  #--------------------------------------------------------------------------
  def update_down(force)
    if @index > @item_max - 3 or force
      $game_system.se_play($data_system.cursor_se)
      self.index = @index > @item_max - 3 ? 0 : @index + 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 左右键、LR键处理
  #--------------------------------------------------------------------------
  def update_left(force); key_num(@index != @item_max - 2 || force, -1);  end
  def update_right(force);key_num(@index != @item_max - 1 || force, +1);  end
  def update_pageup;      key_num(@index != @item_max - 2, -10);          end
  def update_pagedown;    key_num(@index != @item_max - 1, +10);          end
  #--------------------------------------------------------------------------
  # ● 按键变化数值处理
  #     condition   : 变化条件
  #     delta_value : 变化量
  #--------------------------------------------------------------------------
  def key_num(condition, delta_value)
    if condition
      # 演奏光标 SE
      $game_system.se_play($data_system.cursor_se)
      change_value(delta_value * 100 ** Input.modifier)
    end
  end
  #--------------------------------------------------------------------------
  # ● 增减数量值
  #     delta : 变化量
  #--------------------------------------------------------------------------
  def change_value(delta)
    case @index
    when 0
      set_gold(@gold + delta)
    when 1..@items.size
      item_id = @items[@index - 1]
      set_item(item_id, @sub_items[item_id] + delta)
    when @item_max - 3
      set_bonus(delta <=> 0)
    else
      self.index = (@item_max << 1) - @index - 3
    end
  end
  #--------------------------------------------------------------------------
  # ● 光标有效判定
  #--------------------------------------------------------------------------
  def cursor_respond?
    true
  end
  #--------------------------------------------------------------------------
  # ● 更新光标矩形
  #--------------------------------------------------------------------------
  def update_cursor_rect
    cw = contents.width
    case @index
    when 0
      w = text_size(GOLD_MAX).width.limit(48, 100) + 8
      x, y = cw - w, 1
    when 1..@items.size
      w = text_size(ITEM_MAX).width.limit(24, 66) + 8
      x, y = cw - w, 2
    when @item_max - 3
      w = cw - text_size(Vocab.forge_text_bonus).width - 4
      x, y = cw - w, 2
    when @item_max - 2
      w = cw - CURSOR_PADDING >> 1
      x, y = 0, 3
    when @item_max - 1
      w = cw - CURSOR_PADDING >> 1
      x, y = cw - w, 2
    end
    self.cursor_rect = Rect.new(x, line_height(@index + y), w, line_height)
  end
  #--------------------------------------------------------------------------
  # ● 设置金钱数量
  #     gold : 金钱数量
  #--------------------------------------------------------------------------
  def set_gold(gold)
    @gold = gold.limit(0, $game_party.gold)
    draw_gold
    update_rate
  end
  #--------------------------------------------------------------------------
  # ● 设置物品数量
  #     id     : 物品 ID
  #     number : 物品数量
  #--------------------------------------------------------------------------
  def set_item(id, number)
    @sub_items[id] = number.limit(0, $game_party.item_number(id))
    draw_item_number
    update_rate
  end
  #--------------------------------------------------------------------------
  # ● 设置奖励物品
  #     delta : 增减方向
  #--------------------------------------------------------------------------
  def set_bonus(delta)
    bonus_index = @bonus_items.index(@bonus_item_id)
    @bonus_item_id = @bonus_items[(bonus_index + delta) % @bonus_items.size]
    draw_bonus_item
    update_rate
  end
  #--------------------------------------------------------------------------
  # ● 更新机率显示
  #--------------------------------------------------------------------------
  def update_rate
    rate = @target.preview_chance(money, bonus_rate).to_i
    color = [disabled_color, power_down_color, crisis_color, power_up_color,
      power_up_color, normal_color][(rate / 25 + 1).limit(0, 5)]
    change_color(color)
    text = rate < 0 ? Vocab.forge_no_rate : rate.to_s + "%"
    x = text_size(Vocab.forge_text_rate).width + 8
    contents.redraw_text(x, line_height(4 + @items.size),
      contents.width - x - 4, line_height, text, 2)
  end
  #--------------------------------------------------------------------------
  # ● 更新消费显示
  #--------------------------------------------------------------------------
  def update_cost
    rate = @target.preview_chance(money, bonus_rate).to_i
    if rate < 0
      new_cost = @target.preview_cost(0, bonus_rate)
    elsif rate < @target.success_rate
      new_cost = @target.preview_cost(@target.success_rate, bonus_rate)
    else
      new_cost = @target.preview_cost(100, bonus_rate)
    end
    if @index == 0
      change_value(new_cost - money)
    else
      price = [$data_items[@items[@index - 1]].price, 1].max
      change_value(((new_cost - money).to_f / price).ceil)
    end
  end
  #--------------------------------------------------------------------------
  # ● 获取要消费的物品
  #--------------------------------------------------------------------------
  def items
    @bonus_item_id > 0 ? @sub_items.merge({@bonus_item_id => 1}) : @sub_items
  end
  #--------------------------------------------------------------------------
  # ● 获取总计消费价值
  #--------------------------------------------------------------------------
  def money
    @sub_items.inject(@gold) {|g, i| g + $data_items[i[0]].price * i[1]}
  end
  #--------------------------------------------------------------------------
  # ● 获取奖励机率
  #--------------------------------------------------------------------------
  def bonus_rate
    (item = $data_items[@bonus_item_id]) ? item.equip_bonus_rate : 0
  end
end

#==============================================================================
# ■ Window_SmithEmbed
#------------------------------------------------------------------------------
#   铁匠铺界面,镶嵌孔的选择窗口。
#==============================================================================
class Window_SmithEmbed < Window_Data
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    @equipment = nil
    super(0, window_h << 1, SCREEN_W >> 1, window_h, nil, 4)
    self.z += 3
    deactivate.hide.index = -1
  end
  #--------------------------------------------------------------------------
  # ● 设置当前镶嵌装备
  #--------------------------------------------------------------------------
  def show_embed(equipment)
    @equipment = equipment
    self.height = window_h([equipment.sockets + 3 >> 2, 4].min)
    refresh
    show.activate.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 生成数据
  #--------------------------------------------------------------------------
  def make_data
    super
    return unless @equipment
    @data.concat(@equipment.socket_items.map {|i| $data_items})
    @enable_proc = Proc.new {|item| item == nil or @equipment.embed_removable}
  end
  #--------------------------------------------------------------------------
  # ● 绘制镶嵌孔
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    @drawn[index] = true
    enabled = (@enable_proc == nil or @enable_proc.call(item))
    rect = item_rect(index).inflate(-4, 0)
    # 绘制孔外廓
    text_w = text_size("[").width
    change_color(enabled ? normal_color : disabled_color)
    rect = item_rect(index)
    contents.clear_rect(rect)
    draw_text(rect.x, rect.y, text_w, line_height, "[")
    draw_text(rect.right - text_w, rect.y, text_w, line_height, "]")
    # 如果孔内有道具,绘制道具图标
    if item
      draw_icon(item.icon_name, rect.x + (rect.width - ICON_WIDTH >> 1),
        rect.y, true, line_height)
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新帮助文本
  #--------------------------------------------------------------------------
  def update_help
    if self.item == nil
      @help_window.set_text(Vocab.embed_empty)
    else
      super
    end
  end
end

#==============================================================================
# ■ Window_SmithEmbedItem
#------------------------------------------------------------------------------
#   铁匠铺界面,镶嵌用道具的选择窗口。
#==============================================================================
class Window_SmithEmbedItem < Window_Data
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(0, window_h * 3, SCREEN_W >> 1, -window_h * 3, nil, 1)
    @equipment = nil
    self.z += 3
    deactivate.hide.index = -1
  end
  #--------------------------------------------------------------------------
  # ● 设置当前镶嵌装备
  #--------------------------------------------------------------------------
  def show_embed(equipment)
    @equipment = equipment
    lines_top = [@equipment.sockets + 3 >> 2, 4].min
    top = window_h(lines_top) + (window_h << 1)
    move(0, top, SCREEN_W >> 1, SCREEN_H - top)
    self.index = -1
    refresh
    show
  end
  #--------------------------------------------------------------------------
  # ● 生成数据
  #--------------------------------------------------------------------------
  def make_data
    super
    # 添加可以镶嵌的道具
    @data.concat($game_party.sorted_items.select {|item| item.socketable})
    # 若允许解除镶嵌则添加空白
    @data.push(nil) if @equipment and @equipment.embed_removable
  end
end

#==============================================================================
# ■ Scene_Smith
#------------------------------------------------------------------------------
#   处理铁匠画面的类。
#==============================================================================
class Scene_Smith
  include Scene_Base
  include SailCat::Window_Config
  include SailCat::Equip_Config
  #--------------------------------------------------------------------------
  # ● 建立窗口
  #--------------------------------------------------------------------------
  def create_all_windows
    # 建立帮助窗口
    @help_window = Window_Help.new
    # 建立命令窗口
    @command_window = Window_SmithCommand.new
    # 建立金钱窗口
    @gold_window = Window_SmithGold.new
    # 建立物品窗口
    @item_window = Window_SmithItem.new
    # 建立详情窗口
    height_offset = @help_window.height + @command_window.height
    @info_window = Window_Info.new(SCREEN_W >> 1, height_offset,
      SCREEN_W >> 1, -height_offset)
    # 建立插件独立窗口
    @enchant_window = Window_SmithEnchant.new if $sailcat_import[:EquipEnchant]
    @forge_window = Window_SmithForge.new if $sailcat_import[:EquipLevel]
    if $sailcat_import[:EquipSocket]
      @top_window = Window_SmithEmbed.new
      @bottom_window = Window_SmithEmbedItem.new
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置场景扩展方法处理 1000
  #--------------------------------------------------------------------------
  def post_create_1000
    @help_window.moveto(0, @command_window.height)
    @command_window.help_window = @help_window
    @item_window.index = -1
    @item_window.help_window = @help_window
    @item_window.info_window = @info_window
    @item_window.set_handler(:index_changed, method(:item_index_changed))
    if $sailcat_import[:EquipSocket]
      @top_window.help_window = @help_window
      @bottom_window.help_window = @help_window
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置场景扩展方法处理 9000
  #--------------------------------------------------------------------------
  def post_create_9000
    # 窗口初始状态设置
    @command_window.activate.index = 0
    @item_window.deactivate
  end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  def update
    # 更新所有窗口
    update_all_windows
  end
  #--------------------------------------------------------------------------
  # ● 更改物品选择处理
  #--------------------------------------------------------------------------
  def item_index_changed
    if @item_window.index == -1 or (item = @item_window.item) == nil
      item_id = -1
    else
      case @item_window.mode
      when 3
        item_id = item.quality_item_id
      when 4
        item_id = [-1].concat(item.accept_items)
      when 5
        item_id = [item.socket_item, item.unsocket_item]
      else
        item_id = -1
      end
    end
    @gold_window.set_item_id(item_id)
  end
  #--------------------------------------------------------------------------
  # ● 命令窗口 B 键处理
  #--------------------------------------------------------------------------
  def command_window_b
    # 演奏取消 SE
    $game_system.se_play($data_system.cancel_se)
    # 返回场景
    SceneManager.return
  end
  #--------------------------------------------------------------------------
  # ● 命令窗口 C 键处理
  #--------------------------------------------------------------------------
  def command_window_c
    # 演奏确定 SE
    $game_system.se_play($data_system.decision_se)
    # 切换窗口焦点
    @command_window.deactivate
    # 根据所选功能刷新物品窗口
    case @command_window.command_text
    when Vocab.repair
      @item_window.set_mode(1)
    when Vocab.enchant
      @item_window.set_mode(2)
    when Vocab.refine
      @item_window.set_mode(3)
    when Vocab.forge
      @item_window.set_mode(4)
    when Vocab.punch
      @item_window.set_mode(5)
    when Vocab.embed
      @item_window.set_mode(6)
    when Vocab.reroll
      @item_window.set_mode(7)
    when Vocab.destroy
      @item_window.set_mode(8)
    end
    @item_window.activate.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 物品窗口 B 键处理
  #--------------------------------------------------------------------------
  def item_window_b
    # 演奏取消 SE
    $game_system.se_play($data_system.cancel_se)
    # 切换窗口焦点
    @item_window.deactivate.index = -1
    @command_window.activate
    @item_window.set_mode(0)
  end
  #--------------------------------------------------------------------------
  # ● 物品窗口 C 键处理
  #--------------------------------------------------------------------------
  def item_window_c
    # 选中物品无效的情况下
    unless @item_window.item
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      return
    end
    # 执行物品操作
    method("process_item_#{@item_window.mode}".to_sym).call
  end
  #--------------------------------------------------------------------------
  # ● 物品操作取消
  #--------------------------------------------------------------------------
  def process_item_0
    item_window_b
  end
  #--------------------------------------------------------------------------
  # ● 物品操作修理
  #--------------------------------------------------------------------------
  def process_item_1
    # 获得当前的待操作物品
    item = @item_window.item
    # 修理检定未通过的情况下
    if (error = item.repair_state) > 0
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      # 显示错误信息
      Window_MessageBox.new(Vocab.send("repair_fail_#{error}"), Vocab.repair)
    # 修理检定通过的情况下
    else
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 询问确认的情况下,执行修理
      msg = sprintf(Vocab.repair_confirm, item.info_00, item.repair_cost)
      if Window_MessageBox.new(msg, Vocab.repair, MB_YN).result == DR_YES
        # 演奏装备 SE
        $game_system.se_play($data_system.equip_se)
        # 执行修理
        item.repair
        # 更新相关窗口
        @item_window.refresh
        @item_window.update_help
        @item_window.update_info
        @gold_window.refresh
        info = sprintf(Vocab.repair_info, item.durability, item.max_durability)
        Window_MessageBox.new(info, Vocab.repair)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 物品操作附魔
  #--------------------------------------------------------------------------
  def process_item_2
    # 获得当前的待操作物品
    item = @item_window.item
    # 附魔检定未通过的情况下
    if (error = item.enchant_state) > 0
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      # 显示错误信息
      Window_MessageBox.new(Vocab.send("enchant_fail_#{error}"), Vocab.enchant)
    else
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 切换到附魔词缀窗口
      @item_window.deactivate
      @enchant_window.show_enchant(item)
    end
  end
  #--------------------------------------------------------------------------
  # ● 附魔窗口 B 键处理
  #--------------------------------------------------------------------------
  def enchant_window_b
    # 演奏取消 SE
    $game_system.se_play($data_system.cancel_se)
    @enchant_window.deactivate.hide
    # 获得当前的待操作物品
    item = @item_window.item
    # 比较附魔词缀变化
    old_set = item.main_set
    new_set = @enchant_window.selected_enchants
    delete_set = old_set - new_set
    keep_set = old_set & new_set
    add_set = new_set - old_set
    # 词缀有变的情况下
    unless delete_set.empty? and add_set.empty?
      # 检查附魔消费
      cost1 = keep_set.sum {|x| $data_states[x].enchant_effects[:price]}
      cost1 *= keep_set.size
      cost2 = new_set.sum {|x| $data_states[x].enchant_effects[:price]}
      cost2 *= new_set.size
      cost = [cost2 - cost1, 0].max * item.prototype.price / 100
      # 消费不足的情况下
      if $game_party.gold < cost
        Window_MessageBox.new(Vocab.enchant_fail_4, Vocab.enchant)
      else
        # 询问确认的情况下,执行附魔
        msg = sprintf(Vocab.enchant_confirm, item.info_00, cost)
        if Window_MessageBox.new(msg, Vocab.enchant, MB_YN).result == DR_YES
          # 演奏装备 SE
          $game_system.se_play($data_system.equip_se)
          # 执行附魔
          $game_party.lose_gold(cost)
          delete_set.each {|x| item.remove_enchant(x)}
          add_set.each {|x| item.add_enchant(x)}
          # 更新相关窗口
          @item_window.refresh
          @item_window.update_info
          @gold_window.refresh
          info = sprintf(Vocab.enchant_info, delete_set.size, add_set.size)
          Window_MessageBox.new(info, Vocab.enchant)
        end
      end
    end
    # 切换到物品窗口
    @item_window.activate
  end
  #--------------------------------------------------------------------------
  # ● 附魔窗口 C 键处理
  #--------------------------------------------------------------------------
  def enchant_window_c
    case @enchant_window.enchant_state
    when -1
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      Window_MessageBox.new(Vocab.enchant_fail_2, Vocab.enchant)
    when 0, 1
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      @enchant_window.toggle_enchant
    when 2, 3
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      Window_MessageBox.new(Vocab.enchant_fail_3, Vocab.enchant)
    end
  end
  #--------------------------------------------------------------------------
  # ● 物品操作锤炼
  #--------------------------------------------------------------------------
  def process_item_3
    # 获得当前的待操作物品
    item = @item_window.item
    # 锤炼检定未通过的情况下
    if (error = item.quality_state) > 0
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      # 显示错误信息
      Window_MessageBox.new(Vocab.send("refine_fail_#{error}"), Vocab.refine)
    else
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 询问确认的情况下,执行锤炼
      msg = sprintf(Vocab.refine_confirm, item.info_00,
        item.quality_item_id, item.quality_item_count)
      if Window_MessageBox.new(msg, Vocab.refine, MB_YN).result == DR_YES
        # 演奏装备 SE
        $game_system.se_play($data_system.equip_se)
        # 执行锤炼
        item.quality_up
        # 更新相关窗口
        @item_window.refresh
        @item_window.update_info
        @gold_window.refresh
        text = Vocab.qualities[item.quality - 1] || Vocab.quality_ex
        if item.quality_param_rate != 0
          param = sprintf("(%+d)", item.quality_param_rate)
        else
          param = "(--)"
        end
        new_quality_text = "\\C[#{item.name_color}]#{text}\\}#{param}\\{\\C[0]"
        info = sprintf(Vocab.refine_info, new_quality_text)
        Window_MessageBox.new(info, Vocab.refine)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 物品操作锻造
  #--------------------------------------------------------------------------
  def process_item_4
    # 获得当前的待操作物品
    item = @item_window.item
    # 锻造检定未通过的情况下
    if (error = item.level_state) > 0
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      # 显示错误信息
      Window_MessageBox.new(Vocab.send("forge_fail_#{error}"), Vocab.forge)
    else
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 切换到锻造窗口
      @item_window.deactivate
      @forge_window.show_forge(item)
    end
  end
  #--------------------------------------------------------------------------
  # ● 锻造窗口 B 键处理
  #--------------------------------------------------------------------------
  def forge_window_b
    # 演奏取消 SE
    $game_system.se_play($data_system.cancel_se)
    # 切换到物品窗口
    @forge_window.deactivate.hide
    @item_window.activate
  end
  #--------------------------------------------------------------------------
  # ● 锻造窗口 C 键处理
  #--------------------------------------------------------------------------
  def forge_window_c
    # 获得当前的待操作物品
    item = @item_window.item
    case @forge_window.index
    when 0...@forge_window.item_max - 3
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      @forge_window.update_cost
    when @forge_window.item_max - 3
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      @forge_window.change_value(1)
    when @forge_window.item_max - 2
      # 执行升级操作
      result = item.level_up(@forge_window.gold, @forge_window.items,
        @forge_window.bonus_rate)
      # 升级成功的情况下
      if result == 0
        # 演奏装备 SE
        $game_system.se_play($data_system.equip_se)
        info = sprintf(Vocab.forge_info, item.level)
        Window_MessageBox.new(info, Vocab.forge)
      # 升级失败的情况下
      else
        # 装备等级下降的情况下
        if result == 5
          # 演奏受伤 SE
          $game_system.se_play($data_system.actor_collapse_se)
        # 无法操作的情况下
        elsif result <= 2
          # 演奏冻结 SE
          $game_system.se_play($data_system.buzzer_se)
        else
          # 演奏确定 SE
          $game_system.se_play($data_system.decision_se)
        end
        Window_MessageBox.new(Vocab.send("forge_fail_#{result}"), Vocab.forge)
      end
      # 更新相关窗口
      @item_window.refresh
      @item_window.update_info
      @gold_window.refresh
      if item.level_state == 0
        @forge_window.reset_cost
        @forge_window.refresh
      else
        # 切换到物品窗口
        @forge_window.deactivate.hide
        @item_window.activate
      end
    when @forge_window.item_max - 1
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 切换到物品窗口
      @forge_window.deactivate.hide
      @item_window.activate
    end
  end
  #--------------------------------------------------------------------------
  # ● 物品操作打孔
  #--------------------------------------------------------------------------
  def process_item_5
    # 获得当前的待操作物品
    item = @item_window.item
    # 打孔检定未通过的情况下
    if item.max_sockets == 0
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      # 显示错误信息
      Window_MessageBox.new(Vocab.punch_fail_1, Vocab.punch)
    else
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 显示打孔菜单
      commands = [Vocab.punch_open, Vocab.punch_close]
      menu = Window_ContextMenu.new(commands)
      start_index = 0
      if item.sockets == 0
        menu.disable_item(1)
      end
      if item.sockets == item.max_sockets
        menu.disable_item(0)
        start_index = 1
      end
      x = @item_window.cursor_rect.right + @item_window.x + 16
      y = @item_window.cursor_rect.y + @item_window.y + 16
      case menu.show_menu(x, y, start_index)
      when 0 # 开孔
        word = Vocab.punch_open
        material = item.socket_item
        sym = :open_socket
      when 1 # 封孔
        word = Vocab.punch_close
        material = item.unsocket_item
        sym = :close_socket
      when 2
        return
      end
      # 打孔操作
      if $game_party.item_number(material) > 0
        msg = sprintf(Vocab.punch_confirm, word, item.info_00, material)
        if Window_MessageBox.new(msg, Vocab.punch, MB_YN).result == DR_YES
          # 演奏装备 SE
          $game_system.se_play($data_system.equip_se)
          # 执行打孔
          item.send(sym)
          # 更新相关窗口
          @item_window.refresh
          @item_window.update_info
          @gold_window.refresh
          info = sprintf(Vocab.punch_info, word, item.sockets)
          Window_MessageBox.new(info, Vocab.punch)
        end
      else
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        # 显示错误信息
        Window_MessageBox.new(Vocab.punch_fail_2, Vocab.punch)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 物品操作镶嵌
  #--------------------------------------------------------------------------
  def process_item_6
    # 获得当前的待操作物品
    item = @item_window.item
    # 镶嵌检定未通过的情况下
    if (error = item.embed_state) > 0
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      # 显示错误信息
      Window_MessageBox.new(Vocab.send("embed_fail_#{error}"), Vocab.embed)
    else
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 切换到镶嵌窗口
      @item_window.deactivate
      @top_window.show_embed(item)
      @bottom_window.show_embed(item)
    end
  end
  #--------------------------------------------------------------------------
  # ● 镶孔窗口 B 键处理
  #--------------------------------------------------------------------------
  def top_window_b
    # 演奏取消 SE
    $game_system.se_play($data_system.cancel_se)
    # 切换到物品窗口
    @top_window.deactivate.hide
    @bottom_window.hide
    @item_window.activate
  end
  #--------------------------------------------------------------------------
  # ● 镶孔窗口 C 键处理
  #--------------------------------------------------------------------------
  def top_window_c
    # 镶嵌物不能取下的情况下
    if @top_window.item and not @item_window.item.embed_removable
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      Window_MessageBox.new(Vocab.embed_fail_3, Vocab.embed)
    else
      # 切换到镶嵌物窗口
      @top_window.deactivate
      @bottom_window.activate.index = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 镶嵌物窗口 B 键处理
  #--------------------------------------------------------------------------
  def bottom_window_b
    # 演奏取消 SE
    $game_system.se_play($data_system.cancel_se)
    # 切换到镶孔窗口
    @bottom_window.deactivate.index = -1
    @top_window.activate
  end
  #--------------------------------------------------------------------------
  # ● 镶嵌物窗口 C 键处理
  #--------------------------------------------------------------------------
  def bottom_window_c
    # 取得选中的镶嵌物
    item = @bottom_window.item
    # 演奏装备 SE
    $game_system.se_play($data_system.equip_se)
    # 执行镶嵌
    @item_window.item.socket(@top_window.index, item ? item.id : 0)
    # 刷新相关窗口
    @item_window.refresh
    @item_window.update_info
    @top_window.refresh
    @bottom_window.refresh
    # 切换到镶孔窗口
    @bottom_window.deactivate.index = -1
    @top_window.activate
  end
  #--------------------------------------------------------------------------
  # ● 物品操作幻化
  #--------------------------------------------------------------------------
  def process_item_7
    # 获得当前的待操作物品
    item = @item_window.item
    sym = $sailcat_import[:EquipDurability] ? :sailcat_equipdu_price : :price
    price = item.send(sym)
    # 幻化检定未通过的情况下
    if not item.random_enabled?(:ALL)
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      # 显示错误信息
      Window_MessageBox.new(Vocab.reroll_fail_1, Vocab.reroll)
    # 幻化最低消费不足的情况下
    elsif $game_party.gold < price.factor(REROLL_COST_RATIO.min)
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      # 显示错误信息
      Window_MessageBox.new(Vocab.reroll_fail_2, Vocab.reroll)
    # 幻化检定通过的情况下
    else
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 显示幻化菜单
      commands = [1, 2, 3].map {|n|
        Vocab.send("reroll_grade_#{n}") + Vocab.nbsp + Vocab.reroll}
      menu = Window_ContextMenu.new(commands)
      start_index = 0
      3.times do |x|
        if $game_party.gold < price.factor(REROLL_COST_RATIO[x])
          menu.disable_item(x)
        end
      end
      x = @item_window.cursor_rect.right + @item_window.x + 16
      y = @item_window.cursor_rect.y + @item_window.y + 16
      result = menu.show_menu(x, y, start_index)
      # 菜单被取消的情况下,返回
      return if result == 3
      cost = price.factor(REROLL_COST_RATIO[result])
      ranges = []
      # 低级或高级需限定幻化范围
      if result != 1
        if item.random_enabled?(:QUALITY)
          min = result == 0 ? item.min_quality : item.quality
          max = result == 0 ? item.quality : item.max_quality
          ranges.push(min..max)
        end
        if item.random_enabled?(:ENCHANT)
          min = result == 0 ? 0 : item.enchant_count
          max = result == 0 ? item.enchant_count : item.max_enchant
          ranges.push(min..max)
        end
        if item.random_enabled?(:LEVEL)
          min = result == 0 ? 0 : item.level
          max = result == 0 ? item.level : item.max_level
          ranges.push(min..max)
        end
        if item.random_enabled?(:SOCKET)
          min = result == 0 ? 1 : [item.sockets, 1].max
          max = result == 0 ? [item.sockets, 1].max : item.max_sockets
          ranges.push(min..max)
        end
      end
      # 幻化操作
      msg = sprintf(Vocab.reroll_confirm, item.info_00, cost)
      if Window_MessageBox.new(msg, Vocab.reroll, MB_YN).result == DR_YES
        # 演奏装备 SE
        $game_system.se_play($data_system.equip_se)
        # 执行幻化
        $game_party.lose_gold(cost)
        item.randomize(*ranges)
        # 更新相关窗口
        @item_window.refresh
        @item_window.update_info
        @gold_window.refresh
        info = sprintf(Vocab.reroll_info, item.info_00)
        Window_MessageBox.new(info, Vocab.reroll)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 物品操作熔毁
  #--------------------------------------------------------------------------
  def process_item_8
    # 获得当前的待操作物品
    item = @item_window.item
    # 演奏确定 SE
    $game_system.se_play($data_system.decision_se)
    # 询问确认的情况下,执行熔毁
    gain = item.price.factor(DESTROY_GAIN_RATIO)
    msg = sprintf(Vocab.destroy_confirm, item.info_00, gain)
    if Window_MessageBox.new(msg, Vocab.destroy, MB_YN).result == DR_YES
      # 演奏销毁 SE
      $game_system.se_play($data_system.enemy_collapse_se)
      # 执行熔毁
      item.unsocket_all if $sailcat_import[:EquipSocket]
      $game_party.lose_object(item, 1)
      $game_party.gain_gold(gain)
      # 更新相关窗口
      @item_window.refresh
      @item_window.update_help
      @item_window.update_info
      @gold_window.refresh
      Window_MessageBox.new(Vocab.destroy_info, Vocab.repair)
    end
  end
end
[/pre]

因为SailCat大神的脚本之间有依赖关系,可能单看这两个脚本还不是特别明朗吧。。

点评

已解决  发表于 2020-3-23 23:13
菜得真实但还是想做游戏
梦石
0
星屑
423
在线时间
37 小时
注册时间
2013-7-1
回帖
16
 楼主| 发表于 2020-3-17 16:38:04 | 显示全部楼层
紧接着不知道什么时候出现的问题。。。
GMV2A887NW}DU1MK_NQ9I%H.png
之前还是好的,只修改了一楼提到的那一个外挂脚本(没有发生错误)
之后再进入战斗就这样了……
百思不得其解……
之前也出现了这种情况,我把脚本备份了一下,删除了所有的外挂脚本
再逐个添回并测试游戏,最终全部添回,错误又消失了
摸不着头脑。。。
菜得真实但还是想做游戏
回复

使用道具 举报

梦石
0
星屑
413
在线时间
214 小时
注册时间
2011-3-21
回帖
142
发表于 2020-3-18 12:32:46 | 显示全部楼层
查找$game_party.gold替换成$game_variables[4]试试?
签名是什么 好吃么
【好吃】
回复

使用道具 举报

梦石
0
星屑
423
在线时间
37 小时
注册时间
2013-7-1
回帖
16
 楼主| 发表于 2020-3-19 12:41:22 | 显示全部楼层
1095884734 发表于 2020-3-18 12:32
查找$game_party.gold替换成$game_variables[4]试试?

消耗金钱改成消耗变量其实已经做到了,我现在面临的问题是
SailCat大神的这个脚本 铁匠铺的界面是单独的金钱窗口,并没有调用通用的window_gold.new,
然后我尝试着修改单独的铁匠铺金钱窗口就会报错  也不知道问题出在哪儿。。
菜得真实但还是想做游戏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部