#============================================================================== # ■ VXAce-RGSS3-34 解体屋[ウィンドウ] by Claimh #============================================================================== module Dismantle # メッセージタイプ module MesCmd M_S_C = 0 # 調合成功 M_N_P = 10 # お金足りない M_N_N = 12 # アイテムいっぱい end # ● 解体アイテム情報クラス class Item attr_reader :num def initialize(data) @id = data[0] @num = data[1] end def obj $data_items[@id] end def pt_num $game_party.item_number(obj) end def gain(n) $game_party.gain_item(obj, @num * n) end end # ● 解体アイテム情報クラス class Dismantle attr_reader :items attr_reader :cost attr_reader :enable def initialize(id, data) @id = id @cost = data[id][0] @items = data[id][1].collect {|item| Item.new(item)} @enable = enable? end def num $game_party.item_number(obj) end def lose(n) $game_party.lose_item(obj, n) end def enable?(n=1) return false unless price?(n) !@items.any? {|item| (item.pt_num + (item.num * n)) > $game_party.max_item_number(item.obj) } end def price?(n=1) ($game_party.gold >= (@cost*n)) end def message price? ? MesCmd::M_N_N : MesCmd::M_N_P end def max_num return 0 unless @enable n = self.num for i in 1..n return (i-1) unless enable?(i) end return n end end # ● 解体アイテム情報クラス(武器) class Weapon < Dismantle def initialize(id) super(id, WEAPON) end def obj $data_weapons[@id] end end # ● 解体アイテム情報クラス(防具) class Armor < Dismantle def initialize(id) super(id, ARMOR) end def obj $data_armors[@id] end end end #============================================================================== # ■ Window_DismantleCmd #============================================================================== class Window_DismantleCmd < Window_HorzCommand #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(y, window_width) @window_width = window_width super(0, y) end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width @window_width end #-------------------------------------------------------------------------- # ● 桁数の取得 #-------------------------------------------------------------------------- def col_max item_max end #-------------------------------------------------------------------------- # ● コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list Dismantle.command.each { |cmd| add_command(cmd[0], cmd[1], true, cmd[2]) } end #-------------------------------------------------------------------------- # ● 終了コマンド? #-------------------------------------------------------------------------- def exit_cmd? current_ext == 3 end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.mode = current_ext end end #============================================================================== # ■ Window_DismantleList #============================================================================== class Window_DismantleList < Window_Selectable M_WPN=0;M_AMR=1;M_ALL=2;M_END=3 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(y) init_data super(0, y, window_width, Graphics.height - y) Dismantle::COMMAND.each {|c| bitmap_refresh(c)} unselect end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width / 2 + 20 end #-------------------------------------------------------------------------- # ● オブジェクト解放 #-------------------------------------------------------------------------- def dispose super @bitmap.each {|b| b.dispose unless b.nil? } end #-------------------------------------------------------------------------- # ● データ初期化 #-------------------------------------------------------------------------- def init_data @data = Dismantle::COMMAND.collect {|c| [] } @idx = Dismantle::COMMAND.collect {|c| 0 } @mode = Dismantle::COMMAND[0] @bitmap = Dismantle::COMMAND.collect {|c| nil } Dismantle::COMMAND.each {|c| data_refresh(c)} end #-------------------------------------------------------------------------- # ● リスト初期化 #-------------------------------------------------------------------------- def data_refresh(mode) case mode when M_WPN; @data[mode] = weapon_list when M_AMR; @data[mode] = armor_list when M_ALL; @data[mode] = weapon_list + armor_list when M_END; @data[mode] = [] else return end end def weapon_list $game_system.dismantle.weapons.collect {|w| Dismantle::Weapon.new(w.id)} end def armor_list $game_system.dismantle.armors.collect {|a| Dismantle::Armor.new(a.id)} end #-------------------------------------------------------------------------- # ● ビットマップ初期化 #-------------------------------------------------------------------------- def bitmap_refresh(mode) @bitmap[mode].dispose unless @bitmap[mode].nil? @bitmap[mode] = @data[mode].size == 0 ? Bitmap.new(1, 1) : Bitmap.new(contents_width, item_max(mode) * line_height) refresh(mode) end #-------------------------------------------------------------------------- # ● モード切り替え #-------------------------------------------------------------------------- def mode=(m) return if @mode == m remember @mode = m self.contents = @bitmap[@mode] end def remember @idx[@mode] = @index < 0 ? 0 : @index unselect end def reselect select(@idx[@mode]) end #-------------------------------------------------------------------------- # ● アイテム取得 #-------------------------------------------------------------------------- def data @data[@mode][@index] end def data_i(index) @data[@mode][index] end #-------------------------------------------------------------------------- # ● 選択項目の有効状態を取得 #-------------------------------------------------------------------------- def current_item_enabled? data.nil? ? false : data.enable end #-------------------------------------------------------------------------- # ● 項目数の取得 #-------------------------------------------------------------------------- def item_max(m=@mode) @data[m].size end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(mode=-1) mode = @mode if mode < 0 tmp = @mode @mode = mode self.contents = @bitmap[@mode] contents.clear draw_all_items @mode = tmp self.contents = @bitmap[@mode] end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect_for_text(index) item = data_i(index) change_color(normal_color, item.enable) draw_item_name(item.obj, rect.x, rect.y, item.enable) draw_text(contents_width-100-4, rect.y, 100, line_height, item.cost.to_s, 2) end #-------------------------------------------------------------------------- # ● 解体処理 #-------------------------------------------------------------------------- def dismantle(num) item = self.data $game_party.lose_gold(item.cost * num) item.items.each {|itm| itm.gain(num)} item.lose(num) data_refresh(@mode) bitmap_refresh(@mode) select([0, item_max - 1].max) if @index > (item_max - 1) update_help end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_item(data) end #-------------------------------------------------------------------------- # ● 決定ボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_ok if current_item_enabled? Sound.play_ok Input.update deactivate call_ok_handler else call_handler(:buzzer) Sound.play_buzzer end end end #============================================================================== # ■ Window_DismantleItems #============================================================================== class Window_DismantleItems < Window_Base attr_accessor :help_window #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) @data = nil @num = 1 @help_window = nil super(x, y, Graphics.width - x, Graphics.height - y) end #-------------------------------------------------------------------------- # ● アイテム設定 #-------------------------------------------------------------------------- def set_item(item) return if @data == item @data = item @num = 1 refresh update_help end def set_num(num) @num = num refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear return if @data.nil? change_color(system_color) h = line_height draw_text(0, h * 0, 200, h, "所持数") draw_text(0, h * 1, 200, h, "入手素材") change_color(normal_color) draw_text(0, 0, contents_width - 8, h, @data.num.to_s, 2) @data.items.size.times do |i| draw_item(i*h + h*2, @data.items[i]) end end #-------------------------------------------------------------------------- # ● 項目描画 #-------------------------------------------------------------------------- def draw_item(y, item) draw_item_name(item.obj, 0, y) x = contents_width - 44 w = contents.text_size("×").width draw_text(x, y, w, line_height, "×") draw_text(x+w, y, contents_width-x-w, line_height, (item.num*@num).to_s, 2) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_text(@data == nil ? "" : @data.obj.description) end end #============================================================================== # ■ Window_DismantleNumber #============================================================================== class Window_DismantleNumber < Window_Selectable attr_accessor :help_window attr_reader :number OFST = 20 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(w) super(OFST, fitting_height(1)*2 + 50, w - OFST*2, fitting_height(4) + 8) hide.z = 200 @item = nil @max = 1 @price = 0 @number = 1 @help_window = nil end #-------------------------------------------------------------------------- # ● ウィンドウ内容の高さを計算 #-------------------------------------------------------------------------- def contents_height height - standard_padding * 2 end #-------------------------------------------------------------------------- # ● 下端パディングの更新 #-------------------------------------------------------------------------- def update_padding_bottom end #-------------------------------------------------------------------------- # ● アイテム、最大個数、価格の設定 #-------------------------------------------------------------------------- def set(data) @item = data.obj @max = data.max_num @price = data.cost @number = 1 refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear change_color(normal_color) txt = @item.is_a?(RPG::Weapon) ? $data_system.terms.etypes[0] : "防具" draw_text(0, 0, contents_width, line_height, "この#{txt}を解体しますか?") draw_item_name(@item, 14, line_height+8) change_color(normal_color) h = line_height draw_text(172, h*2+8, 32, h, "×") draw_text(contents_width-32-4, h*2+8, 32, h, @number.to_s, 2) cursor_rect.set(contents_width-32-4, h*2+8, 32, h) # 合計価格と通貨単位を描画 change_color(system_color) draw_text(14, h*3+8, 200, h, "解体料金") change_color(normal_color) draw_currency_value(@price * @number, Vocab::currency_unit, 4, h*3+8, contents.width - 8) # update_help end #-------------------------------------------------------------------------- # ● 決定ボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_ok if current_item_enabled? Dismantle::SUCCESS_SE.nil? ? Sound.play_shop : Dismantle::SUCCESS_SE.play Input.update deactivate call_ok_handler else Sound.play_buzzer end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super if active last_number = @number update_number if @number != last_number Sound.play_cursor refresh end end end #-------------------------------------------------------------------------- # ● 個数の更新 #-------------------------------------------------------------------------- def update_number change_number(1) if Input.repeat?(:RIGHT) change_number(-1) if Input.repeat?(:LEFT) change_number(10) if Input.repeat?(:UP) change_number(-10) if Input.repeat?(:DOWN) end #-------------------------------------------------------------------------- # ● 個数の変更 #-------------------------------------------------------------------------- def change_number(amount) @number = [[@number + amount, @max].min, 1].max end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_num(@number) end end #============================================================================== # ■ Window_DismantleCation #============================================================================== class Window_DismantleCation < Window_Base include Dismantle::MesCmd WAIT_TIME = 40 # 表示ウェイト時間[frame] FADE_F = WAIT_TIME / 4 def xx(w) (Graphics.width - w) / 2 end #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(y) super(xx(240), y, 240, fitting_height(1)) @wait = 0 hide.z = 300 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def set_text(type, item=nil) return unless Dismantle::MESSAGE case type when M_S_C; text = "#{item.name}を解体しました" when M_N_P; text = "所持金が足りません" when M_N_N; text = "これ以上、持てません" else; p "bad arg", type; return end w = contents.text_size(text).width self.width = w + standard_padding * 2 self.x = xx(self.width) create_contents contents.draw_text(0, 0, w, line_height, text, 1) @wait = WAIT_TIME show.open self.openness = self.opacity = self.contents_opacity = 255 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def update super return if !self.visible @wait -= 1 #~ close if @wait == FADE_F if @wait < FADE_F self.opacity = self.contents_opacity = 255 / FADE_F * @wait hide if @wait == 0 end end end