RPGツクールVXAceのスクリプト言語であるRGSS3(Ruby1.9.2p0 + ツクールライブラリ)に関する個人メモ。あくまでも個人メモなので管理人以外には編集権限はありません。

×


データベースでスクリプトを使うための前提知識

長文スクリプトを改行する

  • Rubyでは1行が1つの命令文として認識され、Javaのような文末を示す記号はない。命令文が長くなるなどで途中で改行したい場合、文末に \ を追加する、もしくは文末がデリミタ(区切り)で終わるようにすれば改行可能。
  • RGSS3ではイベントでスクリプトを利用する場合、エディタの入力欄の大きさの問題で長文スクリプトがコピペだけでは正常に動作しない事がよくある。下記の例を参照に改行しても良い部分を把握する事で、そういった問題を解消できる。
# 例文 下記スクリプトはスクリプト欄に収まらないため改行されエラーになる
$game_party.battle_members.each{ |actor| actor.tp += 10}  # メンバー全員のTP+10

# 文末に \ を追加する方法
 $game_party.battle_members.each{ |actor| actor.tp \
+= 10}

# デリミタで改行する方法
$game_party.
battle_members.
each{
 |actor|
 actor.tp += 
10}

# エイリアスで長い変数名、メソッド名を短くする方法、この部分はスクリプトエディタで新しいページに記述した方が良い。
alias $pt  $game_party  # 同名のグローバル変数がないか注意
class Game_Party
alias bm :battle_members  # 同名のメソッドがないか注意
end

# 上記を記述後、この部分をイベントのスクリプトに記述する
$pt.bm.each{ |a| a.tp += 10}

# ブロックをprocオブジェクトに分離する
tpup = Proc.new{ |actor| actor.tp += 10 }  # Procオブジェクトの生成
# tpup =   proc{ |actor| actor.tp += 10 }  # proc式
# tpup = lambda{ |actor| actor.tp += 10 }  # lambda式
# tpup =      ->(actor){ actor.tp += 10 }  # lambda式 アロー演算子
$game_party.battle_members.each(&tpup)
# procとlambdaの違いはRubyリファレンスのKernel.lambdaやProcオブジェクトに詳しい
# イベントのたびにProcオブジェクトを生成するのでやや非効率な点に注意

イベント用に短縮エイリアスを設定する

  • これらを設定しておけばこのページのスクリプトを使う際に記述を短縮できる。
    • 短縮名は一例。自分の判りやすい名前にする事。
    • 記述する場合はスクリプトエディタの方に書いておくとよい。
alias $sw   $game_switches       # スイッチは使用頻度が高い
alias $var  $game_variables      # 変数は使用頻度が非常に高い
alias $ss   $game_self_switches  # セルフスイッチはスクリプトイベントから使えると非常に便利
alias $pty  $game_party          # パーティは使用頻度が高い
alias $skl  $data_skills         # スキルデータベースの使用頻度はかなり高いので短縮推奨
alias $itm  $data_items          # アイテムデータベースの使用頻度はかなり高いので短縮推奨
alias $wep  $data_weapons        # 武器データベースの使用頻度はかなり高いので短縮推奨
alias $amr  $data_armors         # 防具データベースの使用頻度はかなり高いので短縮推奨
alias $tmp  $game_temp           # セーブデータに記録されないためスクリプトから利用しやすい
alias $sys  $game_system         # システムは使用頻度が低いので短縮なしでもいい
alias $pl   $game_player         # プレイヤーは使用頻度が低いので短縮なしでもいい
alias $map  $game_map            # マップは使用頻度が低く元々短めなので短縮なしでもいい

アクセスできないインスタンス変数へのアクセス(抜粋)

  • 例えばGame_Partyの @items は itemsメソッドによってラッピングされているためアクセサを指定しても参照できない。
    • こういう場合は Object#instance_variable_get を使うことで @items を直接参照できる。
