Project1
标题: 无用之物 [打印本页]
作者: y967 时间: 2026-5-23 07:33
标题: 无用之物 本帖最后由 y967 于 2026-5-27 08:09 编辑
1,金钟罩,任何伤害为0,包括一切无视效果都为0
#==============================================================================
# ■ 金钟罩状态:拥有此状态时,受到的伤害恒为0
#==============================================================================
module GoldenBell
# ★ 金钟罩对应的状态ID(根据你在数据库里设置的状态编号修改)
STATE_ID = 52
end
class Game_Battler
#--------------------------------------------------------------------------
# ● 拦截攻击造成的伤害
#--------------------------------------------------------------------------
alias goldenbell_attack_effect attack_effect unless method_defined?( :goldenbell_attack_effect )
def attack_effect( attacker)
result = goldenbell_attack_effect( attacker)
# 如果伤害数值大于0,并且自身拥有金钟罩状态
if @damage .is_a ?( Numeric ) && @damage > 0 && state?( GoldenBell::STATE_ID )
@hp += @damage # 撤销已经扣减的HP
@damage = 1 # 显示伤害改为0
end
return result
end
#--------------------------------------------------------------------------
# ● 拦截技能造成的伤害
#--------------------------------------------------------------------------
alias goldenbell_skill_effect skill_effect unless method_defined?( :goldenbell_skill_effect )
def skill_effect( user, skill)
result = goldenbell_skill_effect( user, skill)
if @damage .is_a ?( Numeric ) && @damage > 0 && state?( GoldenBell::STATE_ID )
@hp += @damage
@damage = 0
end
return result
end
end
#==============================================================================
# ■ 金钟罩状态:拥有此状态时,受到的伤害恒为0
#==============================================================================
module GoldenBell
# ★ 金钟罩对应的状态ID(根据你在数据库里设置的状态编号修改)
STATE_ID = 52
end
class Game_Battler
#--------------------------------------------------------------------------
# ● 拦截攻击造成的伤害
#--------------------------------------------------------------------------
alias goldenbell_attack_effect attack_effect unless method_defined?( :goldenbell_attack_effect )
def attack_effect( attacker)
result = goldenbell_attack_effect( attacker)
# 如果伤害数值大于0,并且自身拥有金钟罩状态
if @damage .is_a ?( Numeric ) && @damage > 0 && state?( GoldenBell::STATE_ID )
@hp += @damage # 撤销已经扣减的HP
@damage = 1 # 显示伤害改为0
end
return result
end
#--------------------------------------------------------------------------
# ● 拦截技能造成的伤害
#--------------------------------------------------------------------------
alias goldenbell_skill_effect skill_effect unless method_defined?( :goldenbell_skill_effect )
def skill_effect( user, skill)
result = goldenbell_skill_effect( user, skill)
if @damage .is_a ?( Numeric ) && @damage > 0 && state?( GoldenBell::STATE_ID )
@hp += @damage
@damage = 0
end
return result
end
end
2,绝对反击,我方血量 < 50% 时造成敌人当前血量一半伤害
# ============================================================
# 自定义技能:我方血量 < 50% 时造成敌人当前血量一半伤害
# 技能ID、动画ID 请根据你的数据库修改
# ============================================================
class Game_Battler
CUSTOM_SKILL_ID = 57 # 你的技能编号
CUSTOM_ANIM_ID = 34 # 动画编号
alias custom_skill_effect skill_effect unless method_defined?( :custom_skill_effect )
def skill_effect( user, skill)
# 如果是目标技能,并且使用者为我方角色且血量低于一半
if skill.id == CUSTOM_SKILL_ID &&
user.is_a ?( Game_Actor) &&
user.hp < user.maxhp / 2
# 伤害 = 目标当前生命值的一半
self .damage = self .hp / 2
self .hp -= self .damage
# 播放指定动画
self .animation_id = CUSTOM_ANIM_ID
# 如果你还需要技能原本的状态附加、公共事件等,
# 可以在这里自行添加,例如:
# skill.plus_state_set.each { |id| self.add_state(id) }
# $game_temp.common_event_id = skill.common_event_id if skill.common_event_id > 0
return true # 技能成功
else
# 非指定技能或其他情况,执行原方法
return custom_skill_effect( user, skill)
end
end
end
# ============================================================
# 自定义技能:我方血量 < 50% 时造成敌人当前血量一半伤害
# 技能ID、动画ID 请根据你的数据库修改
# ============================================================
class Game_Battler
CUSTOM_SKILL_ID = 57 # 你的技能编号
CUSTOM_ANIM_ID = 34 # 动画编号
alias custom_skill_effect skill_effect unless method_defined?( :custom_skill_effect )
def skill_effect( user, skill)
# 如果是目标技能,并且使用者为我方角色且血量低于一半
if skill.id == CUSTOM_SKILL_ID &&
user.is_a ?( Game_Actor) &&
user.hp < user.maxhp / 2
# 伤害 = 目标当前生命值的一半
self .damage = self .hp / 2
self .hp -= self .damage
# 播放指定动画
self .animation_id = CUSTOM_ANIM_ID
# 如果你还需要技能原本的状态附加、公共事件等,
# 可以在这里自行添加,例如:
# skill.plus_state_set.each { |id| self.add_state(id) }
# $game_temp.common_event_id = skill.common_event_id if skill.common_event_id > 0
return true # 技能成功
else
# 非指定技能或其他情况,执行原方法
return custom_skill_effect( user, skill)
end
end
end
----优点,在反击时还可以播放一个动画,比如一个镜头大吼一声,而且血量大于50%时,伤害按原公式计算,不影响,该脚本短小精悍,冲突小。
3,法术反弹
#==============================================================================
# ★ 反弹伤害技能 (RMXP)
# 功能:拥有指定状态的角色/敌人在受到技能伤害时,将伤害的 50% 反弹给攻击方。
# 反弹伤害的数字会在原伤害显示结束后独立弹出。
#==============================================================================
module ReboundConfig
# 拥有此状态的 battler 将获得伤害反弹效果
REBOUND_STATE_ID = 21 # <<<< 请改成你游戏中实际的状态 ID
# 反弹伤害的比例(0.5 表示 50%,可修改为 0.3、0.7 等)
REBOUND_RATE = 0.5
end
#==============================================================================
# ■ Game_Battler (修改技能效果方法,添加反弹逻辑)
#==============================================================================
class Game_Battler
# 用于临时存放待显示的反弹伤害
attr_accessor :pending_rebound_damage
alias rebound_skill_effect skill_effect
def skill_effect( user, skill)
# 先调用原始效果,确保伤害计算正常进行
effective = rebound_skill_effect( user, skill)
# 仅在技能有效、目标存活、且自身拥有反弹状态时触发
if effective and self .hp > 0 and user.hp > 0 and self .state ?( ReboundConfig::REBOUND_STATE_ID )
# 仅当最终伤害大于 0 时才反弹
if self .damage .is_a ?( Numeric ) && self .damage > 0
rebound = ( self .damage * ReboundConfig::REBOUND_RATE ) .to_i
rebound = 1 if rebound < 1 # 至少有 1 点伤害
# 将反弹伤害直接扣除攻击者的 HP
user.hp -= rebound
# 把反弹伤害存入攻击者的临时变量,等待延迟显示
user.pending_rebound_damage = rebound
end
end
effective
end
end
#==============================================================================
# ■ Scene_Battle (在伤害显示步骤中追加反弹伤害的弹出)
#==============================================================================
class Scene_Battle
# 保存原有的 update_phase4_step5 方法
alias rebound_update_phase4_step5 update_phase4_step5
def update_phase4_step5
# 1. 先执行原版的伤害显示逻辑(目标受到的伤害会先弹出)
rebound_update_phase4_step5
# 2. 在所有正常伤害显示完毕后,处理反弹伤害
# 遍历所有队伍成员和敌人
all_battlers = $game_party .actors + $game_troop .enemies
all_battlers.each do |battler|
if battler.pending_rebound_damage != nil && battler.pending_rebound_damage > 0
# 设置伤害显示用的变量
battler.damage = battler.pending_rebound_damage
battler.damage_pop = true
# 临时保存反弹伤害值,通过覆写伤害显示颜色可以区分(此处用普通伤害颜色)
battler.critical = false # 非暴击,保持普通颜色
# 立即强制该 battler 进入伤害动画显示流程
battler.damage_pop = true
# 清除临时变量,确保只显示一次
battler.pending_rebound_damage = nil
# 因为原版 refresh 后可能不会立即绘制伤害,这里手动触发一次伤害动画
if battler.is_a ?( Game_Actor)
@status_window .refresh
@active_battler = battler # 暂时设为活动战斗者,确保 sprite 刷新
# 重置 phase4 步骤以重新进入显示流程(简单有效)
@phase4_step = 5
end
end
end
end
end
#==============================================================================
# ★ 反弹伤害技能 (RMXP)
# 功能:拥有指定状态的角色/敌人在受到技能伤害时,将伤害的 50% 反弹给攻击方。
# 反弹伤害的数字会在原伤害显示结束后独立弹出。
#==============================================================================
module ReboundConfig
# 拥有此状态的 battler 将获得伤害反弹效果
REBOUND_STATE_ID = 21 # <<<< 请改成你游戏中实际的状态 ID
# 反弹伤害的比例(0.5 表示 50%,可修改为 0.3、0.7 等)
REBOUND_RATE = 0.5
end
#==============================================================================
# ■ Game_Battler (修改技能效果方法,添加反弹逻辑)
#==============================================================================
class Game_Battler
# 用于临时存放待显示的反弹伤害
attr_accessor :pending_rebound_damage
alias rebound_skill_effect skill_effect
def skill_effect( user, skill)
# 先调用原始效果,确保伤害计算正常进行
effective = rebound_skill_effect( user, skill)
# 仅在技能有效、目标存活、且自身拥有反弹状态时触发
if effective and self .hp > 0 and user.hp > 0 and self .state ?( ReboundConfig::REBOUND_STATE_ID )
# 仅当最终伤害大于 0 时才反弹
if self .damage .is_a ?( Numeric ) && self .damage > 0
rebound = ( self .damage * ReboundConfig::REBOUND_RATE ) .to_i
rebound = 1 if rebound < 1 # 至少有 1 点伤害
# 将反弹伤害直接扣除攻击者的 HP
user.hp -= rebound
# 把反弹伤害存入攻击者的临时变量,等待延迟显示
user.pending_rebound_damage = rebound
end
end
effective
end
end
#==============================================================================
# ■ Scene_Battle (在伤害显示步骤中追加反弹伤害的弹出)
#==============================================================================
class Scene_Battle
# 保存原有的 update_phase4_step5 方法
alias rebound_update_phase4_step5 update_phase4_step5
def update_phase4_step5
# 1. 先执行原版的伤害显示逻辑(目标受到的伤害会先弹出)
rebound_update_phase4_step5
# 2. 在所有正常伤害显示完毕后,处理反弹伤害
# 遍历所有队伍成员和敌人
all_battlers = $game_party .actors + $game_troop .enemies
all_battlers.each do |battler|
if battler.pending_rebound_damage != nil && battler.pending_rebound_damage > 0
# 设置伤害显示用的变量
battler.damage = battler.pending_rebound_damage
battler.damage_pop = true
# 临时保存反弹伤害值,通过覆写伤害显示颜色可以区分(此处用普通伤害颜色)
battler.critical = false # 非暴击,保持普通颜色
# 立即强制该 battler 进入伤害动画显示流程
battler.damage_pop = true
# 清除临时变量,确保只显示一次
battler.pending_rebound_damage = nil
# 因为原版 refresh 后可能不会立即绘制伤害,这里手动触发一次伤害动画
if battler.is_a ?( Game_Actor)
@status_window .refresh
@active_battler = battler # 暂时设为活动战斗者,确保 sprite 刷新
# 重置 phase4 步骤以重新进入显示流程(简单有效)
@phase4_step = 5
end
end
end
end
end
----该脚本优点在于反弹的法术会略晚于技能伤害,但不能变色,搓不出来变色,略有遗憾,还可以加入延时计时器,没做,可以自定义反弹伤害弹出延时时间,总之三个脚本呢都短小精悍,白板工程都可以用,也可以一起用无冲突,目前为止。
作者: 无忧谷主幻 时间: 2026-5-23 07:54
我记得我的工程应该有技能书脚本吧
100%免伤,直接这样就可以了
# 防御修正
self .damage /= 2 if self .guarding ?
self .damage = 0 if self .state ?( 101 ) # 101号状态触发100%免伤
end
# 防御修正
self .damage /= 2 if self .guarding ?
self .damage = 0 if self .state ?( 101 ) # 101号状态触发100%免伤
end
或者你想要无敌再加无视敌方状态,我记得也发过无敌脚本
魔法盾的话,你看看这是不是你要的
https://rpg.blue/thread-285921-1-1.html
作者: 灯笼菜刀王 时间: 2026-5-23 09:47
本帖最后由 灯笼菜刀王 于 2026-5-23 10:03 编辑
全在 alias skill_effect ,早晚互相打架哦
尽量去默认脚本底下增减吧, 否则容易像你之前那贴, 找不到实际生效的位置在哪里
三个全在默认公式里 , self.hp -= self.damage 之前, 塞入一个判断句就行了
1, 塞入 self.damage = 0 if self.state?(金钟罩ID) #有三个位置,attack_effect ,skill_effect,item_effect
2, 塞入 self.damage = self.hp / 2 if skill.id == 10086 and user.hp < self.maxhp / 2 #这句只能用于skill_effect
3, 18-42行去掉, 后面的部分留着用于延迟显示伤害, 然后塞入
(user.hp -= (a=self.damage/2) ;user.pending_rebound_damage = a) if self.state?(反弹ID) and self.hp > self.damage #这句只能用于skill_effect
这三句可以全塞到一起, 不过1和2的效果是冲突的, 谁写在下面谁的优先度更高, 从理论上来说, 金钟罩的优先度应该是最高的, 所以要把它的判断放最下面
以后还有 self.damage = 这种修改, 就自己按优先度来安排插入顺序即可
-----------------
技能书是啥? 使用后学会对应技能? 这不是道具附带公共事件就可以做到了么?
想谁用给谁学技能? 那就用万能的状态判断法, 使用道具时附带一个没卵用的状态, 然后附带公共事件, 全队一个一个判断,带有这个状态的学会该技能,同时清除状态就行了
作者: 灯笼菜刀王 时间: 2026-5-23 10:41
本帖最后由 灯笼菜刀王 于 2026-5-24 12:53 编辑
想自定义设置多个吸血吸蓝技能, 那就在main前塞入这个脚本
module RPG
class Skill
def description
description = @description.split(/#/)[0]
return description != nil ? description : ''
end
def 吸血 ;@description[/XHP\=(\d+)\%(\d*)/] ;return $1 ? [$1,$2] : nil ;end
def 吸蓝 ;@description[/XSP\=(\d+)\%(\d*)/] ;return $1 ? [$1,$2] : nil ;end
end
end
class Game_Battler
attr_accessor :pending_rebound_damage
alias caidao_skill_effect skill_effect
def skill_effect(user, skill)
old_hp = self.hp
eff = caidao_skill_effect(user, skill)
$game_variables[1] = self.damage.is_a?(Numeric) ? self.damage : 0
if eff and (a=self.damage).is_a?(Numeric) and a > 0
(a=self.damage / 2 ;self.hp -= a ;self.damage += a ;
self.pending_rebound_damage = "#{self.damage}增伤#{a}") if user.state?(10086) and rand(100) < 50
if (r=skill.吸血)
m,n = r[0].to_i,r[1].to_i ;f = [self.damage * m / 100,old_hp]
f.push(n) if n > 0 ;a = f.min
user.hp += a ;#user.pending_rebound_damage = "吸血#{a}"
end
if (r=skill.吸蓝)
m,n = r[0].to_i,r[1].to_i ;f = [self.damage * m / 100,old_hp]
f.push(n) if n > 0 ; a = f.min
user.sp += a ;#user.pending_rebound_damage = "吸蓝#{a}"
end
end ;return eff
end
end 复制代码
需要用到你3号脚本的伤害显示, 不过因为只能显示一个伤害, 所以后面的会覆盖前面的, 笑, 不想显示吸血吸蓝的伤害, 那就把 user.pending_rebound_damage = "吸血#{a}" 这句删除即可
然后,设置方面, 到数据库, 技能的说明栏里 加上 XHP=50%9999 这样就是吸收造成伤害的50%hp,上限9999, XSP=12% 这样就是吸收造成伤害的12%SP, 后面不写数字时无上限, 吸血吸蓝可以写一起
栗子 十字斩 : 战士的特殊技。不死系怪物特效。#XHP=50%9999 XSP=12% #号后面的东西不会显示在游戏的技能说明内, 如果你有技能分类脚本, 就把设置夹在 # 和 @ 之间
作者: 灯笼菜刀王 时间: 2026-5-23 11:18
module RPG
class Sprite < ::Sprite
def damage(value, critical)
dispose_damage
if value.is_a?(Numeric)
damage_string = value.abs.to_s ;col = nil
else
damage_string = value.to_s.sub(/\[(\d+)\]/,"") ;col = $1
end
bitmap = Bitmap.new(160, 48)
bitmap.font.name = "Arial Black"
bitmap.font.size = 32
bitmap.font.color.set(0, 0, 0)
bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
if value.is_a?(Numeric) and value < 0
bitmap.font.color.set(176, 255, 144)
elsif col != nil ;a = col.to_i ;
b = a / 1000000 ;c = a / 1000 % 1000 ;d = a % 1000
bitmap.font.color.set(b,c,d)
else
bitmap.font.color.set(255,255,255)
end
bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
if critical
bitmap.font.size = 20
bitmap.font.color.set(0, 0, 0)
bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
bitmap.font.color.set(255, 255, 255)
bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
end
@_damage_sprite = ::Sprite.new(self.viewport)
@_damage_sprite.bitmap = bitmap
@_damage_sprite.ox = 80
@_damage_sprite.oy = 20
@_damage_sprite.x = self.x
@_damage_sprite.y = self.y - self.oy / 2
@_damage_sprite.z = 3000
@_damage_duration = 40
end
end
end 复制代码
把它插入main前
然后, 伤害显示里用中括号圈起来的数字就是RGB的设置颜色, 栗子 "[000162222] 10086" 这样写就可以改变伤害显示的颜色
比如你要的3号脚本, 把 user.pending_rebound_damage = rebound 这句改成 user.pending_rebound_damage = "[162222]#{rebound}" 就可以改颜色了 , 当然, 引号内也可以写汉字
※ 只能用于默认伤害显示, 和任何修改伤害显示的脚本冲突, 例如彩虹剑
作者: 无忧谷主幻 时间: 2026-5-23 18:43
本帖最后由 无忧谷主幻 于 2026-5-23 18:44 编辑
使用状态法学习技能,其实没必要一个一个做条件分歧
这样就可以了
# 遍历当前队伍中的所有角色
$game_party .actors .each do |actor|
# 检查角色是否处于状态 17
if actor.state ?( 17 )
# 让角色习得技能 1
actor.learn_skill ( 1 ) unless actor.skill_learn ?( 1 )
end
end
# 遍历当前队伍中的所有角色
$game_party .actors .each do |actor|
# 检查角色是否处于状态 17
if actor.state ?( 17 )
# 让角色习得技能 1
actor.learn_skill ( 1 ) unless actor.skill_learn ?( 1 )
end
end
最后记得让全体角色解除状态17
可以多翻翻我的战斗技能以及关联的公共事件,里面有很多有趣的设定
作者: 灯笼菜刀王 时间: 2026-5-23 18:56
想要同时显示一串伤害, 默认是做不到的, 需要改造伤害显示的逻辑, 把它做成数组, 而且也要另外设计移动方式, 避免它们叠在一起
另外赋值伤害显示的时候也不能用正常方式, 所以说, 脚本熟练度不足的话,你就先别想了
作者: 灯笼菜刀王 时间: 2026-5-23 20:53
本帖最后由 灯笼菜刀王 于 2026-5-23 21:17 编辑
这就是我把 伤害判定, 技能动画, 伤害显示, 技能名称显示 塞在一起的产物
5个技能的连续攻击, MISS或者没触发或者目标挂了的时候就会终止, 可以从任意一个技能开始使用(最后一招必须由第四招触发), 条件满足就会自动连下一招, 这个动画一共有5次伤害判定, 所以后面吸血就会有5次
这就是我动画的设置方法, 不备注, 搁段时间我自己看都要懵一会.. 要拿出来做成通用脚本, 那工作量可不一般
作者: 灯笼菜刀王 时间: 2026-5-23 23:01
本帖最后由 灯笼菜刀王 于 2026-5-23 23:06 编辑
要增加你的"回头"时间, 需要改动战斗流程
找到下面这段脚本, 强行插入一个 步骤1.5
#--------------------------------------------------------------------------
# ● 刷新画面 (主回合)
#--------------------------------------------------------------------------
def update_phase4
case @phase4_step
when 1
update_phase4_step1
when 1.5
update_phase4_step1_5
when 2
update_phase4_step2
when 3
update_phase4_step3
when 4
update_phase4_step4
when 5
update_phase4_step5
when 6
update_phase4_step6
end
end
然后, 找到步骤1, 在新回合之前截断 强行把步骤1分成 1 和 1.5
#--------------------------------------------------------------------------
# ● 刷新画面 (主回合步骤 1 : 准备行动)
#--------------------------------------------------------------------------
def update_phase4_step1
# 隐藏帮助窗口
@help_window.visible = false
# 判定胜败
if judge
# 胜利或者失败的情况下 : 过程结束
return
end
# 强制行动的战斗者不存在的情况下
if $game_temp.forcing_battler == nil
# 设置战斗事件
setup_battle_event
# 执行战斗事件中的情况下
if $game_system.battle_interpreter.running?
return
end
end
# 强制行动的战斗者存在的情况下
if $game_temp.forcing_battler != nil
# 在头部添加后移动
@action_battlers.delete($game_temp.forcing_battler)
@action_battlers.unshift($game_temp.forcing_battler)
end
# 未行动的战斗者不存在的情况下 (全员已经行动)
if @action_battlers.size == 0
# 开始同伴命令回合
start_phase2
return
end
@phase4_step = 1.5
end
def update_phase4_step1_5
# 初始化动画 ID 和公共事件 ID
@animation1_id = 0
@animation2_id = 0
@common_event_id = 0
# 未行动的战斗者移动到序列的头部
@active_battler = @action_battlers.shift
# 如果已经在战斗之外的情况下
if @active_battler.index == nil
return
end
# 连续伤害
if @active_battler.hp > 0 and @active_battler.slip_damage?
@active_battler.slip_damage_effect
@active_battler.damage_pop = true
end
# 自然解除状态
@active_battler.remove_states_auto
# 刷新状态窗口
@status_window.refresh
# 移至步骤 2
@phase4_step = 2
end
这样, 毒就会等吸血的工作结束才会上工了
当然, 以上是默认的脚本, 因为这部分也是热门修改地(比如CP制等就完全不适用), 所以能不能有效, 你自己试吧. 笑
作者: y967 时间: 2026-5-24 10:11
本帖最后由 y967 于 2026-5-27 08:09 编辑
AI无用
1,魔法盾代替品
状态,自身血量大于50%时,抵消伤害30%,血量低于50%无效,显示“抵消:XX”字样
AI搓不出来
2,伪连击
状态,做一个状态,技能有50%几率额外造成50%伤害,额外伤害另外显示
3,真连击 笑
血量低于50%,技能结束后有50%几率立即播放一个动画造成额外50%伤害,
作者: 灯笼菜刀王 时间: 2026-5-24 11:33
本帖最后由 灯笼菜刀王 于 2026-5-24 11:42 编辑
有新问题就去开新贴
1,在 attack_effect ,skill_effect ,item_effect 三个地方, 找到 self.hp -= self.damage 在上面加一句
((a=(self.damage * 0.3).round ;self.damage = (self.damage * 0.7).round ;
self.pending_rebound_damage = "抵消#{a}") if self.state?(10086) and self.hp < self.maxhp / 2
不能用ailas, 要你确实的去找到位置改, 否则会影响基于hp的操作(例如之前的无忧谷的保命符) , 实际上你1号脚本就会有这个问题, 因为它的ailas是把血逆向加回伤害值,从而实现"免伤", 先不说它并没有考虑到伤害值是可以超过剩余血量的 , 就说在默认扣血的时候, 保命符的判定就已经启动了, 之后把血加回去并不算"免伤" , 笑
2, 在 skill_effect, 找到 self.hp -= self.damage 在上面加一句
(a=self.damage / 2 ;self.damage += a ;self.pending_rebound_damage = "增伤#{a}") if user.state?(10086) and rand(100) < 50
这个可以ailas 但是用ailas的话, 它和其他ailas的上下顺序会导致效果的不同, 比如它在吸血下面, 那吸血就只会吸正常伤害, 增伤的部分无效
想ailas, 就在我的吸血吸蓝脚本里,第18行下面加上
(a=self.damage / 2 ;self.hp -= a ;self.damage += a ;self.pending_rebound_damage = "增伤#{a}") if user.state?(10086) and rand(100) < 50
3, 去用公共事件做, 在我的吸血吸蓝脚本里,第17行下面加上一句 $game_variables[1] = self.damage.is_a?(Numeric) ? self.damage : 0 这样1号变量就保存了当前伤害值(负数为加血, 0为MISS) 以后需要公共事件调用伤害值的都找这个变量即可
然后, 行动方播放动画写法
a = $scene.instance_variable_get(
:@active_battler)
a.animation_id = 10086
对象方播放动画的写法
a = $scene.instance_variable_get(
:@target_battlers)
a[0].animation_id = 10086
对象方弹伤害和扣血的写法
a = $scene.instance_variable_get(
:@target_battlers)
b = $game_variables[1] / 2
a[0].hp -= b
a[0].damage= b
a[0].damage_pop = true
自己去用条件分歧, 等待 等方式做效果吧 ,别告诉我用事件都搞不定你的脑洞, 笑
作者: 灯笼菜刀王 时间: 2026-5-24 14:15
本帖最后由 灯笼菜刀王 于 2026-5-24 14:46 编辑
其实, 不需要纠结"显示抵消多少伤害", 你要的是"让玩家知道效果触发"的表演而已, 那可以直接播放一个动画就行了
▲像这样,不用显示什么抵消XX伤害, 你也知道伤害被抵消了吧, 笑
甚至, 可以这样, 战斗前就表演, 这样玩家也知道触发效果了
而且因为公式结算是在动画之前, 所以在攻击动画之前的表演更容易做, 只要直接播放动画即可, 不需要考虑滞后显示
把 1的句子改成 (a=(self.damage * 0.3).round ;self.damage = (self.damage * 0.7).round ;
self.animation_id = 10086) if self.state?(10086) and self.hp < self.maxhp / 2
这样触发效果的时候, 就会先播放10086号动画,然后再播放攻击动画了
作者: y967 时间: 2026-5-25 07:09
1,给敌人附加一个状态,增加敌人受伤害30%,AI不好使
2,七伤拳
伤敌1000,自损800,AI搓出来了,只扣血没有显示数字效果
#==============================================================================
# ** Game_Battler
#------------------------------------------------------------------------------
# 添加技能反噬效果
# 配置区域:REBOUND_SKILL_IDS 填入需要具有反噬效果的技能ID
#==============================================================================
class Game_Battler
# [配置] 在这里填入需要拥有“50%几率反噬0.8倍伤害”效果的技能ID
# 例如: [15, 23, 40] 表示 ID 为 15, 23, 40 的技能会触发此效果
REBOUND_SKILL_IDS = [ 57 ,58 ] # 默认设为1,请根据实际情况修改
# 别名化原有的技能效果方法,以便插入额外逻辑
alias_method :rebound_skill_effect_original , :skill_effect
def skill_effect( user, skill)
# 先执行原有的技能效果计算(包括伤害计算、状态添加等)
result = rebound_skill_effect_original( user, skill)
# 只有当技能是攻击性技能(造成HP伤害)且命中时才触发反噬
# self.damage > 0 表示造成了正向伤害(HP减少)
if self .damage .is_a ?( Integer ) && self .damage > 0
if REBOUND_SKILL_IDS.include ?( skill.id )
# 50% 几率触发
if rand ( 100 ) < 50
# 计算反噬伤害:当前造成伤害的 0.8 倍
rebound_damage = ( self .damage * 0.8 ) .to_i
# 确保反噬伤害至少为 1,避免显示 0
if rebound_damage < 1
rebound_damage = 1
end
# 对使用者(user)造成伤害
# 注意:user 可能是敌人也可能是演员,Game_Battler 通用
user.hp -= rebound_damage
rebound_damage = "[199021133]自伤#{rebound_damage}"
# 可选:在用户头上显示反噬伤害数字(需要场景支持,通常自动处理)
# 如果希望显示伤害数字,可能需要更复杂的 Scene_Battle 修改
# 这里仅做数值扣除,保证逻辑正确。
# 记录日志或提示(可选,取决于是否开启战斗日志)
#$game_temp.battle_messages.push("#{user.name} 受到了反噬!")
end
end
end
return result
end
end
#==============================================================================
# ** Game_Battler
#------------------------------------------------------------------------------
# 添加技能反噬效果
# 配置区域:REBOUND_SKILL_IDS 填入需要具有反噬效果的技能ID
#==============================================================================
class Game_Battler
# [配置] 在这里填入需要拥有“50%几率反噬0.8倍伤害”效果的技能ID
# 例如: [15, 23, 40] 表示 ID 为 15, 23, 40 的技能会触发此效果
REBOUND_SKILL_IDS = [ 57 ,58 ] # 默认设为1,请根据实际情况修改
# 别名化原有的技能效果方法,以便插入额外逻辑
alias_method :rebound_skill_effect_original , :skill_effect
def skill_effect( user, skill)
# 先执行原有的技能效果计算(包括伤害计算、状态添加等)
result = rebound_skill_effect_original( user, skill)
# 只有当技能是攻击性技能(造成HP伤害)且命中时才触发反噬
# self.damage > 0 表示造成了正向伤害(HP减少)
if self .damage .is_a ?( Integer ) && self .damage > 0
if REBOUND_SKILL_IDS.include ?( skill.id )
# 50% 几率触发
if rand ( 100 ) < 50
# 计算反噬伤害:当前造成伤害的 0.8 倍
rebound_damage = ( self .damage * 0.8 ) .to_i
# 确保反噬伤害至少为 1,避免显示 0
if rebound_damage < 1
rebound_damage = 1
end
# 对使用者(user)造成伤害
# 注意:user 可能是敌人也可能是演员,Game_Battler 通用
user.hp -= rebound_damage
rebound_damage = "[199021133]自伤#{rebound_damage}"
# 可选:在用户头上显示反噬伤害数字(需要场景支持,通常自动处理)
# 如果希望显示伤害数字,可能需要更复杂的 Scene_Battle 修改
# 这里仅做数值扣除,保证逻辑正确。
# 记录日志或提示(可选,取决于是否开启战斗日志)
#$game_temp.battle_messages.push("#{user.name} 受到了反噬!")
end
end
end
return result
end
end
在40行自行添加rebound_damage = "[199021133]自伤#{rebound_damage}",未能显示数字,也未显示文字。打开47行,出错,不打开就可以。
3,变猪
让敌人变成一只猪,属性减半,目前有时候会出错, battle 2,偶尔会,不会经常出现
#==============================================================================
# ▼ 变形技能(变猪/青蛙) + 属性减半 + 战斗图替换
#==============================================================================
module Polymorph
# 技能ID
SKILL_ID = 57
# 变形状态ID
PIG_STATE_ID = 21
FROG_STATE_ID = 22
# 战斗图文件名(位于 Graphics/Battlers/ 目录,不含后缀)
PIG_BATTLER = "pig"
FROG_BATTLER = "frog"
end
#--------------------------------------------------------------------------
# ● 技能使用效果:命中时随机附加变猪或变青蛙状态
#--------------------------------------------------------------------------
class Game_Battler
alias poly_skill_effect skill_effect
def skill_effect( user, skill)
effective = poly_skill_effect( user, skill)
return effective unless effective
return effective unless skill.id == Polymorph::SKILL_ID
# 随机选择变形状态
state_id = rand ( 2 ) == 0 ? Polymorph::PIG_STATE_ID : Polymorph::FROG_STATE_ID
self .add_state ( state_id) unless self .state_full ?( state_id)
effective
end
end
#--------------------------------------------------------------------------
# ● 基本属性减半(若处于变形状态)
#--------------------------------------------------------------------------
class Game_Battler
[ :str , :dex , :agi , :int , :atk , :pdef , :mdef , :eva ] .each do |stat|
alias_method( "poly_base_#{stat}" , stat)
define_method( stat) do
val = send( "poly_base_#{stat}" )
if [ Polymorph::PIG_STATE_ID , Polymorph::FROG_STATE_ID ] .any ? { |id| self .state ?( id) }
val / 2
else
val
end
end
end
end
#--------------------------------------------------------------------------
# ● 敌方战斗图替换(处于变形状态时显示猪/蛙图)
#--------------------------------------------------------------------------
class Game_Enemy < Game_Battler
alias poly_battler_name battler_name
def battler_name
if state?( Polymorph::PIG_STATE_ID )
Polymorph::PIG_BATTLER
elsif state?( Polymorph::FROG_STATE_ID )
Polymorph::FROG_BATTLER
else
poly_battler_name
end
end
end
#==============================================================================
# ▼ 变形技能(变猪/青蛙) + 属性减半 + 战斗图替换
#==============================================================================
module Polymorph
# 技能ID
SKILL_ID = 57
# 变形状态ID
PIG_STATE_ID = 21
FROG_STATE_ID = 22
# 战斗图文件名(位于 Graphics/Battlers/ 目录,不含后缀)
PIG_BATTLER = "pig"
FROG_BATTLER = "frog"
end
#--------------------------------------------------------------------------
# ● 技能使用效果:命中时随机附加变猪或变青蛙状态
#--------------------------------------------------------------------------
class Game_Battler
alias poly_skill_effect skill_effect
def skill_effect( user, skill)
effective = poly_skill_effect( user, skill)
return effective unless effective
return effective unless skill.id == Polymorph::SKILL_ID
# 随机选择变形状态
state_id = rand ( 2 ) == 0 ? Polymorph::PIG_STATE_ID : Polymorph::FROG_STATE_ID
self .add_state ( state_id) unless self .state_full ?( state_id)
effective
end
end
#--------------------------------------------------------------------------
# ● 基本属性减半(若处于变形状态)
#--------------------------------------------------------------------------
class Game_Battler
[ :str , :dex , :agi , :int , :atk , :pdef , :mdef , :eva ] .each do |stat|
alias_method( "poly_base_#{stat}" , stat)
define_method( stat) do
val = send( "poly_base_#{stat}" )
if [ Polymorph::PIG_STATE_ID , Polymorph::FROG_STATE_ID ] .any ? { |id| self .state ?( id) }
val / 2
else
val
end
end
end
end
#--------------------------------------------------------------------------
# ● 敌方战斗图替换(处于变形状态时显示猪/蛙图)
#--------------------------------------------------------------------------
class Game_Enemy < Game_Battler
alias poly_battler_name battler_name
def battler_name
if state?( Polymorph::PIG_STATE_ID )
Polymorph::PIG_BATTLER
elsif state?( Polymorph::FROG_STATE_ID )
Polymorph::FROG_BATTLER
else
poly_battler_name
end
end
end
作者: 灯笼菜刀王 时间: 2026-5-25 10:04
本帖最后由 灯笼菜刀王 于 2026-5-25 11:33 编辑
1. self.hp -= self.damage 之前加上 self.damage = (self.damage * 1.3).round if self.state?(10086) # 对伤害进行增减变化的做法我已经教过很多次了, 不会举一反三, 下次再问我就无视了
2, 和反弹的做法一样, 判断对象不同
给你成品脚本, 吸血脚本更新
设置方法 FS=50%0.8 50%表示50%概率,0.8表示反噬0.8倍伤害
module RPG
class Skill
def description
description = @description .split ( /#/)[0]
return description != nil ? description : ''
end
def 吸血 ;@description[ /XHP\=( \d+) \%( \d*) /] ;return $1 ? [ $1 ,$2 ] : nil ;end
def 吸蓝 ;@description[ /XSP\=( \d+) \%( \d*) /] ;return $1 ? [ $1 ,$2 ] : nil ;end
def 反噬 ;@description[ /FS\=( \d+) \%( [ .0 -9 ] +) /] ;return $1 ? [ $1 ,$2 ] : nil ;end
end
end
class Game_Battler
attr_accessor :pending_rebound_damage
alias caidao_skill_effect skill_effect
def skill_effect( user, skill)
old_hp = self .hp
eff = caidao_skill_effect( user, skill)
$game_variables [ 1 ] = self .damage .is_a ?( Numeric ) ? self .damage : 0
if eff and ( a=self .damage ) .is_a ?( Numeric ) and a > 0
( a=self .damage / 2 ;self.hp -= a ;self.damage += a ;
self .pending_rebound_damage = "#{self.damage}增伤#{a}" ) if user.state ?( 10086 ) and rand ( 100 ) < 50
if ( r=skill.反噬) ; m,n = r[ 0 ] .to_i ,r[ 1 ] .to_f
( a=( self .damage * n) .round ;user.hp -= a ;
user.pending_rebound_damage = "反噬#{a}" ) if rand ( 100 ) < m
end
if ( r=skill.吸血)
m,n = r[ 0 ] .to_i ,r[ 1 ] .to_i ;f = [ self .damage * m / 100 ,old_hp]
f.push ( n) if n > 0 ;a = f.min
user.hp += a ;#user.pending_rebound_damage = "吸血#{a}"
end
if ( r=skill.吸蓝)
m,n = r[ 0 ] .to_i ,r[ 1 ] .to_i ;f = [ self .damage * m / 100 ,old_hp]
f.push ( n) if n > 0 ; a = f.min
user.sp += a ;#user.pending_rebound_damage = "吸蓝#{a}"
end
end ;return eff
end
end
module RPG
class Skill
def description
description = @description .split ( /#/)[0]
return description != nil ? description : ''
end
def 吸血 ;@description[ /XHP\=( \d+) \%( \d*) /] ;return $1 ? [ $1 ,$2 ] : nil ;end
def 吸蓝 ;@description[ /XSP\=( \d+) \%( \d*) /] ;return $1 ? [ $1 ,$2 ] : nil ;end
def 反噬 ;@description[ /FS\=( \d+) \%( [ .0 -9 ] +) /] ;return $1 ? [ $1 ,$2 ] : nil ;end
end
end
class Game_Battler
attr_accessor :pending_rebound_damage
alias caidao_skill_effect skill_effect
def skill_effect( user, skill)
old_hp = self .hp
eff = caidao_skill_effect( user, skill)
$game_variables [ 1 ] = self .damage .is_a ?( Numeric ) ? self .damage : 0
if eff and ( a=self .damage ) .is_a ?( Numeric ) and a > 0
( a=self .damage / 2 ;self.hp -= a ;self.damage += a ;
self .pending_rebound_damage = "#{self.damage}增伤#{a}" ) if user.state ?( 10086 ) and rand ( 100 ) < 50
if ( r=skill.反噬) ; m,n = r[ 0 ] .to_i ,r[ 1 ] .to_f
( a=( self .damage * n) .round ;user.hp -= a ;
user.pending_rebound_damage = "反噬#{a}" ) if rand ( 100 ) < m
end
if ( r=skill.吸血)
m,n = r[ 0 ] .to_i ,r[ 1 ] .to_i ;f = [ self .damage * m / 100 ,old_hp]
f.push ( n) if n > 0 ;a = f.min
user.hp += a ;#user.pending_rebound_damage = "吸血#{a}"
end
if ( r=skill.吸蓝)
m,n = r[ 0 ] .to_i ,r[ 1 ] .to_i ;f = [ self .damage * m / 100 ,old_hp]
f.push ( n) if n > 0 ; a = f.min
user.sp += a ;#user.pending_rebound_damage = "吸蓝#{a}"
end
end ;return eff
end
end
3, 数据库,状态设置, 定量10, 其他50% 动画: 对象方隐藏, 贴个猪 , 解决
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1