Project1

标题: 大佬们有没有类似于重装机兵中的物品仓库脚本 [打印本页]

作者: 1114905982    时间: 2020-4-9 09:59
标题: 大佬们有没有类似于重装机兵中的物品仓库脚本
        因为有负重脚本的原因想给游戏里面加一个仓库脚本   
作者: sansy    时间: 2020-4-9 10:00
仓库系统的话这里倒是有一个,不过不知道是不是你要的那种咯
  1. #==============================================================================
  2. # ■ RGSS3 アイテム預かり所 Ver1.03 by 星潟
  3. #------------------------------------------------------------------------------
  4. # アイテムを預ける事が出来るようになります。
  5. # 莫大な数のアイテムが登場する作品におすすめです。
  6. #
  7. # 最大所持数を越える量のアイテムを引き出せないようにする機能や
  8. # 預けられないアイテムの作成、預けられる数の限界設定の他、
  9. # アイテムの預かり?引き出しに関わるイベントコマンドをいくつか実装します。
  10. #
  11. # アイテム?武器?防具のメモ欄に以下のように書き込む事で
  12. # それぞれ特殊な設定が行われます。
  13. #
  14. # <保存禁止>……このアイテムは預かり所で預ける事が出来ません。
  15. #
  16. # <保存制限:20>……このアイテムは預かり所にも20個までしか預ける事が出来ません。
  17. #
  18. # 以下、イベントコマンドです。(全て、スクリプトを用います)
  19. #
  20. # SceneManager.call(Scene_Item_Keep)
  21. # アイテム預かり所画面を呼び出します。
  22. #
  23. # item_keep_all(data_a)
  24. # data_aが0の時……預けられるアイテムを預けられるだけ預けます。
  25. # data_aが1の時……アイテムを全て引き出せるだけ引き出します。
  26. #
  27. # weapon_keep_all(data_a)
  28. # data_aが0の時……預けられる武器を預けられるだけ預けます。
  29. # data_aが1の時……武器を全て引き出せるだけ引き出します。
  30. #
  31. # armor_keep_all(data_a)
  32. # data_aが0の時……預けられる防具を預けられるだけ預けます。
  33. # data_aが1の時……防具を全て引き出せるだけ引き出します。
  34. #
  35. # item_keep(data_a, data_b)
  36. # data_aが0の時……data_bで指定したIDのアイテムを預けられるだけ預けます。
  37. # data_aが1の時……data_bで指定したIDのアイテムを引き出せるだけ引き出します。
  38. #
  39. # weapon_keep(data_a, data_b)
  40. # data_aが0の時……data_bで指定したIDの武器を預けられるだけ預けます。
  41. # data_aが1の時……data_bで指定したIDの武器を引き出せるだけ引き出します。
  42. #
  43. # armor_keep(data_a, data_b)
  44. # data_aが0の時……data_bで指定したIDの防具を預けられるだけ預けます。
  45. # data_aが1の時……data_bで指定したIDの防具を引き出せるだけ引き出します。
  46. #
  47. # word_keep_all(data_a, data_b)
  48. #
  49. # data_aが0の時……
  50. # data_bで指定した言葉がメモ欄に含まれる
  51. # アイテム?武器?防具を預けられるだけ預けます。
  52. #
  53. # data_aが1の時……
  54. # data_bで指定した言葉がメモ欄に含まれる
  55. # アイテム?武器?防具を引き出せるだけ引き出します。
  56. #
  57. # word_keep_allで、data_bで設定する言葉は、前後を""で囲んでください。
  58. # 【例.word_keep_all(1, "回復")】
  59. # この場合、回復という言葉をメモ欄に含んだアイテム?武器?防具を
  60. # 預かり所から全て引き出します。
  61. #------------------------------------------------------------------------------
  62. # Ver1.01 導入前のセーブデータを使用した場合に正常に機能しなくなる不具合を修正。
  63. #         軽量化スクリプトと統合し、軽量化モード切替機能を追加。
  64. #         説明ウィンドウ機能を追加。
  65. #
  66. # Ver1.02 一部機能を更に軽量化。
  67. #         Scene_Shop及び継承しているシーンクラスにおいて
  68. #         買った物を直接預かり所へ送る機能を追加。
  69. #         所持限界数を超えてアイテムを入手した際に
  70. #         自動的に預かり所に送る機能を追加。
  71. #
  72. # Ver1.03 ロード時に更に一部軽量化。
  73. #==============================================================================
  74. module ITEM_KEEPER
  75.   
  76.   #ショップ画面で預かり所への売買機能を付与するかを設定できます。
  77.   
  78.   SHOP      = false
  79.   
  80.   #ショップ画面で預かり所モードへの切り替えボタンを設定できます。
  81.   
  82.   KEY       = :Z
  83.   
  84.   #預かり所モードから所持品モードに切り替えた際のメッセージを設定します。
  85.   
  86.   TEXT1     = "切换到所持有的物品模式"
  87.   
  88.   #所持品モードから預かり所モードに切り替えた際のメッセージを設定します。
  89.   
  90.   TEXT2     = "转换为保存模式"
  91.   
  92.   #モードに切り替え時のSEを設定します。
  93.   #配列内は、名前、音量、ピッチの順に設定して下さい。
  94.   
  95.   SE        = ["Decision3",80,100]
  96.   
  97.   #ショップでの預けている数の項目名を設定します。
  98.   
  99.   SHOP_POS  = "保存数量"
  100.   
  101.   #預かり所モードの際の数字入力幅の増加値を設定します。(3桁以上の入力を考慮)
  102.   
  103.   SHOP_FIG  = 1
  104.   
  105.   #ショップでの預り所への売買機能を無効化する為のスイッチを指定します。
  106.   
  107.   SWITCH1   = 1
  108.   
  109.   #保存禁止アイテムについて、預かり所で表示しないようにするかを設定できます。
  110.   #true 表示しない false 表示する
  111.   
  112.   UNVISIBLE = false
  113.   
  114.   #保存禁止アイテムについて、預かり所で表示しないようにするかを設定できます。
  115.   #true 表示しない false 表示する
  116.   
  117.   WORD1     = "禁止保存"
  118.   
  119.   #保存に個数制限を設ける為の設定用キーワードです。
  120.   
  121.   WORD2     = "保存限制"
  122.   
  123.   #保存制限のないアイテムについていくつまで預けられるかを設定します。
  124.   
  125.   LIMIT     = 999
  126.   
  127.   #所持数を超えて入手したアイテムが自動で預かり所に送られるかどうかを設定します。
  128.   
  129.   AUTOKEEP  = true
  130.   
  131.   #所持数を超えて入手したアイテムが自動で預かり所に送られる機能を
  132.   #一時的に封印するスイッチを指定します。
  133.   
  134.   SWITCH2   = 1000
  135.   
  136.   #説明ウィンドウを表示するかどうかを設定します。
  137.   
  138.   DESCRIPT  = true
  139.   
  140.   #数量ウィンドウと説明ウィンドウの背景透明度を変更します。
  141.   
  142.   B_OPACITY = 255
  143.   
  144.   #軽量化フラグ。
  145.   
  146.   FLAG      = true
  147.   
  148.   #説明ウィンドウに表示する項目を設定します。
  149.   #(基本的にこの部分を変更する必要はありません)
  150.   
  151.   D         = [
  152.   ["下键",":引出一个"],
  153.   ["上键",":保存一个"],
  154.   ["左键",":引出10个"],
  155.   ["右键",":保存10个"],
  156.   ["CTRL键",":引出100个"],
  157.   ["SHIFT键",":保存100个"]
  158.   ]
  159.   
  160. end
  161. class RPG::BaseItem
  162.   #--------------------------------------------------------------------------
  163.   # 保存禁止のフラグ
  164.   #--------------------------------------------------------------------------
  165.   def keep_seal_flag
  166.    
  167.     #キャッシュがある場合はキャッシュを返す。
  168.    
  169.     return @keep_seal_flag if @keep_seal_flag != nil
  170.    
  171.     #データを取得。
  172.    
  173.     @keep_seal_flag = self.note.include?("<" + ITEM_KEEPER::WORD1 + ">") ? true : false
  174.    
  175.     #データを返す。
  176.    
  177.     @keep_seal_flag
  178.   end
  179.   #--------------------------------------------------------------------------
  180.   # 最大保管数を取得
  181.   #--------------------------------------------------------------------------
  182.   def max_item_keep_number
  183.    
  184.     #キャッシュが存在する場合はキャッシュを返す。
  185.    
  186.     return @max_item_keep_number if @max_item_keep_number != nil
  187.    
  188.     #メモ欄からデータを取得し、取得できない場合はデフォルト数を返す。
  189.    
  190.     memo = self.note.scan(/<#{ITEM_KEEPER::WORD2}[::](\S+)>/).flatten
  191.     @max_item_keep_number = memo != nil && !memo.empty? ? memo[0].to_i : ITEM_KEEPER::LIMIT
  192.    
  193.     #データを返す。
  194.    
  195.     @max_item_keep_number
  196.   end
  197. end
  198. class Game_Party < Game_Unit
  199.   #--------------------------------------------------------------------------
  200.   # オブジェクト初期化
  201.   #--------------------------------------------------------------------------
  202.   alias initialize_ik initialize
  203.   def initialize
  204.    
  205.     #本来の処理を実行。
  206.    
  207.     initialize_ik
  208.    
  209.     #パーティー外全アイテムリストを初期化。
  210.    
  211.     init_all_items_ik
  212.   end
  213.   #--------------------------------------------------------------------------
  214.   # パーティー外全アイテムリストの初期化(強制)
  215.   #--------------------------------------------------------------------------
  216.   def init_all_items_ik
  217.    
  218.     #それぞれ、空のハッシュを生成。
  219.    
  220.     @items_k = {}
  221.     @weapons_k = {}
  222.     @armors_k = {}
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # パーティー外全アイテムリストの初期化(nilの場合)
  226.   #--------------------------------------------------------------------------
  227.   def init_all_items_ik_un_nil
  228.    
  229.     #それぞれ、存在しない場合のみハッシュを生成。
  230.    
  231.     @items_k = {} if @items_k == nil
  232.     @weapons_k = {} if @weapons_k == nil
  233.     @armors_k = {} if @armors_k == nil
  234.   end
  235.   #--------------------------------------------------------------------------
  236.   # アイテムの最大保管数取得
  237.   #--------------------------------------------------------------------------
  238.   def max_item_keep_number(item)
  239.    
  240.     #アイテムが存在しない場合はfalseを返す。
  241.    
  242.     return false if item == nil
  243.    
  244.     #アイテムの最大保管数を返す。
  245.    
  246.     item.max_item_keep_number
  247.   end
  248.   #--------------------------------------------------------------------------
  249.   # アイテムの保管数取得
  250.   #--------------------------------------------------------------------------
  251.   def item_keep_number(item)
  252.    
  253.     #コンテナを取得。
  254.    
  255.     container = item_keep_container(item.class)
  256.    
  257.     #コンテナにデータが存在しない場合は0を返す。
  258.    
  259.     container ? container[item.id] || 0 : 0
  260.   end
  261.   #--------------------------------------------------------------------------
  262.   # アイテムの保管
  263.   #--------------------------------------------------------------------------
  264.   def item_keep(item, number, get = false)
  265.    
  266.     #数量データを取得。
  267.    
  268.     number_data = number
  269.    
  270.     #アイテム保管を実行。
  271.    
  272.     item_keep_execute(item, number_data)
  273.    
  274.     #所持アイテムを減らす。
  275.    
  276.     gain_item(item, -number_data) if get == false
  277.   end
  278.   #--------------------------------------------------------------------------
  279.   # 預けているアイテムのクラスに対応するコンテナオブジェクトを取得
  280.   #--------------------------------------------------------------------------
  281.   def item_keep_container(item_class)
  282.    
  283.     #アイテムの種類に応じてコンテナを取得。
  284.    
  285.     return @items_k   if item_class == RPG::Item
  286.     return @weapons_k if item_class == RPG::Weapon
  287.     return @armors_k  if item_class == RPG::Armor
  288.     return nil
  289.   end
  290.   #--------------------------------------------------------------------------
  291.   # アイテムの増加(減少)
  292.   #--------------------------------------------------------------------------
  293.   def item_keep_execute(item, amount)
  294.    
  295.     #コンテナを取得。
  296.    
  297.     container = item_keep_container(item.class)
  298.    
  299.     #コンテナが存在しない場合は処理をしない。
  300.    
  301.     return if container == nil
  302.    
  303.     #処理前の保管数を取得。
  304.    
  305.     last_number = item_keep_number(item)
  306.    
  307.     #処理後の保管数を取得。
  308.    
  309.     new_number = last_number + amount
  310.    
  311.     #保管数を変更する。
  312.    
  313.     container[item.id] = new_number
  314.    
  315.     #保管数が0となった場合はハッシュから削除する。
  316.    
  317.     container.delete(item.id) if container[item.id] == 0
  318.    
  319.     #マップのリフレッシュフラグを立てる。
  320.    
  321.     $game_map.need_refresh = true
  322.   end
  323.   
  324.   #自動倉庫送りが有効な場合のみ変更
  325.   
  326.   if ITEM_KEEPER::AUTOKEEP
  327.    
  328.   #--------------------------------------------------------------------------
  329.   # アイテムの増加(減少)
  330.   #--------------------------------------------------------------------------
  331.   alias gain_item_ik gain_item
  332.   def gain_item(item, amount, include_equip = false)
  333.       
  334.     #自動倉庫送りスイッチが無効もしくは、スイッチがOFFの時で
  335.     #なおかつアイテムが存在し、それが預かり所禁止出ない場合
  336.    
  337.     if (ITEM_KEEPER::SWITCH2 == 0 or !$game_switches[ITEM_KEEPER::SWITCH2]) && (item != nil && !item.keep_seal_flag)
  338.       
  339.       #アイテムコンテナを取得。
  340.       
  341.       container = item_container(item.class)
  342.       
  343.       #アイテムコンテナが存在しない場合は処理を飛ばす。
  344.       
  345.       return unless container
  346.       
  347.       #所持数と入手数の合計値を取得。
  348.       
  349.       ex_amount = item_number(item) + amount
  350.       
  351.       #合計値が最大所持数を上回る場合
  352.       
  353.       if ex_amount > max_item_number(item)
  354.         
  355.         #合計値から最大所持数を引いた値を取得。
  356.         
  357.         data = ex_amount - max_item_number(item)
  358.         
  359.         #倉庫アイテムコンテナを取得。
  360.         
  361.         ik_container = item_keep_container(item.class)
  362.         
  363.         #倉庫アイテムの数を変更する。
  364.         
  365.         ik_container[item.id] = [item_keep_number(item) + data, max_item_keep_number(item)].min
  366.         
  367.         #入手数を減らす。
  368.         
  369.         amount -= data
  370.       end
  371.     end
  372.    
  373.     #本来の処理を実行。
  374.    
  375.     gain_item_ik(item, amount, include_equip)
  376.   end
  377.   
  378.   end
  379. end
  380. class Scene_Load < Scene_File
  381.   #--------------------------------------------------------------------------
  382.   # ロード成功時の処理
  383.   #--------------------------------------------------------------------------
  384.   alias on_load_success_ik on_load_success
  385.   def on_load_success
  386.     $game_party.init_all_items_ik_un_nil
  387.     on_load_success_ik
  388.   end
  389. end
  390. class Scene_Item_Keep < Scene_Item
  391.   #--------------------------------------------------------------------------
  392.   # 開始処理
  393.   #--------------------------------------------------------------------------
  394.   def start
  395.    
  396.     #スーパークラスの処理を実行。
  397.    
  398.     super
  399.    
  400.     #説明ウィンドウの作成
  401.    
  402.     create_description_window
  403.    
  404.     #個数入力ウィンドウの作成
  405.    
  406.     create_number_window
  407.   end
  408.   #--------------------------------------------------------------------------
  409.   # カテゴリウィンドウの作成
  410.   #--------------------------------------------------------------------------
  411.   def create_category_window
  412.     @category_window = Window_ItemCategory.new
  413.     @category_window.viewport = @viewport
  414.     @category_window.help_window = @help_window
  415.     @category_window.y = @help_window.height
  416.     @category_window.set_handler(:ok,     method(:on_category_ok))
  417.     @category_window.set_handler(:cancel, method(:return_scene))
  418.   end
  419.   #--------------------------------------------------------------------------
  420.   # アイテムウィンドウの作成
  421.   #--------------------------------------------------------------------------
  422.   def create_item_window
  423.     wy = @category_window.y + @category_window.height
  424.     wh = Graphics.height - wy
  425.     @item_window = Window_PTItemList.new(0, wy, Graphics.width, wh)
  426.     @item_window.viewport = @viewport
  427.     @item_window.help_window = @help_window
  428.     @item_window.set_handler(:ok,     method(:on_item_ok))
  429.     @item_window.set_handler(:cancel, method(:on_item_cancel))
  430.     @category_window.item_window = @item_window
  431.   end
  432.   #--------------------------------------------------------------------------
  433.   # 説明ウィンドウの作成
  434.   #--------------------------------------------------------------------------
  435.   def create_description_window
  436.    
  437.     #説明ウィンドウを作成しない場合は処理を行わない。
  438.    
  439.     return unless ITEM_KEEPER::DESCRIPT
  440.    
  441.     @description_window = Window_IKDescription.new
  442.     @description_window.z = 100
  443.     @description_window.viewport = @viewport
  444.   end
  445.   #--------------------------------------------------------------------------
  446.   # 個数入力ウィンドウの作成
  447.   #--------------------------------------------------------------------------
  448.   def create_number_window
  449.     @number_window = Window_IKInput.new
  450.     @number_window.z = 100
  451.     @number_window.item_window = @item_window
  452.     @number_window.description_window = @description_window if ITEM_KEEPER::DESCRIPT
  453.     @number_window.viewport = @viewport
  454.   end
  455.   #--------------------------------------------------------------------------
  456.   # カテゴリ[決定]
  457.   #--------------------------------------------------------------------------
  458.   def on_category_ok
  459.     @item_window.activate
  460.     @item_window.select_last
  461.     @category_window.deactivate
  462.   end
  463.   #--------------------------------------------------------------------------
  464.   # アイテム[決定]
  465.   #--------------------------------------------------------------------------
  466.   def on_item_ok
  467.     $game_party.last_item.object = item
  468.     item == nil ? @item_window.activate : determine_item
  469.   end
  470.   #--------------------------------------------------------------------------
  471.   # アイテムの決定
  472.   #--------------------------------------------------------------------------
  473.   def determine_item
  474.     @number_window.number = 0
  475.     item = @item_window.item
  476.     @number_window.show
  477.     @number_window.refresh
  478.     @description_window.show if ITEM_KEEPER::DESCRIPT
  479.     @item_window.deactivate
  480.   end
  481.   #--------------------------------------------------------------------------
  482.   # アイテム[キャンセル]
  483.   #--------------------------------------------------------------------------
  484.   def on_item_cancel
  485.     @item_window.unselect
  486.     @category_window.activate
  487.   end
  488. end
  489. #==============================================================================
  490. # ■ Window_PTItemList
  491. #------------------------------------------------------------------------------
  492. #  アイテム画面で、所持アイテムの一覧を表示するウィンドウです。
  493. #==============================================================================

  494. class Window_PTItemList < Window_ItemList
  495.   #--------------------------------------------------------------------------
  496.   # アイテムをリストに含めるかどうか
  497.   #--------------------------------------------------------------------------
  498.   alias include_ik? include?
  499.   def include?(item)
  500.    
  501.     #アイテムが存在しない場合、ウィンドウが不可視の場合
  502.     #保管禁止アイテムを非表示にする場合は表示しない。
  503.    
  504.     return false if item == nil
  505.     return false if self.visible == false
  506.     return false if ITEM_KEEPER::UNVISIBLE == true && item.keep_seal_flag
  507.    
  508.     #本来の処理を実行。
  509.    
  510.     include_ik?(item)
  511.   end
  512.   #--------------------------------------------------------------------------
  513.   # アイテムを許可状態で表示するかどうか
  514.   #--------------------------------------------------------------------------
  515.   def enable?(item)
  516.    
  517.     #アイテムが存在しない場合、もしくは保管禁止アイテムの場合はfalseを返す。
  518.    
  519.     return false if item == nil
  520.     return false if item.keep_seal_flag
  521.     #return false if @category == :key_item
  522.     return true
  523.   end
  524.   #--------------------------------------------------------------------------
  525.   # アイテムリストの作成
  526.   #--------------------------------------------------------------------------
  527.   def make_item_list
  528.    
  529.     #全ての中から、所持アイテムか倉庫アイテムとして存在する物のみ取得する。
  530.    
  531.     item_data = $data_items + $data_weapons + $data_armors
  532.     @data = item_data.select {|item| include?(item) && ($game_party.item_number(item) > 0 or $game_party.item_keep_number(item) > 0)}
  533.     @data.push(nil) if include?(nil)
  534.   end
  535.   #--------------------------------------------------------------------------
  536.   # 選択項目の有効状態を取得
  537.   #--------------------------------------------------------------------------
  538.   def current_item_enabled?
  539.     enable?(@data[index])
  540.   end
  541.   #--------------------------------------------------------------------------
  542.   # 桁数の取得
  543.   #--------------------------------------------------------------------------
  544.   def col_max
  545.     return 1
  546.   end
  547.   #--------------------------------------------------------------------------
  548.   # フレーム更新
  549.   #--------------------------------------------------------------------------
  550.   def update
  551.     super
  552.   end
  553.   #--------------------------------------------------------------------------
  554.   # 項目の描画
  555.   #--------------------------------------------------------------------------
  556.   def draw_item(index, flag = false)
  557.    
  558.     #データからアイテムを取得し、各種データを記述する。
  559.    
  560.     item = @data[index]
  561.    
  562.     #アイテムが存在しない場合は処理を行わない。
  563.    
  564.     return unless item
  565.    
  566.     rect = item_rect(index)
  567.     contents.clear_rect(rect) if flag
  568.     rect.width -= 4
  569.     draw_item_name(item, rect.x, rect.y, enable?(item))
  570.     change_color(text_color(16))
  571.     draw_text(180, rect.y, 100, line_height, "所持", 2)
  572.     change_color(text_color(0))
  573.     draw_text(220, rect.y, 100, line_height, $game_party.item_number(item), 2)
  574.     draw_text(240, rect.y, 100, line_height,"/", 2)
  575.     draw_text(270, rect.y, 100, line_height, $game_party.max_item_number(item), 2)
  576.     change_color(text_color(16))
  577.     draw_text(330, rect.y, 100, line_height, "仓库", 2)
  578.     change_color(text_color(0))
  579.     draw_text(370, rect.y, 100, line_height, $game_party.item_keep_number(item), 2)
  580.     draw_text(390, rect.y, 100, line_height, "/", 2)
  581.     draw_text(420, rect.y, 100, line_height, $game_party.max_item_keep_number(item), 2)
  582.    
  583.   end
  584. end
  585. class Window_IKInput < Window_Selectable
  586.   #--------------------------------------------------------------------------
  587.   # 公開インスタンス変数
  588.   #--------------------------------------------------------------------------
  589.   attr_accessor   :item_window
  590.   attr_accessor   :number
  591.   attr_accessor   :description_window
  592.   #--------------------------------------------------------------------------
  593.   # オブジェクト初期化
  594.   #--------------------------------------------------------------------------
  595.   def initialize
  596.    
  597.     #ウィンドウを生成する。
  598.    
  599.     super(Graphics.width / 2 - 122, Graphics.height / 2 - 50, 244, 100)
  600.    
  601.     #設定に応じて背景透明度を変更する。
  602.    
  603.     self.back_opacity = ITEM_KEEPER::B_OPACITY
  604.    
  605.     #一旦隠す。
  606.    
  607.     hide
  608.    
  609.     #非アクティブにする。
  610.    
  611.     deactivate
  612.   end
  613.   #--------------------------------------------------------------------------
  614.   # 数字の変更処理
  615.   #--------------------------------------------------------------------------
  616.   def update
  617.    
  618.     #見えない場合は更新しない。
  619.    
  620.     return unless self.visible
  621.    
  622.     #入力関連の各種処理を実行。
  623.    
  624.     if Input.press?(:UP) or Input.press?(:DOWN) or Input.press?(:RIGHT) or Input.press?(:LEFT) or Input.press?(Input::SHIFT) or Input.press?(Input::CTRL)
  625.       if Input.press?(Input::SHIFT)   #100個預ける
  626.         begin
  627.           keep_exe(@item_window.item, 100) unless @item_window.item.key_item?
  628.           Sound.play_buzzer if @item_window.item.key_item?
  629.         rescue
  630.           keep_exe(@item_window.item, 100)
  631.         end
  632.       elsif Input.press?(Input::CTRL) #100個引き出す
  633.         get_exe(@item_window.item, 100)
  634.       elsif Input.repeat?(:RIGHT)     #10個預ける
  635.         begin
  636.           keep_exe(@item_window.item, 10) unless @item_window.item.key_item?
  637.           Sound.play_buzzer if @item_window.item.key_item?
  638.         rescue
  639.           keep_exe(@item_window.item, 100)
  640.         end
  641.       elsif Input.repeat?(:LEFT)      #10個引き出す
  642.         get_exe(@item_window.item, 10)
  643.       elsif Input.repeat?(:UP)        #1個預ける
  644.         begin
  645.           keep_exe(@item_window.item, 1) unless @item_window.item.key_item?
  646.           Sound.play_buzzer if @item_window.item.key_item?
  647.         rescue
  648.           keep_exe(@item_window.item, 1)
  649.         end
  650.       elsif Input.repeat?(:DOWN)      #1個引き出す
  651.         get_exe(@item_window.item, 1)
  652.       end
  653.       refresh_number
  654.     end
  655.     if Input.trigger?(:C)
  656.       
  657.       #決定音を鳴らす。
  658.       
  659.       Sound.play_ok
  660.       
  661.       #数に応じてアイテム数を変更。
  662.       
  663.       $game_party.item_keep(@item_window.item, @number)
  664.       
  665.       #ウィンドウを隠す。
  666.       
  667.       self.hide
  668.       
  669.       #ウィンドウを非アクティブにする。
  670.       
  671.       self.deactivate
  672.       
  673.       #説明ウィンドウが存在する場合、説明ウィンドウを隠す。
  674.       
  675.       @description_window.hide if ITEM_KEEPER::DESCRIPT
  676.       
  677.       #条件に応じてアイテムウィンドウを変更する。
  678.       
  679.       ITEM_KEEPER::FLAG ? @item_window.draw_item(@item_window.index, true) : @item_window.refresh
  680.       
  681.       #アイテムウィンドウをアクティブにする。
  682.       
  683.       @item_window.activate
  684.     elsif Input.trigger?(:B)
  685.       
  686.       #決定音を鳴らす。
  687.       
  688.       Sound.play_cancel
  689.       
  690.       #ウィンドウを隠す。
  691.       
  692.       self.hide
  693.       
  694.       #ウィンドウを非アクティブにする。
  695.       
  696.       self.deactivate
  697.       
  698.       #説明ウィンドウが存在する場合、説明ウィンドウを隠す。
  699.       
  700.       @description_window.hide if ITEM_KEEPER::DESCRIPT
  701.       
  702.       #アイテムウィンドウをアクティブにする。
  703.       
  704.       @item_window.activate
  705.       
  706.     end
  707.   end
  708.   #--------------------------------------------------------------------------
  709.   # 預けられる限界をチェック
  710.   #--------------------------------------------------------------------------
  711.   def limitcheck1
  712.    
  713.     #所持数が既に0、もしくは預ける限界に達している場合はfalseを返す。
  714.    
  715.     return false if $game_party.item_number(@item_window.item) - @number == 0
  716.     return false if $game_party.item_keep_number(@item_window.item) + @number == $game_party.max_item_keep_number(@item_window.item)
  717.     return true
  718.   end
  719.   #--------------------------------------------------------------------------
  720.   # 引き出せる限界をチェック
  721.   #--------------------------------------------------------------------------
  722.   def limitcheck2
  723.    
  724.     #所持数が既に限界に達している場合、もしくは預けている数が0の場合はfalseを返す。
  725.    
  726.     return false if $game_party.item_number(@item_window.item) - @number == $game_party.max_item_number(@item_window.item)
  727.     return false if $game_party.item_keep_number(@item_window.item) + @number == 0
  728.     return true
  729.   end
  730.   #--------------------------------------------------------------------------
  731.   # 預ける
  732.   #--------------------------------------------------------------------------
  733.   def keep_exe(item, amount)
  734.    
  735.     #数量分処理する。
  736.    
  737.     amount.times do
  738.       @number += 1 if limitcheck1
  739.     end
  740.   end
  741.   #--------------------------------------------------------------------------
  742.   # 引き出す
  743.   #--------------------------------------------------------------------------
  744.   def get_exe(item, amount)
  745.    
  746.     #数量分処理する。
  747.    
  748.     amount.times do
  749.       @number -= 1 if limitcheck2
  750.     end
  751.   end
  752.   #--------------------------------------------------------------------------
  753.   # リフレッシュ
  754.   #--------------------------------------------------------------------------
  755.   def refresh
  756.    
  757.     #不可視状態の場合はリフレッシュしない。
  758.    
  759.     return false unless self.visible
  760.    
  761.     #数量を更新する。
  762.    
  763.     @last_number = @number
  764.    
  765.     #ウィンドウの内容を消去する。
  766.    
  767.     contents.clear
  768.     create_contents
  769.         
  770.     #アイテム名を描写。
  771.    
  772.     draw_item_name(@item_window.item, 0, 0)
  773.     change_color(system_color)
  774.     draw_text(0, line_height * 1, 80, line_height, "所持", 1)
  775.     draw_text(self.contents.width - 80, line_height * 1, 80, line_height, "仓库", 1)
  776.     draw_text(0, line_height * 1, self.contents.width, line_height, "→", 1)
  777.     draw_text(0, line_height * 2, self.contents.width, line_height, "←", 1)
  778.    
  779.     #所持数データを描写。
  780.    
  781.     $game_party.item_number(@item_window.item) + @number == $game_party.max_item_number(@item_window.item) ? change_color(text_color(3)) : change_color(normal_color)
  782.     draw_text(0, line_height * 2, 80, line_height, $game_party.item_number(@item_window.item) - @number, 1)
  783.     $game_party.item_keep_number(@item_window.item) + @number == $game_party.max_item_keep_number(@item_window.item) ? change_color(text_color(3)) : change_color(normal_color)
  784.     draw_text(self.contents.width - 80, line_height * 2, 80, line_height, $game_party.item_keep_number(@item_window.item) + @number, 1)
  785.   end
  786.   #--------------------------------------------------------------------------
  787.   # 数量のみリフレッシュ
  788.   #--------------------------------------------------------------------------
  789.   def refresh_number
  790.    
  791.     #不可視状態の場合はリフレッシュしない。
  792.    
  793.     return false unless self.visible
  794.    
  795.     #最後の数量と現在の数量が異なる場合は数量を更新する。
  796.    
  797.     if @last_number != @number
  798.       Sound.play_cursor
  799.       @last_number = @number
  800.     end
  801.    
  802.     #ウィンドウの内容を消去する。
  803.    
  804.     contents.clear_rect(0, line_height * 2, 80, line_height)
  805.     contents.clear_rect(self.contents.width - 80, line_height * 2, 80, line_height)
  806.    
  807.     #所持数データを描写。
  808.    
  809.     $game_party.item_number(@item_window.item) + @number == $game_party.max_item_number(@item_window.item) ? change_color(text_color(3)) : change_color(normal_color)
  810.     draw_text(0, line_height * 2, 80, line_height, $game_party.item_number(@item_window.item) - @number, 1)
  811.     $game_party.item_keep_number(@item_window.item) + @number == $game_party.max_item_keep_number(@item_window.item) ? change_color(text_color(3)) : change_color(normal_color)
  812.     draw_text(self.contents.width - 80, line_height * 2, 80, line_height, $game_party.item_keep_number(@item_window.item) + @number, 1)
  813.   end
  814. end
  815. class Window_IKDescription < Window_Base
  816.   def initialize
  817.    
  818.     #ウィンドウを生成する。
  819.    
  820.     super(Graphics.width / 2 - 240, Graphics.height / 3 * 2, 480, 96)
  821.    
  822.     #設定に応じて背景透明度を変更する。
  823.    
  824.     self.back_opacity = ITEM_KEEPER::B_OPACITY
  825.    
  826.     #システムカラーで項目部分を描画する。
  827.    
  828.     change_color(system_color)
  829.    
  830.     draw_text(0, 0, self.contents.width / 2, line_height, ITEM_KEEPER::D[0][0], 0)
  831.     draw_text(self.contents.width / 2, 0, self.contents.width / 2, line_height, ITEM_KEEPER::D[1][0], 0)
  832.     draw_text(0, line_height * 1, self.contents.width / 2, line_height, ITEM_KEEPER::D[2][0], 0)
  833.     draw_text(self.contents.width / 2, line_height * 1, self.contents.width / 2, line_height, ITEM_KEEPER::D[3][0], 0)
  834.     draw_text(0, line_height * 2, self.contents.width / 2, line_height, ITEM_KEEPER::D[4][0], 0)
  835.     draw_text(self.contents.width / 2, line_height * 2, self.contents.width / 2, line_height, ITEM_KEEPER::D[5][0], 0)

  836.     #通常カラーで項目部分を描画する。
  837.    
  838.     change_color(normal_color)
  839.    
  840.     draw_text(90, 0, self.contents.width / 2, line_height, ITEM_KEEPER::D[0][1], 0)
  841.     draw_text(self.contents.width / 2 + 90, 0, self.contents.width / 2, line_height, ITEM_KEEPER::D[1][1], 0)
  842.     draw_text(90, line_height * 1, self.contents.width / 2, line_height, ITEM_KEEPER::D[2][1], 0)
  843.     draw_text(self.contents.width / 2 + 90, line_height * 1, self.contents.width / 2, line_height, ITEM_KEEPER::D[3][1], 0)
  844.     draw_text(90, line_height * 2, self.contents.width / 2, line_height, ITEM_KEEPER::D[4][1], 0)
  845.     draw_text(self.contents.width / 2 + 90, line_height * 2, self.contents.width / 2, line_height, ITEM_KEEPER::D[5][1], 0)
  846.    
  847.     hide
  848.   end
  849. end
  850. class Game_Interpreter
  851.   #--------------------------------------------------------------------------
  852.   # アイテムを全て預ける/引き出す
  853.   #--------------------------------------------------------------------------
  854.   def item_keep_all(data)
  855.    
  856.     #種類をアイテムとする。
  857.    
  858.     item_data = $data_items
  859.    
  860.     #共通処理を実行。
  861.    
  862.     common_keep_all(item_data, data)
  863.   end
  864.   #--------------------------------------------------------------------------
  865.   # 武器を全て預ける/引き出す
  866.   #--------------------------------------------------------------------------
  867.   def weapon_keep_all(data)
  868.    
  869.     #種類を武器とする。
  870.    
  871.     item_data = $data_weapons
  872.    
  873.     #共通処理を実行。
  874.    
  875.     common_keep_all(item_data, data)
  876.   end
  877.   #--------------------------------------------------------------------------
  878.   # 防具を全て預ける/引き出す
  879.   #--------------------------------------------------------------------------
  880.   def armor_keep_all(data)
  881.    
  882.     #種類を防具とする。
  883.    
  884.     item_data = $data_armors
  885.    
  886.     #共通処理を実行。
  887.    
  888.     common_keep_all(item_data, data)
  889.   end
  890.   #--------------------------------------------------------------------------
  891.   # 全て預ける/引き出す場合の共通処理を実行
  892.   #--------------------------------------------------------------------------
  893.   def common_keep_all(item_data, data)
  894.    
  895.     #存在するオブジェクトの数分だけ処理。
  896.    
  897.     item_data.each do |i|
  898.       
  899.       #nilの場合は処理しない。
  900.       
  901.       next if i == nil
  902.       
  903.       #預けられないアイテムの場合は処理しない。
  904.       
  905.       next if i.keep_seal_flag
  906.       
  907.       #各種データを取得。
  908.       
  909.       data1 = $game_party.item_number(i)
  910.       data2 = $game_party.max_item_number(i)
  911.       data3 = $game_party.item_keep_number(i)
  912.       data4 = $game_party.max_item_keep_number(i)
  913.       
  914.       #追加で所持できる数と、追加で預けられる数を計算。
  915.       
  916.       data5 = data4 - data3
  917.       data6 = data2 - data1
  918.       
  919.       #処理内容に応じて、預ける場合と引き出す場合とをそれぞれ処理。
  920.       
  921.       amount = data == 0 ? (data5 < data1 ? data5 : data1) : (data6 < data3 ? -data6 : -data3)
  922.       $game_party.item_keep(i, amount)
  923.       
  924.     end
  925.   end
  926.   #--------------------------------------------------------------------------
  927.   # アイテムを一定個数預ける/引き出す
  928.   #--------------------------------------------------------------------------
  929.   def item_keep(data_a, data_b)
  930.    
  931.     #種類をアイテムとする。
  932.    
  933.     item_data = $data_items   
  934.    
  935.     #共通処理を実行。
  936.    
  937.     common_keep(item_data, data_a, data_b)
  938.    
  939.   end
  940.   #--------------------------------------------------------------------------
  941.   # 武器を一定個数預ける/引き出す
  942.   #--------------------------------------------------------------------------
  943.   def weapon_keep(data_a, data_b)
  944.    
  945.     #種類を武器とする。
  946.    
  947.     item_data = $data_weapons
  948.    
  949.     #共通処理を実行。
  950.    
  951.     common_keep(item_data, data_a, data_b)
  952.    
  953.   end
  954.   #--------------------------------------------------------------------------
  955.   # 防具を一定個数預ける/引き出す
  956.   #--------------------------------------------------------------------------
  957.   def armor_keep(data_a, data_b)
  958.    
  959.     #種類を防具とする。
  960.    
  961.     item_data = $data_armors
  962.    
  963.     #共通処理を実行。
  964.    
  965.     common_keep(item_data, data_a, data_b)
  966.    
  967.   end
  968.   #--------------------------------------------------------------------------
  969.   # 一定個数預ける/引き出す場合の共通処理を実行します。
  970.   #--------------------------------------------------------------------------
  971.   def common_keep(item_data, data_a, data_b)
  972.       
  973.     #nilの場合は処理しない。
  974.       
  975.     return if item_data[data_b] == nil
  976.       
  977.     #預けられないアイテムの場合は処理しない。
  978.    
  979.     return if item_data[data_b].keep_seal_flag
  980.       
  981.     #各種データを取得。
  982.    
  983.     data1 = $game_party.item_number(item_data[data_b])
  984.     data2 = $game_party.max_item_number(item_data[data_b])
  985.     data3 = $game_party.item_keep_number(item_data[data_b])
  986.     data4 = $game_party.max_item_keep_number(item_data[data_b])
  987.       
  988.     #追加で所持できる数と、追加で預けられる数を計算。
  989.       
  990.     data5 = data4 - data3
  991.     data6 = data2 - data1
  992.    
  993.     #処理内容に応じて、預ける場合と引き出す場合とをそれぞれ処理。
  994.    
  995.     amount = data_a == 0 ? (data5 < data1 ? data5 : data1) : (data6 < data3 ? -data6 : -data3)
  996.     $game_party.item_keep(item_data[data_b], amount)
  997.    
  998.   end
  999.   #--------------------------------------------------------------------------
  1000.   # 特定ワードを含む単語を全て預ける/引き出す場合の処理を行う。
  1001.   #--------------------------------------------------------------------------
  1002.   def word_keep_all(data_a, data_b)
  1003.    
  1004.     #アイテム?武器?防具全てを含める配列を生成。
  1005.    
  1006.     item_data = $data_items + $data_weapons + $data_armors
  1007.    
  1008.     #存在するオブジェクトの数分だけ処理。
  1009.    
  1010.     item_data.each do |i|
  1011.       
  1012.       #nilの場合は処理しない。
  1013.       
  1014.       next if i == nil
  1015.       
  1016.       #預けられないアイテムの場合は処理しない。
  1017.       
  1018.       next if i.keep_seal_flag
  1019.       
  1020.       #指定されたワードがメモ欄に含まれていない場合は処理しない。
  1021.       
  1022.       next unless i.note.include?(data_b)
  1023.       
  1024.       #各種データを取得。
  1025.       
  1026.       data1 = $game_party.item_number(i)
  1027.       data2 = $game_party.max_item_number(i)
  1028.       data3 = $game_party.item_keep_number(i)
  1029.       data4 = $game_party.max_item_keep_number(i)
  1030.       
  1031.       #追加で所持できる数と、追加で預けられる数を計算。
  1032.       
  1033.       data5 = data4 - data3
  1034.       data6 = data2 - data1
  1035.       
  1036.       #処理内容に応じて、預ける場合と引き出す場合とをそれぞれ処理。
  1037.       
  1038.       amount = data_a == 0 ? (data5 < data1 ? data5 : data1) : (data6 < data3 ? -data6 : -data3)
  1039.       $game_party.item_keep(i, amount)
  1040.       
  1041.     end
  1042.   end
  1043. end
  1044. if ITEM_KEEPER::SHOP
  1045. class Game_Party < Game_Unit
  1046.   attr_accessor :shop_ik
  1047.   #--------------------------------------------------------------------------
  1048.   # 預かり所モードかどうかを確認
  1049.   #--------------------------------------------------------------------------
  1050.   def shop_ik?
  1051.     @shop_ik
  1052.   end
  1053.   #--------------------------------------------------------------------------
  1054.   # 全てのアイテムオブジェクトの配列取得
  1055.   #--------------------------------------------------------------------------
  1056.   alias all_items_ik all_items
  1057.   def all_items
  1058.    
  1059.     #預かり所モードでなければ、本来の処理を行う。
  1060.    
  1061.     return all_items_ik unless $game_party.shop_ik?
  1062.    
  1063.     #アイテム?武器?防具の預かり所データを取得し、まとめる。
  1064.    
  1065.     data1 = @items_k.keys.sort.collect {|id| $data_items[id] }
  1066.     data2 = @weapons_k.keys.sort.collect {|id| $data_weapons[id] }
  1067.     data3 = @armors_k.keys.sort.collect {|id| $data_armors[id] }
  1068.     data1 + data2 + data3
  1069.   end
  1070.   #--------------------------------------------------------------------------
  1071.   # アイテムのクラスに対応するコンテナオブジェクトを取得
  1072.   #--------------------------------------------------------------------------
  1073.   alias item_container_ik item_container
  1074.   def item_container(item_class)
  1075.    
  1076.     #預かり所モードでなければ、本来の処理を行う。
  1077.    
  1078.     return item_container_ik(item_class) unless $game_party.shop_ik?
  1079.    
  1080.     #預かり所モードの場合に限り、預かり所データを返す。
  1081.    
  1082.     return @items_k   if item_class == RPG::Item
  1083.     return @weapons_k if item_class == RPG::Weapon
  1084.     return @armors_k  if item_class == RPG::Armor
  1085.     return nil
  1086.   end
  1087.   #--------------------------------------------------------------------------
  1088.   # アイテムの所持数取得
  1089.   #--------------------------------------------------------------------------
  1090.   alias item_number_ik item_number
  1091.   def item_number(item)
  1092.    
  1093.     #預かり所モードでなければ、本来の処理を行う。
  1094.    
  1095.     return item_number_ik(item) unless $game_party.shop_ik?
  1096.    
  1097.     #預かり所のデータを返す。
  1098.    
  1099.     item_keep_number(item)
  1100.   end
  1101.   #--------------------------------------------------------------------------
  1102.   # アイテムの最大所持数取得
  1103.   #--------------------------------------------------------------------------
  1104.   alias max_item_number_ik max_item_number
  1105.   def max_item_number(item)
  1106.    
  1107.     #預かり所モードでなければ、本来の処理を行う。
  1108.    
  1109.     return max_item_number_ik(item) unless $game_party.shop_ik?
  1110.    
  1111.     #預かり所のデータを返す。
  1112.    
  1113.     max_item_keep_number(item)
  1114.   end
  1115. end
  1116. class Scene_Shop < Scene_MenuBase
  1117.   #--------------------------------------------------------------------------
  1118.   # モードチェンジ
  1119.   #--------------------------------------------------------------------------
  1120.   def item_keep_mode_change
  1121.    
  1122.     #ナンバーウィンドウがアクティブの場合は実行しない。
  1123.    
  1124.     return if @number_window.active
  1125.    
  1126.     #指定スイッチのIDが0より大きく、そのスイッチがONの場合は実行しない。
  1127.    
  1128.     return if ITEM_KEEPER::SWITCH1 > 0 && $game_switches[ITEM_KEEPER::SWITCH1]
  1129.    
  1130.     #預かり所フラグを切り替える。
  1131.    
  1132.     $game_party.shop_ik = $game_party.shop_ik? ? false : true
  1133.    
  1134.     #切り替えを示すウィンドウを表示。
  1135.    
  1136.     w = 400
  1137.     h = 48
  1138.     x = (Graphics.width - w) / 2
  1139.     y = (Graphics.height - h) / 2
  1140.     RPG::SE.new(ITEM_KEEPER::SE[0],ITEM_KEEPER::SE[1],ITEM_KEEPER::SE[2]).play
  1141.     @mode_change_window = Window_Base.new(x, y, w, h)
  1142.     @mode_change_window.back_opacity = 255
  1143.     @mode_change_window.z = 10000
  1144.     text = $game_party.shop_ik ? ITEM_KEEPER::TEXT2 : ITEM_KEEPER::TEXT1
  1145.     @mode_change_window.draw_text(0, 0, w - 32, 24, text, 1)
  1146.     60.times {Graphics.update}
  1147.     @mode_change_window.dispose
  1148.     @mode_change_window = nil
  1149.    
  1150.     #各ウィンドウをリフレッシュする。
  1151.    
  1152.     @status_window.refresh
  1153.     @buy_window.refresh
  1154.     @sell_window.refresh
  1155.     @sell_window.index = 0 if @sell_window.active
  1156.     @number_window.refresh
  1157.   end
  1158.   #--------------------------------------------------------------------------
  1159.   # フレーム更新
  1160.   #--------------------------------------------------------------------------
  1161.   alias update_ik update
  1162.   def update
  1163.    
  1164.     #本来の処理を実行。
  1165.    
  1166.     update_ik
  1167.    
  1168.     #指定したキーが押された場合、モードチェンジ実行。
  1169.    
  1170.     item_keep_mode_change if Input.trigger?(ITEM_KEEPER::KEY)
  1171.   end
  1172. end
  1173. class Window_ShopBuy < Window_Selectable
  1174.   #--------------------------------------------------------------------------
  1175.   # アイテムを許可状態で表示するかどうか
  1176.   #--------------------------------------------------------------------------
  1177.   alias enable_ik? enable?
  1178.   def enable?(item)
  1179.    
  1180.     #本来の処理を実行。
  1181.    
  1182.     flag1 = enable_ik?(item)
  1183.    
  1184.     #預かり所モードの場合、預かり所禁止アイテムは購入不可。
  1185.    
  1186.     flag2 = $game_party.shop_ik? ? !item.keep_seal_flag : true
  1187.    
  1188.     #どちらの条件も満たす場合のみ表示。
  1189.    
  1190.     flag1 && flag2
  1191.   end
  1192. end
  1193. class Window_ShopStatus < Window_Base
  1194.   #--------------------------------------------------------------------------
  1195.   # 所持数の描画
  1196.   #--------------------------------------------------------------------------
  1197.   alias draw_possession_ik draw_possession
  1198.   def draw_possession(x, y)
  1199.    
  1200.     #預かり所モードでなければ、本来の処理を行う。
  1201.    
  1202.     return draw_possession_ik(x, y) unless $game_party.shop_ik?
  1203.    
  1204.     #本来の処理を少し改変した物を実行。
  1205.    
  1206.     rect = Rect.new(x, y, contents.width - 4 - x, line_height)
  1207.     change_color(system_color)
  1208.     draw_text(rect, ITEM_KEEPER::SHOP_POS)
  1209.     change_color(normal_color)
  1210.     draw_text(rect, $game_party.item_keep_number(@item), 2)
  1211.   end
  1212. end
  1213. class Window_ShopNumber < Window_Selectable
  1214.   #--------------------------------------------------------------------------
  1215.   # 個数表示の最大桁数を取得
  1216.   #--------------------------------------------------------------------------
  1217.   alias figures_ik figures
  1218.   def figures
  1219.    
  1220.     #3桁以上を考慮して預かり所モードの場合は補正をかける。
  1221.    
  1222.     figures_ik + ($game_party.shop_ik? ? ITEM_KEEPER::SHOP_FIG : 0)
  1223.   end
  1224. end
  1225. class Scene_MenuBase < Scene_Base
  1226.   #--------------------------------------------------------------------------
  1227.   # 終了処理
  1228.   #--------------------------------------------------------------------------
  1229.   alias terminate_ik terminate
  1230.   def terminate
  1231.    
  1232.     #預かり所モードフラグを消去。
  1233.    
  1234.     $game_party.shop_ik = nil
  1235.    
  1236.     #本来の処理を実行。
  1237.    
  1238.     terminate_ik
  1239.   end
  1240. end
  1241. end
复制代码

作者: 刈飒的风    时间: 2020-4-9 16:20
  1. # =============================================================================
  2. # TheoAllen - 仓库系统
  3. # Version : 1.2
  4. # Contact : www.rpgmakerid.com (or) http://theolized.blogspot.com
  5. # (This script is translated by AbsoluteIce)
  6. # =============================================================================
  7. ($imported ||= {})[:Theo_ChestSystem] = true
  8. # =============================================================================
  9. # CHANGE LOGS:
  10. # -----------------------------------------------------------------------------
  11. # 2013.08.19 - Compatibility Patch with Limited Inventory
  12. # 2013.06.28 - Add custom chest name
  13. # 2013.06.01 - Adjust control and GUI
  14. # 2013.05.24 - Finished script
  15. # 2013.05.23 - Started Script
  16. # =============================================================================
  17. =begin

  18.   介绍 :
  19.   本脚本可以设定一个仓库,允许玩家存放或取出物品.

  20.   使用方法 :
  21.   本脚本放在插件脚本之下,main之上

  22.   在使用脚本打开仓库前,使用以下事件注释:
  23.   <item: id, 数量>
  24.   <weapon: id, 数量>
  25.   <armor: id, 数量>

  26.   解释 :
  27.   id >> 物品/武器/护甲id
  28.   数量 >> 数量多少

  29.   使用以上注释后, 使用脚本 :
  30.   open_chest

  31.   对于自定义名称的仓库, 则可以 :
  32.   open_chest("小仓库")
  33.   open_chest("Eric的宝箱")

  34.   注意 : 所有事件中的所有注释都会读取一次,请确保在使用脚本之前使用了注释。

  35.   使用规定 :
  36.   属名脚本作者, TheoAllen. 你可以自由编辑此脚本,只要你不声明你是脚本的原作者
  37.   如果你想用此脚本于商业游戏,请和我共享收益.别忘了给我一份免费的游戏拷贝.

  38. =end
  39. # =============================================================================
  40. # 设定 :
  41. # =============================================================================
  42. module THEO
  43.   module CHEST
  44.     # =========================================================================
  45.     # Vocabs
  46.     # -------------------------------------------------------------------------
  47.       AMOUNT_VOCAB  = "数量 :"       # 数量.
  48.       ALL_VOCAB     = "全部"         # 全部类别.
  49.       INV_VOCAB     = "背包"         # 背包.
  50.       ST_VOCAB      = "库存"         # 库存.
  51.     # =========================================================================
  52.    
  53.     # =========================================================================
  54.       TRIGGER_GAIN_ALL  = :CTRL
  55.     # -------------------------------------------------------------------------
  56.     # 全部取出的按钮. 如果你设定为 :CTRL, 则在玩家按下CTRL和确定键 (z)后会取出
  57.     # 全部物品
  58.     # =========================================================================
  59.    
  60.     # =========================================================================
  61.       SHOW_AMOUNT_MIN   = 10
  62.     # -------------------------------------------------------------------------
  63.     # 显示窗口数量的最小值.
  64.     # =========================================================================
  65.    
  66.   end
  67. end
  68. # =============================================================================
  69. # 设定结束 (除非清除你在干什么,否则以下内容勿动)
  70. # =============================================================================
  71. module THEO
  72.   module CHEST
  73.   module REGEXP
  74.    
  75.     ITEM_REGEX   = /<(?:ITEM|item):[ ]*[ ]*(\d+\s*,\s*\d*)>/i
  76.     WEAPON_REGEX = /<(?:WEAPON|weapon):[ ]*[ ]*(\d+\s*,\s*\d*)>/i
  77.     ARMOR_REGEX  = /<(?:ARMOR|armor):[ ]*[ ]*(\d+\s*,\s*\d*)>/i
  78.    
  79.   end
  80.   end
  81. end

  82. class Scene_Chest < Scene_MenuBase
  83.   
  84.   include THEO::CHEST
  85.   
  86.   def initialize(key,st_vocab)
  87.     $game_party.init_chest_cursors
  88.     @last_active = :stash
  89.     @key = key
  90.     @st_vocab = st_vocab
  91.   end
  92.   
  93.   def start
  94.     super
  95.     create_header_windows
  96.     create_footer_window
  97.     create_main_windows
  98.     create_amount_window
  99.     prepare
  100.   end
  101.   
  102.   def create_header_windows
  103.     create_help_window
  104.     create_category_window
  105.   end
  106.   
  107.   def create_main_windows
  108.     create_inventory_window
  109.     create_stash_window
  110.   end
  111.   
  112.   def create_help_window
  113.     @help = Window_Help.new
  114.     @help.viewport = @viewport
  115.   end
  116.   
  117.   def create_category_window
  118.     @category = Window_ChestCategory.new
  119.     @category.viewport = @viewport
  120.     @category.y = @help.height
  121.     @category.set_handler(:ok, method(:on_category_ok))
  122.     @category.set_handler(:cancel, method(:return_scene))
  123.   end
  124.   
  125.   def create_footer_window
  126.     create_inv_footer
  127.     create_st_footer
  128.   end
  129.   
  130.   def create_inv_footer
  131.     if $imported[:Theo_LimInventory]
  132.       x = 0
  133.       y = Graphics.height - 48
  134.       w = Graphics.width/2
  135.       @inv_footer = Window_ChestFreeSlot.new(x,y,w)
  136.       @inv_footer.viewport = @viewport
  137.     else
  138.       @inv_footer = Window_ChestFooter.new(INV_VOCAB,$game_party,0)
  139.       @inv_footer.viewport = @viewport
  140.     end
  141.   end
  142.   
  143.   def create_st_footer
  144.     @st_footer = Window_ChestFooter.new(@st_vocab,$game_chests[@key],1)
  145.     @st_footer.viewport = @viewport
  146.   end
  147.   
  148.   def create_inventory_window
  149.     x = 0
  150.     y = @help.height + @category.height
  151.     w = Graphics.width/2
  152.     h = Graphics.height - y - @inv_footer.height
  153.     @inventory = Window_Inventory.new(x,y,w,h)
  154.     @inventory.viewport = @viewport
  155.     @inventory.set_handler(:ok, method(:item_inventory_ok))
  156.     @inventory.set_handler(:cancel, method(:on_inventory_cancel))
  157.     @inventory.help_window = @help
  158.     @category.item_window = @inventory
  159.   end
  160.   
  161.   def create_stash_window
  162.     x = Graphics.width / 2
  163.     y = @inventory.y
  164.     w = x
  165.     h = @inventory.height
  166.     @stash = Window_Stash.new(x,y,w,h,@key)
  167.     @stash.viewport = @viewport
  168.     @stash.set_handler(:ok, method(:item_stash_ok))
  169.     @stash.set_handler(:cancel, method(:on_stash_cancel))
  170.     @stash.help_window = @help
  171.     @category.stash_window = @stash
  172.   end
  173.   
  174.   def create_amount_window
  175.     @amount = Window_ChestAmount.new
  176.     @amount.viewport = @viewport
  177.     @amount.inv_window = @inv_footer if $imported[:Theo_LimInventory]
  178.   end
  179.   
  180.   # for future plan ~
  181.   def refresh_all_footers
  182.     @inv_footer.refresh
  183.     @st_footer.refresh
  184.   end
  185.   
  186.   def prepare
  187.     unselect_all
  188.     @category.show
  189.     @category.activate
  190.     @item_phase = false
  191.     deactivate_item_windows
  192.     hide_amount
  193.   end
  194.   
  195.   def deactivate_item_windows
  196.     @inventory.deactivate
  197.     @stash.deactivate
  198.   end
  199.   
  200.   def on_category_ok
  201.     @category.deactivate
  202.     activate_itemlist
  203.     @item_phase = true
  204.   end
  205.   
  206.   def item_inventory_ok
  207.     unless @inventory.item
  208.       @inventory.activate
  209.       return
  210.     end
  211.     if @inventory.item_number < SHOW_AMOUNT_MIN
  212.       store_items(1)
  213.       @inventory.activate
  214.       refresh_itemlist
  215.     else
  216.       @last_active = :inventory
  217.       input_amount(@inventory)
  218.     end
  219.   end
  220.   
  221.   def item_stash_ok
  222.     unless @stash.item
  223.       @stash.activate
  224.       return
  225.     end
  226.     if @stash.item_number < SHOW_AMOUNT_MIN
  227.       gain_items(1)
  228.       @stash.activate
  229.       refresh_itemlist
  230.     else
  231.       @last_active = :stash
  232.       input_amount(@stash)
  233.     end
  234.   end
  235.   
  236.   def on_stash_cancel
  237.     @last_active = :stash
  238.     memorize_st
  239.     prepare
  240.   end
  241.   
  242.   def on_inventory_cancel
  243.     @last_active = :inventory
  244.     memorize_inv
  245.     prepare
  246.   end
  247.   
  248.   def input_amount(window)
  249.     memorize_all
  250.     if window.equal?(@stash)
  251.       @inventory.unselect
  252.     else
  253.       @stash.unselect
  254.     end
  255.     @amount.open
  256.     @amount.item_window = window
  257.     deactivate_item_windows
  258.   end
  259.   
  260.   def hide_amount
  261.     Sound.play_cancel
  262.     @amount.close
  263.     @amount.reset_amount
  264.   end
  265.   
  266.   def update
  267.     super
  268.     @amount.mode = @last_active
  269.     @inv_footer.mode = @last_active if $imported[:Theo_LimInventory]
  270.     select_item_phase if @item_phase
  271.     input_amount_phase if @amount.open?
  272.   end
  273.   
  274.   def select_item_phase
  275.     gain_all_items if trigger_gain_all_item?
  276.     switch_window if Input.repeat?(:RIGHT) || Input.repeat?(:LEFT)
  277.   end
  278.   
  279.   def input_amount_phase
  280.     activate_itemlist if Input.trigger?(:B)
  281.     if @amount.item_window.equal?(@stash) && Input.trigger?(:C)
  282.       gain_items(@amount.amount)
  283.     elsif @amount.item_window.equal?(@inventory) && Input.trigger?(:C)
  284.       store_items(@amount.amount)
  285.     end
  286.   end
  287.   
  288.   def switch_window
  289.     if @inventory.active
  290.       switch_stash
  291.     elsif @stash.active
  292.       switch_inventory
  293.     end
  294.   end
  295.   
  296.   def switch_inventory
  297.     memorize_st
  298.     @stash.deactivate
  299.     @stash.unselect
  300.     @inventory.activate
  301.     inv_select
  302.   end
  303.   
  304.   def switch_stash
  305.     @stash.activate
  306.     st_select
  307.     memorize_inv
  308.     @inventory.deactivate
  309.     @inventory.unselect
  310.   end
  311.   
  312.   def gain_all_items
  313.     if @stash.active
  314.       @stash.data.each do |item|
  315.         gain_items(@stash.item_number(item),item)
  316.       end
  317.       @stash.select(0)
  318.     else
  319.       @inventory.data.each do |item|
  320.         store_items(@inventory.item_number(item),item)
  321.       end
  322.       @inventory.select(0)
  323.     end
  324.     refresh_itemlist
  325.     refresh_all_footers
  326.   end
  327.   
  328.   def trigger_gain_all_item?
  329.     Input.press?(THEO::CHEST::TRIGGER_GAIN_ALL) && Input.trigger?(:C)
  330.   end
  331.   
  332.   def gain_items(amount, item = @stash.item)
  333.     if $imported[:Theo_LimInventory]
  334.       amount = [[amount,0].max,$game_party.inv_max_item(item)].min
  335.     end
  336.     $game_party.gain_item(item,amount)
  337.     $game_chests[@key].lose_item(item,amount)
  338.     on_amount_confirm if @amount.open?
  339.   end
  340.   
  341.   def store_items(amount, item = @inventory.item)
  342.     $game_chests[@key].gain_item(item,amount)
  343.     $game_party.lose_item(item,amount)
  344.     on_amount_confirm if @amount.open?
  345.   end
  346.   
  347.   def refresh_itemlist
  348.     @stash.refresh   
  349.     @inventory.refresh
  350.   end
  351.   
  352.   def on_amount_confirm
  353.     Sound.play_ok
  354.     refresh_itemlist
  355.     unselect_all
  356.     activate_itemlist
  357.   end
  358.   
  359.   def activate_itemlist
  360.     hide_amount
  361.     case @last_active
  362.     when :stash
  363.       activate_stash
  364.     when :inventory
  365.       activate_inventory
  366.     end
  367.     @item_phase = true
  368.   end
  369.   
  370.   def activate_inventory
  371.     @inventory.activate
  372.     @stash.unselect
  373.     inv_select
  374.   end
  375.   
  376.   def activate_stash
  377.     @stash.activate
  378.     @inventory.unselect
  379.     st_select
  380.   end
  381.   
  382.   def memorize_inv
  383.     $game_party.last_inv = @inventory.index
  384.   end
  385.   
  386.   def memorize_st
  387.     $game_party.last_st = @stash.index
  388.   end
  389.   
  390.   def inv_select
  391.     @inventory.index = [[$game_party.last_inv,@inventory.item_max-1].min,0].max
  392.   end
  393.   
  394.   def st_select
  395.     @stash.index = [[$game_party.last_st,@stash.item_max-1].min,0].max
  396.   end
  397.   
  398.   def unselect_all
  399.     @inventory.unselect
  400.     @stash.unselect
  401.   end
  402.   
  403.   def memorize_all
  404.     memorize_inv
  405.     memorize_st
  406.   end
  407.   
  408. end

  409. if $imported[:Theo_LimInventory]
  410. class Window_ChestFreeSlot < Window_FreeSlot
  411.   attr_accessor :item
  412.   attr_accessor :mode
  413.   
  414.   def initialize(x,y,w)
  415.     @add_number = 0
  416.     @mode = :stash
  417.     super(x,y,w)
  418.   end
  419.   
  420.   def add_number=(number)
  421.     temp = @add_number
  422.     @add_number = number
  423.     refresh if temp != number
  424.   end
  425.   
  426.   def draw_inv_slot(x,y,width = contents.width,align = 2)
  427.     item_size = @item.nil? ? 0 : @item.inv_size
  428.     item_size = -item_size if @mode == :inventory
  429.     txt = sprintf("%d/%d",$game_party.total_inv_size + @add_number *
  430.     item_size, $game_party.inv_max)
  431.     color = Theo::LimInv::NearMaxed_Color
  432.     near_max = ($game_party.total_inv_size + @add_number * item_size).to_f /
  433.       $game_party.inv_max >= (100 - Theo::LimInv::NearMaxed_Percent)/100.0
  434.     if near_max
  435.       change_color(text_color(color))
  436.     else
  437.       change_color(normal_color)
  438.     end
  439.     draw_text(x,y,width,line_height,txt,align)
  440.     change_color(normal_color)
  441.   end
  442.   
  443. end
  444. end

  445. class Window_ChestCategory < Window_ItemCategory
  446.   attr_reader :stash_window
  447.   
  448.   def col_max
  449.     return 4
  450.   end
  451.   
  452.   def update
  453.     super
  454.     @stash_window.category = current_symbol if @stash_window
  455.   end
  456.   
  457.   def make_command_list
  458.     add_command(THEO::CHEST::ALL_VOCAB, :all)
  459.     add_command(Vocab::item,     :item)
  460.     add_command(Vocab::weapon,   :weapon)
  461.     add_command(Vocab::armor,    :armor)
  462.   end
  463.   
  464.   def stash_window=(stash_window)
  465.     @stash_window = stash_window
  466.     update
  467.   end
  468.   
  469. end

  470. class Window_Inventory < Window_ItemList
  471.   attr_reader :data
  472.   
  473.   def col_max
  474.     return 1
  475.   end
  476.   
  477.   def current_item_enabled?
  478.     return true
  479.   end
  480.   
  481.   def include?(item)
  482.     case @category
  483.     when :item
  484.       item.is_a?(RPG::Item) && !item.key_item?
  485.     when :weapon
  486.       item.is_a?(RPG::Weapon)
  487.     when :armor
  488.       item.is_a?(RPG::Armor)
  489.     when :all
  490.       item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon) || item.is_a?(RPG::Item)
  491.     else
  492.       false
  493.     end
  494.   end
  495.   
  496.   def draw_item(index)
  497.     item = @data[index]
  498.     if item
  499.       rect = item_rect(index)
  500.       rect.width -= 4
  501.       draw_item_name(item, rect.x, rect.y, true,contents.width)
  502.       draw_item_number(rect, item)
  503.     end
  504.   end
  505.   
  506.   def item_number(item = @data[index])
  507.     $game_party.item_number(item)
  508.   end
  509.   
  510.   def process_ok
  511.     return if Input.press?(THEO::CHEST::TRIGGER_GAIN_ALL)
  512.     super
  513.   end
  514.   
  515. end

  516. class Window_Stash < Window_ItemList
  517.   attr_reader :data
  518.   
  519.   def initialize(x, y, width, height, key)
  520.     @key = key
  521.     super(x,y,width,height)
  522.     @category = :none
  523.     @data = []
  524.   end
  525.   
  526.   def col_max
  527.     return 1
  528.   end
  529.   
  530.   def current_item_enabled?
  531.     enable?(item)
  532.   end
  533.   
  534.   def enable?(item)
  535.     return true unless $imported[:Theo_LimInventory]
  536.     return $game_party.inv_max_item(item) > 0
  537.   end
  538.   
  539.   def include?(item)
  540.     case @category
  541.     when :item
  542.       item.is_a?(RPG::Item) && !item.key_item?
  543.     when :weapon
  544.       item.is_a?(RPG::Weapon)
  545.     when :armor
  546.       item.is_a?(RPG::Armor)
  547.     when :all
  548.       item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon) || item.is_a?(RPG::Item)
  549.     else
  550.       false
  551.     end
  552.   end
  553.   
  554.   def make_item_list
  555.     @data = $game_chests[@key].all_items.select {|item| include?(item) }
  556.     @data.push(nil) if include?(nil)
  557.   end
  558.   
  559.   def draw_item(index)
  560.     item = @data[index]
  561.     if item
  562.       rect = item_rect(index)
  563.       rect.width -= 4
  564.       draw_item_name(item, rect.x, rect.y, enable?(item),contents.width)
  565.       draw_item_number(rect, item)
  566.     end
  567.   end
  568.   
  569.   def draw_item_number(rect, item)
  570.     draw_text(rect, sprintf(":%2d", $game_chests[@key].item_number(item)), 2)
  571.   end
  572.   
  573.   def item_number(item = @data[index])
  574.     $game_chests[@key].item_number(item)
  575.   end
  576.   
  577.   def process_ok
  578.     return if Input.press?(THEO::CHEST::TRIGGER_GAIN_ALL)
  579.     super
  580.   end
  581.   
  582. end

  583. class Window_ChestAmount < Window_Base  
  584.   attr_accessor :item_window
  585.   attr_accessor :mode
  586.   attr_reader   :amount
  587.   
  588.   def initialize
  589.     super(0,0,window_width,window_height)
  590.     self.openness = 0
  591.     @mode = :stash
  592.     reset_amount
  593.     update_position
  594.     refresh
  595.   end
  596.   
  597.   def inv_window=(window)
  598.     @inv_window = window
  599.   end
  600.   
  601.   def reset_amount
  602.     @amount = 0
  603.     refresh
  604.   end
  605.   
  606.   def open
  607.     super
  608.     reset_amount
  609.   end
  610.   
  611.   def update_position
  612.     self.x = (Graphics.width / 2) - (self.width / 2)
  613.     self.y = (Graphics.height / 2) - (self.height / 2)
  614.   end
  615.   
  616.   def refresh
  617.     contents.clear
  618.     draw_text(0,0,contents.width,24,THEO::CHEST::AMOUNT_VOCAB,)
  619.     draw_text(0,0,contents.width,24,@amount,2)
  620.   end
  621.   
  622.   def window_width
  623.     return 200
  624.   end
  625.   
  626.   def window_height
  627.     return 24+24
  628.   end
  629.   
  630.   def update
  631.     super
  632.     if @inv_window
  633.       @inv_window.add_number = @amount
  634.       @inv_window.item = @item_window.item if @item_window
  635.     end
  636.     if open?
  637.       increment if Input.repeat?(:RIGHT)
  638.       decrement if Input.repeat?(:LEFT)
  639.       ten_increment if Input.repeat?(:UP)
  640.       ten_decrement if Input.repeat?(:DOWN)
  641.     end
  642.   end
  643.   
  644.   def increment
  645.     change_amount(1)
  646.   end
  647.   
  648.   def decrement
  649.     change_amount(-1)
  650.   end
  651.   
  652.   def ten_increment
  653.     change_amount(10)
  654.   end
  655.   
  656.   def ten_decrement
  657.     change_amount(-10)
  658.   end
  659.   
  660.   def change_amount(modifier)
  661.     @amount = [[@amount+modifier,0].max,max_amount].min
  662.     refresh
  663.   end
  664.   
  665.   def show
  666.     super
  667.     reset_amount
  668.   end
  669.   
  670.   def max_amount
  671.     if $imported[:Theo_LimInventory]
  672.       if @mode == :inventory
  673.         @item_window.item_number rescue 0
  674.       elsif @mode == :stash
  675.         [@item_window.item_number,$game_party.inv_max_item(@item_window.item)].min
  676.       end
  677.     else
  678.       @item_window.item_number rescue 0
  679.     end
  680.   end
  681.   
  682. end

  683. class Window_ChestFooter < Window_Base
  684.   
  685.   include THEO::CHEST
  686.   
  687.   def initialize(vocab,object,x)
  688.     w = Graphics.width/2
  689.     h = fitting_height(1)
  690.     y = Graphics.height - h
  691.     x = (Graphics.width/2) * x
  692.     @vocab = vocab
  693.     super(x,y,w,h)
  694.     @object = object
  695.     refresh
  696.   end
  697.   
  698.   def refresh
  699.     contents.clear
  700.     cx = text_size(@vocab).width
  701.     draw_text(0,0,contents.width,line_height,@vocab,1)
  702.   end
  703.   
  704. end

  705. module DataManager
  706.   
  707.   class << self
  708.     alias pre_create_chest create_game_objects
  709.     alias pre_chest_save_contents make_save_contents
  710.     alias pre_extract_chests extract_save_contents
  711.   end
  712.   
  713.   def self.create_game_objects
  714.     pre_create_chest
  715.     create_chest_object
  716.   end
  717.   
  718.   def self.create_chest_object
  719.     $game_chests = Game_Chest.new
  720.   end
  721.   
  722.   def self.make_save_contents
  723.     contents = pre_chest_save_contents
  724.     contents[:chest] = $game_chests
  725.     contents
  726.   end
  727.   
  728.   def extract_save_contents(contents)
  729.     pre_extract_chests(contents)
  730.     $game_chests = contents[:chest]
  731.   end
  732.   
  733. end

  734. class Game_Chest
  735.   
  736.   def initialize
  737.     @data = {}
  738.     @explored = {}
  739.   end
  740.   
  741.   def[](key)
  742.     (@data[key] ||= Game_Stash.new)
  743.   end
  744.   
  745.   def explored
  746.     @explored
  747.   end
  748.   
  749. end

  750. class Game_Stash
  751.   attr_accessor :items_stash
  752.   attr_accessor :weapons_stash
  753.   attr_accessor :armors_stash
  754.   
  755.   def initialize
  756.     @items_stash = {}
  757.     @weapons_stash = {}
  758.     @armors_stash = {}
  759.   end
  760.   
  761.   def refresh
  762.     evaluate(@items_stash)
  763.     evaluate(@weapons_stash)
  764.     evaluate(@armors_stash)
  765.   end
  766.   
  767.   def evaluate(stash)
  768.     stash.keys.each do |key|
  769.       stash.delete(key) if stash[key] <= 0
  770.     end
  771.   end
  772.   
  773.   def items
  774.     @items_stash.keys.collect {|id| $data_items[id] }
  775.   end
  776.   
  777.   def weapons
  778.     @weapons_stash.keys.collect {|id| $data_weapons[id] }
  779.   end
  780.   
  781.   def armors
  782.     @armors_stash.keys.collect {|id| $data_armors[id] }
  783.   end
  784.   
  785.   def all_items
  786.     items + weapons + armors
  787.   end
  788.   
  789.   def item_number(item)
  790.     if item.is_a?(RPG::Item)
  791.       return @items_stash[item.id] ||= 0
  792.     elsif item.is_a?(RPG::Weapon)
  793.       return @weapons_stash[item.id] ||= 0
  794.     elsif item.is_a?(RPG::Armor)
  795.       return @armors_stash[item.id] ||= 0
  796.     end
  797.     refresh
  798.   end
  799.   
  800.   def gain_item(item, amount)
  801.     return unless item
  802.     stash = pick_stash(item)
  803.     stash[item.id] = 0 if stash[item.id].nil?
  804.     stash[item.id] += amount
  805.     refresh
  806.   end
  807.   
  808.   def lose_item(item,amount)
  809.     gain_item(item,-amount)
  810.   end
  811.   
  812.   def pick_stash(item)
  813.     if item.is_a?(RPG::Item)
  814.       return @items_stash
  815.     elsif item.is_a?(RPG::Weapon)
  816.       return @weapons_stash
  817.     elsif item.is_a?(RPG::Armor)
  818.       return @armors_stash
  819.     end
  820.   end
  821.   
  822. end

  823. class Game_Party
  824.   attr_accessor :last_inv
  825.   attr_accessor :last_st
  826.   
  827.   alias pre_chest_init initialize
  828.   def initialize
  829.     pre_chest_init
  830.     init_chest_cursors
  831.   end
  832.   
  833.   def init_chest_cursors
  834.     @last_inv   = 0
  835.     @last_st = 0
  836.   end
  837.   
  838. end

  839. class Game_Interpreter
  840.   
  841.   def open_chest(st_vocab = THEO::CHEST::ST_VOCAB,key = [@map_id,@event_id])
  842.     if st_vocab.is_a?(Numeric)
  843.       key = st_vocab
  844.       st_vocab = THEO::CHEST::ST_VOCAB
  845.     end
  846.     SceneManager.call_chest(key,st_vocab)
  847.   end
  848.   
  849.   alias pre_chest_command_108 command_108
  850.   def command_108
  851.     pre_chest_command_108
  852.     read_chest_comments
  853.   end
  854.   
  855.   def read_chest_comments
  856.     map = @map_id
  857.     event = @event_id
  858.     key = [map,event]
  859.     return if $game_chests.explored[key]
  860.     @comments.each do |comment|
  861.       case comment
  862.       when THEO::CHEST::REGEXP::ITEM_REGEX
  863.         x = $1.scan(/\d+/)
  864.         $game_chests[key].items_stash[x[0].to_i] = x[1].to_i
  865.       when THEO::CHEST::REGEXP::WEAPON_REGEX
  866.         x = $1.scan(/\d+/)
  867.         $game_chests[key].weapons_stash[x[0].to_i] = x[1].to_i
  868.       when THEO::CHEST::REGEXP::ARMOR_REGEX
  869.         x = $1.scan(/\d+/)
  870.         $game_chests[key].armors_stash[x[0].to_i] = x[1].to_i
  871.       end
  872.     end
  873.     $game_chests.explored[key] = next_event_code != 108
  874.   end
  875.   
  876. end

  877. module SceneManager
  878.   
  879.   def self.call_chest(key,st_vocab = THEO::CHEST::ST_VOCAB)
  880.     @stack.push(@scene)
  881.     @scene = Scene_Chest.new(key,st_vocab)
  882.   end
  883.   
  884. end