# 例)Game_Party
p $game_party.items                            # RPG::Itemの配列を返す(ラッピング済み)
p $game_party.instance_variable_get(:@items)   # itemIDをキーとしたアイテムの所持数Hashデータを返す(ラッピング前)
p $game_party.instance_variable_get(:@weapons) # weaponIDをキーとした武器の所持数Hashデータを返す(ラッピング前)
p $game_party.instance_variable_get(:@armors)  # armorIDをキーとした防具の所持数Hashデータを返す(ラッピング前)

# instance_variable_getで使える引数
instance_variable_get("@items")      # 変数名でインスタンス変数の取得 変数が存在しない場合は nil を返す
instance_variable_get(:@items)       # シンボルでインスタンス変数の取得 変数が存在しない場合は nil を返す
instance_variable_set(:@items, var)  # インスタンス変数への代入

# 例)BattleManager
p BattleManager.instance_variable_get(:@preemptive) # 先制攻撃フラグの状態を返す
p BattleManager.instance_variable_get(:@surprise)   # 不意打ちフラグの状態を返す
# 先制攻撃や不意打ちのフラグはターン終了処理でオフになるため参照タイミングに注意

グローバルに参照可能な変数/メソッド(抜粋)

# デバッグフラグ
$TEST   # 実行テスト中ならtrue 戦闘テスト中もtrue game.exeから起動した場合はfalse
$BTEST  # 戦闘テスト中ならtrue

# データベースオブジェクト
$data_actors        # アクター        Data/Actors.rvdata2        RPG::Actor の配列 
$data_classes       # 職業            Data/Classes.rvdata2       RPG::Class の配列 
$data_skills        # スキル          Data/Skills.rvdata2        RPG::Skill の配列 
$data_items         # アイテム        Data/Items.rvdata2         RPG::Item の配列 
$data_weapons       # 武器            Data/Weapons.rvdata2       RPG::Weapon の配列 
$data_armors        # 防具            Data/Armors.rvdata2        RPG::Armor の配列 
$data_enemies       # 敵キャラ        Data/Enemies.rvdata2       RPG::Enemy の配列 
$data_troops        # 敵グループ      Data/Troops.rvdata2        RPG::Troop の配列 
$data_states        # ステート        Data/States.rvdata2        RPG::State の配列 
$data_common_events # コモンイベント  Data/CommonEvents.rvdata2  RPG::CommonEvent の配列 
$data_system        # システム        Data/System.rvdata2        RPG::System
$data_mapinfos      # マップ情報      Data/MapInfos.rvdata2      RPG::MapInfo のハッシュ 

