【RPGツクール】便利かもしれないスクリプトの小技集

EDIT

昔の記事をちょっと修正して再掲。VXAce用。

イベントコマンドのスクリプトによる使用を想定してますが、スクリプトの入力欄に収まらずにエラーが出る場合は適当に調整してください。

ResizeEnable

もしくは上のようなフリーソフトを使ったり。他にもRGSS3素材に入力欄を拡張するのがあったはずなので、探してみるといいかもしれません。



◆条件分岐で使うスクリプト


【注意書きのようなもの】

$game_switches[x] == true
$game_switches[x]

どちらもスイッチがONなら~という条件分岐で使えますが、明確にしたい場合は上のように「==」を入れてください。(省略してもだいたい問題ないと思うけど念の為)

*****

$game_variables[x] == 100
変数[x]が100ぴったりなら条件を満たす

$game_variables[x] != 100
変数[x]が100以外なら~

$game_variables[x] < 100
変数[x]が100未満なら~(0から99まで)

$game_variables[x] <= 100
変数[x]が100以下なら~(0から100まで)

> と >= も上と使い方は同じ。



パーティ全員のHPが満タンか?(戦闘中の控えも含む)

$game_party.all_members.all? { |a| a.hp == a.mhp }


パーティの誰かが武器[x]/防具[x]を装備しているか?

$game_party.members.any? {|m| m.equips.include?($data_weapons[x]) }
$game_party.members.any? {|m| m.equips.include?($data_armors[x]) }


パーティの誰かがスキル[x]を覚えているか?

$game_party.members.any? { |m| m.skills.include?($data_skills[x]) }


パーティの誰かにステート(x)が付加されているか?

$game_party.members.any? { |m| m.state?(x) }


パーティの2人以上にステート(x)が付加されているか?

($game_party.members.collect { |m| m.state?(x) }).size >= 2


アクターID[x]が属性(n)に耐性を持っているか?

$game_actors[x].element_rate(n) < 1.0


アクターID[x]の装備スロット[n]が空っぽか?

$game_actors[x].equips[n].nil?

ようするに無装備か?をスロット別に判定する。武器0,盾1,etc...


アクターID[x]がパーティに加わっているか?

$game_party.members.include?($game_actors[x])


アクターID[x]が戦闘メンバーに加わっているか?

$game_party.battle_members.include?($game_actors[x])

戦闘外では隊列歩行に加わっているか?と同じ意味で分岐できるが、隊列歩行OFFの場合や細かく指定するなら以下を使う。

先頭から数えて4人目までのメンバーに入っているか?
$game_party.members[0..3].include?($game_actors[x])


アイテムID[x]を10個以上持っているか?

$game_party.item_number($data_items[x]) >= 10


先頭にいるメンバーのレベルが10以上か?

$game_party.leader.level >= 10


先頭から数えて2人目までの誰かが武器タイプ4を装備しているか?

$game_party.members[0..1].any? { |m| m.equips[0] && m.equips[0].wtype_id == 4 }

条件を連ねる的なサンプル。


アイテム・武器・防具を1個も持っていないか?

全種類
$game_party.all_items.empty?
アイテム
$game_party.items.empty?
武器
$game_party.weapons.empty?
防具
$game_party.armors.empty?

アイテム未所持ならコマンドをグレー表示させたい時にも使える。
そのままだとtrueを返すため、先頭に「!」を付ける。

【Window_MenuCommand】
add_command(Vocab::item, :item, !$game_party.all_items.empty?)


イベントIDxxのセルフスイッチAがONになっているか?

$game_self_switches[[$game_map.map_id, xx, "A"]]

$game_map.map_id は現在のマップを指すが、任意の数字にすれば遠隔のマップ内から読み取ることもできる。(そもそも同じマップならここを省略して書ける)


現在いるマップの名前に特定の文字列が入っているか?

$data_mapinfos[$game_map.map_id].name.include?("ダンジョン")

データベース上の名前であって表示名ではないので注意。
特定のマップでしか使えないアイテムなんかの条件分岐に使う。


BGMが「Battle1」になっているか?

RPG::BGM.last.name == "Battle1"


セーブファイルが存在するか?

DataManager.save_file_exists?


プレイヤーが移動中か?

$game_player.moving?


移動キーが押されてないか?

