在如此欢乐的时节,濒死总归不是一件受待见的事情,但万一真出现了,我们可不能束手待毙。(孙悟空:保卫花果山,猴猴有责!)
</br>这次我们考虑的是在某个武将的濒死时做一些什么事情,那么就不得不留意一下有关濒死的几个技能触发时机:
* Dying(进入濒死状态时)
* AskForPeaches(处于濒死状态时)
* AskForPeachesDone(濒死结算完毕)
</br>一般来说,如果我们创建了一个包含了这些时机的触发技,那么只要场上有任何一名角色濒死,消息会立刻传到我们技能这里。
</br>还记得触发技的允许触发的条件吗?就是那个`can_trigger`函数,它的默认值是“具有本技能并且存活”。所以通常我们的技能即使知道了某个角色正在死亡线上挣扎,也会因为那个武将没有我们的技能而对TA不理不睬。这个条件保证了,即使所有人都遇到了同样的触发时机,也只有拥有技能的人才能使用技能。
</br>所以如果我们要在其它角色的濒死时机做些什么的话,can_trigger是很重要的一项内容,我们需要把它改成“目标存在”之类的条件来解除这些限制。
</br>但是,一旦解除了这个限制,发动技能的时候很可能就不是技能本身的拥有者所在的回合了,这就会使on_trigger函数中的player参数的值并不是拥有技能的那个人,而是当前回合的那位了。
</br>所以为了找到这个的发动来源,我们可以使用Room的一个成员函数,那就是`findPlayerBySkillName`了。它的函数原型是:
```
findPlayerBySkillName(skill_name, include_dead=false)
```
![](https://img.kancloud.cn/3c/aa/3caab0df285094f011e92dbef047a5bb_960x23.png)
</br>其中,`skill_name`就是用来查找的那个技能的名字了,参数`include_dead`表示查找结果里是否可以包括已阵亡的角色,填true就是连死人也算上,填false就是只在活着的角色里找,当然默认是填false了。
</br>与濒死状态有关的内容,还有一个叫作濒死结构体的东西——DyingStruct,它可以为我们记录某个武将濒死时的一些信息,结构方面是这样的:
![](https://img.kancloud.cn/98/da/98dabde361a43a066a085ae1b0103ba2_885x137.png)
</br>具体的内容我们可以从源码(可在群文件里搜索 秒沉水 查找到源码)的src\core\structs.h中找到。
</br>可以看到DyingStruct包含了两个成员变量:`who`和`damage`。
</br>其中:
1. `who`表示处于濒死状态的那个可怜人;
2. `damage`是一个伤害结构体DamageStruct,记载了造成濒死状态的伤害事件的有关信息。如果这个damage的值是nil的话,说明who的濒死是体力流失造成的,没有经过什么伤害!
</br>关于DyingStruct中的信息,我们可以在我们技能的`on_trigger`函数中通过环境数据`data`得到,方法是使用sgs.QVariant提供的toDying()函数。
</br>好了,现在我们为一心要保护花果山的孙悟空提供这样的一个技能吧:
> 护卫:一名其他角色进入濒死状态时,你可以失去1点体力并摸一张牌,令其恢复1点体力。
</br>代码如下:
![](https://img.kancloud.cn/07/db/07dbb51d5eaa1b736a2ddce341f9634f_704x570.png)
</br>其中那个`objectName`是ServerPlayer对象用来查看武将名称的小帮手,我们通过比较`source`和`dest`的名称是否一样来确定濒死的人和拥有技能的人是不是同一位。
</br>到游戏中体验一下救死扶伤的成就感吧!
</br>看好,典韦快挂了!我们孙悟空还体力满满~
![](https://img.kancloud.cn/bc/78/bc782a75e3b329434841b68848ed8356_369x180.png)
</br>再给他一下,让他濒死……
![](https://img.kancloud.cn/1b/63/1b630ea549f9f47e7183cf6509001466_508x399.png)
</br>结果:
![](https://img.kancloud.cn/30/94/30949d860a8e6ff331290a74b93408b2_371x190.png)
</br>看游戏记录就知道发生什么了……
![](https://img.kancloud.cn/29/f4/29f48ed26837d2166d7cc2cf0044f172_216x86.png)
</br>成功!(众猴子:吾主英明!曹丕:我什么都不知道……)
- 编写说明
- 第一章 创建一个新武将
- 1.1 开发环境准备
- 1.2 创建一个新的武将扩展包
- 1.3 创建我们的新武将
- 第二章 添加技能
- 第三章 武将美化
- 3.1 美化环境准备
- 3.2 添加武将卡牌
- 3.3 添加武将头像
- 3.4 添加武将标签
- 第四章 创建一个新技能
- 第五章 添加音效
- 5.1 打造自己的声音工作室
- 5.2 添加技能使用音效
- 5.3 添加武将阵亡音效
- 第六章 添加提示信息
- 6.1 添加代码注释
- 6.2 显示提示信息
- 6.3 启动全屏信息特效
- 第七章 武将变更
- 第八章 启用AI
- 8.1 创建我们的AI文件
- 8.2 真实的AI
- 8.3 动手写AI
- 第九章 修改距离
- 第十章 技能管理
- 10.1 技能判定
- 10.2 创建技能
- 10.3 获得技能
- 10.4 失去技能
- 第十一章 修改手牌上限
- 第十二章 体力变更
- 12.1 流失体力
- 12.2 制造伤害
- 13.3 恢复体力
- 12.4 流失体力上限
- 12.5 增长体力上限
- 第十三章 游戏进程的变更
- 13.1 创建阶段触发技能
- 13.2 跳过回合阶段
- 13.3 插入一个额外的回合阶段
- 13.4 启用翻面
- 13.5 获得一个额外的回合
- 第十四章 启用标记(Mark)
- 14.1 添加标记
- 14.2 获得标记
- 14.3 失去标记
- 14.4 查看标记数目
- 第十五章 卡牌转换
- 15.1 主动牌的转换
- 15.2 被动牌的转换
- 第十六章 卡牌传递
- 16.1 创建摸牌技能
- 16.2 游戏中摸牌
- 16.3 游戏中弃牌
- 16.4 从其他武将处获得牌
- 16.5 判断目标区域是否有牌
- 16.6 移动场上的牌
- 第十七章 用牌实现技能效果
- 第十八章 启用标志(Flag)
- 第十九章 涉足判定领域
- 19.1 启用判定
- 19.2 更改判定
- 19.3 获得判定牌
- 第二十章 私家牌堆
- 20.1 向牌堆中添加牌
- 20.2 查看牌堆中牌的数量
- 20.3 从牌堆中移除牌
- 第二十一章 牌的锁定
- 第二十二章 免疫牌
- 第二十三章 让房间提供牌
- 23.1 提供主动牌
- 23.2 提供被动牌
- 第二十四章 启用标签(Tag)
- 第二十五章 濒死结算
- 第二十六章 交换座次
- 第二十七章 创建主公技
- 27.1 创建由主公发起的主公技
- 27.2 创建由他人发起的主公技
- 第二十八章 强力技能
- 28.1 直接死亡
- 28.2 改换身份
- 28.3 原地复活
- 28.4 立即胜利