查看: 3804|回复: 37

[已经解决] 请教战斗开始时先运行战斗事件页(0回合)再跑CP集气条的方法

[复制链接]
梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
发表于 2022-1-1 05:14:15 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 taeckle 于 2022-1-1 05:28 编辑

我在网上找到一个CP集气条脚本,使用后发现进入战斗时会先运行CP集气条的各种设定(比如下面那个Class Scene_Battele_CP里的def Initialize)然后再去运行对应数据库队伍栏里战斗事件中条件为回合0的事件页,我现在就想把这个CP脚本改一改,达到能先运行数据库队伍战斗事件触发条件为0回合的事件页然后再开始跑CP集气条就可以了, 这个CP集气条脚本长这样的:

[pre lang="ruby"]#========================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#========================================================================
#========================================================================
# ▼▲▼ XRXS_BP 1. CP制導入 ver..23 ▼▲▼
# by 桜雅 在土, 和希
#------------------------------------------------------------------------
# □ カスタマイズポイント
#========================================================================
module XRXS_BP1
  #
  # 对齐方式。0:左 1:中央 2:右
  #
  ALIGN = 0
  #
  # 人数
  #
  MAX = 4
end
class Scene_Battle_CP
  #
  # 战斗速度
  #
  BATTLE_SPEED = 0.5
  #
  # 战斗开始的时候气槽百分比
  #
  START_CP_PERCENT = 0
end
class Scene_Battle
  # 效果音效,可以自己添加
  DATA_SYSTEM_COMMAND_UP_SE = ""
  # 各项数值功能消耗的CP值
  CP_COST_BASIC_ACTIONS = 0 # 基础共同
  CP_COST_SKILL_ACTION = 65535 # 技能
  CP_COST_ITEM_ACTION = 65535 # 物品
  CP_COST_BASIC_ATTACK = 65535 # 攻撃
  CP_COST_BASIC_GUARD = 49151 # 防御
  CP_COST_BASIC_NOTHING = 65535 # 不做任何事情
  CP_COST_BASIC_ESCAPE = 32535 # 逃跑
end
#========================================================================
# --- XRXS.コマンドウィンドウ?コマンド追加機構 ---
#------------------------------------------------------------------------
# Window_Commandクラスに add_command メソッドを追加します。
#========================================================================
module XRXS_Window_Command_Add_Command
  #----------------------------------------------------------------------
  # ○ コマンドを追加
  #----------------------------------------------------------------------
  def add_command(command)
    # 初期化されていない場合、無効化判別用の配列 @disabled の初期化
    #
    if @disabled == nil
      @disabled = []
    end
    if @commands.size != @disabled.size
      for i in 0...@commands.size
        @disabled = false
      end
    end
    #
    # 追加
    #
    @commands.push(command)
    @disabled.push(false)
    @item_max = @commands.size
    self.y -= 32
    self.height += 32
    self.contents.dispose
    self.contents = nil
    self.contents = Bitmap.new(self.width - 32, @item_max * 32)
    refresh
    for i in 0...@commands.size
      if @disabled
        disable_item(i)
      end
    end
  end
  #----------------------------------------------------------------------
  # ○ 項目の無効化
  # index : 項目番号
  #----------------------------------------------------------------------
  def disable_item(index)
    if @disabled == nil
      @disabled = []
    end
    @disabled[index] = true
    draw_item(index, disabled_color)
  end
end
class Window_Command < Window_Selectable
  #----------------------------------------------------------------------
  # ○ インクルード
  #----------------------------------------------------------------------
  include XRXS_Window_Command_Add_Command
  #----------------------------------------------------------------------
  # ● 項目の無効化
  # index : 項目番号
  #----------------------------------------------------------------------
  def disable_item(index)
    super
  end