Input.dir4 == 0


特定のボタンが同時押しされているか?

Input.trigger?(:B) && Input.press?(:A)

例だとSHIFTキーを押しながらキャンセルキーが押されているか?になる。


イベントと接触しているか?

$game_player.check_touch_event

イベント同士の衝突を避けたい時に使う。


イベントが実行中か?

$game_map.interpreter.running?


メッセージが表示中か?

$game_message.visible


戦闘中か?

$game_party.in_battle
または
SceneManager.scene_is?(Scene_Battle)




◆変数を使うスクリプト


任意のテキストを変数[x]に格納

$game_variables[x] = "薬草を届けよう!"

実際に表示するには\V[x]の制御文字を使ったりする。アクターの説明文に入れたりとか。ヘルプウィンドウに表示する場合はエディタ側で更新させる必要が出るかも。

$game_variables[x] = "王様に会いに行こう!"
$game_variables[x] += "いや、その前に!"
$game_variables[x] += "寝ておこう!"

のようにすると、「王様に会いに行こう!いや、その前に!寝ておこう!」と繋げられる。特に使い道はないと思う。

$game_variables[x].gsub!("王様","将軍")

で「王様」の部分を「将軍」に書き換えることができる。これも特に使い道はry


パーティ全員の攻撃力の合計値を変数[x]に格納

$game_variables[x] = $game_party.members.inject(0) { |a, m| a + m.atk }


パーティ内の最高レベル/最低レベルを変数[x]に格納

$game_variables[x] = $game_party.members.max_by{ |a| a.level }.level
$game_variables[x] = $game_party.members.min_by{ |a| a.level }.level


パーティ内の平均レベルを変数[x]に格納

a = $game_party.members.inject(0) { |n, m| n += m.level }
b = a /= $game_party.members.size
$game_variables[x] = b


成長で増えた分の攻撃力を変数[x]に格納する

$game_variables[x] = $game_actors[1].instance_variable_get("@param_plus")[2]

ドーピングアイテムで攻撃力が100→105に上昇したなら、変数には5が入る。
最後の[2]を変えれば他のパラメータにも対応する。0=HP,1=MP,2=攻撃力,3=防御力etc...


実行中のイベントIDを変数[x]に格納する

$game_variables[x] = @event_id


名前に「宝箱」と記入されたイベントの数を変数[x]に格納する

$game_variables[x] = $game_map.events.values.select {|e| e.instance_variable_get(:@event).name.include?("宝箱") if !$game_self_switches[[e.id, "A"]]}.size

セルフスイッチAがONなら数に含まない。なお未検証。


現在流れているBGMを変数[x]に保存する

$game_variables[x] = RPG::BGM.last

保存したBGMを再生
$game_variables[x].play


全てのアイテムを保存して削除する

※n1,n2は好きな変数の番号
n1 = 1
n2 = 2
$game_variables[n1] = []
$game_variables[n2] = []
$game_party.all_items.each do |item|
$game_variables[n1].push(item)
x = $game_party.item_number(item)
$game_variables[n2].push(x)
$game_party.lose_item(item,x,false)
end

※保存したアイテムを元に戻す。
n1 = 1
n2 = 2
$game_variables[n1].each_index do |index|
item = $game_variables[n1][index]
x = $game_variables[n2][index]
$game_party.gain_item(item,x)
end


アクターの装備を保存して解除する

※変数[x]にアクターID[n]の装備を格納する。
a = $game_actors[n]
v = a.equips
a.clear_equipments
$game_variables[x] = v

※保存した装備を付け直す。
a = $game_actors[n]
v = $game_variables[x]
5.times do |index| a.change_equip(a.equip_slots[index], v[index])
end




◆隊列歩行のスクリプト


隊列メンバー全員がイベントID[x]の方を向く

$game_player.followers.each { |f| f.turn_toward_character($game_map.events[x]) }


隊列メンバーの[x]人目の向きを変える

$game_player.followers[x].set_direction(n)

隊列[x]は先頭(プレイヤー)を除くので、2人目以降を0から数える。
向き(n)は数字で指定する。2(↓) 4(←) 6(→) 8(↑)


隊列メンバーの[x]人目を一歩前進/一歩後退させる

$game_player.followers[x].move_forward
$game_player.followers[x].move_backward


