查看: 3169|回复: 35

[已经过期] 反击脚本疑问

[复制链接]
梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
发表于 2017-3-26 09:53:37 | 显示全部楼层 |阅读模式

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

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

×
这个反击脚本
我把所有使用的脚本,都复制到一个新的工程上就没问题该魔反魔反,该物反物反击,
但是我回去原工程测试,所有的crm都无效 crp只反击普通攻击 物理特技不反击
最初设置的时候crm确实魔法反击,
开新进度测试依然不行
请问到底是什么原因呢?

[pre lang="ruby"]#==========================================================================
# 本脚本来自www.66RPG.com,由ikki转载。使用请保留此信息
#=========================================================================

# ▼▲▼ XRXS27. 特殊効果 SuperEX「反击」 ver.1.05 ▼▲▼
# by シムナフ, ピニョン

#========================================================================
# □ 自定义设定
#========================================================================
class Game_Battler
  # 反击的状态名
  STATE_COUNTER_NAME = '反击'
end

#========================================================================
# ◇ 说明文档
#=======================================================================
#****Warning! 重新定义了 Game_Actor#skill_can_use? ****
#!!!!-crm 魔法反击有各种异常不能修正,不使用
#使用方法
#对于身中“反击”状态的角色,当收到单独的攻击的时候会自动反击
#反击的模式可以在下面设定

#-cr (counter react)下面设定可以反击的挨打设定,
# 比如设定一个状态名为“反击 -crm”,则受到魔法攻击的时候会自动反击
#-crp  (physical)=>遭到通常攻击,物理攻击的时候反击
#-crm  (masic)=>遭到魔法攻击的时候反击
#-cre7 (element)=>遭到属性ID编号为7的攻击的时候反击。

#-ca (counter act)下面设定反击行为
#比如设置一个状态名叫做“反击 -cas19”,那么受到攻击的时候就会用19号特技反击。
#-cas1 (skill)=>使用编号为1的技能
#-cai1 (item)=>使用编号为1的物品。
#-caa  (attack)=>使用物理攻击反击。
#-cae  (escape)=>逃跑,敌人使用

#-cac  (copy)=>受けたスキルをそのまま反击。未テスト(笑
#何もつけない場合は通常攻撃反击になります。(不懂……?@_@?)

#注意和即时战斗的共同使用问题……

#举例:设置一个状态,使得遭遇物理攻击的时候使用物品4,“反击 -crp -cai4”

#========================================================================
# ■ Game_Battler (分割定義 1)
#========================================================================

