Compare commits

...

179 Commits

Author SHA1 Message Date
昔念
de6c700bb3 1
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-18 01:30:48 +08:00
昔念
3232efd05a 1
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-17 00:48:43 +08:00
昔念
0c79fee8af 1
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-17 00:35:17 +08:00
昔念
3d77e146e9 1
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-16 23:49:28 +08:00
xinian
a43a25c610 test: cover legacy round broadcast handling
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-16 10:25:56 +08:00
xinian
3cfde577eb test: add pet fusion transaction coverage
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-16 09:21:39 +08:00
xinian
85f9c02ced fix: correct self-destruct mutual KO handling
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-16 09:21:02 +08:00
昔念
9f7fd83626 1
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-15 22:42:56 +08:00
昔念
ee8b0a2182 Merge branch 'main' of https://cnb.cool/blzing/blazing
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-15 22:17:08 +08:00
昔念
6e95e014fa 1 2026-04-15 22:16:56 +08:00
xinian
61a135b3a7 fix: 修复宠物升级经验显示与动态结算
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-15 15:34:16 +08:00
xinian
5a81534e84 1
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-15 15:07:27 +08:00
xinian
523d835ac0 boss属性丢失,全部被限制属性不能超越,应该给ai和玩家施加不同的getinfo方法
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
道具扣除判断,因为判断扣完大于0,所以导致只剩一个的时候,道具成功使用但是不会扣除数量
2026-04-15 14:44:46 +08:00
昔念
5a7e20efec 1
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-15 03:46:55 +08:00
昔念
5f47bf0589 1
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-15 03:22:59 +08:00
昔念
a58ef20fab 1
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-15 00:19:21 +08:00
昔念
3999f34f77 1
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-15 00:17:06 +08:00
昔念
6f51a2e349 1
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-15 00:07:36 +08:00
xinian
de755f8fd0 fix: 修正效果33为消除敌方阵营所有强化
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-14 16:26:05 +08:00
xinian
803aa71771 更新说明
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-14 15:55:28 +08:00
xinian
4a77066d08 refactor: 重构持续伤害触发时机为回合开始
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-14 15:21:47 +08:00
xinian
c9b5f8569f fix: 修复道具扣除和宠物融合事务处理问题
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-14 13:06:28 +08:00
xinian
ddbfe91d8b fix: 修复扭蛋道具扣除逻辑
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-14 11:06:04 +08:00
昔念
74ac6ce940 ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat
2026-04-14 01:00:34 +08:00
昔念
43b0bc2dec ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(fight_boss): 优化BOSS战斗奖励逻辑并修复宠物等级突破100级限制

重构了handleMapBossFightRewards函数,将奖励逻辑分离到独立的处理函数中,
增加了shouldGrantBossWinBonus条件判断,确保只有满足条件时才发放胜利奖励。

同时修复了宠物等级系统,允许宠物等级突破100级限制但面板属性仍保持100级上限,
改进了经验获取和面板更新逻辑。

fix(item_use): 添加全能性格转化剂使用验证

添加了UniversalNatureItemID常量定义,增加对道具ID和性格配置的有效性验证,
确保只有正确的道具和性格类型才能被使用。

refactor(fight): 统一战斗结束原因处理逻辑

引入normalizeFightOverReason函数来标准化战斗结束原因,
统一了不同模块中的战斗结果映射逻辑,提高了代码一致性。

perf(pet): 优化宠物升级和经验计算性能

移除了等级100的硬性限制,在保证面板属性不超限的前提下允许宠物等级继续增长,
优化了经验分配和面板重新计算的逻辑流程。
```
2026-04-14 00:43:32 +08:00
昔念
b953e7831a ```
feat(fight_boss): 优化BOSS战斗奖励逻辑并修复宠物等级突破100级限制

重构了handleMapBossFightRewards函数,将奖励逻辑分离到独立的处理函数中,
增加了shouldGrantBossWinBonus条件判断,确保只有满足条件时才发放胜利奖励。

同时修复了宠物等级系统,允许宠物等级突破100级限制但面板属性仍保持100级上限,
改进了经验获取和面板更新逻辑。

