#==============================================================================
# ★ ExCommand_PrizeShop　～ 交換ショップ 変数バージョン ～
#------------------------------------------------------------------------------
# 　[ショップの処理] を利用して、リストアップされた商品と、コインやメダルなど
# 変数を利用した疑似アイテムとの交換ができるようにするスクリプト素材です。
#==============================================================================

# 交換ショップ機能の有効状態を示すスイッチ ID。
# この番号のスイッチを ON にすると、[ショップの処理] を実行した際に、
# 指定した商品が並ぶ交換ショップ画面の処理を行います。 ([購入のみ]も可)
# このスイッチは、ショップの処理が終了した時点で自動的に OFF になります。
EXCMD_PRZSHOP_SID = 7

# 交換ショップのコマンド用語。
# 左から順に、[購入する] [売却する] [やめる] に対応します。
EXCMD_PRZSHOP_VOCAB = ["交換する", "売却する", "やめる"]

# 交換アイテムの設定。
# ここで指定した変数の値を交換アイテムの所持数として扱います。
# 変数 ID、単位用語、換算レートの順に設定してください。
# 商品の価格 ÷ 換算レート を丸めた 1 以上の整数が標準の交換レートになります。
# 例) 換算レートを 100 とした場合 => 
# 　1650G の商品は 16 個で交換可能、100G 以下の商品は 1 個で交換可能
EXCMD_PRZSHOP_ITEM = [24, "枚", 5]

# 商品の交換レート指定用文字列。
# 交換レートが指定されていない商品は、価格から換算して自動的に設定されますが、
# [メモ] に、指定用文字列 + [交換レート] が含まれていれば、こちらを優先します。
# 例) 交換アイテム 20 個と交換可能な商品 => *PRIZE_RATE[20]
EXCMD_PRZSHOP_SIGNATURE = "*PRIZE_RATE"

# ショップ識別番号を指定する変数 ID。
# この番号の変数にショップ識別番号を代入してから [ショップの処理] を実行すると
# 商品の交換レートがショップごとに設定された値に変更されます。見た目には同じ
# ショップでも、識別番号を使い分ける事でレートを変動させることが可能です。
EXCMD_PRZSHOP_VID = 7

# ショップごとの設定：
# 指定用文字列 ( + [交換レート] ) + [ショップ識別番号:交換レート] という書式で
# 「:」で対にしたショップごとの交換レートのセットを「|」で区切って指定します。
# 例 1) ショップ 1 で 20 個、ショップ 2 で 15 個、ショップ 3 で 25 個の
# 交換アイテムと交換可能な商品 => *PRIZE_RATE[1:20|2:15|3:25]
# 例 2) ショップ 2 で 10 個、ショップ 3 で 15 個、それ以外のショップでは
# 20 個の交換アイテムと交換可能な商品 => *PRIZE_RATE[20][2:10|3:15]
# 
# 優先順位は、ショップごとの設定 ＞ 商品ごとの設定 ＞ 価格からの換算 です。

#------------------------------------------------------------------------------

