查看: 2097|回复: 13

[有事请教] 关于连击脚本,如何触发连击时随机选择目标?

[复制链接]

素材区好人

梦石
5
星屑
12559
在线时间
4345 小时
注册时间
2011-7-21
回帖
2264

超评测参与极短28参与极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

发表于 2023-12-20 23:26:48 | 显示全部楼层 |阅读模式

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

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

×
找到一个不错的连击脚本,可以自由设计连击概率和连击次数,并且连击的时候不会消耗MP

但是仍然有一个问题,每次连击时都会选择同一个目标,与其说是连击不如叫追击
如何触发连击后,进行连击的单体技能随机选择目标?
2345截图20231220231930.png
[pre lang="ruby"]class Game_Temp
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :连击FLAG
  def 连击FLAG;return @连击FLAG||=false;end
  end

module RPG
  class Skill
    attr_accessor :连击
    attr_accessor :desc
    attr_accessor :几率
    def 连击;return @连击||=0;end
    def description
     description = @description.split(/@/)[0]
     return description != nil ? description : ''
   end
   def desc
     desc = @description.split(/@/)[1]
     return desc != nil ? desc.to_i : 0
   end
   def 几率
     desc = @description.split(/@/)[2]
     return desc != nil ? desc.to_i : 0
     end
   end
end

#==============================================================================
# ■ Scene_Battle (分割定义 4)
#------------------------------------------------------------------------------
#  处理战斗画面的类。
#==============================================================================

class Scene_Battle
#--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 5 : 显示伤害)
  #--------------------------------------------------------------------------
  alias update_phase4_step5_20211213 update_phase4_step5
  def update_phase4_step5
    update_phase4_step5_20211213
    敌全灭=true
    for enemy in $game_troop.enemies
    敌全灭=false if enemy.exist?
    end
    if @active_battler.current_action.skill_id != 0 and !敌全灭
    skill=$data_skills[@active_battler.current_action.skill_id].dup
    @连击||=skill.desc
    # 移至步骤 2
    if @连击 > 0 and skill.几率 > rand(100)
    @phase4_step = 2
    $game_temp.连击FLAG=true
  end
    @连击-=1
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (主回合步骤 6 : 刷新)
  #--------------------------------------------------------------------------
  alias update_phase4_step6_20211213 update_phase4_step6
  def update_phase4_step6
    update_phase4_step6_20211213
    skill=$data_skills[@active_battler.current_action.skill_id].dup if @active_battler.current_action.skill_id != 0
    @连击=nil
  end
  #--------------------------------------------------------------------------
  # ● 生成特技行动结果
  #--------------------------------------------------------------------------
  def make_skill_action_result
    # 获取特技
    @skill = $data_skills[@active_battler.current_action.skill_id]
    # 如果不是强制行动
    unless @active_battler.current_action.forcing
      # 因为 SP 耗尽而无法使用的情况下
      unless @active_battler.skill_can_use?(@skill.id)
        # 清除强制行动对像的战斗者
        $game_temp.forcing_battler = nil
        # 移至步骤 1
        @phase4_step = 1
        return
      end
    end
    # 消耗 SP
    if $game_temp.连击FLAG
      $game_temp.连击FLAG=false
      else
    @active_battler.sp -= @skill.sp_cost
    end
    # 刷新状态窗口
    @status_window.refresh
    # 在帮助窗口显示特技名
    @help_window.set_text(@skill.name, 1)
    # 设置动画 ID
    @animation1_id = @skill.animation1_id
    @animation2_id = @skill.animation2_id
    # 设置公共事件 ID
    @common_event_id = @skill.common_event_id
    # 设置对像侧战斗者
    set_target_battlers(@skill.scope)
    # 应用特技效果
    for target in @target_battlers
      target.skill_effect(@active_battler, @skill)
    end
  end
end

class Game_Battler
  #--------------------------------------------------------------------------
  # ● 可以使用特技的判定
  #     skill_id : 特技 ID
  #--------------------------------------------------------------------------
  def skill_can_use?(skill_id)
    return true if $game_temp.连击FLAG
    # SP 不足的情况下不能使用
    if $data_skills[skill_id].sp_cost > self.sp
      return false
    end
    # 战斗不能的情况下不能使用
    if dead?
      return false
    end
    # 沉默状态的情况下、物理特技以外的特技不能使用
    if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
      return false
    end
    # 获取可以使用的时机
    occasion = $data_skills[skill_id].occasion
    # 战斗中的情况下
    if $game_temp.in_battle
      # [平时] 或者是 [战斗中] 可以使用
      return (occasion == 0 or occasion == 1)
    # 不是战斗中的情况下
    else
      # [平时] 或者是 [菜单中] 可以使用
      return (occasion == 0 or occasion == 2)
    end
  end
  end[/pre]
梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2023-12-21 00:07:54 | 显示全部楼层
本帖最后由 soulsaga 于 2023-12-24 14:44 编辑

[pre lang="ruby"]#--------------------------------------------------------------------------
  # ● 设置物品或特技对像方的战斗者
  #     scope : 特技或者是物品的范围
  #--------------------------------------------------------------------------
  def set_target_battlers(scope)
    # 行动方的战斗者是敌人的情况下
    if @active_battler.is_a?(Game_Enemy)
      # 效果范围分支
      case scope
      when 1  # 敌单体
        index = @active_battler.current_action.target_index
        @target_battlers.push($game_party.smooth_target_actor(index))
      when 2  # 敌全体
        for actor in $game_party.actors
          if actor.exist?
            @target_battlers.push(actor)
          end
        end
      when 3  # 我方单体
        index = @active_battler.current_action.target_index
        @target_battlers.push($game_troop.smooth_target_enemy(index))
      when 4  # 我方全体
        for enemy in $game_troop.enemies
          if enemy.exist?
            @target_battlers.push(enemy)
          end
        end
      when 5  # 我方单体 (HP 0)
        index = @active_battler.current_action.target_index
        enemy = $game_troop.enemies[index]
        if enemy != nil and enemy.hp0?
          @target_battlers.push(enemy)
        end
      when 6  # 我方全体 (HP 0)
        for enemy in $game_troop.enemies
          if enemy != nil and enemy.hp0?
            @target_battlers.push(enemy)
          end
        end
      when 7  # 使用者
        @target_battlers.push(@active_battler)
      end
    end
    # 行动方的战斗者是角色的情况下
    if @active_battler.is_a?(Game_Actor)
      # 效果范围分支
      case scope
      when 1  # 敌单体
        index = @active_battler.current_action.target_index
        if $game_temp.连击FLAG
        @target_battlers.push($game_troop.random_target_enemy)
        return
        end
        @target_battlers.push($game_troop.smooth_target_enemy(index))
      when 2  # 敌全体
        for enemy in $game_troop.enemies
          if enemy.exist?
            @target_battlers.push(enemy)
          end
        end
      when 3  # 我方单体
        index = @active_battler.current_action.target_index
        @target_battlers.push($game_party.smooth_target_actor(index))
      when 4  # 我方全体
        for actor in $game_party.actors
          if actor.exist?
            @target_battlers.push(actor)
          end
        end
      when 5  # 我方单体 (HP 0)
        index = @active_battler.current_action.target_index
        actor = $game_party.actors[index]
        if actor != nil and actor.hp0?
          @target_battlers.push(actor)
        end
      when 6  # 我方全体 (HP 0)
        for actor in $game_party.actors
          if actor != nil and actor.hp0?
            @target_battlers.push(actor)
          end
        end
      when 7  # 使用者
        @target_battlers.push(@active_battler)
      end
    end
  end[/pre]

未测,

点评

你不会以为我给的脚本是直接插入的吧?那是要你改的  发表于 2024-1-4 15:49
改了,51行报错  发表于 2023-12-30 23:00
改成 if @连击 !=nil 就可以了,顺便不要像我一样忘了放在 class Scene_Battle T 口 T  发表于 2023-12-30 11:29
仍然没变化…  发表于 2023-12-25 23:50
还是不行吗?那试试这个  发表于 2023-12-24 14:45
回复

使用道具 举报