end
#========================================================================
# □ Scene_Battle_CP
#========================================================================
class Scene_Battle_CP
  #----------------------------------------------------------------------
  # ○ 公開インスタンス変数
  #----------------------------------------------------------------------
  attr_accessor :stop # CP加算ストップ
  #----------------------------------------------------------------------
  # ○ オブジェクトの初期化
  #----------------------------------------------------------------------
  def initialize  
    @battlers = []
    @cancel = false
    @stop = false
    @str_total = 0
    @dex_total = 0   
    @agi_total = 0
    @int_total = 0   
    # 配列 count_battlers を初期化
    count_battlers = []
    # 将enemy添加到数组count_battlers
    for enemy in $game_troop.enemies
      count_battlers.push(enemy)
    end
    # 将actor添加到数组count_battlers
    for actor in $game_party.actors
      count_battlers.push(actor)
    end
    for battler in count_battlers
      @str_total = [@str_total,battler.str].max      
      @dex_total = [@dex_total,battler.dex].max
      @agi_total = [@agi_total,battler.agi].max
      @int_total = [@int_total,battler.int].max      
    end
    for battler in count_battlers
      battler.cp = 0        
    end   
    for battler in $game_party.actors   #         
     if battler.state?(100)
       battler.cp+=65535
       battler.xp2_damage="我先出手!"
       battler.xp2_damage_pop=true
     end
    end
    #下面就是困扰我很久的bug,只有先运行数据库队伍战斗事件触发条件为0回合的事件页然后再开始跑CP集气条的话才能解决这个bug   
    for battler in $game_troop.enemies  
     if battler.state?(100)
       battler.cp+=65535
       battler.xp2_damage="我先出手! "
       battler.xp2_damage_pop=true
     end
    end        
  end
  #----------------------------------------------------------------------
  # ○ CP计数
  #----------------------------------------------------------------------
  def update
    # 如果停止就返回
    return if @stop
    for battler in $game_party.actors + $game_troop.enemies
      # 如果行动不能忽视
      if battler.dead? == true
        battler.cp = 0
        next
      end
      cp_a=0.6
      cp_b=0.4
      cp_c=0.3
      cp_d=0.08     
      battler.cp = [[battler.cp + BATTLE_SPEED * 4000 * (cp_a*battler.agi+cp_b*battler.dex+cp_c*battler.int+cp_d*battler.str) /(0.6*@agi_total+0.4*@dex_total+0.3*@int_total+0.08*@str_total), 0].max, 65535].min
    end
  end
  #----------------------------------------------------------------------
  # ○ 开始CP计数
  #----------------------------------------------------------------------
  def stop
    @cancel = true
    if @cp_thread != nil then
      @cp_thread.join
      @cp_thread = nil
    end
  end
end
#========================================================================
# ■ Game_Battler
#========================================================================
class Game_Battler
  attr_accessor :now_guarding # 現在防御中フラグ
  attr_accessor :cp # 現在CP
  attr_accessor :slip_state_update_ban # スリップ?ステート自動処理の禁止
  #----------------------------------------------------------------------
  # ○ CP の変更
  #-----------------------------------------------------------------------
  def cp=(p)
    @cp = [[p, 0].max, 65535].min
  end
  #----------------------------------------------------------------------
  # ● 防御中判定 [ 再定義 ]
  #----------------------------------------------------------------------
  def guarding?
    return @now_guarding
  end
  #----------------------------------------------------------------------
  # ● コマンド入力可能判定
  #----------------------------------------------------------------------
  alias xrxs_bp1_inputable? inputable?
  def inputable?
    bool = xrxs_bp1_inputable?
    return (bool and (@cp >= 65535))
  end
  #----------------------------------------------------------------------
  # ● ステート [スリップダメージ] 判定
  #----------------------------------------------------------------------
  alias xrxs_bp1_slip_damage? slip_damage?
  def slip_damage?
    return false if @slip_state_update_ban
    return xrxs_bp1_slip_damage?
  end
  #----------------------------------------------------------------------
  # ● ステート自然解除 (ターンごとに呼び出し)
  #----------------------------------------------------------------------
  alias xrxs_bp1_remove_states_auto remove_states_auto
  def remove_states_auto
    return if @slip_state_update_ban
    xrxs_bp1_remove_states_auto
  end
end
#========================================================================
# ■ Game_Actor
#========================================================================
class Game_Actor < Game_Battler
  #----------------------------------------------------------------------
  # ● セットアップ
  #----------------------------------------------------------------------
  alias xrxs_bp1_setup setup
  def setup(actor_id)
    xrxs_bp1_setup(actor_id)
    @cp = 0
    @now_guarding = false
    @slip_state_update_ban = false
  end
end
#========================================================================
# ■ Game_Enemy
#========================================================================
class Game_Enemy < Game_Battler
  #----------------------------------------------------------------------
  # ● オブジェクト初期化
  #----------------------------------------------------------------------
  alias xrxs_bp1_initialize initialize
  def initialize(troop_id, member_index)
    xrxs_bp1_initialize(troop_id, member_index)
    @cp = 0
    @now_guarding = false
    @slip_state_update_ban = false
  end
