设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索

道具仓库的脚本出错

查看数: 1145 | 评论数: 3 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2014-9-16 17:56

正文摘要:

之前翻到了一个道具仓库的脚本,但是不知道为什么用不了... →_→求哪里出问题了....那个范例还可以用....复制过来就用不了了。 RUBY 代码复制#====================================== ...

回复

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

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

点评

天了噜!居然还有重启就能解决的脚本报错!  发表于 2014-9-17 22:19
1491968808 发表于 2014-9-16 18:07:21
我不會腳本,我一般都是把出錯的那一段刪掉的

点评

.....真是简单粗暴啊  发表于 2014-9-16 18:09
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-23 04:36

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表