=begin ▼ オリジナルサブメニュー ver. 1.2 RPGツクールVXAce用スクリプト 制作 : 木星ペンギン URL : http://woodpenguin.blog.fc2.com/ ------------------------------------------------------------------------------ 概要 □ コモンイベントで作成したオリジナルのサブメニュー画面が作成できます。 ------------------------------------------------------------------------------ 備考 □ コマンドは【並び替え】の下に追加されます。 □ サブメニューの処理はイベントコマンドで実行されます。 ・メインのコモンイベントの処理が終了した時点で、前の画面に戻ります。 ・サブのコモンイベントは処理が終了しても最初から繰り返しません。 □ 『イベントの移動』などを実行した場合、新しくメニュー画面用のイベントが 生成されます。 ・座標 X:0 Y:0 にグラフィックを設定していない状態で生成されます。 □ スクリプトコマンドで SceneManager.goto(Scene_Map) と実行すれば マップ画面まで戻ることが出来ます。 その際、サブメニューで実行中のイベントは中断されます。 □ 『場所移動』を実行した場合、強制的にマップ画面まで戻されます。 その際、サブメニューで実行中のイベントは中断されます。 =end module WdTk module SubMenu #-------------------------------------------------------------------------- # ● 追加する項目の設定 # 配列にコマンド名、実行するコモンイベントID、 # 並列処理を行うコモンイベントIDの順に設定する。 #-------------------------------------------------------------------------- List = [["コンフィング", 1, 0], ["ファストトラベル2", 3, 0], ] #////////////////////////////////////////////////////////////////////////////// # # 以降、変更する必要なし # #////////////////////////////////////////////////////////////////////////////// end @material ||= [] @material << :SubMenu def self.include?(sym) @material.include?(sym) end end #============================================================================== # ■ Game_SubMenu_Character #============================================================================== class Game_SubMenu_Character < Game_Character #-------------------------------------------------------------------------- # ● 通行可能判定 #-------------------------------------------------------------------------- def passable?(*) return true end #-------------------------------------------------------------------------- # ● 斜めの通行可能判定 #-------------------------------------------------------------------------- def diagonal_passable?(*) return true end #-------------------------------------------------------------------------- # ● 指定位置に移動 #-------------------------------------------------------------------------- def moveto(x, y) @x = x @y = y @real_x = @x @real_y = @y @prelock_direction = 0 straighten update_bush_depth end #-------------------------------------------------------------------------- # ● 画面 X 座標の取得 #-------------------------------------------------------------------------- def screen_x @real_x * 32 + 16 end #-------------------------------------------------------------------------- # ● 画面 Y 座標の取得 #-------------------------------------------------------------------------- def screen_y @real_y * 32 + 32 - shift_y - jump_height end #-------------------------------------------------------------------------- # ● ジャンプ時の更新 #-------------------------------------------------------------------------- def update_jump @jump_count -= 1 @real_x = (@real_x * @jump_count + @x) / (@jump_count + 1.0) @real_y = (@real_y * @jump_count + @y) / (@jump_count + 1.0) update_bush_depth if @jump_count == 0 @real_x = @x @real_y = @y end end #-------------------------------------------------------------------------- # ● 梯子判定 #-------------------------------------------------------------------------- def ladder? return false end #-------------------------------------------------------------------------- # ● 茂み判定 #-------------------------------------------------------------------------- def bush? return false end #-------------------------------------------------------------------------- # ● 地形タグの取得 #-------------------------------------------------------------------------- def terrain_tag return 0 end #-------------------------------------------------------------------------- # ● リージョン ID の取得 #-------------------------------------------------------------------------- def region_id return 0 end #-------------------------------------------------------------------------- # ● まっすぐに移動 # d : 方向(2,4,6,8) # turn_ok : その場での向き変更を許可 #-------------------------------------------------------------------------- def move_straight(d, turn_ok = true) @move_succeed = passable?(@x, @y, d) if @move_succeed set_direction(d) @x += d == 6 ? 1 : d == 4 ? -1 : 0 @y += d == 2 ? 1 : d == 8 ? -1 : 0 increase_steps elsif turn_ok set_direction(d) end end #-------------------------------------------------------------------------- # ● 斜めに移動 # horz : 横方向(4 or 6) # vert : 縦方向(2 or 8) #-------------------------------------------------------------------------- def move_diagonal(horz, vert) @move_succeed = diagonal_passable?(x, y, horz, vert) if @move_succeed @x += horz == 6 ? 1 : horz == 4 ? -1 : 0 @y += vert == 2 ? 1 : vert == 8 ? -1 : 0 increase_steps end set_direction(horz) if @direction == reverse_dir(horz) set_direction(vert) if @direction == reverse_dir(vert) end #-------------------------------------------------------------------------- # ● X 方向の距離計算 #-------------------------------------------------------------------------- def distance_x_from(x) @x - x end #-------------------------------------------------------------------------- # ● Y 方向の距離計算 #-------------------------------------------------------------------------- def distance_y_from(y) @y - y end end #============================================================================== # ■ Game_SubMenu_Interpreter #============================================================================== class Game_SubMenu_Interpreter < Game_Interpreter #-------------------------------------------------------------------------- # ● イベントのセットアップ #-------------------------------------------------------------------------- def setup(list, scene) clear @scene = scene @list = list create_fiber end #-------------------------------------------------------------------------- # ● 実行 #-------------------------------------------------------------------------- def run while @list[@index] do execute_command @index += 1 end Fiber.yield @fiber = nil end #-------------------------------------------------------------------------- # ● 画面系コマンドの対象を取得 #-------------------------------------------------------------------------- def screen @scene.screen end #-------------------------------------------------------------------------- # ● キャラクターの取得 #-------------------------------------------------------------------------- def get_character(param) param > 0 ? @scene.get_event(param) : nil end #-------------------------------------------------------------------------- # ● コモンイベント #-------------------------------------------------------------------------- def command_117 common_event = $data_common_events[@params[0]] if common_event child = Game_SubMenu_Interpreter.new(@depth + 1) child.setup(common_event.list, @scene) child.run end end end #============================================================================== # ■ Window_MenuCommand #============================================================================== class Window_MenuCommand #-------------------------------------------------------------------------- # ○ 独自コマンドの追加用 #-------------------------------------------------------------------------- alias _wdtk_submenu_add_original_commands add_original_commands def add_original_commands _wdtk_submenu_add_original_commands WdTk::SubMenu::List.each {|com| add_command(com[0], com[0]) if com } end end #============================================================================== # ■ Spriteset_SubMenu #============================================================================== class Spriteset_SubMenu #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(scene) @scene = scene create_viewports @character_sprites = [] @picture_sprites = [] update end #-------------------------------------------------------------------------- # ● ビューポートの作成 #-------------------------------------------------------------------------- def create_viewports @viewport1 = Viewport.new @viewport2 = Viewport.new @viewport2.z = 50 end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose dispose_characters @picture_sprites.compact.each {|sprite| sprite.dispose } dispose_viewports end #-------------------------------------------------------------------------- # ● キャラクタースプライトの解放 #-------------------------------------------------------------------------- def dispose_characters @character_sprites.compact.each {|sprite| sprite.dispose } end #-------------------------------------------------------------------------- # ● ビューポートの解放 #-------------------------------------------------------------------------- def dispose_viewports @viewport1.dispose @viewport2.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update update_characters update_pictures update_viewports end #-------------------------------------------------------------------------- # ● キャラクタースプライトの更新 #-------------------------------------------------------------------------- def update_characters @scene.events.each do |i, event| @character_sprites[i] ||= Sprite_Character.new(@viewport1, event) @character_sprites[i].update end end #-------------------------------------------------------------------------- # ● ピクチャスプライトの更新 #-------------------------------------------------------------------------- def update_pictures @scene.screen.pictures.each do |pic| @picture_sprites[pic.number] ||= Sprite_Picture.new(@viewport2, pic) @picture_sprites[pic.number].update end end #-------------------------------------------------------------------------- # ● ビューポートの更新 #-------------------------------------------------------------------------- def update_viewports @viewport1.tone.set(@scene.screen.tone) @viewport1.ox = @scene.screen.shake @viewport2.color.set(@scene.screen.flash_color) @viewport1.update @viewport2.update end end #============================================================================== # ■ Scene_Menu #============================================================================== class Scene_Menu #-------------------------------------------------------------------------- # ○ コマンドウィンドウの作成 #-------------------------------------------------------------------------- alias _wdtk_submenu_create_command_window create_command_window def create_command_window _wdtk_submenu_create_command_window WdTk::SubMenu::List.each do |com| @command_window.set_handler(com[0], method(:command_submenu)) if com end end #-------------------------------------------------------------------------- # ● コマンド[サブメニュー] #-------------------------------------------------------------------------- def command_submenu param = WdTk::SubMenu::List.assoc(@command_window.current_symbol) if param SceneManager.call(Scene_ExSubMenu) SceneManager.scene.prepare(*param) else @command_window.activate end end end #============================================================================== # ■ Scene_ExSubMenu #============================================================================== class Scene_ExSubMenu < Scene_MenuBase #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :screen attr_reader :events #-------------------------------------------------------------------------- # ● 準備 #-------------------------------------------------------------------------- def prepare(menu_name, main_id, sub_id) @screen = Game_Screen.new @main_interpreter = Game_SubMenu_Interpreter.new common_event = $data_common_events[main_id] @main_interpreter.setup(common_event.list, self) if common_event @sub_interpreter = Game_SubMenu_Interpreter.new common_event = $data_common_events[sub_id] @sub_interpreter.setup(common_event.list, self) if common_event @events = {} end #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start super @spriteset = Spriteset_SubMenu.new(self) create_message_window create_scroll_text_window end #-------------------------------------------------------------------------- # ● 終了前処理 #-------------------------------------------------------------------------- def pre_terminate super pre_battle_scene if SceneManager.scene_is?(Scene_Battle) pre_title_scene if SceneManager.scene_is?(Scene_Title) end #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- def terminate super @spriteset.dispose perform_battle_transition if SceneManager.scene_is?(Scene_Battle) end #-------------------------------------------------------------------------- # ● フレーム更新(基本) #-------------------------------------------------------------------------- def update_basic super @main_interpreter.update return return_scene unless @main_interpreter.running? return SceneManager.goto(Scene_Map) if $game_player.transfer? @sub_interpreter.update @events.each_value {|event| event.update } @spriteset.update end #-------------------------------------------------------------------------- # ● 汎用フェード処理 #-------------------------------------------------------------------------- def fade_loop(duration) duration.times do |i| yield 255 * (i + 1) / duration update_basic end end #-------------------------------------------------------------------------- # ● 画面のフェードイン #-------------------------------------------------------------------------- def fadein(duration) fade_loop(duration) {|v| Graphics.brightness = v } end #-------------------------------------------------------------------------- # ● 画面のフェードアウト #-------------------------------------------------------------------------- def fadeout(duration) fade_loop(duration) {|v| Graphics.brightness = 255 - v } end #-------------------------------------------------------------------------- # ● メッセージウィンドウの作成 #-------------------------------------------------------------------------- def create_message_window @message_window = Window_Message.new end #-------------------------------------------------------------------------- # ● スクロール文章ウィンドウの作成 #-------------------------------------------------------------------------- def create_scroll_text_window @scroll_text_window = Window_ScrollText.new end #-------------------------------------------------------------------------- # ● バトル画面遷移の前処理 #-------------------------------------------------------------------------- def pre_battle_scene Graphics.update Graphics.freeze @spriteset.dispose_characters BattleManager.save_bgm_and_bgs BattleManager.play_battle_bgm Sound.play_battle_start end #-------------------------------------------------------------------------- # ● タイトル画面遷移の前処理 #-------------------------------------------------------------------------- def pre_title_scene fadeout(60) end #-------------------------------------------------------------------------- # ● 戦闘前トランジション実行 #-------------------------------------------------------------------------- def perform_battle_transition Graphics.transition(60, "Graphics/System/BattleStart", 100) Graphics.freeze end #-------------------------------------------------------------------------- # ● イベントの取得 #-------------------------------------------------------------------------- def get_event(event_id) @events[event_id] ||= Game_SubMenu_Character.new end end