Commit 62247b43 authored by Nemo Ma's avatar Nemo Ma

FEAT: Fireseed Skills + Set

parent f343178a
# 种火系列技能实装
## 实装内容
实装了三个减伤技能:
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报告了一些未使用的变量警告,但这些不影响功能,是原代码中就存在的问题
...@@ -2487,8 +2487,11 @@ $anpcinfo = array( ...@@ -2487,8 +2487,11 @@ $anpcinfo = array(
'pls' => 99, 'pls' => 99,
'mhp' => 17, 'mhp' => 17,
'msp' => 200, 'msp' => 200,
'clubskill' => Array(
'fireseed3',
),
'att' => 27, 'att' => 27,
'def' => 99999, 'def' => 99,
'lvl' => 13, 'lvl' => 13,
'skill' => 1, 'skill' => 1,
'money' => 250, 'money' => 250,
......
This diff is collapsed.
...@@ -2086,11 +2086,14 @@ ...@@ -2086,11 +2086,14 @@
'teamID' => '', 'teamID' => '',
'teamPass' => '', 'teamPass' => '',
'gd' => 'f', 'gd' => 'f',
'clubskill' => Array(
'fireseed3',
),
//'pls' => 99, //'pls' => 99,
'mhp' => 17, 'mhp' => 17,
'msp' => 200, 'msp' => 200,
'att' => 27, 'att' => 27,
'def' => 99999, 'def' => 99,
'lvl' => 13, 'lvl' => 13,
'skill' => 1, 'skill' => 1,
'money' => 250, 'money' => 250,
......
...@@ -8,13 +8,13 @@ if (! defined ( 'IN_GAME' )) { ...@@ -8,13 +8,13 @@ if (! defined ( 'IN_GAME' )) {
function item_poison($itmn, &$data) { function item_poison($itmn, &$data) {
global $log, $nosta, $db, $tablepre, $now; global $log, $nosta, $db, $tablepre, $now;
extract($data, EXTR_REFS); extract($data, EXTR_REFS);
$itm = & ${'itm' . $itmn}; $itm = & ${'itm' . $itmn};
$itmk = & ${'itmk' . $itmn}; $itmk = & ${'itmk' . $itmn};
$itme = & ${'itme' . $itmn}; $itme = & ${'itme' . $itmn};
$itms = & ${'itms' . $itmn}; $itms = & ${'itms' . $itmn};
$itmsk = & ${'itmsk' . $itmn}; $itmsk = & ${'itmsk' . $itmn};
if (strpos($itmk, '2') === 2) { if (strpos($itmk, '2') === 2) {
$damage = round($itme * 2); $damage = round($itme * 2);
} elseif (strpos($itmk, '1') === 2) { } elseif (strpos($itmk, '1') === 2) {
...@@ -25,6 +25,13 @@ function item_poison($itmn, &$data) { ...@@ -25,6 +25,13 @@ function item_poison($itmn, &$data) {
if (strpos($inf, 'p') === false) { if (strpos($inf, 'p') === false) {
$inf .= 'p'; $inf .= 'p';
} }
# 「种火IV」效果判定:
if(check_skill_unlock('fireseed4', $data)) {
$log .= "<span class='yellow'>「种火IV」使{$name}受到的所有伤害变为0!</span><br>";
$damage = 0;
}
$hp -= $damage; $hp -= $damage;
if ($itmsk && is_numeric($itmsk)) { if ($itmsk && is_numeric($itmsk)) {
$result = $db->query("SELECT * FROM {$tablepre}players WHERE pid='$itmsk'"); $result = $db->query("SELECT * FROM {$tablepre}players WHERE pid='$itmsk'");
......
...@@ -243,10 +243,19 @@ function trap(&$data=NULL){ ...@@ -243,10 +243,19 @@ function trap(&$data=NULL){
{ {
$bid = $itmsk0; $bid = $itmsk0;
# 计算陷阱伤害 # 「种火IV」效果判定:
$damage = calc_trap_damage($data,NULL,$playerflag,$selflag); if(!empty($data['clbpara']['skill']) && in_array('fireseed4', $data['clbpara']['skill']))
# 检查陷阱是否被迎击 {
$damage = check_trap_def_event($data,$damage,$playerflag,$selflag); $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) if($damage)
{ {
...@@ -1701,7 +1710,8 @@ function reload_set_items(&$pa) ...@@ -1701,7 +1710,8 @@ function reload_set_items(&$pa)
if(!empty($pa['clbpara']['setitems'])) if(!empty($pa['clbpara']['setitems']))
{ {
//获得对应的套装效果 //获得对应的套装效果
include_once GAME_ROOT.'./include/game/setitems.func.php';
process_set_item_effects($pa);
} }
return; return;
} }
...@@ -1722,6 +1732,8 @@ function reload_single_set_item(&$pa,$eqp,$enm,$active=0) ...@@ -1722,6 +1732,8 @@ function reload_single_set_item(&$pa,$eqp,$enm,$active=0)
$pa['clbpara']['setitems'][$sid] += 1; $pa['clbpara']['setitems'][$sid] += 1;
$nownums = $pa['clbpara']['setitems'][$sid]; $nownums = $pa['clbpara']['setitems'][$sid];
//获得对应的套装效果 //获得对应的套装效果
include_once GAME_ROOT.'./include/game/setitems.func.php';
process_set_item_effects($pa);
//$log .= "激活了套装{$set_items_info[$sid]['name']}{$nownums}件套的效果。<br>"; //$log .= "激活了套装{$set_items_info[$sid]['name']}{$nownums}件套的效果。<br>";
//检查是否解锁对应套装成就 //检查是否解锁对应套装成就
} }
...@@ -1730,6 +1742,8 @@ function reload_single_set_item(&$pa,$eqp,$enm,$active=0) ...@@ -1730,6 +1742,8 @@ function reload_single_set_item(&$pa,$eqp,$enm,$active=0)
$pa['clbpara']['setitems'][$sid] -= 1; $pa['clbpara']['setitems'][$sid] -= 1;
$nownums = $pa['clbpara']['setitems'][$sid]; $nownums = $pa['clbpara']['setitems'][$sid];
//失去对应的套装效果 //失去对应的套装效果
include_once GAME_ROOT.'./include/game/setitems.func.php';
process_set_item_effects($pa);
//$log .= "套装{$set_items_info[$sid]['name']}组件数-1,重新激活{$nownums}件套的效果。<br>"; //$log .= "套装{$set_items_info[$sid]['name']}组件数-1,重新激活{$nownums}件套的效果。<br>";
} }
} }
......
This diff is collapsed.
<?php
if(!defined('IN_GAME')) exit('Access Denied');
# 套装效果处理函数
# 处理套装效果
function process_set_item_effects(&$pa)
{
global $log;
# 检查玩家是否有套装效果
if(empty($pa['clbpara']['setitems'])) return;
# 获取套装信息
$set_items_info = get_set_items_info();
# 处理每个套装效果
foreach($pa['clbpara']['setitems'] as $sid => $snums)
{
# 检查套装件数是否达到激活条件
if($snums >= $set_items_info[$sid]['active'][1])
{
# 根据套装ID应用不同效果
switch($sid)
{
case 'fs2': # 种火I套装
if(empty($pa['clbpara']['skill']) || !in_array('fireseed1', $pa['clbpara']['skill']))
{
getclubskill('fireseed1', $pa['clbpara']);
$log .= "<span class='yellow'>套装「{$set_items_info[$sid]['name']}」效果:获得技能「种火I」!</span><br>";
}
break;
case 'fs3': # 种火II套装
if(empty($pa['clbpara']['skill']) || !in_array('fireseed2', $pa['clbpara']['skill']))
{
getclubskill('fireseed2', $pa['clbpara']);
$log .= "<span class='yellow'>套装「{$set_items_info[$sid]['name']}」效果:获得技能「种火II」!</span><br>";
}
break;
case 'fs4': # 种火III套装
if(empty($pa['clbpara']['skill']) || !in_array('fireseed3', $pa['clbpara']['skill']))
{
getclubskill('fireseed3', $pa['clbpara']);
$log .= "<span class='yellow'>套装「{$set_items_info[$sid]['name']}」效果:获得技能「种火III」!</span><br>";
}
break;
case 'fs5': # 种火IV套装
if(empty($pa['clbpara']['skill']) || !in_array('fireseed4', $pa['clbpara']['skill']))
{
getclubskill('fireseed4', $pa['clbpara']);
$log .= "<span class='yellow'>套装「{$set_items_info[$sid]['name']}」效果:获得技能「种火IV」!</span><br>";
}
break;
# 其他套装效果可以在这里添加
default:
# 默认不做任何处理
break;
}
}
else
{
# 套装件数不足,移除对应效果
switch($sid)
{
case 'fs2': # 种火I套装
# 检查玩家是否有该技能,且该技能不是通过学习获得的
if(!empty($pa['clbpara']['skill']) && in_array('fireseed1', $pa['clbpara']['skill']))
{
# 移除技能
lostclubskill('fireseed1', $pa['clbpara']);
$log .= "<span class='yellow'>失去套装「{$set_items_info[$sid]['name']}」效果:技能「种火I」消失了!</span><br>";
}
break;
case 'fs3': # 种火II套装
if(!empty($pa['clbpara']['skill']) && in_array('fireseed2', $pa['clbpara']['skill']))
{
lostclubskill('fireseed2', $pa['clbpara']);
$log .= "<span class='yellow'>失去套装「{$set_items_info[$sid]['name']}」效果:技能「种火II」消失了!</span><br>";
}
break;
case 'fs4': # 种火III套装
if(!empty($pa['clbpara']['skill']) && in_array('fireseed3', $pa['clbpara']['skill']))
{
lostclubskill('fireseed3', $pa['clbpara']);
$log .= "<span class='yellow'>失去套装「{$set_items_info[$sid]['name']}」效果:技能「种火III」消失了!</span><br>";
}
break;
case 'fs5': # 种火IV套装
if(!empty($pa['clbpara']['skill']) && in_array('fireseed4', $pa['clbpara']['skill']))
{
lostclubskill('fireseed4', $pa['clbpara']);
$log .= "<span class='yellow'>失去套装「{$set_items_info[$sid]['name']}」效果:技能「种火IV」消失了!</span><br>";
}
break;
# 其他套装效果可以在这里添加
default:
# 默认不做任何处理
break;
}
}
}
}
?>
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