隊列メンバーの[x]人目をその場でジャンプさせる

$game_player.followers[x].jump(0, 0)


隊列メンバーの[x]人目にアニメーションnを表示

$game_player.followers[x].animation_id = n

表示終了までウェイトさせる場合は次のように記述する。

$game_player.followers[x].animation_id = n
Fiber.yield while $game_player.followers[x].animation_id > 0


隊列メンバーの[x]人目にフキダシnを表示

$game_player.followers[x].balloon_id = n

1 = びっくり
2 = はてな
3 = 音符
4 = 怒り
5 = 汗
6 = くしゃくしゃ
7 = 沈黙
8 = 電球
9 = Zzz


プレイヤーが隊列メンバーの方を向く

$game_player.turn_toward_character($game_player.followers[0])

正確には後ろに付いてるキャラに振り向く。




◆イベントで使うスクリプト


イベントID[n]がプレイヤーと同じ方向を向いているか?

$game_map.events[n].direction == $game_player.direction


実行中のイベントがプレイヤーと同じ方向を向いているか?

$game_map.events[@event_id].direction == $game_player.direction


イベントID[n]の現在地がマップ上の座標(x,y)と一致するか?

$game_map.events[n].pos?(x, y)

岩を押すイベントとかの条件分岐で使ったり。


複数のイベントがリージョン63の範囲内にいるならスイッチ[x]をON

$game_switches[x] = [2,4,6].all? { |i| $game_map.events[i].region_id == 63 }

条件分岐によるスイッチ操作を一括で行うサンプル。


イベントID(n)の内容を実行する

get_character(n).start

テーブルの先にいるキャラに話しかけたりとか、離れたイベントを遠隔操作できる。


プレイヤーの向きを「このイベント」の方向にする

$game_player.turn_toward_character($game_map.events[self.event_id])


イベントID[n]のプライオリティを変更する

$game_map.events[n].instance_variable_set(:@priority_type,A)

A = 0 通常キャラの下
A = 1 通常キャラと同じ
A = 2 通常キャラの上

小数点を入れて更に上の2.5とかにすれば、イベント同士の重なりも防げるはず。(未検証)


マップ上のイベントの動きを止める/再開する

$game_map.events.each {|id, ev| ev.lock }
$game_map.events.each {|id, ev| ev.unlock }

会話中とかに他のイベントの自律移動を止めたい時に使うが、lockをするとプレイヤーの方に全イベントが視線を向ける怖い仕様があるので、それが嫌ならエディタを書き換える。


移動ルートからイベントのセルフスイッチを操作する

$game_self_switches[[@map_id, @id, "A"]] = true


RPGツクール2000風の高速ジャンプをさせる

※跳ばせるイベントの移動ルートで設定する
スクリプト:@move_speed = 20
スクリプト:@y -= 0.7
SE:'Jump2', 80, 100
スクリプト:@y += 0.7
スクリプト:@move_route_index = -1

某所でよく使われるピョンピョン跳ねるジャンプの再現。
動作を繰り返すにチェックを入れるなら最後の行は無くてもいい。


イベントID[n]のグラフィックをアクターと同じものに変更する

a = $game_actors[1]
b = a.character_name
c = a.character_index
$game_map.events[n].set_graphic(b, c)

次のようにすれば、パーティメンバーの任意のキャラと同じにもできる。

a = $game_party.members[x]
x = 0 隊列の1人目
x = 1 隊列の2人目
etc...


イベントID[n]がプレイヤーと同じ方向を向く(並列処理で行う)

$game_map.events[n].set_direction($game_player.direction)


イベントID[n]がプレイヤーと同じ動きをする(並列処理で行う)

if $game_player.moving?
$game_map.events[n].
move_straight($game_player.direction)
Fiber.yield while $game_player.moving?
end

場合によっては移動速度の設定やすり抜けONなどを忘れずに。


このイベントをフェードアウトさせる(徐々に透明にする)

@opacity -= 10

移動ルートから、動作を繰り返すにチェックを入れて行う。


プレイヤーとイベントID[n]の距離を変数[x]に格納する

dx = ($game_player.x - $game_map.events[n].x).abs
dy = ($game_player.y - $game_map.events[n].y).abs
$game_variables[x] = (dx + dy)


