ページ 11

アイテム合成にて装備中の物を合成対象に含みたい

Posted: 2024年9月12日(木) 21:56
by Myaga
趣味でツクールVXAceを利用して二次創作ゲームを作っております、Myagaと申します、お世話になります。

白の魔様のアイテム合成 ver 1.04(http://izumiwhite.web.fc2.com/rgss3/rgss3_004.html)を利用して
合成ショップを作りました。

しかし気になった点があり、箇条書きにまとめます。
・武器や防具を装備していると所持数にカウントされない。
・強化したいものがあったら一回装備から外して合成し、また装備すると手間がかかってしまう。

ですので、
・合成対象かつ装備中の武器や防具が所持数に含まれるようにしたい。
・合成する場合、一旦装備から外したうえで合成し、合成前のアイテムはアイテム欄から消え、アイテム欄に合成後アイテムが入るようにしたい。
(・欲を言えば、使用素材の画面にて誰が装備しているか分かるようにしたい。)
これらの三点を出来るようにしたいのです。

私はある程度頑張ってみましたが、
・装備している武器を所持品としてカウントさせる。
・アイテムを合成することはできたが、合成前のアイテムが消費されないので合成後と合成前が同時に存在してしまう。
とこんな結果になってしまいました。

たくさんの要望で厚かましいかもしれませんが、お力を貸してくださると嬉しいです。

Re: アイテム合成にて装備中の物を合成対象に含みたい

Posted: 2024年9月13日(金) 16:02
by DEDEN
Myaga様こんにちは
使用素材ウインドウでどのように装備中キャラが表示されてほしいのかを
画像で説明して頂けるとイメージしやすいです
また装備中のキャラが複数人存在する場合はどうなるのが理想ですか?

Re: アイテム合成にて装備中の物を合成対象に含みたい

Posted: 2024年9月13日(金) 20:08
by Myaga
DEDEN様、ご返信ありがとうございます。
私はクラピRPGというゲームを作っておりまして、添付した画像は拙作のスクリーンショットです。

画像の右側に「ケルベロスブレイド」が必要素材に入っていますが、
・剣のアイコンをキャラの歩行グラフィック(正面を向いている画像)にする
・剣のアイコンとキャラの歩行グラフィックを交互に映す
など検討しています。

複数人いる場合ですが、今のところ合成できる武器防具は全て一品ものなので大丈夫です!
しかし後々の事を考えておりまして、後者のキャラの歩行グラフィックを交互に映すのであれば複数人もできるよな...と思っています。

お忙しい中大変恐縮ですが、よろしくお願い致します。

Re: アイテム合成にて装備中の物を合成対象に含みたい

Posted: 2024年9月19日(木) 00:46
by DEDEN
Myaga様
大変お待たせしました
思ったよりも改変箇所が多く、時間が掛かってしまいました
以下のコードを導入すれば挙動が変わると思います
複数人が装備している場合にも対応しておきました
デバッグが足りていないかもしれないので何か不具合があればお知らせください

コード: 全て選択

#==============================================================================
# ■ 白の魔様 アイテム合成 拡張 ver1.00
#------------------------------------------------------------------------------
#    白の魔様のアイテム合成スクリプトを拡張します
#    本家スクリプトよりも下に導入してください
#==============================================================================
#--------------------------------------------------------------------------
#  ★追加機能
#  ・装備中の武器/防具も合成対象に含まれるように改変
#  ・装備中のキャラクターを順にフェード表示
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
#  ★仕様
#  ・装備中の素材とそうでない素材が両方存在する場合は装備していない素材を
#    優先して消費する
#  ・装備中キャラが複数存在する場合はパーティの先頭から順に装備を外される
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
#  ★改変箇所(再定義なので念のため記述)
#  ・合成実行時に装備チェック&装備中なら外す処理を追加
#  ・合成可能かの判定を装備もチェックしてから行う
#  ・素材の個数が足りているかを装備からもチェック
#  ・素材総数を装備から足して計算するように改変
#  ・これらの改変に合わせアイテム名やアイコン描画処理も改変
#  ・キャラクターグラフィックを縮小、半透明で描画する処理を追加
#  ・アイコンとキャラグラを交互に表示するためにupdateを改変
#  ・最大合成可能個数を計算する処理に装備チェックを追加
#    (何個合成するかを入力するウインドウで必要)
#--------------------------------------------------------------------------

#--------------------------------------------------------------------------
#  ★設定項目
#  ・FADE_SPEED => キャラ表示の切り替え速度
#  ・DRAW_E     => キャラグラの左上にEを表示するか
#--------------------------------------------------------------------------
class Window_ItemSynthesisMaterial < Window_Base
  FADE_SPEED = 5
  DRAW_E     = true
end

class Scene_ItemSynthesis < Scene_MenuBase
  #--------------------------------------------------------------------------
  # ● 合成の実行
  #--------------------------------------------------------------------------
  def do_syntetic(number)
    $game_party.lose_gold(number * buying_price)
    $game_party.gain_item(@item, number)

    @recipe = @list_window.recipe(@item)
    for i in 1...@recipe.size
      kind = @recipe[i][0]
      id   = @recipe[i][1]
      num  = @recipe[i][2]
        if kind == "I"
          item = $data_items[id]
        elsif kind == "W"
          item = $data_weapons[id]
        elsif kind == "A"
          item = $data_armors[id]
        end
      check_and_unequip(item,num*number)
      $game_party.lose_item(item, num*number)
    end
  end
  #--------------------------------------------------------------------------
  # ● 装備解除が必要か判定し、必要なら解除
  #--------------------------------------------------------------------------
  def check_and_unequip(item,consume_amount)
    required_number = consume_amount - $game_party.item_number(item)
    return if required_number <= 0
    count = 0
    $game_party.members.each do |actor|
      if actor.equips.include?(item)
        slot_id = actor.equips.index(item)
        actor.change_equip(slot_id,nil)
        count += 1
        break if count == required_number
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 最大購入可能個数の取得
  #--------------------------------------------------------------------------
  def max_buy
    max = $game_party.max_item_number(@item) - $game_party.item_number(@item)
    
    @recipe = @list_window.recipe(@item)
      for i in 1...@recipe.size
        equipping_char = 0
        kind = @recipe[i][0]
        id   = @recipe[i][1]
        num  = @recipe[i][2]
        if kind == "I"
          item = $data_items[id]
        elsif kind == "W"
          item = $data_weapons[id]
        elsif kind == "A"
          item = $data_armors[id]
        end
        $game_party.members.each do |actor|
          next if item.nil?
          equipping_char += 1 if actor.equips.include?(item)
        end
        if num > 0
          max_buf = ($game_party.item_number(item)+equipping_char) / num
        else
          max_buf = 999
        end
        max = [max, max_buf].min
      end
      
    buying_price == 0 ? max : [max, money / buying_price].min

  end
end
  
class Window_ItemSynthesisList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● アイテムを許可状態で表示するかどうか
  #--------------------------------------------------------------------------
  def have_mat?(recipe)
    flag = true
    if @money >= recipe[0]
      for i in 1...recipe.size
        kind = recipe[i][0]
        id   = recipe[i][1]
        num  = recipe[i][2]
        if kind == "I"
          item = $data_items[id]
        elsif kind == "W"
          item = $data_weapons[id]
        elsif kind == "A"
          item = $data_armors[id]
        end
        if $game_party.item_number(item) < [num, 1].max
          equip_count = 0
          $game_party.members.each do |actor|
            equip_count += 1 if actor.equips.include?(item)
          end
          flag = false if equip_count + $game_party.item_number(item) < [num, 1].max
        end
      end
    else
      flag = false
    end
    return flag
  end
end

class Window_ItemSynthesisMaterial < Window_Base
  FADE_SPEED = 5
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super(x, y, width, height)
    @item = nil
    @outward = true
    @opacity = 255
    refresh
  end
  #--------------------------------------------------------------------------
  # ● アイテムの設定
  #--------------------------------------------------------------------------
  def set(item, recipe)
    @item = item
    @recipe = recipe
    @make_number = 1
    set_char_list
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 装備中キャラリストを作成
  #--------------------------------------------------------------------------
  def set_char_list
    return if @recipe.nil?
    @char_list = []
    @char_index = [-1]
    @recipe.each do |r|
      @char_index << -1
      @char_list << []
      if r[0] == "I"
        item = $data_items[r[1]]
      elsif r[0] == "W"
        item = $data_weapons[r[1]]
      elsif r[0] == "A"
        item = $data_armors[r[1]]
      end
      $game_party.members.each do |actor|
        next if item.nil?
        @char_list.last << actor.id if actor.equips.include?(item)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● アイテム名の描画
  #     enabled : 有効フラグ。false のとき半透明で描画
  #--------------------------------------------------------------------------
  def draw_item_name(item, x, y, enabled = true, width = 172)
    return unless item
    if @char_list[@recipe_index].empty? || @char_index[@recipe_index] == -1
      draw_icon(item.icon_index, x, y, enabled)
    else
      draw_character(@char_list[@recipe_index][@char_index[@recipe_index]], x, y,enabled)
    end
    change_color(normal_color, enabled)
    draw_text(x + 24, y, width, line_height, item.name)
  end
  #--------------------------------------------------------------------------
  # ● アイコンの描画
  #     enabled : 有効フラグ。false のとき半透明で描画
  #--------------------------------------------------------------------------
  def draw_icon(icon_index, x, y, enabled = true)
    bitmap = Cache.system("Iconset")
    rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
    opacity = @opacity
    opacity = 128 if opacity > 128 && !enabled
    if @char_list[@recipe_index].empty?
      contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
    else
      contents.blt(x, y, bitmap, rect, opacity)
    end
  end
  #--------------------------------------------------------------------------
  # ● キャラクターの描画(透明度と拡大率の追加)
  #--------------------------------------------------------------------------
  def draw_character(id, x, y,enabled)
    character_name = $game_actors[id].character_name
    character_index = $game_actors[id].character_index 
    bitmap = Cache.character(character_name)
    sign = character_name[/^[\!\$\~]./]
    if sign && sign.include?('$')
      cw = bitmap.width / 3
      ch = bitmap.height / 4
    else
      cw = bitmap.width / 12
      ch = bitmap.height / 8
    end
    n = character_index
    src_rect = Rect.new((n % 4 * 3 + 1) * cw, (n / 4 * 4) * ch, cw, ch)
    opacity = @opacity
    opacity = 128 if opacity > 128 && !enabled
    # 透明度と拡大率を適用して描画
    #self.contents.blt(x, y - ch, bitmap, src_rect, @opacity)
    self.contents.stretch_blt(
      Rect.new(x-2, y+22 - (ch * 0.75).to_i, (cw * 0.75).to_i, (ch * 0.75).to_i),
      bitmap, 
      src_rect, 
      opacity
    )
    change_color(Color.new(150,255,100,opacity))
    draw_text(x, y-8, width, line_height, "E") if DRAW_E
  end
  #--------------------------------------------------------------------------
  # ● 素材情報の描画
  #--------------------------------------------------------------------------
  def draw_material_info(x, y)
    rect = Rect.new(x, y, contents.width, line_height)
    change_color(system_color)
    contents.font.size = 18
    draw_text(rect, "必要素材", 0)
    if @recipe
      for i in 1...@recipe.size
        @recipe_index = i
        kind = @recipe[i][0]
        id   = @recipe[i][1]
        num  = @recipe[i][2]
        if kind == "I"
          item = $data_items[id]
        elsif kind == "W"
          item = $data_weapons[id]
        elsif kind == "A"
          item = $data_armors[id]
        end
        item_number = item_number_total(num,item)
        rect = Rect.new(x, y + line_height*i, contents.width, line_height)
        enabled = true
        enabled = false if [num*@make_number, 1].max  > item_number
        draw_item_name(item, rect.x, rect.y, enabled)
        change_color(normal_color, enabled)
        if num > 0
          draw_text(rect, "#{num*@make_number}/#{item_number}", 2)
        end
      end
    end
    change_color(normal_color)
    contents.font.size = 24
  end
  #--------------------------------------------------------------------------
  # ● 素材総数を返す
  #--------------------------------------------------------------------------
  def item_number_total(num,item)
    $game_party.item_number(item) + @char_list[@recipe_index].size
  end
  #--------------------------------------------------------------------------
  # ● 表示キャラ切り替え
  #--------------------------------------------------------------------------
  def change_char_index
    for n in 1 ... @recipe.size
      @char_index[n] == @char_list[n].size - 1 ? @char_index[n] = -1 : @char_index[n] += 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  def update
    super
    return if !visible
    if @outward
      @opacity -= FADE_SPEED
      if @opacity <= 0
        @outward = false
        change_char_index
      end
    else
      @opacity += FADE_SPEED
      @outward = true if @opacity >= 255
    end
    refresh
  end
end

Re: アイテム合成にて装備中の物を合成対象に含みたい

Posted: 2024年9月21日(土) 16:19
by DEDEN
申し訳ありません
やはり不具合がありました
お手数ですが以下のコードに差し替えてください

コード: 全て選択

#==============================================================================
# ■ 白の魔様 アイテム合成 拡張 ver1.01
#------------------------------------------------------------------------------
#    白の魔様のアイテム合成スクリプトを拡張します
#    本家スクリプトよりも下に導入してください
#==============================================================================
#--------------------------------------------------------------------------
#  ★追加機能
#  ・装備中の武器/防具も合成対象に含まれるように改変
#  ・装備中のキャラクターを順にフェード表示
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
#  ★仕様
#  ・装備中の素材とそうでない素材が両方存在する場合は装備していない素材を
#    優先して消費する
#  ・装備中キャラが複数存在する場合はパーティの先頭から順に装備を外される
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
#  ★改変箇所(再定義なので念のため記述)
#  ・合成実行時に装備チェック&装備中なら外す処理を追加
#  ・合成可能かの判定を装備もチェックしてから行う
#  ・素材の個数が足りているかを装備からもチェック
#  ・素材総数を装備から足して計算するように改変
#  ・これらの改変に合わせアイテム名やアイコン描画処理も改変
#  ・キャラクターグラフィックを縮小、半透明で描画する処理を追加
#  ・アイコンとキャラグラを交互に表示するためにupdateを改変
#  ・最大合成可能個数を計算する処理に装備チェックを追加
#    (何個合成するかを入力するウインドウで必要)
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
#  ★更新履歴
#    1.01:二刀流等、同じ装備を複数個所に装備している場合に
#         正しく処理されない不具合を修正
#--------------------------------------------------------------------------

#--------------------------------------------------------------------------
#  ★設定項目
#  ・FADE_SPEED => キャラ表示の切り替え速度
#  ・DRAW_E     => キャラグラの左上にEを表示するか
#--------------------------------------------------------------------------
class Window_ItemSynthesisMaterial < Window_Base
  FADE_SPEED = 5
  DRAW_E     = true
end

class Scene_ItemSynthesis < Scene_MenuBase
  #--------------------------------------------------------------------------
  # ● 合成の実行
  #--------------------------------------------------------------------------
  def do_syntetic(number)
    $game_party.lose_gold(number * buying_price)
    $game_party.gain_item(@item, number)

    @recipe = @list_window.recipe(@item)
    for i in 1...@recipe.size
      kind = @recipe[i][0]
      id   = @recipe[i][1]
      num  = @recipe[i][2]
        if kind == "I"
          item = $data_items[id]
        elsif kind == "W"
          item = $data_weapons[id]
        elsif kind == "A"
          item = $data_armors[id]
        end
      check_and_unequip(item,num*number)
      $game_party.lose_item(item, num*number)
    end
  end
  #--------------------------------------------------------------------------
  # ● 装備解除が必要か判定し、必要なら解除
  #--------------------------------------------------------------------------
  def check_and_unequip(item,consume_amount)
    required_number = consume_amount - $game_party.item_number(item)
    return if required_number <= 0
    count = 0
    $game_party.members.each do |actor|
      actor.equips.count(item).times do
        slot_id = actor.equips.index(item)
        actor.change_equip(slot_id,nil)
        count += 1
        break if count == required_number
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 最大購入可能個数の取得
  #--------------------------------------------------------------------------
  def max_buy
    max = $game_party.max_item_number(@item) - $game_party.item_number(@item)
   
    @recipe = @list_window.recipe(@item)
      for i in 1...@recipe.size
        equipping_char = 0
        kind = @recipe[i][0]
        id   = @recipe[i][1]
        num  = @recipe[i][2]
        if kind == "I"
          item = $data_items[id]
        elsif kind == "W"
          item = $data_weapons[id]
        elsif kind == "A"
          item = $data_armors[id]
        end
        $game_party.members.each do |actor|
          next if item.nil?
          equipping_char += actor.equips.count(item)
        end
        if num > 0
          max_buf = ($game_party.item_number(item)+equipping_char) / num
        else
          max_buf = 999
        end
        max = [max, max_buf].min
      end
     
    buying_price == 0 ? max : [max, money / buying_price].min

  end
end
 
class Window_ItemSynthesisList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● アイテムを許可状態で表示するかどうか
  #--------------------------------------------------------------------------
  def have_mat?(recipe)
    flag = true
    if @money >= recipe[0]
      for i in 1...recipe.size
        kind = recipe[i][0]
        id   = recipe[i][1]
        num  = recipe[i][2]
        if kind == "I"
          item = $data_items[id]
        elsif kind == "W"
          item = $data_weapons[id]
        elsif kind == "A"
          item = $data_armors[id]
        end
        if $game_party.item_number(item) < [num, 1].max
          equip_count = 0
          $game_party.members.each do |actor|
            equip_count += actor.equips.count(item)
          end
          flag = false if equip_count + $game_party.item_number(item) < [num, 1].max
        end
      end
    else
      flag = false
    end
    return flag
  end
end

class Window_ItemSynthesisMaterial < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super(x, y, width, height)
    @item = nil
    @outward = true
    @opacity = 255
    refresh
  end
  #--------------------------------------------------------------------------
  # ● アイテムの設定
  #--------------------------------------------------------------------------
  def set(item, recipe)
    @item = item
    @recipe = recipe
    @make_number = 1
    set_char_list
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 装備中キャラリストを作成
  #--------------------------------------------------------------------------
  def set_char_list
    return if @recipe.nil?
    @char_list = []
    @char_index = [-1]
    @equipping_count = [{}]
    @recipe.each do |r|
      @char_index << -1
      @char_list << []
      if r[0] == "I"
        item = $data_items[r[1]]
      elsif r[0] == "W"
        item = $data_weapons[r[1]]
      elsif r[0] == "A"
        item = $data_armors[r[1]]
      end
      next if !r.is_a?(Array)
      @equipping_count << {}
      $game_party.members.each do |actor|
        @equipping_count.last[actor.id] = 0
        next if item.nil?
        if actor.equips.include?(item)
          @char_list.last << actor.id
          @equipping_count.last[actor.id] += actor.equips.count(item)
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● アイテム名の描画
  #     enabled : 有効フラグ。false のとき半透明で描画
  #--------------------------------------------------------------------------
  def draw_item_name(item, x, y, enabled = true, width = 172)
    return unless item
    if @char_list[@recipe_index].empty? || @char_index[@recipe_index] == -1
      draw_icon(item.icon_index, x, y, enabled)
    else
      draw_character(@char_list[@recipe_index][@char_index[@recipe_index]], x, y,enabled)
    end
    change_color(normal_color, enabled)
    draw_text(x + 24, y, width, line_height, item.name)
  end
  #--------------------------------------------------------------------------
  # ● アイコンの描画
  #     enabled : 有効フラグ。false のとき半透明で描画
  #--------------------------------------------------------------------------
  def draw_icon(icon_index, x, y, enabled = true)
    bitmap = Cache.system("Iconset")
    rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
    opacity = @opacity
    opacity = 128 if opacity > 128 && !enabled
    if @char_list[@recipe_index].empty?
      contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
    else
      contents.blt(x, y, bitmap, rect, opacity)
    end
  end
  #--------------------------------------------------------------------------
  # ● キャラクターの描画(透明度と拡大率の追加)
  #--------------------------------------------------------------------------
  def draw_character(id, x, y,enabled)
    character_name = $game_actors[id].character_name
    character_index = $game_actors[id].character_index
    bitmap = Cache.character(character_name)
    sign = character_name[/^[\!\$\~]./]
    if sign && sign.include?('$')
      cw = bitmap.width / 3
      ch = bitmap.height / 4
    else
      cw = bitmap.width / 12
      ch = bitmap.height / 8
    end
    n = character_index
    src_rect = Rect.new((n % 4 * 3 + 1) * cw, (n / 4 * 4) * ch, cw, ch)
    opacity = @opacity
    opacity = 128 if opacity > 128 && !enabled
    # 透明度と拡大率を適用して描画
    #self.contents.blt(x, y - ch, bitmap, src_rect, @opacity)
    self.contents.stretch_blt(
      Rect.new(x-2, y+22 - (ch * 0.75).to_i, (cw * 0.75).to_i, (ch * 0.75).to_i),
      bitmap,
      src_rect,
      opacity
    )
    change_color(Color.new(150,255,100,opacity))
    if DRAW_E
      x2 = x
      @equipping_count[@recipe_index][id].times do
        draw_text(x2, y-8, width, line_height, "E")
        x2 += 8
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 素材情報の描画
  #--------------------------------------------------------------------------
  def draw_material_info(x, y)
    rect = Rect.new(x, y, contents.width, line_height)
    change_color(system_color)
    contents.font.size = 18
    draw_text(rect, "必要素材", 0)
    if @recipe
      for i in 1...@recipe.size
        @recipe_index = i
        kind = @recipe[i][0]
        id   = @recipe[i][1]
        num  = @recipe[i][2]
        if kind == "I"
          item = $data_items[id]
        elsif kind == "W"
          item = $data_weapons[id]
        elsif kind == "A"
          item = $data_armors[id]
        end
        item_number = item_number_total(num,item)
        rect = Rect.new(x, y + line_height*i, contents.width, line_height)
        enabled = true
        enabled = false if [num*@make_number, 1].max  > item_number
        draw_item_name(item, rect.x, rect.y, enabled)
        change_color(normal_color, enabled)
        if num > 0
          draw_text(rect, "#{num*@make_number}/#{item_number}", 2)
        end
      end
    end
    change_color(normal_color)
    contents.font.size = 24
  end
  #--------------------------------------------------------------------------
  # ● 素材総数を返す
  #--------------------------------------------------------------------------
  def item_number_total(num,item)
    sum = @equipping_count[@recipe_index].values.inject(:+)
    $game_party.item_number(item) + sum
  end
  #--------------------------------------------------------------------------
  # ● 表示キャラ切り替え
  #--------------------------------------------------------------------------
  def change_char_index
    for n in 1 ... @recipe.size
      @char_index[n] == @char_list[n].size - 1 ? @char_index[n] = -1 : @char_index[n] += 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  def update
    super
    return if !visible
    if @outward
      @opacity -= FADE_SPEED
      if @opacity <= 0
        @outward = false
        change_char_index
      end
    else
      @opacity += FADE_SPEED
      @outward = true if @opacity >= 255
    end
    refresh
  end
end

Re: アイテム合成にて装備中の物を合成対象に含みたい

Posted: 2024年9月22日(日) 13:11
by DEDEN
再三すみません
更に不具合が見つかりましたので修正しました

コード: 全て選択

#==============================================================================
# ■ 白の魔様 アイテム合成 拡張 ver1.02
#------------------------------------------------------------------------------
#    白の魔様のアイテム合成スクリプトを拡張します
#    本家スクリプトよりも下に導入してください
#==============================================================================
#--------------------------------------------------------------------------
#  ★追加機能
#  ・装備中の武器/防具も合成対象に含まれるように改変
#  ・装備中のキャラクターを順にフェード表示
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
#  ★仕様
#  ・装備中の素材とそうでない素材が両方存在する場合は装備していない素材を
#    優先して消費する
#  ・装備中キャラが複数存在する場合はパーティの先頭から順に装備を外される
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
#  ★改変箇所(再定義なので念のため記述)
#  ・合成実行時に装備チェック&装備中なら外す処理を追加
#  ・合成可能かの判定を装備もチェックしてから行う
#  ・素材の個数が足りているかを装備からもチェック
#  ・素材総数を装備から足して計算するように改変
#  ・これらの改変に合わせアイテム名やアイコン描画処理も改変
#  ・キャラクターグラフィックを縮小、半透明で描画する処理を追加
#  ・アイコンとキャラグラを交互に表示するためにupdateを改変
#  ・最大合成可能個数を計算する処理に装備チェックを追加
#    (何個合成するかを入力するウインドウで必要)
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
#  ★更新履歴
#    1.01: 二刀流等、同じ装備を複数個所に装備している場合に
#          正しく処理されない不具合を修正
#    1.02: 装備解除処理で必要以上に装備を外してしまう事がある
           不具合を修正
#--------------------------------------------------------------------------

#--------------------------------------------------------------------------
#  ★設定項目
#  ・FADE_SPEED => キャラ表示の切り替え速度
#  ・DRAW_E     => キャラグラの左上にEを表示するか
#--------------------------------------------------------------------------
class Window_ItemSynthesisMaterial < Window_Base
  FADE_SPEED = 5
  DRAW_E     = true
end

class Scene_ItemSynthesis < Scene_MenuBase
  #--------------------------------------------------------------------------
  # ● 合成の実行
  #--------------------------------------------------------------------------
  def do_syntetic(number)
    $game_party.lose_gold(number * buying_price)
    $game_party.gain_item(@item, number)

    @recipe = @list_window.recipe(@item)
    for i in 1...@recipe.size
      kind = @recipe[i][0]
      id   = @recipe[i][1]
      num  = @recipe[i][2]
        if kind == "I"
          item = $data_items[id]
        elsif kind == "W"
          item = $data_weapons[id]
        elsif kind == "A"
          item = $data_armors[id]
        end
      check_and_unequip(item,num*number)
      $game_party.lose_item(item, num*number)
    end
  end
  #--------------------------------------------------------------------------
  # ● 装備解除が必要か判定し、必要なら解除
  #--------------------------------------------------------------------------
  def check_and_unequip(item,consume_amount)
    required_number = consume_amount - $game_party.item_number(item)
    return if required_number <= 0
    count = 0
    $game_party.members.each do |actor|
      actor.equips.count(item).times do
        slot_id = actor.equips.index(item)
        actor.change_equip(slot_id,nil)
        count += 1
        break if count >= required_number
      end
      break if count >= required_number
    end
  end
  #--------------------------------------------------------------------------
  # ● 最大購入可能個数の取得
  #--------------------------------------------------------------------------
  def max_buy
    max = $game_party.max_item_number(@item) - $game_party.item_number(@item)
   
    @recipe = @list_window.recipe(@item)
      for i in 1...@recipe.size
        equipping_char = 0
        kind = @recipe[i][0]
        id   = @recipe[i][1]
        num  = @recipe[i][2]
        if kind == "I"
          item = $data_items[id]
        elsif kind == "W"
          item = $data_weapons[id]
        elsif kind == "A"
          item = $data_armors[id]
        end
        $game_party.members.each do |actor|
          next if item.nil?
          equipping_char += actor.equips.count(item)
        end
        if num > 0
          max_buf = ($game_party.item_number(item)+equipping_char) / num
        else
          max_buf = 999
        end
        max = [max, max_buf].min
      end
     
    buying_price == 0 ? max : [max, money / buying_price].min

  end
end
 
class Window_ItemSynthesisList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● アイテムを許可状態で表示するかどうか
  #--------------------------------------------------------------------------
  def have_mat?(recipe)
    flag = true
    if @money >= recipe[0]
      for i in 1...recipe.size
        kind = recipe[i][0]
        id   = recipe[i][1]
        num  = recipe[i][2]
        if kind == "I"
          item = $data_items[id]
        elsif kind == "W"
          item = $data_weapons[id]
        elsif kind == "A"
          item = $data_armors[id]
        end
        if $game_party.item_number(item) < [num, 1].max
          equip_count = 0
          $game_party.members.each do |actor|
            equip_count += actor.equips.count(item)
          end
          flag = false if equip_count + $game_party.item_number(item) < [num, 1].max
        end
      end
    else
      flag = false
    end
    return flag
  end
end

class Window_ItemSynthesisMaterial < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super(x, y, width, height)
    @item = nil
    @outward = true
    @opacity = 255
    refresh
  end
  #--------------------------------------------------------------------------
  # ● アイテムの設定
  #--------------------------------------------------------------------------
  def set(item, recipe)
    @item = item
    @recipe = recipe
    @make_number = 1
    set_char_list
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 装備中キャラリストを作成
  #--------------------------------------------------------------------------
  def set_char_list
    return if @recipe.nil?
    @char_list = []
    @char_index = [-1]
    @equipping_count = [{}]
    @recipe.each do |r|
      @char_index << -1
      @char_list << []
      if r[0] == "I"
        item = $data_items[r[1]]
      elsif r[0] == "W"
        item = $data_weapons[r[1]]
      elsif r[0] == "A"
        item = $data_armors[r[1]]
      end
      next if !r.is_a?(Array)
      @equipping_count << {}
      $game_party.members.each do |actor|
        @equipping_count.last[actor.id] = 0
        next if item.nil?
        if actor.equips.include?(item)
          @char_list.last << actor.id
          @equipping_count.last[actor.id] += actor.equips.count(item)
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● アイテム名の描画
  #     enabled : 有効フラグ。false のとき半透明で描画
  #--------------------------------------------------------------------------
  def draw_item_name(item, x, y, enabled = true, width = 172)
    return unless item
    if @char_list[@recipe_index].empty? || @char_index[@recipe_index] == -1
      draw_icon(item.icon_index, x, y, enabled)
    else
      draw_character(@char_list[@recipe_index][@char_index[@recipe_index]], x, y,enabled)
    end
    change_color(normal_color, enabled)
    draw_text(x + 24, y, width, line_height, item.name)
  end
  #--------------------------------------------------------------------------
  # ● アイコンの描画
  #     enabled : 有効フラグ。false のとき半透明で描画
  #--------------------------------------------------------------------------
  def draw_icon(icon_index, x, y, enabled = true)
    bitmap = Cache.system("Iconset")
    rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
    opacity = @opacity
    opacity = 128 if opacity > 128 && !enabled
    if @char_list[@recipe_index].empty?
      contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
    else
      contents.blt(x, y, bitmap, rect, opacity)
    end
  end
  #--------------------------------------------------------------------------
  # ● キャラクターの描画(透明度と拡大率の追加)
  #--------------------------------------------------------------------------
  def draw_character(id, x, y,enabled)
    character_name = $game_actors[id].character_name
    character_index = $game_actors[id].character_index
    bitmap = Cache.character(character_name)
    sign = character_name[/^[\!\$\~]./]
    if sign && sign.include?('$')
      cw = bitmap.width / 3
      ch = bitmap.height / 4
    else
      cw = bitmap.width / 12
      ch = bitmap.height / 8
    end
    n = character_index
    src_rect = Rect.new((n % 4 * 3 + 1) * cw, (n / 4 * 4) * ch, cw, ch)
    opacity = @opacity
    opacity = 128 if opacity > 128 && !enabled
    # 透明度と拡大率を適用して描画
    #self.contents.blt(x, y - ch, bitmap, src_rect, @opacity)
    self.contents.stretch_blt(
      Rect.new(x-2, y+22 - (ch * 0.75).to_i, (cw * 0.75).to_i, (ch * 0.75).to_i),
      bitmap,
      src_rect,
      opacity
    )
    change_color(Color.new(150,255,100,opacity))
    if DRAW_E
      x2 = x
      @equipping_count[@recipe_index][id].times do
        draw_text(x2, y-8, width, line_height, "E")
        x2 += 8
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 素材情報の描画
  #--------------------------------------------------------------------------
  def draw_material_info(x, y)
    rect = Rect.new(x, y, contents.width, line_height)
    change_color(system_color)
    contents.font.size = 18
    draw_text(rect, "必要素材", 0)
    if @recipe
      for i in 1...@recipe.size
        @recipe_index = i
        kind = @recipe[i][0]
        id   = @recipe[i][1]
        num  = @recipe[i][2]
        if kind == "I"
          item = $data_items[id]
        elsif kind == "W"
          item = $data_weapons[id]
        elsif kind == "A"
          item = $data_armors[id]
        end
        item_number = item_number_total(num,item)
        rect = Rect.new(x, y + line_height*i, contents.width, line_height)
        enabled = true
        enabled = false if [num*@make_number, 1].max  > item_number
        draw_item_name(item, rect.x, rect.y, enabled)
        change_color(normal_color, enabled)
        if num > 0
          draw_text(rect, "#{num*@make_number}/#{item_number}", 2)
        end
      end
    end
    change_color(normal_color)
    contents.font.size = 24
  end
  #--------------------------------------------------------------------------
  # ● 素材総数を返す
  #--------------------------------------------------------------------------
  def item_number_total(num,item)
    sum = @equipping_count[@recipe_index].values.inject(:+)
    $game_party.item_number(item) + sum
  end
  #--------------------------------------------------------------------------
  # ● 表示キャラ切り替え
  #--------------------------------------------------------------------------
  def change_char_index
    for n in 1 ... @recipe.size
      @char_index[n] == @char_list[n].size - 1 ? @char_index[n] = -1 : @char_index[n] += 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  def update
    super
    return if !visible
    if @outward
      @opacity -= FADE_SPEED
      if @opacity <= 0
        @outward = false
        change_char_index
      end
    else
      @opacity += FADE_SPEED
      @outward = true if @opacity >= 255
    end
    refresh
  end
end