设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
Project1 查看内容

即时制横版CTB战斗系统

2006-6-26 00:00| 发布者: 柳柳| 查看: 18866| 评论: 0|原作者: パラ犬

摘要:    作者 パラ犬  版本与更新  2006年5月  相关网址 http://para.j-mx.com/rgss/script/ctb.html  范例工程 ★ 点此下载 ★ 脚本功能  实现横版的即时战斗和血槽
 

 作者

パラ犬

 版本与更新

 2006年5月

 相关网址

http://para.j-mx.com/rgss/script/ctb.html

 范例工程

★ 点此下载 ★



脚本功能

 实现横版的即时战斗和血槽显示,并且附带显示敌人列表,有很多拓展功能

使用方法

 复制全部脚本内容,在Main脚本之前按insert,插入此脚本全部内容。此脚本有附加功能,请参考翻译内容

相关截图


 

 脚本内容

#==============================================================================
# ++ 积极时间战斗 ver. 2.56 ++
#  Script by 帕拉狗(パラ犬)
#  
#     http://para.j-mx.com/
#
###############################################################################
#     *********             翻译+强化+改进:       ***********                 #
#                             忧郁的涟漪                                      #
#                                                                             #
#在日站上找到的脚本,本来打算全文翻译...不过日文能力有限...放弃了..残念....    #
#==============================================================================

module PARA_CTB
 
  # 当一人CP槽填满的时候,CP是否不累积(默认为false,如果希望一个CP满了后其他人CP
  # 槽进行暂时的等待,改成true)
  COMMAND_WAIT = false
  # 是否等待攻击结束以后才可以行动?默认是不等待(true)
  SELECT_WAIT = true
  # 在演示攻击动画的时候是否停止CP槽的累加,默认的false不停止
  ANIMATION_WAIT = false
 
  # CP槽的填充速度(数字越大填充越快,调到999的话....就光攻击吧,连等都不用等.)
  BATTLE_SPEED = 4

  # 队员人数,多了显示的多,适合很多有多人参加战斗的游戏~
  PARTY_SIZE = 4
 
  # 各项活动时减少的CT值(100为全部)
  ACT_ATTACK_CT = 100   # 攻击时候消耗的CT值
  ACT_GUARD_CT = 100    # 防御
  ACT_ESCAPE_CT = 100   # 逃走失败
  ACT_SKILL_CT = 100    # 使用特技
  ACT_ITEM_CT = 100     # 使用物品
 
  # 逃跑失败的时候显示的字样
  UNESCAPE_MES = "逃跑失败"

  # 当CT槽满了的时候发出的效果音
  FULL_CT_SE = "015-Jump01"
  # 効果音的响度
  FULL_CT_SE_VOL = 80

  # CT槽填满的时候人物发生的颜色变化(括号里对应红,绿,蓝)
  FULL_CT_COLOR = Tone.new(120,0,0)
 
 
  # 各种槽的渐变颜色
  # HP槽左边的颜色
  HP_COLOR_LEFT = Color.new(128, 0, 0, 255)
  # HP槽右边的颜色
  HP_COLOR_RIGHT= Color.new(255, 0, 0, 255)
  # SP槽左边的颜色
  SP_COLOR_LEFT = Color.new(0, 0, 128, 255)
  # SP槽右边的颜色
  SP_COLOR_RIGHT= Color.new(0, 0, 255, 255)
  # CT槽左边的颜色
  COLOR_LEFT = Color.new(128, 128, 64, 255)
  # CT槽右边的颜色
  COLOR_RIGHT= Color.new(255, 255, 128, 255)
  # CT槽集满时候的颜色
  COLOR_FULL = Color.new(255, 225, 128, 255)
 
  # 各种条边框的颜色
  FRAME_COLOR = Color.new(192, 192, 192, 255)
  # 表范围的粗
  FRAME_BORDER = 1
  # 各种条边框的底色
  BACK_COLOR = Color.new(128, 128, 128, 128)

  # 角色名称的字号(数字越大字越大)
  NAME_FONT_SIZE = 16
  # HP/SP的字号
  HPSP_FONT_SIZE = 18
  # 敌人名称的字号
  ENEMY_FONT_SIZE = 16
  # 是否显示对大HP/MP( 显示true / 不显示false )
  MAX_DRAW = false

  # 是否进行敌人缩写(例如有5个幽灵的时候不分别显示5个幽灵的名字而是只显示一个)
  # 例子:原本显示为:
  #      幽灵
  #      幽灵
  # 改了以后显示为:
  #      幽灵 2
  ENEMY_GROUPING = false

  # 在敌人窗口中显示的东西( 0:只显示名字 / 1:显示HP / 2:显示CT )
  ENEMY_DRAWING_MATER = 0
 
  # actor的帮助窗口表示HP/SP量规( true / false )
  HELP_DRAWING_MATER_ACTOR = true
  # 是否在选择攻击对象的时候显示敌人的HP/MP和状态(默认为显示(true))
  HELP_DRAWING_MATER_ENEMY = false
 
  # 是否在一个地方强制显示攻击对话框(攻击框就显示在一个地方,默认为true(是))
  WINDOWPOS_CHANGE = true
  WINDOWPOS_X = 100   # X坐标
  WINDOWPOS_Y = 320   # Y坐标

  # 战斗窗口的不透明度,数字越高透明度越差
  WINDOW_OPACITY = 120
 
  # CT槽的增长间隔,越小越自然,大了大话..好像是在移动图块...
  CT_SKIP = 2

