RGSS2備忘録その10 エネミー大量・ランダム出現

こんばんわ( ^ω^)
RGSSシリーズは、もうやらないとルーカン様に誓いましたが、
やり方を教えてほしいという要望がありましたので、再開
することにしました。

今日やりまするのは、エネミー大量・ランダム出現というものです。
簡単にたくさんのエネミーの組み合わせを作り出せるというスクリプトです。
とにかく、はやくやりたいんだよ!(`・д・´)
という方は、とりあえず以下のスクリプトを、(ここに追加)という部分に
コピーしてください。
今回のは結構長いので、他のスクリプトを導入しているとエラーが起こる可能性があります。
必ずバックアップを取っておいてくださいね。

class Game_Troop
  def setup(troop_id)
    clear
    @troop_id = troop_id
    @enemies = []
    #★
    if $data_troops[troop_id].pages[0].list[0].code == 108
      setup2
      return
    end
    for member in troop.members
      next if $data_enemies[member.enemy_id] == nil
      enemy = Game_Enemy.new(@enemies.size, member.enemy_id)
      enemy.hidden = member.hidden
      enemy.immortal = member.immortal
      enemy.screen_x = member.x
      enemy.screen_y = member.y
      @enemies.push(enemy)
    end
    make_unique_names
  end
 
  def setup2
    index = 0
    enemy_size = 0
    while $data_troops[@troop_id].pages[0].list[index].parameters[0] != nil
      a = eval($data_troops[@troop_id].pages[0].list[index].parameters[0])
      for i in 1..a[1]
        enemy_id = a[rand(a.size - 2) + 2]
        if (a[0] > rand(100)) or (enemy_size == 0)
          enemy = Game_Enemy.new(enemy_size, enemy_id)
          enemy.hidden = false
          enemy.immortal = false
          @enemies.push(enemy)
          enemy_size += 1
        end
      end
      index += 1
    end
    make_unique_names
  end
end

class Spriteset_Battle
  def lined_up_enemies
    whole_x = 0
    i = 1
    for sprite in @enemy_sprites.reverse
      sprite.battler.screen_y = 285
      whole_x += (sprite.width * sprite.zoom_x).ceil
      i += 1
    end
    line = (whole_x / 544) + 1
    j = 1
    for sprite in @enemy_sprites.reverse
      sprite.battler.screen_x = (544 / (1 + @enemy_sprites.size)) * j
      sprite.battler.screen_y -= (j % line) * 15
      j += 1
    end
  end
end
 
class Scene_Battle
  def start
    super
    $game_temp.in_battle = true
    @spriteset = Spriteset_Battle.new
    @message_window = Window_BattleMessage.new
    @action_battlers = []
    create_info_viewport
    @spriteset.lined_up_enemies #★
  end
end

class Window_TargetEnemy
  def initialize
    commands = []
    @enemies = []
    for enemy in $game_troop.members
      next unless enemy.exist?
      commands.push(enemy.name)
      @enemies.push(enemy)
    end
    row = (@enemies.size / 2) + 1
    super(416, commands, 2, row)
    self.height = 4 * WLH + 32
  end
end



スクリプトの説明は省略します。
どうしても訊きたいことがある方はコメントの方にお願いいたします。

エネミーの指定は、バトルイベントの1ページ目の1行目から注釈で次のように
入力してください。
[r, n, ID1, ID2, ID3・・・・]
r = 出現確率 1~100までの数字
n = 繰り返し数 1以上の数字
ID1, ID2・・・ = ランダムに出現させるエネミーのID


IDが、1、2、3のエネミーを80%の出現確率で、最大10匹登場させたい場合は、

[80, 10, 1, 2, 3]

という風になります。
また、括弧おきに改行して、複数の指定もできます。
080417_01.jpg

という風に。


バトルイベントの1ページ目の1行目を注釈にすることによって、今回のスクリプトが
実行されます。注釈で括弧以外のことを書くと、エラーが起こりますので
注意してください。
出現確率をかなり低い値にしても、1匹目は必ず出現します。
戦闘画面に切り替わったが、エネミーが全く登場しなかった、ということは起こりません。

説明は以上ですが、
あまりエネミーを出しすぎると夢にも出てきますので、注意してくださいね( ^ω^)
ではまた(^▽^)ノシ
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

感銘を受けました

こんなに理想どおりのスクリプトがあるなんて・・・・・・、
狂喜乱舞しました。
自分はRGSS2の基礎をかじった程度なのですが、
こういうスクリプトが書けたらなと憧れます。
ほんとにスバラスイ、重宝します。

どうもです。

そんなふうに言っていただけるとは光栄です。
スクリプトは、眺め続けてると、ある日突然わかるようになります。
それより ぷらむさんのゲームを拝見いたしました。
ジャンル名がすごいですね。( ^ω^)
どうでもいいことですが、「おもむろ」の使い方がまちがってませんか?
まだ、少ししかやってませんが、がんばってクリアしたいと思います。
では、またです。( ^ω^)ノ

お返事ありがとうございます

( ゚д゚)ハッ!
プレイしてくださったんですか!
おもむろにって「それとなく」みたいな意味だと思ってましたら、辞書で調べると落ち着いて事を始めるさまとか書いてありました。(!?)
全ての町的なマップの回復イベントに何故かおもむろにという言葉がついております。
自由に作りすぎて何か理不尽なゲームに仕上がってしまいました。
現在、友人と共同制作でもっとまともなゲームを作ってますw
スクリプトもがんばります!

これはイイですね!

はじめまして!
めんどくさい敵グループの作成を省ける画期的なスクリプトだと思います!
ありがたく使わせていただきますね^^

まだHPはないのですが、作品が完成したらご報告に参ります。

おそれいります

はじめましてharuさん。
丁寧にご報告ありがとうございます。
haruさんのゲームが無事完成されることを
お祈りしています。( ^ω^)

管理人様

こちらのスクリプト、使わせてもらってます。大変便利で重宝しております。ありがとうございます。
質問があるのですが、

>括弧おきに改行して、複数の指定もできます

とありますが、
一つの注釈に複数の括弧書きを作って設定した場合、
例えば
[80, 10, 1, 2, 3]
[20, 2, 1, 2, 3]
[50, 5, 1, 2, 3]
こんな形にしたとします。


この場合、「最初の一匹は必ず出現する」、
とのことですが、それは「戦闘毎に必ず一匹出現する」という意味なのか、
それとも、

[80, 10, 1, 2, 3]で少なくとも一匹

[20, 2, 1, 2, 3]で少なくとも一匹

[50, 5, 1, 2, 3]で少なくとも一匹


というように、括弧書き毎に最低一匹という意味で、この例ですと最低3匹という意味になるのかがよくわかりません。


教えていただけないでしょうか。

No title

ryuさんへ
正解は、前者です。
てか、返事するのおそくなってすみません(´;ω;`)ウッ
もう見てないかな( ^ω^)

