[VX] シンボルエンカウントシステムを実現する

VX標準システムのエンカウント方式は「ランダムエンカウント」に
なっていますが、これを「シンボルエンカウント」に置き換える作業は
非常に煩雑であり、また、融通の利かない状況となっています。

今回公開するスクリプトは、シンボルエンカウント方式の導入の
手間を少しでも緩和し、且つ構想するシステム実現の手助けをする
ものです。

画像


スクリプト素材のダウンロードは↓
http://www.lm-t.com/blog/sym_enc_101.zip

[2013/02/16追記]
不具合の修正を行いました。(Ver1.01)


-----機能説明ここから-----
■基本情報■
1.機能概要
 シンボルエンカウント支援スクリプトは、VX標準システムでは
 サポートされない「シンボルエンカウントシステム」を比較的簡単に
 実現するためのものです。

 このスクリプトにより、以下のような仕様のゲームを作成できるように
 なります。

 ・敵キャラ(シンボル)と接触したらバトルが発生する
 ・シンボルが主人公を見つけたら追いかけてくる
 ・シンボルに近付いたら逃げられる
 ・その他、シンボルエンカウントシステムに関する細かい設定


2.簡単な使い方
 シンボルエンカウント支援スクリプトには、様々な機能を搭載している
 ので全ての機能を使いこなすにはある程度慣れが必要になりますが、
 基本的な使い方であれば特に難しい設定をすることなく使用可能です。

 (1) スクリプトの導入
  後述する「導入手順」に従ってスクリプトを導入します。

 (2) イベントの配置
  シンボルを配置したい場所にイベントを配置します。
  イベントの内容は何も設定する必要はありません。
  (設定してもシンボルの動作に変化はありません)

 (3) シンボルの動作設定
  
画像

  配置したシンボルがどのような振る舞いをするかを設定します。
  設定は、イベント名に拡張オプションを記述することで振る舞いを
  決定します。イベント名は、以下の書式で記述してください。

  任意のイベント名

  「任意のイベント名」には何を入力しても構いません。
  (無くても構いません)

  「xxxxx」にはシンボルの振る舞いを決定する単語を入力します。
  以下のいずれかの単語を入力します。

  ・warlike
   好戦的なシンボルです。接近した状態でプレイヤーを発見すると
   追いかけてきます。

  ・coward
   臆病なシンボルです。接近した状態でプレイヤーを発見すると
   プレイヤーから遠ざかろうとします。

  ・flyable
   飛行するシンボルです。山・海・壁など、通行不可能なタイルを
   すり抜けます。好戦的なシンボルと同様に接近した状態で
   プレイヤーを発見すると追いかけてきます。

 (4) バトルする敵グループの設定
  
画像

  
画像

  シンボルとプレイヤーが接触するとバトルが発生します。
  バトルする敵グループは、シンボルを配置した場所のエリア設定から
  決定します。

  エリア設定からの敵グループ選定処理はVX標準システムと同様です。

 以上の設定を行うことでシンボルエンカウントシステムが動作します。
 シンボルエンカウントシステムを使用する場合は、イベントで
 エンカウント禁止設定をONにしておいてください。ONにしておかないと、
 ランダムエンカウントシステムと混在して動作してしまいます。


■詳細情報■
シンボルエンカウント支援スクリプトが搭載する全ての機能について、
詳細な説明と使い方を説明します。

1.プリセット
 