end
class Window_All < Window_Base
  def initialize
    super(0,0,640,480)
    self.opacity = 0
    self.contents = Bitmap.new(width - 32, height - 32)
    refresh
  end
  def refresh
    self.contents.clear
    for actor in $game_troop.enemies
      next if !actor.exist?
      draw_actor_cp_meter(actor, actor.screen_x-50, actor.screen_y-50, 60, 0)
    end
  end
  #----------------------------------------------------------------------
  # ○ CPメーター の描画
  #----------------------------------------------------------------------
  def draw_actor_cp_meter(actor, x, y, width = 156, type = 0)
    self.contents.font.color = system_color
    self.contents.fill_rect(x-1, y+27, width+2,6, Color.new(0, 0, 0, 255))
    if actor.cp == nil
      actor.cp = 0
    end
    w = width * [actor.cp,65535].min / 65535
    self.contents.fill_rect(x, y+28, w,1, Color.new(255, 255, 128, 255))
    self.contents.fill_rect(x, y+29, w,1, Color.new(255, 255, 0, 255))
    self.contents.fill_rect(x, y+30, w,1, Color.new(192, 192, 0, 255))
    self.contents.fill_rect(x, y+31, w,1, Color.new(128, 128, 0, 255))
  end  
end
#========================================================================
# ■ Window_BattleStatus
#========================================================================
class Window_BattleStatus < Window_Base
  #-----------------------------------------------------------------------
  # ○ 公開インスタンス変数
  #----------------------------------------------------------------------
  attr_accessor :update_cp_only # CPメーターのみの更新
  #----------------------------------------------------------------------
  # ● オブジェクト初期化
  #----------------------------------------------------------------------
  alias xrxs_bp1_initialize initialize
  def initialize
    @update_cp_only = false
    @wall = Window_All.new
    xrxs_bp1_initialize
  end
  def dispose
    super
    @wall.dispose
  end
  #----------------------------------------------------------------------
  # ● リフレッシュ
  #----------------------------------------------------------------------
  alias xrxs_bp1_refresh refresh
  def refresh
    unless @update_cp_only
      xrxs_bp1_refresh
    end
    refresh_cp
    @wall.refresh
  end
  #----------------------------------------------------------------------
  # ○ リフレッシュ(CPのみ)
  #----------------------------------------------------------------------
  def refresh_cp
    for i in 0...$game_party.actors.size
      actor = $game_party.actors
      #width = [self.width*3/4 / XRXS_BP1::MAX, 80].max
      #space = self.width / XRXS_BP1::MAX
      case i
      when 0
        actor_x = 510-64
        actor_y = 360-100
      when 1
        actor_x = 430-40-24
        actor_y = 395-100
      when 2
        actor_x = 288
        actor_y = 400-60
      when 3
        actor_x = 580-64
        actor_y = 288-100
      end # of case
      #case XRXS_BP1::ALIGN
      
      #when 0
       # actor_x = i * space + 4
      #when 1
       # actor_x = (space * ((XRXS_BP1::MAX - $game_party.actors.size)/2.0 + i)).floor
      #when 2
        #actor_x = (i + XRXS_BP1::MAX - $game_party.actors.size) * space + 4
      #end
      #actor_x += self.x
      draw_actor_cp_meter(actor, actor_x, actor_y+56, 64, 0)
    end
  end
  #----------------------------------------------------------------------
  # ○ CPメーター の描画
  #----------------------------------------------------------------------
  def draw_actor_cp_meter(actor, x, y, width = 156, type = 0)
    self.contents.font.color = system_color
    self.contents.fill_rect(x-1, y+27, width+2,6, Color.new(0, 0, 0, 255))
    if actor.cp == nil
      actor.cp = 0
    end
    w = width * [actor.cp,65535].min / 65535
    self.contents.fill_rect(x, y+28, w,1, Color.new(255, 255, 128, 255))
    self.contents.fill_rect(x, y+29, w,1, Color.new(255, 255, 0, 255))
    self.contents.fill_rect(x, y+30, w,1, Color.new(192, 192, 0, 255))
    self.contents.fill_rect(x, y+31, w,1, Color.new(128, 128, 0, 255))
  end
