【解決済み】同名装備消費で強化

アバター
kurau
記事: 30
登録日時: 2016年4月16日(土) 23:30

【解決済み】同名装備消費で強化

投稿記事by kurau » 2017年2月10日(金) 21:00

以下のようなシステムのリクエストです。
ツクールフェスのようにアイテムメニュー画面から直接使用できる。
使用した装備を消費して、同名装備の性能を強化。
例:ロングソード5個 ATK50 を所持。
メニュー画面からロングソードを選択→ロングソードを消費して
ロングソード4個 ATK60になる。
と言った感じで残り全ての同名装備が強化されるシステムです。
(個別強化ではないので装備を個々に管理する必要はありません。)

また最大強化数と一回あたりの強化値の設定についてですが
メモ欄で、最大強化数20 強化値5%
のように記入すれば1回強化するごとにデータベースの値に+5%され20回が強化の上限になるようなものをイメージしています。

コンセプトとしてはレア度が設定されているような装備品においてゲーム前半での性能抑制とレア度の低い装備にも活躍の場を与えることが目的です。
希望のようなスクリプトではなく、コンセプトに合うようなスクリプトやイベントで組む良いアドバイスがありましたら教えていただけると幸いです。

よろしくお願いします。
最後に編集したユーザー kurau on 2017年2月11日(土) 12:31 [ 編集 1 回目 ]

faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 同名装備消費で強化

投稿記事by faida » 2017年2月11日(土) 09:31

とりあえず作ってみました。

コード: 全て選択

=begin
◆概要
装備の強化をアイテム画面で行えるようにします。

◆機能
・装備をアイテム画面で使用すると装備を消費して強化できます。
・メモ欄に<最大強化値 n>でn回使用できます。
・メモ欄に<強化値 n%>で能力値がn%ずつ上昇します。
・イベントコマンドで「$game_system.enhance_weapons[id] = n」で
idの武器の強化値をnに変更できます。

・メモ欄に<個別強化値 id, n%>でidの能力値がn%ずつ上昇します。
・メモ欄に<強化パラメータ [a,b,c]>でa,b,cの能力値を強化できます。
・イベントコマンドで「$game_system.enhance_armors[id] = n」で
idの防具の強化値をnに変更できます。

◆仕様
・最大値はゲーム中に変更できません。

◆使用上の注意
・★……エイリアス ○……新規定義

◆作者:faida @faida3983

◆更新履歴
ver1.0 : 公開
ver1.1 : 名前に強化値を表示する機能付加
ver1.2 : 残り1個の時の連打防止機能付加
ver1.21: 説明文が間違っていたのを修正

=end

module FAI_EEI
  # 設定項目:強化値を表示する しない場合はnil する場合は文字列
  SHOW_ENHANCE_LEVEL = "+%s"
  # 設定項目:強化できるパラメータ
  ENHANCE_WEAPON_PARAM = [2, 3]
  ENHANCE_ARMOR_PARAM = [3, 5]
  # 設定項目:強化時に鳴らすSE いらなければ「ENHANCE_EQUIP_SE = nil」
  ENHANCE_EQUIP_SE = RPG::SE.new("Heal2", 80, 100)
  # 設定項目:残り1個の時
  # true:使用できる false:装備品になければ使用できない nil:使用できない
  # 確認ウィンドウを使用する際はtrueにしてください。
  LAST_ONE_USE = true
  # 設定項目:確認ウィンドウを表示する
  # true:常に表示する false:残り1個(装備品含む)の時表示する nil:常に表示しない
  DETERMINE_WINDOW = false
  # 設定項目:確認ウィンドウのカーソルを「いいえ」にする
  # true:常に「いいえ」 false:残り1個(装備品含む)の時「いいえ」 nil:常に「はい」
  DETERMINE_WINDOW_NO = false
  # 設定項目:確認ウィンドウに表示する文章
  # 配列にすると残り1個(装備品含む)の時に文章が変わります。
  DETERMINE_WINDOW_TXT = ["この装備を1個消費して強化します。",
                  "この装備は\eC[10]残り1個\eC[0]です。消費して強化しますか?"]
end