复制代码

作者: 1114905982    时间: 2020-4-10 01:02
刈飒的风 发表于 2020-4-9 16:20

谢谢大佬   
作者: 老子降临    时间: 2020-6-20 22:13
刈飒的风 发表于 2020-4-9 16:20

恩,想知道,这个如何创建一个仓库呢?我是说加入这个脚本后,游戏里是怎么实现??
作者: samnle    时间: 2021-3-8 20:50
我也想知道下VA的
作者: 未来灬future    时间: 2021-3-9 18:12
脚本第30至45行有写,应该是那个
作者: djs789783    时间: 2024-3-10 20:29
好用,给力,谢谢,么么哒爱你哟
作者: 重装爱好者    时间: 2024-3-22 22:48
新人问一下,这个脚本怎么用?
作者: 寂寞的青椒    时间: 2024-4-25 02:05
重装爱好者 发表于 2024-3-22 22:48
新人问一下,这个脚本怎么用?

点击上面的复制  然后VA编辑器里找到脚本的按钮  在Main前插入就行
作者: 1647736109    时间: 2024-10-15 15:59
老子降临 发表于 2020-6-20 22:13
恩,想知道,这个如何创建一个仓库呢?我是说加入这个脚本后,游戏里是怎么实现?? ...

解决了吗大佬我也想知道怎么创建这个脚本
作者: 飞飞12    时间: 2024-11-25 22:24
寂寞的青椒 发表于 2024-4-25 02:05
点击上面的复制  然后VA编辑器里找到脚本的按钮  在Main前插入就行

你好我想问一下那个main是什么




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1