#============================================================================== # ■ RGSS3 ランダムエネミー Ver2.00 by 星潟 #------------------------------------------------------------------------------ # エネミーのメモ欄に設定を行う事で # 敵グループ出現時にランダムで別のエネミーに変化したり # 出現させないようにする設定を行う事が出来ます。 # うまく活用する事で、敵グループのID使用量を大幅に減らした上で # 敵グループを多様化する事が出来ます。 #============================================================================== # エネミーのメモ欄に設定 #------------------------------------------------------------------------------ # <ランダム変化:2:10,3:5,4:3,5:2,6:1> # # それぞれカンマで区切った部位のうち、右側の値を足していく。→合計は21。 # この場合、0〜20までの間のランダムの値を元値として # 左側から順番に、変化率の値を元値から減算しつつ計算していき # 0を下回ったエネミーに変化する。 # この場合、元値から10を引き、その値が0を下回るとエネミーID2に変化。 # 変化しなかったら更に元値から5を引き、その値が0を下回るとエネミーID3に変化。 # 変化しなかったら更に元値から3を引き、その値が0を下回るとエネミーID4に変化。 # 変化しなかったら更に元値から2を引き、その値が0を下回るとエネミーID5に変化。 # 変化しなかったら更に元値から1を引き、その値が0を下回るとエネミーID6に変化。 # ここまでで21引かれているはずなので、必ずこれらのいずれかに変化している。 #------------------------------------------------------------------------------ # <ランダム消去:30> # # この敵は30%の確率で出現しない。 # (この判定はランダム変化の判定より前に行われます) # ただし、一定回数何も出現しない場合は # 処理の円滑化の為、この機能が無効化される。 #------------------------------------------------------------------------------ # <ランダム変化条件:2,$game_switches[1]> # # エネミーID2への変化はスイッチID1がONの時のみ有効となる。 # # ※ランダム変化対象の全てのエネミーがランダム変化条件から外れた場合 #  一定回数までは消去扱いとなるが、一定回数他のエネミーも出現しなかった場合 #  ランダム変化例外で定められたエネミーに変化する。 #------------------------------------------------------------------------------ # <ランダム変化条件:2,$game_variables[2]>0> # # エネミーID2への変化は変数ID2が0を超えている場合のみ有効となる。 #------------------------------------------------------------------------------ # <ランダム変化条件:3,$game_variables[3]<10> # # エネミーID3への変化は変数ID3が10未満の場合のみ有効となる。 #------------------------------------------------------------------------------ # <ランダム変化条件:4,$game_variables[4]>=20> # # エネミーID4への変化は変数ID4が20以上の時のみ有効となる。 #------------------------------------------------------------------------------ # <ランダム変化条件:5,$game_variables[5]<=30> # # エネミーID5への変化は変数ID5が30以下の時のみ有効となる。 #------------------------------------------------------------------------------ # <ランダム変化条件:6,$game_variables[6]==40> # # エネミーID6への変化は変数ID6が40の時のみ有効となる。 #------------------------------------------------------------------------------ # <ランダム変化条件:6,$game_variables[6]!=40> # # エネミーID6への変化は変数ID6が40でない時のみ有効となる。 #------------------------------------------------------------------------------ # <ランダム変化条件:7,$game_party.highest_level>30> # # エネミーID7への変化はパーティの最大レベルが30を超えている場合のみ有効となる。 #------------------------------------------------------------------------------ # <ランダム変化条件:8,$game_player.in_boat?> # # エネミーID8への変化はプレイヤーが小型船に乗っている場合のみ有効となる。 #------------------------------------------------------------------------------ # <ランダム変化条件:9,$game_player.in_ship?> # # エネミーID9への変化はプレイヤーが大型船に乗っている場合のみ有効となる。 #------------------------------------------------------------------------------ # <ランダム変化条件:10,$game_player.in_airship?> # # エネミーID10への変化はプレイヤーが飛行船に乗っている場合のみ有効となる。 # (通常、飛行船に乗っている間は戦闘は発生しない) #------------------------------------------------------------------------------ # <ランダム変化条件:11,!$game_player.in_airship?> # # エネミーID11への変化はプレイヤーが飛行船に乗っていない場合のみ有効となる。 #------------------------------------------------------------------------------ # <ランダム変化条件:12,$game_player.normal_walk?> # # エネミーID12への変化はプレイヤーが乗り物に乗っておらず # 移動ルートの強制を受けていない場合のみ有効となる。 #------------------------------------------------------------------------------ # <ランダム変化条件:13,!$game_player.normal_walk?> # # エネミーID13への変化はプレイヤーが乗り物に乗っているか # 移動ルートの強制を受けている場合のみ有効となる。 #------------------------------------------------------------------------------ # <ランダム変化例外:5> # # ランダム変化条件で一定回数何も出現せずに # 敵グループメンバーが存在しない状態となった場合 # このエネミーはエネミーID5として出現する。 #============================================================================== module RANDOM_ENEMY #ランダム変化に使用するキーワードを指定 Word1 = "ランダム変化" #ランダム消去に使用するキーワードを指定 Word2 = "ランダム消去" #ランダム変化条件に使用するキーワードを指定 Word3 = "ランダム変化条件" #ランダム変化例外に使用するキーワードを指定 Word4 = "ランダム変化例外" #ランダム変化例外で指定されるデフォルトのエネミーIDを指定 #ランダム変化例外を指定しない場合、ランダム変化例外IDはこのエネミーIDになる Enemy = 1 #試行回数何回目までランダム消去を有効にするかを指定 Limit1 = 10 #試行回数何回目までランダム変化条件で敵グループメンバーがいない場合に #ランダム変化例外処理を行わずにやり直すかを指定 Limit2 = 10 end class Game_Troop < Game_Unit #-------------------------------------------------------------------------- # セットアップ #-------------------------------------------------------------------------- alias setup_random setup def setup(troop_id) @true_troop_data = nil setup_random(troop_id) end #-------------------------------------------------------------------------- # 敵グループオブジェクト取得 #-------------------------------------------------------------------------- def troop unless @true_troop_data @true_troop_data = $data_troops[@troop_id].clone return @true_troop_data if @true_troop_data.members.empty? count = 0 a1 = [] a2 = [] loop do @true_troop_data.members.each do |enemy| next if count < RANDOM_ENEMY::Limit1 && eval($data_enemies[enemy.enemy_id].random_delete) > rand(100) a1.push(enemy) end break if !a1.empty? count += 1 a1 = [] end count = 0 loop do a1.each {|enemy| base_enemy = $data_enemies[enemy.enemy_id] if base_enemy.random_change.empty? a2.push(enemy) else hash = base_enemy.random_change.clone hash.keys.each {|k| c = base_enemy.random_change_condition[k] hash.delete(k) if c && !eval(c)} if hash.empty? next if count < RANDOM_ENEMY::Limit2 neo_enemy = Marshal.load(Marshal.dump(enemy)) neo_enemy.enemy_id = base_enemy.random_change_irregular a2.push(neo_enemy) else total = rand(hash.values.inject(0) {|r,i| r += i.to_i}) hash.each {|k,v| total -= v if total < 0 neo_enemy = Marshal.load(Marshal.dump(enemy)) neo_enemy.enemy_id = k a2.push(neo_enemy) break end} end end } break if !a2.empty? count += 1 a2 = [] end @true_troop_data.members = a2 end @true_troop_data end end class RPG::Enemy < RPG::BaseItem #-------------------------------------------------------------------------- # ランダム変化 #-------------------------------------------------------------------------- def random_change @random_change_data ||= create_random_change end #-------------------------------------------------------------------------- # ランダム変化データ作成 #-------------------------------------------------------------------------- def create_random_change h = {} if /<#{RANDOM_ENEMY::Word1}[::](\S+)>/ =~ note $1.to_s.split(/\s*,\s*/).each {|data| array = data.split(/\s*:\s*/) k = array[0].to_i v = array[1].to_i h[k] = v if k > 0 && v > 0} end h end #-------------------------------------------------------------------------- # ランダム消去 #-------------------------------------------------------------------------- def random_delete @random_delete ||= /<#{RANDOM_ENEMY::Word2}[::](\S+)>/ =~ note ? $1.to_s : "0" end #-------------------------------------------------------------------------- # ランダム変化条件 #-------------------------------------------------------------------------- def random_change_condition @random_change_condition ||= create_random_change_condition end #-------------------------------------------------------------------------- # ランダム変化条件データ作成 #-------------------------------------------------------------------------- def create_random_change_condition h = {} note.each_line {|l| h[$1.to_i] = $2.to_s if /<#{RANDOM_ENEMY::Word3}[::](\d+),(\S+)>/ =~ l} h end #-------------------------------------------------------------------------- # ランダム変化例外 #-------------------------------------------------------------------------- def random_change_irregular @random_change_irregular ||= /<#{RANDOM_ENEMY::Word4}[::](\d+)>/ =~ note ? $1.to_i : RANDOM_ENEMY::Enemy end end