#=========================================================================== # ◆ A1 Scripts ◆ # ループ終了条件(RGSS3) # # バージョン : 1.00 (2012/01/05) # 作者 : A1 # URL     : http://a1tktk.web.fc2.com/ #--------------------------------------------------------------------------- # 機能: # ・ループの終了条件を拡張条件分岐であらかじめ設定できます #  for while until loop-while loop-until next break に対応 #--------------------------------------------------------------------------- # 更新履歴   :2012/01/05 Ver1.00 リリース #--------------------------------------------------------------------------- # 設置場所 #  A1共通スクリプトより下 #  拡張条件分岐より下 # # 必要スクリプト # A1共通スクリプトVer3.80以上 #  拡張条件分岐 #--------------------------------------------------------------------------- # 使い方 # イベントコマンド「注釈」に記述 # # ループ終了条件 kind,[条件],変数番号 # kind :for while until が指定できます # 条件 :ループを終了させる条件を記述します # for 以外では拡張条件分岐の条件が使用できます # 変数番号:for 時に指定すると、現在値が指定した変数に代入されます # # 例:ループ終了条件 for,[\V[1],1,\V[2]],3 # 変数[1] から 1ずつ加算していき、変数[2] になったらループを抜ける # その際、変数[3] に現在値が代入されていきます # # 例:ループ終了条件 while,[向き?,[プレイヤー,右]] # # プレイヤーが右を向いている間ループします # ※「向き?」条件は「拡張条件分岐定義例」の拡張条件を使用 # # 例:ループ終了条件 until,[向き?,[プレイヤー,右]] # # プレイヤーが右を向いていない間ループします # ※「向き?」条件は「拡張条件分岐定義例」の拡張条件を使用 # # ループ終了条件 [kind],[条件] # # loop-while loop-until 用の記述方式です # 前述の while until と違い、必ず1回はループの内容を実行します # # 例:ループ終了条件 [loop,while],[向き?,[プレイヤー,右]] # 例:ループ終了条件 [loop,until],[向き?,[プレイヤー,右]] # # Next条件 [条件] # # 条件 を満たすとループを中断して最初に戻ります # 条件 には拡張条件分岐の条件が使用できます # # break条件 [条件] # # 条件 を満たすとループを抜けます # 条件 には拡張条件分岐の条件が使用できます # # それぞれ使用する「拡張条件分岐」の条件は # 直後に「条件分岐」を置く必要はありません #============================================================================== $imported ||= {} $imported["A1_ExLoopEnd"] = true if $imported["A1_ProcExCondition"] && $imported["A1_Common_Script"] old_common_script("ループ終了条件", "3.80") if common_version < 3.80 #============================================================================== # ■ A1_System::CommonModule #============================================================================== class A1_System::CommonModule #-------------------------------------------------------------------------- # ☆ 注釈コマンド定義 #-------------------------------------------------------------------------- alias a1_loopend_condition_define_command define_command def define_command a1_loopend_condition_define_command @cmd_108["ループ終了条件"] = :loopend_condition @cmd_108["Next条件"] = :next_condition @cmd_108["break条件"] = :break_condition end end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ★ ループ #-------------------------------------------------------------------------- def command_112 loop_end?(@loop_kind) if @loop_kind == "while" || @loop_kind == "until" for_loop_end? if @loop_kind == "for" end #-------------------------------------------------------------------------- # ☆ 以上繰り返し #-------------------------------------------------------------------------- alias a1_loopend_condition_ccommand_413 command_413 def command_413(next_condition = false) a1_loopend_condition_ccommand_413 if next_condition increment_for_num if @loop_kind == "for" a1_loopend_condition_ccommand_413 unless @loop_kind.is_a?(Array) loop_end?(@loop_kind[1]) if @loop_kind[0] == "loop" && (@loop_kind[1] == "while" || @loop_kind[1] == "until") end #-------------------------------------------------------------------------- # ☆ ループの中断 #-------------------------------------------------------------------------- alias a1_loopend_condition_command_113 command_113 def command_113 @start_num = nil @increment_num = nil @end_num = nil @variable_no = nil @loop_kind = nil @loopend_condition = nil a1_loopend_condition_command_113 end #-------------------------------------------------------------------------- # ○ for文のインクリメント #-------------------------------------------------------------------------- def increment_for_num @start_num += @increment_num $game_variables[@variable_no] = @start_num if @variable_no a1_loopend_condition_ccommand_413 end #-------------------------------------------------------------------------- # ○ for文の終了? #-------------------------------------------------------------------------- def for_loop_end? return command_113 if @start_num > @end_num if @increment_num > 0 return command_113 if @start_num < @end_num if @increment_num < 0 end #-------------------------------------------------------------------------- # ○ ループ終了? #-------------------------------------------------------------------------- def loop_end?(kind) return command_113 if kind == "while" && !proc_condition(@loopend_condition) return command_113 if kind == "until" && proc_condition(@loopend_condition) end #-------------------------------------------------------------------------- # ○ break条件 #-------------------------------------------------------------------------- def break_condition(params) command_113 if proc_condition(params) end #-------------------------------------------------------------------------- # ○ Next条件 #-------------------------------------------------------------------------- def next_condition(params) command_413(true) if proc_condition(params) end #-------------------------------------------------------------------------- # ○ ループ終了条件 #-------------------------------------------------------------------------- def loopend_condition(params) return unless next_event_code == 112 @loop_kind = params[0] @loopend_condition = params[1] set_for_condition(params) if @loop_kind == "for" end #-------------------------------------------------------------------------- # ○ for文条件設定 #-------------------------------------------------------------------------- def set_for_condition(params) @start_num = @loopend_condition[0].to_i @increment_num = @loopend_condition[1].to_i @end_num = @loopend_condition[2].to_i @variable_no = params[2].to_i if params[2] $game_variables[@variable_no] = @start_num if @variable_no end end end