# ゲームオブジェクト
$game_temp.common_event_reserved? # コモンイベントの実行が予約されているかどうか
$game_temp.reserved_common_event  # 予約されているコモンイベントデータの取得
$game_system.save_disabled      # セーブ禁止かどうか 禁止ならtrue
$game_system.menu_disabled      # メニュー禁止かどうか 禁止ならtrue
$game_system.encounter_disabled # エンカウント禁止かどうか 禁止ならtrue
$game_system.formation_disabled # 並び替え禁止かどうか 禁止ならtrue
$game_system.battle_count       # 戦闘回数
$game_system.save_count         # セーブ回数
$game_timer.sec # タイマーの残り秒数
$game_message.texts      # 現在表示中のテキスト
$game_message.choices    # 現在表示中の選択肢
$game_message.face_name  # 現在表示中の顔ファイル名
$game_message.face_index # 現在表示中の顔番号
$game_message.visible    # メッセージ表示中かどうか
$game_switches[n]         # 番号nのスイッチフラグ
$game_variables[n]        # 番号nの変数データ
$game_self_switches[key]  # keyのセルフスイッチフラグ keyは [map_id, event_id, 'A'..'D']
$game_actors[actor_id] # アクターリストのラッパー $data_actorsからGame_Actorクラスのインスタンスを生成する
$game_party.gold              # 所持金
$game_party.steps             # 歩数
$game_party.in_battle         # 戦闘中かどうか 戦闘中ならtrue
$game_party.exists            # メンバーが存在すればtrue
$game_party.members           # 戦闘中は戦闘参加メンバーリスト、移動中は全メンバーリスト
$game_party.all_members       # 全メンバーリスト
$game_party.battle_members    # 戦闘参加メンバーリスト
$game_party.leader            # 先頭メンバー
$game_party.items             # パーティが所持するアイテムリスト 大事なものも含む
$game_party.weapons           # パーティが所持する武器リスト
$game_party.armors            # パーティが所持する防具リスト
$game_party.equip_items       # 武器+防具リスト
$game_party.all_items         # アイテム+武器+防具リスト
$game_party.name              # パーティ名の取得(≒リーダー名)
$game_party.highest_level     # パーティ内で最も高いLv
$game_party.menu_actor        # メニュー画面で最後にカーソルを合わせたアクター
$game_party.target_actor      # メニュー画面でスキルやアイテムのターゲットになったアクター
$game_party.encounter_half?   # エンカウント半減ならtrue
$game_party.encounter_none?   # エンカウント無効ならtrue
$game_party.cancel_surprise?  # 奇襲無効ならtrue
$game_party.raise_preemptive? # 先制攻撃アップならtrue
$game_party.gold_double?      # ゴールド二倍ならtrue
$game_party.drop_item_double? # ドロップ二倍ならtrue
$game_troop.turn_count # 現在のターン数
$game_troop.members    # 敵メンバーリスト
$game_troop.troop      # グループ情報の取得
$game_troop.exp_total  # 倒した敵の経験値合計 実際に倒した敵のみ
$game_troop.gold_total # 倒した敵のお金合計 実際に倒した敵のみ
$game_map.boat             # 小型船の情報取得
$game_map.ship             # 大型船の情報取得
$game_map.airship          # 飛行船の情報取得
$game_map.map_id           # マップID
$game_map.display_name     # マップの表示名
$game_map.width            # マップの横マス数
$game_map.height           # マップの縦マス数
$game_map.loop_horizontal? # マップが横ループするかどうか
$game_map.loop_vertical?   # マップが縦ループするかどうか
$game_map.disable_dash?    # マップがダッシュ禁止かどうか
$game_map.encounter_list   # エンカウントする敵グループのリスト
$game_map.encounter_step   # エンカウント歩数
$game_map.overworld?       # フィールドタイプかどうか
$game_player.vehicle            # 乗り物の取得
$game_player.in_boat?           # 小型船に乗っていればtrue
$game_player.in_ship?           # 大型船に乗っていればtrue
$game_player.in_airship?        # 飛行船に乗っていればtrue
$game_player.normal_walk?       # 乗り物に乗っておらず強制移動中でもなければtrue
$game_player.dash?              # ダッシュ中ならtrue
$game_player.debug_through?     # デバッグすり抜け中ならtrue
$game_player.check_action_event # 決定ボタンでイベントを起動する
$game_player.get_on_off_vehicle # 乗り物を乗り降りする
$game_player.get_on_vehicle     # 乗り物に乗る
$game_player.get_off_vehicle    # 乗り物から降りる
$game_player.on_damage_floor?   # 現在位置がダメージ床かどうか

イベント設定活用術

グラフィック付き空イベント

  • ページ1に空イベントを設定する際、条件として絶対にONにならないスイッチを指定しておく。(例:空イベント用)
  • この状態でグラフィックを設定すれば、エディタ上はグラフィック付きだがゲーム中は非表示のイベントが作れる。
  • 目印用イベントや隠し通路、モブの移動範囲制限用などに使うと便利。

コモンイベント活用術

階層移動コモンイベント

  • 事前準備:同じ大きさの連続するマップを階層順とマップID順を同じ設定する。
    • 例えば地下2階、地上2階の4階層なら、B2F、B1F、1F、2Fの順にマップIDを10、11、12、13と並べる。
  • マップIDを+1、-1したイベントをそれぞれ作る。プレイヤーの現在位置X,Yを変数にセット。階層移動の効果音なども設定。
    • グラフィックを上り階段、下り階段などにするとわかりやすい。
  • これを設定したイベントをコピペするだけで階層移動が完成する。

イベント小技/コモンイベント向けスクリプト

戦闘背景を元に戻す

  • バトルイベントで変更した戦闘背景を元に戻すスクリプト
$game_map.setup_battleback