プレイヤーとの距離に応じて不透明度が変化するイベントのサンプル

v = $game_variables[x]
p = $game_player
e = $game_map.events[n]
a = (p.x - e.x).abs
b = (p.y - e.y).abs
v = (a + b)
f = 25
d = ((11 - v) < 0 ? 0 : (11 - v))
o = ((f * d > 255) ? 255 : (f * d))
e.instance_variable_set(:@opacity,o)

上記の使用例。適当なイベントから並列処理で動かす。
距離が離れてると見えないけど、近づくと徐々にイベント[n]の姿が見えるようになる。


隣接するイベントID[n]の方を向いたときスイッチ[x]をONにする

p = $game_player
e = $game_map.events[n]
$game_switches[x] = false
dx = (e.x - p.x)
dy = (e.y - p.y)
case p.direction
when 2; $game_switches[x] = dx == 0 && dy == 1
when 4; $game_switches[x] = dx == -1 && dy == 0
when 6; $game_switches[x] = dx == 1 && dy == 0
when 8; $game_switches[x] = dx == 0 && dy == -1
end


全てのイベントが下に3マス移動する(特定のイベントは除く)

set = RPG::MoveRoute.new
set.repeat = false
set.skippable = true
set.wait = true
set.list = []
set.list.push( RPG::MoveCommand.new(37, []) )
set.list.push( RPG::MoveCommand.new(1, []) )
set.list.push( RPG::MoveCommand.new(1, []) )
set.list.push( RPG::MoveCommand.new(1, []) )
set.list.push( RPG::MoveCommand.new(39, []) )
set.list.push( RPG::MoveCommand.new )
$game_map.events.each do |i,e|
next if [5, 6, 7].include?(i)
e.force_move_route(set)
end

イベントをスクリプトで移動させるサンプル。
火事だ~!で全員逃げるイベントとか組むのに使える。

見ての通りだけど、このままだと行数が多すぎてスクリプト欄に入り切らないので注意。


乗り物をプレイヤーと同じ位置に呼び出す

$game_map.airship.set_location($game_map.map_id, $game_player.x, $game_player.y)

airshipをboatやshipに変えると飛行船以外にできる。
もしくはvehicles[x]にする。0=boat,1=ship,2=airship


乗り物をプレイヤーの1マス上に呼び出すサンプル

if $game_map.ship_passable?($game_player.x, $game_player.y - 1)
$game_player.animation_id = 57
$game_map.ship.set_location($game_map.map_id, $game_player.x, $game_player.y - 1)
else
Audio.se_play("Audio/SE/Buzzer1")
end

プレイヤーの1マス上が船の通行範囲かどうかを判定。
OKなら船を召喚して、ダメならブザー音。

呼ぶ際にアニメーションを設定してるが、そのままだとプレイヤーが炎を浴びるだけなので(謎)、アニメーション自体の設定で基準位置を頭上にするとそれっぽくなる。


現在マップのタイルセットから特定のオブジェクトを設置する

$game_map.data[x, y, 2]

例:コーヒーカップをプレイヤーの1マス下に出現させる
(デフォルトかつマップのタイルセットが内装の場合)

$game_map.data[$game_player.x, $game_player.y + 1, 2] = 260

場所移動などでリセットされるので、その場限りのイベント演出で使う。いちいちスイッチやグラフィックの変更を行う必要がなくなる。最後の数字がタイルセットのオブジェクトで、タイルセットBの左上が0となる。




◆テストプレイ用?のスクリプト


指定した複数のスイッチをONにする

[2,4,6,8].each{|id|$game_switches[id] = true}


全イベントのセルフスイッチAをONにする

(1..$game_map.events.values.size).each{|ev|$game_self_switches[[@map_id, ev, "A"]] = true}


指定したイベントのセルフスイッチAをOFFにする

SW = [(2..5).to_a, 8, 9, (15..20).to_a].flatten
SW.each{|ev|$game_self_switches[[@map_id, ev, "A"]] = false}

複数かつ飛び番号ありの方法。(イベントID2~5、8、9、15~20が対象)


全てのアクターをパーティに加える

$data_actors.compact.each{ |actor| $game_party.add_actor(actor.id) if !actor.name.empty? }


アクターID1を除いて全てのアクターを外す