画像

 「シンボルの動作設定」で指定するwarlike, cowardなどは、
 動作設定の「プリセット」として最初から定義されていますが、
 プリセットは独自に作成することもできます。
 本章ではプリセットの定義方法について解説します。

 (1) 定義場所
  プリセットはConfigモジュールの「SYM_PRESETS」という変数の中に
  定義します。新しくプリセットを定義する場合は既存の定義の
  下部に追記していきます。書式は既存の定義をコピーすると
  定義の誤記による誤動作の確率を軽減できます。

  以下、プリセット内に定義する設定内容の詳細を説明します。

 (2) 有効状態の設定
  プリセットが有効かどうかを決定します。無効にされたプリセットを
  指定しているシンボルは画面上に表示されなくなります。

  sw="xxx"

  xxxにはスイッチの番号を指定します。ここで指定したスイッチが
  ONの場合にプリセットが有効であると見なします。この設定を
  定義しなかった場合、プリセットは常に有効となります。

 (3) 振る舞いの設定
  振る舞いには、シンボルの動き方・速さ・動く頻度を設定します。

  far="action-speed-frequency-distance"
  near="action-speed-frequency-distance"

  farには、シンボルがプレイヤーを「遠い距離に居る」と認識している
  場合の振る舞いを記述します。
  nearには、シンボルがプレイヤーを「視認し、且つ近い距離に居る」
  と認識している場合の振る舞いを記述します。

  ・action (動作種別)
   freeze   その場から動かない
   random   ランダムに移動する
   approach  プレイヤーに近付く
   escape   プレイヤーから遠ざかる
   custom   カスタム (4)に詳細を記述します

  ・speed (移動速度)
   fastest   4倍速
   fast    2倍速
   normal   標準速
   slow    1/2倍速
   slower   1/4倍速
   slowest   1/8倍速

  ・frequency (移動頻度)
   max     最高
   high    高い
   normal   標準
   low     低い
   min     最低

  ・distance (距離)
   ここには、1以上の整数値をタイル数単位で指定します。
   値の意味はfarとnearで若干異なります。

   farの場合、シンボルがプレイヤーを遠いと認識する距離です。
   シンボルがnearの状態で、この距離以上プレイヤーから
   離れるとfar状態に切り替わります。

   nearの場合、シンボルがプレイヤーを近いと認識する距離です。
   farの状態で、且つこの距離の範囲内でプレイヤーを視認した場合、
   near状態に切り替わります。

 (4) カスタム動作
  動作種別を細かく設定した場合は、動作種別にcustomを指定します。

  ・U  上に移動
  ・D  下に移動
  ・L  左に移動
  ・R  右に移動
  ・u  上を向く
  ・d  下を向く
  ・l  左を向く
  ・r  右を向く
  ・W  1秒間ウェイト
  ・w  0.1秒間ウェイト

  [設定例]
  custom:RWdwwwDWlwwwLWuwwwUWrwww

 (5) 復活の設定
  シンボルとの接触でバトルに突入し、そのバトルに勝利すると
  シンボルは消滅し、一定時間後に復活するようになっています。

  revival="2.5"
  revival="infinity"

  復活までの時間は秒単位で指定します。「infinity」を指定すると
  シンボルは復活しません。ただし、別のマップに移動し、
  戻ってきた場合は復活します。
  この設定を省略した場合は「infinity」を指定したものとして
  動作します。

 (6) 停止時間の設定
  シンボルは、バトルからマップへ復帰した時に動作を再開するまで
  一定時間停止します。

  freeze="1.0"
  freeze="infinity"

  動作再開までの時間は秒単位で指定します。「infinity」を指定
  すると半永久的に動かなくなります(非推奨)。
  この設定を省略した場合、動作再開まで2秒間停止します。

 (7) 使用エリアの設定
  