現在のBGMを戦闘BGMに設定する

  • 戦闘シーンのBGMを現在流れているBGMに変更する。
    • マップBGMと戦闘BGMを同じにすると曲が切り替わらずに流れ続けるので、直前の会話イベントからボスBGMを流し始めるような演出や、FF5のビッグブリッヂのような連続戦闘イベントに使える。
    • 戦闘でBGMが切り替わらない場合、勝利MEは無い方がそれっぽいので、勝利MEをオフにしている。
$game_system.battle_bgm = RPG::BGM.last
$game_system.battle_end_me = RPG::ME.new

戦闘BGMと勝利MEを元に戻す

  • 上記のコモンイベントで変更したBGM、勝利MEや、「戦闘BGMの変更」「戦闘終了MEの変更」を元に戻す。
  • 解説すると、イベントの設定では「戦闘BGMの変更」を元に戻すという設定は存在しない。例えばBGMなしに設定すると当然BGMは流れないため、本来のBGMに変更するという設定が必要になる。しかしこの方法だと、例えば通常戦闘BGMを後から変更しようと思った場合、全ての「戦闘BGMの変更」を再設定しなおす必要が出てくる。
    • 「戦闘BGMの変更」は、実際には本来のBGMを無視して強制的に他のBGMを流す機能だ。本来のBGM設定は変更されていない。にもかかわらず、この「戦闘BGMの変更」をオフにする設定が存在していない。そのため一度でも「戦闘BGMの変更」をしてしまうと、以後本来設定されているBGMは完全に無視され、「戦闘BGMの変更」で設定したBGMしか流れない事になる。
    • 以下のスクリプトは「戦闘BGMの変更」を強制的にオフにする。見ての通り単にnilを代入しているだけだ。ここがnilの場合は本来のBGM設定が有効になる。そのため後からBGMを変更しても問題なく動作する。
$game_system.battle_bgm = nil
$game_system.battle_end_me = nil

バトルイベントで先制攻撃/不意打ちを判定する

  • 条件分岐:スクリプトに下記コードを入力
BattleManager.module_eval{@preemptive} # 先制攻撃の判定
BattleManager.module_eval{@surprise}   # 不意打ちの判定

複数の変数をまとめて変更

# 例)変数17〜19をそれぞれ10、50、100に変更
$game_variables[17..19] = [10, 50, 100]

選択肢の文字列を取得する

  • 選択肢で選んだ項目の文字列を取得する汎用コード。
    • 選択肢:[**]の場合のすぐ下の行に変数の操作:代入:スクリプト。
    • この変数は他のイベントも含めてイベントの出現条件に使用するとエラー落ちするので、必ず専用の変数を用意する。
    • 例として変数[20:選択肢]を使用する。
    • [**]の場合のすぐ下に記述しないと正確な値を取得できない点に注意。
    • 使用した変数は速やかに0を代入して数値以外のデータを保持しないようにする。
@list[@index-1].parameters[1]
# イベント内容例)
◆選択肢の表示:勇者, 魔王
:[勇者] の場合
 ◆変数の操作:[20:選択肢] = @list[@index-1].parameters[1]
 ◆
:[魔王] の場合
 ◆変数の操作:[20:選択肢] = @list[@index-1].parameters[1]
 ◆
:分岐終了
◆文章:-, -, 通常, 下
:  :\v[20] を選んだようだな。
:  :ならばお前は今から \v[20] じゃ!
◆変数の操作:[20:選択肢] = 0
◆

イベントの情報の取得 & 汎用的なリレミトの実装

map_id                                        # 現在のマップID
ev = $game_map.events[@event_id] if same_map? # 現在のイベントの取得
ev.x                                          # 現在のイベントのx座標
ev.y                                          # 現在のイベントのy座標
ev.name                                       # 現在のイベントの名前
  • 上記を利用した汎用的なリレミトの実装
    • 変数17〜19を移動座標用に使用。
  • 公式ヘルプ記載の脱出アイテムの作成との違いは、座標を自動取得する点と、登録、移動をコモンイベントで実装する点。
    • 上記によりメンテナンス性が高く、扱いやすい。
# コモンイベント:[脱出先登録] (データベース:コモンイベント)
  ◆スクリプト:
  if same_map?
    ev = $game_map.events[@event_id]
    $game_variables[17..19] = [map_id, ev.x, ev.y]
  end