class RPG::EquipItem < RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ メモ欄読み込み
  #--------------------------------------------------------------------------
  def enhance_max
    return @enhance_max if @enhance_max
    @enhance_max = (note =~ /<最大強化値\s*(\d+)>/ ? $1.to_i : 0)
  end
  def enhance_rates
    enhance_rate_note if !@enhance_rates; @enhance_rates
  end
  def enhance_rate_note
    val = (note =~ /<強化値\s*(\d+)[%%]>/ ? $1.to_i : 0)
    @enhance_rates = [val, val, val, val, val, val, val, val]
    note.each_line{|line|
      if line =~ /<個別強化値\s*(\d+)\,\s*(\d+)[%%]>/
        @enhance_rates[$1.to_i] = $2.to_i
      end
    }
  end
  def enhance_param_ids
    return @enhance_param_ids if @enhance_param_ids
    arr = default_param_ids
    @enhance_param_ids=(note =~ /<強化パラメータ\s*(\[.+\])>/ ? eval($1) : arr)
  end
  #--------------------------------------------------------------------------
  # ○ 共通処理
  #--------------------------------------------------------------------------
  alias fai_eei_name name
  def name
    return fai_eei_name if !FAI_EEI::SHOW_ENHANCE_LEVEL || enhanced_level == 0
    fai_eei_name + sprintf(FAI_EEI::SHOW_ENHANCE_LEVEL, enhanced_level)
  end
  def default_param_ids
    []
  end
  def enhanceable?
    return false if enhance_max == 0 || enhance_max == enhanced_level
    return false if enhance_rates.all?{|v|v == 0}
    return false if enhance_param_ids.empty?
    true
  end
  def enhanced_level
    0
  end
  def equip_enhance
    if !($game_system.enhance_weapons && $game_system.enhance_armors)
      $game_system.init_enhance_equips
    end
    enhanced_level
  end
end

class RPG::Weapon < RPG::EquipItem
  #--------------------------------------------------------------------------
  # ★ パラメータ群
  #--------------------------------------------------------------------------
  alias fai_eei_params params
  def params
    return fai_eei_params if (!$game_system.enhance_weapons[id] rescue true)
    arr = []
    fai_eei_params.each_with_index{|v, i|
      next arr << v if !enhance_param_ids.include?(i)
      p [name, i, enhance_rates[i]]
      arr << v * (100 + enhance_rates[i] * enhanced_level) / 100
    }
    arr
  end
  #--------------------------------------------------------------------------
  # ○ 個別処理
  #--------------------------------------------------------------------------
  def default_param_ids
    FAI_EEI::ENHANCE_WEAPON_PARAM
  end
  def enhanced_level
    $game_system.enhance_weapons[id] ||= 0 rescue 0
  end
  def equip_enhance
    super; $game_system.enhance_weapons[id] += 1
  end
end

class RPG::Armor < RPG::EquipItem
  #--------------------------------------------------------------------------
  # ★ パラメータ群
  #--------------------------------------------------------------------------
  alias fai_eei_params params
  def params
    return fai_eei_params if (!$game_system.enhance_armors[id] rescue true)
    arr = []
    fai_eei_params.each_with_index{|v, i|
      next arr << v if !enhance_param_ids.include?(i)
      arr << v * (100 + enhance_rates[i] * enhanced_level) / 100
    }
    arr
  end
  #--------------------------------------------------------------------------
  # ○ 個別処理
  #--------------------------------------------------------------------------
  def default_param_ids
    FAI_EEI::ENHANCE_ARMOR_PARAM
  end
  def enhanced_level
    $game_system.enhance_armors[id] ||= 0 rescue 0
  end
  def equip_enhance
    super; $game_system.enhance_armors[id] += 1
  end
end

#==============================================================================
# ■ Game_System
#==============================================================================

class Game_System
  #--------------------------------------------------------------------------
  # ○ 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :enhance_weapons
  attr_accessor :enhance_armors
  #--------------------------------------------------------------------------
  # ★ オブジェクト初期化
  #--------------------------------------------------------------------------
  alias fai_eei_initialize initialize
  def initialize
    fai_eei_initialize
    init_enhance_equips
  end
  #--------------------------------------------------------------------------
  # ○ 強化値初期化
  #--------------------------------------------------------------------------
  def init_enhance_equips
    @enhance_weapons = {}
    @enhance_armors = {}
  end
