価値観の違いによる価格変動



地球じゃ、ダイヤモンドは希少だけど火星(月だっけ?)では石ころ同然にゴロゴロしている中、どっちも
同じ価格でダイヤモンドを売っているのはおかしい・・・という場合(例)に効果を発揮します。

貪藻矢射妥←ダイヤモンドベースモジュールTOI風最大所持数変更モジュールが必要です。

※TOI風最大保持数変更に対応したため、スクリプト導入後、ゲームははじめからを選択しないとショップの
 画面に移る際にエラー落ちします。(でも、ショップの画面に移る前に
 $game_system.max_hold_change(0)
 を実行すればOK)

変更点
2008:12:16
・最大保持数を別モジュール化
・TOI風最大所持数変更に対応
 
2009:05:07
・購入項目に並んでいないものを売却しようとした際、価格が変動しないバグを修正
 (■ Window_ShopNumber)
 
2009:05:08
・価格変動(アイテム装備)を併用した際、売却時しか価格の変動に対応して
 いなかったバグを修正
 (■ Window_ShopNumber)
 
2011:07:01
・アイテム、武器、防具の配列の最大値を定数で実装

2011:12:08
・VX風Vocab対応
 (■ Window_ShopNumber)

2016:05:01
・価値観の違いによる価格変動の外部フラグ対応

スクリプト本体
#==============================================================================
# ■ 価値観の違いによる価格変動 By 貪藻矢射妥←
#    - Window_ShopBuy plus -
# 
#  ・あるスイッチがonの場合、価格が変わります
# 
#  ※地球じゃ、ダイヤモンドは希少だけど火星(月だっけ?)では石ころ同然に
#   ゴロゴロしている中、どっちも同じ価格でダイヤモンドを売っているのは
#   おかしい・・・という場合(例)に効果を発揮します。
# 
#  ※TOI風最大保持数変更に対応したため、スクリプト導入後、ゲームははじめから
#   を選択しないとショップの画面に移る際にエラー落ちします。
#   (でも、ショップの画面に移る前に
#    $game_system.max_hold_change(0)
#    を実行すればOK)
# 
#  ※スイッチじゃなく、変数にすれば応用がきくはず・・・
# 
#==============================================================================
# 更新っぽいもの
# 
# 2008:12:16
# ・最大保持数を別モジュール化
# ・TOI風最大所持数変更に対応
# 
# 2011:07:01
# ・アイテム、武器、防具の配列の最大値を定数で実装
# 
# 2016:05:01
# ・価値観の違いによる価格変動の外部フラグ対応

$OuterFlgs = {} if $OuterFlgs == nil
$OuterFlgs["Price_Change_AB"] = true

module DIAMOND
  # 価値観Bでの価格
  PROCEB_ITEM = {
  215=>50, # コスモサイト
  216=>55, # ブルーコスモス
  225=>60, # トリックダイヤ
  226=>65, # ドレスデングリーン
  }
  PROCEB_WEAPON = {
  12=>150,   # ダイヤの剣
  13=>38000, # ふわふわの剣
  116=>8500, # 菊一文字則宗
  344=>80,   # ダイヤの手甲
  }
  PROCEB_ARMOR = {
  307=>180,   # ダイヤメイル
  430=>25000, # ふわふわの指輪
  }
  #価格変動のスイッチ番号
  CH_P_FLG = 127
  
  # アイテム配列最大値
  #            Item, Weapon, Armor
  ARRAY_MAX = [1000,   1000, 1000]
  
end

class Game_System
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :price_off                # プライスオフ変数
  attr_reader   :premium                  # プレミア変数
  
  attr_accessor :root_price_items         # ルートプレイス(アイテム)
  attr_accessor :root_price_weapons       # ルートプレイス(武器)
  attr_accessor :root_price_armors        # ルートプレイス(防具)
  
  attr_reader   :max_hold_value           # 外部最大所持数
end

