king-exit/Scripts/Game_Interpreter.rb
2024-08-31 14:17:23 -05:00

1411 lines
54 KiB
Ruby
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#==============================================================================
# ■ Game_Interpreter
#------------------------------------------------------------------------------
#  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、
# Game_Troop クラス、Game_Event クラスの内部で使用されます。
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :map_id # マップ ID
attr_reader :event_id # イベント ID通常イベントのみ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# depth : ネストの深さ
#--------------------------------------------------------------------------
def initialize(depth = 0)
@depth = depth
check_overflow
clear
end
#--------------------------------------------------------------------------
# ● オーバーフローのチェック
# 通常の使用で深さが 100 以上になることはない。再帰的なイベント呼び出し
# による無限ループの可能性が高いので、100 で打ち切ってエラーにする。
#--------------------------------------------------------------------------
def check_overflow
if @depth >= 100
msgbox(Vocab::EventOverflow)
exit
end
end
#--------------------------------------------------------------------------
# ● クリア
#--------------------------------------------------------------------------
def clear
@map_id = 0
@event_id = 0
@list = nil # 実行内容
@index = 0 # インデックス
@branch = {} # 分岐データ
@fiber = nil # ファイバー
end
#--------------------------------------------------------------------------
# ● イベントのセットアップ
#--------------------------------------------------------------------------
def setup(list, event_id = 0)
clear
@map_id = $game_map.map_id
@event_id = event_id
@list = list
create_fiber
end
#--------------------------------------------------------------------------
# ● ファイバーの作成
#--------------------------------------------------------------------------
def create_fiber
@fiber = Fiber.new { run } if @list
end
#--------------------------------------------------------------------------
# ● オブジェクトのダンプ
# ファイバーは Marshal に対応していないため自前で定義する。
# イベントの実行位置は一つ進めて保存する。
#--------------------------------------------------------------------------
def marshal_dump
[@depth, @map_id, @event_id, @list, @index + 1, @branch]
end
#--------------------------------------------------------------------------
# ● オブジェクトのロード
# obj : marshal_dump でダンプされたオブジェクト(配列)
# 多重代入でデータを復帰し、必要ならファイバーを再作成する。
#--------------------------------------------------------------------------
def marshal_load(obj)
@depth, @map_id, @event_id, @list, @index, @branch = obj
create_fiber
end
#--------------------------------------------------------------------------
# ● イベント起動時のマップと同じか判定
#--------------------------------------------------------------------------
def same_map?
@map_id == $game_map.map_id
end
#--------------------------------------------------------------------------
# ● 呼び出し予約されたコモンイベントを検出/セットアップ
#--------------------------------------------------------------------------
def setup_reserved_common_event
if $game_temp.common_event_reserved?
setup($game_temp.reserved_common_event.list)
$game_temp.clear_common_event
true
else
false
end
end
#--------------------------------------------------------------------------
# ● 実行
#--------------------------------------------------------------------------
def run
wait_for_message
while @list[@index] do
execute_command
@index += 1
end
Fiber.yield
@fiber = nil
end
#--------------------------------------------------------------------------
# ● 実行中判定
#--------------------------------------------------------------------------
def running?
@fiber != nil
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
@fiber.resume if @fiber
end
#--------------------------------------------------------------------------
# ● アクター用イテレータID
# param : 1 以上なら ID、0 なら全体
#--------------------------------------------------------------------------
def iterate_actor_id(param)
if param == 0
$game_party.members.each {|actor| yield actor }
else
actor = $game_actors[param]
yield actor if actor
end
end
#--------------------------------------------------------------------------
# ● アクター用イテレータ(可変)
# param1 : 0 なら固定、1 なら変数で指定
# param2 : アクターまたは変数 ID
#--------------------------------------------------------------------------
def iterate_actor_var(param1, param2)
if param1 == 0
iterate_actor_id(param2) {|actor| yield actor }
else
iterate_actor_id($game_variables[param2]) {|actor| yield actor }
end
end
#--------------------------------------------------------------------------
# ● アクター用イテレータ(インデックス)
# param : 0 以上ならインデックス、-1 なら全体
#--------------------------------------------------------------------------
def iterate_actor_index(param)
if param < 0
$game_party.members.each {|actor| yield actor }
else
actor = $game_party.members[param]
yield actor if actor
end
end
#--------------------------------------------------------------------------
# ● 敵キャラ用イテレータ(インデックス)
# param : 0 以上ならインデックス、-1 なら全体
#--------------------------------------------------------------------------
def iterate_enemy_index(param)
if param < 0
$game_troop.members.each {|enemy| yield enemy }
else
enemy = $game_troop.members[param]
yield enemy if enemy
end
end
#--------------------------------------------------------------------------
# ● バトラー用イテレータ(敵グループ全体、パーティ全体を考慮)
# param1 : 0 なら敵キャラ、1 ならアクター
# param2 : 敵キャラならインデックス、アクターなら ID
#--------------------------------------------------------------------------
def iterate_battler(param1, param2)
if $game_party.in_battle
if param1 == 0
iterate_enemy_index(param2) {|enemy| yield enemy }
else
iterate_actor_id(param2) {|actor| yield actor }
end
end
end
#--------------------------------------------------------------------------
# ● 画面系コマンドの対象を取得
#--------------------------------------------------------------------------
def screen
$game_party.in_battle ? $game_troop.screen : $game_map.screen
end
#--------------------------------------------------------------------------
# ● イベントコマンドの実行
#--------------------------------------------------------------------------
def execute_command
command = @list[@index]
@params = command.parameters
@indent = command.indent
method_name = "command_#{command.code}"
send(method_name) if respond_to?(method_name)
end
#--------------------------------------------------------------------------
# ● コマンドスキップ
# 現在のインデントより深いコマンドを飛ばしてインデックスを進める。
#--------------------------------------------------------------------------
def command_skip
@index += 1 while @list[@index + 1].indent > @indent
end
#--------------------------------------------------------------------------
# ● 次のイベントコマンドのコードを取得
#--------------------------------------------------------------------------
def next_event_code
@list[@index + 1].code
end
#--------------------------------------------------------------------------
# ● キャラクターの取得
# param : -1 ならプレイヤー、0 ならこのイベント、それ以外はイベント ID
#--------------------------------------------------------------------------
def get_character(param)
if $game_party.in_battle
nil
elsif param < 0
$game_player
else
events = same_map? ? $game_map.events : {}
events[param > 0 ? param : @event_id]
end
end
#--------------------------------------------------------------------------
# ● 操作する値の計算
# operation : 操作0:増やす 1:減らす)
# operand_type : オペランドタイプ0:定数 1:変数)
# operand : オペランド(数値または変数 ID
#--------------------------------------------------------------------------
def operate_value(operation, operand_type, operand)
value = operand_type == 0 ? operand : $game_variables[operand]
operation == 0 ? value : -value
end
#--------------------------------------------------------------------------
# ● ウェイト
#--------------------------------------------------------------------------
def wait(duration)
duration.times { Fiber.yield }
end
#--------------------------------------------------------------------------
# ● メッセージ表示がビジー状態の間ウェイト
#--------------------------------------------------------------------------
def wait_for_message
Fiber.yield while $game_message.busy?
end
#--------------------------------------------------------------------------
# ● 文章の表示
#--------------------------------------------------------------------------
def command_101
wait_for_message
$game_message.face_name = @params[0]
$game_message.face_index = @params[1]
$game_message.background = @params[2]
$game_message.position = @params[3]
while next_event_code == 401 # 文章データ
@index += 1
$game_message.add(@list[@index].parameters[0])
end
case next_event_code
when 102 # 選択肢の表示
@index += 1
setup_choices(@list[@index].parameters)
when 103 # 数値入力の処理
@index += 1
setup_num_input(@list[@index].parameters)
when 104 # アイテム選択の処理
@index += 1
setup_item_choice(@list[@index].parameters)
end
wait_for_message
end
#--------------------------------------------------------------------------
# ● 選択肢の表示
#--------------------------------------------------------------------------
def command_102
wait_for_message
setup_choices(@params)
Fiber.yield while $game_message.choice?
end
#--------------------------------------------------------------------------
# ● 選択肢のセットアップ
#--------------------------------------------------------------------------
def setup_choices(params)
params[0].each {|s| $game_message.choices.push(s) }
$game_message.choice_cancel_type = params[1]
$game_message.choice_proc = Proc.new {|n| @branch[@indent] = n }
end
#--------------------------------------------------------------------------
# ● [**] の場合
#--------------------------------------------------------------------------
def command_402
command_skip if @branch[@indent] != @params[0]
end
#--------------------------------------------------------------------------
# ● キャンセルの場合
#--------------------------------------------------------------------------
def command_403
command_skip if @branch[@indent] != 4
end
#--------------------------------------------------------------------------
# ● 数値入力の処理
#--------------------------------------------------------------------------
def command_103
wait_for_message
setup_num_input(@params)
Fiber.yield while $game_message.num_input?
end
#--------------------------------------------------------------------------
# ● 数値入力のセットアップ
#--------------------------------------------------------------------------
def setup_num_input(params)
$game_message.num_input_variable_id = params[0]
$game_message.num_input_digits_max = params[1]
end
#--------------------------------------------------------------------------
# ● アイテム選択の処理
#--------------------------------------------------------------------------
def command_104
wait_for_message
setup_item_choice(@params)
Fiber.yield while $game_message.item_choice?
end
#--------------------------------------------------------------------------
# ● アイテム選択のセットアップ
#--------------------------------------------------------------------------
def setup_item_choice(params)
$game_message.item_choice_variable_id = params[0]
end
#--------------------------------------------------------------------------
# ● スクロール文章の表示
#--------------------------------------------------------------------------
def command_105
Fiber.yield while $game_message.visible
$game_message.scroll_mode = true
$game_message.scroll_speed = @params[0]
$game_message.scroll_no_fast = @params[1]
while next_event_code == 405
@index += 1
$game_message.add(@list[@index].parameters[0])
end
wait_for_message
end
#--------------------------------------------------------------------------
# ● 注釈
#--------------------------------------------------------------------------
def command_108
@comments = [@params[0]]
while next_event_code == 408
@index += 1
@comments.push(@list[@index].parameters[0])
end
end
#--------------------------------------------------------------------------
# ● 条件分岐
#--------------------------------------------------------------------------
def command_111
result = false
case @params[0]
when 0 # スイッチ
result = ($game_switches[@params[1]] == (@params[2] == 0))
when 1 # 変数
value1 = $game_variables[@params[1]]
if @params[2] == 0
value2 = @params[3]
else
value2 = $game_variables[@params[3]]
end
case @params[4]
when 0 # と同値
result = (value1 == value2)
when 1 # 以上
result = (value1 >= value2)
when 2 # 以下
result = (value1 <= value2)
when 3 # 超
result = (value1 > value2)
when 4 # 未満
result = (value1 < value2)
when 5 # 以外
result = (value1 != value2)
end
when 2 # セルフスイッチ
if @event_id > 0
key = [@map_id, @event_id, @params[1]]
result = ($game_self_switches[key] == (@params[2] == 0))
end
when 3 # タイマー
if $game_timer.working?
if @params[2] == 0
result = ($game_timer.sec >= @params[1])
else
result = ($game_timer.sec <= @params[1])
end
end
when 4 # アクター
actor = $game_actors[@params[1]]
if actor
case @params[2]
when 0 # パーティにいる
result = ($game_party.members.include?(actor))
when 1 # 名前
result = (actor.name == @params[3])
when 2 # 職業
result = (actor.class_id == @params[3])
when 3 # スキル
result = (actor.skill_learn?($data_skills[@params[3]]))
when 4 # 武器
result = (actor.weapons.include?($data_weapons[@params[3]]))
when 5 # 防具
result = (actor.armors.include?($data_armors[@params[3]]))
when 6 # ステート
result = (actor.state?(@params[3]))
end
end
when 5 # 敵キャラ
enemy = $game_troop.members[@params[1]]
if enemy
case @params[2]
when 0 # 出現している
result = (enemy.alive?)
when 1 # ステート
result = (enemy.state?(@params[3]))
end
end
when 6 # キャラクター
character = get_character(@params[1])
if character
result = (character.direction == @params[2])
end
when 7 # ゴールド
case @params[2]
when 0 # 以上
result = ($game_party.gold >= @params[1])
when 1 # 以下
result = ($game_party.gold <= @params[1])
when 2 # 未満
result = ($game_party.gold < @params[1])
end
when 8 # アイテム
result = $game_party.has_item?($data_items[@params[1]])
when 9 # 武器
result = $game_party.has_item?($data_weapons[@params[1]], @params[2])
when 10 # 防具
result = $game_party.has_item?($data_armors[@params[1]], @params[2])
when 11 # ボタン
result = Input.press?(@params[1])
when 12 # スクリプト
result = eval(@params[1])
when 13 # 乗り物
result = ($game_player.vehicle == $game_map.vehicles[@params[1]])
end
@branch[@indent] = result
command_skip if !@branch[@indent]
end
#--------------------------------------------------------------------------
# ● それ以外の場合
#--------------------------------------------------------------------------
def command_411
command_skip if @branch[@indent]
end
#--------------------------------------------------------------------------
# ● ループ
#--------------------------------------------------------------------------
def command_112
end
#--------------------------------------------------------------------------
# ● 以上繰り返し
#--------------------------------------------------------------------------
def command_413
begin
@index -= 1
end until @list[@index].indent == @indent
end
#--------------------------------------------------------------------------
# ● ループの中断
#--------------------------------------------------------------------------
def command_113
loop do
@index += 1
return if @index >= @list.size - 1
return if @list[@index].code == 413 && @list[@index].indent < @indent
end
end
#--------------------------------------------------------------------------
# ● イベント処理の中断
#--------------------------------------------------------------------------
def command_115
@index = @list.size
end
#--------------------------------------------------------------------------
# ● コモンイベント
#--------------------------------------------------------------------------
def command_117
common_event = $data_common_events[@params[0]]
if common_event
child = Game_Interpreter.new(@depth + 1)
child.setup(common_event.list, same_map? ? @event_id : 0)
child.run
end
end
#--------------------------------------------------------------------------
# ● ラベル
#--------------------------------------------------------------------------
def command_118
end
#--------------------------------------------------------------------------
# ● ラベルジャンプ
#--------------------------------------------------------------------------
def command_119
label_name = @params[0]
@list.size.times do |i|
if @list[i].code == 118 && @list[i].parameters[0] == label_name
@index = i
return
end
end
end
#--------------------------------------------------------------------------
# ● スイッチの操作
#--------------------------------------------------------------------------
def command_121
(@params[0]..@params[1]).each do |i|
$game_switches[i] = (@params[2] == 0)
end
end
#--------------------------------------------------------------------------
# ● 変数の操作
#--------------------------------------------------------------------------
def command_122
value = 0
case @params[3] # オペランド
when 0 # 定数
value = @params[4]
when 1 # 変数
value = $game_variables[@params[4]]
when 2 # 乱数
value = @params[4] + rand(@params[5] - @params[4] + 1)
when 3 # ゲームデータ
value = game_data_operand(@params[4], @params[5], @params[6])
when 4 # スクリプト
value = eval(@params[4])
end
(@params[0]..@params[1]).each do |i|
operate_variable(i, @params[2], value)
end
end
#--------------------------------------------------------------------------
# ● 変数オペランド用ゲームデータの取得
#--------------------------------------------------------------------------
def game_data_operand(type, param1, param2)
case type
when 0 # アイテム
return $game_party.item_number($data_items[param1])
when 1 # 武器
return $game_party.item_number($data_weapons[param1])
when 2 # 防具
return $game_party.item_number($data_armors[param1])
when 3 # アクター
actor = $game_actors[param1]
if actor
case param2
when 0 # レベル
return actor.level
when 1 # 経験値
return actor.exp
when 2 # HP
return actor.hp
when 3 # MP
return actor.mp
when 4..11 # 通常能力値
return actor.param(param2 - 4)
end
end
when 4 # 敵キャラ
enemy = $game_troop.members[param1]
if enemy
case param2
when 0 # HP
return enemy.hp
when 1 # MP
return enemy.mp
when 2..9 # 通常能力値
return enemy.param(param2 - 2)
end
end
when 5 # キャラクター
character = get_character(param1)
if character
case param2
when 0 # X 座標
return character.x
when 1 # Y 座標
return character.y
when 2 # 向き
return character.direction
when 3 # 画面 X 座標
return character.screen_x
when 4 # 画面 Y 座標
return character.screen_y
end
end
when 6 # パーティ
actor = $game_party.members[param1]
return actor ? actor.id : 0
when 7 # その他
case param1
when 0 # マップ ID
return $game_map.map_id
when 1 # パーティ人数
return $game_party.members.size
when 2 # ゴールド
return $game_party.gold
when 3 # 歩数
return $game_party.steps
when 4 # プレイ時間
return Graphics.frame_count / Graphics.frame_rate
when 5 # タイマー
return $game_timer.sec
when 6 # セーブ回数
return $game_system.save_count
when 7 # 戦闘回数
return $game_system.battle_count
end
end
return 0
end
#--------------------------------------------------------------------------
# ● 変数の操作を実行
#--------------------------------------------------------------------------
def operate_variable(variable_id, operation_type, value)
begin
case operation_type
when 0 # 代入
$game_variables[variable_id] = value
when 1 # 加算
$game_variables[variable_id] += value
when 2 # 減算
$game_variables[variable_id] -= value
when 3 # 乗算
$game_variables[variable_id] *= value
when 4 # 除算
$game_variables[variable_id] /= value
when 5 # 剰余
$game_variables[variable_id] %= value
end
rescue
$game_variables[variable_id] = 0
end
end
#--------------------------------------------------------------------------
# ● セルフスイッチの操作
#--------------------------------------------------------------------------
def command_123
if @event_id > 0
key = [@map_id, @event_id, @params[0]]
$game_self_switches[key] = (@params[1] == 0)
end
end
#--------------------------------------------------------------------------
# ● タイマーの操作
#--------------------------------------------------------------------------
def command_124
if @params[0] == 0 # 始動
$game_timer.start(@params[1] * Graphics.frame_rate)
else # 停止
$game_timer.stop
end
end
#--------------------------------------------------------------------------
# ● 所持金の増減
#--------------------------------------------------------------------------
def command_125
value = operate_value(@params[0], @params[1], @params[2])
$game_party.gain_gold(value)
end
#--------------------------------------------------------------------------
# ● アイテムの増減
#--------------------------------------------------------------------------
def command_126
value = operate_value(@params[1], @params[2], @params[3])
$game_party.gain_item($data_items[@params[0]], value)
end
#--------------------------------------------------------------------------
# ● 武器の増減
#--------------------------------------------------------------------------
def command_127
value = operate_value(@params[1], @params[2], @params[3])
$game_party.gain_item($data_weapons[@params[0]], value, @params[4])
end
#--------------------------------------------------------------------------
# ● 防具の増減
#--------------------------------------------------------------------------
def command_128
value = operate_value(@params[1], @params[2], @params[3])
$game_party.gain_item($data_armors[@params[0]], value, @params[4])
end
#--------------------------------------------------------------------------
# ● メンバーの入れ替え
#--------------------------------------------------------------------------
def command_129
actor = $game_actors[@params[0]]
if actor
if @params[1] == 0 # 加える
if @params[2] == 1 # 初期化
$game_actors[@params[0]].setup(@params[0])
end
$game_party.add_actor(@params[0])
else # 外す
$game_party.remove_actor(@params[0])
end
end
end
#--------------------------------------------------------------------------
# ● 戦闘 BGM の変更
#--------------------------------------------------------------------------
def command_132
$game_system.battle_bgm = @params[0]
end
#--------------------------------------------------------------------------
# ● 戦闘終了 ME の変更
#--------------------------------------------------------------------------
def command_133
$game_system.battle_end_me = @params[0]
end
#--------------------------------------------------------------------------
# ● セーブ禁止の変更
#--------------------------------------------------------------------------
def command_134
$game_system.save_disabled = (@params[0] == 0)
end
#--------------------------------------------------------------------------
# ● メニュー禁止の変更
#--------------------------------------------------------------------------
def command_135
$game_system.menu_disabled = (@params[0] == 0)
end
#--------------------------------------------------------------------------
# ● エンカウント禁止の変更
#--------------------------------------------------------------------------
def command_136
$game_system.encounter_disabled = (@params[0] == 0)
$game_player.make_encounter_count
end
#--------------------------------------------------------------------------
# ● 並び替え禁止の変更
#--------------------------------------------------------------------------
def command_137
$game_system.formation_disabled = (@params[0] == 0)
end
#--------------------------------------------------------------------------
# ● ウィンドウカラーの変更
#--------------------------------------------------------------------------
def command_138
$game_system.window_tone = @params[0]
end
#--------------------------------------------------------------------------
# ● 場所移動
#--------------------------------------------------------------------------
def command_201
return if $game_party.in_battle
Fiber.yield while $game_player.transfer? || $game_message.visible
if @params[0] == 0 # 直接指定
map_id = @params[1]
x = @params[2]
y = @params[3]
else # 変数で指定
map_id = $game_variables[@params[1]]
x = $game_variables[@params[2]]
y = $game_variables[@params[3]]
end
$game_player.reserve_transfer(map_id, x, y, @params[4])
$game_temp.fade_type = @params[5]
Fiber.yield while $game_player.transfer?
end
#--------------------------------------------------------------------------
# ● 乗り物の位置設定
#--------------------------------------------------------------------------
def command_202
if @params[1] == 0 # 直接指定
map_id = @params[2]
x = @params[3]
y = @params[4]
else # 変数で指定
map_id = $game_variables[@params[2]]
x = $game_variables[@params[3]]
y = $game_variables[@params[4]]
end
vehicle = $game_map.vehicles[@params[0]]
vehicle.set_location(map_id, x, y) if vehicle
end
#--------------------------------------------------------------------------
# ● イベントの位置設定
#--------------------------------------------------------------------------
def command_203
character = get_character(@params[0])
if character
if @params[1] == 0 # 直接指定
character.moveto(@params[2], @params[3])
elsif @params[1] == 1 # 変数で指定
new_x = $game_variables[@params[2]]
new_y = $game_variables[@params[3]]
character.moveto(new_x, new_y)
else # 他のイベントと交換
character2 = get_character(@params[2])
character.swap(character2) if character2
end
character.set_direction(@params[4]) if @params[4] > 0
end
end
#--------------------------------------------------------------------------
# ● マップのスクロール
#--------------------------------------------------------------------------
def command_204
return if $game_party.in_battle
Fiber.yield while $game_map.scrolling?
$game_map.start_scroll(@params[0], @params[1], @params[2])
end
#--------------------------------------------------------------------------
# ● 移動ルートの設定
#--------------------------------------------------------------------------
def command_205
$game_map.refresh if $game_map.need_refresh
character = get_character(@params[0])
if character
character.force_move_route(@params[1])
Fiber.yield while character.move_route_forcing if @params[1].wait
end
end
#--------------------------------------------------------------------------
# ● 乗り物の乗降
#--------------------------------------------------------------------------
def command_206
$game_player.get_on_off_vehicle
end
#--------------------------------------------------------------------------
# ● 透明状態の変更
#--------------------------------------------------------------------------
def command_211
$game_player.transparent = (@params[0] == 0)
end
#--------------------------------------------------------------------------
# ● アニメーションの表示
#--------------------------------------------------------------------------
def command_212
character = get_character(@params[0])
if character
character.animation_id = @params[1]
Fiber.yield while character.animation_id > 0 if @params[2]
end
end
#--------------------------------------------------------------------------
# ● フキダシアイコンの表示
#--------------------------------------------------------------------------
def command_213
character = get_character(@params[0])
if character
character.balloon_id = @params[1]
Fiber.yield while character.balloon_id > 0 if @params[2]
end
end
#--------------------------------------------------------------------------
# ● イベントの一時消去
#--------------------------------------------------------------------------
def command_214
$game_map.events[@event_id].erase if same_map? && @event_id > 0
end
#--------------------------------------------------------------------------
# ● 隊列歩行の変更
#--------------------------------------------------------------------------
def command_216
$game_player.followers.visible = (@params[0] == 0)
$game_player.refresh
end
#--------------------------------------------------------------------------
# ● 隊列メンバーの集合
#--------------------------------------------------------------------------
def command_217
return if $game_party.in_battle
$game_player.followers.gather
Fiber.yield until $game_player.followers.gather?
end
#--------------------------------------------------------------------------
# ● 画面のフェードアウト
#--------------------------------------------------------------------------
def command_221
Fiber.yield while $game_message.visible
screen.start_fadeout(30)
wait(30)
end
#--------------------------------------------------------------------------
# ● 画面のフェードイン
#--------------------------------------------------------------------------
def command_222
Fiber.yield while $game_message.visible
screen.start_fadein(30)
wait(30)
end
#--------------------------------------------------------------------------
# ● 画面の色調変更
#--------------------------------------------------------------------------
def command_223
screen.start_tone_change(@params[0], @params[1])
wait(@params[1]) if @params[2]
end
#--------------------------------------------------------------------------
# ● 画面のフラッシュ
#--------------------------------------------------------------------------
def command_224
screen.start_flash(@params[0], @params[1])
wait(@params[1]) if @params[2]
end
#--------------------------------------------------------------------------
# ● 画面のシェイク
#--------------------------------------------------------------------------
def command_225
screen.start_shake(@params[0], @params[1], @params[2])
wait(@params[1]) if @params[2]
end
#--------------------------------------------------------------------------
# ● ウェイト
#--------------------------------------------------------------------------
def command_230
wait(@params[0])
end
#--------------------------------------------------------------------------
# ● ピクチャの表示
#--------------------------------------------------------------------------
def command_231
if @params[3] == 0 # 直接指定
x = @params[4]
y = @params[5]
else # 変数で指定
x = $game_variables[@params[4]]
y = $game_variables[@params[5]]
end
screen.pictures[@params[0]].show(@params[1], @params[2],
x, y, @params[6], @params[7], @params[8], @params[9])
end
#--------------------------------------------------------------------------
# ● ピクチャの移動
#--------------------------------------------------------------------------
def command_232
if @params[3] == 0 # 直接指定
x = @params[4]
y = @params[5]
else # 変数で指定
x = $game_variables[@params[4]]
y = $game_variables[@params[5]]
end
screen.pictures[@params[0]].move(@params[2], x, y, @params[6],
@params[7], @params[8], @params[9], @params[10])
wait(@params[10]) if @params[11]
end
#--------------------------------------------------------------------------
# ● ピクチャの回転
#--------------------------------------------------------------------------
def command_233
screen.pictures[@params[0]].rotate(@params[1])
end
#--------------------------------------------------------------------------
# ● ピクチャの色調変更
#--------------------------------------------------------------------------
def command_234
screen.pictures[@params[0]].start_tone_change(@params[1], @params[2])
wait(@params[2]) if @params[3]
end
#--------------------------------------------------------------------------
# ● ピクチャの消去
#--------------------------------------------------------------------------
def command_235
screen.pictures[@params[0]].erase
end
#--------------------------------------------------------------------------
# ● 天候の設定
#--------------------------------------------------------------------------
def command_236
return if $game_party.in_battle
screen.change_weather(@params[0], @params[1], @params[2])
wait(@params[2]) if @params[3]
end
#--------------------------------------------------------------------------
# ● BGM の演奏
#--------------------------------------------------------------------------
def command_241
@params[0].play
end
#--------------------------------------------------------------------------
# ● BGM のフェードアウト
#--------------------------------------------------------------------------
def command_242
RPG::BGM.fade(@params[0] * 1000)
end
#--------------------------------------------------------------------------
# ● BGM の保存
#--------------------------------------------------------------------------
def command_243
$game_system.save_bgm
end
#--------------------------------------------------------------------------
# ● BGM の再開
#--------------------------------------------------------------------------
def command_244
$game_system.replay_bgm
end
#--------------------------------------------------------------------------
# ● BGS の演奏
#--------------------------------------------------------------------------
def command_245
@params[0].play
end
#--------------------------------------------------------------------------
# ● BGS のフェードアウト
#--------------------------------------------------------------------------
def command_246
RPG::BGS.fade(@params[0] * 1000)
end
#--------------------------------------------------------------------------
# ● ME の演奏
#--------------------------------------------------------------------------
def command_249
@params[0].play
end
#--------------------------------------------------------------------------
# ● SE の演奏
#--------------------------------------------------------------------------
def command_250
@params[0].play
end
#--------------------------------------------------------------------------
# ● SE の停止
#--------------------------------------------------------------------------
def command_251
RPG::SE.stop
end
#--------------------------------------------------------------------------
# ● ムービーの再生
#--------------------------------------------------------------------------
def command_261
Fiber.yield while $game_message.visible
Fiber.yield
name = @params[0]
Graphics.play_movie('Movies/' + name) unless name.empty?
end
#--------------------------------------------------------------------------
# ● マップ名表示の変更
#--------------------------------------------------------------------------
def command_281
$game_map.name_display = (@params[0] == 0)
end
#--------------------------------------------------------------------------
# ● タイルセットの変更
#--------------------------------------------------------------------------
def command_282
$game_map.change_tileset(@params[0])
end
#--------------------------------------------------------------------------
# ● 戦闘背景の変更
#--------------------------------------------------------------------------
def command_283
$game_map.change_battleback(@params[0], @params[1])
end
#--------------------------------------------------------------------------
# ● 遠景の変更
#--------------------------------------------------------------------------
def command_284
$game_map.change_parallax(@params[0], @params[1], @params[2],
@params[3], @params[4])
end
#--------------------------------------------------------------------------
# ● 指定位置の情報取得
#--------------------------------------------------------------------------
def command_285
if @params[2] == 0 # 直接指定
x = @params[3]
y = @params[4]
else # 変数で指定
x = $game_variables[@params[3]]
y = $game_variables[@params[4]]
end
case @params[1]
when 0 # 地形タグ
value = $game_map.terrain_tag(x, y)
when 1 # イベント ID
value = $game_map.event_id_xy(x, y)
when 2..4 # タイル ID
value = $game_map.tile_id(x, y, @params[1] - 2)
else # リージョン ID
value = $game_map.region_id(x, y)
end
$game_variables[@params[0]] = value
end
#--------------------------------------------------------------------------
# ● バトルの処理
#--------------------------------------------------------------------------
def command_301
return if $game_party.in_battle
if @params[0] == 0 # 直接指定
troop_id = @params[1]
elsif @params[0] == 1 # 変数で指定
troop_id = $game_variables[@params[1]]
else # マップ指定の敵グループ
troop_id = $game_player.make_encounter_troop_id
end
if $data_troops[troop_id]
BattleManager.setup(troop_id, @params[2], @params[3])
BattleManager.event_proc = Proc.new {|n| @branch[@indent] = n }
$game_player.make_encounter_count
SceneManager.call(Scene_Battle)
end
Fiber.yield
end
#--------------------------------------------------------------------------
# ● 勝った場合
#--------------------------------------------------------------------------
def command_601
command_skip if @branch[@indent] != 0
end
#--------------------------------------------------------------------------
# ● 逃げた場合
#--------------------------------------------------------------------------
def command_602
command_skip if @branch[@indent] != 1
end
#--------------------------------------------------------------------------
# ● 負けた場合
#--------------------------------------------------------------------------
def command_603
command_skip if @branch[@indent] != 2
end
#--------------------------------------------------------------------------
# ● ショップの処理
#--------------------------------------------------------------------------
def command_302
return if $game_party.in_battle
goods = [@params]
while next_event_code == 605
@index += 1
goods.push(@list[@index].parameters)
end
SceneManager.call(Scene_Shop)
SceneManager.scene.prepare(goods, @params[4])
Fiber.yield
end
#--------------------------------------------------------------------------
# ● 名前入力の処理
#--------------------------------------------------------------------------
def command_303
return if $game_party.in_battle
if $data_actors[@params[0]]
SceneManager.call(Scene_Name)
SceneManager.scene.prepare(@params[0], @params[1])
Fiber.yield
end
end
#--------------------------------------------------------------------------
# ● HP の増減
#--------------------------------------------------------------------------
def command_311
value = operate_value(@params[2], @params[3], @params[4])
iterate_actor_var(@params[0], @params[1]) do |actor|
next if actor.dead?
actor.change_hp(value, @params[5])
actor.perform_collapse_effect if actor.dead?
end
SceneManager.goto(Scene_Gameover) if $game_party.all_dead?
end
#--------------------------------------------------------------------------
# ● MP の増減
#--------------------------------------------------------------------------
def command_312
value = operate_value(@params[2], @params[3], @params[4])
iterate_actor_var(@params[0], @params[1]) do |actor|
actor.mp += value
end
end
#--------------------------------------------------------------------------
# ● ステートの変更
#--------------------------------------------------------------------------
def command_313
iterate_actor_var(@params[0], @params[1]) do |actor|
already_dead = actor.dead?
if @params[2] == 0
actor.add_state(@params[3])
else
actor.remove_state(@params[3])
end
actor.perform_collapse_effect if actor.dead? && !already_dead
end
end
#--------------------------------------------------------------------------
# ● 全回復
#--------------------------------------------------------------------------
def command_314
iterate_actor_var(@params[0], @params[1]) do |actor|
actor.recover_all
end
end
#--------------------------------------------------------------------------
# ● 経験値の増減
#--------------------------------------------------------------------------
def command_315
value = operate_value(@params[2], @params[3], @params[4])
iterate_actor_var(@params[0], @params[1]) do |actor|
actor.change_exp(actor.exp + value, @params[5])
end
end
#--------------------------------------------------------------------------
# ● レベルの増減
#--------------------------------------------------------------------------
def command_316
value = operate_value(@params[2], @params[3], @params[4])
iterate_actor_var(@params[0], @params[1]) do |actor|
actor.change_level(actor.level + value, @params[5])
end
end
#--------------------------------------------------------------------------
# ● 能力値の増減
#--------------------------------------------------------------------------
def command_317
value = operate_value(@params[3], @params[4], @params[5])
iterate_actor_var(@params[0], @params[1]) do |actor|
actor.add_param(@params[2], value)
end
end
#--------------------------------------------------------------------------
# ● スキルの増減
#--------------------------------------------------------------------------
def command_318
iterate_actor_var(@params[0], @params[1]) do |actor|
if @params[2] == 0
actor.learn_skill(@params[3])
else
actor.forget_skill(@params[3])
end
end
end
#--------------------------------------------------------------------------
# ● 装備の変更
#--------------------------------------------------------------------------
def command_319
actor = $game_actors[@params[0]]
actor.change_equip_by_id(@params[1], @params[2]) if actor
end
#--------------------------------------------------------------------------
# ● 名前の変更
#--------------------------------------------------------------------------
def command_320
actor = $game_actors[@params[0]]
actor.name = @params[1] if actor
end
#--------------------------------------------------------------------------
# ● 職業の変更
#--------------------------------------------------------------------------
def command_321
actor = $game_actors[@params[0]]
actor.change_class(@params[1]) if actor && $data_classes[@params[1]]
end
#--------------------------------------------------------------------------
# ● アクターのグラフィック変更
#--------------------------------------------------------------------------
def command_322
actor = $game_actors[@params[0]]
if actor
actor.set_graphic(@params[1], @params[2], @params[3], @params[4])
end
$game_player.refresh
end
#--------------------------------------------------------------------------
# ● 乗り物のグラフィック変更
#--------------------------------------------------------------------------
def command_323
vehicle = $game_map.vehicles[@params[0]]
vehicle.set_graphic(@params[1], @params[2]) if vehicle
end
#--------------------------------------------------------------------------
# ● 二つ名の変更
#--------------------------------------------------------------------------
def command_324
actor = $game_actors[@params[0]]
actor.nickname = @params[1] if actor
end
#--------------------------------------------------------------------------
# ● 敵キャラの HP 増減
#--------------------------------------------------------------------------
def command_331
value = operate_value(@params[1], @params[2], @params[3])
iterate_enemy_index(@params[0]) do |enemy|
return if enemy.dead?
enemy.change_hp(value, @params[4])
enemy.perform_collapse_effect if enemy.dead?
end
end
#--------------------------------------------------------------------------
# ● 敵キャラの MP 増減
#--------------------------------------------------------------------------
def command_332
value = operate_value(@params[1], @params[2], @params[3])
iterate_enemy_index(@params[0]) do |enemy|
enemy.mp += value
end
end
#--------------------------------------------------------------------------
# ● 敵キャラのステート変更
#--------------------------------------------------------------------------
def command_333
iterate_enemy_index(@params[0]) do |enemy|
already_dead = enemy.dead?
if @params[1] == 0
enemy.add_state(@params[2])
else
enemy.remove_state(@params[2])
end
enemy.perform_collapse_effect if enemy.dead? && !already_dead
end
end
#--------------------------------------------------------------------------
# ● 敵キャラの全回復
#--------------------------------------------------------------------------
def command_334
iterate_enemy_index(@params[0]) do |enemy|
enemy.recover_all
end
end
#--------------------------------------------------------------------------
# ● 敵キャラの出現
#--------------------------------------------------------------------------
def command_335
iterate_enemy_index(@params[0]) do |enemy|
enemy.appear
$game_troop.make_unique_names
end
end
#--------------------------------------------------------------------------
# ● 敵キャラの変身
#--------------------------------------------------------------------------
def command_336
iterate_enemy_index(@params[0]) do |enemy|
enemy.transform(@params[1])
$game_troop.make_unique_names
end
end
#--------------------------------------------------------------------------
# ● 戦闘アニメーションの表示
#--------------------------------------------------------------------------
def command_337
iterate_enemy_index(@params[0]) do |enemy|
enemy.animation_id = @params[1] if enemy.alive?
end
end
#--------------------------------------------------------------------------
# ● 戦闘行動の強制
#--------------------------------------------------------------------------
def command_339
iterate_battler(@params[0], @params[1]) do |battler|
next if battler.death_state?
battler.force_action(@params[2], @params[3])
BattleManager.force_action(battler)
Fiber.yield while BattleManager.action_forced?
end
end
#--------------------------------------------------------------------------
# ● バトルの中断
#--------------------------------------------------------------------------
def command_340
BattleManager.abort
Fiber.yield
end
#--------------------------------------------------------------------------
# ● メニュー画面を開く
#--------------------------------------------------------------------------
def command_351
return if $game_party.in_battle
SceneManager.call(Scene_Menu)
Window_MenuCommand::init_command_position
Fiber.yield
end
#--------------------------------------------------------------------------
# ● セーブ画面を開く
#--------------------------------------------------------------------------
def command_352
return if $game_party.in_battle
SceneManager.call(Scene_Save)
Fiber.yield
end
#--------------------------------------------------------------------------
# ● ゲームオーバー
#--------------------------------------------------------------------------
def command_353
SceneManager.goto(Scene_Gameover)
Fiber.yield
end
#--------------------------------------------------------------------------
# ● タイトル画面に戻す
#--------------------------------------------------------------------------
def command_354
SceneManager.goto(Scene_Title)
Fiber.yield
end
#--------------------------------------------------------------------------
# ● スクリプト
#--------------------------------------------------------------------------
def command_355
script = @list[@index].parameters[0] + "\n"
while next_event_code == 655
@index += 1
script += @list[@index].parameters[0] + "\n"
end
eval(script)
end
end