#============================================================================== # RGSS3_戦闘コマンドカスタム ver1.01 # 2013/12/23公開 # 2014/03/03 STATUS_MODEが無効になっていたのを修正 # C Winter (http://ccwinter.blog.fc2.com/) #============================================================================== module BattleCommand_Custom #-------------------------------------------------------------------------- # ● 設定項目 #-------------------------------------------------------------------------- # 用語 # アクターコマンドウインドウ: 「攻撃、防御、スキル、アイテム」を選択 # パーティコマンドウインドウ: 「戦う、逃げる」を選択 # ステータスウインドウ: 各キャラのHPなどを表示 # アクターコマンドウインドウの表示位置 # 0: ステータスの右に表示(デフォルトと同じ) # 1: ステータスの左に表示(デフォルトのパーティコマンドの位置) # 2: ACTOR_WINDOW_POSで指定した位置に表示 ACTOR_MODE = 0 # ※ACTOR_MODEが2の時のみ # アクターコマンドウインドウの位置指定 [x座標, y座標] ACTOR_WINDOW_POS = [0, 296] # ※ACTOR_MODEが2の時のみ # ウインドウy座標の基準 # 0:「ACTOR_WINDOW_POSのy座標」をウインドウの上端にする # 1:「ACTOR_WINDOW_POSのy座標」をウインドウの下端にする ACTOR_WINDOW_Y_MODE = 1 # ※ACTOR_MODEが2の時のみ # コマンドウインドウの1ページの「縦の行数」の[最小数, 最大数] # 行が「最小数」より少ない場合、余った行は空白 # 行が「最大数」より多い場合、スクロールで表示 ACTOR_ROW = [2, 4] # コマンドウインドウの[横の列数, ウインドウの横幅] # 「横の列数」を nil にすると、横の列数はコマンドの数と同じになる # (列数とコマンドの数が同じ=1行で全コマンドを表示) # ウインドウの横幅はデフォルトでは128 ACTOR_COL = [1, 128] # アクターコマンドに表示するコマンドを指定 # 攻撃は   :attack # スキルは  :skill # 防御は   :guard # アイテムは :item # 逃走は   :escape # 指定した並び順でアクターコマンドに表示する 指定しなかったものは表示されない # アイテムを使わないゲーム、攻撃と防御を無くしてスキルのみ使うゲーム、 # パーティコマンドを無くしてアクターコマンドで逃走するゲーム などが作れる # デフォルト [:attack, :skill, :guard, :item] # 逃走を追加 [:attack, :skill, :guard, :item, :escape] ACTOR_COMMAND_LIST = [:skill, :item] # アクターコマンドの各項目にアイコンを表示するかどうか # true なら表示する false なら表示しない ACTOR_ICON = true # ※ACTOR_ICONが true の時のみ #  スキルのスキルタイプごとのアイコン番号 ACTOR_ICON_SKILL = [490, 117, 16, 16, 16, 16, 16, 16] # ※ACTOR_ICONが true の時のみ # [通常攻撃, 防御, アイテム, 逃走] のアイコン番号 ACTOR_ICON_OTHER = [116, 160, 510, 467] # ※ACTOR_ICONが true の時のみ # true : 通常攻撃のアイコンを「装備している武器」のアイコンにする # false : 通常攻撃のアイコンを ACTOR_ICON_OTHER で設定したアイコンにする #  (ここが true なら # スキルリストの「ID1番のスキル」も「装備している武器」のアイコンにする) ACTOR_ICON_ATTACK_WEAPON = true # パーティコマンド(戦う、逃げる)の形式 # 0: ステータスの左に表示(デフォルトと同じ) # 1: ステータスの右に表示(デフォルトのアクターコマンドの位置) # 2: パーティコマンドウインドウを画面上部 横幅いっぱいに表示 # 3: パーティコマンドを無くす PARTY_MODE = 1 # パーティコマンドの各項目にアイコンを表示するかどうか # true なら表示する false なら表示しない PARTY_ICON = true # ※PARTY_ICON が true の時のみ # 各項目のアイコン番号(パーティコマンドの数だけ設定) PARTY_ICON_LIST = [597, 598, 599, 599] # ステータスウインドウの横幅 # 0: デフォルトと同じ横幅 # 1: 画面サイズと同じ横幅(ゲージの長さなどもそれに合わせて表示されます) STATUS_MODE = 0 STATUS_X = [128, 128, 128] # 画面下部の「パーティコマンドとステータスとアクターコマンド のセット」の位置 # # それぞれ[パーティコマンド選択中, アクターコマンド選択中, ターン中]の位置指定 # 設定値は # 0:右側に移動 アクターコマンドは右の画面外に押し出される # 64:中央に移動 ターン中 # 128:左側に移動 パーティコマンドは左の画面外に押し出される # (ACTOR_MDOEやPARTY_MODEが2以上だと、 #  そのウインドウはずっと定位置にあるのでステータスと一緒に動くことはない) # 設定例 # ACTOR_MODEが0、PARTY_MODEが0   の時は[0, 128, 64] # ACTOR_MODEが0、PARTY_MODEが2以上 の時は[64, 128, 64]や[128, 128, 128] # ACTOR_MODEが2、PARTY_MODEが0   の時は[0, 64, 64] や[0, 128, 128] # ACTOR_MODEが2、PARTY_MODEが2以上 の時は[64, 64, 64] や[128, 128, 128] # STATUS_MODEが1 の時は[128, 128, 128] =begin XPスタイルバトル使用時 ACTOR_MODE ACTOR_WINDOW_POS ACTOR_WINDOW_Y_MODE は無効 アクターコマンドの座標は、XPスタイルバトル側の設定で決まる STATUS_MODE STATUS_X は無効 =end end #============================================================================== # ■ BattleCommand_Custom #============================================================================== module BattleCommand_Custom def self.xp_style? return ($lnx_include != nil and $lnx_include[:lnx11a] != nil) end def self.no_xp_style? return !(self.xp_style?) end def self.default_under_viewport? return false if self.xp_style? return true end def self.default_actor_command_window? return false if self.xp_style? return false if ACTOR_MODE == 2 return true end def self.wide_party_window? return true if self.xp_style? return true if PARTY_MODE == 2 return false end end $cwinter_script_battle_command_custom = true #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 情報表示ビューポートの更新 #-------------------------------------------------------------------------- def update_info_viewport if BattleCommand_Custom.default_under_viewport? move_info_viewport(BattleCommand_Custom::STATUS_X[0]) if @party_command_window.active move_info_viewport(BattleCommand_Custom::STATUS_X[1]) if @actor_command_window.active move_info_viewport(BattleCommand_Custom::STATUS_X[2]) if BattleManager.in_turn? end if sideview_actor_pos_command? @actor_command_window.set_position end end def sideview_actor_pos_command? return false end #-------------------------------------------------------------------------- # ● 全ウィンドウの作成 #-------------------------------------------------------------------------- alias :battle_command_custom_create_all_windows :create_all_windows def create_all_windows battle_command_custom_create_all_windows default_create_all_windows if BattleCommand_Custom.no_xp_style? xp_style_create_all_windows if BattleCommand_Custom.xp_style? end def default_create_all_windows # アクターコマンドの位置を変えると # ウインドウリフォーム使用時にスキルウインドウ等と重なって変なことになる # のを防止するためz座標を変更 @actor_command_window.z = 5 @actor_command_window.viewport = nil if BattleCommand_Custom::ACTOR_MODE >= 2 @party_command_window.viewport = nil if BattleCommand_Custom::PARTY_MODE >= 2 @actor_command_window.x = 0 if BattleCommand_Custom::ACTOR_MODE == 1 @party_command_window.x = Graphics.width if BattleCommand_Custom::PARTY_MODE == 1 @actor_command_window.set_handler(:escape, method(:command_escape)) if BattleCommand_Custom::PARTY_MODE == 3 @info_viewport.ox = BattleCommand_Custom::STATUS_X[1] else @info_viewport.ox = BattleCommand_Custom::STATUS_X[0] end end def xp_style_create_all_windows @actor_command_window.set_handler(:escape, method(:command_escape)) end end #============================================================================== # ■ Window_ActorCommand #============================================================================== class Window_ActorCommand < Window_Command #-------------------------------------------------------------------------- # ● 桁数の取得 #-------------------------------------------------------------------------- def col_max if BattleCommand_Custom::ACTOR_COL[0] == nil return @list.size == 0 ? 1 : @list.size else return BattleCommand_Custom::ACTOR_COL[0] end end #-------------------------------------------------------------------------- # ● カーソルを下に移動 #-------------------------------------------------------------------------- def cursor_down(wrap = false) return if item_max <= 1 return if (item_max - 1) / col_max <= 0 if wrap || (index / col_max != (item_max - 1) / col_max) i = index + col_max if i >= item_max if index / col_max == (item_max - 1) / col_max i = index % col_max else i = item_max - 1 end end select(i) end end #-------------------------------------------------------------------------- # ● カーソルを上に移動 #-------------------------------------------------------------------------- def cursor_up(wrap = false) return if item_max <= 1 return if (item_max - 1) / col_max <= 0 if wrap || (index / col_max != 0) i = index - col_max if i < 0 if index % col_max <= (item_max - 1) % col_max i = index + (item_max - 1) / col_max * col_max else i = item_max - 1 end end select(i) end end #-------------------------------------------------------------------------- # ● カーソルを右に移動 #-------------------------------------------------------------------------- def cursor_right(wrap = false) return if item_max <= 1 return if col_max <= 1 if wrap || (index % col_max != (col_max - 1)) i = index + 1 if (i >= item_max) or (index / col_max != i / col_max) i -= col_max i = [i, 0].max end select(i) end end #-------------------------------------------------------------------------- # ● カーソルを左に移動 #-------------------------------------------------------------------------- def cursor_left(wrap = false) return if item_max <= 1 return if col_max <= 1 if wrap || (index % col_max != 0) i = index - 1 if index / col_max != i / col_max if i + col_max < item_max i += col_max end end select(i) end end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def original_window_width return BattleCommand_Custom::ACTOR_COL[1] end def window_width return original_window_width end #-------------------------------------------------------------------------- # ● ウィンドウ高さの取得 #-------------------------------------------------------------------------- def original_window_height if BattleCommand_Custom.default_actor_command_window? return 120 else fitting_height(visible_line_number) end end def window_height return original_window_height end #-------------------------------------------------------------------------- # ● 表示行数の取得 #-------------------------------------------------------------------------- def visible_line_number if (not BattleCommand_Custom.default_actor_command_window?) return custom_visible_line_number else return default_visible_line_number end end def default_visible_line_number return 4 end def custom_visible_line_number n = @list.size / col_max + (@list.size % col_max > 0 ? 1 : 0) n = [BattleCommand_Custom::ACTOR_ROW[0], n].max n = [BattleCommand_Custom::ACTOR_ROW[1], n].min return n end #-------------------------------------------------------------------------- # ● 横に項目が並ぶときの空白の幅を取得 #-------------------------------------------------------------------------- def spacing return 0 end #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- alias :battle_command_custom_setup :setup def setup(actor) battle_command_custom_setup(actor) self.arrows_visible = true end #-------------------------------------------------------------------------- # ● コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list return unless @actor for symbol in BattleCommand_Custom::ACTOR_COMMAND_LIST add_attack_command if symbol == :attack add_skill_commands if symbol == :skill add_guard_command if symbol == :guard add_item_command if symbol == :item add_escape_command if symbol == :escape end set_position if BattleCommand_Custom::ACTOR_MODE >= 2 end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) change_color(normal_color, command_enabled?(index)) par = command_name(index) rect = item_rect_for_text(index) if BattleCommand_Custom::ACTOR_ICON draw_icon(par[1], rect.x, rect.y) rect.x += 24 rect.width -= 24 draw_text(rect, par[0], alignment) else draw_text(rect, par, alignment) end end #-------------------------------------------------------------------------- # ● 高さと座標の更新 #-------------------------------------------------------------------------- def set_position self.height = window_height pos = window_pos if $cwinter_script_actor_command_reform_ex_image l_space = left_space t_space = top_space u_space = under_space else l_space = 0 t_space = 0 u_space = 0 end self.x = pos[0] + l_space if BattleCommand_Custom::ACTOR_WINDOW_Y_MODE == 0 self.y = pos[1] + t_space else self.y = pos[1] - self.height - u_space end end def window_pos return BattleCommand_Custom::ACTOR_WINDOW_POS end #-------------------------------------------------------------------------- # ● [追加]:X 座標をアクターに合わせる #-------------------------------------------------------------------------- def actor_x(actor) if $cwinter_script_actor_command_reform_ex_image l_space = left_space else l_space = 0 end left_width = self.width - l_space right_width = self.width ax = $game_party.members_screen_x_nooffset[actor.index] - left_width / 2 left_pad = LNX11::STATUS_SIDE_PADDING / 2 + l_space right_pad = LNX11::STATUS_SIDE_PADDING / 2 # 画面内に収める self.x = [[ax, left_pad].max, Graphics.width - right_pad - right_width].min self.x += LNX11::ACTOR_COMMAND_OFFSET[:x] end #-------------------------------------------------------------------------- # ● [追加]:Y 座標をアクターに合わせる #-------------------------------------------------------------------------- def actor_y(actor) if $cwinter_script_actor_command_reform_ex_image u_space = under_space else u_space = 0 end self_height = self.height + u_space self.y = actor.screen_y_top - self_height self.y += LNX11::ACTOR_COMMAND_OFFSET[:y] end #-------------------------------------------------------------------------- # ● [追加]:固定 Y 座標 #-------------------------------------------------------------------------- def screen_y if $cwinter_script_actor_command_reform_ex_image u_space = under_space else u_space = 0 end if LNX11::ACTOR_COMMAND_Y_POSITION == 0 self_height = self.height + u_space self.y = Graphics.height - self_height + LNX11::ACTOR_COMMAND_OFFSET[:y] else self.y = LNX11::ACTOR_COMMAND_OFFSET[:y] end end #-------------------------------------------------------------------------- # ● 攻撃コマンドをリストに追加 #-------------------------------------------------------------------------- def add_attack_command if BattleCommand_Custom::ACTOR_ICON if BattleCommand_Custom::ACTOR_ICON_ATTACK_WEAPON and @actor.weapons[0] icon = @actor.weapons[0].icon_index else icon = BattleCommand_Custom::ACTOR_ICON_OTHER[0] end par = [Vocab::attack, icon] else par = Vocab::attack end add_command(par, :attack, @actor.attack_usable?) end #-------------------------------------------------------------------------- # ● スキルコマンドをリストに追加 #-------------------------------------------------------------------------- def add_skill_commands @actor.added_skill_types.sort.each do |stype_id| name = $data_system.skill_types[stype_id] if BattleCommand_Custom::ACTOR_ICON par = [name, BattleCommand_Custom::ACTOR_ICON_SKILL[stype_id - 1]] else par = name end add_command(par, :skill, true, stype_id) end end #-------------------------------------------------------------------------- # ● 防御コマンドをリストに追加 #-------------------------------------------------------------------------- def add_guard_command if BattleCommand_Custom::ACTOR_ICON par = [Vocab::guard, BattleCommand_Custom::ACTOR_ICON_OTHER[1]] else par = Vocab::guard end add_command(par, :guard, @actor.guard_usable?) end #-------------------------------------------------------------------------- # ● アイテムコマンドをリストに追加 #-------------------------------------------------------------------------- def add_item_command if BattleCommand_Custom::ACTOR_ICON par = [Vocab::item, BattleCommand_Custom::ACTOR_ICON_OTHER[2]] else par = Vocab::item end add_command(par, :item) end #-------------------------------------------------------------------------- # ● 逃走コマンドをリストに追加 #-------------------------------------------------------------------------- def add_escape_command if BattleCommand_Custom::ACTOR_ICON par = [Vocab::escape, BattleCommand_Custom::ACTOR_ICON_OTHER[3]] else par = Vocab::escape end add_command(par, :escape, BattleManager.can_escape?) end end #============================================================================== # ■ Window_SkillList #============================================================================== class Window_SkillList < Window_Selectable #-------------------------------------------------------------------------- # ● アイテム名の描画 #-------------------------------------------------------------------------- def draw_item_name(item, x, y, enabled = true, width = 172) return unless item if item.id == 1 and BattleCommand_Custom::ACTOR_ICON_ATTACK_WEAPON and @actor.weapons[0] icon = @actor.weapons[0].icon_index else icon = item.icon_index end draw_icon(icon, x, y, enabled) change_color(normal_color, enabled) draw_text(x + 24, y, width, line_height, item.name) end end #============================================================================== # ■ Window_PartyCommand #============================================================================== class Window_PartyCommand < Window_Command #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect_for_text(index) enable = command_enabled?(index) if BattleCommand_Custom::PARTY_ICON x = rect.x y = rect.y draw_icon(BattleCommand_Custom::PARTY_ICON_LIST[index], x, y, enable) rect.x += 24 end change_color(normal_color, enable) draw_text(rect, command_name(index), alignment) end end if BattleCommand_Custom.wide_party_window? #============================================================================== # ■ Window_PartyCommand #============================================================================== class Window_PartyCommand < Window_Command #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width return Graphics.width end #-------------------------------------------------------------------------- # ● 表示行数の取得 #-------------------------------------------------------------------------- def visible_line_number return 1 end #-------------------------------------------------------------------------- # ● 桁数の取得 #-------------------------------------------------------------------------- def col_max return @list.size end #-------------------------------------------------------------------------- # ● アライメントの取得 #-------------------------------------------------------------------------- def alignment return 1 end #-------------------------------------------------------------------------- # ● 横に項目が並ぶときの空白の幅を取得 #-------------------------------------------------------------------------- def spacing return 16 end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect_for_text(index) enable = command_enabled?(index) if BattleCommand_Custom::PARTY_ICON t_rect = self.contents.text_size(command_name(index)) x = rect.x + (rect.width / 2 - t_rect.width / 2) - 25 y = rect.y draw_icon(BattleCommand_Custom::PARTY_ICON_LIST[index], x, y, enable) end rect = item_rect_for_text(index) change_color(normal_color, enable) draw_text(rect, command_name(index), alignment) end end end if BattleCommand_Custom::PARTY_MODE == 3 #============================================================================== # ■ Window_PartyCommand #============================================================================== class Window_PartyCommand < Window_Command #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- def setup call_handler(:fight) end end end if BattleCommand_Custom.no_xp_style? and BattleCommand_Custom::STATUS_MODE == 1 #============================================================================== # ■ Window_BattleStatus #============================================================================== class Window_BattleStatus < Window_Selectable #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width end #-------------------------------------------------------------------------- # ● ゲージエリアの幅を取得 #-------------------------------------------------------------------------- def gauge_area_width return 348 end #-------------------------------------------------------------------------- # ● ゲージエリアの描画(TP あり) #-------------------------------------------------------------------------- def draw_gauge_area_with_tp(rect, actor) draw_actor_hp(actor, rect.x + 128 - 60 + 0, rect.y, 72 + 20) draw_actor_mp(actor, rect.x + 128 - 40 + 82, rect.y, 64 + 20) draw_actor_tp(actor, rect.x + 128 - 20 + 156, rect.y, 64 + 20) end #-------------------------------------------------------------------------- # ● ゲージエリアの描画(TP なし) #-------------------------------------------------------------------------- def draw_gauge_area_without_tp(rect, actor) draw_actor_hp(actor, rect.x + 128 - 60 + 0, rect.y, 134 + 30) draw_actor_mp(actor, rect.x + 128 - 30 + 144, rect.y, 76 + 30) end end #============================================================================== # ■ Window_BattleActor #============================================================================== class Window_BattleActor < Window_BattleStatus #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width - 128 end #-------------------------------------------------------------------------- # ● ゲージエリアの幅を取得 #-------------------------------------------------------------------------- def gauge_area_width return 220 end #-------------------------------------------------------------------------- # ● ゲージエリアの描画(TP あり) #-------------------------------------------------------------------------- def draw_gauge_area_with_tp(rect, actor) draw_actor_hp(actor, rect.x + 0, rect.y, 72) draw_actor_mp(actor, rect.x + 82, rect.y, 64) draw_actor_tp(actor, rect.x + 156, rect.y, 64) end #-------------------------------------------------------------------------- # ● ゲージエリアの描画(TP なし) #-------------------------------------------------------------------------- def draw_gauge_area_without_tp(rect, actor) draw_actor_hp(actor, rect.x + 0, rect.y, 134) draw_actor_mp(actor, rect.x + 144, rect.y, 76) end end end