fix(item
2026-04-14 00:38:50 +08:00
昔念
62d93f65e7 根据提供的code differences信息,由于没有具体的代码变更内容,我将生成一个通用的commit message模板:
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
```
docs(readme): 更新文档说明

- 添加项目使用指南
- 完善API接口说明
- 修正错误的配置示例
```

注意:由于未提供具体的代码差异信息,以上为示例格式。实际使用时请根据具体的代码变更内容填写相应的type、scope、subject和body信息。
2026-04-13 22:53:02 +08:00
昔念
7dfa9c297e ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(fight): 新增疲惫状态并优化睡眠状态机制

- 实现疲惫状态(StatusTired),仅限制攻击技能,允许属性技能正常使用
- 重构睡眠状态,改为在被攻击且未miss时立即解除,而非技能使用后
- 修复寄生种子效果触发时机,改为回合开始时触发
- 调整寄生效果的目标为技能施放者而非对手

fix(fight): 修正战斗回合逻辑和技能持续时间处理

- 修复Effect2194中状态添加函数调用,使用带时间参数的版本
- 修正Effect13中技能持续时间计算,避免额外减1的问题
- 优化回合处理逻辑,当双方都未出手时跳过动作阶段

refactor(cdk): 重构CDK配置结构和服务器冠名功能

- 将CDKConfig中的CDKType字段重命名为Type以符合GORM映射
- 优化UseServerNamingCDK方法的上下文处理逻辑
- 修复服务器冠名CDK使用时的类型检查条件

feat(player): 完善宠物经验系统和CDK兑换功能

- 增强AddPetExp方法,处理宠物等级达到100级的情况
- 添加查询当前账号有效期内服务器冠名信息的API接口
- 实现服务器服务相关的数据模型和查询方法

fix(task): 任务查询支持启用和未启用状态

- 修改任务服务中的Get、GetDaily、GetWeek方法
- 当启用状态下无结果时,自动查询未启用状态的任务配置
```
2026-04-13 22:27:27 +08:00
昔念
f95fd49efd ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(fight): 新增疲惫状态并优化睡眠状态机制

- 实现疲惫状态(StatusTired),仅限制攻击技能,允许属性技能正常使用
- 重构睡眠状态,改为在被攻击且未miss时立即解除,而非技能使用后
- 修复寄生种子效果触发时机,改为回合开始时触发
- 调整寄生效果的目标为技能施放者而非
2026-04-13 21:06:45 +08:00
昔念
ce1a2a3588 ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(xmlres): 使用rawFlexibleString替换字符串类型以支持灵活解析

- 将EffectArg结构体中的SideEffectArg字段类型从string改为rawFlexibleString
- 将Move结构体中的Name字段类型从string改为rawFlexibleString,并更新反序列化逻辑
- 统一配置文件解析方式,移除磁盘回退机制并简化readConfigContent函数
- 移除不再使用的导入包和变量

fix(fight): 修复战斗系统中的空技能和无效数据问题

- 在collectAttackValues函数中过滤掉SkillID为0的攻击值
- 添加检查避免发送空的攻击信息到客户端
- 移除输入模块中未使用的捕捉逻辑

refactor(middleware): 重构中间件配置并添加CDK权限控制

- 简化middleware.go文件结构
- 为CDK相关接口添加适当的权限中间件
- 优化服务器代理配置

feat(player): 移除宠物捕捉状态字段

- 从ReadyFightPetInfo结构体中移除IsCapture字段
- 简化宠物准备信息的数据结构
```
2026-04-13 11:34:28 +08:00
昔念
3739c2a6f9 ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(xmlres): 使用rawFlexibleString替换字符串类型以支持灵活解析

- 将EffectArg结构体中的SideEffectArg字段类型从string改为rawFlexibleString
- 将Move结构体中的Name字段类型从string改为rawFlexibleString,并更新反序列化逻辑
- 统一配置文件解析方式,移除磁盘回退机制并简化readConfigContent函数
- 移除不再使用的导入包和变量

fix(fight): 修复战斗系统中的空技能和无效数据问题

- 在
2026-04-13 11:28:30 +08:00
昔念
eca7dd86e1 ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
fix(fight): 修复单输入战斗中效果处理逻辑错误

- 在Effect201的OnSkill方法中调整了多输入战斗检查的位置,
  确保单输入战斗中的单目标效果被正确忽略

- 添加了针对单输入战斗中单目标效果的测试用例

- 移除了重复的多输入战斗检查代码

feat(fight): 添加战斗初始化时捕获标识设置功能

- 在initfightready函数中添加对CanCapture字段的处理
  将玩家的捕获能力信息传递到战斗准备信息中

- 在ReadyFightPetInfo结构体中添加IsCapture字段用于
  标识宠物是否为捕获类型

refactor(fight): 调整战斗初始化顺序确保数据一致性

- 将ReadyInfo初始化移到绑定输入上下文之后执行
  确保团队视图链接完成后再进行准备信息构建

fix(player): 增加宠物血量检查避免无效匹配

- 在玩家匹配检测中增加首只宠物血量检查
  当首只宠物血量为0时不参与匹配以防止异常情况
```
2026-04-13 10:21:13 +08:00
昔念
e161e3626f ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
fix(fight): 修复单输入战斗中效果处理逻辑错误

- 在Effect201的OnSkill方法中调整了多输入战斗检查的位置,
  确保单输入战斗中的单目标效果被正确忽略

- 添加了针对单输入战斗中单目标效果的测试用例

- 移除了重复的多输入战斗检查代码

feat(fight): 添加战斗初始化时捕获标识
2026-04-13 09:59:09 +08:00
昔念
e1a994ba11 ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(fight): 添加效果工厂模式支持以解决闭包变量捕获问题

- 新增initskillFactory函数用于注册效果工厂
- 修改技能效果注册逻辑从直接实例化改为工厂模式
- 解决循环中闭包捕获变量导致的潜在问题

feat(fight): 实现对手输入获取逻辑优化回合处理

- 添加roundOpponentInput方法获取对手输入
- 重构enterturn方法中的先后手逻辑
- 确保攻击方和被攻击
2026-04-12 22:44:13 +08:00
昔念
82bb99d141 ```
refactor(common/rpc): 移除Redis PubSub心跳机制并优化连接管理

移除Redis PubSub连接的心跳保活功能,因为PubSub连接只应负责订阅和接收,
避免在同一连接上并发执行PING操作。更新了ListenFunc和ListenFight函数,
统一代码结构,移除了context包依赖,并添加了相关注释说明。

feat(logic/pet): 新增宠物技能提交功能

新增CommitPetSkills接口用于一次性提交宠物技能学习/替换/排序结果。
实现技能验证、费用计算和状态更新逻辑,包括新技能学习成本和排序费用。
添加isSameUint32Slice辅助函数用于比较技能数组。
```
2026-04-12 19:14:18 +08:00
昔念
f9543a5156 ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(fight): 使用专用函数构建战斗结束数据包

为战斗结束消息创建专用的构建函数,
统一处理战斗结束信息的数据包构建逻辑,
提高代码的一致性和可维护性。

fix(config): 优化数据库查询语句以提高性能

将数组包含操作(@>)替换为 ANY 操作符,
在 Egg、MapPit、PetFusion 等服务中使用更高效
的查询方式
2026-04-12 13:27:39 +08:00
昔念
174830731c ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(xmlres): 添加磁盘配置文件回退机制并支持JSON格式配置

- 新增readConfigContent函数,优先从资源包读取配置,失败时回退到磁盘文件
- 添加diskConfigPath变量存储本地配置路径
- 支持从磁盘读取JSON格式配置文件,增强配置灵活性
- 修改getJson函数增加错误处理和调试日志输出
- 将技能配置从XML格式改为JSON格式,提升数据解析效率
- 初始化时设置默认磁盘配置路径为public/config目录
```
2026-04-12 04:09:19 +08:00
xinian
3a7f593105 fix: 修复 Effect201 在单人战斗中误生效的问题
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-11 22:22:23 +08:00
xinian
f6aa0c3339 feat: 重构任务奖励系统并增加宠物技能和皮肤奖励
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
将任务奖励逻辑重构到单独的文件中,增加对宠物技能和皮肤奖励的支持,优化任务完成处理流程
2026-04-11 19:25:59 +08:00
xinian
ecc483a11a Merge commit '5f5634d999893b23650cba92f2914be2cc895049' 2026-04-11 11:21:58 +00:00
xinian
97c8231b44 编辑文件 help.md
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-11 19:21:32 +08:00
xinian
5f5634d999 perf: 优化战斗逻辑性能与内存分配 2026-04-11 09:39:00 +08:00
昔念
5bfdb5c32b 缺少代码差异信息,无法生成具体的commit message。
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
请提供具体的代码差异内容,我将根据Angular规范为您生成符合要求的中文commit message,包含适当的type、scope、subject和body部分,并确保每行不超过100个字符。
2026-04-11 00:46:43 +08:00
xinian
90f1447d48 refactor: 重构服务器冠名逻辑至独立表
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-10 19:36:59 +08:00
xinian
ee3f25438f 编辑文件 help.md
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-10 14:25:36 +08:00
xinian
2d8969bed2 编辑文件 config.yaml 2026-04-10 12:18:32 +08:00
xinian
fa5d50955d 编辑文件 my-first-workflow.yaml 2026-04-10 12:15:11 +08:00
xinian
6574450489 编辑文件 my-first-workflow.yaml 2026-04-10 12:11:13 +08:00
xinian
0daeb70900 fix: 修复日志格式化字符串错误和任务奖励逻辑
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-10 10:28:22 +08:00
昔念
061e4f0c51 Merge branch 'main' of https://cnb.cool/blzing/blazing
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-10 01:55:25 +08:00
昔念
5c76aa7079 ```
feat(fight): 新增团战胜利关闭和超时退出功能

新增 GroupFightWinClose 和 GroupFightTimeoutExit 方法,
用于处理团战胜利关闭和超时退出逻辑,统一调用 QuitFight() 退出战斗。

fix(gold_list): 修复挂单服务中的逻辑错误和潜在异常

修复了 GoldListService 中的多处问题:
- 修正条件判断语句格式
- 添加数据库查询错误检查
- 优化
2026-04-10 01:55:13 +08:00
xinian
b327398448 refactor: 重构任务服务读写逻辑
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-09 22:59:28 +08:00
xinian
d0abb08d5b fix: 修复获取全部/文件读取/ReqShop/ReqShopReqShop 请求错误
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-09 15:37:48 +08:00
xinian
d2cd601802 更新说明
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-09 13:11:59 +08:00
昔念
487ee0e726 ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(fight): 添加旧组队协议支持并优化战斗系统

- 实现了旧组队协议相关功能,包括GroupReadyFightFinish、GroupUseSkill、
  GroupUseItem、GroupChangePet和GroupEscape方法
- 新增组队战斗相关的入站信息结构体定义
- 实现了组队BOSS战斗逻辑,添加groupBossSlotLimit常量
- 重构宠物技能设置逻辑,调整金币消耗时机
- 优化战斗循环逻辑,添加对无行动槽位的处理
- 改进AI行动逻辑,增加多位置目标选择机制
- 完善捕获系统上下文处理,修复空指针问题
- 添加战斗状态更新和数据同步机制

fix(pet-skill): 修复宠物技能设置中的金币扣除逻辑错误

- 将金币扣除逻辑移到验证之后
- 修正宠物技能数量限制检查的顺序
- 防止重复添加已有技能的情况

refactor(fight): 重构战斗系统代码结构

- 分离新旧组队协议的战斗创建逻辑
- 优化战斗输入验证和处理流程
- 改进战斗循环中的错误处理机制
```
2026-04-09 02:14:09 +08:00
xinian
3b35789b47 feat: 优化CDK服务器冠名逻辑与鉴权
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-08 19:31:44 +08:00
xinian
28b6386963 feat: 新增CDK兑换冠名接口 2026-04-08 18:12:02 +08:00
xinian
1ca0ff344e feat: 新增服务器冠名CDK兑换功能
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-08 15:49:03 +08:00
xinian
9825944efc feat: 添加批量生成CDK功能
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-08 14:17:10 +08:00
xinian
ca96be3905 refactor: 统一战斗报文发送逻辑
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-08 12:26:37 +08:00
xinian
4b89588c22 编辑文件 Dockerfile
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-08 10:11:33 +08:00
昔念
0051ac0be8 ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(fight): 添加旧组队协议支持并优化战斗系统

- 实现了旧组队协议相关功能,包括GroupReadyFightFinish、GroupUseSkill、
  GroupUseItem、GroupChangePet和GroupEscape方法
- 新增组队战斗相关的入站信息结构体定义
- 实现了组队BOSS战斗逻辑,添加groupBossSlotLimit常量
- 重构宠物技能设置逻辑,调整金币消耗时机
- 优化战斗循环逻辑,添加对无行动槽位的处理
- 改进AI行动逻辑,增加多位置目标选择
2026-04-08 01:28:55 +08:00
昔念
918cdeac0e Merge branch 'main' of https://cnb.cool/blzing/blazing 2026-04-07 17:26:52 +08:00
xinian
13244313f1 编辑文件 gold_list.go
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-06 12:09:40 +08:00
xinian
4ea9864833 perf: 使用数组代替map优化元素计算性能
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-06 07:16:57 +08:00
xinian
77057e01b6 refactor: 优化命令注册和请求处理逻辑 2026-04-06 07:07:15 +08:00
xinian
f030b61645 fix: 优化TCP/WebSocket协议检测与处理逻辑
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-06 06:33:24 +08:00
xinian
5a44154d30 feat: 添加地图节点匹配和战斗等级上限 2026-04-06 05:24:14 +08:00
xinian
a905954b5c feat: 添加宠物训练加成效果
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-06 03:47:17 +08:00
xinian
99748ba41e refactor: 重构奖励发放逻辑并支持签到默认奖励
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-06 03:42:48 +08:00
xinian
40ec827342 refactor: 重构战斗属性和特效应用逻辑
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-06 03:11:38 +08:00
xinian
a16a06e389 refactor: 重构签到系统和战斗特效逻辑 2026-04-06 02:51:13 +08:00
xinian
5b37d9493b feat: 实现每日签到功能并优化战斗和道具逻辑 2026-04-06 02:06:11 +08:00
xinian
f433a26a6d refactor: 重构战斗系统为统一动作包结构
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-06 00:58:23 +08:00
xinian
141ba67014 编辑文件 Dockerfile
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-05 23:14:54 +08:00
xinian
d83cf365ac 更新说明
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-05 23:13:06 +08:00
xinian
24b463f0aa feat: 增强 Boss 脚本 HookAction 接入能力
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
引入 BossHookActionContext 封装战斗上下文,并支持脚本调用 useSkill 和 switchPet 函数控制战斗行为。
2026-04-05 22:27:38 +08:00
xinian
c021b40fbe feat: 增强踢人逻辑与BOSS脚本支持
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
优化踢人超时处理和僵尸连接清理,支持BOSS动作脚本并增加测试,修复事件匹配与战斗循环中的并发问题。
2026-04-05 21:59:22 +08:00
xinian
36dd93b076 编辑文件 Dockerfile
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-05 21:16:01 +08:00
昔念
3ee1283a2c ```
feat(pet): 新增精灵可学习技能查询功能

新增 GetPetLearnableSkills 接口用于查询当前精灵可学习技能(包含等级技能和额外技能ExtSKill),
优化 SetPetSkill 和 SortPetSkills 方法中的技能处理逻辑,提升技能管理和排序的准确性。

同时修复了宠物存储信息查询时缺少参数验证的问题,在管理后台接口中增加 free 参数支持。

BREAKING CHANGE: 管理后台
2026-04-05 12:45:00 +08:00
昔念
c3da3162ee ```
feat(player): 添加玩家断开连接时的安全保存机制

- 实现 SaveOnDisconnect 方法,确保玩家数据在断开连接时安全保存
- 添加并发控制防止重复保存操作,使用互斥锁和完成通道确保一次保存
- 在 socket 关闭事件中改为异步调用 SaveOnDisconnect 避免阻塞
- 添加 panic 恢复机制保护保存过程中的异常情况

refactor(login): 优化登录时的踢人逻辑和超时处理
2026-04-05 11:14:25 +08:00
xinian
37cd641942 refactor: 重构 Prop 字段位置至 baseplayer
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-05 07:45:51 +08:00
xinian
87145579e6 refactor: 移除宠物显示提供者接口
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-05 07:41:50 +08:00
xinian
7ec6381cf1 111 2026-04-05 07:30:55 +08:00
xinian
2ee0cbc094 fix: 修复boss奖励发放逻辑
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-05 07:28:39 +08:00
xinian
6510e4e09b refactor: 重构入参类型引用
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-05 07:24:36 +08:00
xinian
34bc35a6b2 feat: 新增游戏协议入站结构体定义
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-05 06:12:32 +08:00
xinian
8352d23164 refactor: 优化精灵背包仓库切换逻辑
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-05 06:02:27 +08:00
xinian
e71971d0b4 refactor: 重构宠物背包逻辑到玩家服务
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-05 05:47:25 +08:00
xinian
bceb7965f7 refactor: 重构宠物仓库列表获取逻辑 2026-04-05 05:32:39 +08:00
xinian
c3f052ef30 refactor: 移除 syncBackupPetList 调用和定义 2026-04-05 05:24:55 +08:00
xinian
7d054bbe91 feat: 实现跨服PVP匹配和战斗功能 2026-04-05 05:04:04 +08:00
xinian
102d87da3e 编辑文件 Dockerfile
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-05 02:27:37 +08:00
xinian
78a68148ce chore: update fight logic and effect implementations
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-05 02:25:44 +08:00
xinian
f473c54880 feat: 支持多站位战斗控制绑定模式
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-05 00:03:32 +08:00
xinian
2eba4b7915 feat: 实现乱舞效果并完善战斗输入上下文
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-04 22:39:56 +08:00
xinian
39e1d4c42f refactor: 重构战斗结构体以支持双打模式 2026-04-04 22:13:42 +08:00
昔念
7916f90992 ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
refactor(player): 移除废弃的宠物列表计数字段

移除了 PlayerInfo 结构体中不再使用的 PetListCount 字段,
该字段为旧登录协议中的精灵列表长度,现已废弃并不再使用。
```
2026-04-04 14:00:36 +08:00
昔念
8ac2833ce2 1 2026-04-04 13:52:57 +08:00
xinian
fbc845526b refactor: 优化控制器初始化和命令解析逻辑
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-04 09:33:31 +08:00
xinian
257a979f93 refactor: 重构效果参数处理逻辑
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-04 09:26:57 +08:00
xinian
ce7be73e49 fix: 修复 CODEX_BASE_URL 双斜杠问题
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-04 08:59:40 +08:00
xinian
28f2199142 编辑文件 Dockerfile
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-04 08:48:25 +08:00
xinian
80cfa0a07e refactor: 替换过时的上下文访问方法
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-04 07:26:08 +08:00
xinian
c89632b409 refactor: 重构效果系统中的上下文引用 2026-04-04 07:22:28 +08:00
xinian
5a5a1db2a3 refactor: 迁移 effect 至新语义上下文 2026-04-04 07:06:00 +08:00
xinian
0ac84a9509 新纪元 2026-04-04 06:27:15 +08:00
xinian
3a9932e307 refactor: 重、、、、 2026-04-04 06:11:01 +08:00
xinian
28d92c1e18 refactor: 重构战斗系统支持多单位多动作 2026-04-04 05:44:02 +08:00
xinian
b62b4af628 style: 清理代码注释和格式 2026-04-04 05:12:30 +08:00
xinian
31d274dd9d feat: 新增战斗效果1630-1634及1609-1624 2026-04-04 04:58:49 +08:00
xinian
9c6f3988de refactor: 重构 CurrentPet 为 CurPet
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-04 04:34:43 +08:00
xinian
6439995434 feat: 支持多精灵战斗位操作 2026-04-04 04:28:04 +08:00
xinian
603c1b5ad3 refactor: 重构战斗效果逻辑实现
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-04 03:14:22 +08:00
xinian
4552af99c7 fix: 修复汇率校验逻辑错误 2026-04-04 01:33:06 +08:00
xinian
8e904e9068 chore: 初始化代码仓库
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-04 01:32:48 +08:00
xinian
ca7222a6c7 feat: 新增战斗效果1568-1572及金豆订单修复
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-04 01:31:39 +08:00
xinian
dabf43aefb feat: 新增战斗效果1568-1572及金豆订单修复 2026-04-04 01:31:25 +08:00
xinian
0f862453cb feat: 实现战斗效果1543-1547和1573-1577
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-04 01:17:25 +08:00
xinian
d8fdc956ef feat: 实现战斗效果1518-1582 2026-04-04 01:04:58 +08:00
xinian
6eb1a589b4 编辑文件 Dockerfile
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-03 21:47:00 +08:00
c378d3d5f7 ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(admin): 宠物管理功能优化

- 清理宠物控制器中的乱码字符
- 更新宠物获取请求结构体字段注释为英文描述
- 重构变量命名提高代码可读性
- 添加宠物存储信息服务方法
- 优化错误提示信息为英文
- 新增宠物等级查询接口
- 改进宠物购买逻辑验证
```
2026-04-03 12:18:07 +08:00
xinian
1a0e0b405a feat: 添加自然祝福相关技能效果实现
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
实现1383-1387技能效果,包括自然祝福状态下的属性强化、自然祝福层数管理、护盾效果等
2026-04-03 11:19:20 +08:00
xinian
7405aac82d refactor: 合并同类 effect 实现到公共基类
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-03 00:26:59 +08:00
xinian
5204615c28 feat: 新增战斗效果并优化现有逻辑
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-03 00:22:05 +08:00
xinian
3c160ef695 feat: 新增精灵仓库管理及战斗特效逻辑 2026-04-03 00:02:51 +08:00
xinian
c19ee7de03 fix: 修复战斗动作提交逻辑 2026-04-03 00:02:34 +08:00
xinian
43881fd988 编辑文件 .cnb.yml
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-02 23:42:37 +08:00
xinian
d86b75408b feat: 新增技能效果1378-1382
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-02 23:32:21 +08:00
xinian
218e23ff81 refactor: 重构战斗系统动作提交和竞技场锁定逻辑
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-02 23:05:18 +08:00
xinian
f221b299cd fix: 并发安全地更新地图计数 2026-04-02 22:38:02 +08:00
xinian
908f9bee98 Merge branch 'main' of https://cnb.cool/blzing/blazing
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-02 16:24:40 +08:00
xinian
c1b18601f3 feat: 实现战斗效果 1413-1437 2026-04-02 16:24:16 +08:00
昔念
8c049bcdcd ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(admin): 宠物管理功能优化

- 清理宠物控制器中的乱码字符
- 更新宠物获取请求结构体字段注释为英文描述
- 重构变量命名提高代码可读性
- 添加宠物存储信息服务方法
- 优化错误提示信息为英文
- 新增宠物等级
2026-04-02 15:00:08 +08:00
昔念
2f220bb863 1
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-04-02 12:38:51 +08:00
昔念
6aa601bb06 1
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-02 10:23:07 +08:00
昔念
f810a2ae86 ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(pet): 宠物系统重构和功能增强

- 修复战斗boss中effect ID索引错误问题
- 实现宠物仓库和背包管理功能
- 添加宠物列表排序保存功能
- 重构宠物备份列表同步逻辑
- 优化宠物释放和获取逻辑
- 添加宠物背包仓库切换功能
- 修复地图模型广播信息结构问题
- 调整宠物特效数据库查询逻辑
```
2026-04-02 07:49:49 +08:00
昔念
3a13bcc99c ```
feat(game): 实现扭蛋系统批量物品添加功能并优化地图逻辑

- 新增ItemAddBatch方法用于批量添加物品,支持普通道具和特殊道具的分别处理
- 优化扭蛋游戏玩法中的物品添加逻辑,使用新的批量接口提升性能
- 在扭蛋机器人命令中实现完整的物品检查和批量添加流程

refactor(map): 重构地图控制器代码结构并添加注释

- 为EnterMap、LeaveMap、GetMapPlayerList等方法添加中文注释
- 统一地图相关的命名规范,如enter map替换进入地图
- 调整地图玩家列表中BOSS广播命令ID,2021和2022进行对调

refactor(boss): 重构定时BOSS代码并优化注释

- 将原有的中文注释改为英文注释,统一代码风格
- 简化TimeBossRule结构体定义和相关配置
- 优化定时任务注册逻辑,去除冗余的注释和变量

refactor(space): 清理地图空间服务代码注释

- 移除多余的中文注释和说明文字
- 统一代码格式,移除不必要的空行和注释
- 保持原有的天气系统和地图刷怪逻辑不变

fix(role): 修复系统角色权限查询逻辑

- 修改BaseSysRoleService中的查询条件,正确处理管理员权限
- 使用Extend方法替代Where进行复杂的权限判断逻辑
- 确保超级管理员可以访问所有角色,其他用户受限于权限范围

refactor(dict): 添加字典服务批量查询方法

- 新增GetMaxMap方法用于批量获取物品最大持有上限
- 优化数据库查询,减少多次单个查询的开销
- 支持一次请求多个物品的最大数量限制

fix(player): 修复玩家信息保存异常处理

- 将panic方式改为错误日志记录,避免程序崩溃
- 优化Save方法的重试逻辑,统一错误处理方式
- 在本地文件回退时记录详细错误信息

feat(robot): 扩展扭蛋机器人功能

- 添加用户验证和角色创建检查
- 实现批量扭蛋的完整逻辑,支持1-10次抽取
- 集成物品数量检查和批量添加功能
```
2026-04-02 02:33:05 +08:00
昔念
5995f0670c ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(game): 实现扭蛋系统批量物品添加功能并优化地图逻辑

- 新增ItemAddBatch方法用于批量添加物品,支持普通道具和特殊道具的分别处理
- 优化扭蛋游戏玩法中的物品添加逻辑,使用新的批量接口提升性能
- 在扭蛋机器人命令中实现完整的物品检查和批量添加流程

refactor(map): 重构地图控制器代码结构并添加注释

- 为EnterMap、LeaveMap、GetMapPlayerList等方法添加中文注释
- 统一地图相关的命名规范,如enter
2026-04-01 20:10:29 +08:00
昔念
1b6586aedc ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(space): 添加地图模型配置支持并优化BOSS信息结构

添加MapModel字段到MapBossInfo结构体中,用于存储更完整的BOSS模型数据,
修改初始化逻辑从新的MapModel服务获取数据,并更新HP恢复逻辑使用新模型数据。

同时优化MapNode配置表结构,移除冗余字段并调整数据查询逻辑,
将IsBroadcast字段类型改为uint32以
2026-04-01 06:27:03 +08:00
xinian
977fc78cf6 Merge branch 'main' of https://cnb.cool/blzing/blazing
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-01 02:53:41 +08:00
xinian
2aea283c6b feat: 新增战斗效果1338-1377 2026-04-01 02:53:23 +08:00
昔念
f377068f60 Merge branch 'main' of https://cnb.cool/blzing/blazing
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-04-01 02:48:27 +08:00
昔念
81c16590d6 ```
feat(pet): 实现宠物展示功能和稀有宠物塔配置

- 添加PetDisplay字段到Player结构体,用于管理宠物展示状态
- 实现PlayerShowPet方法,支持宠物展示逻辑,包括设置展示标识、
  检查宠物存在性并返回相应错误码
- 在Space中添加RefreshUserInfo方法,用于刷新用户信息并应用
  宠物展示信息到SimpleInfo
- 扩展SimpleInfo结构体,添加PetRide字段用于宠物骑乘标识
2026-04-01 02:48:09 +08:00
xinian
1724c06eab 继续消耗全继续 2026-04-01 00:48:42 +08:00
xinian
0a016e9e7f Merge commit '39e64c0bf50536215ca42fd0dda6e0406644d359' 2026-03-31 12:21:44 +00:00
xinian
39e64c0bf5 11 2026-03-31 20:18:54 +08:00
xinian
331337fc51 编辑文件 .cnb.yml
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-03-31 20:18:31 +08:00
昔念
acfdf5679d Merge branch 'main' of https://cnb.cool/blzing/blazing
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-03-31 20:02:39 +08:00
昔念
5675fff48c ```
docs(effect): 移除已完成的效果任务文档

移除effects 876-1061范围内的任务文档,这些effect已经实现或不再需要跟踪。
包括task-053至task-089的多个任务列表,涵盖各种战斗效果的实现说明。
```
2026-03-31 20:02:25 +08:00
xinian
8ef327cbe0 编辑文件 Dockerfile
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-03-31 19:48:23 +08:00
昔念
5b346ef505 Merge branches 'main' and 'main' of https://cnb.cool/blzing/blazing
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-03-31 10:40:51 +08:00
昔念
1a5996d902 ```
chore(go): 更新Go版本号格式

- 将 common/go.mod 中的 go 版本从 1.23.0 调整为 1.23
-
2026-03-31 10:40:37 +08:00
xinian
6d547ff656 Merge branch 'main' of https://cnb.cool/blzing/blazing
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-03-31 10:40:25 +08:00
xinian
79a3874d13 feat: 实现效果1072-1081及1173-1177 2026-03-31 10:40:22 +08:00
昔念
6ac3c1b9b7 Merge branch 'main' of https://cnb.cool/blzing/blazing
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-03-31 10:03:29 +08:00
昔念
4d39164c86 ```
feat(fight): 完善战斗效果714-718的参数验证和功能实现

- 为Effect714添加armed状态重置逻辑,并增加参数长度验证
- 修复Effect716的子效果创建逻辑,改为通过InitEffect方法创建
- 为Effect717和Effect718添加参数长度验证,防止索引越界
- 重构Effect718的技能命中处理逻辑,统一效果
2026-03-31 10:03:07 +08:00
xinian
a198100547 fix: 修复效果1071的恢复判定及子效果实现逻辑
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-03-31 10:02:48 +08:00
xinian
3bf07dd5c5 docs: 删除已完成的effect任务文档
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-03-31 09:38:00 +08:00
xinian
f85228e371 Merge branch 'main' of https://cnb.cool/blzing/blazing
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-03-31 09:19:39 +08:00
xinian
ccb4ad8fdf refactor: 重构宠物信息构建逻辑并新增技能效果 2026-03-31 09:19:36 +08:00
昔念
97b2588339 ```
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
docs(effect): 移除未实现任务文档 task-320

移除 effects 2215-2219 的未实现任务文档,这些 effect 已经被重新评估
或通过其他方式处理,不再需要单独的任务跟踪文档。
```
2026-03-31 09:18:48 +08:00
昔念
89a67655fc ```
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(effect): 实现effects 1770-1794战斗效果

- 实现Effect 1770: 开启战魂附体效果,免疫对手下1次攻击技能伤害,
  若对手攻击技能PP值为满则额外免疫下1次固定伤害和百分比伤害

- 实现Effect 1771-1779相关战斗效果,包括能力状态反转、固定伤害计算等功能

- 实现Effect 1780-1794系列效果,包含伤害计算、护盾机制、切换限制等功能

- 新增Effect1770Sub、Effect1780Sub、Effect1783Sub、Effect1784Sub等子效果处理

- 添加countTurnEffects辅助函数用于计算回合类效果数量

- 修复Effect1783切换限制逻辑,正确处理回合结束时的状态变更

- 优化Effect1780伤害计算和护盾添加的安全性检查

- 移除对应的任务文档文件,已完成effects 1660-1664、1770-1774、
  1775-1779、1790-1794等任务清单
```
2026-03-31 08:49:22 +08:00
昔念
35434fd1d8 Merge branch 'main' of https://cnb.cool/blzing/blazing
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-03-31 08:28:51 +08:00
昔念
4cf1bcc07f ```
feat(effect): 实现effects 1770-1794战斗效果

- 实现Effect 1770: 开启战魂附体效果,免疫对手下1次攻击技能伤害,
  若对手攻击技能PP值为满则额外免疫下1次固定伤害和百分比伤害

- 实现Effect 1771-1779相关战斗效果,包括能力状态反转、固定伤害计算等功能

- 实现Effect 1780-1794系列效果,包含伤害计算、护盾机制、切换限制等功能
2026-03-31 08:28:37 +08:00
xinian
f8c301dc51 Merge branch 'main' of https://cnb.cool/blzing/blazing
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-03-31 08:20:24 +08:00
xinian
8805e038b6 docs: 移除已完成的待办任务文档 2026-03-31 08:20:22 +08:00
xinian
d6d03a576d refactor: 优化代码结构和逻辑 2026-03-31 08:19:53 +08:00
昔念
1a804f5e19 Merge branch 'main' of https://cnb.cool/blzing/blazing
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-03-31 06:52:19 +08:00
昔念
07758266d5 ```
feat(effect): 实现多个战斗效果功能

- 实现了effects 2195-2199的功能,包括消除对手回合类效果、概率附加效果、
  护盾/护罩状态下触发的效果等

- 实现了effects 2220-2239的功能,包括攻击特攻最高值转换、闪避与PP归零、
  伤害提升、恢复体力、回合效果管理等功能

- 实现了effects 2270-2294的部分功能修复,调整了精灵
2026-03-31 06:51:54 +08:00
xinian
b4a8048b85 feat: 添加战斗效果800-814及优化道具逻辑
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-03-31 06:51:40 +08:00
xinian
8552eb61a8 chore: 移除未使用的技能效果描述
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-03-31 04:39:39 +08:00
xinian
b4463c35e0 feat: 新增效果实现并重构相关逻辑
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-03-31 04:36:25 +08:00
xinian
79c014f9cd fix: 修正技能效果索引与实现逻辑
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-03-31 03:42:46 +08:00
xinian
7e3f31e267 编辑文件 .cnb.yml
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-03-31 01:47:32 +08:00
xinian
799fb24f43 编辑文件 .cnb.yml
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-03-31 01:44:41 +08:00
xinian
e440bd7613 编辑文件 Dockerfile
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
2026-03-31 01:41:49 +08:00
xinian
10f20f453d Merge branch 'main' of https://cnb.cool/blzing/blazing
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
2026-03-31 01:40:58 +08:00
xinian
92d3c755a5 feat: 实现 764-799 效果及修复编译错误 2026-03-31 01:40:23 +08:00
935 changed files with 46445 additions and 375159 deletions

View File

@@ -1,7 +1,15 @@
$:
vscode:
- runner:
cpus: 2
cpus: 6
docker:
build: .ide/Dockerfile
services:
- vscode
- docker
stages:
- name: ls
script: ls -al
main:
push:

0
.codex Normal file
View File

3
.gitignore vendored
View File

@@ -46,4 +46,5 @@ public/login-linux-amd64
.cache/gomod/**
public/login-login-linux-amd64
public/logic_linux-amd64_1
.cache/**
.cache/**
.agents/**

View File

@@ -18,9 +18,11 @@ ENV GOMODCACHE=/workspace/.cache/gomod
# ==========================================
# 2. Codex 配置 (更换时修改这里重新 build)
# ==========================================
ENV CODEX_BASE_URL="http://43.142.61.67:8098/v1"
ENV CODEX_BASE_URL="https://api.jucode.cn/v1"
ENV CODEX_MODEL="gpt-5.4"
ENV OPENAI_API_KEY="sk-e354141068a0a3331c2a59a44b90cf240e9dcd7498796c4f7c801d398658fc14"
ENV OPENAI_API_KEY="sk-E0ZZIFNnD0RkhMC9pT2AGMutz9vNy2VLNrgyyobT5voa81pQ"
# ==========================================
# 3. 安装系统依赖GolangCode-server

View File

@@ -1,12 +1,7 @@
青氧,十九禁给
https://api.aibh.site/console 张晟 2922919493Zs.
RUN curl -fsSL https://oss.itbzzb.cn/setup-codex.sh | \
YES=1 bash -s -- --base-url https://api.aibh.site \
--api-key sk-foAHgsJtmanACECtBlFYZE2z4LkwBboEOYETO3ZdWvCxdmNr \
--mirror auto
https://api.gemai.cc/console/token 免费给部分额度 ,还有100块
https://api.jucode.cn/
fastai.fast 使用谷歌邮箱https://linshiguge.com/白嫖
https://zread.ai/tawer-blog/lmarena-2api/1-overview GLM web2 pai
https://crazyrouter.com/console 模型最便宜,看看能不能1:10
@@ -14,7 +9,7 @@ https://crazyrouter.com/console 模型最便宜,看看能不能1:10
https://agentrouter.org/pricing 签到给,有175
kuaipao.ai 充了十块 cjf19970621 cjf19970621
充了十块
使用网址https://www.jnm.lol
@@ -26,3 +21,10 @@ kuaipao.ai 充了十块 cjf19970621 cjf19970621
fastai.fast 575560454@qq.com 575560454

2
.vscode/launch.json vendored
View File

@@ -29,7 +29,7 @@
"request": "launch",
"mode": "auto",
"cwd": "${workspaceFolder}",
"args": ["-id=2"],
"args": ["-id=99"],
"program": "${workspaceFolder}/logic"
}

View File

@@ -144,14 +144,14 @@ steps:
scp-exe-to-servers: # 与fetch-deploy-config同级缩进2个空格
image: appleboy/drone-scp:1.6.2 # 子元素缩进4个空格
settings: # 子元素缩进4个空格
host: &ssh_host 2697v22.mc5173.cn
port: &ssh_port 16493
host: &ssh_host 43.248.3.21
port: &ssh_port 22
username: &ssh_user root
password: &ssh_pass xIy9PQcBF96C
password: &ssh_pass KQv7yzna7BDukK
source:
- blazing/build/**
target: /opt/blazing/
target: /ext/blazing/
strip_components: 1 # 统一缩进6个空格
skip_verify: true # 统一缩进6个空格
timeout: 30s # 统一缩进6个空格
@@ -167,7 +167,7 @@ steps:
password: *ssh_pass
script:
- |
cd /opt/blazing/build
cd /ext/blazing/build
ls -t login_* 2>/dev/null | head -1
BIN_NAME=$(ls -t login_* 2>/dev/null | head -1)
echo "BIN_NAME: $BIN_NAME"
@@ -201,9 +201,9 @@ steps:
# 移动logic产物到public目录
LOGIC_BIN=$(ls -t logic_* 2>/dev/null | head -1)
if [ -n "$LOGIC_BIN" ]; then
mkdir -p /opt/blazing/build/public
mv $LOGIC_BIN /opt/blazing/build/public/
echo "✅ Logic产物已移动到 /opt/blazing/build/public/ | 文件: $(basename $LOGIC_BIN)"
mkdir -p /ext/blazing/build/public
mv $LOGIC_BIN /ext/blazing/build/public/
echo "✅ Logic产物已移动到 /ext/blazing/build/public/ | 文件: $(basename $LOGIC_BIN)"
else
echo "⚠️ 未找到Logic产物"
fi

View File

@@ -0,0 +1,56 @@
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
func main() {
const dsn = "user=user_YrK4j7 password=password_jSDm76 host=43.248.3.21 port=5432 dbname=bl sslmode=disable timezone=Asia/Shanghai"
db, err := sql.Open("postgres", dsn)
if err != nil {
log.Fatal(err)
}
defer db.Close()
var (
id int64
cdkCode string
cdkType int64
exchangeRemainCount int64
bindUserID int64
validEndTime sql.NullTime
remark sql.NullString
)
err = db.QueryRow(`
select id, cdk_code, type, exchange_remain_count, bind_user_id, valid_end_time, remark
from config_gift_cdk
where cdk_code = $1
`, "nrTbdXFBhKkaTdDk").Scan(
&id,
&cdkCode,
&cdkType,
&exchangeRemainCount,
&bindUserID,
&validEndTime,
&remark,
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("id=%d\ncdk_code=%s\ntype=%d\nexchange_remain_count=%d\nbind_user_id=%d\nvalid_end_time=%v\nremark=%q\n",
id,
cdkCode,
cdkType,
exchangeRemainCount,
bindUserID,
validEndTime.Time,
remark.String,
)
}

View File

@@ -1,121 +1,121 @@
package coolconfig
import (
"time"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
)
// cool config
type sConfig struct {
AutoMigrate bool `json:"auto_migrate,omitempty"` // 是否自动创建表
Eps bool `json:"eps,omitempty"` // 是否开启eps
File *file `json:"file,omitempty"` // 文件上传配置
Name string `json:"name"` // 项目名称
// LoginPort string `json:"port"`
GameOnlineID uint32 `json:"port_bl"` //这个是命令行输入的参数
ServerInfo ServerList
Address string //rpc端口
}
type ServerList struct {
OnlineID uint32 `gorm:"column:online_id;comment:'在线ID';uniqueIndex" json:"online_id"`
//服务器名称Desc
Name string `gorm:"comment:'服务器名称'" json:"name"`
IP string `gorm:"type:string;comment:'服务器IP'" json:"ip"`
Port uint32 `gorm:"comment:'端口号,通常是小整数'" json:"port"`
IsOpen uint8 `gorm:"default:0;not null;comment:'是否开启'" json:"is_open"`
//登录地址
LoginAddr string `gorm:"type:string;comment:'登录地址'" json:"login_addr"`
//账号
Account string `gorm:"type:string;comment:'账号'" json:"account"`
//密码
Password string `gorm:"type:string;comment:'密码'" json:"password"`
CanPort []uint32 `gorm:"type:jsonb;comment:'可连接端口'" json:"can_port"`
//是否测试服
IsVip uint32 `gorm:"default:0;not null;comment:'是否为VIP服务器'" json:"is_vip"`
//isdebug 是否本地服
IsDebug uint8 `gorm:"default:0;comment:'是否为调试模式'" json:"is_debug"`
//服务器属主Desc
Owner uint32 `gorm:"comment:'服务器属主'" json:"owner"`
Desc string `gorm:"comment:'服务器描述'" json:"desc"`
OldScreen string `gorm:"comment:'服务器screen参数'" json:"old_screen"`
//到期时间ServerList
ExpireTime time.Time `gorm:"default:0;comment:'到期时间'" json:"expire_time"`
}
func (s *ServerList) GetID() string {
return gconv.String(100000*s.OnlineID + s.Port)
}
// OSS相关配置
type oss struct {
Endpoint string `json:"endpoint"`
AccessKeyID string `json:"accessKeyID"`
SecretAccessKey string `json:"secretAccessKey"`
UseSSL bool `json:"useSSL"`
BucketName string `json:"bucketName"`
Location string `json:"location"`
}
// 文件上传配置
type file struct {
Mode string `json:"mode"` // 模式 local oss
Domain string `json:"domain"` // 域名 http://
Oss *oss `json:"oss,omitempty"`
}
// NewConfig new config
func newConfig() *sConfig {
var ctx g.Ctx
config := &sConfig{
AutoMigrate: GetCfgWithDefault(ctx, "blazing.autoMigrate", g.NewVar(false)).Bool(),
Name: GetCfgWithDefault(ctx, "server.name", g.NewVar("")).String(),
Eps: GetCfgWithDefault(ctx, "blazing.eps", g.NewVar(false)).Bool(),
// LoginPort: string(GetCfgWithDefault(ctx, "server.port", g.NewVar("8080")).String()),
Address: GetCfgWithDefault(ctx, "server.address", g.NewVar("8080")).String(),
//GamePort: GetCfgWithDefault(ctx, "server.game", g.NewVar("8080")).Uint64s(),
File: &file{
Mode: GetCfgWithDefault(ctx, "blazing.file.mode", g.NewVar("none")).String(),
Domain: GetCfgWithDefault(ctx, "blazing.file.domain", g.NewVar("http://127.0.0.1:8300")).String(),
Oss: &oss{
Endpoint: GetCfgWithDefault(ctx, "blazing.file.oss.endpoint", g.NewVar("127.0.0.1:9000")).String(),
AccessKeyID: GetCfgWithDefault(ctx, "blazing.file.oss.accessKeyID", g.NewVar("")).String(),
SecretAccessKey: GetCfgWithDefault(ctx, "blazing.file.oss.secretAccessKey", g.NewVar("")).String(),
UseSSL: GetCfgWithDefault(ctx, "blazing.file.oss.useSSL", g.NewVar(false)).Bool(),
BucketName: GetCfgWithDefault(ctx, "blazing.file.oss.bucketName", g.NewVar("blazing")).String(),
Location: GetCfgWithDefault(ctx, "blazing.file.oss.location", g.NewVar("us-east-1")).String(),
},
},
}
return config
}
// qiniu 七牛云配置
type qiniu struct {
AccessKey string `json:"ak"`
SecretKey string `json:"sk"`
Bucket string `json:"bucket"`
CDN string `json:"cdn"`
}
// Config config
var Config = newConfig()
// GetCfgWithDefault get config with default value
func GetCfgWithDefault(ctx g.Ctx, key string, defaultValue *g.Var) *g.Var {
value, err := g.Cfg().GetWithEnv(ctx, key)
if err != nil {
return defaultValue
}
if value.IsEmpty() || value.IsNil() {
return defaultValue
}
return value
}
package coolconfig
import (
"time"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
)
// cool config
type sConfig struct {
AutoMigrate bool `json:"auto_migrate,omitempty"` // 是否自动创建表
Eps bool `json:"eps,omitempty"` // 是否开启eps
File *file `json:"file,omitempty"` // 文件上传配置
Name string `json:"name"` // 项目名称
// LoginPort string `json:"port"`
GameOnlineID uint32 `json:"port_bl"` //这个是命令行输入的参数
ServerInfo ServerList
Address string //rpc端口
}
type ServerList struct {
OnlineID uint32 `gorm:"column:online_id;comment:'在线ID';uniqueIndex" json:"online_id"`
//服务器名称Desc
Name string `gorm:"comment:'服务器名称'" json:"name"`
IP string `gorm:"type:string;comment:'服务器IP'" json:"ip"`
Port uint32 `gorm:"comment:'端口号,通常是小整数'" json:"port"`
IsOpen uint8 `gorm:"default:0;not null;comment:'是否开启'" json:"is_open"`
//登录地址
LoginAddr string `gorm:"type:string;comment:'登录地址'" json:"login_addr"`
//账号
Account string `gorm:"type:string;comment:'账号'" json:"account"`
//密码
Password string `gorm:"type:string;comment:'密码'" json:"password"`
CanPort []uint32 `gorm:"type:jsonb;comment:'可连接端口'" json:"can_port"`
//是否测试服
IsVip uint32 `gorm:"default:0;not null;comment:'是否为VIP服务器'" json:"is_vip"`
//isdebug 是否本地服
IsDebug uint8 `gorm:"default:0;comment:'是否为调试模式'" json:"is_debug"`
//服务器属主Desc
Owner uint32 `gorm:"comment:'服务器属主'" json:"owner"`
Desc string `gorm:"comment:'服务器描述'" json:"desc"`
OldScreen string `gorm:"comment:'服务器screen参数'" json:"old_screen"`
//到期时间ServerList
ExpireTime time.Time `gorm:"default:0;comment:'到期时间'" json:"expire_time"`
}
func (s *ServerList) GetID() string {
return gconv.String(100000*s.OnlineID + s.Port)
}
// OSS相关配置
type oss struct {
Endpoint string `json:"endpoint"`
AccessKeyID string `json:"accessKeyID"`
SecretAccessKey string `json:"secretAccessKey"`
UseSSL bool `json:"useSSL"`
BucketName string `json:"bucketName"`
Location string `json:"location"`
}
// 文件上传配置
type file struct {
Mode string `json:"mode"` // 模式 local oss
Domain string `json:"domain"` // 域名 http://
Oss *oss `json:"oss,omitempty"`
}
// NewConfig new config
func newConfig() *sConfig {
var ctx g.Ctx
config := &sConfig{
AutoMigrate: GetCfgWithDefault(ctx, "blazing.autoMigrate", g.NewVar(false)).Bool(),
Name: GetCfgWithDefault(ctx, "server.name", g.NewVar("")).String(),
Eps: GetCfgWithDefault(ctx, "blazing.eps", g.NewVar(false)).Bool(),
// LoginPort: string(GetCfgWithDefault(ctx, "server.port", g.NewVar("8080")).String()),
Address: GetCfgWithDefault(ctx, "server.address", g.NewVar("8080")).String(),
//GamePort: GetCfgWithDefault(ctx, "server.game", g.NewVar("8080")).Uint64s(),
File: &file{
Mode: GetCfgWithDefault(ctx, "blazing.file.mode", g.NewVar("none")).String(),
Domain: GetCfgWithDefault(ctx, "blazing.file.domain", g.NewVar("http://127.0.0.1:8300")).String(),
Oss: &oss{
Endpoint: GetCfgWithDefault(ctx, "blazing.file.oss.endpoint", g.NewVar("127.0.0.1:9000")).String(),
AccessKeyID: GetCfgWithDefault(ctx, "blazing.file.oss.accessKeyID", g.NewVar("")).String(),
SecretAccessKey: GetCfgWithDefault(ctx, "blazing.file.oss.secretAccessKey", g.NewVar("")).String(),
UseSSL: GetCfgWithDefault(ctx, "blazing.file.oss.useSSL", g.NewVar(false)).Bool(),
BucketName: GetCfgWithDefault(ctx, "blazing.file.oss.bucketName", g.NewVar("blazing")).String(),
Location: GetCfgWithDefault(ctx, "blazing.file.oss.location", g.NewVar("us-east-1")).String(),
},
},
}
return config
}
// qiniu 七牛云配置
type qiniu struct {
AccessKey string `json:"ak"`
SecretKey string `json:"sk"`
Bucket string `json:"bucket"`
CDN string `json:"cdn"`
}
// Config config
var Config = newConfig()
// GetCfgWithDefault get config with default value
func GetCfgWithDefault(ctx g.Ctx, key string, defaultValue *g.Var) *g.Var {
value, err := g.Cfg().GetWithEnv(ctx, key)
if err != nil {
return defaultValue
}
if value.IsEmpty() || value.IsNil() {
return defaultValue
}
return value
}

View File

@@ -22,8 +22,14 @@ var ctx = context.TODO()
type Cmd struct {
Func reflect.Value //方法函数
Req reflect.Type //请求体
// HeaderFieldIndex 是请求结构体中 TomeeHeader 字段的索引路径。
HeaderFieldIndex []int
// UseConn 标记第二个参数是否为 gnet.Conn。
UseConn bool
// 新增预缓存的req创建函数返回结构体指针
NewReqFunc func() interface{}
// NewReqValue 返回请求结构体指针的 reflect.Value避免重复构造类型信息。
NewReqValue func() reflect.Value
//Res reflect.Value //返回体
}

View File

@@ -3,6 +3,7 @@ package cool
import (
_ "blazing/contrib/drivers/pgsql"
"blazing/cool/cooldb"
"sync"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g"
@@ -10,6 +11,11 @@ import (
"gorm.io/gorm"
)
var (
autoMigrateMu sync.Mutex
autoMigrateModels []IModel
)
// 初始化数据库连接供gorm使用
func InitDB(group string) (*gorm.DB, error) {
// var ctx context.Context
@@ -54,9 +60,33 @@ func getDBbyModel(model IModel) *gorm.DB {
// 根据entity结构体创建表
func CreateTable(model IModel) error {
if Config.AutoMigrate {
autoMigrateMu.Lock()
autoMigrateModels = append(autoMigrateModels, model)
autoMigrateMu.Unlock()
return nil
}
// RunAutoMigrate 显式执行已注册模型的建表/迁移。
func RunAutoMigrate() error {
if !Config.AutoMigrate {
return nil
}
autoMigrateMu.Lock()
models := append([]IModel(nil), autoMigrateModels...)
autoMigrateMu.Unlock()
seen := make(map[string]struct{}, len(models))
for _, model := range models {
key := model.GroupName() + ":" + model.TableName()
if _, ok := seen[key]; ok {
continue
}
seen[key] = struct{}{}
db := getDBbyModel(model)
return db.AutoMigrate(model)
if err := db.AutoMigrate(model); err != nil {
return err
}
}
return nil
}

View File

@@ -6,6 +6,16 @@ func AddClient(id uint32, client *ClientHandler) {
Clientmap.Store(id, client) // sync.Map存值
}
// 清理指定clientuid=100000*onlineID+port
func DeleteClientOnly(uid uint32) {
Clientmap.Delete(uid)
}
// 清理指定clientonlineID+port
func DeleteClient(id, port uint32) {
Clientmap.Delete(100000*id + port)
}
// 取值示例
func GetClient(id, port uint32) (*ClientHandler, bool) {
// 普通mapclient, ok := Clientmap[id]

View File

@@ -42,15 +42,15 @@ const (
maxMatrixSize = 227 // 矩阵维度覆盖最大属性ID 226
)
// 合法单属性ID集合快速校验
var validSingleElementIDs = map[int]bool{
// 合法单属性ID集合按ID直接索引避免运行时 map 查找
var validSingleElementIDs = [maxMatrixSize]bool{
1: true, 2: true, 3: true, 4: true, 5: true, 6: true, 7: true, 8: true, 9: true, 10: true,
11: true, 12: true, 13: true, 14: true, 15: true, 16: true, 17: true, 18: true, 19: true, 20: true,
221: true, 222: true, 223: true, 224: true, 225: true, 226: true,
}
// 元素名称映射(全属性对应,便于日志输出)
var elementNameMap = map[ElementType]string{
// 元素名称映射(按ID直接索引,便于日志输出)
var elementNameMap = [maxMatrixSize]string{
ElementTypeGrass: "GRASS",
ElementTypeWater: "WATER",
ElementTypeFire: "FIRE",
@@ -198,46 +198,55 @@ type ElementCombination struct {
ID int // 组合唯一ID
}
// 全局预加载资源(程序启动时init初始化,运行时直接使用
// 全局预加载资源(程序启动时初始化,运行时只读
var (
// 元素组合池key=组合IDvalue=组合实例(预加载所有合法组合)
elementCombinationPool = make(map[int]*ElementCombination, 150) // 128双+26单=154预分配足够容量
// 单属性克制矩阵预初始化所有特殊克制关系默认1.0
matrix [maxMatrixSize][maxMatrixSize]float64
validCombinationIDs [maxMatrixSize]bool
elementCombinationPool [maxMatrixSize]ElementCombination
dualElementSecondaryPool [maxMatrixSize]ElementType
matrix [maxMatrixSize][maxMatrixSize]float64
Calculator *ElementCalculator
)
// init 预加载所有资源(程序启动时执行一次,无并发问题)
func init() {
// 1. 初始化单属性克制矩阵
initFullTableMatrix()
initElementCombinationPool()
Calculator = NewElementCalculator()
}
// 2. 预加载所有单属性组合
for id := range validSingleElementIDs {
combo := &ElementCombination{
Primary: ElementType(id),
Secondary: nil,
ID: id,
func initElementCombinationPool() {
for id, valid := range validSingleElementIDs {
if !valid {
continue
}
validCombinationIDs[id] = true
elementCombinationPool[id] = ElementCombination{
Primary: ElementType(id),
ID: id,
}
elementCombinationPool[id] = combo
}
// 3. 预加载所有双属性组合
for dualID, atts := range dualElementMap {
primaryID, secondaryID := atts[0], atts[1]
// 按ID升序排序保证组合一致性
primary, secondary := ElementType(primaryID), ElementType(secondaryID)
if primary > secondary {
primary, secondary = secondary, primary
}
combo := &ElementCombination{
dualElementSecondaryPool[dualID] = secondary
validCombinationIDs[dualID] = true
elementCombinationPool[dualID] = ElementCombination{
Primary: primary,
Secondary: &secondary,
Secondary: &dualElementSecondaryPool[dualID],
ID: dualID,
}
elementCombinationPool[dualID] = combo
}
}
func isValidCombinationID(id int) bool {
return id > 0 && id < maxMatrixSize && validCombinationIDs[id]
}
// IsDual 判断是否为双属性
func (ec *ElementCombination) IsDual() bool {
return ec.Secondary != nil
@@ -245,84 +254,82 @@ func (ec *ElementCombination) IsDual() bool {
// Elements 获取所有属性列表
func (ec *ElementCombination) Elements() []ElementType {
if ec.IsDual() {
return []ElementType{ec.Primary, *ec.Secondary}
if secondary := ec.Secondary; secondary != nil {
return []ElementType{ec.Primary, *secondary}
}
return []ElementType{ec.Primary}
}
// String 友好格式化输出
func (ec *ElementCombination) String() string {
primaryName := elementNameMap[ec.Primary]
if !ec.IsDual() {
return fmt.Sprintf("(%s)", primaryName)
if secondary := ec.Secondary; secondary != nil {
return fmt.Sprintf("(%s, %s)", elementNameMap[ec.Primary], elementNameMap[*secondary])
}
return fmt.Sprintf("(%s, %s)", primaryName, elementNameMap[*ec.Secondary])
return fmt.Sprintf("(%s)", elementNameMap[ec.Primary])
}
// ElementCalculator 无锁元素克制计算器(依赖预加载资源
// ElementCalculator 无锁元素克制计算器(所有倍数在初始化阶段预计算
type ElementCalculator struct {
offensiveCache map[string]float64 // 攻击克制缓存(运行时填充,无并发写)
offensiveTable [maxMatrixSize][maxMatrixSize]float64
}
// NewElementCalculator 创建计算器实例(仅初始化缓存)
// NewElementCalculator 创建计算器实例(构建只读查表缓存)
func NewElementCalculator() *ElementCalculator {
return &ElementCalculator{
offensiveCache: make(map[string]float64, 4096), // 预分配大容量缓存
c := &ElementCalculator{}
c.initOffensiveTable()
return c
}
func (c *ElementCalculator) initOffensiveTable() {
for attackerID, valid := range validCombinationIDs {
if !valid {
continue
}
attacker := &elementCombinationPool[attackerID]
for defenderID, valid := range validCombinationIDs {
if !valid {
continue
}
defender := &elementCombinationPool[defenderID]
c.offensiveTable[attackerID][defenderID] = c.calculateMultiplier(attacker, defender)
}
}
}
// getMatrixValue 直接返回矩阵值修复核心问题不再将0转换为1
func (c *ElementCalculator) getMatrixValue(attacker, defender ElementType) float64 {
return matrix[attacker][defender] // 矩阵默认已初始化1.0,特殊值直接返回
return matrix[attacker][defender]
}
// GetCombination 获取元素组合(直接从预加载池读取
// GetCombination 获取元素组合(直接按ID索引
func (c *ElementCalculator) GetCombination(id int) (*ElementCombination, error) {
combo, exists := elementCombinationPool[id]
if !exists {
if !isValidCombinationID(id) {
return nil, fmt.Errorf("invalid element combination ID: %d", id)
}
return combo, nil
return &elementCombinationPool[id], nil
}
// GetOffensiveMultiplier 计算攻击方→防御方的克制倍数(缓存优先
// GetOffensiveMultiplier 计算攻击方→防御方的克制倍数(只读查表
func (c *ElementCalculator) GetOffensiveMultiplier(attackerID, defenderID int) (float64, error) {
// 1. 获取预加载的组合实例
attacker, err := c.GetCombination(attackerID)
if err != nil {
return 0, fmt.Errorf("attacker invalid: %w", err)
if !isValidCombinationID(attackerID) {
return 0, fmt.Errorf("attacker invalid: invalid element combination ID: %d", attackerID)
}
defender, err := c.GetCombination(defenderID)
if err != nil {
return 0, fmt.Errorf("defender invalid: %w", err)
if !isValidCombinationID(defenderID) {
return 0, fmt.Errorf("defender invalid: invalid element combination ID: %d", defenderID)
}
// 2. 缓存键(全局唯一)
cacheKey := fmt.Sprintf("a%d_d%d", attackerID, defenderID)
if val, exists := c.offensiveCache[cacheKey]; exists {
return val, nil
}
// 3. 核心计算+缓存
val := c.calculateMultiplier(attacker, defender)
c.offensiveCache[cacheKey] = val
return val, nil
return c.offensiveTable[attackerID][defenderID], nil
}
// calculateMultiplier 核心克制计算逻辑
func (c *ElementCalculator) calculateMultiplier(attacker, defender *ElementCombination) float64 {
// 场景1单→单
if !attacker.IsDual() && !defender.IsDual() {
return c.getMatrixValue(attacker.Primary, defender.Primary)
}
// 场景2单→双
if !attacker.IsDual() {
y1, y2 := defender.Primary, *defender.Secondary
m1 := c.getMatrixValue(attacker.Primary, y1)
m2 := c.getMatrixValue(attacker.Primary, y2)
switch {
case m1 == 2 && m2 == 2:
return 4.0
@@ -333,12 +340,10 @@ func (c *ElementCalculator) calculateMultiplier(attacker, defender *ElementCombi
}
}
// 场景3双→单
if !defender.IsDual() {
return c.calculateDualToSingle(attacker.Primary, *attacker.Secondary, defender.Primary)
}
// 场景4双→双
x1, x2 := attacker.Primary, *attacker.Secondary
y1, y2 := defender.Primary, *defender.Secondary
coeffY1 := c.calculateDualToSingle(x1, x2, y1)
@@ -350,7 +355,6 @@ func (c *ElementCalculator) calculateMultiplier(attacker, defender *ElementCombi
func (c *ElementCalculator) calculateDualToSingle(attacker1, attacker2, defender ElementType) float64 {
k1 := c.getMatrixValue(attacker1, defender)
k2 := c.getMatrixValue(attacker2, defender)
switch {
case k1 == 2 && k2 == 2:
return 4.0
@@ -361,60 +365,49 @@ func (c *ElementCalculator) calculateDualToSingle(attacker1, attacker2, defender
}
}
var Calculator = NewElementCalculator()
// TestAllScenarios 全场景测试(验证预加载和计算逻辑)
func TestAllScenarios() {
// 测试1单→单草→水
m1, _ := Calculator.GetOffensiveMultiplier(1, 2)
fmt.Println("草→水: %.2f预期2.0", m1)
if math.Abs(m1-2.0) > 0.001 {
fmt.Println("测试1失败实际%.2f", m1)
}
// 测试2特殊单→单混沌→虚空
m2, _ := Calculator.GetOffensiveMultiplier(222, 226)
fmt.Println("混沌→虚空: %.2f预期0.0", m2)
if math.Abs(m2-0.0) > 0.001 {
fmt.Println("测试2失败实际%.2f", m2)
}
// 测试3单→双火→冰龙43
m3, _ := Calculator.GetOffensiveMultiplier(3, 43)
fmt.Println("火→冰龙: %.2f预期1.5", m3)
if math.Abs(m3-1.5) > 0.001 {
fmt.Println("测试3失败实际%.2f", m3)
}
// 测试4双→特殊单混沌暗影92→神灵223
m4, _ := Calculator.GetOffensiveMultiplier(92, 223)
fmt.Println("混沌暗影→神灵: %.2f预期1.25", m4)
if math.Abs(m4-1.25) > 0.001 {
fmt.Println("测试4失败实际%.2f", m4)
}
// 测试5双→双虚空邪灵113→混沌远古98
m5, _ := Calculator.GetOffensiveMultiplier(113, 98)
fmt.Println("虚空邪灵→混沌远古: %.2f预期0.875", m5)
if math.Abs(m5-0.875) > 0.001 {
fmt.Println("测试5失败实际%.2f", m5)
}
// 测试6缓存命中
m6, _ := Calculator.GetOffensiveMultiplier(113, 98)
if math.Abs(m6-m5) > 0.001 {
fmt.Println("测试6失败缓存未命中")
}
// 测试7含无效组合电→地面
m7, _ := Calculator.GetOffensiveMultiplier(5, 7)
fmt.Println("电→地面: %.2f预期0.0", m7)
if math.Abs(m7-0.0) > 0.001 {
fmt.Println("测试7失败实际%.2f", m7)
}
// 测试8双属性含无效电战斗→地面
m8, _ := Calculator.GetOffensiveMultiplier(35, 7)
fmt.Println("电战斗→地面: %.2f预期0.25", m8)
if math.Abs(m8-0.25) > 0.001 {

View File

@@ -5,7 +5,7 @@ type EffectArg struct {
SideEffect []struct {
ID int `json:"ID"`
SideEffectArgcount int `json:"SideEffectArgcount"`
SideEffectArg string `json:"SideEffectArg,omitempty"`
SideEffectArg rawFlexibleString `json:"SideEffectArg,omitempty"`
} `json:"SideEffect"`
} `json:"SideEffects"`
}

View File

@@ -5,7 +5,7 @@ import (
_ "blazing/common/data/xmlres/packed"
"encoding/json"
"os"
"fmt"
"github.com/ECUST-XX/xml"
"github.com/gogf/gf/v2/os/gres"
@@ -14,22 +14,36 @@ import (
var path string
func readConfigContent(path string) []byte {
return gres.GetContent(path)
}
func getXml[T any](path string) T {
// 解析XML到结构体
var xmls T
t1 := gres.GetContent(path)
t1 := readConfigContent(path)
xml.Unmarshal(t1, &xmls)
return xmls
}
func getJson[T any](path string) T {
// 解析XML到结构体
// 解析JSON到结构体
var xmls T
t1 := gres.GetContent(path)
json.Unmarshal(t1, &xmls)
t1 := readConfigContent(path)
if len(t1) == 0 {
fmt.Printf("[xmlres] getJson empty content: path=%s\n", path)
return xmls
}
if err := json.Unmarshal(t1, &xmls); err != nil {
head := string(t1)
if len(head) > 300 {
head = head[:300]
}
fmt.Printf("[xmlres] getJson unmarshal failed: path=%s len=%d err=%v head=%q\n", path, len(t1), err, head)
}
return xmls
}
@@ -58,8 +72,6 @@ var (
func Initfile() {
//gres.Dump()
path1, _ := os.Getwd()
path = path1 + "/public/config/"
path = "config/"
MapConfig = getXml[Maps](path + "210.xml")
@@ -87,10 +99,10 @@ func Initfile() {
return gconv.Int(m.ProductID)
})
Skill := getXml[MovesTbl](path + "227.xml")
skillConfig := getJson[MovesJSON](path + "moves_flash.json")
SkillMap = make(map[int]Move, len(Skill.Moves))
for _, v := range Skill.Moves {
SkillMap = make(map[int]Move, len(skillConfig.MovesTbl.Moves.Move))
for _, v := range skillConfig.MovesTbl.Moves.Move {
v.SideEffectS = ParseSideEffectArgs(v.SideEffect)
v.SideEffectArgS = ParseSideEffectArgs(v.SideEffectArg)
SkillMap[v.ID] = v
@@ -101,7 +113,11 @@ func Initfile() {
})
PetMAP = utils.ToMap[PetInfo, int](getXml[Monsters](path+"226.xml").Monsters, func(m PetInfo) int {
pets := getXml[Monsters](path + "226.xml").Monsters
for i := range pets {
pets[i].YieldingEVValues = parseYieldingEV(pets[i].YieldingEV)
}
PetMAP = utils.ToMap[PetInfo, int](pets, func(m PetInfo) int {
return m.ID
})

View File

@@ -0,0 +1,26 @@
package xmlres
import (
"encoding/json"
"testing"
)
func TestMoveUnmarshalJSONAcceptsNumericName(t *testing.T) {
var move Move
if err := json.Unmarshal([]byte(`{"ID":10001,"Name":1,"Category":1,"Type":8,"Power":35,"MaxPP":35,"Accuracy":95}`), &move); err != nil {
t.Fatalf("unmarshal move failed: %v", err)
}
if move.Name != "1" {
t.Fatalf("expected numeric name to convert to string, got %q", move.Name)
}
}
func TestEffectArgUnmarshalJSONAcceptsNumericSideEffectArg(t *testing.T) {
var cfg EffectArg
if err := json.Unmarshal([]byte(`{"SideEffects":{"SideEffect":[{"ID":1,"SideEffectArgcount":1,"SideEffectArg":3}]}}`), &cfg); err != nil {
t.Fatalf("unmarshal effect arg failed: %v", err)
}
if got := string(cfg.SideEffects.SideEffect[0].SideEffectArg); got != "3" {
t.Fatalf("expected numeric side effect arg to convert to string, got %q", got)
}
}

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,11 @@
package xmlres
import "github.com/ECUST-XX/xml"
import (
"strconv"
"strings"
"github.com/ECUST-XX/xml"
)
// Move 表示怪物可学习的技能
type PetMoves struct {
@@ -45,6 +50,7 @@ type PetInfo struct {
Recycle int `xml:"Recycle,attr"` // 是否可回收
LearnableMoves LearnableMoves `xml:"LearnableMoves"` // 可学习的技能
NaturalEnemy string `xml:"NaturalEnemy,attr"` //天敌
YieldingEVValues []int64 `xml:"-"` // 预解析后的努力值奖励
}
func (basic *PetInfo) GetBasic() uint32 {
@@ -61,3 +67,16 @@ type Monsters struct {
XMLName xml.Name `xml:"Monsters"`
Monsters []PetInfo `xml:"Monster"`
}
func parseYieldingEV(raw string) []int64 {
values := make([]int64, 6)
parts := strings.Fields(raw)
for i := 0; i < len(parts) && i < len(values); i++ {
value, err := strconv.ParseInt(parts[i], 10, 64)
if err != nil {
continue
}
values[i] = value
}
return values
}

View File

@@ -1,6 +1,7 @@
package xmlres
import (
"encoding/json"
"encoding/xml"
"fmt"
"io"
@@ -33,51 +34,156 @@ type MovesTbl struct {
Moves []Move `xml:"Moves>Move"`
EFF []SideEffect `xml:"SideEffects>SideEffect"`
}
type MovesJSON struct {
MovesTbl MovesJSONRoot `json:"MovesTbl"`
}
type MovesJSONRoot struct {
Moves struct {
Move []Move `json:"Move"`
} `json:"Moves"`
SideEffects struct {
SideEffect []SideEffect `json:"SideEffect"`
} `json:"SideEffects"`
}
type MovesMap struct {
XMLName xml.Name `xml:"MovesTbl"`
Moves map[int]Move
EFF []SideEffect `xml:"SideEffects>SideEffect"`
}
type rawFlexibleString string
func (s *rawFlexibleString) UnmarshalJSON(data []byte) error {
text := strings.TrimSpace(string(data))
if text == "" || text == "null" {
*s = ""
return nil
}
if len(text) >= 2 && text[0] == '"' && text[len(text)-1] == '"' {
var decoded string
if err := json.Unmarshal(data, &decoded); err != nil {
return err
}
*s = rawFlexibleString(decoded)
return nil
}
*s = rawFlexibleString(text)
return nil
}
// Move 定义单个技能的结构
type Move struct {
ID int `xml:"ID,attr"`
Name string `xml:"Name,attr"`
ID int `xml:"ID,attr" json:"ID"`
Name string `xml:"Name,attr" json:"Name"`
Category int `xml:"Category,attr"` //属性
Type int `xml:"Type,attr"` //类型
Power int `xml:"Power,attr"` //威力
MaxPP int `xml:"MaxPP,attr"` //最大PP
Accuracy int `xml:"Accuracy,attr"` //命中率
CritRate int `xml:"CritRate,attr,omitempty"` //暴击率
Priority int `xml:"Priority,attr,omitempty"` //优先级
MustHit int `xml:"MustHit,attr,omitempty"` //是否必中
SwapElemType int `xml:"SwapElemType,attr,omitempty"` //技能交换属性
CopyElemType int `xml:"CopyElemType,attr,omitempty"` // 技能复制属性
CritAtkFirst int `xml:"CritAtkFirst,attr,omitempty"` // 先出手时必定致命一击
CritAtkSecond int `xml:"CritAtkSecond,attr,omitempty"` //后出手时必定致命一击
CritSelfHalfHp int `xml:"CritSelfHalfHp,attr,omitempty"` //自身体力低于一半时必定致命一击
CritFoeHalfHp int `xml:"CritFoeHalfHp,attr,omitempty"` //对方体力低于一半时必定致命一击
DmgBindLv int `xml:"DmgBindLv,attr,omitempty"` //使对方受到的伤害值等于自身的等级
PwrBindDv int `xml:"PwrBindDv,attr,omitempty"` //威力power取决于自身的潜力个体值
PwrDouble int `xml:"PwrDouble,attr,omitempty"` //攻击时,若对方处于异常状态, 则威力翻倍;
DmgBindHpDv int `xml:"DmgBindHpDv,attr,omitempty"` //使对方受到的伤害值等于自身的体力值
SideEffect string `xml:"SideEffect,attr,omitempty"`
SideEffectArg string `xml:"SideEffectArg,attr,omitempty"`
Category int `xml:"Category,attr" json:"Category"` //属性
Type int `xml:"Type,attr" json:"Type"` //类型
Power int `xml:"Power,attr" json:"Power"` //威力
MaxPP int `xml:"MaxPP,attr" json:"MaxPP"` //最大PP
Accuracy int `xml:"Accuracy,attr" json:"Accuracy"` //命中率
CritRate int `xml:"CritRate,attr,omitempty" json:"CritRate,omitempty"` //暴击率
Priority int `xml:"Priority,attr,omitempty" json:"Priority,omitempty"` //优先级
MustHit int `xml:"MustHit,attr,omitempty" json:"MustHit,omitempty"` //是否必中
SwapElemType int `xml:"SwapElemType,attr,omitempty" json:"SwapElemType,omitempty"` //技能交换属性
CopyElemType int `xml:"CopyElemType,attr,omitempty" json:"CopyElemType,omitempty"` // 技能复制属性
CritAtkFirst int `xml:"CritAtkFirst,attr,omitempty" json:"CritAtkFirst,omitempty"` // 先出手时必定致命一击
CritAtkSecond int `xml:"CritAtkSecond,attr,omitempty" json:"CritAtkSecond,omitempty"` //后出手时必定致命一击
CritSelfHalfHp int `xml:"CritSelfHalfHp,attr,omitempty" json:"CritSelfHalfHp,omitempty"` //自身体力低于一半时必定致命一击
CritFoeHalfHp int `xml:"CritFoeHalfHp,attr,omitempty" json:"CritFoeHalfHp,omitempty"` //对方体力低于一半时必定致命一击
DmgBindLv int `xml:"DmgBindLv,attr,omitempty" json:"DmgBindLv,omitempty"` //使对方受到的伤害值等于自身的等级
PwrBindDv int `xml:"PwrBindDv,attr,omitempty" json:"PwrBindDv,omitempty"` //威力power取决于自身的潜力个体值
PwrDouble int `xml:"PwrDouble,attr,omitempty" json:"PwrDouble,omitempty"` //攻击时,若对方处于异常状态, 则威力翻倍;
DmgBindHpDv int `xml:"DmgBindHpDv,attr,omitempty" json:"DmgBindHpDv,omitempty"` //使对方受到的伤害值等于自身的体力值
SideEffect string `xml:"SideEffect,attr,omitempty" json:"SideEffect,omitempty"`
SideEffectArg string `xml:"SideEffectArg,attr,omitempty" json:"SideEffectArg,omitempty"`
SideEffectS []int
SideEffectArgS []int
AtkNum int `xml:"AtkNum,attr,omitempty"`
Url string `xml:"Url,attr,omitempty"`
AtkNum int `xml:"AtkNum,attr,omitempty" json:"AtkNum,omitempty"`
AtkType int `xml:"AtkType,attr,omitempty" json:"AtkType,omitempty"` // 0:所有人 1:仅己方 2:仅对方 3:仅自己
Url string `xml:"Url,attr,omitempty" json:"Url,omitempty"`
Info string `xml:"info,attr,omitempty"`
Info string `xml:"info,attr,omitempty" json:"info,omitempty"`
CD *int `xml:"CD,attr"`
CD *int `xml:"CD,attr" json:"CD"`
}
func (m *Move) UnmarshalJSON(data []byte) error {
type moveAlias struct {
ID int `json:"ID"`
Name rawFlexibleString `json:"Name"`
Category int `json:"Category"`
Type int `json:"Type"`
Power int `json:"Power"`
MaxPP int `json:"MaxPP"`
Accuracy int `json:"Accuracy"`
CritRate int `json:"CritRate,omitempty"`
Priority int `json:"Priority,omitempty"`
MustHit int `json:"MustHit,omitempty"`
SwapElemType int `json:"SwapElemType,omitempty"`
CopyElemType int `json:"CopyElemType,omitempty"`
CritAtkFirst int `json:"CritAtkFirst,omitempty"`
CritAtkSecond int `json:"CritAtkSecond,omitempty"`
CritSelfHalfHp int `json:"CritSelfHalfHp,omitempty"`
CritFoeHalfHp int `json:"CritFoeHalfHp,omitempty"`
DmgBindLv int `json:"DmgBindLv,omitempty"`
PwrBindDv int `json:"PwrBindDv,omitempty"`
PwrDouble int `json:"PwrDouble,omitempty"`
DmgBindHpDv int `json:"DmgBindHpDv,omitempty"`
SideEffect rawFlexibleString `json:"SideEffect,omitempty"`
SideEffectArg rawFlexibleString `json:"SideEffectArg,omitempty"`
AtkNum int `json:"AtkNum,omitempty"`
AtkType int `json:"AtkType,omitempty"`
Url string `json:"Url,omitempty"`
Info string `json:"info,omitempty"`
CD *int `json:"CD"`
}
var aux moveAlias
if err := json.Unmarshal(data, &aux); err != nil {
return err
}
*m = Move{
ID: aux.ID,
Name: string(aux.Name),
Category: aux.Category,
Type: aux.Type,
Power: aux.Power,
MaxPP: aux.MaxPP,
Accuracy: aux.Accuracy,
CritRate: aux.CritRate,
Priority: aux.Priority,
MustHit: aux.MustHit,
SwapElemType: aux.SwapElemType,
CopyElemType: aux.CopyElemType,
CritAtkFirst: aux.CritAtkFirst,
CritAtkSecond: aux.CritAtkSecond,
CritSelfHalfHp: aux.CritSelfHalfHp,
CritFoeHalfHp: aux.CritFoeHalfHp,
DmgBindLv: aux.DmgBindLv,
PwrBindDv: aux.PwrBindDv,
PwrDouble: aux.PwrDouble,
DmgBindHpDv: aux.DmgBindHpDv,
SideEffect: string(aux.SideEffect),
SideEffectArg: string(aux.SideEffectArg),
AtkNum: aux.AtkNum,
AtkType: aux.AtkType,
Url: aux.Url,
Info: aux.Info,
CD: aux.CD,
}
return nil
}
type SideEffect struct {
ID int `xml:"ID,attr"`
Help string `xml:"help,attr"`
Des string `xml:"des,attr"`
ID int `xml:"ID,attr" json:"ID"`
Help string `xml:"help,attr" json:"help"`
Des string `xml:"des,attr" json:"des"`
}
// ReadHTTPFile 通过HTTP GET请求获取远程文件内容

View File

@@ -1,6 +1,6 @@
module blazing/common
go 1.23.0
go 1.23
require (
github.com/panjf2000/gnet v1.6.7

View File

@@ -2,17 +2,21 @@ package rpc
import (
"blazing/cool"
"context"
"blazing/logic/service/fight/pvp"
"blazing/logic/service/fight/pvpwire"
"fmt"
"time"
"github.com/gogf/gf/v2/database/gredis"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
)
// ListenFunc 监听函数
// ListenFunc 改造后的 Redis PubSub 监听函数,支持自动重连和心跳保活
// ListenFunc 改造后的 Redis PubSub 监听函数,支持自动重连
// 注意PubSub 连接只负责订阅和接收,避免在同一连接上并发 PING。
func ListenFunc(ctx g.Ctx) {
if !cool.IsRedisMode {
panic(gerror.New("集群模式下, 请使用Redis作为缓存"))
@@ -20,9 +24,8 @@ func ListenFunc(ctx g.Ctx) {
// 定义常量配置
const (
subscribeTopic = "cool:func" // 订阅的主题
retryDelay = 10 * time.Second // 连接失败重试间隔
heartbeatInterval = 30 * time.Second // 心跳保活间隔
subscribeTopic = "cool:func" // 订阅的主题
retryDelay = 10 * time.Second // 连接失败重试间隔
)
// 外层循环:负责连接断开后的整体重连
@@ -43,47 +46,25 @@ func ListenFunc(ctx g.Ctx) {
continue
}
// 2. 启动心跳保活协程,防止连接因空闲被断开
heartbeatCtx, heartbeatCancel := context.WithCancel(context.Background())
go func() {
ticker := time.NewTicker(heartbeatInterval)
defer func() {
ticker.Stop()
heartbeatCancel()
}()
for {
select {
case <-heartbeatCtx.Done():
cool.Logger.Info(ctx, "心跳协程退出")
return
case <-ticker.C:
// 发送 PING 心跳,保持连接活跃
_, pingErr := conn.Do(ctx, "PING")
if pingErr != nil {
cool.Logger.Error(ctx, "Redis 心跳失败,触发重连", "error", pingErr)
// 心跳失败时主动关闭连接,触发外层重连
_ = conn.Close(ctx)
return
}
}
}
}()
// 3. 订阅主题
// 2. 订阅主题
_, err = conn.Do(ctx, "subscribe", subscribeTopic)
if err != nil {
cool.Logger.Error(ctx, "订阅 Redis 主题失败", "topic", subscribeTopic, "error", err)
heartbeatCancel() // 关闭心跳协程
_ = conn.Close(ctx)
time.Sleep(retryDelay)
continue
}
cool.Logger.Info(ctx, "成功订阅 Redis 主题", "topic", subscribeTopic)
_, err = conn.Do(ctx, "subscribe", "sun:join") //加入队列
if err != nil {
cool.Logger.Error(ctx, "订阅 Redis 主题失败", "topic", "sun:join", "error", err)
_ = conn.Close(ctx)
time.Sleep(retryDelay)
continue
}
cool.Logger.Info(ctx, "成功订阅 Redis 主题", "topic", "sun:join")
// 4. 循环接收消息
// 3. 循环接收消息
connError := false
for !connError {
select {
@@ -126,15 +107,15 @@ func ListenFunc(ctx g.Ctx) {
}
}
// 5. 清理资源,准备重连
heartbeatCancel() // 关闭心跳协程
// 4. 清理资源,准备重连
_ = conn.Close(ctx) // 关闭当前连接
// Logger.Warn(ctx, "Redis 连接异常,准备重连", "retry_after", retryDelay)
cool.Logger.Info(ctx, "Redis 订阅连接异常,准备重连", "retry_after", retryDelay)
time.Sleep(retryDelay)
}
}
// ListenFight 完全对齐 ListenFunc 写法,修复收不到消息问题
// ListenFight 完全对齐 ListenFunc 写法,修复收不到消息问题
// 注意PubSub 连接只负责订阅和接收,避免在同一连接上并发 PING。
func ListenFight(ctx g.Ctx) {
if !cool.IsRedisMode {
panic(gerror.New("集群模式下, 请使用Redis作为缓存"))
@@ -142,14 +123,15 @@ func ListenFight(ctx g.Ctx) {
// 定义常量配置(对齐 ListenFunc 风格)
const (
retryDelay = 10 * time.Second // 连接失败重试间隔
heartbeatInterval = 30 * time.Second // 心跳保活间隔
retryDelay = 10 * time.Second // 连接失败重试间隔
)
// 提前拼接订阅主题(避免重复拼接,便于日志打印)
serverID := cool.Config.ServerInfo.GetID()
startTopic := "sun:start:" + serverID
sendPackTopic := "sendpack:" + serverID
pvpServerTopic := pvpwire.ServerTopic(gconv.Uint32(serverID))
pvpCoordinatorTopic := pvpwire.CoordinatorTopicPrefix
// 外层循环:负责连接断开后的整体重连
for {
@@ -170,45 +152,26 @@ func ListenFight(ctx g.Ctx) {
continue
}
// 2. 启动心跳保活协程(完全对齐 ListenFunc 逻辑
heartbeatCtx, heartbeatCancel := context.WithCancel(context.Background())
go func() {
ticker := time.NewTicker(heartbeatInterval)
defer func() {
ticker.Stop()
heartbeatCancel()
}()
for {
select {
case <-heartbeatCtx.Done():
cool.Logger.Info(ctx, "心跳协程退出")
return
case <-ticker.C:
// 发送 PING 心跳,保持连接活跃
_, pingErr := conn.Do(ctx, "PING")
if pingErr != nil {
cool.Logger.Error(ctx, "Redis 心跳失败,触发重连", "error", pingErr)
// 心跳失败时主动关闭连接,触发外层重连
_ = conn.Close(ctx)
return
}
cool.Logger.Debug(ctx, "Redis 心跳发送成功,连接正常")
}
// 2. 订阅主题(对齐 ListenFunc 的错误处理,替换 panic 为优雅重连
subscribeTopics := []string{startTopic, pvpServerTopic}
if cool.Config.GameOnlineID == pvp.CoordinatorOnlineID {
subscribeTopics = append(subscribeTopics, pvpCoordinatorTopic)
}
subscribeFailed := false
for _, topic := range subscribeTopics {
_, err = conn.Do(ctx, "subscribe", topic)
if err != nil {
cool.Logger.Error(ctx, "订阅 Redis 主题失败", "topic", topic, "error", err)
_ = conn.Close(ctx)
time.Sleep(retryDelay)
subscribeFailed = true
break
}
}()
// 3. 订阅主题(对齐 ListenFunc 的错误处理,替换 panic 为优雅重连)
// 订阅 sun:start:服务器ID
_, err = conn.Do(ctx, "subscribe", startTopic)
if err != nil {
cool.Logger.Error(ctx, "订阅 Redis 主题失败", "topic", startTopic, "error", err)
heartbeatCancel() // 关闭心跳协程
_ = conn.Close(ctx)
time.Sleep(retryDelay)
cool.Logger.Info(ctx, "成功订阅 Redis 主题", "topic", topic)
}
if subscribeFailed {
continue
}
cool.Logger.Info(ctx, "成功订阅 Redis 主题", "topic", startTopic)
// // 订阅 sun:sendpack:服务器ID
// _, err = conn.Do(ctx, "subscribe", sendPackTopic)
@@ -224,7 +187,7 @@ func ListenFight(ctx g.Ctx) {
// 打印监听提示(保留原有日志)
fmt.Println("监听战斗", startTopic)
// 4. 循环接收消息(完全对齐 ListenFunc 逻辑)
// 3. 循环接收消息(完全对齐 ListenFunc 逻辑)
connError := false
for !connError {
select {
@@ -255,6 +218,10 @@ func ListenFight(ctx g.Ctx) {
// universalClient, _ := g.Redis("cool").Client().(goredis.UniversalClient)
}
if dataMap.Channel == pvpServerTopic || dataMap.Channel == pvpCoordinatorTopic {
pvp.HandleRedisMessage(dataMap.Channel, dataMap.Payload)
}
// 【可选】处理 sun:sendpack:服务器ID 消息(如果需要)
if dataMap.Channel == sendPackTopic {
fmt.Println("收到战斗包", dataMap.Payload)
@@ -262,9 +229,9 @@ func ListenFight(ctx g.Ctx) {
}
}
// 5. 清理资源,准备重连(完全对齐 ListenFunc
heartbeatCancel() // 关闭心跳协程
// 4. 清理资源,准备重连(完全对齐 ListenFunc
_ = conn.Close(ctx) // 关闭当前连接
cool.Logger.Info(ctx, "Redis 战斗订阅连接异常,准备重连", "retry_after", retryDelay)
time.Sleep(retryDelay)
}
}

163
common/rpc/pvp_match.go Normal file
View File

@@ -0,0 +1,163 @@
package rpc
import (
"blazing/cool"
"blazing/logic/service/fight/pvpwire"
"context"
"encoding/json"
"fmt"
"sync"
"time"
)
const (
pvpMatchQueueTTL = 12 * time.Second
pvpMatchBanPickSecond = 45
)
type PVPMatchJoinPayload struct {
RuntimeServerID uint32 `json:"runtimeServerId"`
UserID uint32 `json:"userId"`
Nick string `json:"nick"`
FightMode uint32 `json:"fightMode"`
Status uint32 `json:"status"`
CatchTimes []uint32 `json:"catchTimes"`
}
type pvpMatchCoordinator struct {
mu sync.Mutex
queues map[uint32][]pvpwire.QueuePlayerSnapshot
lastSeen map[uint32]time.Time
}
var defaultPVPMatchCoordinator = &pvpMatchCoordinator{
queues: make(map[uint32][]pvpwire.QueuePlayerSnapshot),
lastSeen: make(map[uint32]time.Time),
}
func DefaultPVPMatchCoordinator() *pvpMatchCoordinator {
return defaultPVPMatchCoordinator
}
func (m *pvpMatchCoordinator) JoinOrUpdate(payload PVPMatchJoinPayload) error {
if payload.UserID == 0 || payload.RuntimeServerID == 0 || payload.FightMode == 0 {
return fmt.Errorf("invalid pvp match payload: uid=%d server=%d mode=%d", payload.UserID, payload.RuntimeServerID, payload.FightMode)
}
now := time.Now()
player := pvpwire.QueuePlayerSnapshot{
RuntimeServerID: payload.RuntimeServerID,
UserID: payload.UserID,
Nick: payload.Nick,
FightMode: payload.FightMode,
Status: payload.Status,
JoinedAtUnix: now.Unix(),
CatchTimes: append([]uint32(nil), payload.CatchTimes...),
}
var match *pvpwire.MatchFoundPayload
m.mu.Lock()
m.pruneExpiredLocked(now)
m.removeUserLocked(payload.UserID)
m.lastSeen[payload.UserID] = now
queue := m.queues[payload.FightMode]
if len(queue) > 0 {
host := queue[0]
queue = queue[1:]
m.queues[payload.FightMode] = queue
delete(m.lastSeen, host.UserID)
delete(m.lastSeen, payload.UserID)
result := pvpwire.MatchFoundPayload{
SessionID: buildPVPMatchSessionID(host.UserID, payload.UserID),
Stage: pvpwire.StageBanPick,
Host: host,
Guest: player,
BanPickTimeout: pvpMatchBanPickSecond,
}
match = &result
} else {
m.queues[payload.FightMode] = append(queue, player)
}
m.mu.Unlock()
if match == nil {
return nil
}
if err := publishPVPMatchMessage(pvpwire.ServerTopic(match.Host.RuntimeServerID), pvpwire.MessageTypeMatchFound, *match); err != nil {
return err
}
if match.Guest.RuntimeServerID != match.Host.RuntimeServerID {
if err := publishPVPMatchMessage(pvpwire.ServerTopic(match.Guest.RuntimeServerID), pvpwire.MessageTypeMatchFound, *match); err != nil {
return err
}
}
return nil
}
func (m *pvpMatchCoordinator) Cancel(userID uint32) {
if userID == 0 {
return
}
m.mu.Lock()
defer m.mu.Unlock()
delete(m.lastSeen, userID)
m.removeUserLocked(userID)
}
func (m *pvpMatchCoordinator) pruneExpiredLocked(now time.Time) {
for mode, queue := range m.queues {
next := make([]pvpwire.QueuePlayerSnapshot, 0, len(queue))
for _, queued := range queue {
last := m.lastSeen[queued.UserID]
if last.IsZero() || now.Sub(last) > pvpMatchQueueTTL {
delete(m.lastSeen, queued.UserID)
continue
}
next = append(next, queued)
}
m.queues[mode] = next
}
}
func (m *pvpMatchCoordinator) removeUserLocked(userID uint32) {
for mode, queue := range m.queues {
next := make([]pvpwire.QueuePlayerSnapshot, 0, len(queue))
for _, queued := range queue {
if queued.UserID == userID {
continue
}
next = append(next, queued)
}
m.queues[mode] = next
}
}
func publishPVPMatchMessage(topic, msgType string, body any) error {
payload, err := json.Marshal(body)
if err != nil {
return err
}
envelope, err := json.Marshal(pvpwire.Envelope{
Type: msgType,
Body: payload,
})
if err != nil {
return err
}
conn, err := cool.Redis.Conn(context.Background())
if err != nil {
return err
}
defer conn.Close(context.Background())
_, err = conn.Do(context.Background(), "publish", topic, envelope)
return err
}
func buildPVPMatchSessionID(hostUserID, guestUserID uint32) string {
return fmt.Sprintf("xsvr-%d-%d-%d", hostUserID, guestUserID, time.Now().UnixNano())
}

View File

@@ -1,106 +1,166 @@
package rpc
import (
"blazing/common/data/share"
"blazing/cool"
"context"
"fmt"
"log"
config "blazing/modules/config/service"
"github.com/filecoin-project/go-jsonrpc"
"github.com/gogf/gf/v2/util/gconv"
)
// Define the server handler
type ServerHandler struct{}
// 实现踢人
func (*ServerHandler) Kick(_ context.Context, userid uint32) error {
useid1, _ := share.ShareManager.GetUserOnline(userid)
if useid1 == 0 {
return nil
}
cl, ok := cool.GetClientOnly(useid1)
if !ok {
return nil
}
cl.KickPerson(userid) //实现指定服务器踢人
return nil
}
// 注册logic服务器
func (*ServerHandler) RegisterLogic(ctx context.Context, id, port uint32) error {
fmt.Println("注册logic服务器", id, port)
//TODO 待修复滚动更新可能导致的玩家可以同时在旧服务器和新服务器同时在线的bug
revClient, ok := jsonrpc.ExtractReverseClient[cool.ClientHandler](ctx)
if !ok {
return fmt.Errorf("no reverse client")
}
t := config.NewServerService().GetServerID((id))
aa, ok := cool.GetClient(t.OnlineID, t.Port)
if ok && aa != nil { //如果已经存在且这个端口已经被存过
aa.QuitSelf(0)
}
cool.AddClient(100000*id+port, &revClient)
//Refurh()
return nil
}
func CServer() *jsonrpc.RPCServer {
// create a new server instance
rpcServer := jsonrpc.NewServer(jsonrpc.WithReverseClient[cool.ClientHandler](""))
rpcServer.Register("", &ServerHandler{})
return rpcServer
}
var closer jsonrpc.ClientCloser
func StartClient(id, port uint32, callback any) *struct {
Kick func(uint32) error
RegisterLogic func(uint32, uint32) error
} {
//cool.Config.File.Domain = "127.0.0.1"
var rpcaddr = "ws://" + cool.Config.File.Domain + gconv.String(cool.Config.Address) + "/rpc"
closer1, err := jsonrpc.NewMergeClient(context.Background(),
rpcaddr, "", []interface{}{
&RPCClient,
}, nil, jsonrpc.WithClientHandler("", callback),
jsonrpc.WithReconnFun(func() { RPCClient.RegisterLogic(id, port) }),
)
if err != nil {
log.Fatalf("Failed to create client: %v", err)
}
//if port != 0 { //注册logic
defer RPCClient.RegisterLogic(id, port)
//}
closer = closer1
return &RPCClient
}
// Setup RPCClient with reverse call handler
var RPCClient struct {
Kick func(uint32) error //踢人
RegisterLogic func(uint32, uint32) error
// UserLogin func(int32, int32) error //用户登录事件
// UserLogout func(int32, int32) error //用户登出事件
}
package rpc
import (
"blazing/common/data/share"
"blazing/cool"
"context"
"fmt"
"log"
"time"
config "blazing/modules/config/service"
"github.com/filecoin-project/go-jsonrpc"
"github.com/gogf/gf/v2/util/gconv"
)
// Define the server handler
type ServerHandler struct{}
const kickForwardTimeout = 3 * time.Second
// 实现踢人
func (*ServerHandler) Kick(_ context.Context, userid uint32) error {
useid1, err := share.ShareManager.GetUserOnline(userid)
if err != nil || useid1 == 0 {
// 请求到达时用户已离线,直接视为成功
return nil
}
cl, ok := cool.GetClientOnly(useid1)
if !ok || cl == nil {
// 目标服务器不在线,清理僵尸在线标记并视为成功
_ = share.ShareManager.DeleteUserOnline(userid)
cool.DeleteClientOnly(useid1)
return nil
}
resultCh := make(chan error, 1)
go func() {
resultCh <- cl.KickPerson(userid) // 实现指定服务器踢人
}()
select {
case callErr := <-resultCh:
if callErr == nil {
return nil
}
// 调用失败后兜底:用户若已离线/切服/目标服不在线都算成功
useid2, err2 := share.ShareManager.GetUserOnline(userid)
if err2 != nil || useid2 == 0 || useid2 != useid1 {
return nil
}
if cl2, ok2 := cool.GetClientOnly(useid2); !ok2 || cl2 == nil {
_ = share.ShareManager.DeleteUserOnline(userid)
cool.DeleteClientOnly(useid2)
return nil
}
// 仍在线则返回失败,不按成功处理
return callErr
case <-time.After(kickForwardTimeout):
// 仅防止无限等待;超时不算成功
useid2, err2 := share.ShareManager.GetUserOnline(userid)
if err2 != nil || useid2 == 0 || useid2 != useid1 {
return nil
}
if cl2, ok2 := cool.GetClientOnly(useid2); !ok2 || cl2 == nil {
_ = share.ShareManager.DeleteUserOnline(userid)
cool.DeleteClientOnly(useid2)
return nil
}
return fmt.Errorf("kick timeout, user still online: uid=%d server=%d", userid, useid2)
}
}
// 注册logic服务器
func (*ServerHandler) RegisterLogic(ctx context.Context, id, port uint32) error {
fmt.Println("注册logic服务器", id, port)
//TODO 待修复滚动更新可能导致的玩家可以同时在旧服务器和新服务器同时在线的bug
revClient, ok := jsonrpc.ExtractReverseClient[cool.ClientHandler](ctx)
if !ok {
return fmt.Errorf("no reverse client")
}
t := config.NewServerService().GetServerID((id))
aa, ok := cool.GetClient(t.OnlineID, t.Port)
if ok && aa != nil { //如果已经存在且这个端口已经被存过
aa.QuitSelf(0)
}
cool.AddClient(100000*id+port, &revClient)
//Refurh()
return nil
}
func (*ServerHandler) MatchJoinOrUpdate(_ context.Context, payload PVPMatchJoinPayload) error {
return DefaultPVPMatchCoordinator().JoinOrUpdate(payload)
}
func (*ServerHandler) MatchCancel(_ context.Context, userID uint32) error {
DefaultPVPMatchCoordinator().Cancel(userID)
return nil
}
func CServer() *jsonrpc.RPCServer {
// create a new server instance
rpcServer := jsonrpc.NewServer(jsonrpc.WithReverseClient[cool.ClientHandler](""))
rpcServer.Register("", &ServerHandler{})
return rpcServer
}
var closer jsonrpc.ClientCloser
func StartClient(id, port uint32, callback any) *struct {
Kick func(uint32) error
RegisterLogic func(uint32, uint32) error
MatchJoinOrUpdate func(PVPMatchJoinPayload) error
MatchCancel func(uint32) error
} {
//cool.Config.File.Domain = "127.0.0.1"
var rpcaddr = "ws://" + cool.Config.File.Domain + gconv.String(cool.Config.Address) + "/rpc"
closer1, err := jsonrpc.NewMergeClient(context.Background(),
rpcaddr, "", []interface{}{
&RPCClient,
}, nil, jsonrpc.WithClientHandler("", callback),
jsonrpc.WithReconnFun(func() { RPCClient.RegisterLogic(id, port) }),
)
if err != nil {
log.Fatalf("Failed to create client: %v", err)
}
//if port != 0 { //注册logic
defer RPCClient.RegisterLogic(id, port)
//}
closer = closer1
return &RPCClient
}
// Setup RPCClient with reverse call handler
var RPCClient struct {
Kick func(uint32) error //踢人
RegisterLogic func(uint32, uint32) error
MatchJoinOrUpdate func(PVPMatchJoinPayload) error
MatchCancel func(uint32) error
// UserLogin func(int32, int32) error //用户登录事件
// UserLogout func(int32, int32) error //用户登出事件
}

View File

@@ -1,295 +1,266 @@
package socket
import (
"context"
"encoding/binary"
"errors"
"io"
"log"
"os"
"sync/atomic"
"time"
"blazing/cool"
"blazing/logic/service/common"
"blazing/logic/service/player"
"blazing/modules/config/service"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
"github.com/panjf2000/gnet/v2"
"github.com/valyala/bytebufferpool"
)
func (s *Server) Boot(serverid, port uint32) error {
// go s.bootws()
s.serverid = serverid
s.port = port
err := gnet.Run(s, s.network+"://"+s.addr,
gnet.WithMulticore(true),
gnet.WithTicker(true),
// 其他调优配置↓
gnet.WithTCPNoDelay(gnet.TCPNoDelay), // 禁用Nagle算法降低延迟适合小数据包场景
//gnet.WithReusePort(true), // 开启SO_REUSEPORT多核下提升并发
//gnet.WithReadBufferCap(1024*64), // 读缓冲区64KB根据业务调整默认太小
// gnet.WithWriteBufferCap(1024*64), // 写缓冲区64KB
//gnet.WithLockOSThread(true), // 绑定goroutine到OS线程减少上下文切换
)
if err != nil {
panic(err)
}
return nil
}
func (s *Server) Stop() error {
_ = s.eng.Stop(context.Background())
s.workerPool.Release()
return nil
}
func (s *Server) OnClose(c gnet.Conn, err error) (action gnet.Action) {
defer func() {
if err := recover(); err != nil { // 恢复 panicerr 为 panic 错误值
// 1. 打印错误信息
if t, ok := c.Context().(*player.ClientData); ok {
if t.Player != nil {
if t.Player.Info != nil {
cool.Logger.Error(context.TODO(), "OnClose 错误:", cool.Config.ServerInfo.OnlineID, t.Player.Info.UserID, err)
t.Player.Service.Info.Save(*t.Player.Info)
}
}
} else {
cool.Logger.Error(context.TODO(), "OnClose 错误:", cool.Config.ServerInfo.OnlineID, err)
}
}
}()
// 识别 RST 导致的连接中断(错误信息含 "connection reset"
// if err != nil && (strings.Contains(err.Error(), "connection reset") || strings.Contains(err.Error(), "reset by peer")) {
// remoteIP := c.RemoteAddr().(*net.TCPAddr).IP.String()
// log.Printf("RST 攻击检测: 来源 %s, 累计攻击次数 %d", remoteIP)
// // 防护逻辑:临时封禁异常 IP可扩展为 IP 黑名单)
// // go s.tempBlockIP(remoteIP, 5*time.Minute)
// }
//fmt.Println(err, c.RemoteAddr().String(), "断开连接")
atomic.AddInt64(&cool.Connected, -1)
//logging.Infof("conn[%v] disconnected", c.RemoteAddr().String())
v, _ := c.Context().(*player.ClientData)
v.LF.Close()
// v.LF.Close()
//close(v.MsgChan)
if v.Player != nil {
v.Player.Save() //保存玩家数据
}
//}
//关闭连接
return
}
func (s *Server) OnTick() (delay time.Duration, action gnet.Action) {
g.Log().Async().Info(context.Background(), gtime.Now().ISO8601(), "服务器ID", cool.Config.ServerInfo.OnlineID, "链接数", atomic.LoadInt64(&cool.Connected))
if s.quit && atomic.LoadInt64(&cool.Connected) == 0 {
//执行正常退出逻辑
os.Exit(0)
}
return 30 * time.Second, gnet.None
}
func (s *Server) OnBoot(eng gnet.Engine) gnet.Action {
s.eng = eng
service.NewServerService().SetServerID(s.serverid, s.port) //设置当前服务器端口
return gnet.None
}
func (s *Server) OnOpen(conn gnet.Conn) (out []byte, action gnet.Action) {
if s.network != "tcp" {
return nil, gnet.Close
}
if conn.Context() == nil {
conn.SetContext(player.NewClientData(conn)) //注入data
}
atomic.AddInt64(&cool.Connected, 1)
return nil, gnet.None
}
func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) {
defer func() {
if err := recover(); err != nil { // 恢复 panicerr 为 panic 错误值
// 1. 打印错误信息
if t, ok := c.Context().(*player.ClientData); ok {
if t.Player != nil {
if t.Player.Info != nil {
cool.Logger.Error(context.TODO(), "OnTraffic 错误:", cool.Config.ServerInfo.OnlineID, t.Player.Info.UserID, err)
t.Player.Service.Info.Save(*t.Player.Info)
}
}
}
}
}()
ws := c.Context().(*player.ClientData).Wsmsg
if ws.Tcp { //升级失败时候防止缓冲区溢出
return s.handleTCP(c)
}
tt, len1 := ws.ReadBufferBytes(c)
if tt == gnet.Close {
return gnet.Close
}
ok, action := ws.Upgrade(c)
if action != gnet.None { //连接断开
return action
}
if !ok { //升级失败,说明是tcp连接
ws.Tcp = true
return s.handleTCP(c)
}
// fmt.Println(ws.Buf.Bytes())
c.Discard(len1)
messages, err := ws.Decode(c)
if err != nil {
return gnet.Close
}
if messages == nil {
return
}
for _, msg := range messages {
s.onevent(c, msg.Payload)
//t.OnEvent(msg.Payload)
}
return gnet.None
}
const maxBodyLen = 10 * 1024 // 业务最大包体长度,按需调整
func (s *Server) handleTCP(conn gnet.Conn) (action gnet.Action) {
conn.Context().(*player.ClientData).IsCrossDomain.Do(func() { //跨域检测
handle(conn)
})
// handle(c)
// 先读取4字节的包长度
lenBuf, err := conn.Peek(4)
if err != nil {
if errors.Is(err, io.ErrShortBuffer) {
return
}
return gnet.Close
}
bodyLen := binary.BigEndian.Uint32(lenBuf)
if bodyLen > maxBodyLen {
return gnet.Close
}
if conn.InboundBuffered() < int(bodyLen) {
return
}
// 提取包体
body, err := conn.Next(int(bodyLen))
if err != nil {
if errors.Is(err, io.ErrShortBuffer) {
return
}
return gnet.Close
}
s.onevent(conn, body)
if conn.InboundBuffered() > 0 {
if err := conn.Wake(nil); err != nil { // wake up the connection manually to avoid missing the leftover data
return gnet.Close
}
}
return action
}
// CROSS_DOMAIN 定义跨域策略文件内容
const CROSS_DOMAIN = "<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\x00"
// TEXT 定义跨域请求的文本格式
const TEXT = "<policy-file-request/>\x00"
func handle(c gnet.Conn) {
// 读取数据并检查是否为跨域请求
data, err := c.Peek(len(TEXT))
if err != nil {
log.Printf("Error reading cross-domain request: %v", err)
return
}
if string(data) == TEXT { //判断是否是跨域请求
//log.Printf("Received cross-domain request from %s", c.RemoteAddr())
// 处理跨域请求
c.Write([]byte(CROSS_DOMAIN))
c.Discard(len(TEXT))
return
}
//return
}
func (s *Server) onevent(c gnet.Conn, v []byte) {
if t, ok := c.Context().(*player.ClientData); ok {
var header common.TomeeHeader
// 解析Len0-3字节
header.Len = binary.BigEndian.Uint32(v[0:4])
// 解析Version第4字节
//header.Version = v[4]
// 解析CMD5-8字节
header.CMD = binary.BigEndian.Uint32(v[5:9])
// 解析UserID9-12字节
header.UserID = binary.BigEndian.Uint32(v[9:13])
// 解析Result13-16字节
//header.Result = binary.BigEndian.Uint32(v[13:17])
// 解析数据部分17字节之后
// 数据部分:直接引用切片,避免 make
if len(v) > 17 {
header.Data = bytebufferpool.Get()
header.Data.Write(v[17:])
//copy(header.Data, v[17:]) // 核心修改:拷贝数据
}
//t.OnEvent(header)
// t.LF.Push(header)
s.workerPool.Submit(func() {
t.LF.Producer().Write(header)
// t.LF.Producer().Write(header)
})
}
}
package socket
import (
"blazing/common/socket/codec"
"blazing/cool"
"blazing/logic/service/player"
"blazing/modules/config/service"
"bytes"
"context"
"encoding/binary"
"errors"
"log"
"os"
"sync/atomic"
"time"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
"github.com/panjf2000/gnet/v2"
)
const (
minPacketLen = 17
maxPacketLen = 10 * 1024
)
func (s *Server) Boot(serverid, port uint32) error {
// go s.bootws()
s.serverid = serverid
s.port = port
err := gnet.Run(s, s.network+"://"+s.addr,
gnet.WithMulticore(true),
gnet.WithTicker(true),
// 其他调优配置↓
gnet.WithTCPNoDelay(gnet.TCPNoDelay), // 禁用Nagle算法降低延迟适合小数据包场景
//gnet.WithReusePort(true), // 开启SO_REUSEPORT多核下提升并发
//gnet.WithReadBufferCap(1024*64), // 读缓冲区64KB根据业务调整默认太小
// gnet.WithWriteBufferCap(1024*64), // 写缓冲区64KB
//gnet.WithLockOSThread(true), // 绑定goroutine到OS线程减少上下文切换
)
if err != nil {
panic(err)
}
return nil
}
func (s *Server) Stop() error {
_ = s.eng.Stop(context.Background())
s.workerPool.Release()
return nil
}
func (s *Server) OnClose(c gnet.Conn, err error) (action gnet.Action) {
defer func() {
if err := recover(); err != nil { // 恢复 panicerr 为 panic 错误值
if t, ok := c.Context().(*player.ClientData); ok {
if t.Player != nil {
if t.Player.Info != nil {
cool.Logger.Error(context.TODO(), "OnClose 错误:", cool.Config.ServerInfo.OnlineID, t.Player.Info.UserID, err)
go t.Player.SaveOnDisconnect()
}
}
} else {
cool.Logger.Error(context.TODO(), "OnClose 错误:", cool.Config.ServerInfo.OnlineID, err)
}
}
}()
atomic.AddInt64(&cool.Connected, -1)
v, _ := c.Context().(*player.ClientData)
if v != nil {
v.Close()
if v.Player != nil {
v.Player.Save() //保存玩家数据
}
}
return
}
func (s *Server) OnTick() (delay time.Duration, action gnet.Action) {
g.Log().Async().Info(context.Background(), gtime.Now().ISO8601(), "服务器ID", cool.Config.ServerInfo.OnlineID, "链接数", atomic.LoadInt64(&cool.Connected))
if s.quit && atomic.LoadInt64(&cool.Connected) == 0 {
os.Exit(0)
}
return 30 * time.Second, gnet.None
}
func (s *Server) OnBoot(eng gnet.Engine) gnet.Action {
s.eng = eng
service.NewServerService().SetServerID(s.serverid, s.port)
return gnet.None
}
func (s *Server) OnOpen(conn gnet.Conn) (out []byte, action gnet.Action) {
if s.network != "tcp" {
return nil, gnet.Close
}
if conn.Context() == nil {
conn.SetContext(player.NewClientData(conn))
}
atomic.AddInt64(&cool.Connected, 1)
return nil, gnet.None
}
func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) {
defer func() {
if err := recover(); err != nil {
if t, ok := c.Context().(*player.ClientData); ok {
if t.Player != nil && t.Player.Info != nil {
cool.Logger.Error(context.TODO(), "OnTraffic 错误:", cool.Config.ServerInfo.OnlineID, t.Player.Info.UserID, err)
t.Player.Service.Info.Save(*t.Player.Info)
}
}
}
}()
client := c.Context().(*player.ClientData)
if s.discorse && !client.IsCrossDomainChecked() {
handled, ready, action := handle(c)
if action != gnet.None {
return action
}
if handled {
client.MarkCrossDomainChecked()
return gnet.None
}
if !ready {
return gnet.None
}
client.MarkCrossDomainChecked()
}
ws := client.Wsmsg
if ws.Tcp {
return s.handleTCP(c)
}
readAction, inboundLen := ws.ReadBufferBytes(c)
if readAction == gnet.Close {
return gnet.Close
}
state, action := ws.Upgrade(c)
if action != gnet.None {
return action
}
if state == player.UpgradeNeedMoreData {
return gnet.None
}
if state == player.UpgradeUseTCP {
return s.handleTCP(c)
}
if inboundLen > 0 {
if _, err := c.Discard(inboundLen); err != nil {
return gnet.Close
}
ws.ResetInboundMirror()
}
messages, err := ws.Decode(c)
if err != nil {
return gnet.Close
}
if messages == nil {
return
}
for _, msg := range messages {
if !s.onevent(c, msg.Payload) {
return gnet.Close
}
}
return gnet.None
}
func (s *Server) handleTCP(conn gnet.Conn) (action gnet.Action) {
client := conn.Context().(*player.ClientData)
if s.discorse && !client.IsCrossDomainChecked() {
handled, ready, action := handle(conn)
if action != gnet.None {
return action
}
if !ready {
return gnet.None
}
if handled {
client.MarkCrossDomainChecked()
return gnet.None
}
client.MarkCrossDomainChecked()
}
body, err := s.codec.Decode(conn)
if err != nil {
if errors.Is(err, codec.ErrIncompletePacket) {
return gnet.None
}
return gnet.Close
}
if !s.onevent(conn, body) {
return gnet.Close
}
if conn.InboundBuffered() > 0 {
if err := conn.Wake(nil); err != nil {
return gnet.Close
}
}
return action
}
const CROSS_DOMAIN = "<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\x00"
const TEXT = "<policy-file-request/>\x00"
func handle(c gnet.Conn) (handled bool, ready bool, action gnet.Action) {
probeLen := c.InboundBuffered()
if probeLen == 0 {
return false, false, gnet.None
}
if probeLen > len(TEXT) {
probeLen = len(TEXT)
}
data, err := c.Peek(probeLen)
if err != nil {
log.Printf("Error reading cross-domain request: %v", err)
return false, false, gnet.Close
}
if !bytes.Equal(data, []byte(TEXT[:probeLen])) {
return false, true, gnet.None
}
if probeLen < len(TEXT) {
return false, false, gnet.None
}
if _, err := c.Write([]byte(CROSS_DOMAIN)); err != nil {
return false, true, gnet.Close
}
if _, err := c.Discard(len(TEXT)); err != nil {
return false, true, gnet.Close
}
return true, true, gnet.None
}
func (s *Server) onevent(c gnet.Conn, v []byte) bool {
if !isValidPacket(v) {
return false
}
if t, ok := c.Context().(*player.ClientData); ok {
t.PushEvent(v, s.workerPool.Submit)
}
return true
}
func isValidPacket(v []byte) bool {
if len(v) < minPacketLen || len(v) > maxPacketLen {
return false
}
return binary.BigEndian.Uint32(v[0:4]) == uint32(len(v))
}

View File

@@ -38,7 +38,7 @@ func NewServer(options ...Option) *Server {
// handler: handler.NewTomeeHandler(), //请求返回
codec: codec.NewTomeeSocketCodec(), //默认解码器 len+pack
workerPool: goroutine.Default(),
bufferSize: 40960, //默认缓冲区大小
bufferSize: 40960, //默认缓冲区大小
multicore: true,
//batchRead: 8,
//discorse: true,

View File

@@ -2,33 +2,4 @@ module github.com/zmexing/go-sensitive-word
go 1.20
require (
github.com/orcaman/concurrent-map/v2 v2.0.1
)
require (
github.com/andybalholm/brotli v1.1.0 // indirect
github.com/cloudflare/circl v1.3.7 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/klauspost/compress v1.17.9 // indirect
github.com/onsi/ginkgo/v2 v2.16.0 // indirect
github.com/quic-go/qpack v0.4.0 // indirect
github.com/quic-go/qtls-go1-20 v0.4.1 // indirect
github.com/quic-go/quic-go v0.40.1 // indirect
github.com/refraction-networking/utls v1.6.3 // indirect
github.com/stretchr/testify v1.11.1 // indirect
go.uber.org/mock v0.4.0 // indirect
golang.org/x/crypto v0.31.0 // indirect
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/text v0.22.0 // indirect
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
google.golang.org/protobuf v1.31.0 // indirect
)
require github.com/orcaman/concurrent-map/v2 v2.0.1

View File

@@ -1,55 +1,2 @@
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q=
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/imroc/req/v3 v3.42.3 h1:ryPG2AiwouutAopwPxKpWKyxgvO8fB3hts4JXlh3PaE=
github.com/imroc/req/v3 v3.42.3/go.mod h1:Axz9Y/a2b++w5/Jht3IhQsdBzrG1ftJd1OJhu21bB2Q=
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/onsi/ginkgo/v2 v2.16.0 h1:7q1w9frJDzninhXxjZd+Y/x54XNjG/UlRLIYPZafsPM=
github.com/onsi/ginkgo/v2 v2.16.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs=
github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
github.com/orcaman/concurrent-map/v2 v2.0.1 h1:jOJ5Pg2w1oeB6PeDurIYf6k9PQ+aTITr/6lP/L/zp6c=
github.com/orcaman/concurrent-map/v2 v2.0.1/go.mod h1:9Eq3TG2oBe5FirmYWQfYO5iH1q0Jv47PLaNK++uCdOM=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs=
github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
github.com/quic-go/quic-go v0.40.1 h1:X3AGzUNFs0jVuO3esAGnTfvdgvL4fq655WaOi1snv1Q=
github.com/quic-go/quic-go v0.40.1/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c=
github.com/refraction-networking/utls v1.6.3 h1:MFOfRN35sSx6K5AZNIoESsBuBxS2LCgRilRIdHb6fDc=
github.com/refraction-networking/utls v1.6.3/go.mod h1:yil9+7qSl+gBwJqztoQseO6Pr3h62pQoY1lXiNR/FPs=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ=
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

View File

@@ -0,0 +1,183 @@
# Boss ScriptHookAction接入说明
日期2026-04-05
## 1. 执行流程
1. 先执行战斗效果链 `HookAction()`
2. 执行脚本 `hookAction(hookaction)`
3. 用脚本返回值决定是否继续出手
4. 脚本可直接调用 Go 绑定函数`useSkill()``switchPet()`
## 2. JS 可调用的 Go 函数
1. `useSkill(skillId: number)`
2. `switchPet(catchTime: number)`
## 3. `hookaction` 参数字段
基础字段
1. `hookaction.hookaction: boolean`
2. `hookaction.round: number`
3. `hookaction.is_first: boolean`
4. `hookaction.our: { pet_id, catch_time, hp, max_hp } | null`
5. `hookaction.opp: { pet_id, catch_time, hp, max_hp } | null`
6. `hookaction.skills: Array<{ skill_id, pp, can_use }>`
AttackValue 映射字段重点
1. `hookaction.our_attack`
2. `hookaction.opp_attack`
结构
```ts
{
skill_id: number;
attack_time: number;
is_critical: number;
lost_hp: number;
gain_hp: number;
remain_hp: number;
max_hp: number;
state: number;
offensive: number;
status: number[]; // 对应 AttackValue.Status[20]
prop: number[]; // 对应 AttackValue.Prop[6]
}
```
其中
- `prop` 索引`[攻, 防, 特攻, 特防, 速度, 命中]`
- 对应值 `> 0` 代表强化`< 0` 代表下降`0` 代表无变化
返回值
- `true`继续行动
- `false`阻止行动
- 不返回默认回退到 `hookaction.hookaction`
## 4. 脚本示例
### 4.1 判断对方是否存在强化你问的这个
```js
function hookAction(hookaction) {
if (!hookaction.hookaction) return false;
var oppAtk = hookaction.opp_attack;
var oppHasBuff = false;
if (oppAtk && oppAtk.prop) {
for (var i = 0; i < oppAtk.prop.length; i++) {
if (oppAtk.prop[i] > 0) {
oppHasBuff = true;
break;
}
}
}
if (oppHasBuff) {
// 对方有强化时,放一个针对技能
useSkill(5001);
return true;
}
return true;
}
```
### 4.2 判断对方是否有异常状态
```js
function hookAction(hookaction) {
if (!hookaction.hookaction) return false;
var oppAtk = hookaction.opp_attack;
var hasStatus = false;
if (oppAtk && oppAtk.status) {
for (var i = 0; i < oppAtk.status.length; i++) {
if (oppAtk.status[i] > 0) {
hasStatus = true;
break;
}
}
}
if (!hasStatus) {
// 没有异常时尝试上异常
useSkill(6002);
}
return true;
}
```
## 5. Monaco 类型提示
```ts
import * as monaco from "monaco-editor";
monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
allowNonTsExtensions: true,
checkJs: true,
target: monaco.languages.typescript.ScriptTarget.ES2020,
});
monaco.languages.typescript.javascriptDefaults.addExtraLib(
`
interface BossHookPetContext {
pet_id: number;
catch_time: number;
hp: number;
max_hp: number;
}
interface BossHookSkillContext {
skill_id: number;
pp: number;
can_use: boolean;
}
interface BossHookAttackContext {
skill_id: number;
attack_time: number;
is_critical: number;
lost_hp: number;
gain_hp: number;
remain_hp: number;
max_hp: number;
state: number;
offensive: number;
status: number[];
prop: number[];
}
interface BossHookActionContext {
hookaction: boolean;
round: number;
is_first: boolean;
our: BossHookPetContext | null;
opp: BossHookPetContext | null;
skills: BossHookSkillContext[];
our_attack: BossHookAttackContext | null;
opp_attack: BossHookAttackContext | null;
}
declare function hookAction(hookaction: BossHookActionContext): boolean;
declare function HookAction(hookaction: BossHookActionContext): boolean;
declare function hookaction(hookaction: BossHookActionContext): boolean;
declare function useSkill(skillId: number): void;
declare function switchPet(catchTime: number): void;
`,
"ts:boss-script.d.ts"
);
```
## 6. 后端代码
- 脚本执行器与函数绑定`modules/config/model/boss_pet.go`
- AI 出手转发与上下文构建`logic/service/fight/input/ai.go`

View File

@@ -1,450 +0,0 @@
# Effect 重构会话总结2026-03-28
## 1. 本次会话完成内容
### 1.1 注释与说明统一
- 已将 `logic/service/fight/effect` 下效果注释统一为
- `// Effect <id>: <desc>`
- 说明来源
- `public/config/effectInfo.json`
### 1.2 结构整理与公共能力抽取
- 新增并使用了子效果统一挂载 helper
- `addSubEffect(...)`
- 已清理 `effect` 目录中的 `GenSub(...)` 直接调用残留统一走 helper
### 1.3 回合类基类组合继承已落地
- 当前已引入的 base位于 `logic/service/fight/effect/sub_effect_helper.go`
- `RoundEffectArg0Base`
- `RoundEffectSideArg0Base`
- `FixedDuration1Base`
- `FixedDurationNeg1Base`
- `FixedDuration2Base`
- `RoundEffectArg1Base`
- `RoundEffectSideArg1Base`
- `RoundEffectSideArg0Minus1Base`
- `RoundEffectSideArg0Minus1CanStackBase`
- 已有大量效果结构体改为嵌入上述 base删除重复 `SetArgs` 模板代码
### 1.4 编译状态
- 已多轮执行并通过
- `go test ./logic/service/fight/effect`
### 1.5 本轮新增 effect 实现
- 新增缺失效果实现
- `400` 若和对手属性相同则技能威力翻倍
- `480` `{0}`回合内自身所有攻击威力为两倍
- `586` `{0}`回合内自己的属性攻击必中
- `599` `{0}`回合内受到`{1}`伤害减少`{2}%`
- `610` 遇到天敌时先制+`{0}`
- `611` `{0}`回合自身使用攻击技能则附加`{1}`点固定伤害
- `613` `{0}`回合内自身令对手使用的`{1}`系攻击技能无效
- `573` `{0}`回合内若自身能力提升状态被消除或吸取则`{1}`%使对手`{2}``{3}`回合
- `587` `{0}`回合内若被对手击败则对手损失`{1}`点体力造成致命伤害时对手剩余1点体力
- `591` 造成伤害大于`{0}`则下`{1}`回合自己所有直接攻击先制+`{2}`
- `592` `{0}`回合每回合使用攻击技能`{1}`%令对手`{2}`
- `594` 造成的伤害低于`{0}``{1}`%令对手`{2}`
- `596` 技能使用成功时`{0}`%给予对手冻伤中毒烧伤中任意一种异常状态
- `597` `{0}`回合内每回合使用技能吸取对手最大体力的1/`{1}`
- `598` `{0}`%恢复自己所有技能PP值`{1}`
- `627` 对手处于能力提升状态时附加其`{0}``{1}`%的百分比伤害
- `628` 若对手处于能力下降状态则造成伤害的`{0}`%恢复体力
- `629` 消除`{0}`状态消除成功下回合自身先制+`{1}`
- `630` `{0}`回合内`{1}`状态被消除则有`{2}`%概率使对手`{3}`
- `631` 消除`{0}`状态消除成功下回合造成伤害提升`{1}`%
- `632` 造成伤害`{0}``{1}`则下`{2}`回合必定暴击
- `633` 造成伤害`{0}``{1}`则造成伤害的`{2}`%恢复体力
- `634` 若当前体力`{0}`对手则造成伤害的`{1}`%恢复体力
- `635` 吸收对手能力上升状态吸收成功下回合先制+`{0}`
- `636` 消除`{0}`状态消除成功则令对手`{1}`
- `637` 若对手处于异常状态则对手`{0}``{1}`
- `638` 若对手`{0}`技能威力提升`{1}`%
- `639` 造成伤害`{0}``{1}`则下`{2}`回合所有技能附带`{3}`点固定伤害
- `640` 命中后`{0}`%使对手`{1}``{2}`回合,遇到天敌概率翻倍
- `641` 命中后`{0}`%使对手进入流血状态
- `401` 若和对手属性相同则技能威力翻倍
- `585` 技能使用成功时`{0}`
- `589` 复制对手`{0}`的能力提升状态
- `590` 使对手`{0}``{6}`%弱化效果翻倍
- `593` 附加`{0}``{1}`值的`{2}`%的百分比伤害
- `595` 技能使用成功时`{0}`%使对手`{1}`若没有触发则对手`{2}`
- 已同步更新
- `logic/service/fight/effect/effect_info_map.go`
### 1.6 本轮新增文件
- `logic/service/fight/effect/400_480_586_599_610_611_613.go`
- `logic/service/fight/effect/573_587_591_592_594_596_597_598.go`
- `logic/service/fight/effect/627_631.go`
- `logic/service/fight/effect/632_636.go`
- `logic/service/fight/effect/637_641.go`
- `logic/service/fight/effect/effect_info_map.go`
### 1.7 本轮验证
- 已执行
- `go test ./service/fight/effect`
- 结果
- 通过
### 1.8 本轮结论
- 当前这轮更适合按低风险可复用现有模式 effect 小批次推进而不是一次性追求 `effectInfo.json` 全量覆盖
- 现有 `effect` 目录里已经有不少共享实现 + 批量注册的写法后续判断缺失项时不能只靠 grep `InitEffect(...)`
- 文档第 3 节里的未实现列表目前仍是历史扫描快照只能作为候选列表不能直接当最终事实使用
---
## 2. 当前仍保留自定义 `SetArgs` 的效果建议下一轮重点
以下属于非纯模板仍待抽象 SetArgs
- `Effect570``570.go`
- `Effect123``effect_119_123.go`
- `Effect41``effect_41.go`
- `Effect42``effect_42.go`
- `Effect46``effect_46.go`
- `Effect47``effect_47.go`
- `Effect48``effect_48.go`
- `Effect60``effect_60.go`
- `EffectPropSyncReverse``effect_attr.go`
- `SelfKill``selfkill.go`
建议分三类继续抽 base
- 随机回合/随机次数类 4142
- 次数型常驻类 464748SelfKill570
- SetArgs + 额外上下文初始化 Effect123EffectPropSyncReverse
---
## 3. 未实现或疑似未实现效果清单
### 3.0 `effectInfo.json` 提取的未实现总览自动扫描
- JSON 配置总效果数`2112`
- 代码已注册效果数Skill`338`
- JSON 中存在但代码未注册`1779`
- 代码中注册但 JSON 无对应条目`5``21, 31, 41, 42, 174`
说明
- 这个口径是配置覆盖率不是bug 数量
- 其中大量属于未来版本/未迁移内容不建议一次性全补建议按战斗系统实际启用范围分批实现
- 以下列表为上一轮扫描快照未随本轮新增实现实时回算
- 此外扫描脚本若未把共享实现中的批量注册统计进去也会把已实现效果误判成缺失
JSON 中存在但代码未注册示例前 60
- 2, 10, 11, 12, 14, 15, 16, 17, 22, 30
- 38, 40, 45, 51, 55, 56, 61, 64, 66, 67
- 70, 78, 84, 86, 92, 94, 96, 97, 99, 102
- 103, 104, 106, 108, 109, 114, 118, 132, 133, 139
- 141, 158, 162, 167, 168, 185, 401, 421, 431, 529
- 543, 554, 569, 573, 581, 582, 583, 584, 585, 586
### 3.1 明确标记未实装
- 文件存在明确标记
- `logic/service/fight/effect/529.go未实装`
### 3.2 已注册但缺少同名 `Effect{id}` 结构体需人工确认是否由合并实现覆盖
- `53`
- `74`
- `75`
- `186`
- `402`
- `433`
- `446`
- `451`
- `463`
- `497`
- `564`
- `588`
说明
- 这类通常可能是多个 id 共用一个结构体实现命名与 id 不一致需要逐个确认是否真正缺失行为
### 3.3 疑似未实现扫描规则存在 `Effect{id}` 类型但没有核心战斗 Hook
- `519``effect_519.go`
- `532``532.go`
- `552``552.go`
- `560``560.go`
- `576``576.go`
说明
- 这批是高优先级人工复查项不一定真的没实现可能通过组合/间接机制生效
### 3.4 当前更可信的下一批候选
这一组是结合本轮人工核对后仍然值得优先继续补的缺失 effect 候选
- 当前文档 3.4 中这批候选已在本轮补齐
说明
- 这批大多是 58x/59x 段的新效果和当前目录中已有实现重叠较少
- 相比继续深挖旧扫描误差这批更适合直接新增文件推进
---
## 4. 下次继续的建议顺序
建议严格按下面顺序继续不要重新从全量扫描开始
1. 先复核文档 3.4 里的候选项是否仍未实现
2. 优先补单次触发命中附加固定伤害恢复概率状态这类低风险逻辑
3. 再处理复制对手状态 / 多分支条件 / 触发链式子效果 58x/59x 复杂效果
4. 最后再回头处理文档 2 中那些仍保留自定义 `SetArgs` 的结构整理
本轮更推荐的下一批实现顺序
- 第一组`529 / 552 / 560 / 576`
- 第二组`10 / 11 / 12 / 14 / 15 / 16`
- 第三组`94 / 99 / 103 / 114`
---
## 5. 下一次继续让我实现时可直接复制的指令
可直接用下面这句发起
`继续处理 effect按 docs/effect-refactor-summary-2026-03-28.md 的 3.3 和 4 执行:先复核 529/552/560/576再补低风险状态附加类 10/11/12/14/15/16每实现一批就更新同一文档和 effect_info_map.go并跑 go test ./service/fight/effect。`
如果你希望按 JSON 覆盖率推进可用这句
`继续处理 effect按 docs/effect-refactor-summary-2026-03-28.md 的 3.0 从低风险效果开始补实现先补状态附加类10/11/12/14/15/16/94/99/103/114每实现一批就更新文档中的“已实现列表”和“剩余列表”。`
---
## 6. 扫描口径说明供后续排查
- 已注册效果 ID 扫描来源
- `InitEffect(input.EffectType.Skill, <id>, ...)`
- `initskill(<id>, ...)`
- 但这还不够后续扫描必须额外统计这些共享实现/批量注册文件
- `sterStatusEffects.go`
- `effect_power_doblue.go`
- `EffectAttackMiss.go`
- `EffectPhysicalAttackAddStatus.go`
- `EffectDefeatTrigger.go`
- `effect_attr.go`
- `effect_EffectConditionalAddDamage.go`
- `effect_74_75.go`
- `effect_104_109.go`
- `Effect{id}` 结构体与方法扫描来源
- `logic/service/fight/effect/*.go`
- 疑似未实现判断是启发式不是最终结论仍需代码级确认
---
## 7. 这次改动涉及的关键文件
- `public/config/effectInfo.json`
- `logic/service/fight/effect/400_480_586_599_610_611_613.go`
- `logic/service/fight/effect/573_587_591_592_594_596_597_598.go`
- `logic/service/fight/effect/effect_info_map.go`
- `logic/service/fight/effect/sub_effect_helper.go`
- `docs/effect-refactor-summary-2026-03-28.md`
---
## 8. 2026-03-29 增量记录
### 8.1 本轮补齐的 effect
- `663` `{0}回合内若对手使用攻击技能则{1}%使对手{2}`
- `664` 若先出手则当回合对手无法造成攻击伤害
- `665` 造成的伤害低于`{0}``{1}`回合内自身受到的伤害减少`{2}`
- `666` 使自身下回合攻击必定先手必定暴击
- `667` 自身为满体力时`{0}{1}`
### 8.2 实现口径
- `663` 复用与 `614` 同类的对手使用攻击技能时触发路径 `Skill_Use_ex()` 中按概率给对手附加状态
- `664` 复用 `170` 的先手免伤模式 `DamageLockEx()` 中将当回合受到的攻击伤害归零
- `665` 按技能实参 `250 3 100` 的实际使用方式落为低于阈值则给自己挂 3 回合 100 点固定减伤子效果不是百分比减伤
- `666` 落为仅对下回合攻击技能生效的先手与暴击保证`ComparePre()` 强制先手`ActionStart()` 强制暴击
- `667` 按配置说明自身攻击+a防御+b特攻+c特防+d速度+e命中+f处理仅在满体力时给自己附加前 6 项能力等级
### 8.3 本轮新增文件
- `logic/service/fight/effect/663_667.go`
### 8.4 本轮同步更新
- `logic/service/fight/effect/effect_info_map.go`
- `docs/effect-unimplemented-tasks/task-013-effects-663-667.md` 已完成可从任务目录移除
### 8.5 本轮验证
- `cd /workspace/logic && go test ./service/fight/effect`
- `cd /workspace/logic && go build ./...`
---
## 9. 2026-03-29 增量记录
### 9.1 本轮补齐的 effect
- `668` 若对手处于能力提升状态则先制额外+1
- `669` 当回合击败对手则下回合自身攻击先制+1
- `670` `{0}`回合每回合附加`{1}``{2}`值的`{3}%`的百分比伤害
- `671` 若对手处于异常状态则恢复造成伤害的`{0}%`的体力
- `672` 当回合击败对手则恢复自身全部体力
### 9.2 实现口径
- `668` 复用 `539` 的条件先制模式 `ComparePre()` 中于对手存在能力提升状态时直接给当前技能先制+1
- `669` 当回合击败后为下回合攻击技能生效处理 `SwitchOut()` 中标记击败成立下一回合 `ComparePre()` 仅对攻击技能追加先制+1
- `670` 参照 `419` `593` 的组合语义实现为回合类附加伤害效果持续期间每次使用技能时附加一次基于指定目标属性值的固定伤害
- `671` 复用 `687` 的伤害回血模式但条件改为对手处于任意异常状态
- `672` 按击败即时触发处理在对手因本次攻击退场时立刻将自身体力回复至满值
### 9.3 本轮新增文件
- `logic/service/fight/effect/668_672.go`
### 9.4 本轮同步更新
- `logic/service/fight/effect/effect_info_map.go`
- `docs/effect-unimplemented-tasks/task-014-effects-668-672.md` 已完成可从任务目录移除
### 9.5 本轮验证
- `cd /workspace/logic && go test ./service/fight/effect`
- `cd /workspace/logic && go build ./...`
---
## 10. 2026-03-29 增量记录
### 10.1 本轮补齐的 effect
- `642` `{0}回合内若对手攻击技能命中则己方在场精灵{1}%做出{2}`
- `643` `{0}%概率使对手{1}回合内{2}能力每回合变化{3}`
- `644` 当回合未击败对手则减少对手当前体力`1/{0}`
- `645` 体力低于`1/{0}`时威力`{1}`
- `646` 体力高于对手时此技能命中后 100% 使对手能力下降
### 10.2 实现口径
- `642` `moves.json` `1000642` 的说明实现反击档位映射`0-5` 分别对应 `50/100/150/200/250/300` 点固定伤害挂在 defender `Skill_Use_ex()`仅对命中的攻击技能生效
- `643` 按真实技能实参 `55 2 1 -1` 这类布局处理为命中后按概率给对手挂回合子效果子效果在 `TurnEnd()` 对指定能力执行一次 `SetProp`
- `644` 复用 `579` 未击败对手判定时机落在 `Action_end()`按对手当前体力结算 `1/n` 的百分比伤害
- `645` 复用 `37` 的低血线威力倍率模式 `SkillHit()` 中按当前体力是否低于最大体力 `1/n` 改写技能威力
- `646` 未按任务文档里的占位 `param` 硬编码改按实际技能配置的 6 段能力变化参数通用处理仅在自身体力高于对手且本次技能命中后生效
### 10.3 本轮新增文件
- `logic/service/fight/effect/642_646.go`
### 10.4 本轮同步更新
- `logic/service/fight/effect/effect_info_map.go`
- `docs/effect-unimplemented-tasks/task-009-effects-642-646.md` 已完成可从任务目录移除
---
## 11. 2026-03-29 增量记录
### 11.1 本轮补齐的 effect
- `769` 若对手不处于异常状态则造成的攻击伤害额外提升`{0}%`
- `770` 若对手处于异常状态则恢复自身全部体力
- `771` `{0}`回合内每次使用攻击技能都有`{1}%`概率使对手进入任意一种异常状态
- `772` `{0}`回合内若对手使用攻击技能则有`{1}%`概率随机进入烧伤冻伤中毒麻痹害怕睡眠中的一种异常状态
- `773` 若自身体力低于对手则与对手互换体力
### 11.2 实现口径
- `769` 复用 `1103` 的条件增伤写法 `SkillHit()` 中仅对攻击技能生效并在对手不存在任意异常状态时追加威力百分比
- `770` 按技能结算后触发处理落在 `Skill_Use()`满足对手处于异常状态时直接回复自身满体力
- `771` 作为回合类自身增益实现持续期间在 `OnSkill()` 针对每次攻击技能按概率给对手附加一项随机异常状态
- `772` 参照 `559` defender 侧监听时机落在 `Skill_Use_ex()`对手使用攻击技能时按概率附加六选一异常状态
- `773` 复用 `529` 的直接改写当前体力思路在满足自身体力低于对手时交换双方当前体力并分别按各自最大体力上限截断
### 11.3 本轮新增文件
- `logic/service/fight/effect/769_773.go`
### 11.4 本轮同步更新
- `logic/service/fight/effect/effect_info_map.go`
- `docs/effect-unimplemented-tasks/task-032-effects-769-773.md` 已完成可从任务目录移除
---
## 12. 2026-03-29 增量记录
### 12.1 本轮补齐的 effect
- `1498` 随机附加烧伤冻伤失明失神中的 `{0}` 种异常状态未触发则自身下 `{1}` 回合造成的伤害提升 `{2}%`
- `1499` 体力低于最大体力的 `1/3` 时先制 `+3`
- `1500` 1 回合做 `{0}-{1}` 次攻击自身处于护盾状态下连击上限为 `{2}`
- `1501` 命中后为对手种下一颗黑暗之种
- `1502` 对手身上存在黑暗之种时先制 `+1`
### 12.2 实现口径
- `1498` 复用 `1111` 未触发则挂自身增伤子效果模式随机状态池按任务文案落为烧伤冻伤失明失神若本次一个状态都未成功挂上则给自身添加持续 `{1}` 回合的增伤子效果
- `1499` 复用现有条件先制写法 `ComparePre()` 中按当前体力是否低于最大体力 `1/3` 直接修改当前技能优先级
- `1500` 参照仓库现有多段技能处理口径不做逐段攻击而是在 `Damage_Mul()` 中按随机连击次数折算红伤倍率若自身当前存在护盾则用 `{2}` 约束连击上限
- `1501` 作为挂在 defender 身上的持久子效果实现命中后附加黑暗之种 4 `TurnEnd()` 随机扣 1 个技能 PP成熟后每回合所有技能 PP `-1`下场后清除
- `1502` `ComparePre()` 中检查对手是否持有 `1501` 的子效果存在时当前技能先制 `+1`
### 12.3 模型假设
- 仓库当前未注册失神状态本轮按状态 ID `29` 追加了一个最小可用实现行为复用 `StatusCannotAct`
- `1500` 仍受当前战斗模型限制只能按总连击数折算伤害不能表现逐段命中逐段触发的细粒度行为
### 12.4 本轮新增文件
- `logic/service/fight/effect/1498_1502.go`
### 12.5 本轮同步更新
- `logic/service/fight/effect/effect_info_map.go`
- `docs/effect-unimplemented-tasks/README.md`
- `docs/effect-unimplemented-tasks/task-177-effects-1498-1502.md` 已完成可从任务目录移除
### 12.6 本轮验证
- `cd /workspace/logic && go test ./service/fight/effect`
- `cd /workspace/logic && go build ./...`
---
## 13. 2026-03-29 增量记录
### 13.1 本轮补齐的 effect
- `1503` 清除对手身上的黑暗之种清除成功则令对手随机受到 `1-500` 点固定伤害
- `1504` `40%` 令对手诅咒若对手身上存在黑暗之种则概率翻倍
- `1505` 黑暗之种成长期时附加 `200` 点固定伤害黑暗之种长大后固定伤害翻倍
- `1506` 若对手不是龙系精灵则恢复自身 `{0}` 点体力
- `1507` `{0}` 回合内自身受到攻击则令对手随机进入 `{1}` 种异常状态未触发则消除对手回合类效果
### 13.2 实现口径
- `1503` 复用本轮新增的黑暗之种清理 helper `Skill_Use()` 中清除对手持有的 `1501` 子效果仅当成功清除时追加一次 `1-500` 的随机固定伤害
- `1504` 按任务文案直接实现为基础 `40%` 概率若对手当前仍持有黑暗之种则翻倍到 `80%`仓库尚无诅咒状态注册本轮补了一个最小可用的状态壳以承接后续联动
- `1505` 读取 `1501` 子效果当前成长阶段成长期附加 `200` 固定伤害成熟后附加 `400` 固定伤害若对手不存在黑暗之种则不触发
- `1506` 使用宠物当前系别组合判断是否包含龙系仅在对手主属性副属性均不为龙系时恢复自身体力
- `1507` 复用 `1228` defender 侧监听模式落在 `Skill_Use_ex()`对手使用攻击技能命中本体时随机附加若干异常状态若整段持续时间内一次都未成功触发则在最后一回合结束时清除对手回合类效果
### 13.3 模型假设
- 仓库当前缺少诅咒状态实现本轮按状态 ID `23` 注册了一个最小 `BaseStatus` 版本只提供状态存在性与常规下场清理不额外附带持续结算逻辑
- `1505` 黑暗之种成长期/长大后判断直接复用 `1501` 子效果内部阶段计数 4 次回合结束视为成长期 5 次起视为成熟
### 13.4 本轮新增文件
- `logic/service/fight/effect/1503_1507.go`
### 13.5 本轮同步更新
- `logic/service/fight/effect/effect_info_map.go`
- `docs/effect-unimplemented-tasks/README.md`
- `docs/effect-unimplemented-tasks/task-178-effects-1503-1507.md` 已完成可从任务目录移除
### 13.6 本轮验证
- `cd /workspace/logic && go test ./service/fight/effect`
- `cd /workspace/logic && go build ./...`
---
## 14. 2026-03-30 增量记录
### 14.1 本轮补齐的 effect
- `1508` 先出手时无视攻击免疫效果
- `1509` 令对手全属性-`{0}` 且随机 `{1}` 个技能 PP 值归零技能无效时消耗自身全部体力并令对手全属性-1然后对手下 3 次使用技能消耗的 PP 值为 3
- `1510` `{0}` 回合内对手主动切换精灵则登场精灵 `{1}%` 随机进入 `{2}` 种异常状态
- `1511` 先出手时免疫当回合受到的攻击伤害若对手为自身天敌则免疫并反弹给对手造成伤害值 `{0}%` 的百分比伤害
- `1512` 集结天幕四龙之神力使自身下 2 回合先制+3且攻击必定命中必定致命
### 14.2 实现口径
- `1508` 采用仓库现有模型下的局部支持方案若自身本次先出手且使用攻击技能则在伤害结算前临时屏蔽若干常见攻击伤害清零类 immunity effect并在技能结算结束后恢复
- `1509` 正常命中时直接令对手全属性下降并随机清空若干技能 PP若本次技能实体存在但 `AttackTime == 0`则按技能无效分支处理自损全部体力令对手全属性-1并给对手挂 3 PP 三倍消耗子效果
- `1510` 复用 `1562` 主动切换后对登场精灵生效模式效果挂在对手侧仅在对手主动切换下场时置 pending登场后按概率随机附加若干异常状态
- `1511` 复用 `170/1011` 的免疫伤害写法落在 `DamageLockEx()`若自身先出手则直接免疫本回合受到的红伤若对手同时为自身天敌则按原伤害值 `{0}%` 追加一次百分比伤害反弹
- `1512` 作为持续 2 回合的自身子效果实现 `ComparePre()` 中固定追加先制 `+3`并在 `ActionStart()` 中对攻击技能同时赋予必中与必定致命
### 14.3 模型假设
- `1508` 当前没有通用无视攻击免疫标记位本轮仅覆盖仓库内已识别的常见攻击免疫 effect`170/525/570/850/1011/1511`对其他未来新增或语义不同的 defender 侧免疫实现不保证自动生效
- `1509` 技能无效时按仓库现有口径解释为技能实体存在但本次结算后 `AttackTime == 0`不把被控未出手 PP 无法释放这类情况算作技能无效
### 14.4 本轮新增文件
- `logic/service/fight/effect/1508_1512.go`
### 14.5 本轮同步更新
- `logic/service/fight/effect/effect_info_map.go`
- `docs/effect-unimplemented-tasks/README.md`
- `docs/effect-unimplemented-tasks/task-179-effects-1508-1512.md` 已完成可从任务目录移除
### 14.6 本轮验证
- `cd /workspace/logic && go test ./service/fight/effect`
- `cd /workspace/logic && go build ./...`

View File

@@ -1,348 +0,0 @@
# effectInfo.json 未实现 effect 任务拆分
## 口径
- 来源配置`/workspace/public/config/effectInfo.json` `root.Effect`
- 已实现判定静态扫描 `logic/service/fight/effect` 中已注册的技能 effect ID覆盖直接注册和已确认的共享/批量注册
- 额外计入未实现`201``445` 这类已注册但当前仅占位未落核心逻辑的 effect
- 本次生成时间2026-03-28 UTC
## 统计
- effectInfo.json effect 总数`2112`
- 当前判定已实现`411`
- 当前判定未实现`1706`
- 任务文档数`342` 5 effect 一组最后一组不足 5
## 任务清单
- `001`: `17-600` -> `task-001-effects-17-600.md`
- `002`: `601-605` -> `task-002-effects-601-605.md`
- `003`: `606-614` -> `task-003-effects-606-614.md`
- `004`: `615-619` -> `task-004-effects-615-619.md`
- `005`: `621-625` -> `task-005-effects-621-625.md`
- `006`: `627-631` -> `task-006-effects-627-631.md`
- `007`: `632-636` -> `task-007-effects-632-636.md`
- `008`: `637-641` -> `task-008-effects-637-641.md`
- `009`: `642-646` -> `task-009-effects-642-646.md`
- `010`: `648-652` -> `task-010-effects-648-652.md`
- `011`: `653-657` -> `task-011-effects-653-657.md`
- `012`: `658-662` -> `task-012-effects-658-662.md`
- `013`: `663-667` -> `task-013-effects-663-667.md`
- `014`: `668-672` -> `task-014-effects-668-672.md`
- `015`: `673-677` -> `task-015-effects-673-677.md`
- `016`: `678-693` -> `task-016-effects-678-693.md`
- `017`: `694-698` -> `task-017-effects-694-698.md`
- `018`: `699-703` -> `task-018-effects-699-703.md`
- `019`: `704-708` -> `task-019-effects-704-708.md`
- `020`: `709-713` -> `task-020-effects-709-713.md`
- `021`: `714-718` -> `task-021-effects-714-718.md`
- `022`: `719-723` -> `task-022-effects-719-723.md`
- `023`: `724-728` -> `task-023-effects-724-728.md`
- `024`: `729-733` -> `task-024-effects-729-733.md`
- `025`: `734-738` -> `task-025-effects-734-738.md`
- `026`: `739-743` -> `task-026-effects-739-743.md`
- `027`: `744-748` -> `task-027-effects-744-748.md`
- `028`: `749-753` -> `task-028-effects-749-753.md`
- `029`: `754-758` -> `task-029-effects-754-758.md`
- `030`: `759-763` -> `task-030-effects-759-763.md`
- `031`: `764-768` -> `task-031-effects-764-768.md`
- `032`: `769-773` -> `task-032-effects-769-773.md`
- `033`: `774-779` -> `task-033-effects-774-779.md`
- `034`: `780-784` -> `task-034-effects-780-784.md`
- `035`: `785-789` -> `task-035-effects-785-789.md`
- `036`: `790-794` -> `task-036-effects-790-794.md`
- `037`: `795-799` -> `task-037-effects-795-799.md`
- `038`: `800-804` -> `task-038-effects-800-804.md`
- `039`: `805-809` -> `task-039-effects-805-809.md`
- `040`: `810-814` -> `task-040-effects-810-814.md`
- `041`: `815-819` -> `task-041-effects-815-819.md`
- `042`: `820-824` -> `task-042-effects-820-824.md`
- `043`: `825-829` -> `task-043-effects-825-829.md`
- `044`: `830-835` -> `task-044-effects-830-835.md`
- `045`: `836-840` -> `task-045-effects-836-840.md`
- `046`: `841-845` -> `task-046-effects-841-845.md`
- `047`: `846-850` -> `task-047-effects-846-850.md`
- `048`: `851-855` -> `task-048-effects-851-855.md`
- `049`: `856-860` -> `task-049-effects-856-860.md`
- `050`: `861-865` -> `task-050-effects-861-865.md`
- `051`: `866-870` -> `task-051-effects-866-870.md`
- `052`: `871-875` -> `task-052-effects-871-875.md`
- `053`: `876-880` -> `task-053-effects-876-880.md`
- `054`: `881-885` -> `task-054-effects-881-885.md`
- `055`: `886-890` -> `task-055-effects-886-890.md`
- `056`: `891-895` -> `task-056-effects-891-895.md`
- `057`: `896-900` -> `task-057-effects-896-900.md`
- `058`: `901-905` -> `task-058-effects-901-905.md`
- `059`: `906-910` -> `task-059-effects-906-910.md`
- `060`: `911-915` -> `task-060-effects-911-915.md`
- `061`: `916-920` -> `task-061-effects-916-920.md`
- `062`: `921-925` -> `task-062-effects-921-925.md`
- `063`: `926-930` -> `task-063-effects-926-930.md`
- `064`: `931-935` -> `task-064-effects-931-935.md`
- `065`: `936-940` -> `task-065-effects-936-940.md`
- `066`: `941-945` -> `task-066-effects-941-945.md`
- `067`: `946-950` -> `task-067-effects-946-950.md`
- `068`: `951-955` -> `task-068-effects-951-955.md`
- `069`: `956-960` -> `task-069-effects-956-960.md`
- `070`: `961-965` -> `task-070-effects-961-965.md`
- `071`: `966-970` -> `task-071-effects-966-970.md`
- `072`: `971-975` -> `task-072-effects-971-975.md`
- `073`: `976-980` -> `task-073-effects-976-980.md`
- `074`: `981-985` -> `task-074-effects-981-985.md`
- `075`: `986-990` -> `task-075-effects-986-990.md`
- `076`: `991-995` -> `task-076-effects-991-995.md`
- `077`: `996-1000` -> `task-077-effects-996-1000.md`
- `078`: `1001-1005` -> `task-078-effects-1001-1005.md`
- `079`: `1006-1010` -> `task-079-effects-1006-1010.md`
- `080`: `1011-1015` -> `task-080-effects-1011-1015.md`
- `081`: `1016-1020` -> `task-081-effects-1016-1020.md`
- `082`: `1021-1025` -> `task-082-effects-1021-1025.md`
- `083`: `1026-1030` -> `task-083-effects-1026-1030.md`
- `084`: `1031-1035` -> `task-084-effects-1031-1035.md`
- `085`: `1036-1040` -> `task-085-effects-1036-1040.md`
- `086`: `1041-1046` -> `task-086-effects-1041-1046.md`
- `087`: `1047-1051` -> `task-087-effects-1047-1051.md`
- `088`: `1052-1056` -> `task-088-effects-1052-1056.md`
- `089`: `1057-1061` -> `task-089-effects-1057-1061.md`
- `090`: `1062-1066` -> `task-090-effects-1062-1066.md`
- `091`: `1067-1071` -> `task-091-effects-1067-1071.md`
- `092`: `1072-1076` -> `task-092-effects-1072-1076.md`
- `093`: `1077-1081` -> `task-093-effects-1077-1081.md`
- `094`: `1082-1086` -> `task-094-effects-1082-1086.md`
- `095`: `1087-1091` -> `task-095-effects-1087-1091.md`
- `096`: `1092-1096` -> `task-096-effects-1092-1096.md`
- `097`: `1097-1101` -> `task-097-effects-1097-1101.md`
- `098`: `1102-1106` -> `task-098-effects-1102-1106.md`
- `099`: `1107-1111` -> `task-099-effects-1107-1111.md`
- `100`: `1112-1116` -> `task-100-effects-1112-1116.md`
- `101`: `1117-1121` -> `task-101-effects-1117-1121.md`
- `102`: `1122-1126` -> `task-102-effects-1122-1126.md`
- `103`: `1127-1131` -> `task-103-effects-1127-1131.md`
- `104`: `1132-1136` -> `task-104-effects-1132-1136.md`
- `105`: `1137-1141` -> `task-105-effects-1137-1141.md`
- `106`: `1142-1147` -> `task-106-effects-1142-1147.md`
- `107`: `1148-1152` -> `task-107-effects-1148-1152.md`
- `108`: `1153-1157` -> `task-108-effects-1153-1157.md`
- `109`: `1158-1162` -> `task-109-effects-1158-1162.md`
- `110`: `1163-1167` -> `task-110-effects-1163-1167.md`
- `111`: `1168-1172` -> `task-111-effects-1168-1172.md`
- `112`: `1173-1177` -> `task-112-effects-1173-1177.md`
- `113`: `1178-1182` -> `task-113-effects-1178-1182.md`
- `114`: `1183-1187` -> `task-114-effects-1183-1187.md`
- `115`: `1188-1192` -> `task-115-effects-1188-1192.md`
- `116`: `1193-1197` -> `task-116-effects-1193-1197.md`
- `117`: `1198-1202` -> `task-117-effects-1198-1202.md`
- `118`: `1203-1207` -> `task-118-effects-1203-1207.md`
- `119`: `1208-1212` -> `task-119-effects-1208-1212.md`
- `120`: `1213-1217` -> `task-120-effects-1213-1217.md`
- `121`: `1218-1222` -> `task-121-effects-1218-1222.md`
- `122`: `1223-1227` -> `task-122-effects-1223-1227.md`
- `123`: `1228-1232` -> `task-123-effects-1228-1232.md`
- `124`: `1233-1237` -> `task-124-effects-1233-1237.md`
- `125`: `1238-1242` -> `task-125-effects-1238-1242.md`
- `126`: `1243-1247` -> `task-126-effects-1243-1247.md`
- `127`: `1248-1252` -> `task-127-effects-1248-1252.md`
- `128`: `1253-1257` -> `task-128-effects-1253-1257.md`
- `129`: `1258-1262` -> `task-129-effects-1258-1262.md`
- `130`: `1263-1267` -> `task-130-effects-1263-1267.md`
- `131`: `1268-1272` -> `task-131-effects-1268-1272.md`
- `132`: `1273-1277` -> `task-132-effects-1273-1277.md`
- `133`: `1278-1282` -> `task-133-effects-1278-1282.md`
- `134`: `1283-1287` -> `task-134-effects-1283-1287.md`
- `135`: `1288-1292` -> `task-135-effects-1288-1292.md`
- `136`: `1293-1297` -> `task-136-effects-1293-1297.md`
- `137`: `1298-1302` -> `task-137-effects-1298-1302.md`
- `138`: `1303-1307` -> `task-138-effects-1303-1307.md`
- `139`: `1308-1312` -> `task-139-effects-1308-1312.md`
- `140`: `1313-1317` -> `task-140-effects-1313-1317.md`
- `141`: `1318-1322` -> `task-141-effects-1318-1322.md`
- `142`: `1323-1327` -> `task-142-effects-1323-1327.md`
- `143`: `1328-1332` -> `task-143-effects-1328-1332.md`
- `144`: `1333-1337` -> `task-144-effects-1333-1337.md`
- `145`: `1338-1342` -> `task-145-effects-1338-1342.md`
- `146`: `1343-1347` -> `task-146-effects-1343-1347.md`
- `147`: `1348-1352` -> `task-147-effects-1348-1352.md`
- `148`: `1353-1357` -> `task-148-effects-1353-1357.md`
- `149`: `1358-1362` -> `task-149-effects-1358-1362.md`
- `150`: `1363-1367` -> `task-150-effects-1363-1367.md`
- `151`: `1368-1372` -> `task-151-effects-1368-1372.md`
- `152`: `1373-1377` -> `task-152-effects-1373-1377.md`
- `153`: `1378-1382` -> `task-153-effects-1378-1382.md`
- `154`: `1383-1387` -> `task-154-effects-1383-1387.md`
- `155`: `1388-1392` -> `task-155-effects-1388-1392.md`
- `160`: `1413-1417` -> `task-160-effects-1413-1417.md`
- `161`: `1418-1422` -> `task-161-effects-1418-1422.md`
- `162`: `1423-1427` -> `task-162-effects-1423-1427.md`
- `163`: `1428-1432` -> `task-163-effects-1428-1432.md`
- `164`: `1433-1437` -> `task-164-effects-1433-1437.md`
- `165`: `1438-1442` -> `task-165-effects-1438-1442.md`
- `166`: `1443-1447` -> `task-166-effects-1443-1447.md`
- `167`: `1448-1452` -> `task-167-effects-1448-1452.md`
- `168`: `1453-1457` -> `task-168-effects-1453-1457.md`
- `169`: `1458-1462` -> `task-169-effects-1458-1462.md`
- `170`: `1463-1467` -> `task-170-effects-1463-1467.md`
- `171`: `1468-1472` -> `task-171-effects-1468-1472.md`
- `172`: `1473-1477` -> `task-172-effects-1473-1477.md`
- `173`: `1478-1482` -> `task-173-effects-1478-1482.md`
- `174`: `1483-1487` -> `task-174-effects-1483-1487.md`
- `175`: `1488-1492` -> `task-175-effects-1488-1492.md`
- `176`: `1493-1497` -> `task-176-effects-1493-1497.md`
- `180`: `1513-1517` -> `task-180-effects-1513-1517.md`
- `181`: `1518-1522` -> `task-181-effects-1518-1522.md`
- `182`: `1523-1527` -> `task-182-effects-1523-1527.md`
- `183`: `1528-1532` -> `task-183-effects-1528-1532.md`
- `184`: `1533-1537` -> `task-184-effects-1533-1537.md`
- `185`: `1538-1542` -> `task-185-effects-1538-1542.md`
- `186`: `1543-1547` -> `task-186-effects-1543-1547.md`
- `187`: `1548-1552` -> `task-187-effects-1548-1552.md`
- `188`: `1553-1557` -> `task-188-effects-1553-1557.md`
- `189`: `1558-1562` -> `task-189-effects-1558-1562.md`
- `190`: `1563-1567` -> `task-190-effects-1563-1567.md`
- `191`: `1568-1572` -> `task-191-effects-1568-1572.md`
- `192`: `1573-1577` -> `task-192-effects-1573-1577.md`
- `193`: `1578-1582` -> `task-193-effects-1578-1582.md`
- `194`: `1583-1587` -> `task-194-effects-1583-1587.md`
- `195`: `1588-1592` -> `task-195-effects-1588-1592.md`
- `196`: `1593-1597` -> `task-196-effects-1593-1597.md`
- `197`: `1598-1602` -> `task-197-effects-1598-1602.md`
- `198`: `1603-1608` -> `task-198-effects-1603-1608.md`
- `199`: `1609-1613` -> `task-199-effects-1609-1613.md`
- `200`: `1614-1619` -> `task-200-effects-1614-1619.md`
- `201`: `1620-1624` -> `task-201-effects-1620-1624.md`
- `202`: `1625-1629` -> `task-202-effects-1625-1629.md`
- `203`: `1630-1634` -> `task-203-effects-1630-1634.md`
- `204`: `1635-1639` -> `task-204-effects-1635-1639.md`
- `205`: `1640-1644` -> `task-205-effects-1640-1644.md`
- `206`: `1645-1649` -> `task-206-effects-1645-1649.md`
- `207`: `1650-1654` -> `task-207-effects-1650-1654.md`
- `208`: `1655-1659` -> `task-208-effects-1655-1659.md`
- `209`: `1660-1664` -> `task-209-effects-1660-1664.md`
- `210`: `1665-1669` -> `task-210-effects-1665-1669.md`
- `216`: `1695-1699` -> `task-216-effects-1695-1699.md`
- `217`: `1700-1704` -> `task-217-effects-1700-1704.md`
- `218`: `1705-1709` -> `task-218-effects-1705-1709.md`
- `219`: `1710-1714` -> `task-219-effects-1710-1714.md`
- `220`: `1715-1719` -> `task-220-effects-1715-1719.md`
- `221`: `1720-1724` -> `task-221-effects-1720-1724.md`
- `222`: `1725-1729` -> `task-222-effects-1725-1729.md`
- `223`: `1730-1734` -> `task-223-effects-1730-1734.md`
- `224`: `1735-1739` -> `task-224-effects-1735-1739.md`
- `225`: `1740-1744` -> `task-225-effects-1740-1744.md`
- `226`: `1745-1749` -> `task-226-effects-1745-1749.md`
- `227`: `1750-1754` -> `task-227-effects-1750-1754.md`
- `228`: `1755-1759` -> `task-228-effects-1755-1759.md`
- `229`: `1760-1764` -> `task-229-effects-1760-1764.md`
- `230`: `1765-1769` -> `task-230-effects-1765-1769.md`
- `231`: `1770-1774` -> `task-231-effects-1770-1774.md`
- `232`: `1775-1779` -> `task-232-effects-1775-1779.md`
- `233`: `1780-1784` -> `task-233-effects-1780-1784.md`
- `234`: `1785-1789` -> `task-234-effects-1785-1789.md`
- `235`: `1790-1794` -> `task-235-effects-1790-1794.md`
- `236`: `1795-1799` -> `task-236-effects-1795-1799.md`
- `237`: `1800-1804` -> `task-237-effects-1800-1804.md`
- `238`: `1805-1809` -> `task-238-effects-1805-1809.md`
- `239`: `1810-1814` -> `task-239-effects-1810-1814.md`
- `240`: `1815-1819` -> `task-240-effects-1815-1819.md`
- `241`: `1820-1824` -> `task-241-effects-1820-1824.md`
- `242`: `1825-1829` -> `task-242-effects-1825-1829.md`
- `243`: `1830-1834` -> `task-243-effects-1830-1834.md`
- `244`: `1835-1839` -> `task-244-effects-1835-1839.md`
- `245`: `1840-1844` -> `task-245-effects-1840-1844.md`
- `246`: `1845-1849` -> `task-246-effects-1845-1849.md`
- `247`: `1850-1854` -> `task-247-effects-1850-1854.md`
- `248`: `1855-1859` -> `task-248-effects-1855-1859.md`
- `249`: `1860-1864` -> `task-249-effects-1860-1864.md`
- `250`: `1865-1869` -> `task-250-effects-1865-1869.md`
- `251`: `1870-1874` -> `task-251-effects-1870-1874.md`
- `252`: `1875-1879` -> `task-252-effects-1875-1879.md`
- `253`: `1880-1884` -> `task-253-effects-1880-1884.md`
- `254`: `1885-1889` -> `task-254-effects-1885-1889.md`
- `255`: `1890-1894` -> `task-255-effects-1890-1894.md`
- `256`: `1895-1899` -> `task-256-effects-1895-1899.md`
- `257`: `1900-1904` -> `task-257-effects-1900-1904.md`
- `258`: `1905-1909` -> `task-258-effects-1905-1909.md`
- `259`: `1910-1914` -> `task-259-effects-1910-1914.md`
- `260`: `1915-1919` -> `task-260-effects-1915-1919.md`
- `261`: `1920-1924` -> `task-261-effects-1920-1924.md`
- `262`: `1925-1929` -> `task-262-effects-1925-1929.md`
- `263`: `1930-1934` -> `task-263-effects-1930-1934.md`
- `264`: `1935-1939` -> `task-264-effects-1935-1939.md`
- `265`: `1940-1944` -> `task-265-effects-1940-1944.md`
- `266`: `1945-1949` -> `task-266-effects-1945-1949.md`
- `267`: `1950-1954` -> `task-267-effects-1950-1954.md`
- `268`: `1955-1959` -> `task-268-effects-1955-1959.md`
- `269`: `1960-1964` -> `task-269-effects-1960-1964.md`
- `270`: `1965-1969` -> `task-270-effects-1965-1969.md`
- `271`: `1970-1974` -> `task-271-effects-1970-1974.md`
- `272`: `1975-1979` -> `task-272-effects-1975-1979.md`
- `273`: `1980-1984` -> `task-273-effects-1980-1984.md`
- `274`: `1985-1989` -> `task-274-effects-1985-1989.md`
- `275`: `1990-1994` -> `task-275-effects-1990-1994.md`
- `276`: `1995-1999` -> `task-276-effects-1995-1999.md`
- `277`: `2000-2004` -> `task-277-effects-2000-2004.md`
- `278`: `2005-2009` -> `task-278-effects-2005-2009.md`
- `279`: `2010-2014` -> `task-279-effects-2010-2014.md`
- `280`: `2015-2019` -> `task-280-effects-2015-2019.md`
- `281`: `2020-2024` -> `task-281-effects-2020-2024.md`
- `282`: `2025-2029` -> `task-282-effects-2025-2029.md`
- `283`: `2030-2034` -> `task-283-effects-2030-2034.md`
- `284`: `2035-2039` -> `task-284-effects-2035-2039.md`
- `285`: `2040-2044` -> `task-285-effects-2040-2044.md`
- `286`: `2045-2049` -> `task-286-effects-2045-2049.md`
- `287`: `2050-2054` -> `task-287-effects-2050-2054.md`
- `288`: `2055-2059` -> `task-288-effects-2055-2059.md`
- `289`: `2060-2064` -> `task-289-effects-2060-2064.md`
- `290`: `2065-2069` -> `task-290-effects-2065-2069.md`
- `291`: `2070-2074` -> `task-291-effects-2070-2074.md`
- `292`: `2075-2079` -> `task-292-effects-2075-2079.md`
- `293`: `2080-2084` -> `task-293-effects-2080-2084.md`
- `294`: `2085-2089` -> `task-294-effects-2085-2089.md`
- `295`: `2090-2094` -> `task-295-effects-2090-2094.md`
- `296`: `2095-2099` -> `task-296-effects-2095-2099.md`
- `297`: `2100-2104` -> `task-297-effects-2100-2104.md`
- `298`: `2105-2109` -> `task-298-effects-2105-2109.md`
- `299`: `2110-2114` -> `task-299-effects-2110-2114.md`
- `300`: `2115-2119` -> `task-300-effects-2115-2119.md`
- `301`: `2120-2124` -> `task-301-effects-2120-2124.md`
- `302`: `2125-2129` -> `task-302-effects-2125-2129.md`
- `303`: `2130-2134` -> `task-303-effects-2130-2134.md`
- `304`: `2135-2139` -> `task-304-effects-2135-2139.md`
- `305`: `2140-2144` -> `task-305-effects-2140-2144.md`
- `306`: `2145-2149` -> `task-306-effects-2145-2149.md`
- `307`: `2150-2154` -> `task-307-effects-2150-2154.md`
- `308`: `2155-2159` -> `task-308-effects-2155-2159.md`
- `309`: `2160-2164` -> `task-309-effects-2160-2164.md`
- `310`: `2165-2169` -> `task-310-effects-2165-2169.md`
- `311`: `2170-2174` -> `task-311-effects-2170-2174.md`
- `312`: `2175-2179` -> `task-312-effects-2175-2179.md`
- `313`: `2180-2184` -> `task-313-effects-2180-2184.md`
- `314`: `2185-2189` -> `task-314-effects-2185-2189.md`
- `315`: `2190-2194` -> `task-315-effects-2190-2194.md`
- `316`: `2195-2199` -> `task-316-effects-2195-2199.md`
- `317`: `2200-2204` -> `task-317-effects-2200-2204.md`
- `318`: `2205-2209` -> `task-318-effects-2205-2209.md`
- `319`: `2210-2214` -> `task-319-effects-2210-2214.md`
- `320`: `2215-2219` -> `task-320-effects-2215-2219.md`
- `321`: `2220-2224` -> `task-321-effects-2220-2224.md`
- `322`: `2225-2229` -> `task-322-effects-2225-2229.md`
- `323`: `2230-2234` -> `task-323-effects-2230-2234.md`
- `324`: `2235-2239` -> `task-324-effects-2235-2239.md`
- `325`: `2240-2244` -> `task-325-effects-2240-2244.md`
- `326`: `2245-2249` -> `task-326-effects-2245-2249.md`
- `327`: `2250-2254` -> `task-327-effects-2250-2254.md`
- `328`: `2255-2259` -> `task-328-effects-2255-2259.md`
- `329`: `2260-2264` -> `task-329-effects-2260-2264.md`
- `330`: `2265-2269` -> `task-330-effects-2265-2269.md`
- `331`: `2270-2274` -> `task-331-effects-2270-2274.md`
- `332`: `2275-2279` -> `task-332-effects-2275-2279.md`
- `333`: `2280-2284` -> `task-333-effects-2280-2284.md`
- `334`: `2285-2289` -> `task-334-effects-2285-2289.md`
- `335`: `2290-2294` -> `task-335-effects-2290-2294.md`
- `336`: `2295-2299` -> `task-336-effects-2295-2299.md`
- `337`: `2300-2304` -> `task-337-effects-2300-2304.md`
- `338`: `2305-2309` -> `task-338-effects-2305-2309.md`
- `339`: `2310-2314` -> `task-339-effects-2310-2314.md`
- `340`: `2315-2319` -> `task-340-effects-2315-2319.md`
- `341`: `2320-2324` -> `task-341-effects-2320-2324.md`
- `342`: `2325-2325` -> `task-342-effects-2325-2325.md`

View File

@@ -1,46 +0,0 @@
# Task 008: Effects 637-641
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 637
- `argsNum`: `2`
- `info`: `若对手处于异常状态,则对手{0}{1}`
- `param`: `2,0,0`
### Effect 638
- `argsNum`: `2`
- `info`: `若对手{0},技能威力提升{1}%`
- `param`: `1,0,0`
### Effect 639
- `argsNum`: `4`
- `info`: `造成伤害{0}{1},则下{2}回合所有技能附带{3}点固定伤害`
- `param`: `12,0,0`
### Effect 640
- `argsNum`: `3`
- `info`: `命中后{0}%使对手{1}{2}回合,遇到天敌概率翻倍`
- `param`: `1,1,1`
### Effect 641
- `argsNum`: `1`
- `info`: `命中后{0}%使对手进入流血状态`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明
## 完成记录
- 2026-03-29已在 `logic/service/fight/effect/637_641.go` 补齐 `637-641`
- 同步更新了 `logic/service/fight/effect/effect_info_map.go`
- 额外补上了 `Bleeding(16)` 状态的基础注册使 `641` 能挂载流血状态
- 验证命令`cd /workspace/logic && go test ./service/fight/effect`

View File

@@ -1,35 +0,0 @@
# Task 031: Effects 764-768
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 764
- `argsNum`: `2`
- `info`: `{0}回合内若对手使用攻击技能降低对手最大体力的1/{1}`
### Effect 765
- `argsNum`: `1`
- `info`: `{0}回合对手无法使自身能力出现提升状态`
### Effect 766
- `argsNum`: `2`
- `info`: `消除对手能力提升状态,消除成功则{0}回合内对手造成的攻击伤害不超过{1}点`
### Effect 767
- `argsNum`: `2`
- `info`: `{0}回合内每回合使用技能且出手流程结束后若对手处于能力下降状态则附加给对手{1}点固定伤害`
### Effect 768
- `argsNum`: `1`
- `info`: `对手每处于一种异常状态则附加{0}点固定伤害`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 033: Effects 774-779
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 774
- `argsNum`: `1`
- `info`: `若自身当前体力高于对手则附加对手最大体力1/{0}的百分比伤害`
### Effect 775
- `argsNum`: `2`
- `info`: `{0}回合内若受到的伤害大于{1},则恢复自身所有体力`
### Effect 777
- `argsNum`: `1`
- `info`: `消除对手能力上升状态,消除成功下{0}回合必定先出手`
### Effect 778
- `argsNum`: `0`
- `info`: `反转对手的能力提升状态,反转成功则恢复自身所有体力`
### Effect 779
- `argsNum`: `0`
- `info`: `若对手处于能力提升状态则先制+2`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 034: Effects 780-784
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 780
- `argsNum`: `3`
- `info`: `{0}回合内受到攻击则{1}%令对手随机{2}个技能PP值归零`
### Effect 781
- `argsNum`: `1`
- `info`: `消除对手回合类效果,消除成功则{0}回合内令对手使用的属性技能无效`
### Effect 782
- `argsNum`: `4`
- `info`: `{0}%令对手{1},每次使用概率增加{2}%,最高概率{3}%`
- `param`: `1,1,1`
### Effect 783
- `argsNum`: `2`
- `info`: `{0}回合内自身能力提升状态被消除或吸取时附加对手最大体力1/{1}的百分比伤害`
### Effect 784
- `argsNum`: `0`
- `info`: `若本回合击败对手则将对手的能力提升效果转移到自己身上`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 035: Effects 785-789
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 785
- `argsNum`: `0`
- `info`: `若自身攻击对手时克制关系为微弱则先制+2`
### Effect 786
- `argsNum`: `1`
- `info`: `令对手随机进入{0}种异常状态`
### Effect 787
- `argsNum`: `2`
- `info`: `{0}回合内使用技能后若对手处于能力提升状态则附加对手最大体力1/{1}的百分比伤害`
### Effect 788
- `argsNum`: `1`
- `info`: `消除对手能力提升,消除成功{0}回合内免疫异常状态`
### Effect 789
- `argsNum`: `1`
- `info`: `消除对手回合类效果,消除成功对手下{0}回合受到的伤害翻倍`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 036: Effects 790-794
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 790
- `argsNum`: `1`
- `info`: `{0}回合内自身所有攻击无视伤害限制效果`
### Effect 791
- `argsNum`: `2`
- `info`: `{0}回合内每回合使用技能恢复自身最大体力的1/{1},恢复体力时若自身当前体力低于对手则恢复效果翻倍`
### Effect 792
- `argsNum`: `0`
- `info`: `先出手时对手当回合攻击技能无效`
### Effect 793
- `argsNum`: `3`
- `info`: `若造成的伤害低于{0},则下{1}回合每回合造成{2}点固定伤害`
### Effect 794
- `argsNum`: `1`
- `info`: `消除对手能力提升,消除成功可以抵挡{0}回合内对手的攻击伤害`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 037: Effects 795-799
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 795
- `argsNum`: `2`
- `info`: `每次使用则当回合造成的攻击伤害额外提升{0}%,最高额外提升{1}%`
### Effect 796
- `argsNum`: `2`
- `info`: `{0}回合内每回合吸取对手当前体力的1/{1}`
### Effect 797
- `argsNum`: `1`
- `info`: `消除对手回合类效果,消除成功{0}回合内对手无法通过自身技能恢复体力`
### Effect 798
- `argsNum`: `2`
- `info`: `若对手处于能力提升状态,则对手{0}回合内造成的伤害不超过{1}`
### Effect 799
- `argsNum`: `2`
- `info`: `恢复自身最大体力的1/{0}并给对手造成等量百分比伤害自身体力低于1/{1}时效果翻倍`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 038: Effects 800-804
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 800
- `argsNum`: `3`
- `info`: `{0}回合内若对手使用属性技能,则下{1}回合自身受到的伤害不超过{2}`
### Effect 801
- `argsNum`: `2`
- `info`: `消除对手能力提升,消除成功则下{0}回合必定先出手、下{1}回合造成的伤害恢复自身体力`
### Effect 802
- `argsNum`: `1`
- `info`: `{0}回合内免疫控制类异常状态`
### Effect 803
- `argsNum`: `5`
- `info`: `命中后{0}%令对手{1}未触发则恢复自身最大体力的1/{2}体力且{3}回合内自身受到的伤害不超过{4}`
- `param`: `1,1,1`
### Effect 804
- `argsNum`: `2`
- `info`: `{0}回合内自身能力提升状态被消除或吸取时,令对手全属性-{1}`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 039: Effects 805-809
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 805
- `argsNum`: `1`
- `info`: `消除对手能力提升状态,消除成功则令对手随机{0}项技能PP值归零`
### Effect 806
- `argsNum`: `2`
- `info`: `{0}回合内若对手使用攻击技能则使用后令自身全属性+{1}`
### Effect 807
- `argsNum`: `0`
- `info`: `附加对手上次造成伤害数值的固定伤害`
### Effect 808
- `argsNum`: `1`
- `info`: `自身每处于一种能力提升状态则附加{0}点固定伤害`
### Effect 809
- `argsNum`: `0`
- `info`: `使对手下次使用的攻击技能失效`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 040: Effects 810-814
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 810
- `argsNum`: `1`
- `info`: `每次命中对手后此技能威力下降{0}点`
### Effect 811
- `argsNum`: `0`
- `info`: `使自身下次受到的伤害减少n点n等于本回合自身造成的伤害`
### Effect 812
- `argsNum`: `1`
- `info`: `自身速度能力每提升1段则回合结束时减少对手1/{0}最大体力`
### Effect 813
- `argsNum`: `0`
- `info`: `将自身的能力下降状态双倍反馈给对手`
### Effect 814
- `argsNum`: `1`
- `info`: `先出手时附加自身双防值总和{0}%的百分比伤害`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 041: Effects 815-819
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 815
- `argsNum`: `1`
- `info`: `后出手时附加自身当前体力{0}%的百分比伤害`
### Effect 816
- `argsNum`: `0`
- `info`: `免疫对手下次攻击技能造成的伤害并直接扣除对手等量体力`
### Effect 817
- `argsNum`: `1`
- `info`: `{0}回合内受到攻击则对手下回合受到的伤害翻倍`
### Effect 818
- `argsNum`: `0`
- `info`: `出手时本回合若受到伤害,则将伤害反馈给对手`
### Effect 819
- `argsNum`: `2`
- `info`: `出手时本回合若未受到攻击伤害,则附加自身{0}值{1}%的百分比伤害,并恢复等量体力`
- `param`: `2,0,0`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 042: Effects 820-824
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 820
- `argsNum`: `2`
- `info`: `未击败对手下{0}回合自身攻击先制+{1}`
### Effect 821
- `argsNum`: `1`
- `info`: `{0}回合内自身的回合类效果无法被消除,后出手时回合数+1`
### Effect 822
- `argsNum`: `0`
- `info`: `吸收对手的能力提升同时反转对手的能力提升`
### Effect 823
- `argsNum`: `1`
- `info`: `当回合未击败对手,则下{0}回合必定先出手`
### Effect 824
- `argsNum`: `2`
- `info`: `若对手不处于{0}状态则吸取对手1/{1}最大体力`
- `param`: `1,0,0`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 043: Effects 825-829
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 825
- `argsNum`: `1`
- `info`: `若对手处于能力提升状态则附加对手最大体力1/{0}的百分比伤害`
### Effect 826
- `argsNum`: `1`
- `info`: `当回合击败对手则对手下只出场精灵随机进入{0}种异常状态`
### Effect 827
- `argsNum`: `2`
- `info`: `消除对手能力提升状态,消除成功则令自身下{0}回合必定先出手且下{1}回合造成的攻击伤害翻倍`
### Effect 828
- `argsNum`: `0`
- `info`: `若自身处于能力提升状态则先制+1`
### Effect 829
- `argsNum`: `2`
- `info`: `{0}回合对手每回合受到相当于本次伤害的1/{1}的百分比伤害(可以叠加)`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 044: Effects 830-835
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 830
- `argsNum`: `0`
- `info`: `若后出手,则免疫本回合受到的伤害`
### Effect 831
- `argsNum`: `1`
- `info`: `附加自身最大体力{0}%的百分比伤害`
### Effect 833
- `argsNum`: `1`
- `info`: `当回合若未击败对手则吸取对手最大体力的1/{0}`
### Effect 834
- `argsNum`: `2`
- `info`: `{0}回合内自身能力提升状态被消除或吸取时,{1}回合内对手属性技能无效`
### Effect 835
- `argsNum`: `0`
- `info`: `反转自身能力下降状态,反转成功则恢复自身全部体力`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 045: Effects 836-840
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 836
- `argsNum`: `1`
- `info`: `自身体力高于对手时先制+{0}`
### Effect 837
- `argsNum`: `3`
- `info`: `吸取对手{0}点固定体力,每次使用额外附加{1}点,最高{2}点`
### Effect 838
- `argsNum`: `1`
- `info`: `若当回合未击败对手,则下回合附加{0}点固定伤害`
### Effect 839
- `argsNum`: `1`
- `info`: `附加自身最大体力{0}%的百分比伤害并恢复等量体力`
### Effect 840
- `argsNum`: `1`
- `info`: `击败对手则对方下只精灵出战时己方在场精灵吸取其最大体力的1/{0}`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 052: Effects 871-875
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 871
- `argsNum`: `2`
- `info`: `{0}回合,每回合攻击技能造成的伤害不少于{1}`
### Effect 872
- `argsNum`: `1`
- `info`: `吸取对手能力提升状态,吸取成功则{0}回合内令对手使用的属性技能无效`
### Effect 873
- `argsNum`: `0`
- `info`: `消耗自身全部体力,消除对手能力提升状态和回合类效果,使己方下只出场精灵下次攻击必定先手、必定命中且造成的伤害翻倍`
### Effect 874
- `argsNum`: `2`
- `info`: `{0}回合内若对手造成的伤害低于{1}则免疫该伤害`
### Effect 875
- `argsNum`: `0`
- `info`: `消耗自身全部体力对手所有技能PP值归零全属性-1`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 053: Effects 876-880
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 876
- `argsNum`: `1`
- `info`: `附加自身防御、特防和速度总和{0}%的百分比伤害`
### Effect 877
- `argsNum`: `1`
- `info`: `先出手时全属性+{0}`
### Effect 878
- `argsNum`: `2`
- `info`: `{0}回合先出手则对手{1}`
- `param`: `1,1,1`
### Effect 879
- `argsNum`: `0`
- `info`: `消除对手回合类效果,消除成功则恢复自身全部体力`
### Effect 880
- `argsNum`: `1`
- `info`: `消除对手回合类效果,消除成功则令自身下回合所有技能先制+{0}`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 054: Effects 881-885
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 881
- `argsNum`: `0`
- `info`: `若自身处于能力下降状态则先制+3`
### Effect 882
- `argsNum`: `1`
- `info`: `自身每处于一种能力提升状态,此技能威力提升{0}`
### Effect 883
- `argsNum`: `2`
- `info`: `每次命中对手会降低对手下只出战精灵最大体力的{0}%,最多降低{1}%`
### Effect 884
- `argsNum`: `0`
- `info`: `令对手下次使用的技能无效`
### Effect 885
- `argsNum`: `1`
- `info`: `全属性+{0},自身当前体力高于对手时强化效果翻倍`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 055: Effects 886-890
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 886
- `argsNum`: `1`
- `info`: `下次攻击忽略对手双防值的{0}%`
### Effect 887
- `argsNum`: `1`
- `info`: `吸收对手能力提升,吸收成功恢复自身所有体力并且下回合先制+{0}`
### Effect 888
- `argsNum`: `1`
- `info`: `自己出手时若自身体力低于对手则回合结束时减少对手1/{0}最大体力`
### Effect 889
- `argsNum`: `1`
- `info`: `消除对手回合类效果,消除成功则令对手{0}`
- `param`: `1,0,0`
### Effect 890
- `argsNum`: `0`
- `info`: `自身处于能力提升状态时造成的伤害翻倍`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 056: Effects 891-895
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 891
- `argsNum`: `1`
- `info`: `吸收对手能力提升状态,吸收成功则下{0}回合造成的伤害翻倍`
### Effect 892
- `argsNum`: `1`
- `info`: `每使用此技能击败一只精灵则减少对手下只出场精灵{0}%最大体力`
### Effect 893
- `argsNum`: `1`
- `info`: `全属性+{0},自身满体力时强化效果翻倍`
### Effect 894
- `argsNum`: `1`
- `info`: `吸取对手{0}点体力,体力低于对手时吸取效果翻倍`
### Effect 895
- `argsNum`: `2`
- `info`: `{0}回合内受到的所有类型伤害的1/{1}转化为自身体力`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 057: Effects 896-900
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 896
- `argsNum`: `0`
- `info`: `双倍反转自身的能力下降`
### Effect 897
- `argsNum`: `2`
- `info`: `未击败对手则令自身下{0}次受到的攻击伤害额外减少{1}%`
### Effect 898
- `argsNum`: `1`
- `info`: `若对手不是雄性精灵,则恢复{0}点体力`
### Effect 899
- `argsNum`: `0`
- `info`: `若自身先出手,则本回合对手释放的属性技能失效`
### Effect 900
- `argsNum`: `2`
- `info`: `恢复自身最大体力的1/{0}体力少于1/{1}时恢复效果翻倍`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 058: Effects 901-905
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 901
- `argsNum`: `6`
- `info`: `消除对手回合类效果,消除成功则{0}`
- `param`: `0,0,0`
### Effect 902
- `argsNum`: `1`
- `info`: `消耗自身全部体力,消除对手能力提升状态和回合类效果并使对手{0}回合内所有技能失效`
### Effect 903
- `argsNum`: `1`
- `info`: `自身体力高于对手时附加自身最大体力值{0}%的百分比伤害`
### Effect 904
- `argsNum`: `3`
- `info`: `消耗自身全部体力,消除对手回合类效果且令己方免疫下{0}次受到的异常状态,同时己方下只精灵出战时获得{1}点护盾且{2}回合内令对手使用的属性技能无效`
### Effect 905
- `argsNum`: `1`
- `info`: `消除对手能力提升,消除成功{0}回合内对手无法通过自身技能恢复体力`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 059: Effects 906-910
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 906
- `argsNum`: `3`
- `info`: `附加对手最大体力值{0}%的百分比伤害,每次使用增加{1}%,最高{2}%`
### Effect 907
- `argsNum`: `1`
- `info`: `反转自身能力下降状态,反转成功则使对手随机{0}个技能PP归零`
### Effect 908
- `argsNum`: `1`
- `info`: `吸收对手能力提升状态,吸收成功则对手下{0}回合所有技能失效`
### Effect 909
- `argsNum`: `3`
- `info`: `先出手时{0}%使对手{1},未触发则附加{2}点固定伤害`
- `param`: `1,1,1`
### Effect 910
- `argsNum`: `1`
- `info`: `当回合击败对手则令对手{0}回合内属性技能无效`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,37 +0,0 @@
# Task 061: Effects 916-920
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 916
- `argsNum`: `2`
- `info`: `命中后{0}%使对手{1},若未触发则恢复自身全部体力`
- `param`: `1,1,1`
### Effect 917
- `argsNum`: `3`
- `info`: `命中后{0}%使对手{1}未触发则附加自身最大体力值1/{2}的百分比伤害`
- `param`: `1,1,1`
### Effect 918
- `argsNum`: `3`
- `info`: `造成的伤害不足{0}则自身下{1}次造成的伤害提升{2}%`
### Effect 919
- `argsNum`: `0`
- `info`: `后出手时使对手下回合属性技能失效`
### Effect 920
- `argsNum`: `1`
- `info`: `未击败对手则下回合造成的伤害提升{0}%`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 062: Effects 921-925
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 921
- `argsNum`: `3`
- `info`: `{0}%概率造成的攻击伤害为{1}倍,未触发则{2}回合内令对手使用的属性技能无效`
### Effect 922
- `argsNum`: `1`
- `info`: `{0}回合内每回合结束后解除并反馈自身能力下降状态`
### Effect 923
- `argsNum`: `2`
- `info`: `{0}回合内每回合若先出手则吸取对手{1}点体力`
### Effect 924
- `argsNum`: `2`
- `info`: `{0}回合攻击技能吸取对手1/{1}最大体力值`
### Effect 925
- `argsNum`: `1`
- `info`: `若自身为满体力则技能威力提升{0}%`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 063: Effects 926-930
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 926
- `argsNum`: `2`
- `info`: `反转自身能力下降状态,反转成功则下{0}回合先制+{1}`
### Effect 927
- `argsNum`: `3`
- `info`: `{0}回合内每回合使用技能则出手流程结束后恢复自身最大体力的1/{1}恢复体力时若自身体力低于最大体力的1/{2}则附加给对手等量百分比伤害`
### Effect 928
- `argsNum`: `1`
- `info`: `消除对手回合类效果,消除成功则己方免疫下{0}次受到的异常状态`
### Effect 929
- `argsNum`: `1`
- `info`: `反弹{0}倍的伤害给对手并使自身恢复等量体力`
### Effect 930
- `argsNum`: `4`
- `info`: `获得{0}点护盾,护盾消失时对对手造成{1}点固定伤害且有{2}%的概率使对手{3}`
- `param`: `1,3,3`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,37 +0,0 @@
# Task 064: Effects 931-935
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 931
- `argsNum`: `1`
- `info`: `吸取对手能力提升状态,吸取成功则对手{0}技能PP值归零`
- `param`: `27,0,0`
### Effect 932
- `argsNum`: `1`
- `info`: `先出手时附加自身攻击{0}%的百分比伤害`
### Effect 933
- `argsNum`: `1`
- `info`: `未击败对手则己方下{0}次攻击技能必定打出致命一击`
### Effect 934
- `argsNum`: `2`
- `info`: `击败对手则对手下只出场精灵{0}回合内先制-{1}`
### Effect 935
- `argsNum`: `1`
- `info`: `若自身体力高于对手则使对手{0}`
- `param`: `1,0,0`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,37 +0,0 @@
# Task 065: Effects 936-940
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 936
- `argsNum`: `3`
- `info`: `{0}%令对手{1},未触发则令对手{2}回合内使用的属性技能无效`
- `param`: `1,1,1`
### Effect 937
- `argsNum`: `4`
- `info`: `命中后{0}%使对手{1},未触发则对手下{2}回合先制-{3}`
- `param`: `1,1,1`
### Effect 938
- `argsNum`: `1`
- `info`: `使对手全属性-{0},先出手时效果翻倍`
### Effect 939
- `argsNum`: `1`
- `info`: `若后出手则附加自身最大体力1/{0}的百分比伤害并恢复等量体力`
### Effect 940
- `argsNum`: `2`
- `info`: `全属性+{0},若对手处于封印属性技能状态则攻击额外+{1}`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 066: Effects 941-945
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 941
- `argsNum`: `1`
- `info`: `出手时有概率使对手{0},概率等同于出手时自身当前体力百分比`
- `param`: `1,0,0`
### Effect 942
- `argsNum`: `1`
- `info`: `消除对手回合类效果消除成功则吸取对手最大体力的1/{0}`
### Effect 943
- `argsNum`: `1`
- `info`: `附加自身防御、特防总和{0}%的百分比伤害`
### Effect 944
- `argsNum`: `2`
- `info`: `{0}回合内对手使用攻击技能时受到自身防御、特防总和{1}%的百分比伤害`
### Effect 945
- `argsNum`: `0`
- `info`: `消除对手回合类效果,消除成功则恢复自身全部体力`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 067: Effects 946-950
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 946
- `argsNum`: `1`
- `info`: `全属性+{0},若自身当前体力低于对手则强化效果翻倍`
### Effect 947
- `argsNum`: `2`
- `info`: `造成的伤害不足{0}则吸取对手最大体力的1/{1}`
### Effect 948
- `argsNum`: `1`
- `info`: `吸取对手能力提升状态,吸取成功则对手{0} `
- `param`: `1,0,0`
### Effect 949
- `argsNum`: `1`
- `info`: `造成伤害不足{0}则恢复自身全部体力`
### Effect 950
- `argsNum`: `1`
- `info`: `消除对手回合类效果,消除成功则对手{0}回合内攻击技能MISS`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 068: Effects 951-955
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 951
- `argsNum`: `1`
- `info`: `反转对手能力提升状态,反转成功则己方免疫下{0}次受到的异常状态`
### Effect 952
- `argsNum`: `1`
- `info`: `全属性+{0},若对手处于能力下降状态则效果翻倍`
### Effect 953
- `argsNum`: `4`
- `info`: `{0}回合恢复最大体力的1/{1},体力低于{2}%时先制+{3}`
### Effect 954
- `argsNum`: `0`
- `info`: `若当前体力低于对手则先制+1`
### Effect 955
- `argsNum`: `1`
- `info`: `反转自身能力下降状态,反转成功则吸取对手{0}点体力`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 070: Effects 961-965
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 961
- `argsNum`: `1`
- `info`: `反转自身能力下降,反转成功则自身下{0}回合免疫攻击伤害`
### Effect 962
- `argsNum`: `1`
- `info`: `全属性+{0},自身不处于能力提升状态时强化效果翻倍`
### Effect 963
- `argsNum`: `1`
- `info`: `若自身处于能力提升状态则吸取对手最大体力的1/{0}`
### Effect 964
- `argsNum`: `0`
- `info`: `未击败对手则自身能力提升状态翻倍`
### Effect 965
- `argsNum`: `2`
- `info`: `{0}回合内自身攻击技能命中则对手全属性-{1}`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,37 +0,0 @@
# Task 071: Effects 966-970
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 966
- `argsNum`: `3`
- `info`: `{0}%的概率使对手{1},未触发则自身全属性+{2}`
- `param`: `1,1,1`
### Effect 967
- `argsNum`: `1`
- `info`: `攻击结束时附加对手双防之和{0}%的百分比伤害`
### Effect 968
- `argsNum`: `2`
- `info`: `命中对手后有{0}%使对手{1},先出手时概率翻倍`
- `param`: `1,1,1`
### Effect 969
- `argsNum`: `1`
- `info`: `后出手时下回合受到的伤害降低{0}点`
### Effect 970
- `argsNum`: `1`
- `info`: `双倍反转对手能力提升状态,反转成功则下回合自身所有技能先制+{0},反转失败则消除对手能力提升状态`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,37 +0,0 @@
# Task 072: Effects 971-975
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 971
- `argsNum`: `3`
- `info`: `{0}回合内每回合使用技能吸取对手最大体力的1/{1}吸取体力时若自身体力低于最大体力的1/{2}则吸取效果翻倍`
### Effect 972
- `argsNum`: `1`
- `info`: `出手时若自身体力低于对手,则免疫下{0}次受到的攻击伤害`
### Effect 973
- `argsNum`: `2`
- `info`: `消除对手回合类效果,消除成功则{0}%令对手{1}`
- `param`: `1,1,1`
### Effect 974
- `argsNum`: `3`
- `info`: `{0}%使对手{1}若未触发则使对手受到相当于自身当前体力1/{2}的百分比伤害`
- `param`: `1,1,1`
### Effect 975
- `argsNum`: `3`
- `info`: `{0}%的概率威力{1}倍,若未触发则下回合自身先制+{2}`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 073: Effects 976-980
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 976
- `argsNum`: `1`
- `info`: `消除对手回合类效果,若消除成功则使对手下{0}次使用的属性技能失效`
### Effect 977
- `argsNum`: `2`
- `info`: `吸取对手最大体力的1/{0}自身体力低于1/{1}时吸取效果翻倍`
### Effect 978
- `argsNum`: `0`
- `info`: `吸取并反转对手能力提升状态`
### Effect 979
- `argsNum`: `2`
- `info`: `消除对手回合类效果,消除成功则自身下{0}回合所有技能先制+{1}`
### Effect 980
- `argsNum`: `0`
- `info`: `先出手时对手当回合属性技能无效`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 079: Effects 1006-1010
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1006
- `argsNum`: `2`
- `info`: `造成的伤害超过{0}则下{1}回合免疫异常状态`
### Effect 1007
- `argsNum`: `4`
- `info`: `{0}回合内每次攻击都有{1}%概率令对手{2},未触发则对手全属性-{3}`
- `param`: `1,2,2`
### Effect 1008
- `argsNum`: `2`
- `info`: `造成的伤害高于{0}则获得{1}点护盾`
### Effect 1009
- `argsNum`: `1`
- `info`: `消除对手能力提升状态,消除成功则对手全属性-{0}`
### Effect 1010
- `argsNum`: `2`
- `info`: `消除对手能力提升状态,消除成功则下{0}回合造成的伤害提高{1}%`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,37 +0,0 @@
# Task 084: Effects 1031-1035
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1031
- `argsNum`: `1`
- `info`: `出手时本回合若未受到伤害则对手下{0}回合属性技能无效`
### Effect 1032
- `argsNum`: `1`
- `info`: `消除对手回合类效果,消除成功则下{0}回合令对手使用的攻击技能无效`
### Effect 1033
- `argsNum`: `3`
- `info`: `{0}%使对手{1},未触发则自身下{2}回合攻击必定致命一击`
- `param`: `1,1,1`
### Effect 1034
- `argsNum`: `1`
- `info`: `消除对手回合类效果,消除成功则免疫下{0}回合受到的攻击伤害`
### Effect 1035
- `argsNum`: `5`
- `info`: `命中后{0}%使对手{1},未触发则下{2}回合攻击有{3}%概率使对手{4}`
- `param`: `1,1,1|1,4,4`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 085: Effects 1036-1040
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1036
- `argsNum`: `2`
- `info`: `消除对手回合类效果,消除成功则下{0}次攻击附加{1}点固定伤害`
### Effect 1037
- `argsNum`: `2`
- `info`: `消除对手能力提升状态,消除成功则自身下{0}次攻击技能造成的伤害额外提升{1}%`
### Effect 1038
- `argsNum`: `1`
- `info`: `双倍反转自身能力下降状态,反转成功则获得{0}点护盾`
### Effect 1039
- `argsNum`: `3`
- `info`: `{0}回合内每回合使用技能恢复自身最大体力的1/{1}恢复体力时若自身体力低于最大体力的1/{2}则直接回满`
### Effect 1040
- `argsNum`: `3`
- `info`: `当回合若未击败对手则{0}%令对手{1},未触发则令自身全属性+{2}`
- `param`: `1,1,1`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 086: Effects 1041-1046
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1041
- `argsNum`: `2`
- `info`: `造成的攻击伤害若低于{0}则令对手下{1}次使用的攻击技能无效`
### Effect 1042
- `argsNum`: `1`
- `info`: `{0}回合内每回合自身技能消除对手能力提升状态`
### Effect 1043
- `argsNum`: `1`
- `info`: `反转自身能力下降状态,反转成功则{0}回合受到的伤害转化为自身体力`
### Effect 1045
- `argsNum`: `1`
- `info`: `未击败对手则附加自身最大体力1/{0}的百分比伤害`
### Effect 1046
- `argsNum`: `1`
- `info`: `若对手不处于异常状态则附加对手最大体力1/{0}的百分比伤害`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,37 +0,0 @@
# Task 088: Effects 1052-1056
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1052
- `argsNum`: `1`
- `info`: `消除对手能力提升状态,消除成功则令自身全属性+{0}`
### Effect 1053
- `argsNum`: `3`
- `info`: `{0}回合内对手使用攻击技能后使对手{1}未触发则自身恢复最大体力的1/{2}`
- `param`: `1,1,1`
### Effect 1054
- `argsNum`: `1`
- `info`: `反转自身能力下降状态,反转成功则对手{0}`
- `param`: `1,0,0`
### Effect 1055
- `argsNum`: `1`
- `info`: `消除对手能力提升状态,消除成功则下{0}回合令对手使用的攻击技能无效`
### Effect 1056
- `argsNum`: `1`
- `info`: `反转自身能力下降状态,反转成功则{0}回合内令对手使用的属性技能无效`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 089: Effects 1057-1061
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1057
- `argsNum`: `1`
- `info`: `{0}回合内若自身能力提升状态消失,则消除对手回合类效果`
### Effect 1058
- `argsNum`: `3`
- `info`: `命中则{0}%概率使对手{1},未触发则对手{2}回合内攻击技能无效`
- `param`: `1,1,1`
### Effect 1059
- `argsNum`: `5`
- `info`: `牺牲自身全部体力,{0}%令对方进入{1}种控制类异常状态,令自身下只出场精灵{2}回合内攻击伤害提升{3}%且先制+{4}`
### Effect 1060
- `argsNum`: `1`
- `info`: `吸取对手能力提升状态,吸取成功则下{0}回合对手攻击技能无效`
### Effect 1061
- `argsNum`: `0`
- `info`: `反转对手能力提升状态,反转成功则自身附加相同的能力提升,反转失败则消除对手能力提升状态`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 090: Effects 1062-1066
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1062
- `argsNum`: `1`
- `info`: `吸取对手能力提升状态吸取成功则吸取对手最大体力的1/{0}`
### Effect 1063
- `argsNum`: `1`
- `info`: `对王·战联造成的伤害提高{0}%`
### Effect 1064
- `argsNum`: `1`
- `info`: `对大暗黑天长老造成的伤害提高{0}%`
### Effect 1065
- `argsNum`: `3`
- `info`: `{0}回合内每回合使用技能恢复自身最大体力的1/{1}并造成等量百分比伤害恢复体力时若自身体力低于最大体力的1/{2}则恢复效果和百分比伤害翻倍`
### Effect 1066
- `argsNum`: `3`
- `info`: `造成的伤害低于{0}则附加{1}点固定伤害,若先出手则固定伤害提高{2}点`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 091: Effects 1067-1071
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1067
- `argsNum`: `4`
- `info`: `{0}回合内每回合使用技能恢复自身最大体力的1/{1}恢复体力时若自身体力低于最大体力的1/{2}则恢复效果转变为吸取对手最大体力的1/{3}`
### Effect 1068
- `argsNum`: `2`
- `info`: `{0}回合受到致命伤害时残留{1}点体力`
### Effect 1069
- `argsNum`: `1`
- `info`: `反转自身能力下降状态,反转成功则{0}回合内躲避所有攻击`
### Effect 1070
- `argsNum`: `0`
- `info`: `对手处于能力下降状态时自身先制+1`
### Effect 1071
- `argsNum`: `3`
- `info`: `{0}回合内若对手恢复体力(药剂恢复除外),则{1}回合内自身攻击附加{2}点固定伤害`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 092: Effects 1072-1076
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1072
- `argsNum`: `3`
- `info`: `附加自身当前体力{0}%的百分比伤害,连续使用每次增加{1}%,最高{2}%`
### Effect 1073
- `argsNum`: `2`
- `info`: `{0}回合内受到的伤害大于{1}则主动恢复自身全部体力并造成等同于恢复量的固定伤害`
### Effect 1074
- `argsNum`: `6`
- `info`: `造成的伤害大于{0}则对手{1}%{2},未触发则自身下{3}回合攻击有{4}%的概率使对手{5}`
- `param`: `1,2,2|1,5,5`
### Effect 1075
- `argsNum`: `2`
- `info`: `恢复自身最大体力的1/{0}自身体力低于1/{1}时回满`
### Effect 1076
- `argsNum`: `0`
- `info`: `对手不处于能力提升状态时先制+2`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,37 +0,0 @@
# Task 093: Effects 1077-1081
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1077
- `argsNum`: `3`
- `info`: `{0}回合内对手使用攻击技能后使对手{1},未触发则对手下{2}回合属性技能命中效果失效`
- `param`: `1,1,1`
### Effect 1078
- `argsNum`: `3`
- `info`: `使对手随机进入{0}种异常状态,未触发则下{1}回合自身属性技能先制+{2}`
### Effect 1079
- `argsNum`: `4`
- `info`: `命中后{0}%令对手{1},未触发则下{2}回合自身攻击技能先制+{3}`
- `param`: `1,1,1`
### Effect 1080
- `argsNum`: `0`
- `info`: `连续使用时先制+1`
### Effect 1081
- `argsNum`: `0`
- `info`: `若对手处于能力提升状态则先制+1`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 094: Effects 1082-1086
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1082
- `argsNum`: `2`
- `info`: `造成的伤害低于{0}则附加自身最大体力{1}%的百分比伤害`
### Effect 1083
- `argsNum`: `0`
- `info`: `若后出手则消除对手回合类效果`
### Effect 1084
- `argsNum`: `1`
- `info`: `附加{0}点固定伤害,对手处于异常状态时固定伤害翻倍`
### Effect 1085
- `argsNum`: `3`
- `info`: `{0}回合内受到的伤害低于{1}则附加{2}点固定伤害`
### Effect 1086
- `argsNum`: `1`
- `info`: `自身体力低于对手时造成的伤害提高{0}%`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 095: Effects 1087-1091
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1087
- `argsNum`: `1`
- `info`: `反转自身能力下降状态,反转成功则对手下{0}回合技能无效`
### Effect 1088
- `argsNum`: `2`
- `info`: `造成的攻击伤害高于{0}则吸取对手最大体力的1/{1}`
### Effect 1089
- `argsNum`: `2`
- `info`: `{0}回合内对手使用攻击技能后随机附加给对手{1}种异常状态`
### Effect 1090
- `argsNum`: `1`
- `info`: `击败对手则{0}回合内令对手攻击技能无法造成伤害且命中效果失效`
### Effect 1091
- `argsNum`: `1`
- `info`: `未击败对手则自身下{0}回合免疫并反弹异常状态`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 096: Effects 1092-1096
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1092
- `argsNum`: `2`
- `info`: `后出手时使对手{0}未触发则附加自身当前体力1/{1}的百分比伤害`
- `param`: `1,0,0`
### Effect 1093
- `argsNum`: `1`
- `info`: `出手时若自身体力低于对手则恢复自身最大体力的1/{0}`
### Effect 1094
- `argsNum`: `0`
- `info`: `消除对手回合类效果消除成功则令对手随机2项技能PP值归零消除对手能力提升状态消除成功则令自身下2回合使用技能触发星皇之怒的概率提升20%;技能结束后对手体力值高于0则50%进行一次额外行动以触发星皇之怒星皇之怒若对手不处于能力提升状态则附加对手最大体力1/3的百分比伤害`
### Effect 1095
- `argsNum`: `0`
- `info`: `3回合内若对手使用属性技能则命中前令对手所有技能随机降低1-3点PP值3回合内若对手使用攻击技能则使用后受到对手最大体力1/3的百分比伤害己方免疫下2次受到的异常状态;技能结束后对手体力值高于0则50%进行一次额外行动以触发星皇之怒星皇之怒令自身2回合内回合类效果无法被消除后出手则延续至下2回合下2回合自身所有技能先制+2`
### Effect 1096
- `argsNum`: `0`
- `info`: `全属性+1自身当前体力低于最大体力的1/2时强化效果翻倍4回合内每回合使用技能吸取对手最大体力的1/3吸取体力时若自身体力低于最大体力的1/2则吸取效果翻倍自身下2次使用技能触发星皇之怒的概率翻倍;技能结束后对手体力值高于0则50%进行一次额外行动以触发星皇之怒星皇之怒下2回合自身造成的攻击伤害翻倍下2次自身受到的攻击伤害额外减少50%`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 100: Effects 1112-1116
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1112
- `argsNum`: `1`
- `info`: `先出手时随机附加{0}种控制类异常状态`
### Effect 1113
- `argsNum`: `0`
- `info`: `技能命中后消除自身能力提升状态`
### Effect 1114
- `argsNum`: `1`
- `info`: `消除对手回合类效果,消除成功则令对手随机{0}项技能PP值归零`
### Effect 1115
- `argsNum`: `1`
- `info`: `解除自身能力下降状态,解除成功则令对手下{0}次使用的攻击技能无效`
### Effect 1116
- `argsNum`: `1`
- `info`: `随机附加{0}种异常状态,未触发则消除对手回合类效果`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 101: Effects 1117-1121
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1117
- `argsNum`: `0`
- `info`: `若自身体力低于最大体力的1/2则先制+2`
### Effect 1118
- `argsNum`: `4`
- `info`: `{0}回合内对手若使用攻击技能则{1}%{2},若使用属性技能则全属性-{3}`
- `param`: `1,2,2`
### Effect 1119
- `argsNum`: `2`
- `info`: `消除双方能力提升状态,消除任意一方成功则使自身下{0}回合先制+{1}`
### Effect 1120
- `argsNum`: `2`
- `info`: `造成的伤害低于{0}则为自身附加{1}点护盾`
### Effect 1121
- `argsNum`: `2`
- `info`: `{0}次受到的固定伤害和百分比伤害减少{1}%`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 102: Effects 1122-1126
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1122
- `argsNum`: `2`
- `info`: `使对手全属性-{0},未触发则对手{1}`
- `param`: `1,1,1`
### Effect 1123
- `argsNum`: `2`
- `info`: `吸取对手能力提升状态,吸取成功则下{0}回合自身所有技能先制+{1}`
### Effect 1124
- `argsNum`: `2`
- `info`: `消除对手回合类效果,消除成功则自身下{0}回合造成的攻击伤害额外提升{1}%`
### Effect 1125
- `argsNum`: `2`
- `info`: `{0}回合内对手所有攻击必定Miss若对手命中则下{1}回合对手使用属性技能无效`
### Effect 1126
- `argsNum`: `2`
- `info`: `使对手随机{0}项技能PP值归零若当回合受到攻击则额外使对手随机{1}项技能PP值归零`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 103: Effects 1127-1131
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1127
- `argsNum`: `1`
- `info`: `吸取对手能力提升状态,若对手不处于能力提升状态则使对手全属性-{0}`
### Effect 1128
- `argsNum`: `1`
- `info`: `击败对手则令对手下{0}次使用的攻击技能无效`
### Effect 1129
- `argsNum`: `2`
- `info`: `{0}%概率伤害为{1}倍,自身处于能力提升状态时概率翻倍`
### Effect 1130
- `argsNum`: `1`
- `info`: `使对手全属性-{0},自身体力低于对手时弱化效果翻倍`
### Effect 1131
- `argsNum`: `4`
- `info`: `随机附加{0}-{1}点固定伤害,自身处于能力提升状态时变为{2}-{3}点固定伤害`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 104: Effects 1132-1136
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1132
- `argsNum`: `4`
- `info`: `随机恢复自身{0}-{1}点体力,自身不处于能力提升状态时变为{2}-{3}点体力`
### Effect 1133
- `argsNum`: `2`
- `info`: `对手每有{0}项能力等级与自身相同则附加{1}点固定伤害`
### Effect 1134
- `argsNum`: `1`
- `info`: `将自身能力下降状态反馈给对手,反馈失败则令自身全属性+{0}`
### Effect 1135
- `argsNum`: `1`
- `info`: `若自身当前体力低于最大体力的1/{0}则恢复自身全部体力并造成等量固定伤害`
### Effect 1136
- `argsNum`: `2`
- `info`: `自身体力高于1/{0}时附加自身当前体力1/{1}的百分比伤害`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,39 +0,0 @@
# Task 105: Effects 1137-1141
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1137
- `argsNum`: `2`
- `info`: `自身体力低于1/{0}时吸取对手最大体力的1/{1}`
### Effect 1138
- `argsNum`: `4`
- `info`: `消除对手回合类效果,消除成功则{0}%令对手{1},未触发则{2}%令对手{3}`
- `param`: `1,1,1|1,3,3`
### Effect 1139
- `argsNum`: `3`
- `info`: `消除敌我双方回合类效果并同时进入{0}回合{1},自身{2}状态解除后则恢复自身所有体力`
- `param`: `1,1,1|1,2,2`
### Effect 1140
- `argsNum`: `2`
- `info`: `{0}回合内对手使用攻击技能则{1}`
- `param`: `1,1,1`
### Effect 1141
- `argsNum`: `7`
- `info`: `1回合做{0}~{1}次攻击,每次攻击{2}%令对手{3},攻击低于{4}次则每次攻击{5}%令对手{6}`
- `param`: `1,3,3|1,6,6`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 106: Effects 1142-1147
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1142
- `argsNum`: `2`
- `info`: `回合结束时将自身当前体力降低为{0},并附加本次降低体力值{1}%的百分比伤害`
### Effect 1143
- `argsNum`: `3`
- `info`: `对手处于异常状态时附加{0}点固定伤害,不处于异常状态则下{1}回合使对手随机进入烧伤、冻伤、冰封、焚烬中的{2}种异常状态`
### Effect 1144
- `argsNum`: `2`
- `info`: `附加{0}~{1}点固定伤害并恢复等量体力`
### Effect 1145
- `argsNum`: `1`
- `info`: `令双方全属性+{0}`
### Effect 1147
- `argsNum`: `0`
- `info`: `未击败对手则消除对手能力提升状态`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 107: Effects 1148-1152
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1148
- `argsNum`: `2`
- `info`: `随机吸取对手{0}-{1}点体力`
### Effect 1149
- `argsNum`: `1`
- `info`: `若先出手则将本回合受到的攻击伤害{0}%反馈给对手双方同时死亡时对手残留1点体力`
### Effect 1150
- `argsNum`: `6`
- `info`: `消除对手能力上升状态,消除成功对手{0}`
- `param`: `0,0,0`
### Effect 1151
- `argsNum`: `2`
- `info`: `{0}回合内若对手使用攻击技能则自身全属性+{1}`
### Effect 1152
- `argsNum`: `1`
- `info`: `自身不处于能力提升状态则造成的伤害提升{0}%`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 108: Effects 1153-1157
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1153
- `argsNum`: `2`
- `info`: `解除自身能力下降状态,解除成功则自身下{0}回合受到的伤害减少{1}点`
### Effect 1154
- `argsNum`: `2`
- `info`: `{0}回合内使用技能附加{1}点固定伤害,若自身体力低于对手则效果翻倍`
### Effect 1155
- `argsNum`: `3`
- `info`: `附加自身最大体力值{0}%的百分比伤害,连续使用每次增加{1}%,最高{2}%`
### Effect 1156
- `argsNum`: `0`
- `info`: `击败对手则恢复自身全部体力和所有技能PP值`
### Effect 1157
- `argsNum`: `1`
- `info`: `消除双方能力提升、下降状态,消除任意一方成功则使对手下{0}次施放的技能无效(包括必中技能)`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 109: Effects 1158-1162
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1158
- `argsNum`: `2`
- `info`: `自身每处于{0}种能力提升状态则附加{1}点固定伤害,遇到天敌时效果翻倍`
### Effect 1159
- `argsNum`: `1`
- `info`: `吸取对手能力提升状态,吸取成功则自身免疫下{0}次受到的异常状态`
### Effect 1160
- `argsNum`: `3`
- `info`: `获得{0}点护盾,护盾消失时吸取对手{1}点体力且令对手随机{2}个技能的PP值归零`
### Effect 1161
- `argsNum`: `2`
- `info`: `{0}回合内若对手恢复体力则自身恢复等量体力的{1}%`
### Effect 1162
- `argsNum`: `6`
- `info`: `{0}回合内每回合都有{1}%概率令对手{2},未触发{3}则下{4}次受到的伤害减少{5}点`
- `param`: `1,2,2|1,3,3`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 110: Effects 1163-1167
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1163
- `argsNum`: `3`
- `info`: `附加自身特攻值与速度值总和{0}%的百分比伤害,每次使用增加{1}%,最高{2}%`
### Effect 1164
- `argsNum`: `0`
- `info`: `反转对手能力提升状态,若该效果未满足条件或反转失败则消除对手能力提升状态和回合类效果`
### Effect 1165
- `argsNum`: `2`
- `info`: `{0}回合内若对手使用攻击技能,则使用攻击技能后的下{1}回合属性技能命中效果失效`
### Effect 1166
- `argsNum`: `2`
- `info`: `解除自身能力下降效果,解除成功则下{0}回合先制+{1}`
### Effect 1167
- `argsNum`: `0`
- `info`: `解除自身能力下降状态,解除成功则恢复自身所有体力`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 111: Effects 1168-1172
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1168
- `argsNum`: `1`
- `info`: `全属性+{0},双方任意一方处于异常状态则强化效果翻倍`
### Effect 1169
- `argsNum`: `1`
- `info`: `若自身处于异常状态则造成的攻击伤害额外提升{0}%且回合结束后解除自身所有异常状态`
### Effect 1170
- `argsNum`: `1`
- `info`: `消除对手能力提升状态,消除成功则附加{0}点固定伤害`
### Effect 1171
- `argsNum`: `2`
- `info`: `未击败对手则使自身下{0}回合受到的伤害减少{1}点`
### Effect 1172
- `argsNum`: `10`
- `info`: `{0}回合做{1}~{2}次攻击,每次攻击都有{3}%的概率令自身{4}`
- `param`: `0,4,4`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 112: Effects 1173-1177
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1173
- `argsNum`: `1`
- `info`: `未击败对手则回合结束后附加对手最大体力1/{0}的百分比伤害自身体力为0时也可触发`
### Effect 1174
- `argsNum`: `0`
- `info`: `若自身处于能力提升状态则先制+2`
### Effect 1175
- `argsNum`: `2`
- `info`: `获得{0}点护盾护盾消失时恢复自身最大体力的1/{1}`
### Effect 1176
- `argsNum`: `3`
- `info`: `{0}%概率伤害为{1}倍,未触发则附加{2}点固定伤害`
### Effect 1177
- `argsNum`: `0`
- `info`: `自身处于能力提升状态则使自身能力提升状态翻倍`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 113: Effects 1178-1182
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1178
- `argsNum`: `0`
- `info`: `自身不处于能力提升状态则造成的伤害翻倍`
### Effect 1179
- `argsNum`: `2`
- `info`: `消除对手回合类效果,消除成功则自身下{0}次攻击技能造成的伤害额外提升{1}%`
### Effect 1180
- `argsNum`: `1`
- `info`: `吸取对手能力提升状态,吸取成功则自身下{0}回合必定致命一击`
### Effect 1181
- `argsNum`: `4`
- `info`: `{0}回合内每回合使用技能{1}%令对手{2},未触发则令对手全属性-{3}`
- `param`: `1,2,2`
### Effect 1182
- `argsNum`: `2`
- `info`: `牺牲自己进行自爆,将对手体力降为{0}点,令我方下一只出场精灵获得{1}次奇迹之力效果`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 114: Effects 1183-1187
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1183
- `argsNum`: `2`
- `info`: `解除自身能力下降状态,解除成功则自身{0}回合内造成的伤害提高{1}%`
### Effect 1184
- `argsNum`: `1`
- `info`: `激发自身潜能,使用后下{0}回合自身获得奇迹之力效果`
### Effect 1185
- `argsNum`: `1`
- `info`: `消耗自身当前最大体力的1/{0}并使对手受到等量百分比伤害`
### Effect 1186
- `argsNum`: `2`
- `info`: `{0}回合内每回合攻击附加自身双防值总和{1}%的百分比伤害`
### Effect 1187
- `argsNum`: `2`
- `info`: `{0}%令对手{1},未触发则消除对手回合类效果`
- `param`: `1,1,1`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,37 +0,0 @@
# Task 115: Effects 1188-1192
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1188
- `argsNum`: `3`
- `info`: `{0}回合内自身受到攻击则使对手{1}未触发则吸取对手最大体力的1/{2}`
- `param`: `1,1,1`
### Effect 1189
- `argsNum`: `1`
- `info`: `后出手时吸取对手{0}点体力`
### Effect 1190
- `argsNum`: `6`
- `info`: `消除对手回合类效果,消除成功对手{0}`
- `param`: `0,0,0`
### Effect 1191
- `argsNum`: `1`
- `info`: `100%令自身全属性-{0}`
### Effect 1192
- `argsNum`: `0`
- `info`: `将自身能力下降状态反馈给对手,反馈失败则解除自身能力下降状态`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 116: Effects 1193-1197
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1193
- `argsNum`: `2`
- `info`: `当自身血量少于1/2时先制+2`
### Effect 1194
- `argsNum`: `1`
- `info`: `反转自身能力下降状态,反转成功则自身{0}回合内免疫能力下降状态`
### Effect 1195
- `argsNum`: `4`
- `info`: `{0}回合内自身受到攻击{1}%使对手{2},若未触发则对手受到{3}点固定伤害`
- `param`: `1,2,2`
### Effect 1196
- `argsNum`: `3`
- `info`: `{0}回合内每回合{1}%令对手使用的攻击技能无效,未触发则令对手下{2}次使用的属性技能无效`
### Effect 1197
- `argsNum`: `3`
- `info`: `获得{0}点护盾,护盾消失时附加{1}点固定伤害同时使自身下{2}次攻击造成的伤害翻倍`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,37 +0,0 @@
# Task 117: Effects 1198-1202
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1198
- `argsNum`: `1`
- `info`: `对手不处于能力下降状态则造成的伤害提高{0}%`
### Effect 1199
- `argsNum`: `1`
- `info`: `吸取对手能力提升状态,吸取成功则对手{0}回合内无法通过自身技能恢复体力`
### Effect 1200
- `argsNum`: `3`
- `info`: `{0}回合内受到攻击则{1}%对手{2},未触发则消除对手回合类效果`
- `param`: `1,2,2`
### Effect 1201
- `argsNum`: `4`
- `info`: `先出手时{0}%使对手{1},未触发则下{2}回合自身先制+{3}`
- `param`: `1,1,1`
### Effect 1202
- `argsNum`: `3`
- `info`: `造成的伤害低于{0}则自身下{1}次受到的伤害降低{2}点`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 118: Effects 1203-1207
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1203
- `argsNum`: `3`
- `info`: `造成的伤害低于{0}则自身下{1}次技能先制+{2}`
### Effect 1204
- `argsNum`: `1`
- `info`: `自身下{0}次攻击必定致命一击`
### Effect 1205
- `argsNum`: `1`
- `info`: `后出手时自身全属性+{0}`
### Effect 1206
- `argsNum`: `3`
- `info`: `附加自身最大体力{0}%的百分比伤害,每次使用增加{1}%,最高{2}%`
### Effect 1207
- `argsNum`: `2`
- `info`: `双倍吸取对手能力提升状态,吸取成功则使对手下{0}回合先制-{1}`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,36 +0,0 @@
# Task 119: Effects 1208-1212
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1208
- `argsNum`: `1`
- `info`: `反转自身能力下降状态,反转成功则令对手下{0}次使用的攻击技能无效`
### Effect 1209
- `argsNum`: `1`
- `info`: `消除双方能力上升、下降状态,消除成功则附加消除总段数乘以{0}的固定伤害`
### Effect 1210
- `argsNum`: `2`
- `info`: `{0}%使对手{1},自身体力低于对手时概率翻倍`
- `param`: `1,1,1`
### Effect 1211
- `argsNum`: `1`
- `info`: `消除双方能力提升状态及能力下降状态,消除任意一方成功则为自身附加{0}点护盾`
### Effect 1212
- `argsNum`: `3`
- `info`: `消耗自身全部体力,使己方下只出战精灵令对手下{0}次使用的攻击技能无效且{1}回合内造成的攻击伤害额外提升{2}%`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,35 +0,0 @@
# Task 140: Effects 1313-1317
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1313
- `argsNum`: `1`
- `info`: `命中后使对手受到{0}点固定伤害,未命中则自身死亡,同时使对手下次施放的技能无效(包括必中技能)`
### Effect 1314
- `argsNum`: `1`
- `info`: `令自身下{0}次受到的攻击伤害转化为体力`
### Effect 1315
- `argsNum`: `1`
- `info`: `{0}%的概率打出致命一击`
### Effect 1316
- `argsNum`: `2`
- `info`: `先出手时令自身随机{0}项属性+{1}`
### Effect 1317
- `argsNum`: `1`
- `info`: `后出手时恢复自身最大体力的1/{0}`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

View File

@@ -1,38 +0,0 @@
# Task 141: Effects 1318-1322
## 目标
- 补齐以下 5 或最后一组不足 5 当前判定未实现的 skill effect
- 实现位置优先放在 `logic/service/fight/effect/`
- effect 需要展示说明同步更新 `logic/service/fight/effect/effect_info_map.go`
- 完成后至少执行`cd /workspace/logic && go test ./service/fight/effect`
## Effect 列表
### Effect 1318
- `argsNum`: `2`
- `info`: `{0}%的概率秒杀对手,未触发则令对手全属性-{1}`
### Effect 1319
- `argsNum`: `6`
- `info`: `自身下次被击败后下一只出场的精灵{0}`
- `param`: `0,0,0`
### Effect 1320
- `argsNum`: `2`
- `info`: `{0}回合内若对手攻击MISS则回合结束时吸取对手最大体力的1/{1}`
### Effect 1321
- `argsNum`: `2`
- `info`: `解除自身能力下降状态并消除对手提升状态,消除任意一项成功则{0}%对手{1}`
- `param`: `1,1,1`
### Effect 1322
- `argsNum`: `4`
- `info`: `{0}回合内受到攻击则{1}%使对手进入{2},未触发则使对手全属性-{3}`
- `param`: `1,2,2`
## 备注
- 该清单按当前仓库静态注册结果生成如果某个 effect 实际通过其他模块或运行时路径实现需要先复核后再落代码
- `201``445` 这类占位 effect优先补核心逻辑或补充明确的不可实现说明

Some files were not shown because too many files have changed in this diff Show More