Commit 01d79e00 authored by Nemo Ma's avatar Nemo Ma

New NPC & Skills

TODO: Finalize NPC Resource designs
parent 6c534279
# 破虹(npc_overrainbow)技能实装
## 功能概述
实现了"破虹"(npc_overrainbow)技能,这是一个专为NPC设计的被动技能。当拥有该技能的NPC受到1000点以上的战斗伤害时,会进行一次d20暗骰,根据骰子结果决定是否反弹伤害给攻击者。
## 实装内容
1. 在 `gamedata/cache/clubskills_1.php` 文件中添加了 `npc_overrainbow` 技能的定义
2. 在 `include/game/revattr.func.php` 文件的 `get_hurt_events` 函数中添加了破虹技能的处理逻辑
## 实装细节
### 1. 技能定义
在 `clubskills_1.php` 文件中添加了以下技能定义:
```php
'npc_overrainbow' => Array
(
'name' => '破虹',
'tags' => Array('passive'),
'desc' => '受到1000点以上的战斗伤害时进行一次d20暗骰,如不出大成功(20),则将该伤害反弹给对方目标。出大失败(1)的场合,该伤害额外成为777.77倍并输出额外文案。哪怕技能拥有者因为受到该伤害死亡,技能也照样结算。',
),
```
### 2. 技能效果实现
在 `revattr.func.php` 文件的 `get_hurt_events` 函数中添加了破虹技能的处理逻辑:
1. **触发条件**:
- NPC拥有 `npc_overrainbow` 技能
- 受到的伤害大于等于1000点
2. **骰子判定**:
- 使用 `diceroll(20)` 进行d20暗骰
- 根据骰子结果执行不同的效果
3. **效果处理**:
- 大成功(20):NPC正常承受伤害,不触发反弹效果
- 大失败(1):伤害变为原伤害的777.77倍,并反弹给攻击者,同时显示特殊文案
- 普通结果(2-19):将原伤害反弹给攻击者,NPC不受伤害
4. **伤害处理**:
- 反弹伤害时,攻击者受到相应伤害
- 如果攻击者是NPC,更新数据库中的生命值
- 防守者(拥有破虹技能的NPC)在反弹伤害时不受伤害
5. **特殊处理**:
- 即使NPC因为受到伤害而死亡,技能效果也会正常结算
- 大失败时会显示特殊的彩虹碎裂文案
## 代码实现
```php
# 「破虹」效果判定:
if(!empty($pd['clbpara']['skill']) && in_array('npc_overrainbow', $pd['clbpara']['skill']) && $pa['final_damage'] >= 1000)
{
// 进行d20暗骰
include_once GAME_ROOT.'./include/game/dice.func.php';
$dice_result = diceroll(20);
// 大成功(20):不反弹伤害
if($dice_result == 20)
{
$log .= "<span class='yellow'>「破虹」技能触发!{$pd['nm']}进行了d20暗骰,结果为{$dice_result}(大成功)!</span><br>";
$log .= "<span class='yellow'>{$pd['nm']}承受了这次攻击的伤害。</span><br>";
}
// 大失败(1):伤害变为777.77倍
elseif($dice_result == 1)
{
$log .= "<span class='red'>「破虹」技能触发!{$pd['nm']}进行了d20暗骰,结果为{$dice_result}(大失败)!</span><br>";
$log .= "<span class='red'>天空中突然出现了七色彩虹,随后彩虹碎裂,无数光花如雨般落下!</span><br>";
// 计算新伤害
$reflected_damage = round($pa['final_damage'] * 777.77);
// 对攻击者造成伤害
$pa['hp'] -= $reflected_damage;
if($pa['hp'] < 0) $pa['hp'] = 0;
$log .= "<span class='red'>{$pa['nm']}被彩虹碎片击中,受到了{$reflected_damage}点伤害!</span><br>";
// 如果攻击者不是玩家,更新数据库
if($pa['type'])
{
$query = "UPDATE {$tablepre}players SET hp='{$pa['hp']}' WHERE pid='{$pa['pid']}'";
$db->query($query);
}
}
// 普通结果:反弹伤害
else
{
$log .= "<span class='yellow'>「破虹」技能触发!{$pd['nm']}进行了d20暗骰,结果为{$dice_result}!</span><br>";
$log .= "<span class='yellow'>{$pd['nm']}将伤害反弹给了{$pa['nm']}!</span><br>";
// 对攻击者造成伤害
$pa['hp'] -= $pa['final_damage'];
if($pa['hp'] < 0) $pa['hp'] = 0;
$log .= "<span class='yellow'>{$pa['nm']}受到了{$pa['final_damage']}点伤害!</span><br>";
// 如果攻击者不是玩家,更新数据库
if($pa['type'])
{
$query = "UPDATE {$tablepre}players SET hp='{$pa['hp']}' WHERE pid='{$pa['pid']}'";
$db->query($query);
}
// 防守者不受伤害
$pd['hp'] += $pa['final_damage'];
$pa['final_damage'] = 0;
}
}
```
## 使用方法
1. 为NPC添加 `npc_overrainbow` 技能:
```php
$npc['clbpara']['skill'][] = 'npc_overrainbow';
```
2. 当玩家攻击拥有该技能的NPC并造成1000点以上伤害时,会自动触发破虹技能效果
## 注意事项
1. 该技能专为NPC设计,玩家不应该获得此技能
2. 技能效果会在NPC受到伤害后立即触发,即使NPC因为该伤害而死亡
3. 大失败(1)时的777.77倍伤害可能会对玩家造成致命伤害,需要谨慎使用
4. 该技能适合用于高难度BOSS或特殊NPC,增加游戏的挑战性和策略性
# NPC技能实装:解放(npc_wrelease)和飞行(npc_flying)
## 功能概述
实现了两个专为NPC设计的技能:
1. **解放(npc_wrelease)**:开关技,打开后可在额外消耗2倍,3倍,4倍与5倍之间切换,探索时消耗的体力增加这个倍数。在进行战斗时,只在战斗计算中基础攻击力(base_att)与防御力(base_def)增加这个倍数。
2. **飞行(npc_flying)**:被动技,移动不消耗体力值。
## 实装内容
1. 在 `gamedata/cache/clubskills_1.php` 文件中添加了 `npc_wrelease` 和 `npc_flying` 技能的定义
2. 在 `include/game/search.func.php` 文件中实现了飞行技能的移动不消耗体力效果
3. 在 `include/game/search.func.php` 文件中实现了解放技能的探索体力消耗增加效果
4. 在 `include/game/revattr.func.php` 文件中实现了解放技能的战斗基础攻击力和防御力增加效果
## 实装细节
### 1. 技能定义
在 `clubskills_1.php` 文件中添加了以下技能定义:
```php
'npc_wrelease' => Array
(
'name' => '解放',
'tags' => Array('switch'),
'desc' => '开关技,打开后可在额外消耗2倍,3倍,4倍与5倍之间切换,探索时消耗的体力增加这个倍数。在进行战斗时,只在战斗计算中基础攻击力(base_att)与防御力(base_def)增加这个倍数。',
'svars' => Array(
'active' => 0, // 初始不激活
'level' => 2, // 初始倍数为2
),
),
'npc_flying' => Array
(
'name' => '飞行',
'tags' => Array('passive'),
'desc' => '被动技,移动不消耗体力值',
),
```
### 2. 飞行技能实现
在 `search.func.php` 文件的 `calc_move_search_sp_cost` 函数中添加了飞行技能的处理逻辑:
```php
# 「飞行」技能判定:移动不消耗体力
if($act == 'move' && !empty($clbpara['skill']) && in_array('npc_flying', $clbpara['skill']))
{
$actlog = "你展开双翼,飞向了目的地";
return 'sp';
}
```
这段代码检查玩家是否拥有飞行技能,如果有且当前动作是移动,则设置移动日志并直接返回,不消耗体力。
### 3. 解放技能实现 - 探索体力消耗
在 `search.func.php` 文件的 `calc_move_search_sp_cost` 函数中添加了解放技能的体力消耗处理逻辑:
```php
# 「解放」技能判定:探索时消耗的体力增加
if(!empty($clbpara['skill']) && in_array('npc_wrelease', $clbpara['skill']) && !empty($clbpara['skillpara']['npc_wrelease']['active']))
{
$level = isset($clbpara['skillpara']['npc_wrelease']['level']) ? $clbpara['skillpara']['npc_wrelease']['level'] : 2;
$costsp *= $level;
}
```
这段代码检查玩家是否拥有解放技能且技能处于激活状态,如果是,则根据技能等级(2-5倍)增加体力消耗。
### 4. 解放技能实现 - 战斗攻击力增加
在 `revattr.func.php` 文件的 `get_base_att_modifier` 函数中添加了解放技能的攻击力增加处理逻辑:
```php
# 「解放」技能判定:基础攻击力增加
if(!empty($pa['clbpara']['skill']) && in_array('npc_wrelease', $pa['clbpara']['skill']) && !empty($pa['clbpara']['skillpara']['npc_wrelease']['active']))
{
$level = isset($pa['clbpara']['skillpara']['npc_wrelease']['level']) ? $pa['clbpara']['skillpara']['npc_wrelease']['level'] : 2;
$base_att *= $level;
if(!$tooltip) $log .= "<span class='yellow'>「解放」技能发动!{$pa['nm']}的基础攻击力增加了{$level}倍!</span><br>";
}
```
这段代码检查攻击方是否拥有解放技能且技能处于激活状态,如果是,则根据技能等级(2-5倍)增加基础攻击力。
### 5. 解放技能实现 - 战斗防御力增加
在 `revattr.func.php` 文件的 `get_base_def` 函数中添加了解放技能的防御力增加处理逻辑:
```php
# 「解放」技能判定:基础防御力增加
if(!empty($pd['clbpara']['skill']) && in_array('npc_wrelease', $pd['clbpara']['skill']) && !empty($pd['clbpara']['skillpara']['npc_wrelease']['active']))
{
$level = isset($pd['clbpara']['skillpara']['npc_wrelease']['level']) ? $pd['clbpara']['skillpara']['npc_wrelease']['level'] : 2;
$base_def *= $level;
if(!$tooltip) $log .= "<span class='yellow'>「解放」技能发动!{$pd['nm']}的基础防御力增加了{$level}倍!</span><br>";
}
```
这段代码检查防守方是否拥有解放技能且技能处于激活状态,如果是,则根据技能等级(2-5倍)增加基础防御力。
## 使用方法
### 为NPC添加飞行技能
```php
$npc['clbpara']['skill'][] = 'npc_flying';
```
### 为NPC添加解放技能
```php
// 添加技能
$npc['clbpara']['skill'][] = 'npc_wrelease';
// 初始化技能参数(如果不存在)
if(!isset($npc['clbpara']['skillpara']['npc_wrelease'])) {
$npc['clbpara']['skillpara']['npc_wrelease'] = array(
'active' => 0, // 初始不激活
'level' => 2 // 初始倍数为2
);
}
// 激活技能
$npc['clbpara']['skillpara']['npc_wrelease']['active'] = 1;
// 设置倍数级别(2-5)
$npc['clbpara']['skillpara']['npc_wrelease']['level'] = 3; // 设置为3倍
```
## 注意事项
1. 这两个技能专为NPC设计,玩家不应该获得这些技能
2. 解放技能是开关技,需要先激活才能生效
3. 解放技能的倍数可以在2-5之间设置,影响体力消耗、攻击力和防御力的增幅
4. 飞行技能只影响移动消耗,不影响探索消耗
5. 解放技能的体力消耗增加可能会导致NPC在探索时更快地消耗体力,需要注意平衡
# NPC技能实装:来潮(npc_mecstasy)和勇谍(npc_perfectspy)
## 功能概述
实现了两个专为NPC设计的技能:
1. **来潮(npc_mecstasy)**:开关技,打开后你对敌人以及敌人对你造成的伤害全部变为真实判定。(也即,直接造成等同于装备武器效果的伤害,不进行其他判定)对持有fireseed3,fireseed4技能以及def高于10000的player该技能无效(并输出额外文案)
2. **勇谍(npc_perfectspy)**:被动技,你受到的来自陷阱的伤害成为0,且只要你的HP大于200,则在战斗中你的HP不会被下降到200以下。
## 实装内容
1. 在 `gamedata/cache/clubskills_1.php` 文件中添加了 `npc_mecstasy` 和 `npc_perfectspy` 技能的定义
2. 在 `include/game/itemmain.func.php` 文件中实现了勇谍技能的陷阱伤害免疫效果
3. 在 `include/game/revattr.func.php` 文件中实现了勇谍技能的战斗HP保护效果
4. 在 `include/game/revattr.func.php` 文件中实现了来潮技能的真实伤害效果
## 实装细节
### 1. 技能定义
在 `clubskills_1.php` 文件中添加了以下技能定义:
```php
'npc_mecstasy' => Array
(
'name' => '来潮',
'tags' => Array('switch'),
'desc' => '开关技,打开后你对敌人以及敌人对你造成的伤害全部变为真实判定。(也即,直接造成等同于装备武器效果的伤害,不进行其他判定)对持有fireseed3,fireseed4技能以及def高于10000的player该技能无效(并输出额外文案)',
'svars' => Array(
'active' => 0, // 初始不激活
),
),
'npc_perfectspy' => Array
(
'name' => '勇谍',
'tags' => Array('passive'),
'desc' => '被动技,你受到的来自陷阱的伤害成为0,且只要你的HP大于200,则在战斗中你的HP不会被下降到200以下。',
),
```
### 2. 勇谍技能实现 - 陷阱伤害免疫
在 `itemmain.func.php` 文件中添加了勇谍技能的陷阱伤害免疫处理逻辑:
```php
# 「种火IV」效果判定:
if(!empty($data['clbpara']['skill']) && in_array('fireseed4', $data['clbpara']['skill']))
{
$log .= "<span class='yellow'>「种火IV」使{$name}受到的所有伤害变为0!</span><br>";
$damage = 0;
}
# 「勇谍」效果判定:
elseif(!empty($data['clbpara']['skill']) && in_array('npc_perfectspy', $data['clbpara']['skill']))
{
$log .= "<span class='yellow'>「勇谍」技能发动!{$name}对陷阱的敏锐直觉使其免疫了陷阱伤害!</span><br>";
$damage = 0;
}
else
{
# 计算陷阱伤害
$damage = calc_trap_damage($data,NULL,$playerflag,$selflag);
# 检查陷阱是否被迎击
$damage = check_trap_def_event($data,$damage,$playerflag,$selflag);
}
```
这段代码检查玩家是否拥有勇谍技能,如果有,则将陷阱伤害设为0,并显示相应的提示信息。
### 3. 勇谍技能实现 - 战斗HP保护
在 `revattr.func.php` 文件的 `get_final_dmg_fix` 函数中添加了勇谍技能的HP保护处理逻辑:
```php
# 「勇谍」效果判定:
if(!empty($pd['clbpara']['skill']) && in_array('npc_perfectspy', $pd['clbpara']['skill']) && $pd['hp'] > 200 && ($pd['hp'] - $fin_dmg) < 200)
{
$fin_dmg = $pd['hp'] - 200;
$log .= "<span class='yellow'>「勇谍」技能发动!{$pd['nm']}的生命值不会低于200!</span><br>";
return $fin_dmg;
}
```
这段代码检查防守方是否拥有勇谍技能,且当前HP大于200,且受到的伤害会导致HP低于200,如果满足这些条件,则将伤害调整为只减少到200点HP,并显示相应的提示信息。
### 4. 来潮技能实现 - 真实伤害
在 `revattr.func.php` 文件的 `get_fix_damage` 函数中添加了来潮技能的真实伤害处理逻辑:
```php
# 「来潮」效果判定:
if((!empty($pa['clbpara']['skill']) && in_array('npc_mecstasy', $pa['clbpara']['skill']) && !empty($pa['clbpara']['skillpara']['npc_mecstasy']['active'])) ||
(!empty($pd['clbpara']['skill']) && in_array('npc_mecstasy', $pd['clbpara']['skill']) && !empty($pd['clbpara']['skillpara']['npc_mecstasy']['active'])))
{
# 检查是否对种火玩家无效
if((!empty($pd['clbpara']['skill']) && (in_array('fireseed3', $pd['clbpara']['skill']) || in_array('fireseed4', $pd['clbpara']['skill']))) || $pd['def'] > 10000)
{
$log .= "<span class='red'>「来潮」技能发动!但{$pd['nm']}的特殊能力使其免疫了真实伤害!</span><br>";
return 0;
}
$damage = $pa['wepe'];
$log .= "<span class='red'>「来潮」技能发动!{$pa['nm']}的武器直接造成了等同于其效果值的真实伤害!</span><br>";
return $damage;
}
```
这段代码检查攻击方或防守方是否拥有来潮技能且处于激活状态,如果有,则检查防守方是否拥有种火III/IV技能或防御力高于10000,如果满足这些条件,则技能无效;否则,直接造成等同于武器效果值的真实伤害,跳过所有其他伤害计算。
## 使用方法
### 为NPC添加勇谍技能
```php
$npc['clbpara']['skill'][] = 'npc_perfectspy';
```
### 为NPC添加来潮技能
```php
// 添加技能
$npc['clbpara']['skill'][] = 'npc_mecstasy';
// 初始化技能参数(如果不存在)
if(!isset($npc['clbpara']['skillpara']['npc_mecstasy'])) {
$npc['clbpara']['skillpara']['npc_mecstasy'] = array(
'active' => 0 // 初始不激活
);
}
// 激活技能
$npc['clbpara']['skillpara']['npc_mecstasy']['active'] = 1;
```
## 注意事项
1. 这两个技能专为NPC设计,玩家不应该获得这些技能
2. 来潮技能是开关技,需要先激活才能生效
3. 来潮技能对拥有种火III/IV技能的玩家或防御力高于10000的玩家无效
4. 勇谍技能的HP保护只在HP大于200时生效,如果HP已经低于或等于200,则不会提供保护
5. 勇谍技能的陷阱伤害免疫效果对所有类型的陷阱都有效
# NPC技能实装:指像(npc_wisp)
## 功能概述
实现了"指像"(npc_wisp)技能,这是一个专为NPC设计的被动技能。除了和特定的player战斗之外,和其他玩家战斗造成和受到的伤害均变为0。
## 实装内容
1. 在 `gamedata/cache/clubskills_1.php` 文件中添加了 `npc_wisp` 技能的定义
2. 在 `include/game/revattr.func.php` 文件的 `get_fix_damage` 函数中添加了指像技能的处理逻辑
## 实装细节
### 1. 技能定义
在 `clubskills_1.php` 文件中添加了以下技能定义:
```php
'npc_wisp' => Array
(
'name' => '指像',
'tags' => Array('passive'),
'desc' => '除了和特定的player战斗之外,和其他玩家战斗造成和受到的伤害均变为0。',
'svars' => Array(
'targets' => Array(), // 初始无目标
),
),
```
这个技能定义了一个名为"指像"的被动技能,它有一个存储目标玩家ID列表的数组参数 `targets`。
### 2. 技能效果实现
在 `revattr.func.php` 文件的 `get_fix_damage` 函数中添加了指像技能的处理逻辑:
```php
# 「指像」效果判定:
if(($pa['type'] && !empty($pa['clbpara']['skill']) && in_array('npc_wisp', $pa['clbpara']['skill']) && !$pd['type']) ||
($pd['type'] && !empty($pd['clbpara']['skill']) && in_array('npc_wisp', $pd['clbpara']['skill']) && !$pa['type']))
{
$is_target = false;
// 检查玩家是否在NPC的目标列表中
if($pa['type'] && !empty($pa['clbpara']['skillpara']['npc_wisp']['targets']))
{
$targets = $pa['clbpara']['skillpara']['npc_wisp']['targets'];
if(in_array($pd['pid'], $targets)) $is_target = true;
}
elseif($pd['type'] && !empty($pd['clbpara']['skillpara']['npc_wisp']['targets']))
{
$targets = $pd['clbpara']['skillpara']['npc_wisp']['targets'];
if(in_array($pa['pid'], $targets)) $is_target = true;
}
// 如果玩家不在目标列表中,伤害变为0
if(!$is_target)
{
$npc_name = $pa['type'] ? $pa['nm'] : $pd['nm'];
$player_name = $pa['type'] ? $pd['nm'] : $pa['nm'];
$log .= "<span class='yellow'>「指像」技能发动!{$player_name}不是{$npc_name}的目标,伤害变为0!</span><br>";
return 0;
}
}
```
这段代码首先检查战斗中是否有NPC拥有指像技能,然后检查玩家是否在NPC的目标列表中。如果玩家不在目标列表中,则将伤害设为0并显示相应的提示信息。
## 使用方法
### 为NPC添加指像技能
```php
// 添加技能
$npc['clbpara']['skill'][] = 'npc_wisp';
// 初始化技能参数(如果不存在)
if(!isset($npc['clbpara']['skillpara']['npc_wisp'])) {
$npc['clbpara']['skillpara']['npc_wisp'] = array(
'targets' => array() // 初始无目标
);
}
// 添加目标玩家
$npc['clbpara']['skillpara']['npc_wisp']['targets'][] = $player_pid; // $player_pid 是目标玩家的ID
```
## 注意事项
1. 这个技能专为NPC设计,玩家不应该获得此技能
2. 技能效果会在NPC与玩家战斗时自动触发,不需要手动激活
3. 如果NPC的目标列表为空,则对所有玩家造成的伤害都为0
4. 如果需要NPC能够对多个玩家造成伤害,需要将所有目标玩家的ID添加到目标列表中
5. 这个技能可以用于创建只针对特定玩家的NPC,例如任务相关的NPC或者特殊事件的NPC
# NPC技能修复:来潮(npc_mecstasy)和勇谍(npc_perfectspy)的协同问题
## 问题描述
当NPC同时拥有"来潮"(npc_mecstasy)和"勇谍"(npc_perfectspy)技能,且"来潮"处于激活状态时,"来潮"技能会在"勇谍"技能之前适用。这导致只要使用攻击力超过NPC血量的武器成功击中NPC,"勇谍"技能便不会发动,无法让NPC保留200点HP。
## 问题原因
在当前的实现中,"来潮"技能在 `get_fix_damage` 函数中处理,而"勇谍"技能在 `get_final_dmg_fix` 函数中处理。根据战斗流程,`get_fix_damage` 函数会先于 `get_final_dmg_fix` 函数执行,这导致"来潮"技能的真实伤害会直接返回,跳过后续的伤害处理流程,包括"勇谍"技能的HP保护效果。
## 修复内容
在 `include/game/revattr.func.php` 文件的 `get_fix_damage` 函数中,修改了"来潮"技能的处理逻辑,添加了对"勇谍"技能的检查:
```php
# 「来潮」效果判定:
if((!empty($pa['clbpara']['skill']) && in_array('npc_mecstasy', $pa['clbpara']['skill']) && !empty($pa['clbpara']['skillpara']['npc_mecstasy']['active'])) ||
(!empty($pd['clbpara']['skill']) && in_array('npc_mecstasy', $pd['clbpara']['skill']) && !empty($pd['clbpara']['skillpara']['npc_mecstasy']['active'])))
{
# 检查是否对种火玩家无效
if((!empty($pd['clbpara']['skill']) && (in_array('fireseed3', $pd['clbpara']['skill']) || in_array('fireseed4', $pd['clbpara']['skill']))) || $pd['def'] > 10000)
{
$log .= "<span class='red'>{$pa['nm']}展开了Ecstasy Mode结界!但{$pd['nm']}早已不受这种东西的影响了!</span><br>";
return 0;
}
# 检查防守方是否有「勇谍」技能且HP大于200
if(!empty($pd['clbpara']['skill']) && in_array('npc_perfectspy', $pd['clbpara']['skill']) && $pd['hp'] > 200 && $pd['hp'] - $pa['wepe'] < 200)
{
# 先记录「来潮」效果的文案
$log .= "<span class='red'>「{$pa['nm']}展开了Ecstasy Mode结界!武器直接造成了等同于其效果值的真实伤害!</span><br>";
# 然后计算「勇谍」效果保护后的伤害
$damage = $pd['hp'] - 200;
$log .= "<span class='yellow'>「勇谍」技能发动!{$pd['nm']}的生命值不会低于200!</span><br>";
return $damage;
}
$damage = $pa['wepe'];
$log .= "<span class='red'>「{$pa['nm']}展开了Ecstasy Mode结界!武器直接造成了等同于其效果值的真实伤害!</span><br>";
return $damage;
}
```
## 修复效果
通过这个修改,当NPC同时拥有"来潮"和"勇谍"技能时,系统会先检查"来潮"技能是否对当前玩家有效,然后检查NPC是否拥有"勇谍"技能且当前HP大于200,且受到的伤害会导致HP低于200。如果满足这些条件,则会先显示"来潮"技能的效果文案,然后计算"勇谍"技能保护后的伤害,确保NPC的HP不会低于200。
这样,即使玩家使用攻击力超过NPC血量的武器成功击中NPC,"勇谍"技能也能正常发动,保护NPC的生命值不低于200点。
...@@ -679,6 +679,92 @@ $anpcinfo = array( ...@@ -679,6 +679,92 @@ $anpcinfo = array(
'itme1' => 1, 'itme1' => 1,
'itms1' => 1, 'itms1' => 1,
), ),
3 => array(
'name' => 'FP-T0KI 「HOROU」',
'icon' => 'horou1.jpg',
'club' => 98,
'gd' => 'f',
'pls' => 17,
'clubskill' => Array(
'npc_overrainbow',
'npc_7colour',
),
'wep' => '悠久「铭刻时间的古代之风」',
'wepk' => 'WDF',
'wepe' => 770,
'weps' => 999,
'wepsk' => 'f',
'itm1' => '光翼「羽翼地带」',
'itmk1' => 'WCF',
'itme1' => 770,
'itms1' => 999,
'itmsk1' => 'pd',
'itm2' => '幻想「世界遗产·佐渡金银弹」',
'itmk2' => 'WF',
'itme2' => 770,
'itms2' => 999,
'itmsk2' => 'e',
'itm3' => '超妖精「深蓝儿童」',
'itmk3' => 'WF',
'itme3' => 770,
'itms3' => 999,
'itmsk3' => 'k',
'itm4' => '宝具「炼金银剑超级时镰」',
'itmk4' => 'WKF',
'itme4' => 770,
'itms4' => 999,
'itmsk4' => 'Nr',
'itm5' => '禁忌「生命炼金 - Hollow Friends」',
'itmk5' => 'WF',
'itme5' => 770,
'itms5' => 999,
'itmsk5' => 'w',
'itm6' => '社员专用的ID卡',
'itmk6' => 'Z',
'itme6' => 1,
'itms6' => 1,
),
4 => array(
'name' => 'FP-TOK1 「ORIHIME」',
'icon' => 'orihime1.jpg',
'club' => 12,
'gd' => 'm',
'pls' => 5,
'clubskill' => Array(
'npc_wrelease',
'npc_flying',
),
'wep' => '爪击',
'wepk' => 'WK',
'wepe' => 770,
'weps' => 999,
'wepsk' => 'id',
'itm1' => '社员专用的ID卡',
'itmk1' => 'Z',
'itme1' => 1,
'itms1' => 1,
),
5 => array(
'name' => 'FP-TO2I 「SAYA」',
'icon' => 'saya1.jpg',
'club' => 4,
'gd' => 'f',
'pls' => 6,
'clubskill' => Array(
'npc_mecstasy',
'npc_perfectspy',
),
'wep' => '强力手枪',
'wepk' => 'WG',
'wepe' => 770,
'weps' => 999,
'wepsk' => 'pd',
'itm1' => '社员专用的ID卡',
'itmk1' => 'Z',
'itme1' => 1,
'itms1' => 1,
),
), ),
), ),
...@@ -2485,7 +2571,7 @@ $anpcinfo = array( ...@@ -2485,7 +2571,7 @@ $anpcinfo = array(
'teamPass' => '', 'teamPass' => '',
'gd' => 'f', 'gd' => 'f',
'pls' => 99, 'pls' => 99,
'mhp' => 17, 'mhp' => 11,
'msp' => 200, 'msp' => 200,
'clubskill' => Array( 'clubskill' => Array(
'fireseed3', 'fireseed3',
...@@ -2499,27 +2585,27 @@ $anpcinfo = array( ...@@ -2499,27 +2585,27 @@ $anpcinfo = array(
'arbk' => 'DB', 'arbk' => 'DB',
'arbe' => 1, 'arbe' => 1,
'arbs' => 1, 'arbs' => 1,
'arbsk' => 'a', 'arbsk' => '',
'arh' => '◆埋火', 'arh' => '◆埋火',
'arhk' => 'DH', 'arhk' => 'DH',
'arhe' => 1, 'arhe' => 1,
'arhs' => 1, 'arhs' => 1,
'arhsk' => 'B', 'arhsk' => '',
'arf' => '◆永火', 'arf' => '◆永火',
'arfk' => 'DF', 'arfk' => 'DF',
'arfe' => 1, 'arfe' => 1,
'arfs' => 1, 'arfs' => 1,
'arfsk' => 'M', 'arfsk' => '',
'ara' => '◆残火', 'ara' => '◆残火',
'arak' => 'DA', 'arak' => 'DA',
'arae' => 1, 'arae' => 1,
'aras' => 1, 'aras' => 1,
'arask' => 'b', 'arask' => '',
'art' => '◆焰火', 'art' => '◆焰火',
'artk' => 'A', 'artk' => 'A',
'arte' => 1, 'arte' => 1,
'arts' => 1, 'arts' => 1,
'artsk' => 'H', 'artsk' => '',
'itm6' => '◆火之碎片', 'itm6' => '◆火之碎片',
'itmk6' => 'HB', 'itmk6' => 'HB',
'itme6' => 13337, 'itme6' => 13337,
......
...@@ -110,6 +110,58 @@ $cskills = Array ...@@ -110,6 +110,58 @@ $cskills = Array
'tags' => Array('passive'), 'tags' => Array('passive'),
'desc' => '在战斗中,只要自己的生命值为1,则只有一次可以免除下一次伤害(状态可刷新)。', 'desc' => '在战斗中,只要自己的生命值为1,则只有一次可以免除下一次伤害(状态可刷新)。',
), ),
'npc_overrainbow' => Array
(
'name' => '破虹',
'tags' => Array('passive'),
'desc' => '发动禁咒反「Over The Rainbow」,以七色弹幕对对手造成反弹伤害。微小几率发射出无缝弹幕。',
),
'npc_7colour' => Array
(
'name' => '七色', #HOROU用,无实际作用,逻辑直接写入Tooltip
'tags' => Array('passive'),
'desc' => '你拥有七种颜色的符卡。',
),
'npc_wrelease' => Array
(
'name' => '解放',
'tags' => Array('switch'),
'desc' => '打开后探索时消耗额外体力,但只在战斗中基础攻击力与防御力增加。',
'svars' => Array(
'active' => 1, // 初始激活
'level' => 2, // 初始倍数为2
),
),
'npc_flying' => Array
(
'name' => '飞行',
'tags' => Array('passive'),
'desc' => '你移动不消耗体力值。',
),
'npc_mecstasy' => Array
(
'name' => '来潮',
'tags' => Array('switch'),
'desc' => '打开后你对敌人以及敌人对你造成的伤害全部变为真实判定。(对防御特别高的玩家不适用)',
'svars' => Array(
'active' => 1, // 初始激活
),
),
'npc_perfectspy' => Array
(
'name' => '勇谍',
'tags' => Array('passive'),
'desc' => '你受到的来自陷阱的伤害成为0,且只要你的HP大于200,则在战斗中你的HP不会被下降到200以下。',
),
'npc_wisp' => Array
(
'name' => '指像',
'tags' => Array('passive'),
'desc' => '你对除<span class="yellow">[:targets:]%</span>以外其他玩家战斗造成和受到的伤害均变为0。',
'svars' => Array(
'targets' => Array(), // 初始无目标
),
),
// 可以通过在此文件中填写配置项来创建一个新技能,系统会自动生成模板。如果配置文件不能满足需求,可以自己创建一个模板文件 // 可以通过在此文件中填写配置项来创建一个新技能,系统会自动生成模板。如果配置文件不能满足需求,可以自己创建一个模板文件
/*'技能编号' => Array /*'技能编号' => Array
( (
......
...@@ -98,6 +98,20 @@ $tps_name = Array ...@@ -98,6 +98,20 @@ $tps_name = Array
'✦ЦВЙΨХЩΗЖФ✦' =>Array('class'=>'spitem2', 'title'=>"看起来是一个黑色的,安静的盒子,里面可能放着好东西。可以加上一个焰火进一步合成。"), '✦ЦВЙΨХЩΗЖФ✦' =>Array('class'=>'spitem2', 'title'=>"看起来是一个黑色的,安静的盒子,里面可能放着好东西。可以加上一个焰火进一步合成。"),
'✦ЦΨЙЩЦΑПΨЁВЦЩΨ✦' =>Array('class'=>'spitem2', 'title'=>"看起来是一个橙色的,骚动的盒子,里面可能放着莫名其妙的东西。以及对脸系玩法有用的东西"), '✦ЦΨЙЩЦΑПΨЁВЦЩΨ✦' =>Array('class'=>'spitem2', 'title'=>"看起来是一个橙色的,骚动的盒子,里面可能放着莫名其妙的东西。以及对脸系玩法有用的东西"),
'✦【自律AI呼唤器】' =>Array('title'=>"这是一个整蛊他人的NPC钥匙。会向游戏内部署大量特殊小兵NPC,你会因此遭到道德拷问。"), '✦【自律AI呼唤器】' =>Array('title'=>"这是一个整蛊他人的NPC钥匙。会向游戏内部署大量特殊小兵NPC,你会因此遭到道德拷问。"),
# HOROU用
'悠久「铭刻时间的古代之风」' =>Array('class'=>'orange'),
'光翼「羽翼地带」' =>Array('class'=>'red'),
'幻想「世界遗产·佐渡金银弹」' =>Array('class'=>'darkviolet'),
'超妖精「深蓝儿童」' =>Array('class'=>'blue'),
'宝具「炼金银剑超级时镰」' =>Array('class'=>'darkcyan'),
'禁忌「生命炼金 - Hollow Friends」' =>Array('class'=>'seagreen'),
'橙符「沙漠色的热风」' =>Array('class'=>'orange'),
'赤符「红色箭羽选中你了!」' =>Array('class'=>'red'),
'紫符「佐渡的紫水晶弹」' =>Array('class'=>'darkviolet'),
'蓝符「木乃伊妖精」' =>Array('class'=>'blue'),
'青符「炼金水剑最后终结」' =>Array('class'=>'darkcyan'),
'绿符「呼唤同伴的绿色石板」' =>Array('class'=>'seagreen'),
); );
$tps_name_lore = Array $tps_name_lore = Array
......
...@@ -39,6 +39,21 @@ function item_npc($itmn, &$data) { ...@@ -39,6 +39,21 @@ function item_npc($itmn, &$data) {
addnpc(7, 0, 1); addnpc(7, 0, 1);
addnpc(7, 1, 1); addnpc(7, 1, 1);
addnpc(7, 2, 1); addnpc(7, 2, 1);
if ($clbpara['randver1'] < 64){
$log .= '【DEBUG】你触发了测试内容!<br>新机制执行官已额外部署进战场!<br>现在寻找并击败他们,<br>并且搜寻他们的ID卡吧!<br>';
addnpc(7, 3, 1);
addnpc(7, 4, 1);
addnpc(7, 5, 1);
}
addnews($now, 'secphase', $name, $nick);
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
} elseif ($itm == '挑战者之印Ⅱ') {
include_once GAME_ROOT . './include/system.func.php';
$log .= '你已经呼唤了幻影执行官,现在寻找并击败他们,<br>并且搜寻他们的ID卡吧!<br>';
addnpc(7, 3, 1);
addnpc(7, 4, 1);
addnpc(7, 5, 1);
addnews($now, 'secphase', $name, $nick); addnews($now, 'secphase', $name, $nick);
$itm = $itmk = $itmsk = ''; $itm = $itmk = $itmsk = '';
$itme = $itms = 0; $itme = $itms = 0;
......
...@@ -249,6 +249,12 @@ function trap(&$data=NULL){ ...@@ -249,6 +249,12 @@ function trap(&$data=NULL){
$log .= "<span class='yellow'>「种火IV」使{$name}受到的所有伤害变为0!</span><br>"; $log .= "<span class='yellow'>「种火IV」使{$name}受到的所有伤害变为0!</span><br>";
$damage = 0; $damage = 0;
} }
# 「勇谍」效果判定:
elseif(!empty($data['clbpara']['skill']) && in_array('npc_perfectspy', $data['clbpara']['skill']))
{
$log .= "<span class='yellow'>{$name}可谓完美间谍,久经百战啦!免疫了陷阱伤害!</span><br>";
$damage = 0;
}
else else
{ {
# 计算陷阱伤害 # 计算陷阱伤害
......
...@@ -585,6 +585,62 @@ namespace revattr ...@@ -585,6 +585,62 @@ namespace revattr
{ {
global $log,$nosta; global $log,$nosta;
# 「指像」效果判定:
if(($pa['type'] && !empty($pa['clbpara']['skill']) && in_array('npc_wisp', $pa['clbpara']['skill']) && !$pd['type']) ||
($pd['type'] && !empty($pd['clbpara']['skill']) && in_array('npc_wisp', $pd['clbpara']['skill']) && !$pa['type']))
{
$is_target = false;
// 检查玩家是否在NPC的目标列表中
if($pa['type'] && !empty($pa['clbpara']['skillpara']['npc_wisp']['targets']))
{
$targets = $pa['clbpara']['skillpara']['npc_wisp']['targets'];
if(in_array($pd['pid'], $targets)) $is_target = true;
}
elseif($pd['type'] && !empty($pd['clbpara']['skillpara']['npc_wisp']['targets']))
{
$targets = $pd['clbpara']['skillpara']['npc_wisp']['targets'];
if(in_array($pa['pid'], $targets)) $is_target = true;
}
// 如果玩家不在目标列表中,伤害变为0
if(!$is_target)
{
$npc_name = $pa['type'] ? $pa['nm'] : $pd['nm'];
$player_name = $pa['type'] ? $pd['nm'] : $pa['nm'];
$log .= "<span class='yellow'>「指像」技能发动!{$player_name}不是{$npc_name}的目标,伤害变为0!</span><br>";
return 0;
}
}
# 「来潮」效果判定:
if((!empty($pa['clbpara']['skill']) && in_array('npc_mecstasy', $pa['clbpara']['skill']) && !empty($pa['clbpara']['skillpara']['npc_mecstasy']['active'])) ||
(!empty($pd['clbpara']['skill']) && in_array('npc_mecstasy', $pd['clbpara']['skill']) && !empty($pd['clbpara']['skillpara']['npc_mecstasy']['active'])))
{
# 检查是否对种火玩家无效
if((!empty($pd['clbpara']['skill']) && (in_array('fireseed3', $pd['clbpara']['skill']) || in_array('fireseed4', $pd['clbpara']['skill']))) || $pd['def'] > 10000)
{
$log .= "<span class='red'>{$pa['nm']}展开了Ecstasy Mode结界!但{$pd['nm']}早已不受这种东西的影响了!</span><br>";
return 0;
}
# 检查防守方是否有「勇谍」技能且HP大于200
if(!empty($pd['clbpara']['skill']) && in_array('npc_perfectspy', $pd['clbpara']['skill']) && $pd['hp'] > 200 && $pd['hp'] - $pa['wepe'] < 200)
{
# 先记录「来潮」效果的文案
$log .= "<span class='red'>「{$pa['nm']}展开了Ecstasy Mode结界!武器直接造成了等同于其效果值的真实伤害!</span><br>";
# 然后计算「勇谍」效果保护后的伤害
$damage = $pd['hp'] - 200;
$log .= "<span class='yellow'>「勇谍」技能发动!{$pd['nm']}的生命值不会低于200!</span><br>";
return $damage;
}
$damage = $pa['wepe'];
$log .= "<span class='red'>「{$pa['nm']}展开了Ecstasy Mode结界!武器直接造成了等同于其效果值的真实伤害!</span><br>";
return $damage;
}
# 黑熊吃香蕉事件: # 黑熊吃香蕉事件:
if($pa['type'] && in_array('X',$pa['ex_keys'])) if($pa['type'] && in_array('X',$pa['ex_keys']))
{ {
...@@ -778,6 +834,14 @@ namespace revattr ...@@ -778,6 +834,14 @@ namespace revattr
$base_atk_per += $wth_atk_per+$pls_atk_per+$pose_atk_per+$tac_atk_per; $base_atk_per += $wth_atk_per+$pls_atk_per+$pose_atk_per+$tac_atk_per;
$base_atk_per = $base_atk_per > 0 ? $base_atk_per : 1; $base_atk_per = $base_atk_per > 0 ? $base_atk_per : 1;
# 「解放」技能判定:基础攻击力增加
if(!empty($pa['clbpara']['skill']) && in_array('npc_wrelease', $pa['clbpara']['skill']) && !empty($pa['clbpara']['skillpara']['npc_wrelease']['active']))
{
$level = isset($pa['clbpara']['skillpara']['npc_wrelease']['level']) ? $pa['clbpara']['skillpara']['npc_wrelease']['level'] : 2;
$base_att *= $level;
if(!$tooltip) $log .= "<span class='yellow'>{$pa['nm']}进行了野生解放,基础攻击力增加了{$level}倍!</span><br>";
}
# 计算受伤状态对pa攻击力的修正 # 计算受伤状态对pa攻击力的修正
$inf_atk_per = 100; $inf_atk_per = 100;
if(!empty($pa['inf'])) if(!empty($pa['inf']))
...@@ -822,6 +886,15 @@ namespace revattr ...@@ -822,6 +886,15 @@ namespace revattr
if(!isset($pd['wep_kind'])) get_wep_kind($pd); if(!isset($pd['wep_kind'])) get_wep_kind($pd);
# pd基础防御力: # pd基础防御力:
$base_def = $pd['def']; $base_def = $pd['def'];
# 「解放」技能判定:基础防御力增加
if(!empty($pd['clbpara']['skill']) && in_array('npc_wrelease', $pd['clbpara']['skill']) && !empty($pd['clbpara']['skillpara']['npc_wrelease']['active']))
{
$level = isset($pd['clbpara']['skillpara']['npc_wrelease']['level']) ? $pd['clbpara']['skillpara']['npc_wrelease']['level'] : 2;
$base_def *= $level;
if(!$tooltip) $log .= "<span class='yellow'>{$pa['nm']}进行了野生解放,基础防御力增加了{$level}倍!</span><br>";
}
# pd装备提供防御力: # pd装备提供防御力:
$equip_def = $pd['arbe']+$pd['arhe']+$pd['arae']+$pd['arfe']; $equip_def = $pd['arbe']+$pd['arhe']+$pd['arae']+$pd['arfe'];
# 是否受pa冲击效果影响: # 是否受pa冲击效果影响:
...@@ -1945,6 +2018,13 @@ namespace revattr ...@@ -1945,6 +2018,13 @@ namespace revattr
$fin_dmg = 1; $fin_dmg = 1;
return $fin_dmg; return $fin_dmg;
} }
# 「勇谍」效果判定:
if(!empty($pd['clbpara']['skill']) && in_array('npc_perfectspy', $pd['clbpara']['skill']) && $pd['hp'] > 200 && ($pd['hp'] - $fin_dmg) < 200)
{
$fin_dmg = $pd['hp'] - 200;
$log .= "<span class='yellow'>{$pd['nm']}身经百战的经验让其留了一口气脱出了战斗!</span><br>";
return $fin_dmg;
}
# 「奇机」效果判定: # 「奇机」效果判定:
if(isset($pd['skill_tl_2ndchance']) && $fin_dmg > $pd['hp'] && $pd['hp'] > 1) if(isset($pd['skill_tl_2ndchance']) && $fin_dmg > $pd['hp'] && $pd['hp'] > 1)
...@@ -2374,6 +2454,80 @@ namespace revattr ...@@ -2374,6 +2454,80 @@ namespace revattr
# 将pa造成的伤害记录在pd的成就里 # 将pa造成的伤害记录在pd的成就里
if(!$pd['type'] && $pa['final_damage'] >= 1000000) $pd['clbpara']['achvars']['takedmg'] = $pa['final_damage']; if(!$pd['type'] && $pa['final_damage'] >= 1000000) $pd['clbpara']['achvars']['takedmg'] = $pa['final_damage'];
# 「破虹」效果判定:
if(!empty($pd['clbpara']['skill']) && in_array('npc_overrainbow', $pd['clbpara']['skill']) && $pa['final_damage'] >= 1000)
{
// 进行d20暗骰
include_once GAME_ROOT.'./include/game/dice.func.php';
$dice_result = diceroll(20);
// 大成功(20):不反弹伤害
if($dice_result == 20)
{
$log .= "<span class='minirainbow'>{$pd['nm']}发动了禁咒反「Over The Rainbow」!<br>七色的弹幕扑面而来!</span><br>";
$log .= "<span class='yellow'>但大概是因为奇迹保佑,七色弹幕被完全躲开了!</span><br>";
}
// 大失败(1):伤害变为777.77倍
elseif($dice_result == 1)
{
$log .= "<span class='minirainbow'>{$pd['nm']}发动了禁咒反「Over The Rainbow」!<br>七色的弹幕扑面而来!</span><br>";
$log .= "<span class='minirainbow'>弹幕组成了真正意义上无缝的七色虹彩!</span><br>";
// 计算新伤害
$reflected_damage = round($pa['final_damage'] * 777.77);
// 对攻击者造成伤害
$pa['hp'] -= $reflected_damage;
if($pa['hp'] < 0) $pa['hp'] = 0;
$log .= "<span class='minirainbow'>{$pa['nm']}无法躲闪,被弹幕糊了一脸,受到了{$reflected_damage}点伤害!</span><br>";
// 处理攻击者被弹死
if($pa['hp'] <= 0)
{
include_once GAME_ROOT . './include/state.func.php';
death ( 'sdestruct' ); #暂时借用一下我头四物品的死法,反正蛮适合的
}
// 如果攻击者不是玩家,更新数据库
if($pa['type'])
{
$query = "UPDATE {$tablepre}players SET hp='{$pa['hp']}' WHERE pid='{$pa['pid']}'";
$db->query($query);
}
}
// 普通结果:反弹伤害
else
{
$log .= "<span class='minirainbow'>{$pd['nm']}发动了禁咒反「Over The Rainbow」!<br>七色的弹幕扑面而来!</span><br>";
$log .= "<span class='minirainbow'>{$pa['nm']}被卷入了{$pd['nm']}的弹幕之中!</span><br>";
// 对攻击者造成伤害
$pa['hp'] -= $pa['final_damage'];
if($pa['hp'] < 0) $pa['hp'] = 0;
$log .= "<span class='yellow'>{$pa['nm']}被弹幕击中,受到了{$pa['final_damage']}点伤害!</span><br>";
// 处理攻击者被弹死
if($pa['hp'] <= 0)
{
include_once GAME_ROOT . './include/state.func.php';
death ( 'sdestruct' ); #暂时借用一下我头四物品的死法,反正蛮适合的
}
// 如果攻击者不是玩家,更新数据库
if($pa['type'])
{
$query = "UPDATE {$tablepre}players SET hp='{$pa['hp']}' WHERE pid='{$pa['pid']}'";
$db->query($query);
}
// 防守者不受伤害
//$pd['hp'] += $pa['final_damage'];
//$pa['final_damage'] = 0;
}
}
# 核武器效果判定 # 核武器效果判定
if(!empty($pa['weppara']['isNuclearWeapon'])) if(!empty($pa['weppara']['isNuclearWeapon']))
{ {
......
This diff is collapsed.
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