画像

  マップに設定した複数のエリア設定の中から、シンボルで使用する
  エリアを限定することができます。

  area="my_area"

  上記をプリセットに組み込んだ場合、以下のように記述された
  エリアのみがエンカウント対象として使用されます。

  任意のエリア名

  「my_area」には何を指定しても構いません。
  この設定を省略した場合、全てのエリアがエンカウント対象として
  使用されます。

 (8) キャラチップの設定
  シンボルに使用するキャラチップのファイル名を指定します。

  name="Actor1"

 (9) キャラチップのインデックスの設定
  キャラチップのグラフィック内のどのキャラを使用するかを
  決定します。

  index="3"

  インデックスは0~7の範囲で指定してください。

 (10) 向きの設定
  シンボルのデフォルトの向きを指定します。

  direction="8"
  direction="left"

  8 または up    上向き
  2 または down   下向き
  4 または left   左向き
  6 または right   右向き
  random       ランダム

 (11) 歩行アニメの設定
  シンボルの歩行アニメ有無を指定します。

  walk="1"

  歩行アニメをONにしたい場合は1を指定し、
  OFFにしたい場合は0を指定します。

 (12) 足踏みアニメの設定
  シンボルの足踏みアニメ有無を指定します。

  step="1"

  足踏みアニメをONにしたい場合は1を指定し、
  OFFにしたい場合は0を指定します。

 (13) 向き固定の設定
  シンボルの向き固定有無を指定します。

  fix="0"

  向きを固定したい場合は1を指定し、
  OFFにしたい場合は0を指定します。

 (14) すり抜け有無の設定
  シンボルのすり抜け有無を指定します。

  through="0"

  すり抜けをONにしたい場合は1を指定し、
  OFFにしたい場合は0を指定します。

 (8)~(14)の設定を省略した場合、イベントの1ページ目に指定した
 設定が使用されます。プリセット単位で設定を統一したい場合は
 プリセットに値を定義し、シンボル単位で設定を変えたい場合は
 イベントに対して個別に指定します。


2.システムパラメータ
 シンボルエンカウント支援スクリプトには、動作内容を微調整する
 パラメータがいくつかあります。このパラメータを調整するには、
 Configモジュールに定義された定数値を変更します。

 (1) 復活不可能範囲 (SYM_UNREVIVABLE_RANGE)
  プリセットのrevivalで設定した時間が経過しても、シンボルが
  消滅した位置とプレイヤーの距離が、この設定の範囲内の場合は
  シンボルが復活しません。

  値はタイル数単位で指定します。
  デフォルト値は20に設定されています。

  本来このパラメータは表示中の画面範囲内に突然シンボルが復活する
  という不自然さを解消する目的で導入されたものであり、特別な
  理由がない限り設定を変更しないことをお勧めします。

 (2) イベント実行中のシンボル移動可否 (SYM_MOVABLE_WHEN_RUNNING)
  イベントが実行されている時にシンボルが移動することを
  許可するかどうかを指定します。

  trueを指定するとイベント実行中でもシンボルが移動します。
  falseを指定するとイベント実行中はシンボルが移動しません。
  デフォルト値はfalseに設定されています。

  この値にtrueを指定した場合、イベント実行中にシンボルが
  プレイヤーの周りに集中してしまう可能性がありますので、
  通常はfalseで仕様を検討することをお勧めします。