No title

管理人様

ありがとうございます^^
助かりました。

Ace対応版を是非…

初めまして、失礼いたします。

こちらの「エネミー大量・ランダム出現」を、ツクールVXで有り難く使用させて頂いております。
このスクリプトは最も気に入っているものの一つで、存在を知った時は本当に大喜びでした。

この度『VXAce』が発売しましたが、さすがにこのスクリプトそのままは使用できず、非常にショックで…。
自力で何とかならないかといじってみましたが、やはり素人では無理でした。

記事にも「もうやらない」的な記載がありますので、厳しいかもしれませんが、
わずかでも可能性が増えればと思い、投稿させて頂きました。
厚かましいお願いですが、もし気が向きましたらで結構ですので、Ace対応版をご検討頂ければと思います。

こんばんわ( ^ω^)

ケイシルさん
どうもはじめまして
まさか、いまだに当ブログをご覧に
なってくださる方がいたなんて・・・
うれしくて涙が出てきました (つω;`)

ランダム出現は、もちろんVX aceでも
試してみようと思いますので、
首を50cm長くして待ってください。( ^ω^)

ありがとうございます!

おはようございます、ケイシルです。
これほど早くご返信頂けるとは思ってませんでしたので、驚いてます!

Aceでもランダム出現を試して頂けるとの事で、大変嬉しいです!
VXでは導入も非常に簡単で、使い勝手も非常に良かったです。ランダム好きには最高でした。
他のサイトでも探したのですが、ありそうでないスクリプトなので、やはり素晴らしいなって思います。

全く急いではおりませんし、もちろんダメでも全然構いません。
Suppon様のご負担にならないよう、密かに楽しみにしてますね。応援してまーす!(p(>v<)q)

No title

エネミー大量・ランダム出現について

どうもはじめまして、矢口と申します

Supponさまのエネミー大量・ランダム出現の利便性に惚れ込み、愛用させて貰っているのですが……ひとつ気になった点が。
このスクリプトを使い、ランダムで敵を出現させるのは特に問題ないのですが、ボス戦など固定の敵グループ(要するにランダムではない敵グループ)をこのスクリプトを導入した状態で呼び出すと、モンスターの配置をどんなにいじっても整然とした形で出現してしまいます。(たとえば、スライム二体を上下に並べても横一列の形で出現といった感じです)

これをどうにか回避して、固定敵は自由な配置で出現できるようにできないでしょうか?

ちなみに私が使用しているツクールはVXです。

No title

こんにちわ 矢口さん( ^ω^)
こちらのスクリプトをお使いいただきありがとうございます。
ご質問についてですが、
敵の数が8体以下なら、1ページ目のバトルイベントの注釈がない状態であれば、固定された設定通りになります。
・・・ってことはやっぱりすでにご存じですよねΣ(・ω・`;)

