#============================================================================== # ■ XP-RGSS-44-V3 サイドビュー戦闘[Sprite_Battler(motion)] by Claimh #------------------------------------------------------------------------------ # バトラーのモーション制御部分。ここはバトラーのモーション制御部分 #------------------------------------------------------------------------------ #【再定義】Spriteset_Battle : 全て #============================================================================== #============================================================================== # ■ Sprite_Battler #------------------------------------------------------------------------------ #  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== module MT_MODE #------------------------------------------------- # モーションモード(@mt_mode) MT_START= -1 # 初期値 MT_STAY = 0 # 待機 MT_MAGI = 1 # 遠距離攻撃 MT_ITEM = 2 # アイテム MT_DMG = 3 # 非ダメージ MT_MISS = 4 # 非ダメージ(Miss) MT_DEAD = 5 # 戦闘不能 MT_WIN = 6 # 勝利 MT_ATK1 = 7 # 近接攻撃(行き) MT_ATK2 = 8 # 近接攻撃(攻撃) MT_ATK3 = 9 # 近接攻撃(帰り) MT_RECOV= 10 # 回復 MT_DIM1 = 11 # 近接スキル攻撃(行き) MT_DIM2 = 12 # 近接スキル攻撃(攻撃) MT_DIM3 = 13 # 近接スキル攻撃(帰り) #------------------------------------------------- module_function #-------------------------------------------------------------------------- # ● 移動位置計算 #-------------------------------------------------------------------------- def set_target_point(attacker, target) case target when Game_Actor bits = RPG::Cache.character(target.character_name, target.character_hue) attacker.target_x = target.screen_x + (bits.width / 8) attacker.target_y = target.screen_y when Game_Enemy bits = RPG::Cache.battler(target.battler_name, target.battler_hue) attacker.target_x = target.screen_x + (bits.width / 2) attacker.target_y = target.screen_y end end #-------------------------------------------------------------------------- # ● ジャンプ位置計算 #-------------------------------------------------------------------------- def set_jump_point(attacker, height) attacker.target_x = attacker.screen_x attacker.target_y = attacker.screen_y - height end end class Sprite_Battler < RPG::Sprite include MT_MODE # モーションモード(@mt_mode) include SettingDefine include SkillDefine #-------------------------------------------------------------------------- # ● モーション切り替えupdate #-------------------------------------------------------------------------- def motion_update return if @mt_mode == @battler.mt_mode @mt_mode = @battler.mt_mode @pattern = 0 case @mt_mode when MT_STAY # 待機 init_direct_attack @f_count = Setting::STAY_FRAME when MT_MAGI # 遠距離攻撃 @f_count = Setting::MAGI_FRAME @magic_wait = false when MT_ITEM # アイテム @f_count = Setting::ITEM_FRAME @item_wait = false when MT_DMG # 非ダメージ @f_count = Setting::DMG_FRAME when MT_MISS # 非ダメージMiss @f_count = 0 when MT_DEAD # 戦闘不能 if @battler.is_a?(Game_Actor) @f_count = Setting::DEAD_FRAME end when MT_RECOV# 回復 @f_count = Setting::RECOV_FRAME when MT_WIN # 勝利 @f_count = Setting::WIN_FRAME @win_wait = false when MT_ATK1 # 近接攻撃開始 when MT_ATK2 # 近接攻撃 @f_count = Setting::ATK_FRAME when MT_ATK3 # 近接攻撃終了 when MT_DIM1 # 近接スキル攻撃開始 when MT_DIM2 # 近接スキル攻撃 @f_count = Setting::ATK_FRAME @magic_wait = false when MT_DIM3 # 近接スキル攻撃終了 else p "unknown pattern", @mt_mode end end #-------------------------------------------------------------------------- # ● モーションコントロール #-------------------------------------------------------------------------- def motion_control # 動作チェンジ case @mt_mode when MT_START @battler.mt_mode = MT_STAY when MT_STAY # 待機 draw_stay_graphic if frame_counter(Setting::STAY_FRAME) when MT_MAGI # 魔法攻撃 unless @magic_wait draw_magic_graphic if frame_counter(Setting::MAGI_FRAME) end when MT_ITEM # アイテム unless @item_wait draw_item_graphic if frame_counter(Setting::ITEM_FRAME) end when MT_DMG # 非ダメージ draw_damage_graphic if frame_counter(Setting::DMG_FRAME) when MT_MISS # 非ダメージMiss draw_miss_graphic when MT_DEAD # 戦闘不能 if @battler.is_a?(Game_Actor) draw_dead_graphic if frame_counter(Setting::DEAD_FRAME) end when MT_RECOV# 回復 draw_recover_graphic if frame_counter(Setting::RECOV_FRAME) when MT_WIN # 勝利 unless @win_wait draw_win_graphic if frame_counter(Setting::WIN_FRAME) end when MT_ATK1 # 近接攻撃開始 exe_moving_attack_start when MT_ATK2 # 近接攻撃 if @bt_data.at_go_pattern != AT_THROW draw_attack_graphic if frame_counter(Setting::ATK_FRAME) end when MT_ATK3 # 近接攻撃終了 exe_moving_attack_end when MT_DIM1 # 近接スキル攻撃開始 exe_moving_attack_start when MT_DIM2 # 近接スキル攻撃 # if @bt_data.at_go_pattern != AT_THROW unless @magic_wait draw_magic_graphic if frame_counter(Setting::ATK_FRAME) end # end when MT_DIM3 # 近接スキル攻撃終了 exe_moving_attack_end else p "error:Sprite_Battler>> @mt_mode" end end #-------------------------------------------------------------------------- # ● フレームカウンター : 画像切り替え用カウンタ #-------------------------------------------------------------------------- def frame_counter(max) @f_count -= 1 if @f_count == 0 @f_count = max return true end return false end #-------------------------------------------------------------------------- # ● ジャンプ動作位置決定 #-------------------------------------------------------------------------- def jump_go_y wi = @battler.screen_x - @battler_x_plus wi = 1 if wi == 0 xi = @battler.target_x - self.x zi = @bt_data.jump / 2 # ジャンプ ai = 4 * zi / (wi * wi) yi = ai * (xi - wi/2) * (xi - wi/2) + zi return yi.truncate end #-------------------------------------------------------------------------- # ● ジャンプ動作位置決定 #-------------------------------------------------------------------------- def jump_back_y wi = @battler.screen_x - @battler_x_plus wi = 1 if wi == 0 xi = @battler.target_x - self.x zi = @bt_data.jump # ジャンプ ai = 4 * zi / (wi * wi) yi = ai * (xi - wi/2) * (xi - wi/2) + zi return yi.truncate end #-------------------------------------------------------------------------- # ● 近接攻撃開始 #-------------------------------------------------------------------------- def exe_moving_attack_start return unless @battler.motion_stop case @direct_attack_phase when 0 # 動作開始準備 direct_start @f_count = (@direct_move_cnt/@bt_data.go_count).round when 1 # 移動動作(行き) direct_move when 2 # 移動後ウェイト direct_wait end end #-------------------------------------------------------------------------- # ● 近接攻撃実行 [動作開始準備] #-------------------------------------------------------------------------- def direct_start # ポーズ変更 @pattern = 1 # フレーム数算出 @direct_move_cnt = @bt_data.go_move_cnt @direct_attack_cnt = @bt_data.go_move_cnt # NEXTフェーズ @direct_attack_phase += 1 end #-------------------------------------------------------------------------- # ● 移動動作(行き) : ジャンプ幅計算、グラフィック描画処理 #-------------------------------------------------------------------------- def direct_move_jump case @battler when Game_Actor x_plus = 20 y_plus = 0 when Game_Enemy x_plus = -60 y_plus = 0 end jump_plus = 0 case @mt_mode when MT_ATK1 case @bt_data.at_go_pattern when AT_STRAIGHT draw_go_graphic if frame_counter((@direct_move_cnt/@bt_data.go_count).round) when AT_JUMP draw_go_graphic if frame_counter((@direct_move_cnt/@bt_data.go_count).round) jump_plus = jump_go_y jump_plus = @bt_data.jump if jump_plus > @bt_data.jump when AT_THROW s1 = @bt_data.go_move_cnt # 全体のフレーム数 s2 = @bt_data.go_move_cnt - @bt_data.attack_count # 初期モーションのフレーム数 case @direct_attack_cnt when (s2+1)..s1 # 初期モーション draw_attack_graphic # 初期モーションは攻撃画像を使う @direct_attack_cnt -= 1 return [] # emptyを返す when s2 # 投げモーションに移行 # 投げている間に表示する本体のダミー draw_throw_graphic @pattern = 0 draw_go_graphic # 投げるものを本体として仮定 jump_plus = 0 when 0..s2 # 投げモーション x_plus = -30 jump_plus = jump_go_y # 一応、放物線を描くもの対応しておく jump_plus = @bt_data.jump if jump_plus > @bt_data.jump if @direct_attack_cnt == 1 self.visible = false end end end when MT_DIM1 skill = $data_skills[@battler.current_action.skill_id] case skill.type when S_DIRECT go_count = @bt_data.magic_go_count(@battler.current_action.skill_id) draw_magic_go_graphic if frame_counter((@direct_move_cnt/go_count).round) when S_ST_JUMP go_count = @bt_data.magic_go_count(@battler.current_action.skill_id) draw_magic_go_graphic if frame_counter((@direct_move_cnt/go_count).round) end end return [x_plus, y_plus, jump_plus] end #-------------------------------------------------------------------------- # ● 近接攻撃実行 [移動動作(行き)] #-------------------------------------------------------------------------- def direct_move x_y_jump_plus = direct_move_jump return if x_y_jump_plus.empty? x_plus = x_y_jump_plus[0] y_plus = x_y_jump_plus[1] jump_plus = x_y_jump_plus[2] # ターゲット位置の更新 set_target_point(@battler, @battler.target) # 現在の位置と目標位置から次の移動位置を割り出す pos_x = @battler.target_x - self.x + x_plus pos_y = @battler.target_y - self.y + y_plus if @direct_attack_cnt != 0 @battler_x_plus += pos_x / @direct_attack_cnt @battler_y_plus += pos_y / @direct_attack_cnt - jump_plus end # 終了カウント @direct_attack_cnt -= 1 # 最終移動(保険:最終補正) if @direct_attack_cnt <= 0 @battler_x_plus = @battler.target_x - @battler.screen_x + x_plus @battler_y_plus = @battler.target_y - @battler.screen_y + y_plus # NEXTフェーズ @direct_attack_cnt = @bt_data.atk_wait_cnt @direct_attack_phase += 1 end end #-------------------------------------------------------------------------- # ● 近接攻撃実行 [攻撃動作からの復帰] #-------------------------------------------------------------------------- def direct_wait # 終了カウント @direct_attack_cnt -= 1 # 最終移動 if @direct_attack_cnt <= 0 # ポーズ変更 @pattern = 3 # ENDフェーズ @direct_attack_phase = 0 @battler.motion_stop = false end end #-------------------------------------------------------------------------- # ● 近接攻撃終了 #-------------------------------------------------------------------------- def exe_moving_attack_end case @direct_attack_phase when 0 # 攻撃動作 direct_attack @f_count = (@direct_move_cnt/@bt_data.back_count).round when 1 # 移動動作(帰り) direct_back when 2 # 動作終了 direct_end end end #-------------------------------------------------------------------------- # ● 近接攻撃実行 [攻撃動作からの復帰] #-------------------------------------------------------------------------- def direct_attack # 終了ウェイトカウント @direct_move_cnt = @bt_data.back_move_cnt @direct_attack_cnt = @bt_data.back_move_cnt # NEXTフェーズ @direct_attack_phase += 1 end #-------------------------------------------------------------------------- # ● 移動動作(帰り) : ジャンプ幅計算、グラフィック描画処理 #-------------------------------------------------------------------------- def direct_back_jump jump_plus = 0 case @mt_mode when MT_ATK3 case @bt_data.at_back_pattern when AT_STRAIGHT draw_back_graphic if frame_counter((@direct_move_cnt/@bt_data.back_count).round) when AT_JUMP draw_back_graphic if frame_counter((@direct_move_cnt/@bt_data.back_count).round) jump_plus = jump_back_y jump_plus = @bt_data.jump if jump_plus > @bt_data.jump when AT_THROW @pattern = 0 @f_count = Setting::STAY_FRAME self.visible = true draw_stay_graphic unless @throw_sprite.nil? @throw_sprite.dispose @throw_sprite = nil end @direct_attack_cnt = 1 end when MT_DIM3 skill = $data_skills[@battler.current_action.skill_id] case skill.type when S_DIRECT back_count = @bt_data.magic_back_count(@battler.current_action.skill_id) draw_magic_back_graphic if frame_counter((@direct_move_cnt/back_count).round) when S_ST_JUMP back_count = @bt_data.magic_back_count(@battler.current_action.skill_id) draw_magic_back_graphic if frame_counter((@direct_move_cnt/back_count).round) end when MT_CVR2 case @bt_data.at_back_pattern when AT_STRAIGHT draw_back_graphic if frame_counter((@direct_move_cnt/@bt_data.back_count).round) when AT_JUMP draw_back_graphic if frame_counter((@direct_move_cnt/@bt_data.back_count).round) jump_plus = jump_back_y jump_plus = @bt_data.jump if jump_plus > @bt_data.jump else draw_back_graphic if frame_counter((@direct_move_cnt/@bt_data.back_count).round) end end return jump_plus end #-------------------------------------------------------------------------- # ● 近接攻撃実行 [移動動作(帰り)] #-------------------------------------------------------------------------- def direct_back jump_plus = direct_back_jump # 現在の位置と目標位置から次の移動位置を割り出す pos_x = @battler.screen_x - self.x pos_y = @battler.screen_y - self.y if @direct_attack_cnt != 0 @battler_x_plus += pos_x / @direct_attack_cnt @battler_y_plus += pos_y / @direct_attack_cnt - jump_plus end # 終了カウント @direct_attack_cnt -= 1 # 最終移動 if @direct_attack_cnt <= 0 @battler_x_plus = 0 @battler_y_plus = 0 # NEXTフェーズ @direct_attack_phase += 1 end end #-------------------------------------------------------------------------- # ● 近接攻撃実行 [動作終了] #-------------------------------------------------------------------------- def direct_end init_direct_attack @battler.mt_mode = MT_STAY # ENDフェーズ @direct_attack_phase = 0 end end