end
#========================================================================
# ■ Scene_Battle
#========================================================================
class Scene_Battle
  #----------------------------------------------------------------------
  # ● フレーム更新
  #----------------------------------------------------------------------
  alias xrxs_bp1_update update
  def update
    xrxs_bp1_update
    # CP更新
    @cp_thread.update
  end
  #----------------------------------------------------------------------
  # ● バトル終了
  # result : 結果 (0:勝利 1:敗北 2:逃走)
  #----------------------------------------------------------------------
  alias xrxs_bp1_battle_end battle_end
  def battle_end(result)
    # CPカウントを停止する
    @cp_thread.stop
    # 呼び戻す
    xrxs_bp1_battle_end(result)
  end
  #----------------------------------------------------------------------
  # ● プレバトルフェーズ開始
  #----------------------------------------------------------------------
  alias xrxs_bp1_start_phase1 start_phase1
  def start_phase1
    @agi_total = 0
    @int_total = 0
    @dex_total = 0
    # CP加算を開始する
    @cp_thread = Scene_Battle_CP.new
    # インデックスを計算
    @cp_escape_actor_command_index = @actor_command_window.height/32 - 1
    # アクターコマンドウィンドウに追加
    @actor_command_window.add_command("逃  跑")
    if !$game_temp.battle_can_escape
      @actor_command_window.disable_item(@cp_escape_actor_command_index)
    end
    # 呼び戻す
    xrxs_bp1_start_phase1   
  end
  #----------------------------------------------------------------------
  # ● パーティコマンドフェーズ開始
  #----------------------------------------------------------------------
  alias xrxs_bp1_start_phase2 start_phase2
  def start_phase2
    xrxs_bp1_start_phase2
    @party_command_window.active = false
    @party_command_window.visible = false
    # CP加算を再開する
    @cp_thread.stop = false
    # 次へ
    start_phase3
  end
  #----------------------------------------------------------------------
  # ● アクターコマンドウィンドウのセットアップ
  #----------------------------------------------------------------------
  alias xrxs_bp1_phase3_setup_command_window phase3_setup_command_window
  def phase3_setup_command_window
    # CPスレッドを一時停止する
    @cp_thread.stop = true
    # ウィンドウのCP更新
    @status_window.refresh_cp
    # @active_battlerの防御を解除
    @active_battler.now_guarding = false
    # 効果音の再生
    Audio.se_play(DATA_SYSTEM_COMMAND_UP_SE) if DATA_SYSTEM_COMMAND_UP_SE != ""
    # 呼び戻す
    xrxs_bp1_phase3_setup_command_window     
  end
  #----------------------------------------------------------------------
  # ● 帧更新(角色命令阶段:基本命令)
  #----------------------------------------------------------------------
  alias xrxs_bsp1_update_phase3_basic_command update_phase3_basic_command
  def update_phase3_basic_command
   if  @actor_command_window.active = true && @actor_command_window.visible = true #玄:防重复按键
    # 按下回车按钮时
     if Input.trigger?(Input::C)
      # 在actor命令窗口中的光标位置处分支
      case @actor_command_window.index
      when @cp_escape_actor_command_index # 逃跑
        if $game_temp.battle_can_escape
          # 决定时SE播放
          $game_system.se_play($data_system.decision_se)
          # 设定动作类型
          @active_battler.current_action.kind = 0
          @active_battler.current_action.basic = 4
          # 转到下一个actor命令输入
          phase3_next_actor
        else
          # 播放蜂鸣器SE
          $game_system.se_play($data_system.buzzer_se)
        end
        return
      end#of case
    end
    xrxs_bsp1_update_phase3_basic_command
   end
  end
  #----------------------------------------------------------------------
  # ● 主要阶段开始
  #----------------------------------------------------------------------
  alias xrxs_bp1_start_phase4 start_phase4
  def start_phase4
    #
    xrxs_bp1_start_phase4
    # 暂停CP进程
    unless @action_battlers.empty?
      @cp_thread.stop = true
    end
   end
  #----------------------------------------------------------------------
  # ● 行動順序作成
  #----------------------------------------------------------------------
  alias xrxs_bp1_make_action_orders make_action_orders
  def make_action_orders
    xrxs_bp1_make_action_orders
    # 确认每个人的CP
    exclude_battler = []
    @time += 1
    for battler in @action_battlers
       #玄:时序插入
      if @time%68 == 0 && battler.cp < 65535
        unless battler.dead?
         battler.time_effect
         @status_window.refresh
         @phase4_step = 2
        end
      end
   
      # 如果缺少CP,则从@action_battlers中排除
      if battler.cp < 65535
        exclude_battler.push(battler)
      end
    end
    @action_battlers -= exclude_battler
  end
  #----------------------------------------------------------------------
  # ● 帧更新(主要阶段步骤1:行动准备)
  #----------------------------------------------------------------------
  alias xrxs_bp1_update_phase4_step1 update_phase4_step1
  def update_phase4_step1
    # 初期化
    @phase4_act_continuation = 0
    # 勝敗判定
    if judge
      @cp_thread.stop
      # 勝利または敗北の場合 : メソッド終了
      return
    end
    # 未行動バトラー配列の先頭から取得
    @active_battler = @action_battlers[0]
    # ステータス更新をCPだけに限定。
    @status_window.update_cp_only = true
    # ステート更新を禁止。
    @active_battler.slip_state_update_ban = true if @active_battler != nil
    # 戻す
    xrxs_bp1_update_phase4_step1
    # @status_windowがリフレッシュされなかった場合は手動でリフレッシュ(CPのみ)
    if @phase4_step != 2
      # リフレッシュ
      @status_window.refresh
      # 軽量化:たったコレだけΣ(?w?
      Graphics.frame_reset
    end
    # 禁止を解除
    @status_window.update_cp_only = false
    @active_battler.slip_state_update_ban = false if @active_battler != nil
  end
  #----------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
  #----------------------------------------------------------------------
  alias xrxs_bp1_update_phase4_step2 update_phase4_step2
  def update_phase4_step2
    # 如果不是强制行动
    unless @active_battler.current_action.forcing
      # 当约束是[通常攻击敌人]或[通常攻击盟友]
      if @active_battler.restriction == 2 or @active_battler.restriction == 3
        # 将攻击设置为行动
        @active_battler.current_action.kind = 0
        @active_battler.current_action.basic = 0
      end
      # 当限制是“我不能行动”
      if @active_battler.restriction == 4
        # 清除动作强制管家
        $game_temp.forcing_battler = nil
        if @phase4_act_continuation == 0 and @active_battler.cp >= 65535
          # 状态符号自然解除
          @active_battler.remove_states_auto
          # CP消費
          @active_battler.cp -= 65535
          # 刷新状态窗口
          @status_window.refresh
        end
        # 转到第1步
        @phase4_step = 1
        return
      end
    end
    # 行动类型分支
    case @active_battler.current_action.kind
    when 0
      # 攻击、防御、逃跑、什么都不做时消耗的CP
      @active_battler.cp -= CP_COST_BASIC_ACTIONS if @phase4_act_continuation == 0
    when 1
      @active_battler.now_guarding = false
      if @phase4_act_continuation == 0
       if $data_skills[@active_battler.current_action.skill_id ].int_f == 1
       @active_battler.cp -= 16384
       else      
       end
      end
    when 2
     @active_battler.now_guarding = false #玄:融合脚本,取消防御
      # 使用道具时消耗的CP
      if @phase4_act_continuation == 0
        @active_battler.cp -= CP_COST_ITEM_ACTION  
      end
      if $data_items[@active_battler.current_action.item_id].scope == 3
        @active_battler.cp += 46000     
      end
    end
    # 记录行动
    if @active_battler.is_a?(Game_Actor) #&& @active_battler.id == 1
    @active_battler.last_action.kind = @active_battler.current_action.kind
     @active_battler.last_action.basic = @active_battler.current_action.basic
     @active_battler.last_action.forcing = @active_battler.current_action.forcing
     @active_battler.last_action.target_index = @active_battler.current_action.target_index
     @active_battler.last_action.skill_id = @active_battler.current_action.skill_id
     @active_battler.last_action.item_id = @active_battler.current_action.item_id
    end
    #状态自然解除
     if @active_battler.current_action.skill_id != 0
      unless $data_skills[@active_battler.current_action.skill_id ].int_f == 1
       @active_battler.remove_states_auto
      end
     else
     @active_battler.remove_states_auto
     end
   
    #返回
    xrxs_bp1_update_phase4_step2
  end
  #----------------------------------------------------------------------
  # ● 基本操作结果创建
  #----------------------------------------------------------------------
  alias xrxs_bp1_make_basic_action_result make_basic_action_result
  def make_basic_action_result
    # 攻撃の場合
    if @active_battler.current_action.basic == 0 and @phase4_act_continuation == 0
      @active_battler.cp -= CP_COST_BASIC_ATTACK # 攻撃時のCP消費
       @active_battler.now_guarding = false
    end
    #防御の場合
    if @active_battler.current_action.basic == 1 and @phase4_act_continuation == 0
      @active_battler.cp -= CP_COST_BASIC_GUARD # 防御時のCP消費
      # @active_battlerの防御をON
      @active_battler.now_guarding = true
    end
    #当敌人逃跑时
    if @active_battler.is_a?(Game_Enemy) and
        @active_battler.current_action.basic == 2 and @phase4_act_continuation == 0
      @active_battler.cp -= CP_COST_BASIC_ESCAPE # 逃走時のCP消費
       @active_battler.now_guarding = false
    end
    #如果你什么也不做
    if @active_battler.current_action.basic == 3 and @phase4_act_continuation == 0
      @active_battler.cp -= CP_COST_BASIC_NOTHING # 什么都不做のCP消費
       @active_battler.now_guarding = false
    end
    #如果你要逃跑
    if @active_battler.current_action.basic == 4 and @phase4_act_continuation == 0
      @active_battler.cp -= CP_COST_BASIC_ESCAPE # 逃走時のCP消費
      #如果你不能逃走
      if $game_temp.battle_can_escape == false
        #播放蜂鸣器SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      #逃走处理中
      update_phase2_escape
      return
    end
    # 返回
    xrxs_bp1_make_basic_action_result
  end
  #----------------------------------------------------------------------
  # ● 帧更新(主阶段步骤6:刷新)
  #----------------------------------------------------------------------
  alias xrxs_bp1_update_phase4_step6 update_phase4_step6
  def update_phase4_step6
    if @active_battler.hp > 0 and @active_battler.slip_damage?
     if @active_battler.current_action.kind == 0 #普通攻击
       @active_battler.slip_damage_effect
       @active_battler.damage_pop = true        #刷新状态窗口
     elsif @active_battler.current_action.kind == 1  #特技攻击      
      if @active_battler.current_action.skill_id != 0
      else
      end
     elsif @active_battler.current_action.kind == 2 #使用物品
     @active_battler.slip_damage_effect
     @active_battler.damage_pop = true        #刷新状态窗口      
     else
     end
    @status_window.refresh
    end
    # 呼び戻す
    xrxs_bp1_update_phase4_step6
  end
