设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 46|回复: 1
打印 上一主题 下一主题

[原创发布] 格挡状态加反伤技能

[复制链接]

Lv1.梦旅人

梦石
0
星屑
239
在线时间
15 小时
注册时间
2022-12-22
帖子
17
跳转到指定楼层
1
发表于 昨天 20:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
由于没有找到合适的格挡脚本,怒了,遂自写.(推荐与Yanfly的战斗脚本搭配,并且调整Yanfly的战斗脚本中的ENABLE_POPUPS = true)
  1. class Game_Battler < Game_BattlerBase
  2.   # ========== 全局配置 ==========
  3.   
  4.   # 系统总开关ID(当该开关开启时,抵挡系统生效)
  5.   SYSTEM_SWITCH_ID = 10
  6.   
  7.   # 角色系统配置(状态ID => [存储变量ID, 默认比例, 抵挡比例])
  8.   ACTOR_STATES = {
  9.     10 => [11, 0.50, 0.30],  # 状态10: 存储50%伤害, 抵挡30%伤害
  10.     15 => [15, 0.30, 0.20],  # 状态15: 存储30%伤害, 抵挡20%伤害
  11.     20 => [13, 0.25, 0.15]   # 状态20: 存储25%伤害, 抵挡15%伤害
  12.   }
  13.   
  14.   # 敌人系统配置(状态ID => [存储变量ID, 默认比例, 抵挡比例])
  15.   ENEMY_STATES = {
  16.     25 => [21, 0.40, 0.25],  # 状态25: 存储40%伤害, 抵挡25%伤害
  17.     30 => [22, 0.60, 0.40],  # 状态30: 存储60%伤害, 抵挡40%伤害
  18.     35 => [23, 0.75, 0.50]   # 状态35: 存储75%伤害, 抵挡50%伤害
  19.   }
  20.   
  21.   # ========== 脚本核心 ==========
  22.   
  23.   # 别名原伤害处理方法
  24.   alias damage_block_and_record_execute_damage execute_damage
  25.   def execute_damage(user)
  26.     # 保存原始伤害值
  27.     original_damage = @result.hp_damage
  28.    
  29.     # 仅处理实际伤害(正值)
  30.     if original_damage > 0
  31.       # 检查系统总开关是否开启
  32.       if $game_switches[SYSTEM_SWITCH_ID]
  33.         # 计算抵挡伤害
  34.         blocked_damage = calculate_blocked_damage(original_damage)
  35.         
  36.         # 应用抵挡效果
  37.         @result.hp_damage = [original_damage - blocked_damage, 0].max
  38.         
  39.         # 处理伤害记录
  40.         process_damage_recording(original_damage)
  41.         
  42.         # 显示格挡伤害弹窗
  43.         if blocked_damage > 0 && $imported["YEA-BattleEngine"]
  44.           text = sprintf("格挡 %d", blocked_damage)
  45.           create_popup(text, "BLOCK_DAMAGE")
  46.         end
  47.       else
  48.         # 系统开关关闭时,不进行任何抵挡处理
  49.         @result.hp_damage = original_damage
  50.       end
  51.     end
  52.    
  53.     # 调用原始伤害处理(传递正确的参数)
  54.     damage_block_and_record_execute_damage(user)
  55.   end
  56.   
  57.   # 计算抵挡伤害
  58.   def calculate_blocked_damage(original_damage)
  59.     total_blocked = 0
  60.    
  61.     # 处理角色抵挡
  62.     if actor?
  63.       ACTOR_STATES.each_key do |state_id|
  64.         next unless state?(state_id)
  65.         config = ACTOR_STATES[state_id]
  66.         block_ratio = get_block_ratio(state_id, config)
  67.         total_blocked += (original_damage * block_ratio).floor
  68.       end
  69.     end
  70.    
  71.     # 处理敌人抵挡
  72.     if enemy?
  73.       ENEMY_STATES.each_key do |state_id|
  74.         next unless state?(state_id)
  75.         config = ENEMY_STATES[state_id]
  76.         block_ratio = get_block_ratio(state_id, config)
  77.         total_blocked += (original_damage * block_ratio).floor
  78.       end
  79.     end
  80.    
  81.     # 确保抵挡不超过原始伤害
  82.     [total_blocked, original_damage].min
  83.   end
  84.   
  85.   # 处理伤害记录
  86.   def process_damage_recording(original_damage)
  87.     # 处理角色伤害记录
  88.     if actor?
  89.       ACTOR_STATES.each_key do |state_id|
  90.         next unless state?(state_id)
  91.         record_damage_for_state(original_damage, state_id, ACTOR_STATES[state_id])
  92.       end
  93.     end
  94.    
  95.     # 处理敌人伤害记录
  96.     if enemy?
  97.       ENEMY_STATES.each_key do |state_id|
  98.         next unless state?(state_id)
  99.         record_damage_for_state(original_damage, state_id, ENEMY_STATES[state_id])
  100.       end
  101.     end
  102.   end
  103.   
  104.   # 获取抵挡比例
  105.   def get_block_ratio(state_id, config)
  106.     state = states.find { |s| s.id == state_id }
  107.    
  108.     # 优先使用状态备注中的自定义抵挡比例
  109.     if state.note =~ /<block_ratio:\s*(\d+\.?\d*)>/i
  110.       $1.to_f
  111.     else
  112.       config[2]  # 默认抵挡比例
  113.     end
  114.   end
  115.   
  116.   # 状态伤害记录核心方法
  117.   def record_damage_for_state(original_damage, state_id, config)
  118.     # 解构配置 [变量ID, 记录比例, 抵挡比例]
  119.     var_id, record_ratio, _ = config
  120.    
  121.     # 从状态获取自定义记录比例
  122.     state = states.find { |s| s.id == state_id }
  123.    
  124.     # 优先使用状态备注中的自定义记录比例
  125.     if state.note =~ /<damage_ratio:\s*(\d+\.?\d*)>/i
  126.       record_ratio = $1.to_f
  127.     end
  128.    
  129.     # 计算并记录伤害
  130.     recorded_damage = (original_damage * record_ratio).floor
  131.     $game_variables[var_id] += recorded_damage
  132.   end
  133. end

  134. # 添加YEA弹窗规则(如果YEA引擎存在)
  135. if $imported && $imported["YEA-BattleEngine"]
  136.   module YEA
  137.     module BATTLE
  138.       # 添加格挡伤害弹窗规则
  139.       POPUP_RULES["BLOCK_DAMAGE"] = [2.0, 1.0, 24, true, false, 180, 180, 255, DEFAULT]
  140.     end
  141.   end
  142. end
复制代码

反伤技能可使用变量写入伤害公式,这里不再赘述.

Lv4.逐梦者

梦石
0
星屑
11899
在线时间
2170 小时
注册时间
2013-6-10
帖子
1584
2
发表于 3 小时前 | 只看该作者
强啊
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-7-25 22:03

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表