end

#==============================================================================
# ■ Game_Party
#==============================================================================

class Game_Party < Game_Unit
  #--------------------------------------------------------------------------
  # ★ スキル/アイテムの使用可能判定
  #--------------------------------------------------------------------------
  alias fai_eei_usable? usable?
  def usable?(item)
    if in_battle || !item.is_a?(RPG::EquipItem)
      fai_eei_usable?(item)
    else
      if !FAI_EEI::LAST_ONE_USE && item_number(item) == 1
        return false if FAI_EEI::LAST_ONE_USE == nil
        return false if !members_equip_include?(item)
      end
      item.enhanceable?
    end
  end
  #--------------------------------------------------------------------------
  # ○ 装備の強化
  #--------------------------------------------------------------------------
  def enhance_equip(item)
    return if !item.is_a?(RPG::EquipItem)
    lose_item(item, 1); item.equip_enhance
    FAI_EEI::ENHANCE_EQUIP_SE.play if FAI_EEI::ENHANCE_EQUIP_SE
  end
  def last_one?(item, include_equip = true)
    item_number(item) == 1 && (!include_equip || !members_equip_include?(item))
  end
end

class Window_EnhanceDetermine < Window_HorzCommand
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, y)
    super(x, y)
    self.openness = 0
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width; contents_width + standard_padding * 2; end
  #--------------------------------------------------------------------------
  # ● ウィンドウ高さの取得
  #--------------------------------------------------------------------------
  def window_height; fitting_height(2); end
  #--------------------------------------------------------------------------
  # ● 桁数の取得
  #--------------------------------------------------------------------------
  def col_max; 2; end
  #--------------------------------------------------------------------------
  # ● ウィンドウ内容の幅を計算
  #--------------------------------------------------------------------------
  def contents_width
    b = Bitmap.new(540, 416)
    if !disposed? && !contents.disposed?
      if FAI_EEI::DETERMINE_WINDOW_TXT.is_a?(Array)
        length=FAI_EEI::DETERMINE_WINDOW_TXT.map{|t|text_size_ex(t).width}.max
      else
        length = text_size_ex(FAI_EEI::DETERMINE_WINDOW_TXT).width
      end
    else
      if FAI_EEI::DETERMINE_WINDOW_TXT.is_a?(Array)
        length=FAI_EEI::DETERMINE_WINDOW_TXT.map{|t|b.text_size(t).width}.max
      else
        length = b.text_size(FAI_EEI::DETERMINE_WINDOW_TXT).width
      end
    end
    length
#~     [super, length].max
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ内容の高さを計算
  #--------------------------------------------------------------------------
  def contents_height
    super + line_height
  end
  def item
    @item
  end
  def item=(item)
    @item = item
  end
  def last_one?
    $game_party.last_one?(@item)
  end
  #--------------------------------------------------------------------------
  # ● 項目を描画する矩形の取得
  #--------------------------------------------------------------------------
  def item_rect(index)
    rect = super
    rect.y += line_height
    rect
  end
  def text_size_ex(str)
    reset_font_settings
    str = convert_escape_characters(str)
    pos = {:x => 0, :y => 0, :new_x => 0, :height => calc_line_height(str)}
    process_character_s(str.slice!(0, 1), str, pos) until str.empty?
    Rect.new(0, 0, pos[:x], pos[:height])
  end
  #--------------------------------------------------------------------------
  # ● 文字の処理
  #--------------------------------------------------------------------------
  def process_character_s(c, str, pos)
    case c
    when "\e"   # 制御文字
      process_escape_character_s(obtain_escape_code(str), str, pos)
    else        # 普通の文字
      pos[:x] += text_size(c).width
    end
  end
  #--------------------------------------------------------------------------
  # ● 制御文字の処理
  #     code : 制御文字の本体部分(「\C[1]」なら「C」)
  #--------------------------------------------------------------------------
  def process_escape_character_s(code, text, pos)
    case code.upcase
    when 'C'
      obtain_escape_param(text)
    when 'I'
      obtain_escape_param(text); pos[:x] += 24
    when '{'
      contents.font.size += 8 if contents.font.size <= 64
    when '}'
      contents.font.size -= 8 if contents.font.size >= 16
    end
  end
  #--------------------------------------------------------------------------
  # ● コマンドリストの作成
  #--------------------------------------------------------------------------
  def make_command_list
    add_command("はい", :ok); add_command("いいえ", :cancel)
  end
  def determine_text
    if FAI_EEI::DETERMINE_WINDOW_TXT.is_a?(Array)
      FAI_EEI::DETERMINE_WINDOW_TXT[last_one? ? 1 : 0]
    else
      FAI_EEI::DETERMINE_WINDOW_TXT
    end
  end
  def draw_all_items
    self.contents = Bitmap.new(contents_width, contents_height)
    x = (contents_width - text_size_ex(determine_text).width) / 2
    draw_text_ex(x, 0, determine_text)
    super
  end
  def refresh
    self.width = window_width
    super
  end
