#============================================================================ # # ■エリア・エンカウントの機能強化 □Ver3.20 □製作者:月紳士 # ・RPGツクールVX用 RGSS2スクリプト # # ●…書き換えメソッド(競合注意) ◎…メソッドのエイリアス ○…新規メソッド # # ※二次配布禁止!配布元には利用規約があります。必ずそちらを見てください。 #------------------------------------------------------------------------------ # 更新履歴 # Ver3.20 ○スクリプトの仕様にあわせたエリア名前習得を # 他スクリプトの改変をしないで済む様にした。 # Ver3.10 ○スクリプトの仕様にあわせたエリア名前習得が出来るメソッドを追加。 # Ver3.00 ○複数のエリアが重なった際の追加機能適用ルールを作成。 # Ver2.00 ○エリアのエンカウントリストが空の場合、 # 必ずリストを交換してしまっていた不具合の修正。 # ○エリア内のエンカウント歩数を指定できる機能を追加。 #       スクリプトネーム変更 #------------------------------------------------------------------------------ =begin  これはエリアのエンカウント機能を強化するスクリプトです。  追加される機能は2種類です。   ○エリアのエンカウントリストを「リスト交換形式」に   ○エリア内のエンカウント歩数を指定 #------------------------------------------------------------------------------  ○エリアのエンカウントリストを「リスト交換形式」に/説明   デフォルトでは、エリアに設定したエンカウントリストの扱いは   マップで設定するエンカウントリストに、   エリアのリストが追加される形式となっています。   つまりマップに設定された敵グループと、エリアに設定した敵グループの   どちらかから(ランダムに)敵グループが選ばれるようになっています。  このスクリプトの導入により、  完全に交換する形式のエンカウントリストを   作ることが出来るようになります。  「リスト交換形式」にすると、  マップのリストに設定された敵グループは無視して、  エリアのリストに設定された敵グループから、ランダムに敵グループが選ばれます。  この形式の導入により   ・強い敵グループ(のみ)に遭遇するエリア   ・敵と一切遭遇しない安全地帯エリア   などを手軽に作ることが出来るようになります。    #------------------------------------------------------------------------------  ○「リスト交換形式」設定の仕方   リストを交換形式にしたいエリアの名前に   <リスト交換>   というキーワードを記入してください。   このキーワードが名前に含まれるエリアでは、   親マップのエンカウントリストに交換する形で、   エリアに設定したリストのみをエンカウントに使用します。   エリアにはリストに交換したい敵グループを登録してください。   この時、リストを空にすればそこは敵と遭遇しない「安全地帯エリア」となります。 #------------------------------------------------------------------------------  ○エリア内のエンカウント歩数を指定/説明   エンカウント歩数はマップで設定しますが   このスクリプトの導入により、   エリア内のみ適用されるエンカウント歩数を設定することが出来ます。    ・周囲より敵と遭遇しやすいエリア    ・周囲より敵と遭遇しにくいエリア   を作ることができます。 #------------------------------------------------------------------------------  ○エリア内のエンカウント歩数設定の仕方   エンカウント歩数を設定したいエリアの名前に   <遭遇歩数:1>   というキーワードを記入してください。   遭遇歩数:の後の数字は半角で、設定したいエンカウント歩数を入れてください。   1 以上の実数である必要があります。   0 以下の場合はマップのエンカウント歩数が使用されます。 #------------------------------------------------------------------------------  ※ 複数のエリアを重ねた場合   プレイヤーがいる地点が、複数のエリアが重なっている地点だった場合   より領域の狭いエリアの設定が有効になるような処理となっております。   以下に例をあげます。   ・複数のエリアが重なっていて、複数の「遭遇歩数」が設定されている場合    →より狭いエリアの遭遇歩数が採用されます。   ・通常の追加形式のエンカウントリストが複数のエリアに設定されている場合    →元となるマップエンカウントリストにそれらのエリアのエンカウントリストが     加えられます。(本来の仕様のままです)   ・複数のエリアに追加形式、交換形式のエンカウントリストが混在している場合    →リスト交換形式の中で最も狭いエリアのリストがベースとして参照され、     それより狭い追加形式のエリアがあるならば、そのリストが     ベースとなったリストに追加されます。  ※エリアの名前部分にキーワードを記入する方法をとっていますが、   エリアの名前を表示するようなスクリプトが導入されていた際に   キーワードがゲーム上で表示されないような工夫をしております。 またエリア名を求める際、複数のエリアが重なっている場合は 「より狭いエリアが有効」というこのスクリプトの仕様に合わせた より狭いエリアの名前を返す仕組みとなっております。 =end #============================================================================== #============================================================================== # ■ RPG::Area #============================================================================== class RPG::Area #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :lists_exchange # このエリアのリストを交換形式にするか attr_accessor :encounter_step # エリアに設定するエンカウント歩数 #-------------------------------------------------------------------------- # ○ エリアの広さの取得 #-------------------------------------------------------------------------- def scale return @rect.width * @rect.height end #-------------------------------------------------------------------------- # ○ このエリアの名前を返す #-------------------------------------------------------------------------- def true_name return @name end #-------------------------------------------------------------------------- # ○ プレイヤーの位置により適切なエリア名を返す #-------------------------------------------------------------------------- def name return true_name if $game_map == nil return true_name unless $game_player.in_area?(self) name = "" for area in $game_map.map_area if $game_player.in_area?(area) name = area.true_name if area.true_name != "" end end return name end end #============================================================================== # ■ Scene_Title #------------------------------------------------------------------------------ #  タイトル画面の処理を行うクラスです。 #============================================================================== class Scene_Title < Scene_Base #-------------------------------------------------------------------------- # ◎ データベースのロード # name から交換形式とエンカウント歩数の設定を得ます。 #-------------------------------------------------------------------------- alias tig_eae_load_database load_database def load_database tig_eae_load_database for area in $data_areas.values area.name = area.name.sub(/[\<<]リスト交換[\>>]/, "") # 名前の修正と area.lists_exchange = $& != nil # 交換フラグの設定 area.name = area.name.sub(/[\<<]遭遇歩数[::](\d+)[\>>]/, "") area.encounter_step = $1.to_i if $& != nil # エンカウントの設定 area.encounter_step = 0 if area.encounter_step == nil or area.encounter_step < 0 end end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :map_area #-------------------------------------------------------------------------- # ◎ セットアップ # map_id : マップ ID #-------------------------------------------------------------------------- alias tig_eae_setup setup def setup(map_id) tig_eae_setup(map_id) @map_area = [] areas = $data_areas.values.sort{|a,b| b.scale <=> a.scale } for area in areas @map_area.push(area) if area.map_id == @map_id end end #-------------------------------------------------------------------------- # ◎ エンカウント歩数の取得 #-------------------------------------------------------------------------- alias tig_eae_encounter_step encounter_step def encounter_step encounter_step = tig_eae_encounter_step for area in @map_area next unless $game_player.in_area?(area) if area.encounter_step > 0 encounter_step = area.encounter_step end end return encounter_step end end #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ○ エンカウントする敵グループの ID を作成 #-------------------------------------------------------------------------- def staying_area array = [] for area in $game_map.map_area array.push(area.id) if $game_player.in_area?(area) end return array end #-------------------------------------------------------------------------- # ◎ エンカウント カウント作成 # ※ encounter_countに変更があった場合、それを知れるように履歴を作成します。 #-------------------------------------------------------------------------- alias tig_eae_make_encounter_count make_encounter_count def make_encounter_count @last_staying_area = staying_area tig_eae_make_encounter_count end #-------------------------------------------------------------------------- # ● エンカウントする敵グループの ID を作成 #-------------------------------------------------------------------------- def make_encounter_troop_id encounter_list = $game_map.encounter_list.clone for area in $game_map.map_area if in_area?(area) if area.lists_exchange encounter_list = area.encounter_list else encounter_list += area.encounter_list end end end if encounter_list.empty? make_encounter_count return 0 end return encounter_list[rand(encounter_list.size)] end #-------------------------------------------------------------------------- # ◎ エンカウントの更新 # ※ encounter_countに変更があった場合、 # 新しいencounter_countでの遭遇歩数を作成してふたつを比べ、 # より出現歩数の少ない物を採用します。 # (高遭遇率地域に入った際、それがわかりやすいようにしています) #-------------------------------------------------------------------------- alias tig_eae_update_encounter update_encounter def update_encounter unless $game_map.map_area.empty? if @last_staying_area != staying_area count = @encounter_count make_encounter_count @encounter_count = count if @encounter_count > count end end tig_eae_update_encounter end end