$game_party.members.each { |actor| $game_party.remove_actor(actor.id) if actor.id > 1 }


アクターID1に2~10番までのスキルを習得させる

(2..10).each{|id|$game_actors[1].learn_skill(id)}


全てのアイテムを99個入手する

※上から、アイテム、武器、防具。
$data_items.compact.each{|item|
$game_party.gain_item(item, 99) if
!item.name.empty? }

$data_weapons.compact.each{|item|
$game_party.gain_item(item, 99) if
!item.name.empty? }

$data_armors.compact.each{|item|
$game_party.gain_item(item, 99) if
!item.name.empty? }






以下未整理



意図的にエラーメッセージを表示して強制終了させる

msgbox("体験版はここまでです。")
exit


アクターID[x]の最大レベルを変更する

$data_actors[x].max_level = 99

データベースでは50とかに設定して、あとからキャップ解放できるみたいな。


最後に保存したファイルにセーブする

index = DataManager.last_savefile_index
DataManager.save_game(index)

セーブファイルが存在しない場合は先頭のスロットに保存される。
ちなみに直接数字を指定すると、そのスロット番号に保存される。


最後に保存したファイルをロードする

index = DataManager.last_savefile_index
DataManager.load_game(index)
$game_system.on_after_load
SceneManager.goto(Scene_Map)


特定のSEを無音にする

$data_system.sounds[x].volume = 0

決定音:x=1
戦闘開始:x=7
アイテム使用:x=22

アイテムの処理とか、一時的にミュートしたい時に。
その後ボリュームを元に戻さないと無音のままになるので注意。


メニューのカーソル位置の記憶をリセットする

$game_party.menu_actor = $game_party.members[0]
$game_party.target_actor = $game_party.members[0]
$game_party.last_item.object = nil
$game_party.all_members.each{ |a| a.last_skill.object = nil }

デフォルトだと使用したアイテムやスキルの位置を記憶するけど、それが鬱陶しい時に。
メニューを閉じた後や戦闘後に処理させるといい気がする。(これだけだとコマンド位置だけは変わらないので注意)


戦闘用:控えを含むメンバーを全回復する

$game_party.all_members.each { |a| a.recover_all }

イベントコマンドだと戦闘中に控えが含まれないので。
バトルログ等への表示は控えメンバーの分まで考えると難しい。


戦闘用:画面の半分より上に位置する敵にステート(x)を付加

a = Graphics.height / 2
b = $game_troop.members.select { |e| e.screen_y <= a }
b.each do |e|
e.add_state(x)
end

戦闘開始時に処理して、前列と後列みたいな分け方ができる…かもしれない。(未検証)


戦闘用:メモに○○が記述されている敵にステート(x)を付加

$game_troop.members.each do |e|
id = e.enemy_id
se = $data_enemies[id]
note = se.note
if note.include?("○○")
e.add_state(x)
end
end

上の亜種じゃないけど何かと応用が効くメモ使う版。なお未検証。


戦闘用:HPが最も低い味方のindexを取得する

$game_party.alive_members.min_by { |a| a.hp }.index


戦闘用:HPの割合が低い味方のindexを取得する

$game_party.alive_members.min_by { |a| a.hp_rate }.index


上記の使用例

battler = $game_actors[1]
target_index = $game_party.alive_members.min_by { |a| a.hp_rate }.index
battler.force_action(26, target_index)
BattleManager.force_action(battler)
Fiber.yield while BattleManager.action_forced?

戦闘行動の強制を使って、HPが少ない味方にヒールをかける。
これだけだと動作に支障が出ると思うので、
$game_party.alive_members.include?($game_actors[1])」
!$game_actors[1].movable?
とか色々と条件に含ませる方がいい。


上記の使用例2

if $game_troop.alive_members.any? { |m| m.hp_rate <= 0.5 }
battler = $game_actors[1]
target_index = $game_troop.alive_members.min_by {|e| e.hp_rate }.index
battler.force_action(80, target_index)
BattleManager.force_action(battler)
Fiber.yield while BattleManager.action_forced?
end

要約すると、HPが半分以下の敵にスキルID80を放つ。
条件をターン終了時とかにすれば追い討ちスキルみたいなのができる。





乱雑になっているので随時整理中……。
関連記事
web拍手 by FC2
コメントの投稿












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

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