# フィールドから洞窟に入るイベント (マップ編集:イベントの作成)
  ◆コモンイベント:[脱出先登録]
  ◆SEの演奏:move
  ◆場所移動:洞窟

# コモンイベント:[洞窟脱出] (データベース:コモンイベント)
  ◆条件分岐:変数[0017]が1以上なら
    ◆場所移動:変数[0017][0018][0019]
    ◆変数の操作:[0017] = 0
  :それ以外の場合
    ◆文章表示「しかし効果がなかった」
  :分岐終了

# スキル:リレミト (データベース:スキル)
 使用効果 コモンイベント:[洞窟脱出]
 メモ欄:<洞窟脱出>
  # コモンイベント名とメモ欄は同じ名前である必要はない
  # 効果、メモ欄が同じなら脱出アイテムとしても実装可能

# 変数17が0ならリレミトを使えない処理(スクリプトエディタ)
# この処理を書かない場合、使えない場所でリレミトを使うと無駄にMPだけ減る
class Game_BattlerBase
  alias xxx001_usable_item_conditions_met? usable_item_conditions_met?
  def usable_item_conditions_met?(item)
    if item.note =~ /<#{:洞窟脱出}>/ && $game_variables[17] == 0
      false
    else
      xxx001_usable_item_conditions_met?(item)
    end
  end
end

# イベントの都合などでリレミトの使用を禁止したい場合
  ◆変数の操作:[0017] = 0
  # 次の洞窟に入るまでリレミトが使えなくなる

イベント設定で入手アイテムを設定できる「ランダムアイテムの入手」

  • スクリプトのみでランダムアイテムの入手を実装しようとするとID指定する事になり、コードを見ても何を入手するか分からない、メンテナンス性が悪いなどの問題がある。
  • イベントのみでランダムアイテムの入手を実装しようとすると判定が煩雑になりすぎてイベントを組む手間がかかり汎用性も低いという欠点がある。
  • スクリプトの汎用性とイベントのメンテナンス性を良いとこ取りしたのが以下のスクリプト。

イベント設定例)ライフアップ〜マジックアップのうち1つをランダムに入手する


コード部分(修正版)
@items = []
while next_event_code==126
  @index += 1
  id, operation, type, operand = 
@list[@index].parameters
  value = operate_value(operation, type, operand)
  @items += [id] * value
end

#-------------------------------------------------

id = @items.sample
if next_event_code == 126
  @list[@index+1].parameters[0] = id
end
@items = nil

解説
  • 一行目のスクリプトは次行のイベントコードを参照してアイテムIDリストを作っている。
  • 二行目からは実際に入手するアイテム候補をイベント「アイテムの入手」で設定している。
    • イベントの設定から設定する事で分かりやすさとメンテナンス性が向上する。
    • 入手数が「重み」になる。例えばマナアップ2、ライフアップ1で設定すると、2/3でマナアップ、1/3でライフアップを入手できる。こういった重み設定はイベントのみで組んだ場合に判定が割りと面倒だったりする。
  • アイテム設定のあとにはアイテムリストからランダムでアイテムを取得するコードと、直後のアイテム入手の内容を書き換えるコードを記述したスクリプトを置く。
  • 最後の行にあるアイテム入手は何を設定しても関係なく、ランダムで取得したアイテムに書き換えられて入手する。
  • 上記のコードの場合、入手するアイテムは必ず一個になる。また武器や防具は設定できない。
    • 改造は容易なので練習がてら自作してみることをオススメする。

シンボルエンカウントで逃げても敵が変化しない

  • シンボルエンカウントでランダムな敵と遭遇するが、逃げた場合だけ敵が変化しないようにするスクリプト例。
    • 前提として、イベントのバトルの設定で敵グループを「ランダムエンカウントと同じ」にしておく。
    • ランダムエンカウントの敵を設定し、そのマップでのランダムエンカウントは禁止ししておく。
    • 勝利した場合にはイベントの一時消去でイベントごと削除する場合にのみ適用可能。
    • これは前述のイベント内容書き換えを利用して簡単に実装する方法の例として載せているので、上記条件に合わない場合には別のアプローチが必要になる。

