#============================================================================== # ■ スキル用ショップ ver 1.01 #------------------------------------------------------------------------------ #  配布元: # 白の魔 http://izumiwhite.web.fc2.com/ # #  利用規約: # RPGツクールVXの正規の登録者のみご利用になれます。 # 利用報告・著作権表示とかは必要ありません。 # 改造もご自由にどうぞ。 # 何か問題が発生しても責任は持ちません。 #============================================================================== #-------------------------------------------------------------------------- # ★ 初期設定。 # ウィンドウに表示されるメッセージと # 各アクターが修得することのできないスキルを指定。 #-------------------------------------------------------------------------- module WD_skillshop_ini #ウィンドウに表示されるメッセージ Messnonmastered = "未修得" Messmastered = "修得済み" Messdislearnable = "修得不可" Messbuy = "スキルを購入する" Messcancel = "やめる" #ゴールドの代わりに変数を表示する場合の設定 Needvariable = false #ゴールドの代わりに変数を利用する場合true Variableid = 11 #変数の番号 Variablename = "金貨" #変数の単位 Dislearnable = [] #この行は消さないこと #以下、各アクターが修得できないスキルを指定 Dislearnable[1] = [2,3] #1番のアクターは2番,3番のスキルを修得不可 Dislearnable[2] = [39,40,41] #2番のアクターは39番,40番,41番のスキルを修得不可 Dislearnable[4] = [5] #4番のアクターは5番のスキルを修得不可 Alllearn = [39,40,60] #購入時に(個別習得ではなく)全員が修得するスキル。 #指定しない場合は、Alllearn = [] とすること。 end #-------------------------------------------------------------------------- # ★ 初期設定おわり #-------------------------------------------------------------------------- #============================================================================== # ■ Scene_SkillShop #------------------------------------------------------------------------------ #  スキル用ショップ画面の処理を行うクラスです。 #============================================================================== class Scene_SkillShop < Scene_Base #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def initialize(shop_goods) @shop_goods = shop_goods end def start super create_menu_background create_command_window @help_window = Window_Help.new if WD_skillshop_ini::Needvariable == false @gold_window = Window_Gold.new(384, 56) else @gold_window = Window_ShopVariable.new(384, 56) end @dummy_window = Window_Base.new(0, 112, 544, 304) @buy_window = Window_SkillShopBuy.new(0, 112, @shop_goods) @buy_window.active = false @buy_window.visible = false @buy_window.help_window = @help_window @learner_window = Window_SkillShopTarget.new(304, 112) @learner_window.active = false @learner_window.visible = false @learner_window.index = -1 end #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- def terminate super dispose_menu_background dispose_command_window @help_window.dispose @gold_window.dispose @dummy_window.dispose @buy_window.dispose @learner_window.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super update_menu_background @help_window.update @command_window.update @gold_window.update @dummy_window.update @buy_window.update @learner_window.update if @command_window.active update_command_selection elsif @buy_window.active update_buy_selection elsif @learner_window.active update_learner_select end end #-------------------------------------------------------------------------- # ● コマンドウィンドウの作成 #-------------------------------------------------------------------------- def create_command_window s1 = WD_skillshop_ini::Messbuy s2 = WD_skillshop_ini::Messcancel @command_window = Window_Command.new(384, [s1, s2], 2) @command_window.y = 56 end #-------------------------------------------------------------------------- # ● コマンドウィンドウの解放 #-------------------------------------------------------------------------- def dispose_command_window @command_window.dispose end #-------------------------------------------------------------------------- # ● コマンド選択の更新 #-------------------------------------------------------------------------- def update_command_selection if Input.trigger?(Input::B) Sound.play_cancel $scene = Scene_Map.new elsif Input.trigger?(Input::C) case @command_window.index when 0 # スキルを購入する Sound.play_decision @command_window.active = false @dummy_window.visible = false @buy_window.active = true @buy_window.visible = true @buy_window.refresh @learner_window.visible = true when 1 # やめる Sound.play_decision $scene = Scene_Map.new end end end #-------------------------------------------------------------------------- # ● 購入スキル選択の更新 #-------------------------------------------------------------------------- def update_buy_selection @item = @buy_window.item @learner_window.set(@item) @learner_window.refresh if Input.trigger?(Input::B) Sound.play_cancel @command_window.active = true @dummy_window.visible = true @buy_window.active = false @buy_window.visible = false @learner_window.visible = false @learner_window.refresh @help_window.set_text("") return end if Input.trigger?(Input::C) @item = @buy_window.item /<価格:(.+)>/ =~ @item.note skill_price = $1.to_i if WD_skillshop_ini::Needvariable == false gold = $game_party.gold else gold = $game_variables[WD_skillshop_ini::Variableid] end if @item == nil or skill_price > gold Sound.play_buzzer else Sound.play_decision @buy_window.active = false @learner_window.index = 0 alllist = WD_skillshop_ini::Alllearn if alllist != nil alllist.each{|i| @learner_window.index = 101 if @item.id == i } end @learner_window.active = true end end end #-------------------------------------------------------------------------- # ● 修得者選択の更新 #-------------------------------------------------------------------------- def update_learner_select @item = @buy_window.item /<価格:(.+)>/ =~ @item.note skill_price = $1.to_i if WD_skillshop_ini::Needvariable == false gold = $game_party.gold else gold = $game_variables[WD_skillshop_ini::Variableid] end if Input.trigger?(Input::B) Sound.play_cancel cancel_learner_select elsif Input.trigger?(Input::C) if @item == nil or skill_price > gold Sound.play_buzzer elsif @learner_window.index != 101 actor = $game_party.members[@learner_window.index] learnable = true dislearnlist = WD_skillshop_ini::Dislearnable[actor.id] if dislearnlist != nil dislearnlist.each{|i| learnable = false if @item.id == i } end mastered = (actor.skill_learn?(@item)) if mastered == false and learnable == true decide_learner_select else Sound.play_buzzer end else learnable2 = Array.new($game_party.members.size, true) mastered2 = Array.new($game_party.members.size, false) for i in 1...$game_party.members.size + 1 actor = $game_party.members[i-1] dislearnlist = WD_skillshop_ini::Dislearnable[actor.id] if dislearnlist != nil dislearnlist.each{|j| learnable2[i-1] = false if @item.id == j } end mastered2[i-1] = (actor.skill_learn?(@item)) end all_learnable = false for i in 1...$game_party.members.size + 1 all_learnable = true if learnable2[i-1] == true and mastered2[i-1] == false end if all_learnable == true decide_learner_select else Sound.play_buzzer end end end end #-------------------------------------------------------------------------- # ● 修得者選択のキャンセル #-------------------------------------------------------------------------- def cancel_learner_select Sound.play_cancel @learner_window.active = false @learner_window.index = -1 @buy_window.active = true end #-------------------------------------------------------------------------- # ● 修得者の決定 #-------------------------------------------------------------------------- def decide_learner_select Sound.play_shop if @learner_window.index != 101 $game_party.members[@learner_window.index].learn_skill(@item.id) else for i in 1...$game_party.members.size + 1 learnable = true dislearnlist = WD_skillshop_ini::Dislearnable[$game_party.members[i-1].id] if dislearnlist != nil dislearnlist.each{|j| learnable = false if @item.id == j } end $game_party.members[i-1].learn_skill(@item.id) if learnable end end /<価格:(.+)>/ =~ @item.note skill_price = $1.to_i if WD_skillshop_ini::Needvariable == false $game_party.lose_gold(skill_price) else $game_variables[WD_skillshop_ini::Variableid] -= skill_price end @gold_window.refresh @buy_window.refresh @learner_window.refresh end end #============================================================================== # ■ Window_SkillShopBuy #------------------------------------------------------------------------------ #  スキル用ショップ画面で、購入できるスキルの一覧を表示するウィンドウです。 #============================================================================== class Window_SkillShopBuy < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 # x : ウィンドウの X 座標 # y : ウィンドウの Y 座標 #-------------------------------------------------------------------------- def initialize(x, y, shop_goods) super(x, y, 304, 304) @shop_goods = shop_goods refresh self.index = 0 end #-------------------------------------------------------------------------- # ● アイテムの取得 #-------------------------------------------------------------------------- def item return @data[self.index] end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh @data = [] for item in @shop_goods if item != nil @data.push($data_skills[item]) end end @item_max = @data.size create_contents for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] /<価格:(.+)>/ =~ item.note skill_price = $1.to_i if WD_skillshop_ini::Needvariable == false enabled = (skill_price <= $game_party.gold) else enabled = (skill_price <= $game_variables[WD_skillshop_ini::Variableid]) end rect = item_rect(index) self.contents.clear_rect(rect) draw_item_name(item, rect.x, rect.y, enabled) rect.width -= 4 self.contents.draw_text(rect, skill_price, 2) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_text(item == nil ? "" : item.description) end end #============================================================================== # ■ Window_SkillShopTarget #------------------------------------------------------------------------------ #  スキル用ショップ画面で、スキルを覚えさせる対象を選択するウィンドウです。 #============================================================================== class Window_SkillShopTarget < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 # x : ウィンドウの X 座標 # y : ウィンドウの Y 座標 #-------------------------------------------------------------------------- def initialize(x, y) super(x, y, 240, 304) @column_max = 1 @index = 0 @data = [] @skill_price = 0 for i in 0...$game_party.members.size @data.push($game_party.members[i]) end @item_max = @data.size create_contents end #-------------------------------------------------------------------------- # ● スキル、価格の設定 #-------------------------------------------------------------------------- def set(skill) @skill = skill end def refresh self.contents.clear for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) x = 4 y = WLH * (2 + index * 2) rect = item_rect(index) self.contents.clear_rect(x, y, rect.width,rect.height) actor = @data[index] if actor != nil rect.width -= 4 learnable = true dislearnlist = WD_skillshop_ini::Dislearnable[actor.id] if dislearnlist != nil dislearnlist.each{|i| learnable = false if @skill.id == i } end mastered = (actor.skill_learn?(@skill)) if mastered self.contents.font.color.alpha = 128 self.contents.draw_text(x, y, 200, WLH, actor.name) self.contents.draw_text(x, y + WLH, 200, WLH, WD_skillshop_ini::Messmastered, 2) elsif learnable == false self.contents.font.color.alpha = 128 self.contents.draw_text(x, y, 200, WLH, actor.name) self.contents.draw_text(x, y + WLH, 200, WLH, WD_skillshop_ini::Messdislearnable, 2) else self.contents.font.color.alpha = 255 self.contents.draw_text(x, y, 200, WLH, actor.name) self.contents.draw_text(x, y + WLH, 200, WLH, WD_skillshop_ini::Messnonmastered, 2) end end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update_cursor if self.index > -1 and self.index < 101 y = WLH * (2 + index * 2) self.cursor_rect.set(0, y, 208, WLH*2) elsif self.index == -1 y = WLH * (2 + 0 * 2) self.cursor_rect.set(0, y, 0, 0) elsif self.index == 101 y = WLH * (2 + 0 * 2) self.cursor_rect.set(0, y, 208, WLH*8) end end def update super end end #============================================================================== # ■ Window_ShopVariable #------------------------------------------------------------------------------ #  ゴールドの代わりに変数を表示するウィンドウです。 #============================================================================== class Window_ShopVariable < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 # x : ウィンドウの X 座標 # y : ウィンドウの Y 座標 #-------------------------------------------------------------------------- def initialize(x, y) super(x, y, 160, WLH + 32) refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear value = $game_variables[WD_skillshop_ini::Variableid] cx = contents.text_size(WD_skillshop_ini::Variablename).width self.contents.font.color = normal_color self.contents.draw_text(4, 0, 120-cx-2, WLH, value, 2) self.contents.font.color = system_color self.contents.draw_text(4, 0, 120, WLH, WD_skillshop_ini::Variablename, 2) end end