Project1
标题:
格挡状态加反伤技能
[打印本页]
作者:
晨风1
时间:
3 天前
标题:
格挡状态加反伤技能
由于没有找到合适的格挡脚本,怒了,遂自写.(推荐与Yanfly的战斗脚本搭配,并且调整Yanfly的战斗脚本中的ENABLE_POPUPS = true)
class Game_Battler < Game_BattlerBase
# ========== 全局配置 ==========
# 系统总开关ID(当该开关开启时,抵挡系统生效)
SYSTEM_SWITCH_ID = 10
# 角色系统配置(状态ID => [存储变量ID, 默认比例, 抵挡比例])
ACTOR_STATES = {
10 => [11, 0.50, 0.30], # 状态10: 存储50%伤害, 抵挡30%伤害
15 => [15, 0.30, 0.20], # 状态15: 存储30%伤害, 抵挡20%伤害
20 => [13, 0.25, 0.15] # 状态20: 存储25%伤害, 抵挡15%伤害
}
# 敌人系统配置(状态ID => [存储变量ID, 默认比例, 抵挡比例])
ENEMY_STATES = {
25 => [21, 0.40, 0.25], # 状态25: 存储40%伤害, 抵挡25%伤害
30 => [22, 0.60, 0.40], # 状态30: 存储60%伤害, 抵挡40%伤害
35 => [23, 0.75, 0.50] # 状态35: 存储75%伤害, 抵挡50%伤害
}
# ========== 脚本核心 ==========
# 别名原伤害处理方法
alias damage_block_and_record_execute_damage execute_damage
def execute_damage(user)
# 保存原始伤害值
original_damage = @result.hp_damage
# 仅处理实际伤害(正值)
if original_damage > 0
# 检查系统总开关是否开启
if $game_switches[SYSTEM_SWITCH_ID]
# 计算抵挡伤害
blocked_damage = calculate_blocked_damage(original_damage)
# 应用抵挡效果
@result.hp_damage = [original_damage - blocked_damage, 0].max
# 处理伤害记录
process_damage_recording(original_damage)
# 显示格挡伤害弹窗
if blocked_damage > 0 && $imported["YEA-BattleEngine"]
text = sprintf("格挡 %d", blocked_damage)
create_popup(text, "BLOCK_DAMAGE")
end
else
# 系统开关关闭时,不进行任何抵挡处理
@result.hp_damage = original_damage
end
end
# 调用原始伤害处理(传递正确的参数)
damage_block_and_record_execute_damage(user)
end
# 计算抵挡伤害
def calculate_blocked_damage(original_damage)
total_blocked = 0
# 处理角色抵挡
if actor?
ACTOR_STATES.each_key do |state_id|
next unless state?(state_id)
config = ACTOR_STATES[state_id]
block_ratio = get_block_ratio(state_id, config)
total_blocked += (original_damage * block_ratio).floor
end
end
# 处理敌人抵挡
if enemy?
ENEMY_STATES.each_key do |state_id|
next unless state?(state_id)
config = ENEMY_STATES[state_id]
block_ratio = get_block_ratio(state_id, config)
total_blocked += (original_damage * block_ratio).floor
end
end
# 确保抵挡不超过原始伤害
[total_blocked, original_damage].min
end
# 处理伤害记录
def process_damage_recording(original_damage)
# 处理角色伤害记录
if actor?
ACTOR_STATES.each_key do |state_id|
next unless state?(state_id)
record_damage_for_state(original_damage, state_id, ACTOR_STATES[state_id])
end
end
# 处理敌人伤害记录
if enemy?
ENEMY_STATES.each_key do |state_id|
next unless state?(state_id)
record_damage_for_state(original_damage, state_id, ENEMY_STATES[state_id])
end
end
end
# 获取抵挡比例
def get_block_ratio(state_id, config)
state = states.find { |s| s.id == state_id }
# 优先使用状态备注中的自定义抵挡比例
if state.note =~ /<block_ratio:\s*(\d+\.?\d*)>/i
$1.to_f
else
config[2] # 默认抵挡比例
end
end
# 状态伤害记录核心方法
def record_damage_for_state(original_damage, state_id, config)
# 解构配置 [变量ID, 记录比例, 抵挡比例]
var_id, record_ratio, _ = config
# 从状态获取自定义记录比例
state = states.find { |s| s.id == state_id }
# 优先使用状态备注中的自定义记录比例
if state.note =~ /<damage_ratio:\s*(\d+\.?\d*)>/i
record_ratio = $1.to_f
end
# 计算并记录伤害
recorded_damage = (original_damage * record_ratio).floor
$game_variables[var_id] += recorded_damage
end
end
# 添加YEA弹窗规则(如果YEA引擎存在)
if $imported && $imported["YEA-BattleEngine"]
module YEA
module BATTLE
# 添加格挡伤害弹窗规则
POPUP_RULES["BLOCK_DAMAGE"] = [2.0, 1.0, 24, true, false, 180, 180, 255, DEFAULT]
end
end
end
复制代码
反伤技能可使用变量写入伤害公式,这里不再赘述.
作者:
小怪兽奇奇侠
时间:
前天 18:28
强啊
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1