end

#==============================================================================
# ■ Scene_Item
#==============================================================================

class Scene_Item < Scene_ItemBase
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  alias fai_eei_start start
  def start
    fai_eei_start
    create_determine_window
  end
  def create_determine_window
    @determine_window = Window_EnhanceDetermine.new(0, 0)
    @determine_window.viewport = @viewport
    @determine_window.x = (Graphics.width - @determine_window.width) / 2
    @determine_window.y = (Graphics.height - @determine_window.height) / 2
    @determine_window.set_handler(:ok, method(:on_determinew_ok))
    @determine_window.set_handler(:cancel, method(:on_determinew_cancel))
  end
  #--------------------------------------------------------------------------
  # ★ アイテムの決定
  #--------------------------------------------------------------------------
  alias fai_eei_determine_item determine_item
  def determine_item
    if item.is_a?(RPG::EquipItem)
      @determine_window.item = item
      if determine_window_show?
        @determine_window.refresh
        @determine_window.open
        @determine_window.select(determine_window_no? ? 1 : 0)
        @determine_window.activate
      else
        on_determinew_ok
      end
    else
      fai_eei_determine_item
    end
  end
  def determine_window_show?
    return false if FAI_EEI::DETERMINE_WINDOW == nil
    FAI_EEI::DETERMINE_WINDOW || @determine_window.last_one?
  end
  def determine_window_no?
    return false if FAI_EEI::DETERMINE_WINDOW_NO == nil
    FAI_EEI::DETERMINE_WINDOW_NO || @determine_window.last_one?
  end
  #--------------------------------------------------------------------------
  # ○ 装備の使用
  #--------------------------------------------------------------------------
  def use_equip_item
    play_se_for_item
    $game_party.enhance_equip(item)
    @actor_window.refresh
  end
  def on_determinew_ok
    use_equip_item
    @determine_window.close
    activate_item_window
  end
  def on_determinew_cancel
    @determine_window.close
    activate_item_window
  end
end
防具にも使えたりしますが、設定しなければ使えないので問題ありません。
汎用性と拡張性の確保のためです、ご了承ください。

※2017/2/11 10:28 名前に強化値を反映する機能つけるの忘れてた
※2017/2/11 12:18 Twitterで装備を全部消費してしまう可能性を指摘されたので
※2017/2/11 13:05 説明文を間違えていたので。使用する分には問題ありません。
最後に編集したユーザー faida on 2017年2月11日(土) 13:04 [ 編集 2 回目 ]
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
アバター
kurau
記事: 30
登録日時: 2016年4月16日(土) 23:30

Re: 同名装備消費で強化

投稿記事by kurau » 2017年2月11日(土) 10:39

ありがとうございます!!
希望通りの動作でイメージもバッチリでした♪
これでツクールフェスで作ったゲームのシステムを再現できます。

後からで申し訳ないのですが、もしよろしければ一つだけ追加で「消費しますか?」はい/いいえ、と言った確認を追加でお願いできますでしょうか?
こんな追加のお願いに時間を使って頂けるならお願い致します。
faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 同名装備消費で強化

投稿記事by faida » 2017年2月11日(土) 12:21