# 逃げた場合の処理に下記スクリプトを書く
@list[0].parameters[0..1]=[0,$game_troop.troop.id]
# @list[0] の添え字は実際のバトルの処理イベントの書かれた行に合わせて変更する必要がある点に注意。
# 0 は一番上の行に「バトルの処理」イベントがある場合の添え字になる。
# 行番号や変数番号などの都合で複数行になる場合、スペースを削るか、= の後ろで改行するとよい。
解説
  • イベントの情報はマップが切り替わるタイミングでそのマップに設定されているイベントが全て読み込まれる仕様になっている。
  • 読み込まれたイベント情報はメモリに読み込まれ、セーブデータにも記録される。
    • セーブデータに記録されるのはマップ上のイベントの位置やイベント進行状況だけでなく、実際のイベントコードも含まれる。これはイベントの内容がバージョンアップなどで変化した場合、イベント再生位置で予期せぬ不具合が発生するのを防ぐためと思われる。逆に言えば仮にバージョンアップがあったとしてもマップを切り替えないと新しいイベントは読み込まれない。
  • 記録されるのはデータベースそのものではなく、データベースのイベント内容を読み込んだマップ情報である点が重要。
    • 何が違うかというと、イベント内でイベント情報を書き換えても元々のデータベースには影響を与えないため、マップを切り替えれば元に戻るという事。
    • 今回のイベント書き換えはこれを利用して、逃げる=イベント情報がリセットされるまでの間、イベント自体を「逃げた時の敵グループとのバトルに書き換える」事で、逃げても敵が変化しない機能を実装している。
    • 上記の通り、マップを移動すれば敵グループはリセットされる。

全てのピクチャを消去

  • ピクチャの消去は一つ一つ番号を指定して消さないといけないため非常にめんどくさい。一括で消したい場合は以下のスクリプトを使う。
screen.clear_pictures
  • ピクチャは割とメモリの無駄遣いになるため、同じ番号を使いまわしてできるだけピクチャオブジェクトが作成される数を減らすようにしたい。
    • 一度でも作成したオブジェクトは消去してもメモリは開放されない。明示的にスクリプトで削除しない限り永遠に残り続ける事になる。
    • 立ち絵表示プラグインを入れているとかでずっと使いまわすようなピクチャなら良いが、イベントで一度しか使わないピクチャなどは全て同じ番号を使ってインスタンスを使いまわすのが良い。

並列処理を使わずにイベントを復活

  • 倒しても時間で復活するシンボルエンカウントの敵や、エリア内で一定時間ごとに復活する罠などのようなイベントを組む際には主に並列処理が使われる。
    • 数が少なければ問題はないが、マップ内で並列実行されるイベントが増えれば増えるほどCPUの負荷が大きくなり処理落ちが発生する欠点がある。
  • 事前準備は必要だが、下記の方法を使えば並列処理なしで実現できる。
  • 倒しても10秒経過すると復活するシンボルエンカウントの敵の例
    • イベント1ページ目 条件なし
      • 接触を起動条件としてバトル発生するイベントを組む。勝利したらセルフスイッチ'A'をON
    • イベント2ページ目 条件セルフスイッチ'A'、画像なし、内容なし
      • 移動方法をカスタムに設定して、ウェイト600フレーム、スクリプト set_ss('A',false) の順に組む
    • セルフスイッチだけで管理できるのでイベントのコピペも簡単。並列処理の代わりに移動ルートを使うので負荷が低い。
# 事前準備 Game_Characterにセルフスイッチ操作メソッドを追加
class Game_Character
  # セルフスイッチをセット
  def set_self_switch(switch=nil, value=true)
    if switch != nil
      $game_self_switches[getkey(switch)] = true if value
      $game_self_switches.delete(getkey(switch)) unless value
    end
  end

  # self_switchesのハッシュキーを生成する RGSS3ではキーワード引数を使えないので代替
  def getkey(switch)
    return [$game_map.map_id, @id, switch]
  end
  
  alias set_ss  :set_self_switch
end







