Interpreterクラス内に次のようなメソッドがあります。 #-------------------------------------------------------------------------- # ● スクリプト #-------------------------------------------------------------------------- def command_355 # script に 1 行目を設定 script = @list[@index].parameters[0] + "\n" # ループ loop do # 次のイベントコマンドがスクリプト 2 行目以降の場合 if @list[@index+1].code == 655 # script に 2 行目以降を追加 script += @list[@index+1].parameters[0] + "\n" # イベントコマンドがスクリプト 2 行目以降ではない場合 else # ループ中断 break end # インデックスを進める @index += 1 end # 評価 result = eval(script) # 戻り値が false の場合 if result == false # 終了 return false end # 継続 return true end これは、イベントスクリプトの実行をする箇所ですが、 ここで注目すべきはこの部分です。 ************************************************************* # 評価 result = eval(script) # 戻り値が false の場合 if result == false # 終了 return false end # 継続 return true ************************************************************* これを見ると、evalという組み込み関数を使って、 イベントスクリプト文(script)の評価を行い、 その戻り値がfalseの場合は不正と判断しているように見えます。 つまり、eval関数の戻り値が true : 実行できるプログラム false : 実行できないプログラム であるかのようにプログラムが組まれています。 しかし、次のようなプログラムをeval関数で評価させてみると・・・ @x = false eval("x = false") # => false Ax = true eval("x = true") # => true Bx = nil eval("x = nil") # => nil Cx = 10 eval("x = 10") # => 10 これらはxという変数にfalseやtrue、nil、10というものを 代入しているだけなので、当然全て実行できるプログラムです。 しかし、戻り値はtrue/falseではありません。 そこで、実行できないプログラムを組むとどうなるか試してみましょう。 Dx +*/ 10 eval("x +*/ 10") これをイベントスクリプト内で実行させると、 「スクリプト実行中にSyntaxErrorが発生しました。」 というメッセージが表示されます。 SyntaxErrorは文法エラーがあったときに発生しますので、 x +*/ 10 なんて記述はないので、文法エラーで正解です。 しかし、この場合eval関数からは戻ってきません。 (Rubyでは不明ですが、RGSSではエラー終了します) eval関数の戻り値を見ていることに意味はないと思われます。 したがって、次の箇所は不要というわけです。 ************************************************************* # 戻り値が false の場合 if result == false # 終了 return false end ************************************************************* ☆ちなみになぜ改行を含むと大丈夫かというと・・・ これはもう一つのイベントスクリプトのバグ?に起因します。 ************************************************************* # script に 1 行目を設定 script = @list[@index].parameters[0] + "\n" # ループ loop do # 次のイベントコマンドがスクリプト 2 行目以降の場合 if @list[@index+1].code == 655 # script に 2 行目以降を追加 script += @list[@index+1].parameters[0] + "\n" # イベントコマンドがスクリプト 2 行目以降ではない場合 else # ループ中断 break end # インデックスを進める @index += 1 end # 評価 result = eval(script) # 戻り値が false の場合 if result == false # 終了 return false end # 継続 return true ************************************************************* これを見ると、 イベントスクリプトが1行の場合実行される経路は、 @script = @list[@index].parameters[0] + "\n" Aloop do Bif @list[@index+1].code == 655 Celse Dbreak Eresult = eval(script) Fif result == false Greturn falseまたはreturn true となります。 ここで、この箇所の直接の呼び出し元であるInterpreterクラスの updateメソッド(一部のみ)を見てみましょう。 ************************************************************* # イベントコマンドの実行を試み、戻り値が false の場合 if execute_command == false return end # インデックスを進める @index += 1 ************************************************************* ここのexecute_commandがイベントの実行メソッドです。 execute_commandメソッドでfalseが戻ってくると、 次のイベントは実行されないようになってます。 では、再びイベントスクリプトの実行メソッドcommand_355に戻りましょうか。 1行のみのイベントスクリプトの場合、 @script = @list[@index].parameters[0] + "\n" Aloop do Bif @list[@index+1].code == 655 Celse Dbreak Eresult = eval(script) Fif result == false Greturn falseまたはreturn true という経路なので、 # インデックスを進める @index += 1 という箇所は通りません。 ということは、  x = false という1行のみのイベントスクリプトを実行させようとすると、 eval関数の戻り値がfalseとなるので、 command_355の戻り値はfalseとなり、 当然execute_commandの戻り値もfalseとなり、 次のイベントを実行される状態にはなりません。 次のイベントを実行される状態にならないということは、 同じイベント(イベントスクリプトx = false)が 実行され続けます。 つまり、無限ループ化(フリーズ)するわけです。 しかし、改行を入れると、 イベントスクリプトは2行になるので、 実行される経路は、 @script = @list[@index].parameters[0] + "\n" Aloop do Bif @list[@index+1].code == 655 Cscript += @list[@index+1].parameters[0] + "\n" D@index += 1 Eloop do Felse Gbreak Hresult = eval(script) Iif result == false Jreturn falseまたはreturn true となり、@index += 1が実行されるので、 イベントが次のイベントに遷移できるためです。 構造的に問題があるかもしれませんが、 とりあえずeval関数の戻り値の方さえ直せば、 @indexはupdateメソッドでインクリメントされるので、 その件は多分大丈夫なはず・・・(^^; ※ここでの話はあくまで主観的に見てという話。