ちょうどその機能をつけようと思ってあくせくしてたところでした。
修正しましたのでどうぞ。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
アバター
kurau
記事: 30
登録日時: 2016年4月16日(土) 23:30

Re: 同名装備消費で強化

投稿記事by kurau » 2017年2月11日(土) 12:29

本当にありがとうございます!!
要望以上の機能までつけていただいて感謝と満足度120%です!

ありがとうございました♪
イシモチ
記事: 12
登録日時: 2022年1月17日(月) 05:28

Re: 【解決済み】同名装備消費で強化

投稿記事by イシモチ » 2023年3月28日(火) 21:45

素晴らしいスクリプトなので使わせていただきたいのですが
割合とは別に固定値で増加できるように改造していただきたいのですが無理でしょうか
faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 【解決済み】同名装備消費で強化

投稿記事by faida » 2023年4月17日(月) 23:12

こんばんは。

遅くなりましたが、割合と固定値の併用ができるようになりました。
固定値は小数で指定できます。
固定値の扱いがちょっと分からなかったので、設定項目にて
固定値の扱いを変更できるようにもしています。
(一応、前バージョンも残しておきます)

コード: 全て選択

=begin
◆概要
装備の強化をアイテム画面で行えるようにします。

◆機能
・装備をアイテム画面で使用すると装備を消費して強化できます。
・メモ欄に<最大強化値 n>でn回使用できます。
・メモ欄に<強化値 x>で能力値がxずつ上昇します。(小数可)
・メモ欄に<強化値 n%>で能力値がn%ずつ上昇します。
・メモ欄に<個別強化値 id, x>でidの能力値がxずつ上昇します。
・メモ欄に<個別強化値 id, n%>でidの能力値がn%ずつ上昇します。
・メモ欄に<強化パラメータ [a,b,c]>でa,b,cの能力値を強化できます。

・イベントコマンドで「$game_system.enhance_weapons[id] = n」で
idの武器の強化値をnに変更できます。
・イベントコマンドで「$game_system.enhance_armors[id] = n」で
idの防具の強化値をnに変更できます。

◆仕様
・最大値はゲーム中に変更できません。

◆使用上の注意
・★……エイリアス ○……新規定義

◆作者:faida @faida3983

◆更新履歴
ver1.0 : 公開
ver1.1 : 名前に強化値を表示する機能付加
ver1.2 : 残り1個の時の連打防止機能付加
ver1.21: 説明文が間違っていたのを修正
ver2.0 : 固定値対応

=end

module FAI_EEI
  # 設定項目:強化値を表示する しない場合はnil する場合は文字列
  SHOW_ENHANCE_LEVEL = "+%s"
  # 設定項目:強化できるパラメータ
  ENHANCE_WEAPON_PARAM = [2, 3]
  ENHANCE_ARMOR_PARAM = [3, 5]
  # 設定項目:割合強化の前に固定値を足す
  # true:(装備基本値 + 固定値) * (100 + 割合)
  # false:(装備基本値 * (100 + 割合)) + 固定値
  ENHANCE_PLUS_BEFORE_RATE = false
 
  # 設定項目:強化時に鳴らすSE いらなければ「ENHANCE_EQUIP_SE = nil」
  ENHANCE_EQUIP_SE = RPG::SE.new("Heal2", 80, 100)
  # 設定項目:残り1個の時
  # true:使用できる false:装備品になければ使用できない nil:使用できない
  # 確認ウィンドウを使用する際はtrueにしてください。
  LAST_ONE_USE = true
  # 設定項目:確認ウィンドウを表示する
  # true:常に表示する false:残り1個(装備品含む)の時表示する nil:常に表示しない
  DETERMINE_WINDOW = false
  # 設定項目:確認ウィンドウのカーソルを「いいえ」にする
  # true:常に「いいえ」 false:残り1個(装備品含む)の時「いいえ」 nil:常に「はい」
  DETERMINE_WINDOW_NO = false
  # 設定項目:確認ウィンドウに表示する文章
  # 配列にすると残り1個(装備品含む)の時に文章が変わります。
  DETERMINE_WINDOW_TXT = ["この装備を1個消費して強化します。",
                  "この装備は\eC[10]残り1個\eC[0]です。消費して強化しますか?"]
