#◆◇◆◇◆ ☆ スキル学習スクリプト ver 1.09 ◇◆◇◆◇ # ☆ マスタースクリプト ver 2.00 以降専用 # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ■ 更新履歴 ○ ver 1.07(2013/08/12) イベントのスキルを忘れるに対応 ○ ver 1.06(2009/06/14) 内部仕様を変更 ○ ver 1.05(2009/05/10) 微妙に仕様を変更 ○ ver 1.04(2009/05/10) KGCSoftwareさんに対応 ○ ver 1.03(2009/05/09) 敵がスキルを使うと落ちるミスを修正 ○ ver 1.02(2009/05/09) スキルを一度も使っていないと落ちるミスを修正 ○ ver 1.01(2009/05/09) スキルを一度も使っていないと落ちるミスを修正 ■ 説明 ※ レベルアップポップスクリプトよりも「下」に導入してください。 スキルの使用回数をカウントし、 あるスキルを一定以上使うと習得できるスキルを設定できます。 (ファイアを10回使うとファイア+を習得する等) スキルを習得するタイミングは「戦闘終了時」です。 必要回数が半分以下になると、 スキルウィンドウにそのスキル名と残り回数が表示されます。 (半分以下になるまでは表示されません) レベルアップでも覚える場合、そちらが優先されます。 (先に熟練度で覚えることもできます) レベルアップポップスクリプトにも対応しています。 設定はソース内部を参照してください。 ※ 戦闘中は習得するスキルが表示されません。 また、メニュー画面で使用しても回数はカウントされません。 スキルが更新されるのは戦闘終了後です。 KGCSoftwareさんよりも「下」に導入してください。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # スキル学習スクリプトを有効化 ( true で有効 / false で無効 ) RGSS["スキル学習スクリプト"] = true end # スキル学習スクリプトが有効な場合に以降の処理を実行する if MINTO::RGSS["スキル学習スクリプト"] == true then #============================================================================== # ☆ カスタマイズ #------------------------------------------------------------------------------ # 機能のカスタマイズをここで行います。 #============================================================================== module MINTO # 必要なデータの初期化(変更しない) @learning_skills = {} for i in 0...Data_Actors.data.size do @learning_skills[i] = {} end # @learning_skills[アクターID][スキルのID] = [覚えるスキル, 条件使用回数] @learning_skills[1][1] = [5, 2] @learning_skills[5][1] = [5, 5] # 全アクターに一括設定 for i in 0...Data_Actors.data.size do #@learning_skills[i][1] = [2, 1] end #-------------------------------------------------------------------------- # ● データの取得 #-------------------------------------------------------------------------- def self.learning_skills return @learning_skills end #-------------------------------------------------------------------------- # ● KGC Softwareスクリプトの検索 # key : スクリプトキー #-------------------------------------------------------------------------- def self.search_kgc(key) # 指定されたスクリプトが有効かどうか調べる $imported != nil and $imported[key] == true end end #============================================================================== # ■ Bitmap #------------------------------------------------------------------------------ #  画像そのものを扱う組み込みクラスです。 #============================================================================== class Bitmap #-------------------------------------------------------------------------- # ● 指定範囲のクリア #-------------------------------------------------------------------------- def rect_clear(x, y, width, height) # 対象の範囲を消す rect = Rect.new(x, y, width, height) self.fill_rect(rect, Color.new(0, 0, 0, 0)) end end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors) # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_writer :learning_skills # 学習候補スキル attr_writer :master_skills # 学習したスキル attr_writer :learning_point # スキル熟練度 #-------------------------------------------------------------------------- # ● 学習候補スキルの取得 #-------------------------------------------------------------------------- def learning_skills if @learning_skills.nil? @learning_skills = [] end return @learning_skills end #-------------------------------------------------------------------------- # ● 学習したスキルの取得 #-------------------------------------------------------------------------- def master_skills if @master_skills.nil? @master_skills = [] end return @master_skills end #-------------------------------------------------------------------------- # ● スキル熟練度の取得 #-------------------------------------------------------------------------- def learning_point if @learning_point.nil? @learning_point = {} end return @learning_point end #-------------------------------------------------------------------------- # ● スキルの使用可能判定 # skill_id : スキル ID #-------------------------------------------------------------------------- def skill_can_use?(skill_id) # 元の処理を実行 bool = super(skill_id) # 情報を返す return (bool and not self.learning_skills.include?(skill_id)) end #-------------------------------------------------------------------------- # ● スキル使用回数の加算 # skill_id : スキルのID #-------------------------------------------------------------------------- def gain_learning_point(skill_id) # 回数をリセット if self.learning_point[skill_id].nil? self.learning_point[skill_id] = 0 end # 回数を加算 self.learning_point[skill_id] += 1 end #-------------------------------------------------------------------------- # ● 学習スキルの検索 # skill_id : 検索するスキルのID # type : 検索タイプ #-------------------------------------------------------------------------- def search_learning_skills(skill_id, type) # ループ処理 for id in MINTO.learning_skills[self.id].keys do # 学習スキルが設定されている場合 unless id.nil? then # 検索スキルが設定されている場合 if MINTO.learning_skills[self.id][id][0] == skill_id # IDを返す場合 if type.zero? # IDを返す return id # 残り回数を返す場合 else # 残り回数を返す number_1 = MINTO.learning_skills[self.id][id][1].to_i number_2 = @learning_point[id].to_i return number_1 - number_2 end end end end end #-------------------------------------------------------------------------- # ● スキルを忘れる # skill_id : スキル ID #-------------------------------------------------------------------------- alias :forget_skill_MINTO_RGSS_121 :forget_skill def forget_skill(skill_id) # 元の処理を実行 forget_skill_MINTO_RGSS_121(skill_id) delete_on = false # ループ処理 for id in MINTO.learning_skills[self.id].keys do # 学習スキルが設定されている場合 unless id.nil? then # 忘れさせるスキルが学習先に設定されている場合 if MINTO.learning_skills[self.id][id][0] == skill_id then # 熟練度を初期化 self.learning_point[id] = 0 # 除外を予約 delete_on = true end end end # スキルが除外される場合 if delete_on == true then # 学習したスキルから除外 self.master_skills.delete(skill_id) # 学習候補スキルから除外 self.learning_skills.delete(skill_id) end end #-------------------------------------------------------------------------- # ● 学習スキルの更新 #-------------------------------------------------------------------------- def update_learning_skills # ループ処理 for id in MINTO.learning_skills[self.id].keys do # 学習スキルが設定されている場合 unless id.nil? then # 条件使用回数を取得 point = MINTO.learning_skills[self.id][id][1].to_i # 条件使用回数をクリアした場合 if self.learning_point[id].to_i >= point then # スキルを学習 self.master_skills.push(MINTO.learning_skills[self.id][id][0]) # 条件使用回数の半分が過ぎた場合 elsif self.learning_point[id].to_i >= (point / 2) then # 学習候補スキルに追加 self.learning_skills.push(MINTO.learning_skills[self.id][id][0]) end end end # 学習候補スキルから習得済みのスキルを除外 self.learning_skills -= (self.master_skills + ori_skills) end #-------------------------------------------------------------------------- # ● オリジナルスキルの取得 #-------------------------------------------------------------------------- def ori_skills self_skills = [] # ループ処理 for skill in $data_classes[@class_id].learnings do # レベル条件を満たしている場合 if skill.level <= @level then # 習得スキルに追加 self_skills.push(skill.skill_id) end end # スキルを返す return self_skills end #-------------------------------------------------------------------------- # ● スキルの取得 #-------------------------------------------------------------------------- alias :skills_MINTO_RGSS_121 :skills def skills # 元の処理を実行 bool = skills_MINTO_RGSS_121 # KGC[スキルCP制]が有効な場合 if MINTO.search_kgc("SkillCPSystem") then # 戦闘中の場合 if $game_temp.in_battle == true then # フェーズ処理が可能な場合 if $scene.class.method_defined?("phase") then # アフターバトルフェーズでない場合 if $scene.phase != 5 then # 元の処理を返す return bool end end end end # スキルを返す return (bool + self.master_skills).uniq end #-------------------------------------------------------------------------- # ○ 全スキル取得 #-------------------------------------------------------------------------- def all_skills return (skills_KGC_SkillCPSystem.compact + self.master_skills).uniq end #-------------------------------------------------------------------------- # ○ 習得済みスキルのみを取得 #-------------------------------------------------------------------------- unless method_defined?(:learned_skills) DEFINE_LEARNED_SKILLS_SKILL_CP = true end if defined?(DEFINE_LEARNED_SKILLS_SKILL_CP) def learned_skills return (@skills + self.master_skills).uniq end end end #============================================================================== # ■ Game_Enemy #------------------------------------------------------------------------------ #  エネミーを扱うクラスです。このクラスは Game_Troop クラス ($game_troop) の # 内部で使用されます。 #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● スキル使用回数の加算 # skill_id : スキルのID #-------------------------------------------------------------------------- def gain_learning_point(skill_id) end end #============================================================================== # ■ Window_Skill #------------------------------------------------------------------------------ #  スキル画面、バトル画面で、使用できるスキルの一覧を表示するウィンドウです。 #============================================================================== class Window_Skill < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 # actor : アクター #-------------------------------------------------------------------------- def initialize(actor) super(0, 128, 640, 288) @actor = actor @column_max = 2 refresh self.index = 0 # 戦闘中の場合はウィンドウを画面中央へ移動し、半透明にする if $game_temp.in_battle self.y = 64 self.height = 256 self.back_opacity = 160 else # 使用回数ウィンドウを作成 @point_window = Window_Skill_Point.new(actor) end end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose # 使用回数ウィンドウを解放 @point_window.dispose if @point_window # スーパークラスの処理に移行 super end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh # ビットマップが有効な場合 unless self.contents.nil? then # ビットマップを解放 self.contents.dispose # ビットマップをクリア self.contents = nil end # データを初期化 @data = [] # 戦闘中の場合 if $game_temp.in_battle == true then actor_skills = (@actor.skills).uniq else actor_skills = (@actor.skills + @actor.learning_skills).uniq end # ループ処理 for i in 0...actor_skills.size do # スキルを取得 skill = $data_skills[actor_skills[i]] # 有効なスキルの場合 unless skill.nil? then # データに追加 @data.push(skill) end end # 項目数を更新 @item_max = @data.size # 項目数が1以上の場合 if @item_max >= 1 then # 新しいビットマップを作成 self.contents = Bitmap.new(width - 32, row_max * 32) # ループ処理 for i in 0...@item_max do # スキルを描写 draw_item(i) end end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) # スキルを取得 skill = @data[index] # 使用可能なスキルの場合 if @actor.skill_can_use?(skill.id) then # 通常色で描写 self.contents.font.color = normal_color # アイコンの不透明度を設定 opacity = 255 # 使用不可能なスキルの場合 else # 無効色で描写 self.contents.font.color = disabled_color # アイコンの不透明度を設定 opacity = 128 end # 描写座標を計算 x = 4 + index % @column_max * (288 + 32) y = index / @column_max * 32 # 描写範囲をクリア self.contents.rect_clear(x, y, self.width / @column_max - 32, 32) # スキルアイコンの取得 bitmap = RPG::Cache.icon(skill.icon_name) # スキルのアイコンを描写 self.contents.blt(x, y + 4, bitmap, bitmap.rect, opacity) # スキル名を描写 self.contents.draw_text(x + 28, y, 204, 32, skill.name, 0) # スキルの消費SPが1以上の場合 if skill.sp_cost >= 1 then # スキルの消費SPを描写 self.contents.draw_text(x + 232, y, 48, 32, skill.sp_cost.to_s, 2) end end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_text(self.skill == nil ? "" : self.skill.description) @point_window.draw_point(self.skill) if @point_window end end #============================================================================== # ■ Window_GroupingSkill #------------------------------------------------------------------------------ #  スキル画面、バトル画面で、使用できるスキルの一覧を表示するウィンドウです。 #============================================================================== class Window_GroupingSkill < Window_Skill #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(skillkind = 0) if self.contents != nil self.contents.dispose self.contents = nil end @data = [] # 戦闘中の場合 if $game_temp.in_battle == true then actor_skills = (@actor.skills).uniq else actor_skills = (@actor.skills + @actor.learning_skills).uniq end # 「全種」ではない場合 if @group[skillkind] != 0 for i in 0...actor_skills.size # 対応属性を持っている場合 if $data_skills[actor_skills[i]].element_set.include?( @group[skillkind]) @data << $data_skills[actor_skills[i]] end end else # 全スキルを追加 for i in 0...actor_skills.size @data.push << $data_skills[actor_skills[i]] end end # 非表示スキルを除く if $imported["HiddenSkill"] @data = @data.find_all { |skill| include?(skill) } end # 項目数が 0 でなければビットマップを作成し、全項目を描画 @item_max = @data.size if @item_max > 0 self.contents = Bitmap.new(width - 32, row_max * 32) for i in 0...@item_max draw_item(i) end else self.contents = Bitmap.new(32, 32) end end end #============================================================================== # ■ Window_Skill_Point #------------------------------------------------------------------------------ #  スキル画面で、スキルの使用した回数を表示するウィンドウです。 #============================================================================== class Window_Skill_Point < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 # actor : アクター #-------------------------------------------------------------------------- def initialize(actor) super(0, 416, 640, 64) self.contents = Bitmap.new(width - 32, height - 32) @actor = actor end #-------------------------------------------------------------------------- # ● 使用回数の描写 # skill : スキル #-------------------------------------------------------------------------- def draw_point(skill) # スキルが更新されていない場合 if skill == @skill then # メソッドを返す return end # スキルを更新 @skill = skill # ビットマップをクリア self.contents.clear # 無効なスキルの場合 if skill.nil? then # メソッドを返す return end width = self.width - 32 self.contents.font.color = system_color # 学習候補スキルでない場合 unless @actor.learning_skills.include?(skill.id) then # 用語を描写 self.contents.draw_text(4, 0, 128, 32, "使用回数") # 使用した回数を取得 point = @actor.learning_point[skill.id].to_i.to_s # 使用回数を描写 self.contents.font.color = normal_color self.contents.draw_text(0, 0, width, 32, point, 2) # 学習候補スキルの場合 else # 用語を描写 self.contents.draw_text(4, 0, 128, 32, "習得まで") # 元のスキルを取得 base_skill = $data_skills[@actor.search_learning_skills(skill.id, 0)] point = @actor.search_learning_skills(skill.id, 1) # 元のスキル名を描写 self.contents.font.color = normal_color self.contents.draw_text(0, 0, width, 32, base_skill.name + "を", 1) self.contents.font.color = system_color self.contents.draw_text(0, 0, width, 32, "あと#{point}回", 2) end end end #============================================================================== # ■ Scene_Battle (分割定義 2) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :phase # フェーズ #-------------------------------------------------------------------------- # ● アフターバトルフェーズ開始 #-------------------------------------------------------------------------- alias start_phase5_MITO_RGSS_121 start_phase5 def start_phase5 # 元の処理を実行 start_phase5_MITO_RGSS_121 # ループ処理(パーティー) for i in 0...$game_party.actors.size do # アクターを取得 actor = $game_party.actors[i] # 学習スキルを更新 actor.update_learning_skills end end #-------------------------------------------------------------------------- # ● 習得したスキルの表示 # actor : アクター #-------------------------------------------------------------------------- def learning_skills_pop(actor) # 最新のスキル learning_skills = [] # ループ処理 for skill in $data_classes[actor.class_id].learnings do # レベル条件を満たしている場合 if skill.level <= actor.level then # 最新のスキルに追加 learning_skills.push(skill.skill_id) end end # 最新のスキルにアクターのスキルを追加 learning_skills += actor.skills # 重複する要素を除外 learning_skills.uniq! # 習得済みスキルを除外 learning_skills -= @last_skills_array[actor.index] # スキルを習得していない場合 if learning_skills.empty? # メソッドを返す return end # パラメータウィンドウを表示 @lvup_window.visible = true # ループ処理 for id in learning_skills do # スキルを取得 skill = $data_skills[id] # 習得MEを演奏 data = MINTO::Skill_SE_Data Audio.se_play(data[0], data[1], data[2]) text = "\\c[1]#{skill.name}\\c[0]#{MINTO::LearningMessage}" # スキル名を表示 @center_help_window.set_text(text) # 表示が終わるまでループ while @center_help_window.visible == true # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # センターヘルプウィンドウを更新 @center_help_window.update end end end end #============================================================================== # ■ Scene_Battle (分割定義 4) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● スキルアクション 結果作成 #-------------------------------------------------------------------------- alias :make_skill_action_result_MINTO_RGSS_121 :make_skill_action_result def make_skill_action_result # 元の処理を実行 make_skill_action_result_MINTO_RGSS_121 # スキルの使用回数を加算 @active_battler.gain_learning_point(@skill.id) end end end