class Game_Battler
  #-----------------------------------------------------------------------
  # ● オブジェクト初期化
  #-----------------------------------------------------------------------
  def states=(states)
    @states = states
  end
  
  #-----------------------------------------------------------------------
  # ● オブジェクト初期化
  #-----------------------------------------------------------------------
  alias original_initialize_before_counter_action initialize
  def initialize
    original_initialize_before_counter_action()
    @counter_action = Game_BattleAction.new
  end
  
  #-----------------------------------------------------------------------
  # ●
  #-----------------------------------------------------------------------
  alias original_current_action_before_counter_action current_action
  def current_action
      if @counter_action.cleared?
        return original_current_action_before_counter_action()
      else
        return @counter_action
      end
  end

  #-----------------------------------------------------------------------
  # ●
  #-----------------------------------------------------------------------
  def counter_action
    return @counter_action
  end
  #-----------------------------------------------------------------------
  # ●
  #-----------------------------------------------------------------------
  def counter_acting?
    if !@counter_action.cleared?
      return true
    else
      return false
    end
  end
  #-----------------------------------------------------------------------
  # ● 戦闘不能判定
  #-----------------------------------------------------------------------
  #alias original_dead_before_counter_action dead?
  #def dead?
  #  if self.counter_acting?
  #    return false
  #  else
  #    return original_dead_before_counter_action()
  #  end
  #end
  
  #----------------------------------------------------------------------
  # ●
  #----------------------------------------------------------------------
  def counter_action_for(attacker, skill = nil)
    #カウンターからのカウンターは発生しない
    if attacker.counter_acting?
      return
    end
    #動けない場合存在しない場合は発生しない
    #if !self.movable? || !self.exist?
    #  return
    #end
    if attacker.is_a?(Game_Actor)
      if self.is_a?(Game_Actor)#味方からの攻撃はカウンター不可
        return
      end
      ind = $game_party.get_index_by(attacker)
      s_ind = $game_troop.get_index_by(self)
    elsif attacker.is_a?(Game_Enemy)
      if self.is_a?(Game_Enemy)#味方からの攻撃はカウンター不可
        return
      end
      ind = $game_troop.get_index_by(attacker)
      s_ind = $game_party.get_index_by(self)
    end
    if ind.nil? || s_ind.nil?
      return
    end
   
    act_kind = 'a'
    act_id = 0
   
    for id in @states
      if $data_states[id].name =~ /^#{STATE_COUNTER_NAME}/
        react_cond = false
        react_succ = false
        for opt in $data_states[id].options
          if opt =~ /^cr([pmedns])([0-9]*)/
            kind = $1
            id = $2.to_i
            react_cond = true
            case kind
            when 'p'
              if skill.nil? || skill.atk_f >= 100
                react_succ = true
              end
            when 'm'
              if !skill.nil? && skill.int_f >= 100
                react_succ = true
              end
            when 'e'
              if id.nil? || id.zero?
                next
              elsif skill.nil? #武器の攻撃属性
                if attacker.is_a?(Game_Actor) && !$data_weapons[@weapon_id].nil?
                  if $data_weapons[@weapon_id].element_set.include?(id)
                    react_succ = true
                  end
                end
              elsif skill.element_set.include?(id)#スキルの攻撃属性
                react_succ = true
              end

            when 'n'#相手攻撃無効カウンター
              no_attack = true
            when 's'#回避時カウンター
              miss_attack = true
            when 'd'#死亡カウンター
              if self.dead? && self.movable?
                react_succ = true
              end
            end
            
          elsif opt =~ /^ca([asime])([0-9]*)/
            act_kind = $1
            act_id = $2.to_i
            act_cond = true
          end
        end
        
        if (!react_cond || react_succ)#反击条件が無い・もしくは条件に一致
          counter = true#カウンター成功
          break
        else
          next
        end
        
      end
    end
   
    if !counter#カウンター成功していなかった場合
      return
    end


    # 相手攻撃無効カウンターありならダメージ戻し
    if no_attack == true
      if self.damage != "未击中!"
        self.hp += self.damage
        self.damage = "反击!!"
        self.critical = false
        @state_changed = false
        self.states = @old_states
      end
    end

    # 回避時カウンターありでミスじゃないときはさよなら
    if miss_attack == true and self.damage != "未击中!"
      return
    end


    if act_kind == 'c'
      if skill.nil?
        act_kind = 'a'
      else
        act_kind = 's'
        act_id = skill.id
      end
    end
   
    case act_kind
    when 's'#skill kind:1 basic0
      s = $data_skills[act_id]
      if s.nil? || ![0,1].include?(s.occasion) || !self.skill_can_use?(act_id)
        return
      end
      self.counter_action.skill_id = act_id
      self.counter_action.kind = 1
      if [1,2].include?(s.scope)#1,2で敵単体、敵全体。
        self.counter_action.target_index = ind
      else
        self.counter_action.target_index = s_ind
      end
    when 'i'#item kind:2 basic:0
      i = $data_items[act_id]
      if !self.is_a?(Game_Actor) || i.nil? || ![0,1].include?(i.occasion) || !$game_party.item_can_use?(act_id)
        return
      end
      self.counter_action.item_id = act_id
      self.counter_action.kind = 2
      if [1,2].include?(i.scope)#1,2で敵単体、敵全体。
        self.counter_action.target_index = ind
      else
        self.counter_action.target_index = s_ind
      end
    when 'a'#通常攻撃 kind:0 basic:0
      self.counter_action.kind = 0
      self.counter_action.target_index = ind
      self.counter_action.basic = 0
    when 'e'#escape kind:0 basic:2
      if !self.is_a?(Game_Enemy)
        return
      end
      self.counter_action.kind = 0
      self.counter_action.target_index = ind
      self.counter_action.basic = 2      
    end
    return
   
  end
  
  #----------------------------------------------------------------------
  # ● 通常攻撃の効果適用
  #     attacker : 攻撃者 (バトラー)
  #----------------------------------------------------------------------
  alias original_attack_effect_before_counter_action attack_effect
  def attack_effect(attacker)
    @old_states = self.states.clone
    val = original_attack_effect_before_counter_action(attacker)
    self.counter_action_for(attacker)
    return val
  end  
  
  #----------------------------------------------------------------------
  # ● スキルの効果適用
  #     user  : スキルの使用者 (バトラー)
  #     skill : スキル
  #----------------------------------------------------------------------
  alias original_skill_effect_before_counter_action skill_effect
  def skill_effect(attacker, skill)
    @old_states = self.states.clone
    val = original_skill_effect_before_counter_action(attacker, skill)
    self.counter_action_for(attacker, skill)
    return val
  end
  
