Commit 3cfd50f3 authored by Nemo Ma's avatar Nemo Ma

FEAT: Add Second Chance and Once More skill

parent 62b7ccca
# 奇机与起迹技能实装
## 技能概述
1. **奇机(tl_2ndchance)**:
- 被动技能,在战斗中,当受到将大于目前生命值的伤害时,那个伤害成为目前生命值-1的数值(也即留下1HP)
- 这是一个保命技能,可以防止玩家被一击致命
2. **起迹(tl_oncemore)**:
- 被动技能,在战斗中,只要自己的生命值为1,则将那次伤害变为0
- 使用后会在玩家的clbpara中记录一个flag(tl_oncemore_used)
- flag存在的场合该技能无效
- 玩家通过使用补给和治疗获得生命值时,将这个flag去除
- 这是一个配合奇机使用的技能,可以在生命值为1时免疫一次伤害
## 实装步骤
### 1. 添加技能定义
在 `gamedata/cache/clubskills_1.php` 文件中添加了两个技能的定义:
```php
'tl_2ndchance' => Array
(
'name' => '奇机',
'tags' => Array('passive'),
'desc' => '被动技能,在战斗中,受到将大于目前生命值的伤害时,那个伤害成为目前生命值-1的数值(也即留下1HP)。',
'cost' => 30,
'input' => '学习',
'log' => '消耗了<span class="lime">[:cost:]</span>点技能点,学会了技能「奇机」。<br>',
),
'tl_oncemore' => Array
(
'name' => '起迹',
'tags' => Array('passive'),
'desc' => '被动技能,在战斗中,只要自己的生命值为1,则将那次伤害变为0,并在该玩家的clbpara中记录一个flag,flag存在的场合该技能无效。玩家通过使用补给和治疗获得生命值时,将这个flag去除。',
'cost' => 30,
'input' => '学习',
'log' => '消耗了<span class="lime">[:cost:]</span>点技能点,学会了技能「起迹」。<br>',
),
```
### 2. 实现技能检测
在 `include/game/revattr.func.php` 文件的 `get_attr_passive_skills` 函数中添加了对这两个技能的检测:
```php
# 「奇机」特殊判定:
elseif($sk == 'tl_2ndchance')
{
$pa['skill_tl_2ndchance'] = 1;
}
# 「起迹」特殊判定:
elseif($sk == 'tl_oncemore')
{
$pa['skill_tl_oncemore'] = 1;
}
```
### 3. 实现技能效果
在 `include/game/revattr.func.php` 文件的 `get_final_dmg_fix` 函数中添加了这两个技能的效果实现:
```php
# 「奇机」效果判定:
if(isset($pd['skill_tl_2ndchance']) && $fin_dmg > $pd['hp'])
{
$fin_dmg = $pd['hp'] - 1;
$log .= "<span class='yellow'>「奇机」使{$pd['nm']}在危险时刻保留了1点生命值!</span><br>";
return $fin_dmg;
}
# 「起迹」效果判定:
if(isset($pd['skill_tl_oncemore']) && $pd['hp'] == 1 && !isset($pd['clbpara']['tl_oncemore_used']))
{
$pd['clbpara']['tl_oncemore_used'] = 1;
$fin_dmg = 0;
$log .= "<span class='yellow'>「起迹」使{$pd['nm']}在生命值为1时免疫了这次伤害!</span><br>";
return $fin_dmg;
}
```
### 4. 实现flag清除
在以下三个函数中添加了清除 `tl_oncemore_used` flag 的代码:
1. 在 `include/game/item.recovery.php` 文件的 `item_recovery_health` 函数中:
```php
# 「起迹」标记清除:
if(isset($clbpara['tl_oncemore_used'])) {
unset($clbpara['tl_oncemore_used']);
$log .= "<span class='yellow'>「起迹」技能恢复了效果!</span><br>";
}
```
2. 在 `include/game/item.recovery.php` 文件的 `item_recovery_both` 函数中:
```php
# 「起迹」标记清除:
if(isset($clbpara['tl_oncemore_used'])) {
unset($clbpara['tl_oncemore_used']);
$log .= "<span class='yellow'>「起迹」技能恢复了效果!</span><br>";
}
```
3. 在 `include/state.func.php` 文件的 `rest` 函数中:
```php
# 「起迹」标记清除:
if($uphp > 0 && isset($clbpara['tl_oncemore_used'])) {
unset($clbpara['tl_oncemore_used']);
$log .= "<span class='yellow'>「起迹」技能恢复了效果!</span><br>";
}
```
## 技能机制说明
### 奇机(tl_2ndchance)
1. 当玩家受到的伤害大于当前生命值时(即致命伤害),该技能会将伤害减少为"当前生命值-1"
2. 这样玩家就会剩下1点生命值,而不是被击败
3. 技能会在游戏日志中显示提示信息
4. 这个技能没有使用次数限制,每次受到致命伤害时都会触发
### 起迹(tl_oncemore)
1. 当玩家生命值为1点时,该技能会将下一次受到的伤害变为0
2. 技能触发后,会在玩家的clbpara中设置一个flag(tl_oncemore_used)
3. 当这个flag存在时,技能不会再次触发
4. 玩家通过使用补给、治疗物品或休息恢复生命值时,会清除这个flag,使技能可以再次使用
5. 技能会在游戏日志中显示提示信息
## 技能组合效果
这两个技能可以很好地配合使用:
1. 当玩家受到致命伤害时,"奇机"会使玩家剩下1点生命值
2. 然后,如果玩家再次受到攻击,"起迹"会使这次伤害变为0,保护玩家
3. 玩家可以利用这个机会使用补给或治疗物品恢复生命值
4. 恢复生命值后,"起迹"的flag会被清除,可以再次使用
这种组合为玩家提供了强大的生存能力,特别是在危险的战斗中。
# 奇机与起迹技能书实装
## 实装内容概述
本次实装了三本技能书,用于让玩家获得"奇机"和"起迹"技能:
1. **现实逃避论 ~风中残烛之卷**:使用后玩家获得"奇机"技能
2. **现实逃避论 ~一转攻势之卷**:使用后玩家获得"起迹"技能
3. **现实逃避论 ~全卷**:使用后玩家同时获得"奇机"和"起迹"技能
## 技能书详情
### 1. 现实逃避论 ~风中残烛之卷
- **物品名称**:现实逃避论 ~风中残烛之卷
- **物品类型**:VS(技能书)
- **物品属性**:tl_2ndchance(奇机技能)
- **使用效果**:获得"奇机"技能,该技能可以在战斗中受到致命伤害时保留1点生命值
- **描述文本**:书中详细描述了在危机时刻如何保持最后一丝生机的秘诀
### 2. 现实逃避论 ~一转攻势之卷
- **物品名称**:现实逃避论 ~一转攻势之卷
- **物品类型**:VS(技能书)
- **物品属性**:tl_oncemore(起迹技能)
- **使用效果**:获得"起迹"技能,该技能可以在生命值为1时免疫一次伤害
- **描述文本**:书中详细描述了如何在生死一线之际转危为安的秘诀
### 3. 现实逃避论 ~全卷
- **物品名称**:现实逃避论 ~全卷
- **物品类型**:VS(技能书)
- **物品属性**:tl_2ndchance,tl_oncemore(奇机和起迹技能)
- **使用效果**:同时获得"奇机"和"起迹"技能
- **描述文本**:这是一本完整的生存指南,详细描述了如何在绝境中求生的各种技巧
## 实装步骤
1. 在 `include/game/item.nouveau_booster1.php` 文件中添加了三个技能书的处理逻辑
2. 每本技能书的处理逻辑包括:
- 检查物品名称和属性是否匹配
- 使用 `getclubskill` 函数尝试为玩家添加对应技能
- 根据添加结果显示相应的提示信息
- 消耗物品(减少使用次数或移除物品)
- 记录获得技能的新闻
## 实装特点
1. **分级获取**:玩家可以选择单独获取"奇机"或"起迹"技能,也可以通过全卷同时获取两个技能
2. **友好提示**:根据玩家是否已经拥有技能,显示不同的提示信息
3. **完整记录**:使用 `addnews` 函数记录玩家获得技能的事件
4. **消耗机制**:使用后物品会被消耗,符合游戏的物品使用逻辑
## 使用方法
1. 玩家获得对应的技能书物品
2. 在物品栏中使用该技能书
3. 如果玩家还没有对应的技能,将会获得该技能并看到成功提示
4. 如果玩家已经拥有对应的技能,将会看到失败提示
## 代码实现
```php
// 现实逃避论 ~风中残烛之卷:获得奇机技能
if ($itm == '现实逃避论 ~风中残烛之卷' && $itmsk == 'tl_2ndchance') {
global $cskills, $now;
$flag = getclubskill('tl_2ndchance', $clbpara);
if ($flag) {
$log .= "你仔细阅读了<span class='red'>{$itm}</span>,书中详细描述了在危机时刻如何保持最后一丝生机的秘诀。<br>";
$log .= "哇!没想到这本书里竟然介绍了<span class='yellow'>「{$cskills['tl_2ndchance']['name']}」</span>的原理!<br>";
$log .= "获得了技能<span class='yellow'>「{$cskills['tl_2ndchance']['name']}」</span>!<br>";
$log .= "你心满意足地把<span class='red'>{$itm}</span>吃进了肚里。<br>";
addnews($now, 'getsk_tl_2ndchance', $name, $itm, $nick);
} else {
$log .= "什么嘛!原来里面都是些你看过的东西了,你没有从书中学到任何新东西。<br>";
$log .= "你一怒之下把这本破书撕了个稀巴烂!<br>";
}
// 消耗物品
if ($itms != $nosta) {
$itms--;
if ($itms <= 0) {
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
}
}
return true;
}
```
## 注意事项
1. 技能书的物品类型必须是 `VS`(技能书类型)
2. 技能书的物品属性必须与要授予的技能ID匹配
3. 全卷的物品属性使用逗号分隔两个技能ID
4. 玩家已经拥有的技能不会重复获得,但会消耗物品
# 奇机技能修复
## 问题描述
技能"奇机"(tl_2ndchance)在玩家生命值为1的时候也会发动,这与技能的设计初衷不符。该技能应该只在玩家生命值大于1且即将受到致命伤害时才发动,将伤害减少到只剩1点生命值。
## 问题原因
在 `include/game/revattr.func.php` 文件的 `get_final_dmg_fix` 函数中,"奇机"技能的判定条件不完整。原来的代码只检查了两个条件:
1. 玩家拥有"奇机"技能
2. 即将受到的伤害大于当前生命值
但是缺少了第三个条件:当前生命值必须大于1。这导致即使玩家生命值已经是1,技能仍然会触发,这是不必要的,因为此时应该由"起迹"技能来处理。
## 修复内容
在 `include/game/revattr.func.php` 文件的 `get_final_dmg_fix` 函数中,修改了"奇机"技能的判定条件,添加了对当前生命值的检查:
```php
# 「奇机」效果判定:
if(isset($pd['skill_tl_2ndchance']) && $fin_dmg > $pd['hp'] && $pd['hp'] > 1)
{
$fin_dmg = $pd['hp'] - 1;
$log .= "<span class='yellow'>「奇机」使{$pd['nm']}在危险时刻保留了1点生命值!</span><br>";
return $fin_dmg;
}
```
添加了 `$pd['hp'] > 1` 条件,确保只有当玩家当前生命值大于1时,"奇机"技能才会触发。
## 修复效果
1. 现在"奇机"技能只会在玩家生命值大于1且即将受到致命伤害时触发
2. 当玩家生命值已经是1时,"奇机"技能不会触发,而是由"起迹"技能来处理(如果玩家拥有该技能)
3. 这样两个技能可以更好地配合工作,不会出现功能重叠的情况
## 技能组合效果
修复后,"奇机"和"起迹"技能的组合效果更加明确:
1. 当玩家受到致命伤害时,"奇机"会使玩家剩下1点生命值
2. 然后,如果玩家再次受到攻击,"起迹"会使这次伤害变为0,保护玩家
3. 玩家可以利用这个机会使用补给或治疗物品恢复生命值
4. 恢复生命值后,"起迹"的flag会被清除,可以再次使用
这种组合为玩家提供了强大的生存能力,特别是在危险的战斗中。
......@@ -78,37 +78,37 @@ $cskills = Array
(
'name' => '种火I',
'tags' => Array('passive'),
'desc' => '被动技能,使你因为战斗受到的所有最终伤害都降低为75%。',
'cost' => 10,
'input' => '学习',
'log' => '消耗了<span class="lime">[:cost:]</span>点技能点,学会了技能「种火I」。<br>',
'desc' => '套装技能,使你因为战斗受到的所有最终伤害都降低为75%。',
),
'fireseed2' => Array
(
'name' => '种火II',
'tags' => Array('passive'),
'desc' => '被动技能,使你因为战斗受到的所有最终伤害都降低为50%。',
'cost' => 20,
'input' => '学习',
'log' => '消耗了<span class="lime">[:cost:]</span>点技能点,学会了技能「种火II」。<br>',
'desc' => '套装技能,使你因为战斗受到的所有最终伤害都降低为50%。',
),
'fireseed3' => Array
(
'name' => '种火III',
'tags' => Array('passive'),
'desc' => '被动技能,使你因为战斗受到的所有最终伤害都变为1。',
'cost' => 30,
'input' => '学习',
'log' => '消耗了<span class="lime">[:cost:]</span>点技能点,学会了技能「种火III」。<br>',
'desc' => '套装技能,使你因为战斗受到的所有最终伤害都变为1。',
),
'fireseed4' => Array
(
'name' => '种火IV',
'tags' => Array('passive'),
'desc' => '被动技能,使你受到的所有伤害(包括战斗、事件、陷阱、食用毒物等)都变为0。',
'cost' => 50,
'input' => '学习',
'log' => '消耗了<span class="lime">[:cost:]</span>点技能点,学会了技能「种火IV」。<br>',
'desc' => '套装技能,使你受到的所有伤害(包括战斗、事件、陷阱、食用毒物等)都变为0。',
),
'tl_2ndchance' => Array
(
'name' => '奇机',
'tags' => Array('passive'),
'desc' => '在战斗中,受到将大于目前生命值的伤害时,以一线生机存活下来。',
),
'tl_oncemore' => Array
(
'name' => '起迹',
'tags' => Array('passive'),
'desc' => '在战斗中,只要自己的生命值为1,则只有一次可以免除下一次伤害(状态可刷新)。',
),
// 可以通过在此文件中填写配置项来创建一个新技能,系统会自动生成模板。如果配置文件不能满足需求,可以自己创建一个模板文件
/*'技能编号' => Array
......
......@@ -112,6 +112,88 @@ function item_nouveau_booster1($itmn, &$data) {
return true;
}
// 处理技能书物品
if ($itmk == 'VS') {
// 现实逃避论 ~风中残烛之卷:获得奇机技能
if ($itm == '现实逃避论~风中残烛之卷' && $itmsk == 'tl_2ndchance') {
global $cskills, $now;
$flag = getclubskill('tl_2ndchance', $clbpara);
if ($flag) {
$log .= "你仔细阅读了<span class='red'>{$itm}</span>,书中详细描述了在危机时刻如何保持最后一丝生机的秘诀。<br>";
$log .= "哇!没想到这本书里竟然介绍了<span class='yellow'>「{$cskills['tl_2ndchance']['name']}」</span>的原理!<br>";
$log .= "获得了技能<span class='yellow'>「{$cskills['tl_2ndchance']['name']}」</span>!<br>";
$log .= "你心满意足地把<span class='red'>{$itm}</span>吃进了肚里。<br>";
//addnews($now, 'getsk_tl_2ndchance', $name, $itm, $nick);
} else {
$log .= "什么嘛!原来里面都是些你看过的东西了,你没有从书中学到任何新东西。<br>";
$log .= "你一怒之下把这本破书撕了个稀巴烂!<br>";
}
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
// 消耗物品
return true;
}
// 现实逃避论 ~一转攻势之卷:获得起迹技能
if ($itm == '现实逃避论~一转攻势之卷' && $itmsk == 'tl_oncemore') {
global $cskills, $now;
$flag = getclubskill('tl_oncemore', $clbpara);
if ($flag) {
$log .= "你仔细阅读了<span class='red'>{$itm}</span>,书中详细描述了如何在生死一线之际转危为安的秘诀。<br>";
$log .= "哇!没想到这本书里竟然介绍了<span class='yellow'>「{$cskills['tl_oncemore']['name']}」</span>的原理!<br>";
$log .= "获得了技能<span class='yellow'>「{$cskills['tl_oncemore']['name']}」</span>!<br>";
$log .= "你心满意足地把<span class='red'>{$itm}</span>吃进了肚里。<br>";
//addnews($now, 'getsk_tl_oncemore', $name, $itm, $nick);
} else {
$log .= "什么嘛!原来里面都是些你看过的东西了,你没有从书中学到任何新东西。<br>";
$log .= "你一怒之下把这本破书撕了个稀巴烂!<br>";
}
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
// 消耗物品
return true;
}
// 现实逃避论 ~全卷:同时获得奇机和起迹技能
if ($itm == '现实逃避论~全卷' ) {
global $cskills, $now;
$flag1 = getclubskill('tl_2ndchance', $clbpara);
$flag2 = getclubskill('tl_oncemore', $clbpara);
if ($flag1 || $flag2) {
$log .= "你仔细阅读了<span class='red'>{$itm}</span>,这是一本完整的生存指南,详细描述了如何在绝境中求生的各种技巧。<br>";
if ($flag1) {
$log .= "哇!没想到这本书里竟然介绍了<span class='yellow'>「{$cskills['tl_2ndchance']['name']}」</span>的原理!<br>";
$log .= "获得了技能<span class='yellow'>「{$cskills['tl_2ndchance']['name']}」</span>!<br>";
//addnews($now, 'getsk_tl_2ndchance', $name, $itm, $nick);
}
if ($flag2) {
$log .= "哇!没想到这本书里竟然还介绍了<span class='yellow'>「{$cskills['tl_oncemore']['name']}」</span>的原理!<br>";
$log .= "获得了技能<span class='yellow'>「{$cskills['tl_oncemore']['name']}」</span>!<br>";
//addnews($now, 'getsk_tl_oncemore', $name, $itm, $nick);
}
$log .= "你心满意足地把<span class='red'>{$itm}</span>吃进了肚里。<br>";
} else {
$log .= "什么嘛!原来里面都是些你看过的东西了,你没有从书中学到任何新东西。<br>";
$log .= "你一怒之下把这本破书撕了个稀巴烂!<br>";
}
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
// 消耗物品
return true;
}
}
// 如果没有匹配的物品,返回 false
return false;
}
......
......@@ -75,7 +75,15 @@ function item_recovery_health($itmn, &$data) {
$addhp = diceroll($itme);
$log .= "随机数大神不喜欢给定值,你回复的生命被骰子改动了!<br>";
}
if($addhp > 0) $hp += $addhp;
if($addhp > 0) {
$hp += $addhp;
# 「起迹」标记清除:
if(isset($clbpara['tl_oncemore_used'])) {
unset($clbpara['tl_oncemore_used']);
$log .= "<span class='yellow'>「起迹」技能恢复了效果!</span><br>";
}
}
else $addhp = 0;
$log .= "你使用了<span class=\"red\">$itm</span>,恢复了<span class=\"yellow\">$addhp</span>点生命。<br>";
if ($itms != $nosta) {
......@@ -226,7 +234,15 @@ function item_recovery_both($itmn, &$data) {
$addhp = diceroll($itme);
$log .= "随机数大神不喜欢给定值,你回复的生命被骰子改动了!<br>";
}
if($addhp > 0) $hp += $addhp;
if($addhp > 0) {
$hp += $addhp;
# 「起迹」标记清除:
if(isset($clbpara['tl_oncemore_used'])) {
unset($clbpara['tl_oncemore_used']);
$log .= "<span class='yellow'>「起迹」技能恢复了效果!</span><br>";
}
}
else $addhp = 0;
$log .= "你使用了<span class=\"red\">$itm</span>,恢复了<span class=\"yellow\">$addhp</span>点生命和<span class=\"yellow\">$addsp</span>点体力。<br>";
//吃了无毒的围棋子饼干 真勇啊!
......
......@@ -256,6 +256,16 @@ namespace revattr
$pa['skill_c12_swell'] = $pa['hp'] <= $pa['mhp']*0.3 ? 2 : 1;
}
}
# 「奇机」特殊判定:
elseif($sk == 'tl_2ndchance')
{
$pa['skill_tl_2ndchance'] = 1;
}
# 「起迹」特殊判定:
elseif($sk == 'tl_oncemore')
{
$pa['skill_tl_oncemore'] = 1;
}
# 其他非特判技能,默认给一个触发标记
else
{
......@@ -1936,6 +1946,24 @@ namespace revattr
return $fin_dmg;
}
# 「奇机」效果判定:
if(isset($pd['skill_tl_2ndchance']) && $fin_dmg > $pd['hp'] && $pd['hp'] > 1)
{
$fin_dmg = $pd['hp'] - 1;
$log .= "<span class='yellow'>「奇机」使{$pd['nm']}在危险时刻保留了1点生命值!</span><br>";
return $fin_dmg;
}
# 「起迹」效果判定:
if(isset($pd['skill_tl_oncemore']) && $pd['hp'] == 1 && !isset($pd['clbpara']['tl_oncemore_used']))
{
$pd['clbpara']['tl_oncemore_used'] = 1;
$fin_dmg = 0;
$log .= "<span class='yellow'>「起迹」使{$pd['nm']}在生命值为1时免疫了这次伤害!</span><br>";
return $fin_dmg;
}
# 「量心」效果判定 手加减:
if(isset($pa['askill_c19_dispel']) && $fin_dmg >= $pd['hp'])
{
......
......@@ -949,6 +949,13 @@
$hp += $uphp; $hp = min($hp, $mhp);
$uphp = $hp - $oldhp;
$uphp=max(0,$uphp);
# 「起迹」标记清除:
if($uphp > 0 && isset($clbpara['tl_oncemore_used'])) {
unset($clbpara['tl_oncemore_used']);
$log .= "<span class='yellow'>「起迹」技能恢复了效果!</span><br>";
}
if(!$uphp && $hp >= $mhp) $log .= "没有伤口需要治疗了。";
else $log .= "你的生命恢复了<span class=\"yellow b\">$uphp</span>点。";
}
......
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