class Scene_Shop
  include DIAMOND
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  alias diamond_main main
  def main
    # 価値観の違いによる価格変動のための初期化
    if $OuterFlgs["Price_Change_AB"]
      if $game_system.root_price_items == nil
        $game_system.root_price_items = Array.new(ARRAY_MAX[0])
        for i in 0..ARRAY_MAX[0]
          $game_system.root_price_items[i] = false
        end
      end
      if $game_system.root_price_weapons == nil
        $game_system.root_price_weapons = Array.new(ARRAY_MAX[1])
        for i in 0..ARRAY_MAX[1]
          $game_system.root_price_weapons[i] = false
        end
      end
      if $game_system.root_price_armors == nil
        $game_system.root_price_armors = Array.new(ARRAY_MAX[2])
        for i in 0..ARRAY_MAX[2]
          $game_system.root_price_armors[i] = false
        end
      end
    end
  
    #呼び戻し
    diamond_main
  end
end

#==============================================================================
# ■ Window_Base
#------------------------------------------------------------------------------
#  ゲーム中のすべてのウィンドウのスーパークラスです。
#==============================================================================

class Window_Base < Window
  #--------------------------------------------------------------------------
  # ● もともとの価格をゲットしてみる
  #     item : アイテム種別
  #--------------------------------------------------------------------------
  def set_root_price(item)
    case item
    when RPG::Item
      if !$game_system.root_price_items[item.id]
        $game_system.root_price_items[item.id] = item.price
      end
    when RPG::Weapon
      if !$game_system.root_price_weapons[item.id]
        $game_system.root_price_weapons[item.id] = item.price
      end
    when RPG::Armor
      if !$game_system.root_price_armors[item.id]
        $game_system.root_price_armors[item.id] = item.price
      end
    else
      p "武器でも防具でもアイテムでもない・・・"
    end
  end
end

#==============================================================================
# ■ Window_ShopBuy
#------------------------------------------------------------------------------
#  ショップ画面で、購入できる商品の一覧を表示するウィンドウです。
#==============================================================================
class Window_ShopBuy < Window_Selectable
  include RUBY_SYS
  include ChangeSC
  include BM
  include DIAMOND
  
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     shop_goods : 商品
  #--------------------------------------------------------------------------
  alias diamond_initialize initialize
  def initialize(shop_goods)
    
    diamond_initialize(shop_goods)
    
    @draw_item_num = 2     # 一度に描画する数
    @draw_ok = Array.new() # 描画完了フラグ配列
    
  end
  include VDI
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    @item_drawing = false
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @draw_counter = 0
    reset_array
    
    @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
      item.name = transfer(item.name)
    end
    # 項目数が 0 でなければビットマップを作成し、全項目を描画
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      
      draw_item_v
      
    end
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #     index : 項目番号
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    
    if $OuterFlgs["Price_Change_AB"]
      set_root_price(item)
    end
    
    # アイテムの所持数を取得 + 価格取得
    case item
    when RPG::Item
      number = $game_party.item_number(item.id)
      if $game_switches[CH_P_FLG] && PROCEB_ITEM[item.id] != nil
        item.price = PROCEB_ITEM[item.id]
      else
        item.price = $game_system.root_price_items[item.id]
      end
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
      if $game_switches[CH_P_FLG] && PROCEB_WEAPON[item.id] != nil
        item.price = PROCEB_WEAPON[item.id]
      else
        item.price = $game_system.root_price_weapons[item.id]
      end
    when RPG::Armor
      number = $game_party.armor_number(item.id)
      if $game_switches[CH_P_FLG] && PROCEB_ARMOR[item.id] != nil
        item.price = PROCEB_ARMOR[item.id]
      else
        item.price = $game_system.root_price_armors[item.id]
      end
    end
    if item.price == nil
      p "価格がエラってます・・・"
    end
    # 価格が所持金以下、かつ所持数が MAX_HOLD でなければ通常文字色に、
    # そうでなければ無効文字色に設定
    if $OuterFlgs["Max_Hold_Change"]
      max_hold = MAX_HOLD[$game_system.max_hold_value]
    else
      max_hold = DEFAULT_MH
    end
    if item.price <= $game_party.gold and number < max_hold
      root_color = normal_color
      num_color = ITEMCOLOR
      dflag = true
    else
      root_color = disabled_color
      num_color = ITEMDISCL
      dflag = false
    end
    x = 4
    y = index * 32
    rect = Rect.new(x, y, self.width - 32, 32)
    self.contents.fill_rect(rect, NILCOLOR)
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = root_color == normal_color ? MAX8BIT : HARF8BIT
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    
    draw_shadow_text([x + 28, y], item.name, root_color, 0, dflag)
    
    rectr = [x + 240, y, 88, 32]
    if ITEMCLFLG
      root_color = num_color
    end
    change_price = (item.price / $game_system.price_off).to_i
    draw_shadow_text(rectr, change_price.to_s, root_color, 2, dflag)
    self.contents.font.color = normal_color
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end
Window_ShopNumber
#==============================================================================
# ■ 価値観の違いによる価格変動 By 貪藻矢射妥←
#    - Window_ShopNumber plus -
# 
#==============================================================================
# 更新っぽいもの
# 
# 2009:05:07
# ・購入項目に並んでいないものを売却しようとした際、価格が変動しないバグを修正
# 
# 2009:05:08
# ・価格変動(アイテム装備)を併用した際、売却時しか価格の変動に対応して
#  いなかったバグを修正
# 
# 2011:12:08
# ・VX風Vocab対応
# 
# 2016:05:01
# ・価値観の違いによる価格変動の外部フラグ対応