3.シンボル操作
 配置したシンボルは、イベントからスクリプトを実行することによって
 意図的に操作することが可能です。
 シンボルの操作を行うには、以下の書式でスクリプトを実行します。

 Ex.sym_op(
  target_type,
  target_param,
  op_type,
  op_param1,
  op_param2
 )


 (1) target_type
  操作対象のシンボルを指定します。

  ・Ex::SYM_ALL
   マップ上の全てのシンボルを操作対象にします。
   この値を指定した場合、target_paramにはnilを指定してください。

  ・Ex::SYM_IN_RANGE
   target_paramに指定した範囲内に存在する全てのシンボルを対象に
   します。範囲はタイル数単位で指定してください。

  ・Ex::SYM_OUT_RANGE
   target_paramに指定した範囲外に存在する全てのシンボルを対象に
   します。範囲はタイル数単位で指定してください。

  ・Ex::SYM_NAME
   target_paramに指定した名前のプリセットを適用しているシンボル
   全てを対象にします。
   指定例:"flyable"

 (2) target_param
  この値は、target_typeに指定した値によって指定内容が異なります。
  詳細は(1)を参照してください。

 (3) op_type
  操作内容を指定します。

  ・Ex::SYM_FREEZE
   操作対象のシンボルを強制的に停止させます。
   この値を指定した場合、op_param1には停止が解除されるまでの
   時間を秒単位で指定してください。Ex::SYM_INFINITYを指定すると
   半永久的に停止します。
   op_param2は省略してください。

  ・Ex::SYM_KILL
   操作対象のシンボルを強制的に撃破(消滅)します。
   この値を指定した場合、op_param1にはシンボルが復活するまでの
   時間を秒単位で指定してください。Ex::SYM_INFINITYを指定すると
   復活しなくなります。
   op_param2は省略してください。

  ・Ex::SYM_REVIVAL
   操作対象のシンボルを強制的に復活します。
   op_param1, op_param2は省略してください。

  ・Ex::SYM_FAR
   操作対象のシンボルに対してシンボルとプレイヤーが遠い場合の
   振る舞いを変更します。
   op_param1に振る舞いの内容を文字列で指定します。
   例:"escape-fast-max-3"
   文字列の詳細な指定内容は「1.プリセット」の(3)を参照して
   ください。
   op_param2は省略してください。

  ・Ex::SYM_NEAR
   操作対象のシンボルに対してシンボルとプレイヤーが近い場合の
   振る舞いを変更します。
   op_param1, op_param2の内容はEx::SYM_FARと同じです。

 (4) op_param1
 (5) op_param2
  これらの値は、op_typeに指定した値によって指定内容が異なります。
  詳細は(3)を参照してください。


4.状態通知
 シンボルエンカウント支援スクリプトには、現在マップ上のシンボルの
 状態を通知する機能を搭載しています。
 状態通知の機能は、デフォルトではOFFにされています。ONにするには
 以下の書式でイベントからスクリプトを実行します。

 Ex.sym_trigger(
  type,
  param1,
  param2,
  sw
 )


 (1) type
  通知の種類を指定します。

  ・Ex::SYM_LOCKED
   シンボルがプレイヤーを発見するか、見失った場合に通知します。
   この通知は、param1に指定した値によって動作内容が異なります。
   以下にparam1に指定する動作内容を記載します。

    Ex::SYM_ON (Lock-ON)
     マップ上のいずれかのシンボルが1体でもプレイヤーを近いと
     認識している場合に通知されます。

    Ex::SYM_OFF (Lock-OFF)
     マップ上の全てのシンボルがプレイヤーを遠いと認識している
     場合に通知されます。

  ・Ex::SYM_COUNT
   マップ上のシンボルの生存数が指定の数を上回るか下回った場合に
   通知します。
   以下にparam1に指定する値を記載します。

    Ex::SYM_ABOVE
     生存数を「以上」でカウントします。

    Ex::SYM_BELOW
     生存数を「以下」でカウントします。

   param2には通知の判定に使用する生存数を指定します。

 (2) param1
 (3) param2
  これらの値は、typeに指定した値によって指定内容が異なります。
  詳細は(1)を参照してください。

 (4) sw
  通知の条件を満たしたタイミングで編集するスイッチの番号を
  指定します。正の整数値を指定した場合、指定した番号のスイッチが
  ONになり、負の整数値を指定した場合、指定した番号のスイッチが
  OFFになります。

 この機能で通知の条件を満たした場合、swで指定したスイッチの編集を
 行った後でイベントの実行要否の判定が行われ、条件を満たした
 イベントが見つかった場合、そのイベントが実行されます。

 一度通知の条件を満たすと、その条件はクリアされます。
 連続して通知を行いたい場合は、条件を満たす度に条件の再設定を
 行う必要があります。


■導入手順■
1.導入前の準備
 このスクリプトは

 ・拡張オプションスクリプト

 上記スクリプトを最初に導入しておいてください。
 すでに導入済みの場合はこの作業を省略できます。


