#============================================================================== # + 사이드 뷰 배틀 (보행 그래픽 버전) ver. 1.14 + #  Script by パラ犬 #  http://2d6.parasite.jp/ #------------------------------------------------------------------------------ # バトルフィールドに歩行グラフィックを表示します。 #============================================================================== module SDVA X_LINE = 500 # 横位置のバトラー表示座標 Y_LINE = 150 # 縦位置のバトラー表示座標 X_SPACE = 15 # 横位置のバトラー同士の間隔 Y_SPACE = 40 # 縦位置のバトラー同士の間隔 X_POSITION = 25 # 隊列[前衛・中衛・後衛]の横間隔 Y_POSITION = 0 # 隊列[前衛・中衛・後衛]の縦間隔 ATTACK_MOVE = true # 攻撃時に前へ踏み出すか( true / false ) SKILL_MOVE = true # スキル使用時に前へ踏み出すか( true / false ) ITEM_MOVE = false # アイテム使用時に前へ踏み出すか( true / false ) MOVE_STEP = 1 # 移動歩数 MOVE_PIXEL = 10 # 一歩あたりのピクセル数 PARTY_POS = 1 # キャラクターの向き( 0:下 / 1:左 / 2:右 / 3:上 ) WINDOWPOS_CHANGE = true # コマンドウインドウをバトラーの横に表示するか( true / false ) end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # * Get Battle Screen Z-Coordinate #-------------------------------------------------------------------------- def screen_z # Return after calculating z-coordinate by order of members in party if self.index != nil return 4 - self.index else return 0 end end #-------------------------------------------------------------------------- # ● バトル画面 X 座標の取得 #-------------------------------------------------------------------------- def screen_x if self.index != nil # 隊列を取得 pos = $data_classes[self.class_id].position x_pos = pos * SDVA::X_POSITION scr_x = self.index * SDVA::X_SPACE + SDVA::X_LINE + x_pos # 移動アクションのとき if self.current_action.move_action == true # 横に移動 scr_x += @shift_x end return scr_x else return 0 end end #-------------------------------------------------------------------------- # ● バトル画面 Y 座標の取得 #-------------------------------------------------------------------------- def screen_y if self.index != nil # 隊列を取得 pos = $data_classes[self.class_id].position y_pos = pos * SDVA::Y_POSITION scr_y = self.index * SDVA::Y_SPACE + SDVA::Y_LINE + y_pos # 移動アクションのとき if self.current_action.move_action == true # 縦に移動 scr_y += @shift_y end return scr_y else return 0 end end #-------------------------------------------------------------------------- # ● バトル画面 Z 座標の取得 #-------------------------------------------------------------------------- def screen_z if self.index != nil return self.index else return 0 end end #-------------------------------------------------------------------------- # * Get Battle Screen X-Coordinate #-------------------------------------------------------------------------- def screen_x2 # Return after calculating x-coordinate by order of members in party if self.index != nil return self.index * 160 + 80 else return 0 end end #-------------------------------------------------------------------------- # * Get Battle Screen Y-Coordinate #-------------------------------------------------------------------------- def screen_y2 return 464 end end #============================================================================== # ■ Game_Battler (分割定義 1) #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :pattern # 歩行パターン attr_reader :trans_x # X方向の移動距離 attr_reader :moving # 移動中フラグ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_sdva initialize def initialize initialize_sdva move_reset end #-------------------------------------------------------------------------- # ○ 移動カウント #-------------------------------------------------------------------------- def move @moving = 1 if @step < SDVA::MOVE_STEP # 歩数を満たすまで移動 @pattern = (@pattern + 1) % 4 @step += 1 move_step else # 移動終了 @pattern = 1 @moving = 2 end end #-------------------------------------------------------------------------- # ○ 移動処理 #-------------------------------------------------------------------------- def move_step # パーティの向きによって移動座標を変える case SDVA::PARTY_POS when 0 @shift_y = @step * SDVA::MOVE_PIXEL when 1 @shift_x = -(@step * SDVA::MOVE_PIXEL) when 2 @shift_x = @step * SDVA::MOVE_PIXEL when 3 @shift_y = -(@step * SDVA::MOVE_PIXEL) end end #-------------------------------------------------------------------------- # ○ 移動のリセット #-------------------------------------------------------------------------- def move_reset @moving = 0 @pattern = 0 @step = 0 @shift_x = 0 @shift_y = 0 end end #============================================================================== # ■ Game_BattleAction #============================================================================== class Game_BattleAction #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :move_action # 移動するアクションか #-------------------------------------------------------------------------- # ● クリア #-------------------------------------------------------------------------- alias clear_sdva clear def clear clear_sdva @move_action = false end end #============================================================================== # ■ Sprite_Battler #============================================================================== class Sprite_Battler < RPG::Sprite #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_accessor :battler # battler #-------------------------------------------------------------------------- # * Object Initialization # viewport : viewport # battler : battler (Game_Battler) #-------------------------------------------------------------------------- def initialize(viewport, battler = nil) super(viewport) @battler = battler @battler_visible = false @_sprite_battler = RPG::Sprite.new end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_sdva update def update update2 if @battler.is_a?(Game_Actor) # バトラーがアクターに含まれるとき if @battler.is_a?(Game_Actor) # ファイル名か色相が現在のものと異なる場合 # 行動中の場合 if @battler.battler_name != @battler_name or @battler.battler_hue != @battler_hue or @battler.current_action.basic == 0 or @battler.current_action.kind != 3 # ビットマップを取得、設定 @character_name = @battler.character_name @character_hue = @battler.character_hue # 歩行グラフィックを描画 self.bitmap = RPG::Cache.character(@character_name, @character_hue) cw = self.bitmap.width / 4 ch = self.bitmap.height / 4 @width = cw @height = ch if @battler.current_action.move_action == true # 歩かせる @battler.move else @battler.move_reset end # 転送元の矩形を設定 sx = @battler.pattern * cw sy = SDVA::PARTY_POS * ch self.src_rect.set(sx, sy, cw, ch) self.ox = @width / 2 self.oy = @height # 隠れ状態なら不透明度を 0 にする if @battler.hidden self.opacity = 0 end end end update_sdva end def update2 # If battler is nil if @battler == nil @_sprite_battler.bitmap = nil loop_animation(nil) return end # If file name or hue are different than current ones if @battler.battler_name != @battler_name or @battler.battler_hue != @battler_hue # Get and set bitmap @battler_name = @battler.battler_name @battler_hue = @battler.battler_hue @_sprite_battler.bitmap = RPG::Cache.battler(@battler_name, @battler_hue) @width2 = @_sprite_battler.bitmap.width @height2 = @_sprite_battler.bitmap.height @_sprite_battler.ox = @width2 / 2 @_sprite_battler.oy = @height2 # Change opacity level to 0 when dead or hidden if @battler.dead? or @battler.hidden @_sprite_battler.opacity = 0 end end # If animation ID is different than current one if @battler.damage == nil and @battler.state_animation_id != @state_animation_id @state_animation_id = @battler.state_animation_id loop_animation($data_animations[@state_animation_id]) end # If actor which should be displayed if @battler.is_a?(Game_Actor) and @battler_visible # Bring opacity level down a bit when not in main phase if $game_temp.battle_main_phase @_sprite_battler.opacity += 3 if @_sprite_battler.opacity < 255 else @_sprite_battler.opacity -= 3 if @_sprite_battler.opacity > 207 end end # Blink if @battler.blink blink_on else blink_off end # If invisible unless @battler_visible # Appear if not @battler.hidden and not @battler.dead? and (@battler.damage == nil or @battler.damage_pop) appear @battler_visible = true end end # If visible if @battler_visible # Escape if @battler.hidden $game_system.se_play($data_system.escape_se) escape @battler_visible = false end # White flash if @battler.white_flash whiten @battler.white_flash = false end # Animation if @battler.animation_id != 0 animation = $data_animations[@battler.animation_id] animation(animation, @battler.animation_hit) @battler.animation_id = 0 end # Damage if @battler.damage_pop damage(@battler.damage, @battler.critical) @battler.damage = nil @battler.critical = false @battler.damage_pop = false end # Collapse if @battler.damage == nil and @battler.dead? if @battler.is_a?(Game_Enemy) $game_system.se_play($data_system.enemy_collapse_se) else $game_system.se_play($data_system.actor_collapse_se) end collapse @battler_visible = false end end # Set sprite coordinates @_sprite_battler.x = @battler.screen_x2 @_sprite_battler.y = @battler.screen_y2 @_sprite_battler.z = @battler.screen_z end #-------------------------------------------------------------------------- # * Dispose #-------------------------------------------------------------------------- def dispose if self.bitmap != nil self.bitmap.dispose end @_sprite_battler.dispose super end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● アクターコマンドウィンドウのセットアップ #-------------------------------------------------------------------------- alias phase3_setup_command_window_sdva phase3_setup_command_window def phase3_setup_command_window phase3_setup_command_window_sdva if SDVA::WINDOWPOS_CHANGE # アクターコマンドウィンドウの位置を設定 case SDVA::PARTY_POS when 0 x_pos = @active_battler.screen_x - (@actor_command_window.width/2) y_pos = @active_battler.screen_y when 1 x_pos = @active_battler.screen_x - @actor_command_window.width - 16 y_pos = @active_battler.screen_y - @actor_command_window.height when 2 x_pos = @active_battler.screen_x + 16 y_pos = @active_battler.screen_y - @actor_command_window.height when 3 x_pos = @active_battler.screen_x - (@actor_command_window.width/2) y_pos = @active_battler.screen_y - @actor_command_window.height - 48 end @actor_command_window.x = x_pos >= 0 ? x_pos : 0 @actor_command_window.x = x_pos+@actor_command_window.width <= 640 ? x_pos : 640-@actor_command_window.width @actor_command_window.y = y_pos >= 0 ? y_pos : 0 @actor_command_window.y = y_pos+@actor_command_window.height <= 480 ? y_pos : 480-@actor_command_window.height # ステータスウインドウに隠れないように @actor_command_window.z = 9999 end end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション) #-------------------------------------------------------------------------- alias update_phase4_step3_sdva update_phase4_step3 def update_phase4_step3 if SDVA::ATTACK_MOVE if @active_battler.current_action.basic == 0 @active_battler.current_action.move_action = true end end if SDVA::SKILL_MOVE if @active_battler.current_action.kind == 1 @active_battler.current_action.move_action = true end end if SDVA::ITEM_MOVE if @active_battler.current_action.kind == 2 @active_battler.current_action.move_action = true end end # バトラーがアクターに含まれ、移動アクション中 if @active_battler.is_a?(Game_Actor) and @active_battler.current_action.move_action # 移動終了時 if @active_battler.moving == 2 update_phase4_step3_sdva end elsif @active_battler.moving == 0 update_phase4_step3_sdva end end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ) #-------------------------------------------------------------------------- alias update_phase4_step6_sdva update_phase4_step6 def update_phase4_step6 @active_battler.current_action.move_action = false @active_battler.move_reset update_phase4_step6_sdva end end #============================================================================== # ■ Spriteset_Battle #============================================================================== class Spriteset_Battle #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_sdva initialize def initialize initialize_sdva #@viewport2.z = 1 end end #============================================================================== # ■ Arrow_Actor #============================================================================== class Arrow_Actor < Arrow_Base #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_sdva update def update update_sdva # カーソル下 if Input.repeat?(Input::DOWN) $game_system.se_play($data_system.cursor_se) @index += 1 @index %= $game_party.actors.size end # カーソル上 if Input.repeat?(Input::UP) $game_system.se_play($data_system.cursor_se) @index += $game_party.actors.size - 1 @index %= $game_party.actors.size end end end #============================================================================== # ■ Arrow_Enemy #============================================================================== class Arrow_Enemy < Arrow_Base #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_sdva update def update update_sdva # カーソル下 if Input.repeat?(Input::DOWN) $game_system.se_play($data_system.cursor_se) $game_troop.enemies.size.times do @index += 1 @index %= $game_troop.enemies.size break if self.enemy.exist? end end # カーソル上 if Input.repeat?(Input::UP) $game_system.se_play($data_system.cursor_se) $game_troop.enemies.size.times do @index += $game_troop.enemies.size - 1 @index %= $game_troop.enemies.size break if self.enemy.exist? end end end end