矢口さんがおっしゃってるのは、当スクリプトを使って敵の数が9体以上で
かつ、表示位置を自分で設定したいということですよね。( ^ω^)
ま、結論からいいますと、可能ですが、少々面倒かもしれません。Σ(゚Д゚; エーッ 

とりあえず、思いついた方法を簡単に説明すると
スクリプトで$game_troop.members[n] #(nは整数)
↑でエネミーオブジェクトにアクセスできるので、
$game_troop.members[n].screen_x = 100
という風にバトルイベントの部分にスクリプトとして
入力して、実行させると、n+1番目のエネミーの
X座標が100になります。
screen_yでY座標も同じようにできます。

ただ、バトルイベントを起動するタイミングは
最も早くて、「○○が出現!」と表示された後になりますので、
このままだと、敵が出現した後に動くことになるのでかっこわるいと思います。

この問題を回避するためにはスクリプトエディタのScene_Battleのページの
開始処理のdef startのendの行の直前に"process_battle_event"と入れてみてください。
そうすれば最初からエネミーが移動した状態から戦闘が開始すると思います。
ただしこのままだと他の戦闘で、戦闘が始まる前にイベントが開始されて不具合を
生じる可能性があるので、
process_battle_event if $game_switches[n] #(nはスイッチの番号)
という風にしてみてください。そうすると番号nのスイッチがonになっているときだけ
実行するようになるので、他の戦闘でイベントを作動させないということが
可能になります。

座標は数値で入力しないといけないので、試行錯誤が必要かと思います。(´;ω;`)ウッ
説明文も長々となってしまったので、わかりにくいところがあるかもしれません。
もし、質問がありましたら、ご気軽にどうぞ( ^ω^)
でわ矢口さんの拳闘をお祈りしております。( ^▽^)ノシ

No title

お早い対応ありがとうございます。
あの、こんなに丁寧に応えて頂いて大変恐縮なのですが……ちょっと
こちらの言いたかったことが伝わらなかったかもしれません。

<敵の数が8体以下なら、1ページ目のバトルイベントの注釈がない
 状態であれば、固定された設定通りになります。

私のゲームはシステムの都合上、敵は8体以下で製作しているので9対以上の
固定敵は出現しません(つまり実質スクリプトの「大量」の部分は使用してい
ない)。
一応なんのスクリプトも導入していない新規のプロジェクトに「エネミー大量
・ランダム出現」を入れて、初期のスライム×2を上下に二段アイスクリーム
みたく並べて戦闘テストもしてみましたが(もちろん1ページ目のバトルイベン
トに注釈は入れていません)やはり横一列に並び直して出現してきます。

図であらわすならこんな感じです↓

こう並べた敵が            こうなって現れます
        ●     →
        ●            ●   ●

雑魚戦はランダム出現させて、ボス戦はちょっと特殊な配置にしたいだけだったのですが……。
労力をかけて長文を書いていただいたのにすみません。

No title

こんばんわ 矢口さん( ^ω^)
やっと理解しました。
実は自分で作ったスクリプトにもかかわらず、
てっきりバトルイベントに注釈をいれなければ
敵が自動整列しないと勝手に思い込んでいました。
すみません(´;ω;`)ウッ

少しスクリプトの修正が必要となりますので
もうしばらくお待ちいただきたく存じます。m(_ _)m

No title

矢口さんへ
下記のスクリプトをランダム出現の
スクリプトの後にそうにゅうすると・・・( ・`ω・´)
あら不思議、バトルイベントに注釈をいれないと
敵が自動配列しなくなります。( ・`ω・´)

class Game_Troop
alias suppon_patch001_setup2 setup2
def setup2
@use_random_appearance = true
suppon_patch001_setup2
end

def use_random_appearance?
return @use_random_appearance
end

alias suppon_patch001_clear clear
def clear
suppon_patch001_clear
@use_random_appearance = false
end
end

class Spriteset_Battle
alias suppon_patch001_lined_up_enemies lined_up_enemies
def lined_up_enemies
return if ! $game_troop.use_random_appearance?
suppon_patch001_lined_up_enemies
end
end

もし不具合がございましたらごれんらくください。Σ(・ω・`;)

No title

上記のスクリプトを導入した結果、固定敵を自由に配置できるように
なりました。(もちろん、ランダム出現もいままでどおり機能します)
これで、理想どおりの挙動が実現できます。

私の個人的な要望にもかかわらず迅速に対応して頂いて本当にありがとうございました。
プロフィール

Suppon

Author:Suppon
すっぽんでーす。(^▽^)
カルドラ鋭意制作中( ・`ω・´)
Twitter => suppon01
メールはこちらへ
suppon2008@gmail.com

Twitter...

Twitter Reload

最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
リンク
ブロとも申請フォーム

この人とブロともになる