#============================================================================== # ■ XP-RGSS-51 地形別エンカウントリスト [Ver.2.0.0] by Claimh #------------------------------------------------------------------------------ # ・戦闘が発生した場所によって、遭遇するトループ(敵集団)を変更します。 # ・タグ式、エリア式の2つの形態で地形別のエンカウントリストを指定できます。 #------------------------------------------------------------------------------ #【通常方式エンカウントリスト】 # 地形タグ、エリアとは無関係にマップ上すべての場所で # 同じエンカウントリストを指定します。 # マップ設定のエンカウントリストの各トループに対して出現率が設定できます。 #------------------------------------------------------------------------------ #【タグ式エンカウントリスト】 # 地形タグによってエンカウントリストを指定します。 # 設定項目(TAG_ENC_LIST)にトループの指定がなければ、 # マップの設定で設定されているエンカウントリストが適応されます。 #------------------------------------------------------------------------------ #【エリア式エンカウントリスト】 # マップ上のエリア(矩形領域)ごとにエンカウントリストを指定します。 # 設定項目(AREA_ENC_LIST)にトループの指定がなければ、 # マップの設定で設定されているエンカウントリストが適応されます。 #============================================================================== #【再定義】Scene_Map#update #============================================================================== module Area_EncList NORMAL_ENC_LIST = [] TAG_ENC_LIST = [] AREA_ENC_LIST = [] ENCLIST_TYPE_NORMAL = 0 # 通常方式 ENCLIST_TYPE_TAG = 1 # タグ式 ENCLIST_TYPE_AREA = 2 # エリア式 #============================================================================== # □ カスタマイズSTART #============================================================================== #++++++++++++++++++++# # 共通設定 # #++++++++++++++++++++# # 地形別エンカウントリスト機能を無効化するスイッチ # (このスイッチがONのときは地形別エンカウントリスト機能は全て無効になります) ENC_LIST_ALL_SW = 1 # マップごとに適応する地形別エンカウントリストのタイプ # MAP_ENCLIST_TYPE = { # マップID => エンカウントリストのタイプ # } # ※エンカウントリストのタイプ # ENCLIST_TYPE_TAG …… タグ式 # ENCLIST_TYPE_AREA …… エリア式 MAP_ENCLIST_TYPE = { 0 => ENCLIST_TYPE_NORMAL, # タイプ未指定時は共通でNormal 1 => ENCLIST_TYPE_AREA, #ENCLIST_TYPE_TAG, 2 => ENCLIST_TYPE_AREA, 3 => ENCLIST_TYPE_AREA, 4 => ENCLIST_TYPE_TAG } #++++++++++++++++++++++++++++++# # 通常エンカウントリスト設定 # #++++++++++++++++++++++++++++++# # マップ設定の最上段から出現率を設定 # NORMAL_ENC_LIST[マップID] = [1段目の出現率(%), 2段目の出現率(%),・・・], NORMAL_ENC_LIST[1] = [10,20,30,40] NORMAL_ENC_LIST[2] = [20,30,40,10] NORMAL_ENC_LIST[3] = [100] #++++++++++++++++++++++++++++++++# # タグ式エンカウントリスト設定 # #++++++++++++++++++++++++++++++++# # 地形タグによるエンカウントリストの指定 # TAG_ENC_LIST[マップID] = { # 地形タグ(0〜7) => [[トループID, 出現率(%)], [トループID, 出現率(%)],・・・], # } TAG_ENC_LIST[1] = { # マップID:1の設定 0 => [[1,40], [2,40], [3,20]], # 地形タグ:0の設定 1 => [[4,50], [5,50]], # 地形タグ:1の設定 2 => [[6,60], [7,40]] # 地形タグ:2の設定 } TAG_ENC_LIST[4] = { # マップID:2の設定 2 => [[3,100]], # 地形タグ:2の設定 4 => [[5,100]], # 地形タグ:5の設定 7 => [[7,100]] # 地形タグ:7の設定 } #++++++++++++++++++++++++++++++++++# # エリア式エンカウントリスト設定 # #++++++++++++++++++++++++++++++++++# # エリア指定によるエンカウントリストの指定 # AREA_ENC_LIST[マップID] = [ # [[エリア設定],[[トループID, 出現率(%)], [トループID, 出現率(%)]・・・]], # ] # [エリア設定] ⇒ [始点X位置, 始点Y位置, 終点X位置, 終点Y位置] # 始点→┌───────┐ # │ エリア │ # └───────┘←終点 AREA_ENC_LIST[2] = [ # マップID:2の設定 [[ 0, 0, 7, 5], # エリア[始点(0,0)〜終点(7,5)] の設定 [[1,80], [2,20]] ], [[ 0, 6,10,14], # エリア[始点(0,6)〜終点(10,14)] の設定 [[2,25], [5,75]] ], [[ 8, 0,19, 5], # エリア[始点(8,0)〜終点(19,5)] の設定 [[3,100]] ], [[11, 6,19,14], # エリア[始点(11,6)〜終点(19,14)] の設定 [[4,100]] ] ] AREA_ENC_LIST[3] = [ # マップID:3の設定 [[ 0, 0, 7, 5], # エリア[始点(0,0)〜終点(7,5)] の設定 [[1,70], [2,30]] ], [[ 0, 6,10,14], # エリア[始点(0,6)〜終点(10,14)] の設定 [[2,20], [5,80]] ], [[ 8, 0,19, 5], # エリア[始点(8,0)〜終点(19,5)] の設定 [[3,100]] ], [[11, 6,19,14], # エリア[始点(11,6)〜終点(19,14)] の設定 [[4,100]] ] ] #============================================================================== # □ カスタマイズEND #============================================================================== module_function #-------------------------------------------------------------------------- # ● 地形別エンカウントリスト機能が有効? #-------------------------------------------------------------------------- def use_area_enc_list?(map_id) # 機能自体が無効? return false if $game_switches[ENC_LIST_ALL_SW] # エンカウントリストのタイプの設定がなされているか? return false if MAP_ENCLIST_TYPE[map_id].nil? # エンカウントリストの設定がなされているか? 【簡易設定ミスチェック】 case MAP_ENCLIST_TYPE[map_id] when ENCLIST_TYPE_TAG # タグ式 if TAG_ENC_LIST[map_id].nil? p "地形別エンカウントリスト[タグ式]設定ミス!" return false end when ENCLIST_TYPE_AREA # エリア式 if AREA_ENC_LIST[map_id].nil? p "地形別エンカウントリスト[エリア式]設定ミス!" return false end else p "地形別エンカウントリスト[エンカウントリストのタイプ]設定ミス!" return false end # 地形別エンカウント有効 return true end #-------------------------------------------------------------------------- # ● エンカウントリストの生成 #-------------------------------------------------------------------------- def make_enc_list(map_id, data_enclist, tag_id, x, y) case MAP_ENCLIST_TYPE[map_id] when ENCLIST_TYPE_NORMAL # Normal list = make_normal_enc_list(map_id, data_enclist) when ENCLIST_TYPE_TAG # タグ式 list = make_tag_enc_list(map_id, tag_id) when ENCLIST_TYPE_AREA # エリア式 list = make_area_enc_list(map_id, x, y) else return nil end return calc_rating(list) end #-------------------------------------------------------------------------- # ● エンカウントリストの生成【Normal】 #-------------------------------------------------------------------------- def make_normal_enc_list(map_id, data_enclist) list = NORMAL_ENC_LIST[map_id] if NORMAL_ENC_LIST[map_id] return nil if NORMAL_ENC_LIST[0] list = NORMAL_ENC_LIST[0] end enclist = [] for i in 0...data_enclist.size enclist.push([data_enclist[i], list[i]]) end return list end #-------------------------------------------------------------------------- # ● エンカウントリストの生成【タグ式】 #-------------------------------------------------------------------------- def make_tag_enc_list(map_id, tag_id) if TAG_ENC_LIST[map_id].nil? return nil if TAG_ENC_LIST[0].nil? or TAG_ENC_LIST[0][tag_id].nil? return TAG_ENC_LIST[0][tag_id] end return nil if TAG_ENC_LIST[map_id][tag_id].nil? return TAG_ENC_LIST[map_id][tag_id] end #-------------------------------------------------------------------------- # ● エンカウントリストの生成【エリア式】 #-------------------------------------------------------------------------- def make_area_enc_list(map_id, x, y) list = AREA_ENC_LIST[map_id] if list.nil? return nil if AREA_ENC_LIST[0].nil? list = AREA_ENC_LIST[0] end # エリアの特定 return search_area(list, x, y) end #-------------------------------------------------------------------------- # ● エリアの特定【エリア式】 #-------------------------------------------------------------------------- def search_area(encdata, x, y) for enclist in encdata start_x = enclist[0][0] start_y = enclist[0][1] end_x = enclist[0][2] end_y = enclist[0][3] # 範囲内? if start_x <= x and start_y <= y and end_x >= x and end_y >= y return enclist[1] # エンカウントリストを返す end end return nil end #-------------------------------------------------------------------------- # ● 出現率計算 #-------------------------------------------------------------------------- def calc_rating(list) return nil if list.nil? or list.empty? max = 0 index_list = [] for i in 0...list.size index_list.push([list[i][0], max + list[i][1]]) max += list[i][1] end seed = rand(max) for i in 0...index_list.size if index_list[i][1] > seed return [index_list[i][0]] end end return nil end end class Game_Map #-------------------------------------------------------------------------- # ● エンカウントリストの取得 #-------------------------------------------------------------------------- alias default_encounter_list encounter_list def encounter_list # 地形別エンカウントリストが有効? if Area_EncList.use_area_enc_list?(@map_id) # 地形タグの取得 tag_id = terrain_tag($game_player.x, $game_player.y) # 地形別エンカウントリストを取得 enc_list = Area_EncList.make_enc_list(@map_id, @map.encounter_list, tag_id, $game_player.x, $game_player.y) if enc_list.nil? # マップ設定のエンカウントリストを使用する return default_encounter_list else # 地形別エンカウントリストを使用する return enc_list end else # マップ設定のエンカウントリストを使用する return default_encounter_list end end end class Scene_Map #-------------------------------------------------------------------------- # ● フレーム更新 【再定義】 #-------------------------------------------------------------------------- def update # ループ loop do # マップ、インタプリタ、プレイヤーの順に更新 # (この更新順序は、イベントを実行する条件が満たされているときに # プレイヤーに一瞬移動する機会を与えないなどの理由で重要) $game_map.update $game_system.map_interpreter.update $game_player.update # システム (タイマー)、画面を更新 $game_system.update $game_screen.update # プレイヤーの場所移動中でなければループを中断 unless $game_temp.player_transferring break end # 場所移動を実行 transfer_player # トランジション処理中の場合、ループを中断 if $game_temp.transition_processing break end end # スプライトセットを更新 @spriteset.update # メッセージウィンドウを更新 @message_window.update # ゲームオーバーの場合 if $game_temp.gameover # ゲームオーバー画面に切り替え $scene = Scene_Gameover.new return end # タイトル画面に戻す場合 if $game_temp.to_title # タイトル画面に切り替え $scene = Scene_Title.new return end # トランジション処理中の場合 if $game_temp.transition_processing # トランジション処理中フラグをクリア $game_temp.transition_processing = false # トランジション実行 if $game_temp.transition_name == "" Graphics.transition(20) else Graphics.transition(40, "Graphics/Transitions/" + $game_temp.transition_name) end end # メッセージウィンドウ表示中の場合 if $game_temp.message_window_showing return end # エンカウント カウントが 0 で、エンカウントリストが空ではない場合 if $game_player.encounter_count == 0 ##変更START list = $game_map.encounter_list if list != [] # イベント実行中かエンカウント禁止中でなければ unless $game_system.map_interpreter.running? or $game_system.encounter_disabled # トループを決定 troop_id = list[rand(list.size)] # トループが有効なら if $data_troops[troop_id] != nil # バトル呼び出しフラグをセット $game_temp.battle_calling = true $game_temp.battle_troop_id = troop_id $game_temp.battle_can_escape = true $game_temp.battle_can_lose = false $game_temp.battle_proc = nil end end end ##変更END end # B ボタンが押された場合 if Input.trigger?(Input::B) # イベント実行中かメニュー禁止中でなければ unless $game_system.map_interpreter.running? or $game_system.menu_disabled # メニュー呼び出しフラグと SE 演奏フラグをセット $game_temp.menu_calling = true $game_temp.menu_beep = true end end # デバッグモードが ON かつ F9 キーが押されている場合 if $DEBUG and Input.press?(Input::F9) # デバッグ呼び出しフラグをセット $game_temp.debug_calling = true end # プレイヤーの移動中ではない場合 unless $game_player.moving? # 各種画面の呼び出しを実行 if $game_temp.battle_calling call_battle elsif $game_temp.shop_calling call_shop elsif $game_temp.name_calling call_name elsif $game_temp.menu_calling call_menu elsif $game_temp.save_calling call_save elsif $game_temp.debug_calling call_debug end end end end