忍者ブログ

リリカルリミテッド

リリカルリミテッドが販売しているゲームやイラスト集のサポート用のブログです。

【RPGツクールVXAce】スクリプトの小技集

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【RPGツクールVXAce】スクリプトの小技集

パーティ全員の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?


プレイヤーがダッシュ中か?

$game_player.dash?


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

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.width(height)


名前に「宝箱」と記入されたイベントの数を変数[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などを忘れずに。


プレイヤーとイベント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? }

PR

コメント

プロフィール

HN:
朋美姫
年齢:
31
性別:
女性
誕生日:
1993/07/07
職業:
ゲームクリエイター
趣味:
ゲーム キャンプ

P R