end

#======================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#======================================================================[/pre]

只要能进入战斗时先运行条件为回合0的事件页再开始跑集气条的话咱就可以继续做那个战斗开始时先手的第100号状态了,还请大家多多指教,多谢了

祝大家新年心想事成,事事顺利!
梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2022-1-1 12:14:16 | 显示全部楼层
可以看我的主题找到战斗中执行並行公共事件的脚本..但不保证合适...阿门

点评

我找人看我的空间..他们都能看到..所以不是我的问题..应该没有加密  发表于 2022-1-2 14:58
https://rpg.blue/thread-477564-1-1.html  发表于 2022-1-2 14:49
吓?我没加密过啊...  发表于 2022-1-2 14:48
大神你加密了,除了你其他人看不到的...  发表于 2022-1-2 14:30
在我的主题里第一页就有..你跟我说没找到?  发表于 2022-1-2 11:27
回复

使用道具 举报

梦石
0
星屑
5204
在线时间
457 小时
注册时间
2011-3-26
回帖
100
发表于 2022-1-1 12:40:34 | 显示全部楼层
本帖最后由 rfvtgbzxc 于 2022-1-2 20:30 编辑

印象里条件设置为回合1+0x就可以在跑进度条的时候触发,但是cp那个时候已经分配完毕了。这个时候可以在事件里加脚本:
  1. $game_party.actors.each do | actor |
  2.   actor.cp = 65535 if actor.state?(xxx)
  3. end
