#============================================================================== # # ■地形別エンカウント □Ver. 1.11 □製作者:月紳士 # ・RPGツクールVX用 RGSS2スクリプト # # ●…書き換えメソッド(競合注意) ◎…メソッドのエイリアス ○…新規メソッド # # ※二次配布禁止!配布元には利用規約があります。必ずそちらを見てください。 #------------------------------------------------------------------------------ # 更新履歴 # Ver. 1.11 乗り物拡張への併用時の機能対応。 #============================================================================== =begin  エネミーを地形別で遭遇させる為のスクリプトです。  ○簡単な説明    エネミーのメモ欄に     遭遇地形<草原>    というように地形名を記入してください。    設定できる基本地形はデフォルトで以下の通りです。      草原 森 山 荒地 砂漠 雪原 浅瀬 海    複数設定したい場合は     遭遇地形<草原 森>    というようになります。 ※ 空、低空という特殊地形もあります。(カスタマイズ項目参照) ※ 山は、山タイルの通行判定を○にして、初めて意味を持ちます。    ※ また、沼地、街道という地形も登録されていますが、     月紳士のスクリプト「地形追加タイル」を導入することで機能します。     (このタイルIDはサンプル・デフォルトにあわせたものですので、      「地形追加タイル」をカスタマイズして使う場合には、      このスクリプトのIDもカスタマイズする必要があります。)       ○遭遇する敵グループ、遭遇しない敵グループ    その敵グループに遭遇するか否かは    グループを構成するエネミーの遭遇設定から導き出されます。    グループ内のすべてのエネミーが、その地形で遭遇可能の時に    そのグループと遭遇します。    ※ エネミーの組み合わせ次第では、      エンカウントでは遭遇しえないグループも      作れてしまいますので注意してください。      ※ 未設定のエネミーは 浅瀬と海以外で遭遇する仕様です。(デフォルトでは)    ※ 乗り物拡張と併用する際は    乗り物拡張    このスクリプト    の順番でお試しください。    =end #============================================================================== # □ 地形別エンカウント・モジュール(カスタマイズ項目) #------------------------------------------------------------------------------ #  特別な地形名をここで定義しています。 #============================================================================== module Region_Encounter FLYING_REGION_NAME = "空" #-- 空を飛ぶ乗り物に乗っている際に遭遇させたい敵のメモ欄に書く遭遇地形名です。 GROUND_REGION_NAME = "低空" #-- 空以外の全タイルで遭遇させたい敵のメモ欄に書く遭遇地形名です。 # # 洞窟の床など、地形へ登録していないIDのタイルでは # 「海&浅瀬に設定されている敵」以外と遭遇する仕様です。 # #  ※例 エネミーのメモ欄に<遭遇地形:海>と書いていると、 #   未登録タイルを歩いている際には、このエネミーには遭遇しない。 # # つまりこの GROUND_REGION_NAME の地形は、 # 海でも、洞窟でも、どこでも出現させたい、という敵に設定します。 # その性質から、低い場所を飛ぶ魔物(虫など)、というイメージで # 低空 という名前をつけています。 end #============================================================================== # □ Region_Encounter_Data #------------------------------------------------------------------------------ #  エネミー遭遇を地形別に判定させる為のデータを扱うクラスです。このクラスのイ # ンスタンスは $region_encounter_data で参照されます。 #============================================================================== class Region_Encounter_Data #-------------------------------------------------------------------------- # ○ エネミー遭遇地形・データ(データベースの作成) #-------------------------------------------------------------------------- def create_region_data @region = "草原" @tile_id = [2816] @default_encounter = true set_data @region = "森" @tile_id = [2864] @default_encounter = true set_data @region = "山" @tile_id = [2912] @default_encounter = true set_data @region = "荒地" @tile_id = [3200, 3248, 3296] @default_encounter = true set_data @region = "砂漠" @tile_id = [3584, 3632, 3680] @default_encounter = true set_data @region = "雪原" @tile_id = [3968, 4016, 4064] @default_encounter = true set_data @region = "浅瀬" @tile_id = [2048, 2240, 2336, 2432, 2528, 2624, 2720] @default_encounter = false set_data @region = "海" @tile_id = [2096] @default_encounter = false set_data @region = "沼地" @tile_id = [773, 774] @default_encounter = true set_data @region = "街道" @tile_id = [775] @default_encounter = true set_data end #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :regions attr_reader :region_data attr_reader :default #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @region_data = [] @regions = [] @default = [] clear create_region_data end #-------------------------------------------------------------------------- # ○ クリア #-------------------------------------------------------------------------- def clear @region = "" @tile_id = [] @default_encounter = true end #-------------------------------------------------------------------------- # ○ エネミー遭遇地形・データの生成 #-------------------------------------------------------------------------- def set_data @tile_id.each_index{|i| if (2048..8191).include?(@tile_id[i]) @tile_id[i] -= ((@tile_id[i] - 2048) % 48) end } @regions.push(@region) @region_data.push(@tile_id) @default.push(@default_encounter) clear end end #============================================================================== # ■ Scene_Title #------------------------------------------------------------------------------ #  タイトル画面の処理を行うクラスです。 #============================================================================== class Scene_Title < Scene_Base #-------------------------------------------------------------------------- # ◎ 各種ゲームオブジェクトの作成 #-------------------------------------------------------------------------- alias tig_red_create_game_objects create_game_objects def create_game_objects tig_red_create_game_objects $region_encounter_data = Region_Encounter_Data.new end end #============================================================================== # ■ RPG::Enemy #============================================================================== class RPG::Enemy #-------------------------------------------------------------------------- # ○ 遭遇地形の習得 #-------------------------------------------------------------------------- def encounter_region obtain = false result = Array.new(($region_encounter_data.regions.size), false) if /^遭遇地形[<<](.+)[>>]/ =~ @note data = $1 data.gsub!(/[・/, 、]/){ "," } data = data.scan(/\w+/) for word in data if word == Region_Encounter::FLYING_REGION_NAME obtain = true next end next if word == "" if word == Region_Encounter::GROUND_REGION_NAME ground = true next end index = $region_encounter_data.regions.index(word) next if index == nil result[index] = true obtain = true end end if ground result = Array.new(($region_encounter_data.regions.size), true) elsif not obtain result = $region_encounter_data.default end return result end #-------------------------------------------------------------------------- # ○ 遭遇地形の習得(空) #-------------------------------------------------------------------------- def flying_encounter if /^遭遇地形[<<](.+)[>>]/ =~ @note data = $1 data.gsub!(/[・/, ]/){ "," } data = data.scan(/\w+/) return true if data.include?(Region_Encounter::FLYING_REGION_NAME) end return false end end #============================================================================== # ■ RPG::Troop #============================================================================== class RPG::Troop #-------------------------------------------------------------------------- # ○ 遭遇地形の習得 #-------------------------------------------------------------------------- def encounter_region result = Array.new(($region_encounter_data.regions.size), true) for member in members enemy = $data_enemies[member.enemy_id] enemy.encounter_region.each_index { |i| result[i] = false unless enemy.encounter_region[i] } end return result end #-------------------------------------------------------------------------- # ○ 遭遇地形の習得(空) #-------------------------------------------------------------------------- def flying_encounter for member in members enemy = $data_enemies[member.enemy_id] return false unless enemy.flying_encounter end return true end end #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ● エンカウントの更新 #-------------------------------------------------------------------------- def update_encounter return if $TEST and Input.press?(Input::CTRL) # テストプレイ中? if @not_encounter_vehicle_id # 乗り物拡張併用時用 return if @not_encounter_vehicle_id.include?(@vehicle_type) end if $game_player.in_airship? # 飛行中なら @encounter_count -= 1 # カウントを 1 減らす elsif $game_map.mountain?(@x, @y) # 山岳地帯なら @encounter_count -= 3 # カウントを 3 減らす elsif $game_map.bush?(@x, @y) # 茂みなら @encounter_count -= 2 # カウントを 2 減らす else # 茂み以外なら @encounter_count -= 1 # カウントを 1 減らす end end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ○ 現在の遭遇地形indexの習得 #-------------------------------------------------------------------------- def now_region tile_id = @map.data[$game_player.x, $game_player.y, 1] if (2048..8191).include?(tile_id) tile_id -= ((tile_id - 2048) % 48) end $region_encounter_data.region_data.each_index { |i| return i if $region_encounter_data.region_data[i].include?(tile_id) } tile_id = @map.data[$game_player.x, $game_player.y, 0] if (2048..8191).include?(tile_id) tile_id -= ((tile_id - 2048) % 48) end $region_encounter_data.region_data.each_index { |i| return i if $region_encounter_data.region_data[i].include?(tile_id) } return nil end #-------------------------------------------------------------------------- # ○ 山岳地帯判定 # x : X 座標 # y : Y 座標 #-------------------------------------------------------------------------- def mountain?(x, y) return false unless valid?(x, y) tile_id = @map.data[x, y, 1] if (2048..8191).include?(tile_id) tile_id -= ((tile_id - 2048) % 48) end return [2912, 3296, 3680, 4064].include?(tile_id) end #-------------------------------------------------------------------------- # ◎ エンカウントリストの取得 #-------------------------------------------------------------------------- alias tig_red_encounter_list encounter_list def encounter_list list = tig_red_encounter_list.clone if $game_player.in_airship? list.each_index { |i| list[i] = nil unless $data_troops[list[i]].flying_encounter } else if now_region == nil list.each_index { |i| next if list[i] == nil for r_i in 0...$region_encounter_data.regions.size unless $region_encounter_data.default[r_i] list[i] = nil if $data_troops[list[i]].encounter_region[r_i] break end end } else list.each_index { |i| next if list[i] == nil list[i] = nil unless $data_troops[list[i]].encounter_region[now_region] } end end return list.compact end end