end

#=======================================================================
# ■ Game_Actor
#--------------------------------------------------------------------------
#  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
# の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
#=======================================================================

class Game_Actor < Game_Battler
  #----------------------------------------------------------------------
  # ● スキルの使用可能判定
  #     skill_id : スキル ID
  #----------------------------------------------------------------------
  def skill_can_use?(skill_id)
    #if not skill_learn?(skill_id)
    #  return false
    #end
    return super
  end
end

#========================================================================
# ■ Game_BattleAction
#-------------------------------------------------------------------------
#  アクション (戦闘中の行動) を扱うクラスです。このクラスは Game_Battler クラ
# スの内部で使用されます。
#========================================================================

class Game_BattleAction
  
  alias :xp_original_initialize :initialize
  def initialize
    xp_original_initialize()
    @turn_move_times = 0
  end
  #-----------------------------------------------------------------------
  # ● クリア判定
  #-----------------------------------------------------------------------
  def cleared?
    if @speed == 0 && @kind == 0 && @basic == 3 && @skill_id == 0 && @item_id == 0 && @target_index == -1 && @forcing == false
      return true
    else
      return false
    end
  end
  
end


#=========================================================================
# ■ Game_Party
#--------------------------------------------------------------------------
#  パーティを扱うクラスです。ゴールドやアイテムなどの情報が含まれます。このク
# ラスのインスタンスは $game_party で参照されます。
#=========================================================================

class Game_Party
  #----------------------------------------------------------------------
  # ●
  #----------------------------------------------------------------------
  def get_index_by(actor)
    for i in 0...@actors.size()
      if @actors.equal?(actor)
        return i
      end
    end
    return nil
  end
end


#==========================================================================
# ■ Game_Troop
#--------------------------------------------------------------------------
#  トループを扱うクラスです。このクラスのインスタンスは $game_troop で参照さ
# れます。
#==========================================================================

class Game_Troop
  #----------------------------------------------------------------------
  # ●
  #----------------------------------------------------------------------
  def get_index_by(enemy)
    for i in 0...@enemies.size()
      if @enemies.equal?(enemy)
        return i
      end
    end
    return nil
  end
end

#==========================================================================
# ■ Scene_Battle (分割定義 4)
#--------------------------------------------------------------------------
#  バトル画面の処理を行うクラスです。
#==========================================================================

class Scene_Battle
  
  #----------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
  #----------------------------------------------------------------------
  alias original_update_phase4_step6_before_counter_action update_phase4_step6
  def update_phase4_step6
    original_update_phase4_step6_before_counter_action()
    clear_counter_action(@active_battler)
    activate_counter_action(@action_battlers)
  end
  #----------------------------------------------------------------------
  #
  #----------------------------------------------------------------------
  def clear_counter_action(active_battler)
    #既にカウンターを行ったバトラーのカウンターアクションをクリア
    if active_battler.nil?
      return
    end
    if !active_battler.counter_acting?
      return
    end
    active_battler.counter_action.clear
    return
  end
  #----------------------------------------------------------------------
  #
  #----------------------------------------------------------------------
  def activate_counter_action(action_battlers)   
    #カウンター状態になったバトラーを一回だけアクションバトラーズにアンシフト
    if !action_battlers[0].nil?
      if action_battlers[0].counter_acting?#既にカウンター行動待機バトラーが居た場合
        return
      end
    end
    counter_battlers = []
    $game_party.actors.each{|a|
      if a.counter_acting?
        counter_battlers.push(a)
      end
    }
    $game_troop.enemies.each{|e|
      if e.counter_acting?
        counter_battlers.push(e)
      end
    }
    counter_battlers = counter_battlers.sort_by{|b| b.agi}
    counter_battlers.each{ |b|
      action_battlers.unshift(b)
    }
    #p action_battlers.collect{|b| b.name}
    return
  end
end


#=============================
#CPバトル対応。
#ターンバトルの人は必要なし。
#=============================
class Game_Battler
  if method_defined?(:cp)
    alias original_cp_before_counter_action cp
    def cp
      if self.counter_acting?
        return 65535
      else
        return original_cp_before_counter_action()
      end
    end
  end
  if method_defined?(:cp=)
    alias original_cp_before_counter_action= cp=
    def cp=(n)
      if self.counter_acting?
        return
      else
        self.original_cp_before_counter_action = n
      end
    end
  end