class Game_Party
  #--------------------------------------------------------------------------
  # ☆ 交換アイテムの所持数取得
  #--------------------------------------------------------------------------
  def prize_item_number
    return $game_variables[EXCMD_PRZSHOP_ITEM[0]]
  end
  #--------------------------------------------------------------------------
  # ☆ 交換レートの取得
  #--------------------------------------------------------------------------
  def prize_rate(item)
    rate = 0
    shop_id = $game_variables[EXCMD_PRZSHOP_VID]
    sig = EXCMD_PRZSHOP_SIGNATURE
    reg = /#{Regexp.quote sig}(?:\[\d+\])?\[((\d+:\d+\|?)+)\]/
    note = item.note.clone
    note.gsub!(/\r\n/, "")
    if shop_id > 0 and note.scan(reg).to_a[0]
      for s in $~[1].split(/\s*\|\s*/)
        r = s.split(/\s*:\s*/)
        rate = r[1].to_i if r[0].to_i == shop_id
        break if rate > 0
      end
    end
    if rate == 0
      if note[/#{Regexp.quote sig}\[(\d+)\]/].to_a[0]
        rate = $1.to_i
      else
        rate = (item.price / EXCMD_PRZSHOP_ITEM[2]).round
      end
    end
    return rate > 0 ? rate : 1
  end
end

class Window_Base
  alias _excpshop_initialize initialize
  #--------------------------------------------------------------------------
  # ○ オブジェクト初期化 (追加定義)
  #     x      : ウィンドウの X 座標
  #     y      : ウィンドウの Y 座標
  #     width  : ウィンドウの幅
  #     height : ウィンドウの高さ
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    _excpshop_initialize(x, y, width, height)
    self.currency = Vocab::gold
  end
  #--------------------------------------------------------------------------
  # ☆ 単位の設定
  #--------------------------------------------------------------------------
  def currency=(currency)
    @currency = currency
  end
  #--------------------------------------------------------------------------
  # ☆ 単位がゴールドかどうかを取得
  #--------------------------------------------------------------------------
  def gold?
    return @currency == Vocab::gold
  end
  #--------------------------------------------------------------------------
  # ○ 通貨単位つきの数値描画 (再定義)
  #     value : 数値 (所持金など)
  #     x     : 描画先 X 座標
  #     y     : 描画先 Y 座標
  #     width : 幅
  #--------------------------------------------------------------------------
  def draw_currency_value(value, x, y, width)
    cx = contents.text_size(@currency).width
    self.contents.font.color = normal_color
    self.contents.draw_text(x, y, width - cx - 2, WLH, value, 2)
    self.contents.font.color = system_color
    self.contents.draw_text(x, y, width, WLH, @currency, 2)
  end
end

class Window_Gold
  alias _excpshop_refresh refresh
  #--------------------------------------------------------------------------
  # ○ リフレッシュ (追加定義)
  #--------------------------------------------------------------------------
  def refresh
    _excpshop_refresh
    if $game_switches[EXCMD_PRZSHOP_SID]
      self.contents.clear
      value = gold? ? $game_party.gold : $game_party.prize_item_number
      draw_currency_value(value, 4, 0, 120)
    end
  end
end

class Window_ShopBuy
  alias _excpshop_refresh refresh
  alias _excpshop_draw_item draw_item
  #--------------------------------------------------------------------------
  # ○ リフレッシュ (追加定義)
  #--------------------------------------------------------------------------
  def refresh
    unless $game_switches[EXCMD_PRZSHOP_SID]
      _excpshop_refresh
    else
      @data = []
      for goods_item in @shop_goods
        case goods_item[0]
        when 0
          item = $data_items[goods_item[1]]
        when 1
          item = $data_weapons[goods_item[1]]
        when 2
          item = $data_armors[goods_item[1]]
        end
        if item != nil
          @data.push(item)
        end
      end
      @item_max = @data.size
      create_contents
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ 項目の描画 (追加定義)
  #     index : 項目番号
  #--------------------------------------------------------------------------
  def draw_item(index)
    unless $game_switches[EXCMD_PRZSHOP_SID]
      _excpshop_draw_item(index)
    else
      item = @data[index]
      number = $game_party.item_number(item)
      prize_number = $game_party.prize_item_number
      prize_rate = $game_party.prize_rate(item)
      enabled = (prize_rate <= prize_number and number < 99)
      rect = item_rect(index)
      self.contents.clear_rect(rect)
      draw_item_name(item, rect.x, rect.y, enabled)
      rect.width -= 4
      self.contents.draw_text(rect, prize_rate, 2)
    end
  end
end

class Scene_Shop
  alias _excpshop_start start
  alias _excpshop_terminate terminate
  alias _excpshop_create_command_window create_command_window
  alias _excpshop_update_command_selection update_command_selection
  alias _excpshop_update_buy_selection update_buy_selection
  alias _excpshop_update_sell_selection update_sell_selection
  alias _excpshop_decide_number_input decide_number_input
  #--------------------------------------------------------------------------
  # ☆ 交換ショップかどうかの判定
  #--------------------------------------------------------------------------
  def prize?
    return $game_switches[EXCMD_PRZSHOP_SID]
  end
  #--------------------------------------------------------------------------
  # ○ 開始処理 (追加定義)
  #--------------------------------------------------------------------------
  def start
    _excpshop_start
    if prize?
      @gold_window.currency = EXCMD_PRZSHOP_ITEM[1]
      @number_window.currency = EXCMD_PRZSHOP_ITEM[1]
      @gold_window.refresh
    end
  end
  #--------------------------------------------------------------------------
  # ○ 終了処理 (追加定義)
  #--------------------------------------------------------------------------
  def terminate
    _excpshop_terminate
    $game_switches[EXCMD_PRZSHOP_SID] = false
  end
  #--------------------------------------------------------------------------
  # ○ コマンドウィンドウの作成 (追加定義)
  #--------------------------------------------------------------------------
  def create_command_window
    unless prize?
      _excpshop_create_command_window
    else
      s1 = EXCMD_PRZSHOP_VOCAB[0]
      s2 = EXCMD_PRZSHOP_VOCAB[1]
      s3 = EXCMD_PRZSHOP_VOCAB[2]
      @command_window = Window_Command.new(384, [s1, s2, s3], 3)
      @command_window.y = 56
      if $game_temp.shop_purchase_only
        @command_window.draw_item(1, false)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ コマンド選択の更新 (追加定義)
  #--------------------------------------------------------------------------
  def update_command_selection
    _excpshop_update_command_selection
    if Input.trigger?(Input::C) and prize?
      unless $game_temp.shop_purchase_only
        if @command_window.index == 1 # 売却する
          @gold_window.currency = Vocab::gold
          @number_window.currency = Vocab::gold
          @gold_window.refresh
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ 購入アイテム選択の更新 (追加定義)
  #--------------------------------------------------------------------------
  def update_buy_selection
    unless prize?
      _excpshop_update_buy_selection
    else
      @status_window.item = @buy_window.item
      if Input.trigger?(Input::B)
        Sound.play_cancel
        @command_window.active = true
        @dummy_window.visible = true
        @buy_window.active = false
        @buy_window.visible = false
        @status_window.visible = false
        @status_window.item = nil
        @help_window.set_text("")
        return
      end
      if Input.trigger?(Input::C)
        @item = @buy_window.item
        prize_number = $game_party.prize_item_number
        prize_rate = $game_party.prize_rate(@item)
        number = $game_party.item_number(@item)
        if @item == nil or prize_rate > prize_number or number == 99
          Sound.play_buzzer
        else
          Sound.play_decision
          max = prize_number / prize_rate
          max = [max, 99 - number].min
          @buy_window.active = false
          @buy_window.visible = false
          @number_window.set(@item, max, prize_rate)
          @number_window.active = true
          @number_window.visible = true
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ 売却アイテム選択の更新 (追加定義)
  #--------------------------------------------------------------------------
  def update_sell_selection
    _excpshop_update_sell_selection
    if Input.trigger?(Input::B) and prize?
      @gold_window.currency = EXCMD_PRZSHOP_ITEM[1]
      @number_window.currency = EXCMD_PRZSHOP_ITEM[1]
      @gold_window.refresh
    end
  end
  #--------------------------------------------------------------------------
  # ○ 個数入力の決定 (追加定義)
  #--------------------------------------------------------------------------
  def decide_number_input
    unless prize?
      _excpshop_decide_number_input
    else
      Sound.play_shop
      @number_window.active = false
      @number_window.visible = false
      prize_rate = $game_party.prize_rate(@item)
      number = @number_window.number
      case @command_window.index
      when 0  # 購入する (交換する)
        $game_variables[EXCMD_PRZSHOP_ITEM[0]] -= number * prize_rate
        $game_party.gain_item(@item, number)
        @gold_window.refresh
        @buy_window.refresh
        @status_window.refresh
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # 売却する
        $game_party.gain_gold(number * (@item.price / 2))
        $game_party.lose_item(@item, number)
        @gold_window.refresh
        @sell_window.refresh
        @status_window.refresh
        @sell_window.active = true
        @sell_window.visible = true
        @status_window.visible = false
      end
    end
  end
end