复制代码


Scene_Battle自带一个事件解释器,执行事件使用如下指令:
[pre lang="ruby"]# 装载事件
common_event = $data_common_events[event_id]
$game_system.battle_interpreter.setup(common_event.list, event_id)
# 立刻执行事件
$game_system.battle_interpreter.update[/pre]

如果你不在setup以后立刻update的话,系统会在随后的进度里update,不过那个时候是在战斗中cp初始化完成以后。

这怎么会抢先一步呢,你也抢在执行面前不就好了。
[pre lang="ruby"]#========================================================================
# □ Scene_Battle_CP
#========================================================================
class Scene_Battle_CP
  #----------------------------------------------------------------------
  # ○ 公開インスタンス変数
  #----------------------------------------------------------------------
  attr_accessor :stop # CP加算ストップ
  #----------------------------------------------------------------------
  # ○ オブジェクトの初期化
  #----------------------------------------------------------------------
  def initialize  
    @battlers = []
    @cancel = false
    @stop = false
    @str_total = 0
    @dex_total = 0   
    @agi_total = 0
    @int_total = 0   
    # 配列 count_battlers を初期化
    count_battlers = []
    # 将enemy添加到数组count_battlers
    for enemy in $game_troop.enemies
      count_battlers.push(enemy)
    end
    # 将actor添加到数组count_battlers
    for actor in $game_party.actors
      count_battlers.push(actor)
    end
    for battler in count_battlers
      @str_total = [@str_total,battler.str].max      
      @dex_total = [@dex_total,battler.dex].max
      @agi_total = [@agi_total,battler.agi].max
      @int_total = [@int_total,battler.int].max      
    end
   
   
   
   
    # 装载事件
    common_event = $data_common_events[event_id]
    $game_system.battle_interpreter.setup(common_event.list, event_id)
    # 立刻执行事件
    $game_system.battle_interpreter.update
   
   
   
   
   
    for battler in count_battlers
      battler.cp = 0        
    end   
    for battler in $game_party.actors   #         
     if battler.state?(100)
       battler.cp+=65535
       battler.xp2_damage="我先出手!"
       battler.xp2_damage_pop=true
     end
    end
    #下面就是困扰我很久的bug,只有先运行数据库队伍战斗事件触发条件为0回合的事件页然后再开始跑CP集气条的话才能解决这个bug   
    for battler in $game_troop.enemies  
     if battler.state?(100)
       battler.cp+=65535
       battler.xp2_damage="我先出手! "
       battler.xp2_damage_pop=true
     end
    end        
  end
  #----------------------------------------------------------------------
  # ○ CP计数
  #----------------------------------------------------------------------
  def update
    # 如果停止就返回
    return if @stop
    for battler in $game_party.actors + $game_troop.enemies
      # 如果行动不能忽视
      if battler.dead? == true
        battler.cp = 0
        next
      end
      cp_a=0.6
      cp_b=0.4
      cp_c=0.3
      cp_d=0.08     
      battler.cp = [[battler.cp + BATTLE_SPEED * 4000 * (cp_a*battler.agi+cp_b*battler.dex+cp_c*battler.int+cp_d*battler.str) /(0.6*@agi_total+0.4*@dex_total+0.3*@int_total+0.08*@str_total), 0].max, 65535].min
    end
  end
  #----------------------------------------------------------------------
  # ○ 开始CP计数
  #----------------------------------------------------------------------
  def stop
    @cancel = true
    if @cp_thread != nil then
      @cp_thread.join
      @cp_thread = nil
    end
  end
