#============================================================================== # ■ XP-RGSS-72 リッチアクターコマンド [Ver.1.0.0] by Claimh #------------------------------------------------------------------------------ #・戦闘時のコマンド表示方法を変更します。 #・戦闘コマンドごとにアイコン表示がつきます # - 攻撃 :装備武器のアイコン + 設定にある攻撃アイコン を描画する # - スキル・防御・アイテム :設定にあるアイコンのみ描画する #・アクター個別のコマンド名を使うことができます #------------------------------------------------------------------------------ #【再定義】 Scene_Battle#main #============================================================================== module RICH_ACTCMD #-------------------------------------------------------------------------- # ● ファイル定義 #-------------------------------------------------------------------------- # Icon(Graphics/Icons) # ※nilにするとアイコン無し ATTACK = "MI_attack.png" # 攻撃のアイコン SKILL = "MI_skill.png" # スキルのアイコン DEFFENCE = "MI_guard.png" # 防御のアイコン ITEM = "MI_item.png" # アイテムのアイコン HAND = "hand.png" # 武器なし(素手)のアイコン # TEXT背景色 BACK = Color.new(0,0,0,128) #-------------------------------------------------------------------------- # ● 個別コマンド設定 #-------------------------------------------------------------------------- # 個別コマンド名を使用する USE_ACT_CMD = true # アクター別のコマンド名 ACT_CMD_T = [] # ここは変更禁止 # ACT_CMD_T[アクターID] = [攻撃, スキル, 防御, アイテム] # ※nilを入れるとシステム用語と同じ名称になります ACT_CMD_T[1] = ["斬撃", "剣技", nil, nil] ACT_CMD_T[2] = ["突撃", "槍技", nil, nil] ACT_CMD_T[3] = [ nil, "精霊魔法", nil, nil] ACT_CMD_T[4] = ["なぐる", "暗黒魔法", nil, nil] # アクター別のコマンド用アイコン ACT_CMD_I = [] # ここは変更禁止 # ACT_CMD_I[アクターID] = [攻撃, スキル, 防御, アイテム] # ※nilを入れるとファイル定義の設定と同じファイルになります ACT_CMD_I[1] = [nil, nil, nil, nil] ACT_CMD_I[2] = [nil, nil, nil, nil] ACT_CMD_I[3] = [nil, "MI_magic", nil, nil] ACT_CMD_I[4] = [nil, "MI_magic", nil, nil] #-------------------------------------------------------------------------- # ● その他 #-------------------------------------------------------------------------- # 基準Y座標 Y = 220 # TEXT背景の描画幅W、高さH W = 140 H = 32 # 横幅のモーション速さ [ 高速移動時、低速移動時 ] W_F = [40, 10] # 縦移動のモーション速さ[ 高速移動時、低速移動時 ] M_F = [40, 10] # 選択外コマンドの不透明度 OP = 100 =begin 「高速移動」と「低速移動」はコマンド切替時の動作のことです。 - 高速移動 : 次に選択する項目のモーション - 低速移動 : 前回選択した項目のモーション =end end #============================================================================== # ■ WindowBattleActorCmd #------------------------------------------------------------------------------ # バトル画面で、アクターのコマンド一覧を表示するウィンドウ?です。 #============================================================================== class WindowBattleActorCmd include RICH_ACTCMD #-------------------------------------------------------------------------- # ● define #-------------------------------------------------------------------------- M_WAIT = 0 # 停止 M_CUR_UP = 1 # ↑移動 M_CUR_DW = 2 # ↓移動 #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :index attr_accessor :active #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize # text @text = [ $data_system.words.attack, $data_system.words.skill, $data_system.words.guard, $data_system.words.item ] @item_max = @text.size # icon @icon = [ATTACK, SKILL, DEFFENCE, ITEM] # create sprite @cmd_sprite = [] for i in 0...@item_max @cmd_sprite[i] = SpriteCmdIcon.new(@icon[i], @text[i]) end # @base_y = Y self.index = 0 @active = false self.visible = false end #-------------------------------------------------------------------------- # ● オブジェクト開放 #-------------------------------------------------------------------------- def dispose for sprite in @cmd_sprite sprite.dispose end end #-------------------------------------------------------------------------- # ● 表示/非表示 切り替え #-------------------------------------------------------------------------- def visible=(flag) for sprite in @cmd_sprite sprite.visible = flag end end #-------------------------------------------------------------------------- # ● X座標変更 #-------------------------------------------------------------------------- def x=(x) for sprite in @cmd_sprite sprite.set_x(x+8) end end #-------------------------------------------------------------------------- # ● Y座標変更 #-------------------------------------------------------------------------- def y=(y) @base_y = y for i in 0...@item_max @cmd_sprite[i].set_y(y + real_i(i) * H) end end #-------------------------------------------------------------------------- # ● Index変更 #-------------------------------------------------------------------------- def index=(i) @index = (i + 1) % @item_max move(M_CUR_UP) reset end #-------------------------------------------------------------------------- # ● RealIndex #-------------------------------------------------------------------------- def real_i(i) return ((i - @index + @item_max + 1) % @item_max) end #-------------------------------------------------------------------------- # ● アクター設定 #-------------------------------------------------------------------------- def set_actor(actor) attack_icon = actor.weapon_id == 0 ? HAND : $data_weapons[actor.weapon_id].icon_name if USE_ACT_CMD unless ACT_CMD_I[actor.id].nil? for i in 0...@item_max @cmd_sprite[i].bitmap.clear @cmd_sprite[i].draw_icon(attack_icon) if i == 0 icn = ACT_CMD_I[actor.id][i].nil? ? @icon[i] : ACT_CMD_I[actor.id][i] @cmd_sprite[i].draw_icon(icn) end else draw_attack_icon(attack_icon) end cmds = ACT_CMD_T[actor.id].nil? ? @text : ACT_CMD_T[actor.id] for i in 0...@item_max txt = cmds[i].nil? ? @text[i] : cmds[i] @cmd_sprite[i].draw_text(txt) end else draw_attack_icon(attack_icon) end end # 個別を使わなかった時用のメソッド def draw_attack_icon(attack_icon) @cmd_sprite[0].bitmap.clear @cmd_sprite[0].draw_icon(attack_icon) @cmd_sprite[0].draw_icon(ATTACK) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update return unless @active # 方向ボタンの下が押された場合 if Input.repeat?(Input::DOWN) $game_system.se_play($data_system.cursor_se) move(M_CUR_DW) end # 方向ボタンの上が押された場合 if Input.repeat?(Input::UP) $game_system.se_play($data_system.cursor_se) move(M_CUR_UP) end update_motion end #-------------------------------------------------------------------------- # ● モーション設定 #-------------------------------------------------------------------------- def move(mode) case mode when M_CUR_UP @index = (@index - 1 + @item_max) % @item_max fast_index = (@index - 1 + @item_max) % @item_max when M_CUR_DW fast_index = (@index - 1 + @item_max) % @item_max @index = (@index + 1) % @item_max else; return end @mode = mode for i in 0...@item_max @cmd_sprite[i].target(@base_y + real_i(i) * H, i == @index, i == fast_index) end end #-------------------------------------------------------------------------- # ● モーション動作 #-------------------------------------------------------------------------- def update_motion return if @mode == M_WAIT moving = false for sprite in @cmd_sprite moving |= sprite.update end @mode = M_WAIT unless moving end #-------------------------------------------------------------------------- # ● モーションリセット #-------------------------------------------------------------------------- def reset for sprite in @cmd_sprite sprite.reset end @mode = M_WAIT end end class SpriteCmdIcon < Sprite OPLUS = 25 include RICH_ACTCMD #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(icon, text) super(nil) self.bitmap = Bitmap.new(28, H) @view = Viewport.new(20, Y, W, H) @t_sprite = Sprite.new(@view) @t_sprite.bitmap = Bitmap.new(W, H) self.z = 1001 @t_sprite.viewport.z = 1000 # draw_icon(icon) draw_text(text) end #-------------------------------------------------------------------------- # ● オブジェクト開放 #-------------------------------------------------------------------------- def dispose self.bitmap.dispose super @t_sprite.bitmap.dispose @t_sprite.dispose @view.dispose end #-------------------------------------------------------------------------- # ● アイコン描画 #-------------------------------------------------------------------------- def draw_icon(icon) return if icon == nil bit = RPG::Cache.icon(icon) self.bitmap.blt(4, (H-24)/2, bit, Rect.new(0, 0, bit.width, bit.height)) end #-------------------------------------------------------------------------- # ● テキスト描画 #-------------------------------------------------------------------------- def draw_text(text) @t_sprite.bitmap.clear @t_sprite.bitmap.fill_rect(0,0,W,H, RICH_ACTCMD::BACK) @t_sprite.bitmap.draw_text(34, 0, W-34, H, text) end #-------------------------------------------------------------------------- # ● X座標変更 #-------------------------------------------------------------------------- def set_x(x) self.x = x r = @t_sprite.viewport.rect @t_sprite.viewport.rect.set(x, r.y, r.width, r.height) end #-------------------------------------------------------------------------- # ● Y座標変更 #-------------------------------------------------------------------------- def set_y(y) self.y = y r = @t_sprite.viewport.rect @t_sprite.viewport.rect.set(r.x, y, r.width, r.height) end #-------------------------------------------------------------------------- # ● Y座標、幅変更 #-------------------------------------------------------------------------- def change(y, w) self.y = y r = @t_sprite.viewport.rect @t_sprite.viewport.rect.set(r.x, y, w, r.height) end #-------------------------------------------------------------------------- # ● 不透明度変更 #-------------------------------------------------------------------------- def opacity=(o) super(o) @t_sprite.opacity = o end #-------------------------------------------------------------------------- # ● 可視状態変更 #-------------------------------------------------------------------------- def visible=(flag) super(flag) @t_sprite.visible = flag end #-------------------------------------------------------------------------- # ● 座標目標設定 #-------------------------------------------------------------------------- def target(y, enable=true, fast=false) @target_y = y @target_opacity = enable ? 255 : OP @target_w = enable ? W : 32 @m_f = fast ? M_F[0] : M_F[1] @w_f = enable ? W_F[0] : W_F[1] end #-------------------------------------------------------------------------- # ● 座標確定 #-------------------------------------------------------------------------- def reset change(@target_y, @target_w) self.opacity = @target_opacity end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update moving = false if self.y != @target_y or @t_sprite.viewport.rect.width != @target_w y = calc_diff(self.y, @target_y, @m_f) w = calc_diff(@t_sprite.viewport.rect.width, @target_w, @w_f) change(y, w) moving = true end if self.opacity != @target_opacity self.opacity = calc_diff(self.opacity, @target_opacity, OPLUS) moving = true end return moving end #-------------------------------------------------------------------------- # ● 目標との差を計算 #-------------------------------------------------------------------------- def calc_diff(org, target, step) plus = org < target ? step : -step return ( (org - target).abs > step ? (org + plus) : target ) end end #============================================================================== # ■ Scene_Battle (分割定義 1) #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # 戦闘用の各種一時データを初期化 $game_temp.in_battle = true $game_temp.battle_turn = 0 $game_temp.battle_event_flags.clear $game_temp.battle_abort = false $game_temp.battle_main_phase = false $game_temp.battleback_name = $game_map.battleback_name $game_temp.forcing_battler = nil # バトルイベント用インタプリタを初期化 $game_system.battle_interpreter.setup(nil, 0) # トループを準備 @troop_id = $game_temp.battle_troop_id $game_troop.setup(@troop_id) # アクターコマンドウィンドウを作成 @actor_command_window = WindowBattleActorCmd.new =begin s1 = $data_system.words.attack s2 = $data_system.words.skill s3 = $data_system.words.guard s4 = $data_system.words.item @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4]) @actor_command_window.y = 160 @actor_command_window.back_opacity = 160 =end @actor_command_window.active = false @actor_command_window.visible = false # その他のウィンドウを作成 @party_command_window = Window_PartyCommand.new @help_window = Window_Help.new @help_window.back_opacity = 160 @help_window.visible = false @status_window = Window_BattleStatus.new @message_window = Window_Message.new # スプライトセットを作成 @spriteset = Spriteset_Battle.new # ウェイトカウントを初期化 @wait_count = 0 # トランジション実行 if $data_system.battle_transition == "" Graphics.transition(20) else Graphics.transition(40, "Graphics/Transitions/" + $data_system.battle_transition) end # プレバトルフェーズ開始 start_phase1 # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # マップをリフレッシュ $game_map.refresh # トランジション準備 Graphics.freeze # ウィンドウを解放 @actor_command_window.dispose @party_command_window.dispose @help_window.dispose @status_window.dispose @message_window.dispose if @skill_window != nil @skill_window.dispose end if @item_window != nil @item_window.dispose end if @result_window != nil @result_window.dispose end # スプライトセットを解放 @spriteset.dispose # タイトル画面に切り替え中の場合 if $scene.is_a?(Scene_Title) # 画面をフェードアウト Graphics.transition Graphics.freeze end # 戦闘テストからゲームオーバー画面以外に切り替え中の場合 if $BTEST and not $scene.is_a?(Scene_Gameover) $scene = nil end $game_system.check_cache end #-------------------------------------------------------------------------- # ● アクターコマンドウィンドウのセットアップ #-------------------------------------------------------------------------- alias phase3_setup_command_window_rich phase3_setup_command_window def phase3_setup_command_window @actor_command_window.set_actor(@active_battler) phase3_setup_command_window_rich end end