Commit 62b7ccca authored by Nemo Ma's avatar Nemo Ma

maint

parent 62247b43
# 种火系列技能实装
## 实装内容
实装了三个减伤技能:
1. 种火I(fireseed1)——使角色因为战斗受到的全部最终伤害都降低为75%
2. 种火II(fireseed2)——使角色因为战斗受到的全部最终伤害都降低为50%
3. 种火III(fireseed3)——使角色因为战斗受到的全部最终伤害都变为1
## 实装位置
1. 在 `gamedata/cache/clubskills_1.php` 文件中添加了三个技能的定义
2. 在 `include/game/revattr.func.php` 文件中的 `get_final_dmg_p` 函数中添加了种火I和种火II的伤害减免逻辑
3. 在 `include/game/revattr.func.php` 文件中的 `get_final_dmg_fix` 函数中添加了种火III的伤害固定为1的逻辑
## 实装逻辑
1. 种火I和种火II通过在 `get_final_dmg_p` 函数中添加伤害系数修正来实现伤害减免
2. 种火III通过在 `get_final_dmg_p` 函数中设置标记,然后在 `get_final_dmg_fix` 函数中检测标记并将伤害固定为1来实现
## 技能效果
这三个技能都是被动技能,玩家学习后会自动生效,不需要主动触发。技能效果会在战斗中显示在战斗日志中,告知玩家伤害减免情况。
## 注意事项
1. 这三个技能是互斥的,如果玩家同时拥有多个种火技能,会按照优先级从高到低生效(种火III > 种火II > 种火I)
2. 种火技能只对战斗中受到的伤害有效,不影响其他来源的伤害(如陷阱、毒素等)
3. 种火技能的伤害减免是在所有其他伤害计算完成后最后应用的
# 种火IV技能实装
## 实装内容
实装了种火IV(fireseed4)技能,该技能的效果是将持有该技能的玩家受到的所有伤害(包括战斗,事件,陷阱,食用毒物等)全部变为0。
## 实装位置
1. 在 `gamedata/cache/clubskills_1.php` 文件中添加了种火IV技能的定义
2. 在 `include/game/revattr.func.php` 文件中的 `get_final_dmg_p` 函数中添加了种火IV的伤害免疫逻辑
3. 在 `include/game/revattr.func.php` 文件中的 `get_final_dmg_fix` 函数中添加了种火IV的伤害固定为0的逻辑
4. 在 `include/game/item.poison.php` 文件中添加了种火IV对毒物伤害的免疫逻辑
5. 在 `include/game/itemmain.func.php` 文件中添加了种火IV对陷阱伤害的免疫逻辑
## 实装逻辑
1. 种火IV通过在 `get_final_dmg_p` 函数中设置标记,然后在 `get_final_dmg_fix` 函数中检测标记并将伤害固定为0来实现战斗伤害免疫
2. 种火IV通过在 `item.poison.php` 中检查技能并将毒物伤害设为0来实现毒物伤害免疫
3. 种火IV通过在 `itemmain.func.php` 中检查技能并将陷阱伤害设为0来实现陷阱伤害免疫
## 技能效果
这个技能是被动技能,玩家学习后会自动生效,不需要主动触发。技能效果会在受到伤害时显示在战斗日志或游戏日志中,告知玩家伤害免疫情况。
## 注意事项
1. 种火IV是种火系列技能中最强大的,它可以免疫所有类型的伤害,包括战斗伤害、陷阱伤害、毒物伤害等
2. 种火IV的技能点消耗设置为50点,比种火III(30点)更高,反映了其强大的效果
3. 种火IV的实现方式是在各个伤害计算的关键位置添加检查,确保所有类型的伤害都能被免疫
# 种火套装与技能关联实装
## 实装内容
实现了种火系列套装(fs2, fs3, fs4, fs5)与种火系列技能(fireseed1, fireseed2, fireseed3, fireseed4)的关联,使得玩家穿戴对应套装时自动获得相应的种火技能。
## 实装位置
1. 创建了新文件 `include/game/setitems.func.php` 用于处理套装效果
2. 修改了 `include/game/itemmain.func.php` 中的 `reload_set_items` 函数,调用新的套装效果处理函数
3. 修改了 `include/game/itemmain.func.php` 中的 `reload_single_set_item` 函数,在装备和卸下套装部件时调用套装效果处理函数
## 实装逻辑
1. 创建了 `process_set_item_effects` 函数,用于处理套装效果:
- 检查玩家是否拥有套装效果
- 对于每个套装,检查套装件数是否达到激活条件
- 如果达到激活条件,根据套装ID授予对应的种火技能
- 如果未达到激活条件,移除对应的种火技能(如果该技能是通过套装获得的)
2. 套装与技能的对应关系:
- fs2(种火Ⅰ套装)→ fireseed1(种火I技能)
- fs3(种火Ⅱ套装)→ fireseed2(种火II技能)
- fs4(种火Ⅲ套装)→ fireseed3(种火III技能)
- fs5(种火Ⅳ套装)→ fireseed4(种火IV技能)
3. 在以下情况下会触发套装效果处理:
- 玩家数据初始化时(通过 `reload_set_items` 函数)
- 玩家装备套装部件时(通过 `reload_single_set_item` 函数)
- 玩家卸下套装部件时(通过 `reload_single_set_item` 函数)
## 技能效果
当玩家穿戴完整的套装时,会自动获得对应的种火技能,享受相应的伤害减免效果:
- 种火I:战斗伤害降低为75%
- 种火II:战斗伤害降低为50%
- 种火III:战斗伤害变为1
- 种火IV:所有伤害(包括战斗、陷阱、毒物等)变为0
## 注意事项
1. 如果玩家通过学习获得了种火技能,即使卸下对应套装,该技能也不会消失
2. 只有通过套装获得的种火技能才会在卸下套装时消失
3. 套装效果会在游戏日志中显示,告知玩家获得或失去了哪些技能
4. 该实现方式可以扩展到其他套装效果,只需在 `process_set_item_effects` 函数中添加对应的处理逻辑
# 种火套装与技能关联修复
## 问题描述
在玩家装备或移除物品时,未出现获得或失去技能的提示,也并没有获得或失去技能。
## 问题原因
问题出在 `setitems.func.php` 文件中使用 `check_skill_unlock` 函数的方式上。这个函数不仅检查玩家是否拥有技能,还会检查技能是否可用(是否解锁),这导致了即使玩家没有技能,函数也可能返回非零值(表示技能未解锁),从而导致条件判断失败。
## 修复内容
1. 修改了 `setitems.func.php` 文件中的条件判断逻辑,不再使用 `check_skill_unlock` 函数,而是直接检查玩家的 `clbpara['skill']` 数组中是否包含对应的技能
2. 对于获得技能的条件,改为检查 `empty($pa['clbpara']['skill']) || !in_array('fireseed1', $pa['clbpara']['skill'])`
3. 对于失去技能的条件,改为检查 `!empty($pa['clbpara']['skill']) && in_array('fireseed1', $pa['clbpara']['skill'])`
4. 移除了检查技能是否通过学习获得的逻辑,因为这个逻辑在当前实现中不需要
## 修复效果
1. 现在当玩家装备完整的套装时,会正确获得对应的种火技能,并显示获得技能的提示
2. 当玩家卸下套装部件导致套装不再完整时,会正确失去对应的种火技能,并显示失去技能的提示
3. 套装效果与技能的关联关系正常工作
## 注意事项
1. 这个修复不会影响玩家通过学习获得的种火技能,只会影响通过套装获得的技能
2. 如果玩家同时通过学习和套装获得了同一个技能,卸下套装后技能会被移除,但这是预期行为,因为 `lostclubskill` 函数会直接从 `clbpara['skill']` 数组中移除技能
3. 如果需要区分通过学习获得的技能和通过套装获得的技能,需要在 `clbpara` 中添加额外的标记
# 种火IV陷阱伤害免疫修复
## 问题描述
在种火IV技能生效时,玩家踩到陷阱仍然正常受到了伤害,而该伤害应该下降为0。
## 问题原因
问题出在 `itemmain.func.php` 文件中的陷阱伤害计算逻辑。原来的代码先计算陷阱伤害,然后再检查种火IV技能,这导致在某些情况下(可能是由于代码执行顺序或其他因素),种火IV的效果没有正确应用。
## 修复内容
1. 修改了 `itemmain.func.php` 文件中的陷阱伤害计算逻辑,将种火IV的检查移到了伤害计算之前
2. 使用了 `if-else` 结构,确保当种火IV技能存在时,直接将伤害设为0,不再进行后续的伤害计算
3. 改进了检查种火IV技能的方式,不再使用 `check_skill_unlock` 函数,而是直接检查玩家的 `clbpara['skill']` 数组中是否包含 'fireseed4'
## 修复前代码
```php
# 计算陷阱伤害
$damage = calc_trap_damage($data,NULL,$playerflag,$selflag);
# 检查陷阱是否被迎击
$damage = check_trap_def_event($data,$damage,$playerflag,$selflag);
# 「种火IV」效果判定:
if(check_skill_unlock('fireseed4', $data)) {
$log .= "<span class='yellow'>「种火IV」使{$name}受到的所有伤害变为0!</span><br>";
$damage = 0;
}
if($damage)
```
## 修复后代码
```php
# 「种火IV」效果判定:
if(!empty($data['clbpara']['skill']) && in_array('fireseed4', $data['clbpara']['skill']))
{
$log .= "<span class='yellow'>「种火IV」使{$name}受到的所有伤害变为0!</span><br>";
$damage = 0;
}
else
{
# 计算陷阱伤害
$damage = calc_trap_damage($data,NULL,$playerflag,$selflag);
# 检查陷阱是否被迎击
$damage = check_trap_def_event($data,$damage,$playerflag,$selflag);
}
if($damage)
```
## 修复效果
1. 现在当玩家拥有种火IV技能时,踩到陷阱会正确地将伤害降为0
2. 玩家会看到提示消息,告知种火IV技能使伤害变为0
3. 由于伤害为0,玩家不会受到任何陷阱伤害,也不会触发陷阱击杀事件
## 注意事项
1. 这个修复只影响陷阱伤害,不影响其他类型的伤害(战斗、毒物等)
2. 修复使用了直接检查技能数组的方式,而不是使用 `check_skill_unlock` 函数,这与之前修复套装效果时的方法一致
3. IDE报告了一些未使用的变量警告,但这些不影响功能,是原代码中就存在的问题
# 种火系列技能与套装实装总结
## 实装内容概述
本次实装了四个种火系列技能(fireseed1-4)以及它们与对应套装(fs2-fs5)的关联。种火系列技能提供不同程度的伤害减免效果,从降低战斗伤害到完全免疫所有伤害。
## 实装步骤
### 1. 种火I/II/III技能实装
1. 在 `gamedata/cache/clubskills_1.php` 文件中添加了三个技能的定义:
- 种火I(fireseed1):战斗伤害降低为75%
- 种火II(fireseed2):战斗伤害降低为50%
- 种火III(fireseed3):战斗伤害变为1
2. 在 `include/game/revattr.func.php` 文件中的 `get_final_dmg_p` 函数中添加了种火I和种火II的伤害减免逻辑
3. 在 `include/game/revattr.func.php` 文件中的 `get_final_dmg_fix` 函数中添加了种火III的伤害固定为1的逻辑
### 2. 种火IV技能实装
1. 在 `gamedata/cache/clubskills_1.php` 文件中添加了种火IV(fireseed4)技能的定义,该技能使所有伤害变为0
2. 在 `include/game/revattr.func.php` 文件中的 `get_final_dmg_p` 函数中添加了种火IV的标记设置逻辑
3. 在 `include/game/revattr.func.php` 文件中的 `get_final_dmg_fix` 函数中添加了种火IV的伤害固定为0的逻辑
4. 在 `include/game/item.poison.php` 文件中添加了种火IV对毒物伤害的免疫逻辑
5. 在 `include/game/itemmain.func.php` 文件中添加了种火IV对陷阱伤害的免疫逻辑
### 3. 套装与技能关联实装
1. 创建了新文件 `include/game/setitems.func.php`,实现了 `process_set_item_effects` 函数,用于处理套装效果
2. 在 `include/game/itemmain.func.php` 文件中修改了 `reload_set_items` 和 `reload_single_set_item` 函数,调用新的套装效果处理函数
3. 设置了套装与技能的对应关系:
- fs2(种火Ⅰ套装)→ fireseed1(种火I技能)
- fs3(种火Ⅱ套装)→ fireseed2(种火II技能)
- fs4(种火Ⅲ套装)→ fireseed3(种火III技能)
- fs5(种火Ⅳ套装)→ fireseed4(种火IV技能)
## 除错过程
### 1. 套装效果不生效问题
**问题描述**:在玩家装备或移除物品时,未出现获得或失去技能的提示,也并没有获得或失去技能。
**问题原因**:问题出在 `setitems.func.php` 文件中使用 `check_skill_unlock` 函数的方式上。这个函数不仅检查玩家是否拥有技能,还会检查技能是否可用(是否解锁),这导致了即使玩家没有技能,函数也可能返回非零值(表示技能未解锁),从而导致条件判断失败。
**解决方案**:
1. 修改了 `setitems.func.php` 文件中的条件判断逻辑,不再使用 `check_skill_unlock` 函数,而是直接检查玩家的 `clbpara['skill']` 数组中是否包含对应的技能
2. 对于获得技能的条件,改为检查 `empty($pa['clbpara']['skill']) || !in_array('fireseed1', $pa['clbpara']['skill'])`
3. 对于失去技能的条件,改为检查 `!empty($pa['clbpara']['skill']) && in_array('fireseed1', $pa['clbpara']['skill'])`
### 2. 种火IV陷阱伤害免疫问题
**问题描述**:在种火IV生效时,踩到陷阱仍然正常受到了伤害,而该伤害应该下降为0。
**问题原因**:问题出在 `itemmain.func.php` 文件中的陷阱伤害计算逻辑。原来的代码先计算陷阱伤害,然后再检查种火IV技能,这导致在某些情况下,种火IV的效果没有正确应用。
**解决方案**:
1. 修改了 `itemmain.func.php` 文件中的陷阱伤害计算逻辑,将种火IV的检查移到了伤害计算之前
2. 使用了 `if-else` 结构,确保当种火IV技能存在时,直接将伤害设为0,不再进行后续的伤害计算
3. 改进了检查种火IV技能的方式,不再使用 `check_skill_unlock` 函数,而是直接检查玩家的 `clbpara['skill']` 数组中是否包含 'fireseed4'
## 实装特点
1. **渐进式伤害减免**:种火系列技能提供了从75%、50%、1到0的渐进式伤害减免,玩家可以根据需要选择不同级别的保护
2. **全面伤害免疫**:种火IV技能提供了对所有类型伤害(包括战斗、陷阱、毒物等)的完全免疫,是一个非常强大的防御技能
3. **套装激活机制**:通过套装激活技能的机制,玩家可以通过收集和装备特定套装来获得对应的种火技能,增加了游戏的收集和策略元素
4. **技能与套装分离**:玩家可以通过学习直接获得种火技能,也可以通过装备套装获得,两种方式互不干扰,增加了游戏的灵活性
## 代码实现要点
1. **伤害计算流程**:种火技能的实现涉及到游戏的伤害计算流程,需要在适当的位置插入伤害修正逻辑
2. **技能检查方式**:在实现过程中,发现直接检查技能数组比使用 `check_skill_unlock` 函数更可靠,特别是在套装效果和陷阱伤害计算中
3. **优先级处理**:种火系列技能之间有优先级关系,种火IV > 种火III > 种火II > 种火I,这通过条件判断的顺序来实现
4. **套装效果处理**:套装效果的处理需要在装备和卸下物品时触发,通过修改 `reload_set_items` 和 `reload_single_set_item` 函数实现
## 未来可能的改进
1. **技能来源标记**:可以在 `clbpara` 中添加标记,区分技能是通过学习获得还是通过套装获得,这样可以更精确地控制技能的移除
2. **UI提示优化**:可以优化技能获得和失去时的UI提示,使其更加明显和信息丰富
3. **技能效果扩展**:可以为种火系列技能添加更多效果,如反伤、状态免疫等,进一步丰富技能系统
4. **套装效果扩展**:可以为其他套装添加类似的技能激活效果,创建更多有趣的套装-技能组合
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment