【解決済】 同一マップ内で条件によって出現エネミーを変える

しろう
記事: 34
登録日時: 2020年1月25日(土) 17:40

【解決済】 同一マップ内で条件によって出現エネミーを変える

投稿記事by しろう » 2021年2月28日(日) 14:34

いつもお世話になっております。
表題の件でご助力お願いします。

ゲーム内で同じマップだけど時代が変わって出現する敵も違う、という表現をしたのですが
例えばスイッチ1がonの時とoffの時で過去と現在を行き来すると現在だとスライム、過去だとドラゴンが出現する
感じです。
リージョンというので1マスづつ別のエネミーグループを設定出来るのは分かったのですが同じマスで条件によってエネミーを変えるというのが表現出来なかったので…。

一応リージョンIDでマップ内のエネミーグループを選別はしています(水のマスにはクラゲのエネミーとか)。

宜しくお願いします。
最後に編集したユーザー しろう on 2021年3月02日(火) 22:09 [ 編集 1 回目 ]

DEDEN
記事: 58
登録日時: 2018年8月25日(土) 15:06

Re: 同一マップ内で条件によって出現エネミーを変える

投稿記事by DEDEN » 2021年2月28日(日) 16:15

しろう 様 こんにちは
スクリプトを作ってみようかと思うのですが
一つのスイッチをONにしたら全てのマップのエンカウントグループが切り替わる方式で大丈夫ですか?
それともマップごとにスイッチを割り当てて切り替える方がいいですか?

追記:両方実装できそうなのでやってみます
少々お待ちください
しろう
記事: 34
登録日時: 2020年1月25日(土) 17:40

Re: 同一マップ内で条件によって出現エネミーを変える

投稿記事by しろう » 2021年2月28日(日) 20:28

DEDEN様ありがとうございます。
楽しみに待っております。
DEDEN
記事: 58
登録日時: 2018年8月25日(土) 15:06

Re: 同一マップ内で条件によって出現エネミーを変える

投稿記事by DEDEN » 2021年3月02日(火) 03:35

しろう様 大変お待たせしました
スクリプトが完成しました
私の力不足で使い方が複雑になってしまったので説明をよく読んでご使用ください
ざっくり説明しますと
マップ設定のメモ欄にe_listn[4,5,6]と記入し、その後イベントコマンドのスクリプトで
encounter_switch(マップID,n)と実行すれば指定マップIDの出現エネミーが敵グループID:4,5,6に変化します
但し重みやリージョンを設定する場合はスクリプトエディタでの設定が必要です
不明な点や不具合があればいつでもどうぞ

コード: 全て選択

#==============================================================================
# ■ エンカウントグループ変更 Ver:1.00
#------------------------------------------------------------------------------
#  任意のタイミングでエンカウントするグループを変更できます
#==============================================================================
#==============================================================================
#  〇使い方
#------------------------------------------------------------------------------
#  ●マップのメモ欄にe_list1[グループID]と切り替えたいグループを入力します
#    例:e_list1[1,2,3]
#    末尾番号を増やして複数記入すればその分パターンを増やす事が出来ます
#    例:e_list1[1,2,3]
#       e_list2[4,5,6]
#       と改行して2つ入力すればデフォルトのグループと合わせて3パターンから
#       エンカウントグループを切り替えることができるようになります
#       この方法で設定した場合は全て重み10、出現リージョンは全域になります
#
#  ●重みと出現リージョンも設定したい場合はスクリプトエディタで設定します
#    詳細は下部の設定項目2を参照して下さい
#
#  ●イベントコマンドのスクリプトでencounter_switch(マップID,パターンID)
#    と実行すると指定したマップIDのエンカウントグループを変更できます
#    パターンIDはデフォルトのマップ設定が0、メモ欄等で追加した分が1から順に続きます
#    例1:encounter_switch(1,0)
#       マップID:1番のエンカウントグループがデフォルトに戻ります
#    例2:encounter_switch(2,1)
#       マップID:2番のエンカウントグループが追加設定した1つめのグループに
#       変更されます
#    例3:encounter_switch($game_map.map_id,$game_variables[10])
#        現在のマップのエンカウントグループが変数10番の値になります
#
#  ●イベントコマンドのスクリプトでall_encounter_switch(パターンID)
#    と実行すると全てのマップのエンカウントグループを指定パターンに変更できます
#==============================================================================
#==============================================================================
# ● 設定項目1
#==============================================================================
module Deden
  module Encount_Switch
  #マップ毎のグループ作成最大数 もしも1マップあたり1000以上のグループを指定したい
  #場合はこの値を増やしてください
  GROOP_MAX = 999
  #マップ作成上限数 通常は変更する必要はありません
  MAP_MAX   = 999
  end
end
#==============================================================================
# この間は変更しないで下さい
#==============================================================================
class Scene_Title < Scene_Base
  include Deden::Encount_Switch
  def encounter_info(map_id)
    e_list = [[]]
    GROOP_MAX.times {e_list.push([])}
    case map_id
#==============================================================================
# この間は変更しないで下さい
#==============================================================================
#==============================================================================
# ● 設定項目2
#==============================================================================
#    敵グループ、重み、リージョンを直接設定します
#    マップのメモ欄と重複した場合はこちらが優先されるのでご注意下さい
#------------------------------------------------------------------------------
#   ●設定方法
#   when マップID
#     e_list[パターンID][n] = [敵グループID,重み,[リージョンID]]
#   パターンIDは1からスタートして下さい 番号を飛ばす事はできません
#   nは0からスタートです
#------------------------------------------------------------------------------
#   ●設定例
    when 1 #マップID:1番
      e_list[1][0] = [3,10,[1,2,3]] #敵グループID:3、重み:10、出現リージョン:1,2,3
      e_list[1][1] = [5,20,[4]]     #敵グループID:5、重み:20、出現リージョン:4
      e_list[1][2] = [7,10,[]]      #敵グループID:7、重み:10、出現リージョン:全域
    #上記の設定でマップ1のパターンを1に切り替えるとID:3,5,7の敵グループとエンカウントします
      e_list[2] = [[9,10,[5]],[11,10,[6,7]],[13,15,[8,9,10]]]
    #またこの様に表記すると一括で設定できます
    #上記の設定でマップ1のパターンを2に切り替えるとID:9,11,13の敵グループとエンカウントします
    #ここから追加して下さい
#==============================================================================
#  設定項目終了
#==============================================================================
    end
    return e_list
  end
  #--------------------------------------------------------------------------
  # ● グループ読み込み用の変数用意
  #--------------------------------------------------------------------------
  def create_groop
    $encounter_list = [nil]
    for @n in 1 .. MAP_MAX
      begin
        @map_data = load_data(sprintf("Data/Map%03d.rvdata2", @n))
      rescue Errno::ENOENT
        next
      end
      list = @map_data.encounter_list
      $encounter_list[@n] = [list]
      if encounter_info(@n)[1].size == 0
        map_note_info
      else
        groop = encounter_info(@n)
        for m in 1 .. GROOP_MAX
          break if groop[m].size == 0
          $encounter_list[@n].push([])
          groop[m].each do |f|
            encounter = RPG::Map::Encounter.new
            encounter.troop_id   = f[0]
            encounter.weight     = f[1]
            encounter.region_set = f[2]
            $encounter_list[@n][m].push(encounter)
          end
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● マップデータから取得
  #--------------------------------------------------------------------------
  def map_note_info
    for m in 1 .. GROOP_MAX
      check = "e_list"
      check += m.to_s
      if /^#{check}\[([\d\,]+)\]/ =~ @map_data.note
        $encounter_list[@n].push([])
        $1.split(/\,/).map{|i| i.to_i}.each do |i|
          encounter = RPG::Map::Encounter.new
          encounter.troop_id = i
          $encounter_list[@n][m].push(encounter)
        end
      else
        break
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 現在グループ管理用変数作成
  #--------------------------------------------------------------------------
  def create_groop_list
    $encounter_list_id = [nil]
    MAP_MAX.times {$encounter_list_id.push(0)}
  end
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  alias start_deden start
  def start
    start_deden
    create_groop
  end
  #--------------------------------------------------------------------------
  # ● コマンド[ニューゲーム]
  #--------------------------------------------------------------------------
  alias command_new_game_deden command_new_game
  def command_new_game
    command_new_game_deden
    create_groop_list
  end
end
class Game_Map
  include Deden::Encount_Switch
  #--------------------------------------------------------------------------
  # ● エンカウントリストの取得
  #--------------------------------------------------------------------------
  def encounter_list
    $encounter_list[@map_id][$encounter_list_id[@map_id]]
  end
end
class Game_Interpreter
  include Deden::Encount_Switch
  #--------------------------------------------------------------------------
  # ● エンカウントグループ切り替え
  #--------------------------------------------------------------------------
  def encounter_switch(map_id,groop_id)
    $encounter_list_id[map_id] = groop_id
  end
  #--------------------------------------------------------------------------
  # ● 全マップのエンカウントグループ切り替え
  #--------------------------------------------------------------------------
  def all_encounter_switch(groop_id)
    for n in 1 .. MAP_MAX
      $encounter_list_id[n] = groop_id
    end
  end
end
module DataManager
  #--------------------------------------------------------------------------
  # ● 特異メソッド
  #--------------------------------------------------------------------------
  class << self
    alias :make_save_contents_deden :make_save_contents
    alias :extract_save_contents_deden :extract_save_contents
  end
  #--------------------------------------------------------------------------
  # ● セーブ内容の作成
  #--------------------------------------------------------------------------
  def self.make_save_contents
    contents = make_save_contents_deden
    contents[:list]          = $encounter_list_id
    contents
  end
  #--------------------------------------------------------------------------
  # ● セーブ内容の展開
  #--------------------------------------------------------------------------
  def self.extract_save_contents(contents)
    extract_save_contents_deden(contents)
    $encounter_list_id  = contents[:list]
  end
end
しろう
記事: 34
登録日時: 2020年1月25日(土) 17:40

Re: 同一マップ内で条件によって出現エネミーを変える

投稿記事by しろう » 2021年3月02日(火) 22:08

DEDEN様ありがとうございます!
試してみたところ、非常に分かりやすく簡単に出現グループの切り替えが出来ました!
重みやリージョンの設定の方もメモではなくエディダの方で一括で設定出来るので大きなマップだとこの方がありがたいです。

本当にありがとうございました。
こちらは解決済とさせて頂きます。
DEDEN
記事: 58
登録日時: 2018年8月25日(土) 15:06

Re: 【解決済】 同一マップ内で条件によって出現エネミーを変える

投稿記事by DEDEN » 2021年3月03日(水) 09:03

無事に動作したようで何よりです
後から気付いたのですが既存のセーブデータでエンカウントしたりグループ切替をしようとしたらエラーが起きませんか?
もしそれでお困りなら

コード: 全て選択

$encounter_list_id = [nil]
MAP_MAX.times {$encounter_list_id.push(0)}

適当なイベントを作成してこのコードをイベントコマンドで実行してみてください
その後セーブすれば以降はスクリプト導入前のセーブデータも使えるようになります
役目を終えたイベントは削除して大丈夫です
しろう
記事: 34
登録日時: 2020年1月25日(土) 17:40

Re: 【解決済】 同一マップ内で条件によって出現エネミーを変える

投稿記事by しろう » 2021年3月03日(水) 22:07

お気遣いありがとうございます。
新しいスクリプトを導入した時はニューゲームで確認してるので大丈夫でした。

“VX / Ace:質問” へ戻る