end

class RPG::EquipItem < RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ メモ欄読み込み
  #--------------------------------------------------------------------------
  def enhance_max
    return @enhance_max if @enhance_max
    @enhance_max = (note =~ /<最大強化値\s*(\d+)>/ ? $1.to_i : 0)
  end
  def enhance_plus
    enhance_note if !@enhance_plus; @enhance_plus
  end
  def enhance_rates
    enhance_note if !@enhance_rates; @enhance_rates
  end
  def enhance_note
    val = (note =~ /<強化値\s*(\d+)[%%]>/ ? $1.to_i : 0)
    @enhance_rates = [val, val, val, val, val, val, val, val]
    val = (note =~ /<強化値\s*(\d+(?:\.\d+)?)>/ ? $1.to_f: 0.0)
    @enhance_plus = [val, val, val, val, val, val, val, val]
    note.each_line{|line|
      if line =~ /<個別強化値\s*(\d+)\,\s*(\d+)[%%]>/
        @enhance_rates[$1.to_i] = $2.to_i
      elsif line =~ /<個別強化値\s*(\d+)\,\s*(\d+(?:\.\d+)?)>/
        @enhance_plus[$1.to_i] = $2.to_f
      end
    }
  end
  def enhance_param_ids
    return @enhance_param_ids if @enhance_param_ids
    arr = default_param_ids
    @enhance_param_ids=(note =~ /<強化パラメータ\s*(\[.+\])>/ ? eval($1) : arr)
  end
  #--------------------------------------------------------------------------
  # ○ 共通処理
  #--------------------------------------------------------------------------
  alias fai_eei_name name
  def name
    return fai_eei_name if !FAI_EEI::SHOW_ENHANCE_LEVEL || enhanced_level == 0
    fai_eei_name + sprintf(FAI_EEI::SHOW_ENHANCE_LEVEL, enhanced_level)
  end
  def default_param_ids
    []
  end
  def enhanceable?
    return false if enhance_max == 0 || enhance_max == enhanced_level
    return false if enhance_rates.all?{|v|v==0} && enhance_plus.all?{|v|v==0}
    return false if enhance_param_ids.empty?
    true
  end
  def enhanced_level
    0
  end
  def equip_enhance
    if !($game_system.enhance_weapons && $game_system.enhance_armors)
      $game_system.init_enhance_equips
    end
    enhanced_level
  end
end

class RPG::Weapon < RPG::EquipItem
  #--------------------------------------------------------------------------
  # ★ パラメータ群
  #--------------------------------------------------------------------------
  alias fai_eei_params params
  def params
    return fai_eei_params if (!$game_system.enhance_weapons[id] rescue true)
    arr = []
    fai_eei_params.each_with_index{|v, i|
      next arr << v if !enhance_param_ids.include?(i)
      plus = (enhance_plus[i] * enhanced_level).to_i
      if FAI_EEI::ENHANCE_PLUS_BEFORE_RATE
        arr << (v + plus) * (100 + enhance_rates[i] * enhanced_level) / 100
      else
        arr << v * (100 + enhance_rates[i] * enhanced_level) / 100 + plus
      end
    }
    arr
  end
  #--------------------------------------------------------------------------
  # ○ 個別処理
  #--------------------------------------------------------------------------
  def default_param_ids
    FAI_EEI::ENHANCE_WEAPON_PARAM
  end
  def enhanced_level
    $game_system.enhance_weapons[id] ||= 0 rescue 0
  end
  def equip_enhance
    super; $game_system.enhance_weapons[id] += 1
  end
end

class RPG::Armor < RPG::EquipItem
  #--------------------------------------------------------------------------
  # ★ パラメータ群
  #--------------------------------------------------------------------------
  alias fai_eei_params params
  def params
    return fai_eei_params if (!$game_system.enhance_armors[id] rescue true)
    arr = []
    fai_eei_params.each_with_index{|v, i|
      next arr << v if !enhance_param_ids.include?(i)
      arr << v * (100 + enhance_rates[i] * enhanced_level) / 100
    }
    arr
  end
  #--------------------------------------------------------------------------
  # ○ 個別処理
  #--------------------------------------------------------------------------
  def default_param_ids
    FAI_EEI::ENHANCE_ARMOR_PARAM
  end
  def enhanced_level
    $game_system.enhance_armors[id] ||= 0 rescue 0
  end
  def equip_enhance
    super; $game_system.enhance_armors[id] += 1
  end