end[/pre]

点评

wwwwww~  发表于 2022-1-2 20:48
我知道问题在哪了,我那个 # 立刻执行事件$game_system.battle_interpreter.update没有写出来...  发表于 2022-1-2 20:41
只要涉及到battle_interpreter.setup的都会被那个CP集气Scene_Battle_CP.new抢前一步,我待会来新建个工程在详细描述一下  发表于 2022-1-2 20:04
本层更新的内容能帮上忙吗?加在initialize里。  发表于 2022-1-2 19:53
不是不论什么时候,就战斗开始的第一下,简称先手,目前我方actor已经有这个效果了,就是敌方enemy有这个状态时没有这个效果..  发表于 2022-1-2 19:46

评分

参与人数 1星屑 +300 赞 +1 收起 理由
RyanBern + 300 + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
 楼主| 发表于 2022-1-2 20:22:57 | 显示全部楼层
rfvtgbzxc 发表于 2022-1-1 12:40
印象里条件设置为回合1+0x就可以在跑进度条的时候触发,但是cp那个时候已经分配完毕了。这个时候可以在事件 ...


大神你可以试试我下面这个工程,我在队伍战斗事件页下面p了个"敌方战斗状态设置结束",在class Scene_Battle_CP的def initialize里面p了个"现在开始跑CP集气",然后你就会发现那个"现在开始跑CP集气"总是会在"敌方战斗状态设置结束"前面出现

Project_CP先手.rar

193.43 KB, 下载次数: 13

CP_先手

点评

如果能让"敌方战斗状态设置结束"在"现在开始跑CP集气"之前出现的话我的这个问题就算是解决了  发表于 2022-1-2 20:30
回复

使用道具 举报

梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
 楼主| 发表于 2022-1-2 20:57:27 | 显示全部楼层
本帖最后由 taeckle 于 2022-1-2 21:03 编辑
rfvtgbzxc 发表于 2022-1-1 12:40
印象里条件设置为回合1+0x就可以在跑进度条的时候触发,但是cp那个时候已经分配完毕了。这个时候可以在事件 ...


大神你在看我下面我自己想出来的解决方案:
①先在Class Scene_Battle 的 def main里面设置两个开关:
    $game_switches[1] = false #战斗开始敌方状态设置  
    $game_switches[2] = false #战斗开始CP设置
②然后把我那个cp脚本里第419行的 @cp_thread = Scene_Battle_CP.new 注释掉,
③接下来要在条件为回合0的数据库第13号队伍战斗事件页中最后添加一句"$game_switches[1] = true"
④最后再在我那个cp脚本里的第387行#CP更新下面增加这段设置,保存后就可以先运行战斗事件页(0回合)再跑CP集气条了:
    if $game_switches[1]==true
     if $game_switches[2]==false
    @cp_thread = Scene_Battle_CP.new
    $game_switches[2]=true
     end
    end

Project_CP先手_解决方案1.rar

193.73 KB, 下载次数: 14

解决方案1

回复

使用道具 举报

梦石
0
星屑
5204
在线时间
457 小时
注册时间
2011-3-26
回帖
100
发表于 2022-1-2 21:28:06 | 显示全部楼层
本帖最后由 rfvtgbzxc 于 2022-1-3 18:08 编辑
taeckle 发表于 2022-1-2 20:57
大神你在看我下面我自己想出来的解决方案:
①先在Class Scene_Battle 的 def main里面设置两个开关:
     ...