条件分岐(変数の操作)向けのスクリプト

  • イベントの設定にある項目では対応しきれない条件を設定したい場合に使えるスクリプト集

メンバーの中に特定のスキルを覚えている者が居るかどうか?

  • 特定のアクターが習得しているかどうかは条件分岐で判別できるが、現在のメンバーに習得者が居るかどうかは下記スクリプトが必要。
  • 条件分岐による習得判別では特徴分は判定されないので、特徴分も含める場合には下記スクリプトが必要。
# ID=92 のスキルを習得しているメンバーが存在するかどうか
$game_party.members.any?{|a| a.skills.include?($data_skills[92])}
# 戦闘に参加しないメンバーも調べる場合
$game_party.all_members.any?{|a| a.skills.include?($data_skills[92])}
# レベルアップで習得するスキルだけを調べたい場合(特徴での追加分は除外)
$game_party.members.any?{|a| a.skill_learn?($data_skills[92])}
# 逆に特徴(アクター、クラス、装備、ステートなど)による追加だけを調べたい場合
$game_party.members.any?{|a| a.added_skills.include?(92)}

メンバーの中に特定の武器防具を装備している者が居るかどうか?

  • 特定のアクターが装備しているかどうかは条件分岐で判別できるが、現在のメンバーに装備者が居るかどうかは下記スクリプトが必要。
# 例)ID=5 の武器を装備しているメンバーが居るかどうか
$game_party.all_members.any?{|a| a.equips.include?($data_weapons[5])}
# 例)ID=45 の防具を装備しているメンバーが居るかどうか
$game_party.all_members.any?{|a| a.equips.include?($data_armors[45])}

メンバーの中に特定のステートになっている者が居るかどうか?

  • 特定のアクターがステートになっているかどうかは条件分岐で判別できるが、現在のメンバーにステートになっている者が居るかどうかは下記スクリプトが必要。
# 例)ID=28 のステートになっているメンバーが居るかどうか
$game_party.all_members.any?{|a| a.state?(28)}

変数の操作では取得できない値の取得

  • 能力値IDは、0=HP 1=MP 2=攻撃 3=防御 4=魔力 5=魔法防御 6=素早さ 7=幸運
# 装備や強化アイテムによる増分を抜いた基本値(レベルアップだけで上昇する値)
# ID=0 のアクターの攻撃力(ID=2)の基本値
$game_actors[0].param_base(2)
# 強化アイテムによる増分
# ID=0 のアクターの攻撃力(ID=2)強化分
$game_actors[0].param_plus(2)

# パーティが装備中の武器の数 例)ID=5 の武器を装備中の数
$game_party.all_members.count{|a| a.equips.include?($data_weapons[5])}
# パーティが装備中の防具の数 例)ID=45 の防具を装備中の数
$game_party.all_members.count{|a| a.equips.include?($data_armors[45])}
# 装備していない武器/防具の数は変数の操作で取得できるので、両方を合わせた数が必要なら上記スクリプトを「加算」で加える

名前で武器、防具、アイテム、スキル、ステート、アクターなどのIDを取得する

  • 上記IDを使用するスクリプトを使う場合、イベントの可読性が落ちる。名前から変数にIDを取得できれば可読性をある程度担保可能。
  • 該当する名前が存在しない場合はエラーでゲームが終了するので注意。
# アクターIDの取得
$data_actors.find{ |i| i && i.name == '主人公'}.id
# クラスIDの取得
$data_classes.find{|i| i && i.name == '勇者'}.id
# スキルIDの取得
$data_skills.find{ |i| i && i.name == 'ヒール'}.id
# アイテムIDの取得
$data_items.find{  |i| i && i.name == '薬草'}.id
# 武器IDの取得
$data_weapons.find{|i| i && i.name == '銅の剣'}.id
# 防具IDの取得
$data_armors.find{ |i| i && i.name == '鉄の鎧'}.id
# エネミーIDの取得
$data_enemies.find{|i| i && i.name == 'オーク'}.id
# ステートIDの取得
$data_states.find{ |i| i && i.name == '猛毒'}.id
# スクリプト中で変数を使う場合のコード 例)変数ID=1 の変数を使う場合
$game_variables[1]