end

#==============================================================================
# ■ Game_System
#==============================================================================

class Game_System
  #--------------------------------------------------------------------------
  # ○ 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :enhance_weapons
  attr_accessor :enhance_armors
  #--------------------------------------------------------------------------
  # ★ オブジェクト初期化
  #--------------------------------------------------------------------------
  alias fai_eei_initialize initialize
  def initialize
    fai_eei_initialize
    init_enhance_equips
  end
  #--------------------------------------------------------------------------
  # ○ 強化値初期化
  #--------------------------------------------------------------------------
  def init_enhance_equips
    @enhance_weapons = {}
    @enhance_armors = {}
  end
end

#==============================================================================
# ■ Game_Party
#==============================================================================

class Game_Party < Game_Unit
  #--------------------------------------------------------------------------
  # ★ スキル/アイテムの使用可能判定
  #--------------------------------------------------------------------------
  alias fai_eei_usable? usable?
  def usable?(item)
    if in_battle || !item.is_a?(RPG::EquipItem)
      fai_eei_usable?(item)
    else
      if !FAI_EEI::LAST_ONE_USE && item_number(item) == 1
        return false if FAI_EEI::LAST_ONE_USE == nil
        return false if !members_equip_include?(item)
      end
      item.enhanceable?
    end
  end
  #--------------------------------------------------------------------------
  # ○ 装備の強化
  #--------------------------------------------------------------------------
  def enhance_equip(item)
    return if !item.is_a?(RPG::EquipItem)
    lose_item(item, 1); item.equip_enhance
    FAI_EEI::ENHANCE_EQUIP_SE.play if FAI_EEI::ENHANCE_EQUIP_SE
  end
  def last_one?(item, include_equip = true)
    item_number(item) == 1 && (!include_equip || !members_equip_include?(item))
  end
end

class Window_EnhanceDetermine < Window_HorzCommand
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, y)
    super(x, y)
    self.openness = 0
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width; contents_width + standard_padding * 2; end
  #--------------------------------------------------------------------------
  # ● ウィンドウ高さの取得
  #--------------------------------------------------------------------------
  def window_height; fitting_height(2); end
  #--------------------------------------------------------------------------
  # ● 桁数の取得
  #--------------------------------------------------------------------------
  def col_max; 2; end
  #--------------------------------------------------------------------------
  # ● ウィンドウ内容の幅を計算
  #--------------------------------------------------------------------------
  def contents_width
    b = Bitmap.new(540, 416)
    if !disposed? && !contents.disposed?
      if FAI_EEI::DETERMINE_WINDOW_TXT.is_a?(Array)
        length=FAI_EEI::DETERMINE_WINDOW_TXT.map{|t|text_size_ex(t).width}.max
      else
        length = text_size_ex(FAI_EEI::DETERMINE_WINDOW_TXT).width
      end
    else
      if FAI_EEI::DETERMINE_WINDOW_TXT.is_a?(Array)
        length=FAI_EEI::DETERMINE_WINDOW_TXT.map{|t|b.text_size(t).width}.max
      else
        length = b.text_size(FAI_EEI::DETERMINE_WINDOW_TXT).width
      end
    end
    length
