查看: 4708|回复: 1

[原创发布] 【VA脚本】状态的触发次数 + 伤害反射

[复制链接]
梦石
0
星屑
2920
在线时间
713 小时
注册时间
2010-7-25
回帖
659

开拓者

发表于 2018-7-7 15:13:57 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 jianyulei 于 2018-7-9 15:10 编辑

前置脚本(必须)
[pre lang="ruby"]
#前置脚本  BY老香蕉
# 20180709
#这脚本是 “状态的触发次数”、“伤害反射” 的前置脚本

class Game_Battler < Game_BattlerBase
if !respond_to?("item_apply_20180709")
alias item_apply_20180709 item_apply
  def item_apply(user, item)
   $item_panding = item
   item_apply_20180709(user, item)
  end  
end  
end
class Game_BattlerBase
  def duiyou?(user) #判断目标是否是队友,只能在能判定目标时使用
    return true if (user.enemy? && self.enemy?) or (user.actor? && self.actor?)
    return false
  end
end

[/pre]



状态的触发次数
[pre lang="ruby"]

=begin
状态的触发次数  by老香蕉
更新时间:20180709
需要使用“前置脚本”才可使用


给状态进行备注之后,状态将会有触发次数的限制,次数将会在特定条件下减少,当次数用尽
状态会被解除。


写法:
<触发次数 "受攻击" 5>
"受攻击"是触发的条件,这一栏有多个写法:
"攻击" :状态拥有者只要对敌人行动过就触发。
"受攻击" :条件类似"攻击"
"伤害" :状态拥有者进行攻击并最终造成对方HP至少1点有效伤害则触发。
"受伤害" :条件类似"受伤害"
"治疗" :状态拥有者对目标的HP进行成功的治疗(HP至少恢复1)则触发。
"受治疗" :条件类似"治疗"

写法中,最后的5是表示状态在附加时获得的初始次数值,每触发一次减少1。


你可以用$game_actors[1].state_cishu[57] -= 1 来自行修改某状态的次数值。
如果是减少的话别忘记在下一句加上:
$game_actors[1].remove_state(57) if $game_actors[1].state_cishu[57] <= 0
让次数为0状态被解除。

也或者在指定的脚本位置参照以下写法手动添加:
   if respond_to?("update_state_cishu")
     $fanshe_jieduan = "反射";$fanshe_jieduan1 = "受反射"
     update_state_cishu(user, item)
   end
以增加新的触发条件。

=end

class Game_BattlerBase
attr_accessor :state_cishu
alias clear_states_cishu clear_states
  def clear_states
    clear_states_cishu
    @state_cishu = {}
  end
alias erase_state_cishu erase_state
  def erase_state(state_id)
    erase_state_cishu(state_id)
    @state_cishu.delete(state_id)
  end
end
class Game_Battler < Game_BattlerBase
alias item_apply_cishu item_apply
def item_apply(user, item)
  $fanshe_jieduan = "受攻击" if !item.damage.recover? && !duiyou?(user)
  $fanshe_jieduan1 = "攻击" if  !item.damage.recover? && !duiyou?(user)
  update_state_cishu(user, item)
  item_apply_cishu(user, item)
end

alias execute_damage_cishu execute_damage
  def execute_damage(user)
    item = $item_panding
    execute_damage_cishu(user)
    $fanshe_jieduan = "受伤害" if @result.hp_damage > 0
    $fanshe_jieduan1 = "伤害" if @result.hp_damage > 0
    $fanshe_jieduan = "受治疗" if @result.hp_damage < 0
    $fanshe_jieduan1 = "治疗" if @result.hp_damage < 0
    update_state_cishu(user, item)
  end

  def update_state_cishu(user, item)
    states.each do |state|
      if state.note.match(/<触发次数 (\S*) (\S*)>/)
        if $fanshe_jieduan != nil && $fanshe_jieduan == eval($1)
         @state_cishu[state.id] -= 1 if @state_cishu[state.id] > 0
         remove_state(state.id) if @state_cishu[state.id] == 0
        end
      end
    end
    user.states.each do |state|
      if state.note.match(/<触发次数 (\S*) (\S*)>/)
        if $fanshe_jieduan1 != nil && $fanshe_jieduan1 == eval($1)
         user.state_cishu[state.id] -= 1 if user.state_cishu[state.id] > 0
         user.remove_state(state.id) if user.state_cishu[state.id] == 0
        end
      end
    end
  end
  
alias reset_state_counts_cishu reset_state_counts
  def reset_state_counts(state_id)  #附加状态时生成状态次数
    state = $data_states[state_id]
    if state.note.match(/<触发次数 (\S*) (\S*)>/)
      @state_cishu[state.id] = eval($2)
    end   
    reset_state_counts_cishu(state_id)
  end

end#class  

[/pre]