2.スクリプトの追加と置換
 (1) 追加
  以下のスクリプトは標準のスクリプトには存在しないものなので、
  手動で追加する必要があります。スクリプトの名前は各ファイル名
  から「.txt」を除いたものにしてください。

  Config.txt
  Ex.txt
  Game_Symbol.txt

  ただし、過去に公開された拙作のスクリプト素材を導入済みで、
  すでに同じ名前のスクリプトが存在する場合は、以下のコメントで
  囲まれている部分を手動で追加してください。

  #T14-036 NEW--->
  #<--------------

 (1) 置換
  以下のスクリプトの内容を書き換える作業を行います。

  Game_Map.txt    → Game_Map
  Game_Player.txt  → Game_Player
  Game_Temp.txt   → Game_Temp
  Scene_Battle.txt  → Scene_Battle
  Spriteset_Map.txt → Spriteset_Map

  上記で示したスクリプトに、以下のコメントで囲まれている部分を
  手動で追加してください。

  #T14-036 ADD--->
  #<--------------

  変更する箇所を間違えないように注意してください。

 ●注意
 置換作業を行う前に必ずバックアップを取っておくようにしてください。
 元のスクリプトの状況によっては、置換を行うことでスクリプトが
 正常に動作しなくなることがあります。
-----機能説明ここまで-----

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 3

面白い
ナイス ナイス

この記事へのコメント

J-SON
2012年06月06日 21:43
このスクリプトはゲームシステムを丸ごと変更するインパクトがあります。

本素材を導入後、実現したいゲームシステムを十分に検証したうえで制作を進めることをお勧めします。十分に検証しないまま制作を進めると、本素材の思わぬ不具合に遭遇した時に、制作の進捗が大幅に後退してしまう可能性があります。
名無し
2012年12月12日 01:09
タイトル画面でニューゲーム、若しくはコンティニューを選択すると

スクリプト'Game_Map'の109行目でNomethodErrorが発生しました。
undefined method`exop='for #

とエラーが出たのですが、どうすれば治せるでしょうか?
拡張オプションスクリプトは導入しています。
J-SON
2012年12月12日 23:37
情報が限定的なので適切な回答ができるかどうか分かりませんが、まずは以下を確認していただけますでしょうか?

1.Exのスクリプト内に以下の記述があるか
class Game_Event < Game_Character
 attr_accessor :exop
end

2.上記が module Ex ~ end の外側に記述されているか

よろしくお願いします。
冬真
2013年03月18日 20:59
戦闘に勝利した際、その勝利した回数を
裏で変数に加算させていきたいのですが、
変数を操作する事は可能でしょうか……?
できれば戦った回数なども裏で計算しておきたいのですが……。
J-SON
2013年03月18日 22:59
いずれの処理も、Scene_Battleに少し手を加えるだけで実現できそうです。

戦った回数は、process_battle_startの先頭で$game_variables[格納したい変数の番号] += 1

勝った回数は、process_victoryの先頭で$game_variables[格納したい変数の番号] += 1

と記述することで実現できるように思います。
動作未検証なのであまり発言に責任は持てませんが、悪しからずご了承ください。
冬真
2013年03月19日 22:52
回答ありがとうございます。
試してみたところ、どちらも実現できました!
水無月
2015年07月18日 21:05
初めまして。このスクリプトを使用しようと思ったところ、

 スクリプト'Game_Map'の112行目でNoMethodErrorが発生しました。
 underfined method '[]'for nil:NilClass

というエラーが出てしまいました。どうすれば問題なく動作できるでしょうか。
貴サイトでは他にも文字速度のスクリプトを導入させていただいています。
水無月
2015年07月19日 18:24
導入しなおしたら無事に動作しました。お手数おかけしました。
改めて質問なのですが、敵キャラ(シンボル)と接触したらバトルではなくイベントを発生させることは可能でしょうか?
J-SON
2015年07月19日 20:14
>> 水無月様
初めまして。
当ブログのスクリプトをご利用賜り光栄に思います。

ご質問の件ですが、現在の当スクリプトの仕様では、接触時バトルの代わりにイベントを発生させる機能がありません。

この記事へのトラックバック