梦石
0
星屑
6295
在线时间
799 小时
注册时间
2019-1-20
回帖
223
发表于 2024-1-2 22:47:22 | 显示全部楼层
  1. =begin
  2. 顺便把敌人的也加了,不要就把### 1 那几行删除
  3. =end
  4. class Scene_Battle
  5. #--------------------------------------------------------------------------
  6.   # ● 设置物品或特技对像方的战斗者
  7.   #     scope : 特技或者是物品的范围
  8.   #--------------------------------------------------------------------------
  9.   def set_target_battlers(scope)
  10.     # 行动方的战斗者是敌人的情况下
  11.     if @active_battler.is_a?(Game_Enemy)
  12.       # 效果范围分支
  13.       case scope
  14.       when 1  # 敌单体
  15.         index = @active_battler.current_action.target_index
  16.         
  17.         if @连击 !=nil ### 1
  18.         @target_battlers.push($game_party.random_target_actor)
  19.         return
  20.         end
  21.       
  22.         @target_battlers.push($game_party.smooth_target_actor(index))
  23.       when 2  # 敌全体
  24.         for actor in $game_party.actors
  25.           if actor.exist?
  26.             @target_battlers.push(actor)
  27.           end
  28.         end
  29.       when 3  # 我方单体
  30.         index = @active_battler.current_action.target_index
  31.         @target_battlers.push($game_troop.smooth_target_enemy(index))
  32.       when 4  # 我方全体
  33.         for enemy in $game_troop.enemies
  34.           if enemy.exist?
  35.             @target_battlers.push(enemy)
  36.           end
  37.         end
  38.       when 5  # 我方单体 (HP 0)
  39.         index = @active_battler.current_action.target_index
  40.         enemy = $game_troop.enemies[index]
  41.         if enemy != nil and enemy.hp0?
  42.           @target_battlers.push(enemy)
  43.         end
  44.       when 6  # 我方全体 (HP 0)
  45.         for enemy in $game_troop.enemies
  46.           if enemy != nil and enemy.hp0?
  47.             @target_battlers.push(enemy)
  48.           end
  49.         end
  50.       when 7  # 使用者
  51.         @target_battlers.push(@active_battler)
  52.       end
  53.     end
  54.     # 行动方的战斗者是角色的情况下
  55.     if @active_battler.is_a?(Game_Actor)
  56.       # 效果范围分支
  57.       case scope
  58.       when 1  # 敌单体
  59.         index = @active_battler.current_action.target_index
  60.         
  61.         if @连击 !=nil ### 2
  62.         @target_battlers.push($game_troop.random_target_enemy)
  63.         return
  64.         end
  65.       
  66.         @target_battlers.push($game_troop.smooth_target_enemy(index))
  67.       when 2  # 敌全体
  68.         for enemy in $game_troop.enemies
  69.           if enemy.exist?
  70.             @target_battlers.push(enemy)
  71.           end
  72.         end
  73.       when 3  # 我方单体
  74.         index = @active_battler.current_action.target_index
  75.         @target_battlers.push($game_party.smooth_target_actor(index))
  76.       when 4  # 我方全体
  77.         for actor in $game_party.actors
  78.           if actor.exist?
  79.             @target_battlers.push(actor)
  80.           end
  81.         end
  82.       when 5  # 我方单体 (HP 0)
  83.         index = @active_battler.current_action.target_index
  84.         actor = $game_party.actors[index]
  85.         if actor != nil and actor.hp0?
  86.           @target_battlers.push(actor)
  87.         end
  88.       when 6  # 我方全体 (HP 0)
  89.         for actor in $game_party.actors
  90.           if actor != nil and actor.hp0?
  91.             @target_battlers.push(actor)
  92.           end
  93.         end
  94.       when 7  # 使用者
  95.         @target_battlers.push(@active_battler)
  96.       end
  97.     end
  98.   end
  99. end #  class
复制代码


点评

多谢,已经解决  发表于 2024-1-5 00:37

评分

参与人数 1赞 +1 收起 理由
无忧谷主幻 + 1 认可答案

查看全部评分


提高解决问题的方法:
查看对应版本的帮助文件或者默认脚本中可能相似的部分 看有没有思路能照搬(不是)
改变问题为更有可能的,常见的,系统性的 如:天气自动变化成下雨→天气系统 要多想几种可能
使用论坛的搜索功能查找相关问题 咦?这跟我想的不一样啊!讨厌啦~\(≧□≦)/~啦啦啦
清楚说明实际上你想解决的问题  想看坛友的女装,想看!  
脚本自己有改过的地方要尽量标明  提高除BUG效率 ... ...
脚本有问题但不是默认脚本的要全部贴出来 大胆点,尽情发,我说的是女装照!
三包原则:包有BUG,包甩锅,包咕咕 长期下线,急事换人!难事换人!啥事都换人!换人换人换人!!!
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部