#============================================================================== # ■ VX-RGSS2-20 解体屋[ウィンドウ] by Claimh #============================================================================== module Dismantle NUM = 99 # メッセージタイプ 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 return $data_items[@id] end def pt_num return $game_party.item_number(obj) end def gain(n) return $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 = [] for item in data[id][1] @items.push(Item.new(item)) end @enable = enable? end def num return $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) for item in @items return false if (item.pt_num + (item.num * n)) > NUM end return true end def price?(n=1) return ($game_party.gold >= (@cost*n)) end def message return MesCmd::M_N_P unless price? return MesCmd::M_N_N 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 return $data_weapons[@id] end end # ● 解体アイテム情報クラス(防具) class Armor < Dismantle def initialize(id) super(id, ARMOR) end def obj return $data_armors[@id] end end end #============================================================================== # ■ Window_DismantleCmd #============================================================================== class Window_DismantleCmd < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, WLH + 32, 544-160, WLH + 32) @commands = Dismantle.command @item_max = @column_max = @commands.size create_contents refresh self.index = 0 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) x = 4 + index * self.width / @column_max self.contents.draw_text(x, 0, 300, WLH, @commands[index]) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.mode = Dismantle::COMMAND[@index] end end #============================================================================== # ■ Window_DismantleList #============================================================================== class Window_DismantleList < Window_Selectable M_WPN=0;M_AMR=1;M_ALL=2;M_END=3 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, (WLH+32)*2, 304, 416-(WLH+32)*2) self.contents.dispose @data = [[],[],[],[]] @idx = [0, 0, 0, 0] @bitmap = [] @mode = Dismantle::COMMAND[0] for cmd in Dismantle::COMMAND data_refresh(cmd) end @index = -1 end def dispose super for bitmap in @bitmap unless bitmap.nil? bitmap.dispose bitmap = nil end end end def enable self.index = @idx[@mode] self.active = true end def disable @idx[@mode] = @index self.index = -1 self.active = false end #-------------------------------------------------------------------------- # ● モード切り替え #-------------------------------------------------------------------------- def mode=(m) return if @mode == m @mode = m self.contents = @bitmap[@mode] @item_max = @data[@mode].size end #-------------------------------------------------------------------------- # ● リスト初期化 #-------------------------------------------------------------------------- def data_refresh(mode) if Dismantle::COMMAND.include?(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] = [] end end unless @bitmap[mode].nil? @bitmap[mode].dispose @bitmap[mode] = nil end @bitmap[mode] = @data[mode].size == 0 ? Bitmap.new(width-32, height-32) : Bitmap.new(self.width - 32, @data[mode].size * WLH) @bitmap[mode].font.color = normal_color refresh(mode) end def weapon_list list = [] for i in 1...$data_weapons.size if $game_party.item_number($data_weapons[i]) > 0 and !Dismantle::WEAPON[i].nil? list.push(Dismantle::Weapon.new(i)) end end return list end def armor_list list = [] for i in 1...$data_armors.size if $game_party.item_number($data_armors[i]) > 0 and !Dismantle::ARMOR[i].nil? list.push(Dismantle::Armor.new(i)) end end return list end #-------------------------------------------------------------------------- # ● アイテム取得 #-------------------------------------------------------------------------- def data return @data[@mode][@index] end def data_i(index) return @data[@mode][index] end def enable? return false if data.nil? return data.enable end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(mode=-1) mode = @mode if mode < 0 tmp = @mode @mode = mode @item_max = @data[@mode].size self.contents = @bitmap[@mode] self.contents.clear for i in 0...@item_max draw_item(i) end @mode = tmp @item_max = @data[@mode].size self.contents = @bitmap[@mode] end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) y = index * WLH item = data_i(index) enable = item.enable self.contents.font.color.alpha = enable ? 255 : 128 draw_item_name(item.obj, 4, y, enable) self.contents.draw_text(self.contents.width-100-4, y, 100, WLH, item.cost.to_s, 2) end #-------------------------------------------------------------------------- # ● 解体処理 #-------------------------------------------------------------------------- def dismantle(num) item = self.data $game_party.lose_gold(item.cost * num) for itm in item.items itm.gain(num) end item.lose(num) data_refresh(@mode) self.index = [0, @data[@mode].size - 1].max if @index > (@data[@mode].size - 1) update_help end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_item(data) end end #============================================================================== # ■ Window_DismantleItems #============================================================================== class Window_DismantleItems < Window_Base attr_accessor :help_window #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(304, (WLH+32)*2, 240, 416-(WLH+32)*2) @data = nil @num = 1 @help_window = nil 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 self.contents.clear return if @data.nil? self.contents.font.color = system_color self.contents.draw_text(0, 0, 200, WLH, "所持数") self.contents.draw_text(0, WLH, 200, WLH, "入手素材") self.contents.font.color = normal_color self.contents.draw_text(0, 0, 240-32-4, WLH, @data.num.to_s, 2) for i in 0...@data.items.size draw_item(i*WLH+WLH*2, @data.items[i]) end end #-------------------------------------------------------------------------- # ● 項目描画 #-------------------------------------------------------------------------- def draw_item(y, item) draw_item_name(item.obj, 4, y) self.contents.draw_text(140, y, 100-4-32, WLH, (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_Base attr_accessor :help_window attr_reader :number #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(20, (WLH+32)*2+50, 304-20*2, WLH*4+32+8) self.visible = false self.z = 200 @item = nil @max = 1 @price = 0 @number = 1 @help_window = nil end #-------------------------------------------------------------------------- # ● アイテム、最大個数、価格の設定 #-------------------------------------------------------------------------- def set(data) @item = data.obj @max = data.max_num @price = data.cost @number = 1 refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear self.contents.font.color = normal_color txt = @item.is_a?(RPG::Weapon) ? $data_system.terms.weapon : "防具" self.contents.draw_text(0, 0, 240, WLH, "この#{txt}を解体しますか?") draw_item_name(@item, 14, WLH+8) self.contents.font.color = normal_color self.contents.draw_text(172, WLH*2+8, 32, WLH, "×") self.contents.draw_text(self.contents.width-32-4, WLH*2+8, 32, WLH, @number.to_s, 2) self.cursor_rect.set(self.contents.width-28, WLH*2+8, 28, WLH) # 合計価格と通貨単位を描画 self.contents.font.color = system_color self.contents.draw_text(14, WLH*3+8, 200, WLH, "解体料金") self.contents.font.color = normal_color domination = $data_system.terms.gold cx = contents.text_size(domination).width total_price = @price * @number self.contents.font.color = normal_color self.contents.draw_text(4, WLH*3+8, 228-cx-2, WLH, total_price.to_s, 2) self.contents.font.color = system_color self.contents.draw_text(232-cx, WLH*3+8, cx, WLH, domination, 2) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super if self.active last_number = @number if Input.repeat?(Input::RIGHT) and @number < @max @number += 1 end if Input.repeat?(Input::LEFT) and @number > 1 @number -= 1 end if Input.repeat?(Input::UP) and @number < @max @number = [@number + 10, @max].min end if Input.repeat?(Input::DOWN) and @number > 1 @number = [@number - 10, 1].max end if @number != last_number Sound.play_cursor refresh end end 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) return (544-w)/2 end #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(xx(240), 160, 240, WLH+32) @wait = 0 self.z = 600 self.visible = false 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 = self.contents.text_size(text).width self.width = w + 32 self.x = xx(self.width) self.contents.dispose self.contents = Bitmap.new(w, WLH) self.contents.draw_text(0, 0, w, WLH, text) @wait = WAIT_TIME self.visible = true self.opacity = self.contents_opacity = 255 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def update super @wait -= 1 if @wait < FADE_F self.opacity = self.contents_opacity = 255 / FADE_F * @wait self.visible = false if @wait == 0 end end end