end


#==============================================================================
# ■ Scene_Battle
#==============================================================================

class Scene_Battle

  #--------------------------------------------------------------------------
  # ○ CT的计算
  #--------------------------------------------------------------------------
  def update_ct
    # 在计算提高被许可的时候
    if @countup
      for actor in $game_party.actors
        # 是否能活动
        if actor.movable? == false and actor.ct_visible and @phase4_step != 5
          # 用看不见状态计算,并且有提高
          actor.ct_visible = false
          actor.countup = true
          actor.full_ct = false
        elsif actor.movable? and actor.ct_visible == false
          # 解除看不见计算提高
          clear_ct(actor)
          actor.ct_visible = true
        end
        # アクターの入れ替えに対応
        if actor.max_ct == 0
          actor.max_ct = @max_ct
        end
        # アクターのカウントアップ
        if actor.countup
          # CTがmaxになっており、コマンド入力待ちアクターに含まれない
          if actor.now_ct >= @max_ct and !(@pre_action_battlers.include?(actor))
            # コマンド入力待ちアクターに追加
            @pre_action_battlers.push(actor)
            @action_count += 1
            # 効果音を鳴らす
            if PARA_CTB::FULL_CT_SE != "" and actor.ct_visible
              Audio.se_play("Audio/SE/" + PARA_CTB::FULL_CT_SE,PARA_CTB::FULL_CT_SE_VOL)
            end
            # それ以上カウントアップしない
            actor.countup = false
            actor.full_ct = true
          else
            # カウントアップ
            actor.make_action_speed
            ct_skip = PARA_CTB::CT_SKIP != 0 ? PARA_CTB::CT_SKIP : 1
            actor.now_ct += actor.current_action.speed * PARA_CTB::BATTLE_SPEED * ct_skip
          end
        end
      end
      for enemy in $game_troop.enemies
        # 行動できるか
        if enemy.movable? == false and enemy.ct_visible and @phase4_step == 5
          # 不可視状態でカウントアップ
          enemy.ct_visible = false
          enemy.countup = true
          enemy.full_ct = false
        elsif enemy.movable? and enemy.ct_visible == false
          # 不可視カウントアップを解除
          clear_ct(enemy)
          enemy.ct_visible = true
        end
        # エネミーのカウントアップ
        if enemy.countup
          # CTがmaxになっており、行動待ちエネミーに含まれない
          if enemy.now_ct >= @max_ct and ! @pre_action_battlers.include?(enemy)
            # 行動待ちエネミーに追加
            @pre_action_battlers.push(enemy)
            @action_count += 1
            # それ以上カウントアップしない
            enemy.countup = false
            enemy.full_ct = true
          else
            # カウントアップ
            enemy.make_action_speed
            enemy.now_ct += enemy.current_action.speed * PARA_CTB::BATTLE_SPEED
          end
        end
      end
      # CTゲージを再描画
      @status_window.refresh_ct
      @status_window2.refresh_ct
    end
  end
  #--------------------------------------------------------------------------
  # ○ バトラーのCTを0に
  #--------------------------------------------------------------------------
  def clear_ct(battler)
    battler.countup = true
    battler.now_ct = 0
    battler.full_ct = false
  end
  #--------------------------------------------------------------------------
  # ○ バトラーのCTを任意のパーセンテージに
  #--------------------------------------------------------------------------
  def declease_ct(battler,percent)
    battler.countup = true
    battler.now_ct = battler.now_ct * percent / 100
    battler.full_ct = false
  end
  #--------------------------------------------------------------------------
  # ○ CTの初期化
  #--------------------------------------------------------------------------
  def initialize_ct
    # CTの基準値を決定
    max_ct
    for battler in $game_party.actors + $game_troop.enemies
      if battler.movable?
        n = $game_party.actors.size + $game_troop.enemies.size
        # 戦闘開始時にある程度のCTを溜めておく
        battler.now_ct = battler.agi * 60 * n
        battler.ct_visible = true
      else
        clear_ct(battler)
        battler.ct_visible = false
      end
      battler.countup = true
      battler.full_ct = false
      battler.max_ct = @max_ct
    end
  end
  #--------------------------------------------------------------------------
  # ○ バトラー全員の素早さからCTの基準値を決定
  #--------------------------------------------------------------------------
  def max_ct
    for battler in $game_party.actors + $game_troop.enemies
      @max_ct += battler.agi
    end
    @max_ct *= 100
  end
  #--------------------------------------------------------------------------
  # ○ バトラーの行動順を変更
  #--------------------------------------------------------------------------
  def shift_activer(shift)
    # 一つシフトする時で後ろのアクターが2人以上
    if @pre_action_battlers != nil
      if shift == 1 and @pre_action_battlers.size >= @actor_array_index + 3
        # 現在のアクターを取得
        act = @pre_action_battlers[@actor_array_index]
        # 現在のアクターを二つ後ろに挿入
        @pre_action_battlers.insert(@actor_array_index+2, act)
        # 現在位置を消去
        @pre_action_battlers.delete_at(@actor_array_index)
        @actor_array_index -= 1
        phase3_next_actor
      else
        act = @pre_action_battlers[@actor_array_index]
        # 現在のアクターを一番後ろに追加
        @pre_action_battlers.push(act)
        # 現在位置を消去
        @pre_action_battlers.delete_at(@actor_array_index)
        @actor_array_index -= 1
        phase3_next_actor
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  alias main_ctb main
  def main
    # エネミー名ウインドウを作成
    @status_window2 = Window_BattleStatus_enemy.new
    @action_battlers = []
    @pre_action_battlers = []
    @max_ct = 0
    @countup = false
    @ct_wait = 0
    @action_count = 0
    main_ctb
    # エネミー名ウインドウを破棄
    @status_window2.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias ctb_update update
  def update
    # バトルイベント実行中の場合
    if $game_system.battle_interpreter.running?
      # インタプリタを更新
      $game_system.battle_interpreter.update
      # アクションを強制されているバトラーが存在しない場合
      if $game_temp.forcing_battler == nil
        # バトルイベントの実行が終わった場合
        unless $game_system.battle_interpreter.running?
          # 戦闘継続の場合、バトルイベントのセットアップを再実行
          unless judge
            setup_battle_event
          end
        end
        # アフターバトルフェーズでなければ
        if @phase != 5
          # ステータスウィンドウをリフレッシュ
          @status_window.refresh
          # エネミー名リストを更新
          @status_window2.refresh
        end
      end
    else
      if PARA_CTB::CT_SKIP == 0
        update_ct
      else
        if @ct_wait > 0
          @ct_wait -= 1
        else
          update_ct
          @ct_wait = PARA_CTB::CT_SKIP
        end
      end
    end
    ctb_update
  end
  #--------------------------------------------------------------------------
  # ● プレバトルフェーズ開始
  #--------------------------------------------------------------------------
  alias ctb_start_phase1 start_phase1
  def start_phase1
    # CTを初期化
    initialize_ct
    # カウントアップ開始
    @countup = true

    ctb_start_phase1
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (プレバトルフェーズ)
  #--------------------------------------------------------------------------
  def update_phase1
    # エネミー名リストを更新
    @status_window2.refresh
    # 勝敗判定
    if judge
      # 勝利または敗北の場合 : メソッド終了
      return
    end
    # パーティーコマンドフェーズを飛ばしてアクターコマンドフェーズ開始
    start_phase3
  end
  #--------------------------------------------------------------------------
  # ● パーティコマンドフェーズ開始
  #--------------------------------------------------------------------------
  def start_phase2
    # フェーズ 2 に移行
    @phase = 2
    # アクターを非選択状態に設定
    @actor_index = -1
    @active_battler = nil
    # パーティコマンドウィンドウを有効化
    @party_command_window.active = true
    @party_command_window.visible = true
    # アクターコマンドウィンドウを無効化
    @actor_command_window.active = false
    @actor_command_window.visible = false
    # メインフェーズフラグをクリア
    $game_temp.battle_main_phase = false
    # コマンド入力不可能な場合
    unless $game_party.inputable?
      # メインフェーズ開始
      start_phase4
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (パーティコマンドフェーズ : 逃げる)
  #--------------------------------------------------------------------------
  def update_phase2_escape
    # エネミーの素早さ合計を計算
    enemies_agi = 0
    for enemy in $game_troop.enemies
      if enemy.exist?
        enemies_agi += enemy.agi
      end
    end
    # 行動可能アクターの素早さ合計を計算
    actors_agi = 0
    for actor in @pre_action_battlers
      if actor.is_a?(Game_Actor) and actor.exist?
        actors_agi += actor.agi
      end
    end
    # 逃走成功判定
    success = rand(100) < 50 * actors_agi / enemies_agi
    # 逃走成功の場合
    if success
      # 逃走 SE を演奏
      $game_system.se_play($data_system.escape_se)
      # バトル開始前の BGM に戻す
      $game_system.bgm_play($game_temp.map_bgm)
      # CTをクリア
      for battler in $game_party.actors
        clear_ct(battler)
      end
      # バトル終了
      battle_end(1)
    # 逃走失敗の場合
    else
      # ヘルプウィンドウに "逃走失敗" をセット
      @help_window.set_text(PARA_CTB::UNESCAPE_MES, 1)
      # アクターのアクションとCTをクリア
      pre_action_battlers = @pre_action_battlers.clone
      for act in pre_action_battlers
        if act.is_a?(Game_Actor)
          declease_ct(act, 100-PARA_CTB::ACT_ESCAPE_CT)
          act.current_action.clear
          @pre_action_battlers.delete(act)
        end
      end
      @party_command_window.visible = false
      # ヘルプウィンドウを表示
      @help_window.visible = true
      @wait_count = 20
      # メインフェーズ開始
      start_phase4
    end
  end
  #--------------------------------------------------------------------------
  # ● アクターコマンドフェーズ開始
  #--------------------------------------------------------------------------
  def start_phase3
    # フェーズ 3 に移行
    @phase = 3
    # アクターを非選択状態に設定
    @actor_index = -1
    @active_battler = nil
    @actor_array_index = -1
    # 次のアクターのコマンド入力へ
    if @pre_action_battlers != []
      phase3_next_actor
    else
      start_phase4
    end
  end
  #--------------------------------------------------------------------------
  # ● 次のアクターのコマンド入力へ
  #--------------------------------------------------------------------------
  def phase3_next_actor
    # ループ
    begin
      # アクターの明滅エフェクト OFF
      if @active_battler != nil
        @active_battler.blink = false
      end
      # 最後のアクターの場合
      if @actor_array_index + 1 == @pre_action_battlers.size
        # メインフェーズ開始
        start_phase4
        return
      #次がエネミーの場合
      elsif $game_troop.enemies.include?(@pre_action_battlers[@actor_array_index + 1])
        # メインフェーズ開始
        start_phase4
        return
      end
      # アクターのインデックスを進める
      @actor_array_index += 1
      @actor_index = @pre_action_battlers[@actor_array_index].index
      @active_battler = $game_party.actors[@actor_index]
      @active_battler.blink = true
      @active_battler.current_action.clear
    # アクターがコマンド入力を受け付けない状態ならもう一度
    end until @active_battler.inputable?
    # アクターコマンドウィンドウをセットアップ
    phase3_setup_command_window
  end
  #--------------------------------------------------------------------------
  # ● 前のアクターのコマンド入力へ
  #--------------------------------------------------------------------------
  def phase3_prior_actor
    # ループ
    begin
      # アクターの明滅エフェクト OFF
      if @active_battler != nil
        @active_battler.blink = false
      end
      # 最初のアクターの場合
      if @actor_array_index <= 0
        # アクターコマンドフェーズ開始
        start_phase2
        return
      end
      # アクターのインデックスを戻す
      @actor_array_index -= 1
      @actor_index = @pre_action_battlers[@actor_array_index].index
      @active_battler = $game_party.actors[@actor_index]
      @active_battler.blink = true
      @active_battler.current_action.clear
    # アクターがコマンド入力を受け付けない状態ならもう一度
    end until @active_battler.inputable?
    # アクターコマンドウィンドウをセットアップ
    phase3_setup_command_window
  end
  #--------------------------------------------------------------------------
  # ● アクターコマンドウィンドウのセットアップ
  #--------------------------------------------------------------------------
  alias phase3_setup_command_window_ctb phase3_setup_command_window
  def phase3_setup_command_window
    @actor_command_window.back_opacity = PARA_CTB::WINDOW_OPACITY
    phase3_setup_command_window_ctb
    if PARA_CTB::WINDOWPOS_CHANGE
      # アクターコマンドウィンドウの位置を設定
      @actor_command_window.x = PARA_CTB::WINDOWPOS_X
      @actor_command_window.y = PARA_CTB::WINDOWPOS_Y
      # ステータスウインドウに隠れないように
      @actor_command_window.z = 9999
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (アクターコマンドフェーズ)
  #--------------------------------------------------------------------------
  def update_phase3
    # エネミーアローが有効の場合
    if @enemy_arrow != nil
      @countup = PARA_CTB::SELECT_WAIT ? false : true
      update_phase3_enemy_select
    # アクターアローが有効の場合
    elsif @actor_arrow != nil
      @countup = PARA_CTB::SELECT_WAIT ? false : true
      update_phase3_actor_select
    # スキルウィンドウが有効の場合
    elsif @skill_window != nil
      @countup = PARA_CTB::SELECT_WAIT ? false : true
      update_phase3_skill_select
    # アイテムウィンドウが有効の場合
    elsif @item_window != nil
      @countup = PARA_CTB::SELECT_WAIT ? false : true
      update_phase3_item_select
    # アクターコマンドウィンドウが有効の場合
    elsif @actor_command_window.active
      @countup = PARA_CTB::COMMAND_WAIT ? false : true
      update_phase3_basic_command
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (アクターコマンドフェーズ : 基本コマンド)
  #--------------------------------------------------------------------------
  alias ctb_update_phase3_basic_command update_phase3_basic_command
  def update_phase3_basic_command
    ctb_update_phase3_basic_command
    # LRボタンで行動順を変更
    if Input.trigger?(Input::R)
      shift_activer(1)
    end
     if Input.trigger?(Input::L)
      shift_activer(-1)
    end
  end
  #--------------------------------------------------------------------------
  # ● メインフェーズ開始
  #--------------------------------------------------------------------------
  def start_phase4
    # フェーズ 4 に移行
    @phase = 4
    battler_count = $game_party.actors.size + $game_troop.enemies.size
    if @action_count >= battler_count or $game_temp.battle_turn == 0
      # バトルイベントの全ページを検索
      for index in 0...$data_troops[@troop_id].pages.size
        # イベントページを取得
        page = $data_troops[@troop_id].pages[index]
        # このページのスパンが [ターン] の場合
        if page.span == 1<


鲜花

刚表态过的朋友 (0 人)

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码