end
#=============================
#ここまで。
#=============================


  #---------------------------------------------------------------------
  #
  #---------------------------------------------------------------------

module RPG
  class State
    def name
      if @new_name.nil?
        name_setting()
      end
      return @new_name
    end
   
    def options
      if @options.nil?
        name_setting()
      end
      return @options
    end
   
    def name_setting
      names = @name.split(/ +-/)
      @new_name = names.shift
      if @new_name.nil?
        @new_name = ''
      end
      @options = names
      if @options.nil?
        @options = []
      end
    end
   
  end
end
[/pre]


梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2017-3-26 20:26:19 | 显示全部楼层
本帖最后由 soulsaga 于 2017-3-26 20:41 编辑
89444640 发表于 2017-3-26 20:03
说明写的是
-crp  (physical)=>遭到通常攻击,物理攻击的时候反击、
-cas (skill)=>使用编号为X的技能


对了..问题关键似乎是这里
when 'p'
              if skill.nil? || skill.atk_f >= 100

攻击力F低过100不被视为物理攻击

解決方法是加个名为物理攻击的属性用作判断..
然后在
if skill.nil? || skill.atk_f >= 100 后面的skill.atk_f >= 100改为判断该属性ID就行..这个你懂的..

至於魔反是不是也是这个原因就不知道了..
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2017-3-26 20:34:45 | 显示全部楼层
本帖最后由 soulsaga 于 2017-3-27 08:20 编辑
89444640 发表于 2017-3-26 20:30
- -b靠!
我改了个100的试了下果然行了。
但是这样敌人伤害又破表了……


[pre lang="ruby"]if opt =~ /^cr([pmedns])([0-9]*)/
            kind = $1
            id = $2.to_i
            react_cond = true
            case kind
            when 'p'
              if skill.nil? || skill.atk_f >= 100
                react_succ = true
              end
            when 'm'
              if !skill.nil? && skill.int_f >= 100
                react_succ = true
              end
              when 'q'
              if skill.nil? || skill.int_f >= 1 || skill.atk_f >= 1
                react_succ = true
              end[/pre]

改成这样..或且做个属性判断也行..
这样普攻,物魔技能都应该会反了..

s不行呢..已经有了..你自己随便填个吧..

反击必定命中Game_Battler 3脚本125行改成下面这样

[pre lang="ruby"]$counter_act = "" if !$counter_act
    if hit_result == true or $counter_act == "反击"
$counter_act = ""
[/pre]
然后反击脚本
搜self.counter_action.skill_id = act_id
上面插入$counter_act = "反击"

未测试..不知是否有效..

点评

不行 - -end多了还是怎么的,无法执行  发表于 2017-3-26 22:43
如果不行记得留言..先睡了..  发表于 2017-3-26 21:59
本楼加了必定命中的脚本..  发表于 2017-3-26 21:56
另外那个反击miss的问题,怎么改成必定命中,都反击了还miss太蛋疼了。  发表于 2017-3-26 20:58
那就Z把 zhong文的中缩写--b这得多强迫症 我先把动画整回来,因为不能用做好的动画都删了--b 型号素材我没动。  发表于 2017-3-26 20:58

评分

参与人数 1星屑 +50 收起 理由
RyanBern + 50 塞糖

查看全部评分

回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2017-3-26 12:00:48 | 显示全部楼层
如果是和你用的其他脚本冲突的话..大概要上传脚本文件比较好让大神找出冲突的原因吧..

点评

那个好像是用敌人的技能反击,因为我的动画好多显示有方向性或者带敌人动作的,因此不能用。  发表于 2017-3-26 20:05
受けたスキルをそのまま反击 意思大概是敌人用这个技能打你的话就会自动反击  发表于 2017-3-26 19:52
- -b目前用到的脚本和 异常状态以小图标显示 这个帖子附件中的脚本一样。我用哪个做反击测试就没问题  发表于 2017-3-26 19:48
O 这样啊..可能不关脚本事..看看数据库的设定?  发表于 2017-3-26 19:47
这不就是冲突么..  发表于 2017-3-26 19:46
回复

使用道具 举报

梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
 楼主| 发表于 2017-3-26 20:03:51 | 显示全部楼层
soulsaga 发表于 2017-3-26 12:00
如果是和你用的其他脚本冲突的话..大概要上传脚本文件比较好让大神找出冲突的原因吧.. ...