class Game_System
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :shop_value               # 購入/売却用外部変数
end

#==============================================================================
# ■ Scene_Shop
#------------------------------------------------------------------------------
#  ショップ画面の処理を行うクラスです。
#==============================================================================

class Scene_Shop
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_diamond update
  def update
    if $OuterFlgs["Price_Change_I"]
      $game_system.shop_value = @command_window.index
    end
    
    # 元の処理を行う
    update_diamond
  end
end

#==============================================================================
# ■ Window_ShopNumber
#------------------------------------------------------------------------------
#  ショップ画面で、購入または売却するアイテムの個数を入力するウィンドウです。
#==============================================================================

class Window_ShopNumber < Window_Base
  include DIAMOND
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    draw_item_name(@item, 4, 96)
    rectr  = [272, 96, 32, 32]
    rectr2 = [308, 96, 24, 32]
    draw_shadow_text(rectr, "×")
    draw_shadow_text(rectr2, @number.to_s, normal_color, 2)
    self.cursor_rect.set(304, 96, 32, 32)
    # 合計価格と通貨単位を描画
    
    if $OuterFlgs["Price_Change_AB"]
      
      set_root_price(item)
      
      case @item
      when RPG::Item
        if $game_switches[CH_P_FLG] && PROCEB_ITEM[@item.id] != nil
          @price = PROCEB_ITEM[@item.id]
        else
          @price = $game_system.root_price_items[@item.id]
        end
      when RPG::Weapon
        if $game_switches[CH_P_FLG] && PROCEB_WEAPON[@item.id] != nil
          @price = PROCEB_WEAPON[@item.id]
        else
          @price = $game_system.root_price_weapons[@item.id]
        end
      when RPG::Armor
        if $game_switches[CH_P_FLG] && PROCEB_ARMOR[@item.id] != nil
          @price = PROCEB_ARMOR[@item.id]
        else
          @price = $game_system.root_price_armors[@item.id]
        end
      end
      if @price == nil
        p "価格がエラってます・・・"
      end
    end
    
    # 購入か売却かによって変更
    if $OuterFlgs["Price_Change_I"]
      if $game_system.shop_value == 0
        @price /= $game_system.price_off
      else
        @price *= $game_system.premium
      end
    end
    
    if $OuterFlgs["Price_Change_AB"]
      total_price = Integer(@price) * @number
    else
      total_price = @price * @number
    end
    if !KGC::ICMP_HIDE_ZERO_COST || total_price > 0
      domination = Vocab::gold
      cx = contents.text_size(domination).width
      rectr3 = [4, 160, 328-cx-2, 32]
      rectr4 = [332-cx, 160, cx, 32]
      draw_shadow_text(rectr3, total_price.to_s, normal_color, 2)
      draw_shadow_text(rectr4, domination, system_color, 2)
    end
  end
end
カスタマイズポイントについて
PROCEB_ITEM CH_P_FLGがonの場合のアイテムの価格(ハッシュで入力)
PROCEB_WEAPON CH_P_FLGがonの場合の武器の価格(ハッシュで入力)
PROCEB_ARMOR CH_P_FLGがonの場合の防具の価格(ハッシュで入力)
CH_P_FLG 価格を変動させるフラグ
※スイッチじゃなく、変数にすればもっとバリエーションを増やせるハズ

戻る