伤害反射
[pre lang="ruby"]
=begin
伤害反射  by老香蕉
更新时间:20180709
需要使用“前置脚本”才可使用


给状态进行备注,备注后的状态将变成反射状态,按照特定条件将自身受到的特定伤害
反射回敌人身上,反射成功有特殊音效。

写法:
<反射 self.mat*0.5 "魔法" 3>
  self.mat 是反射的伤害量,self是发动反射的角色,mat是魔法攻击力的简写,也就是说
这次反射会让发动反射的角色减少其魔法攻击力50%的伤害,并让攻击方受到同等的伤害,
反射的伤害不会超过发动反射角色受到的最大伤害,如果攻击者的攻击力高于反射量,则
超过的伤害会给发动反射的角色造成正常损伤。本脚本只能反射大于0的伤害。
  "魔法" 是指只能反射魔法类型的伤害,可以改为"物理"、物魔、"全部","物魔"是指物理
+魔法,而"全部"则是连同必中类型的攻击都能反射,攻击者的物理或魔法防御、减伤效果不
会降低他所受到的反射伤害。
  3是指反射的伤害的属性是数据库的用语栏中03号属性,用于敌人进行属性伤害增减的计算,
该项填0的话则表示反射的伤害是攻击者对发动反射的角色进行攻击的属性。
写法中,所有项目之间有个空格。

如果和我的 《状态的触发次数》脚本一起使用的话可以给反射状态备注<触发次数 "反射" 2>,
也就是该状态最多可以进行2次反射。同样你也可以用self.state_cishu[state.id]命令
来修改状态的使用次数。

=end

class Game_Battler < Game_BattlerBase

alias execute_damage_fanshe execute_damage
def execute_damage(user)
  item = $item_panding
  if @result.hp_damage > 0
    self.feature_objects.each do |object|
      if object.note.match(/<反射 (\S*) (\S*) (\S*)>/)
        o_k = false  
        o_k = true if eval($2) == "全部"
        o_k = true if (item.physical? or item.magical?) && eval($2) == "物魔"
        o_k = true if eval($2) == "物理" && item.physical?
        o_k = true if eval($2) == "魔法" && item.magical?
        if o_k == true
          fanshe_sx = eval($3) #获得反射属性
          if eval($3) == 0
            if item.damage.element_id < 0
              fanshe_sx = user.atk_elements
            else
              fanshe_sx = item.damage.element_id
            end  
          end  
          if eval($1) > @result.hp_damage #获得反射伤害
            fanshe_sh = @result.hp_damage
          else
            fanshe_sh = eval($1)
          end
          fanshe_sh = (fanshe_sh * self.element_rate(fanshe_sx)).to_i
          @result.hp_damage -= fanshe_sh; #计算伤害     
          Audio.se_play("Audio/SE/saint9.ogg", 100, -25) #这里修改音效
          user.change_hp(-fanshe_sh, true)
          text = sprintf("对攻击方反射造成%s伤害。", (fanshe_sh))
          SceneManager.scene.instance_variable_get(:@log_window).add_text(text)
          SceneManager.scene.instance_variable_get(:@log_window).wait_and_clear
          if respond_to?("update_state_cishu") #有“状态次数脚本”的话增加“反射”作为条件
            $fanshe_jieduan = "反射";$fanshe_jieduan1 = "被反射"
            update_state_cishu(user, item)
          end
        end
      end
    end
  end  
  execute_damage_fanshe(user)
end
end

[/pre]



评分

参与人数 1赞 +1 收起 理由
JasperCrazy + 1 很有帮助,多谢了

查看全部评分

梦石
0
星屑
181
在线时间
68 小时
注册时间
2019-1-14
回帖
11
发表于 2021-1-18 15:50:38 | 显示全部楼层
本帖最后由 JasperCrazy 于 2021-1-18 16:13 编辑

大佬,时隔多年,发现有BUG。
例如写了<触发次数 "攻击" 1> ,在攻击过一次后此状态解除,重新附加此状态,随后无论什么行动如治疗自己,也会解除状态。
<触发次数 "受攻击" 1>也有类似的情况,解除过一次后,治疗自己或攻击对方都会解除状态。

找到原因了。
将状态的触发次数54-55行:
  $fanshe_jieduan = "受攻击" if !item.damage.recover? && !duiyou?(user)
  $fanshe_jieduan1 = "攻击" if  !item.damage.recover? && !duiyou?(user)
改为(脚本新手只会这种写法):
  if !item.damage.recover? && !duiyou?(user)
    $fanshe_jieduan = "受攻击"
  else $fanshe_jieduan = "刷新"
  end
  if !item.damage.recover? && !duiyou?(user)
    $fanshe_jieduan1 = "攻击"
  else $fanshe_jieduan1 = "刷新"
  end
让 $fanshe_jieduan的值刷新一下就不会出错了
回复 1 0

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部