说明写的是
-crp  (physical)=>遭到通常攻击,物理攻击的时候反击、
-cas (skill)=>使用编号为X的技能
数据库截图
01.png
写的是
反击 -crp -cas1022
中间必须有空格否则不能生效
测试用敌人技能
这个肯定算物理技能吧
02.png
魔法技能就更别提了,任何一个默认的火球魔法都可以测试,就是死活不给我反击!


本来还做了一个魔反的技能,用魔法反击的时候取消物理特技反击,用物理反击的时候取消魔法反击,用的那个光镜的动作,第一次设置好了,测试时候好好的,然后不知哪根筋不对突然就不能用了,开新进度也不行
我说忍了取消魔法反击了吧,结果
现在这脚本居然只能反击普通攻击。实用性大打折扣!太可恶了!

点评

状态是给自己放的,没问题,否则就不会反击普通攻击了。敌人那个算物理技能吧?不会算魔法技能吧? 调试脚本?  发表于 2017-3-26 20:25
另外状态设定那应该也不用+同一个状态吧?  发表于 2017-3-26 20:23
对了..特技中的状态好像是给敌人的?这个你这样设自己应该没有这状态吧?  发表于 2017-3-26 20:16
其实你可以学一下调试脚本..在关键地方插入p xxx以找出有问题的地方..  发表于 2017-3-26 20:11
回复

使用道具 举报

梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
 楼主| 发表于 2017-3-26 20:30:05 | 显示全部楼层
本帖最后由 89444640 于 2017-3-26 20:32 编辑
soulsaga 发表于 2017-3-26 20:26
对了..问题关键似乎是这里
when 'p'
              if skill.nil? || skill.atk_f >= 100


- -b靠!
我改了个100的试了下果然行了。
但是这样敌人伤害又破表了……
看我给改成1- -b
我再测试一下魔法击,倒霉催的帕秋莉魔法反击让我删了,还得重新设置。

有没有方法设定成同时反击魔法和物理的?

点评

- -b 用cr什么反击所有攻击?  发表于 2017-3-26 20:33
有想像力自然就有..  发表于 2017-3-26 20:32
回复

使用道具 举报

梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
 楼主| 发表于 2017-3-26 23:12:01 | 显示全部楼层
本帖最后由 89444640 于 2017-3-26 23:15 编辑
soulsaga 发表于 2017-3-26 20:34
if opt =~ /^cr()([0-9]*)/
            kind = $1
            id = $2.to_i


出现了新的问题,这个脚,只能让队伍中一个角色拥有某一对应的反击状态,比如你反击魔法了,其他人再上反击魔法的反击状态,就肯定显示失误……但是其他人上比如物理反击,则不会出现失误,
如果物理魔法均反击,则其他角色无论如何也加不上反击状态。
不对错了……不能抵抗忘了点上- -b 我还是睡觉去吧

点评

似乎是有……我是pi3弄的就没画。  发表于 2017-3-27 13:47
知道有没什么遊戏里有这些么..陨石单数或复数也行..  发表于 2017-3-27 09:55
对了..我想找陨石降下爆炸的像素动画..找了好久都没找到..  发表于 2017-3-27 09:55
不过前提是知道哪里是关键..完全脚本盲大概也找不着..  发表于 2017-3-27 08:44
调试脚本就是..在关键的IF下插入显示信息代码..来找出问题是IF还是其他原因.  发表于 2017-3-27 08:44
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2017-3-27 08:28:57 | 显示全部楼层
89444640 发表于 2017-3-26 23:12
出现了新的问题,这个脚,只能让队伍中一个角色拥有某一对应的反击状态,比如你反击魔法了,其他人再上反 ...

另外反击脚本开注译没有提到的..脚本有写到
crn #相手攻撃無効カウンター 这个看不懂
crs # 回避時カウンター回避了对方的攻击才会触发反击
crd 死亡カウンター 角色死亡时才会触发反击..

不过你或许已经知道了?

点评

不知道==回头给敌方设置用吧。  发表于 2017-3-27 13:44
回复

使用道具 举报

梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
 楼主| 发表于 2017-3-27 13:59:33 | 显示全部楼层
本帖最后由 89444640 于 2017-3-27 15:45 编辑
soulsaga 发表于 2017-3-27 08:28
另外反击脚本开注译没有提到的..脚本有写到
crn #相手攻撃無効カウンター 这个看不懂
crs # 回避時カウン ...


像素的我没画,应该商业的里面有,一时想不起来哪个游戏有像素版本的。
看看这个pi3做的能不能凑合,这个是整合好的动画,音效自己找合适的替换。

点评

哎..我已经找到合用的了.  发表于 2017-3-27 14:49
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部