名前でIDを取得する 応用編

  • 上記IDを取得するスクリプトを使う場合、変数の操作で取得するよりも普通にスクリプトイベントで取得した方が記述が楽。
  • 横幅が足りないので改行場所注意。
# 例)ステート「猛毒」になったメンバーがパーティ内に居るかどうかを条件とする場合
# イベント「スクリプト」に以下のコードを書く
id = $data_states.find{|i|
  i && i.name == '猛毒'}.id
@result = $game_party.all_members.any?{
  |a| a.state?(id)}
# イベント「条件分岐」のスクリプト欄に以下の文を書く
@result
  • 注意点 @resultの値はセーブデータに保存されないので間にセーブを挟まないように注意
    • 再利用する可能性がある場合にはスイッチに値を保存する
# 例)上記コードの結果を @result ではなくスイッチID=10 に保存する
id = $data_states.find{|i|
  i && i.name == '石化'}.id
$game_switches[10] = $game_party.
  all_members.any?{|a| a.state?(id)}
  • ステート以外をスクリプトで判定する場合、IDではなく直接インスタンスを使う方がスマート
# パーティ内にヒールを覚えているメンバーが居るかどうか
s = $data_skills.find{|i|
 i && i.name == 'ヒール'}
@result = $game_party.
 all_members.any?{|a| a.skills.include?(s)}
参照: RGSS3プログラミング#長文スクリプトを改行する


イベント中のセーブコマンドからロードしたかどうかを判別

  • イベントコマンド「セーブ画面を開く」でセーブしたセーブデータから再開されたかどうかを判別する方法。
  • 解説
    • 注釈の内容は @comments に保持される。後からスクリプト等で参照可能。
    • @comments はセーブデータには記録されない。ロード後は nil になる。
    • @comments の有無でそのまま進めたかロードして再開したかを判別できる。
# イベント例
◆注釈:ロード判別
◆セーブ画面を開く
◆条件分岐:スクリプト:@comments
 ◆文章:いってらっしゃいませ ご主人様
:それ以外の場合
 ◆文章:お帰りなさいませ ご主人様
:分岐終了







ダメージ計算式のヒント

依存パラメータの変更

(a.def*4 - b.atk*2) # こちらの防御が高く、相手の攻撃が低いほどダメージアップ
(a.agi*4 - b.agi*2) # こちらの敏捷が高く、相手の敏捷が低いほどダメージアップ
(a.mdf*4)           # こちらの魔法防御が高いほど回復力アップ(回復スキル例)
(a.mdf*4 + b.luk*2) # こちらの魔法防御が高く、相手の幸運が高いほど回復力アップ(回復スキル例)

# 攻撃側の攻撃力と魔法力の高い方、防御側の防御力と魔法防御の低い方をそれぞれ基準としてダメージを計算する
[a.atk, a.mat].max * 4 - [b.def, b.mdf].min * 2

通常攻撃のダメージを基準とする

$data_skills[1].damage.eval(a,b,v)       # 通常攻撃と同じダメージ
$data_skills[1].damage.eval(a,b,v) * 0.5 # 通常攻撃の半分のダメージ
$data_skills[1].damage.eval(a,b,v) * 1.2 # 通常攻撃の1.2倍のダメージ
$data_skills[1].damage.eval(a,b,v) * 2.0 # 通常攻撃の2倍のダメージ

ステートでダメージ変化

(a.atk*4 - b.def*2) * (b.state?(2) ? 2:1) # 相手が毒ステート(ステートID:2)状態ならダメージ2倍
(a.atk*4 - b.def*2) * (a.state?(2) ? 2:1) # 自分が毒ステート(ステートID:2)状態ならダメージ2倍
(a.atk*2 - b.def) * ([2,3,4,5,6,7].select!{|s| b.state?(s)}.size + 1) # 相手の状態異常(ID:2〜7)の数が多いほどダメージアップ
(a.atk*4 - (b.state?(9) ? 0 : b.def*2))   # 相手が防御状態(ID:9)なら防御無視ダメージ



フリーエリア

管理人/副管理人のみ編集できます

広告募集中