你这样每场战斗都要加$game_switches[1] = true了。
这实际上不是时序问题,更像是初始化行为的不完善。可以考虑用之前提到的数据拓展脚本,给enemy一个数据库属性“initial_states”或者"offensive"(先手),设定好开局状态属性或者先手属性以后在代码里处理。
如果要给特定的少量战斗添加敌方先手,可以事件里直接把敌人cp条加满。
[pre lang="ruby"]=begin
添加属性:
  initial_states:刚开局,怪物身上就有的状态
=end
module RPG
  class Enemy
    attr_accessor :initial_states
  end
end
#--------------------------------------------------------------------------
# 数据更新,该部分落实补充$data_enemies的数据
#--------------------------------------------------------------------------                                            
module Data_Extend
  # 初始状态
  # enemy_id => [...states]                                                      
  Enemy_initial_states = {
   # 小恶魔, [强力]
   13 => [13]
  }
  def self.update_data_enemy
    for i in 1..$data_enemies.size
      enemy = $data_enemies
      next if enemy.nil?
      enemy.initial_states = Enemy_initial_states.include?(i) ? Enemy_initial_states : []
    end
  end
end


# 开战后,再一个个上状态
$game_troop.enemies.each do |enemy|
  enemy.initial_states.each do |state_id|
    enemy.add_state(state_id)
  end
end[/pre]

点评

self.initial_states.each do |state_id| self.add_state(state_id) end  发表于 2022-1-3 17:25
放到Game_Enemy的initialize的最后一行我认为比较合适,不需要外面$game_troop那层循环了,把这个过程看作是随着怪物生成发起的行为。  发表于 2022-1-3 17:23
谢夸ww这个模式是随着开发经验逐渐定型的,考虑了很多取巧方法后还是回到数据库本身了。技能被占用的部分的确很少,是做拓展的好地方。  发表于 2022-1-3 17:19
大神我还想请问下你这个给enemy战斗初始状态的脚本该如何使用或者调用呢?放到哪里最合适呢?  发表于 2022-1-3 17:10
做的挺好的,一些XP的脚本会喜欢在敌人的名字里做个标记,不过我喜欢塞一个用不上的技能。  发表于 2022-1-3 09:57
回复

使用道具 举报

梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
 楼主| 发表于 2022-1-2 21:44:21 | 显示全部楼层
rfvtgbzxc 发表于 2022-1-2 21:28
你这样每场战斗都要加$game_switches[1] = true了。
这实际上不是时序问题,更像是初始化行为的不完善。 ...


多谢大神指点,我早就该把我的这个工程发出来了,你说的没错,今天上午我花了3个小时把我工程数据库里600多个战斗队伍事件页最后都加了个$game_switches[1] = true,累了个半死...

点评

wwww  发表于 2022-1-2 21:58
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2022-1-3 13:39:15 | 显示全部楼层
我以为楼主是有要有什么条件下敌人才触发的先攻特效..但既然固定触发就没有必要用事件了..

点评

没错,可以用6楼大神给的脚本  发表于 2022-1-3 17:18
回复

使用道具 举报

梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
 楼主| 发表于 2022-1-4 08:56:32 | 显示全部楼层
rfvtgbzxc 发表于 2022-1-2 21:28
你这样每场战斗都要加$game_switches[1] = true了。
这实际上不是时序问题,更像是初始化行为的不完善。 ...


大神你看这是我在rpg maker xp默认脚本基础上按照你在6楼给我的脚本自己写的, 具体步骤为:
①把从第13行module Data_Extend到第27行插入到main上面
②把attr_accessor :initial_states插入到默认脚本中的Game_Enemy < Game_Battler下面
③把self.initial_states.each do |state_id| self.add_state(state_id) end放到Game_Enemy的initialize的最后一行

现在好像运行不了,大神你可以帮我改一改或者你也新建个工程写一下吗?多谢了!

战斗前怪的buff设置.rar

188.83 KB, 下载次数: 15

回复

使用道具 举报

梦石
0
星屑
4476
在线时间
419 小时
注册时间
2016-5-11
回帖
127
发表于 2022-1-4 12:02:02 | 显示全部楼层
楼主就是想让敌人先手吧,如果是固定敌人必定先手的话,你可以分歧一下敌人的ID battler.cp+=65535 if battler..id==1 && battler.is_a?(Game_Enemy), 如果你是在事件页添加了另外的随机条件那就不行了,或者你直接在事件页加cp,

评分

参与人数 1赞 +1 收起 理由
taeckle + 1 多谢指点~~

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部