#~     [super, length].max
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ内容の高さを計算
  #--------------------------------------------------------------------------
  def contents_height
    super + line_height
  end
  def item
    @item
  end
  def item=(item)
    @item = item
  end
  def last_one?
    $game_party.last_one?(@item)
  end
  #--------------------------------------------------------------------------
  # ● 項目を描画する矩形の取得
  #--------------------------------------------------------------------------
  def item_rect(index)
    rect = super
    rect.y += line_height
    rect
  end
  def text_size_ex(str)
    reset_font_settings
    str = convert_escape_characters(str)
    pos = {:x => 0, :y => 0, :new_x => 0, :height => calc_line_height(str)}
    process_character_s(str.slice!(0, 1), str, pos) until str.empty?
    Rect.new(0, 0, pos[:x], pos[:height])
  end
  #--------------------------------------------------------------------------
  # ● 文字の処理
  #--------------------------------------------------------------------------
  def process_character_s(c, str, pos)
    case c
    when "\e"   # 制御文字
      process_escape_character_s(obtain_escape_code(str), str, pos)
    else        # 普通の文字
      pos[:x] += text_size(c).width
    end
  end
  #--------------------------------------------------------------------------
  # ● 制御文字の処理
  #     code : 制御文字の本体部分(「\C[1]」なら「C」)
  #--------------------------------------------------------------------------
  def process_escape_character_s(code, text, pos)
    case code.upcase
    when 'C'
      obtain_escape_param(text)
    when 'I'
      obtain_escape_param(text); pos[:x] += 24
    when '{'
      contents.font.size += 8 if contents.font.size <= 64
    when '}'
      contents.font.size -= 8 if contents.font.size >= 16
    end
  end
  #--------------------------------------------------------------------------
  # ● コマンドリストの作成
  #--------------------------------------------------------------------------
  def make_command_list
    add_command("はい", :ok); add_command("いいえ", :cancel)
  end
  def determine_text
    if FAI_EEI::DETERMINE_WINDOW_TXT.is_a?(Array)
      FAI_EEI::DETERMINE_WINDOW_TXT[last_one? ? 1 : 0]
    else
      FAI_EEI::DETERMINE_WINDOW_TXT
    end
  end
  def draw_all_items
    self.contents = Bitmap.new(contents_width, contents_height)
    x = (contents_width - text_size_ex(determine_text).width) / 2
    draw_text_ex(x, 0, determine_text)
    super
  end
  def refresh
    self.width = window_width
    super
  end
end

#==============================================================================
# ■ Scene_Item
#==============================================================================

class Scene_Item < Scene_ItemBase
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  alias fai_eei_start start
  def start
    fai_eei_start
    create_determine_window
  end
  def create_determine_window
    @determine_window = Window_EnhanceDetermine.new(0, 0)
    @determine_window.viewport = @viewport
    @determine_window.x = (Graphics.width - @determine_window.width) / 2
    @determine_window.y = (Graphics.height - @determine_window.height) / 2
    @determine_window.set_handler(:ok, method(:on_determinew_ok))
    @determine_window.set_handler(:cancel, method(:on_determinew_cancel))
  end
  #--------------------------------------------------------------------------
  # ★ アイテムの決定
  #--------------------------------------------------------------------------
  alias fai_eei_determine_item determine_item
  def determine_item
    if item.is_a?(RPG::EquipItem)
      @determine_window.item = item
      if determine_window_show?
        @determine_window.refresh
        @determine_window.open
        @determine_window.select(determine_window_no? ? 1 : 0)
        @determine_window.activate
      else
        on_determinew_ok
      end
    else
      fai_eei_determine_item
    end
  end
  def determine_window_show?
    return false if FAI_EEI::DETERMINE_WINDOW == nil
    FAI_EEI::DETERMINE_WINDOW || @determine_window.last_one?
  end
  def determine_window_no?
    return false if FAI_EEI::DETERMINE_WINDOW_NO == nil
    FAI_EEI::DETERMINE_WINDOW_NO || @determine_window.last_one?
  end
  #--------------------------------------------------------------------------
  # ○ 装備の使用
  #--------------------------------------------------------------------------
  def use_equip_item
    play_se_for_item
    $game_party.enhance_equip(item)
    @actor_window.refresh
  end
  def on_determinew_ok
    use_equip_item
    @determine_window.close
    activate_item_window
  end
  def on_determinew_cancel
    @determine_window.close
    activate_item_window
  end
end
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
イシモチ
記事: 12
登録日時: 2022年1月17日(月) 05:28

Re: 【解決済み】同名装備消費で強化

投稿記事by イシモチ » 2023年5月23日(火) 20:31

ありがとうございます、利用させていただきます

“VX / Ace:スクリプト素材のリクエスト” へ戻る