新版太阳神三国杀武将扩展学习手册(II)编者:独孤安河、啦啦SLG、幽蓝风暴技术指导:啦啦SLG首发:百度安河精品吧(百度文库收藏版)编写说明《新版太阳神三国杀武将扩展学习手册》(以下简称“学习手册”)自2012年12月12日在太阳神三国杀Lua吧正式发布以来,很荣幸地得到了广大吧友们高度的认可和好评。而学习手册中存在的各类问题,也得到了各位吧友的理解和热心的指正。在此,由衷地感谢吧友们对学习手册的支持。本手册作为学习手册的续篇,依然是对编者观察和学习太阳神三国杀武将扩展行为的一份整理和总结,其编写目的、适用群体和表述方式与学习手册都是一致的。本手册从2013年3月3日开始编写,至2014年6月18日完稿,前后跨越472天,实际用时61天,完成了全册二十八个章节共187页的编写活动,并最终于2015年7月1日在安河精品吧正式发布。本手册的编写经历了几个不同的时期。最初的5天,也就是从2013年3月3日至3月7日,基本上延续了第一部的编写节奏,完成了前四章的内容;而在开始编写第五章时,因故中止。从4月7日开始,因受到太阳神三国杀开发组的鼎力支持,编写工作得以继续。至5月23日,陆续完成了第五章至第八章的内容,以及多个后续章节的设计。在开始编写第九章时,由于某些技术细节需要确认,同时开发组因准备发布新版本的太阳神三国杀(即后来的端午序曲版,版本号:20130610)而时间紧张,编写工作再次进入停滞状态。2013年11月19日,编写工作重新启动,并在当天完成了第九章的内容。之后又在12月21日完成了第十章、12月31日完成第十一章,在2014年1月16日完成了第十二章,然后第三次转入停工修整状态。好在这一次的沉寂并没有持续很长时间,而且带来了效率上的极大提升。5月11日落笔当天便完成了第十三章,紧接着于5月15日完成了第十四章、5月16日完成第十五章至第十八章、6月5日完成第十九章至第二十四章、6月17日完成第二十五章和第二十六章。在6月18日完成了最后两章的内容之后,对本手册内容的编写工作也就正式宣告结束了。由于本手册的内容主要适用于太阳神三国杀元宵版(版本号:20130224),而完篇时太阳神三国杀的最新版本为世界人权版(版本号:20131210)及其玉兔补丁(版本号:20131217),在代码层面的变化较大,使得本手册已不能完全适用于最新版本,因此为了避免误导某些不明真相的吧友,本手册未能于编写完成后及时与各位吧友见面。在此对因此为各位吧友带来的不便表示万分的歉意。本手册的编写过程中,得到了许多来自太阳神三国杀开发组和热心吧友们的支持,在此向所有帮助和支持过本手册编写工作的朋友、特别是对本手册提供技术指导的吧友啦啦SLG表示衷心的感谢。考虑到本手册断断续续的编写经历,以及编者自身的水平所限,本手册中不免存在各类问题和缺陷,还请广大读者、吧友们多加留意并加以指正。再次对各位朋友的理解和支持致以谢意。祝吧友们学习进步!编者:独孤安河、啦啦SLG、幽蓝风暴2015年7月1日目录第一章:聊聊天,叙叙旧第二章:摸牌堆控制术:观星与攻心一、观星二、攻心第三章:隐藏技能第四章:触发机制:将干涉进行到底第五章:获得一个新技能一、技能暗将二、获得自定义技能第六章:限定技与觉醒技一、触发型限定技二、应用型限定技三、觉醒技第七章:动画效果一、动画素材的制作二、启用动画效果第八章:花样百出的摸牌手段第九章:不可回避的问题一、立即命中二、对抗无懈可击第十章:防具亦有杯具时一、无视防具的杀二、防具无效第十一章:不屈的战魂第十二章:死亡威慑第十三章:更改伤害来源第十四章:最中意的面孔第十五章:天下归心一、势力变更二、自定义势力第十六章:限制卡牌的使用次数一、每阶段限一次二、查看卡牌使用次数第十七章:异性之间的话题第十八章:卡牌强化一、突破卡牌使用次数限制二、突破卡牌使用距离限制三、突破卡牌目标数量限制第十九章:引入拼点机制一、发起拼点二、指定拼点第二十章:多张卡牌的移动第二十一章:卡牌的封禁第二十二章:连续发动技能第二十三章:选择花色第二十四章:询问使用卡牌一、询问使用一张杀二、询问使用指定类型的卡牌三、询问使用技能卡第二十五章:多重视为技第二十六章:手牌展示第二十七章:遗计定乾坤第二十八章:系统秘籍一、分发手牌二、阵亡处理三、跳过规则四、底层命令第一章聊聊天,叙叙旧在经过了几个月的学习实践之后,我们对太阳神三国杀的武将扩展行为已经有了一个初步的印象,感觉还是比较得意的。但是世界是物质的,物质是运动的,运动是有规律的,规律是可以被认识的,认识是反复和无限的……(编者:这真的是在聊天?)总之就是随着时代的不断发展进步、源代码的不断变化更新,我们也不能总在原先的层次上停滞不前,适时跨出那么一小步还是很值得期待的~先复习一下已经学会的内容吧。在extensions文件夹中建立一个新的扩展包文件,名字就叫做study2吧。写好一些必要的内容,然后创建一个新武将:猪八戒。(猪八戒:大家好!猴哥介绍我来这镀点金……编者:哦?你好。那边请。)再加上一些图片和配音,就很好了。武将一览中的效果:武将产生后,更多的心思就要花在技能设计上了。太阳神三国杀中的技能包括很多的种类,比如视为技,比如触发技和禁止技什么的。而我们也已经基本上了解了大部分技能的创建方法。更细致地,对诸如体力的变化、卡牌的移动、游戏进程的更改、各类符号的运用甚至技能AI的设计等内容,也都有了一定的印象。其实技能设计也并不像想象中的那样令人无从下手,只要按照技能的描述,将整个技能发动的过程完整清晰地考虑明白,再将这个过程一步步地写出来就可以了。好了,还是说说聊天的事情吧,要知道动手不忘动口也是游戏的一大乐趣呢。等等,先不着急在聊天框子里打字,看看我们为猪八戒写的这个技能如何:这个技能可以在出牌阶段无限次使用,至于说效果……嘿嘿:“聊天:出牌阶段,你可以大吼一声:‘吃我一钉耙!’令全场晕眩三秒钟。”嗯,游戏里的情况就是这样的了:这里我们用到的是一个叫作speak的函数,它的原型是:只有一个参数,那一定就表示我们要说的话了。这个函数可以把我们的话发送到聊天框子里,特别省事。这下一定没人敢和我们比打字速度了~哈哈。还是不要得意得这么早了吧:逆水行舟,不进则退。更多的学习内容,好像才刚刚开始……第二章摸牌堆控制术:观星与攻心一、观星说起这摸牌堆的控制,主要还是在牌堆顶或牌堆底做些动作。目前可行的方法有两个:观星,还有攻心。这两个方法在Room老兄那里都是有专门的函数负责的。好了,我们还是先看看第一个方法——观星是怎么回事吧。这里的观星和诸葛亮的技能“观星”还有所不同的。只要是以任意顺序将一些卡牌放到牌堆顶,将另一些卡牌放到牌堆底的过程,都可以认为是观星了。当前涉及到观星的技能有“观星”、“超级观星”以及“心战”三个。负责实现观星的方法是Room的成员函数askForGuanxing,它的函数原型是这样的:askForGuanxing(zhuge,cards,up_only)这个函数中提到了三个参数,其中:zhuge:表示被询问观星的角色;cards:表示将在观星过程中被安置的所有卡牌的编号列表,也就是那些所谓的“星星”了。up_only:表示是否只是在牌堆顶部安排“星星”。如果填true,就像心战那样,只能把牌放到牌堆顶;而如果是false,那么就可以将一些牌埋在牌堆底了。考虑到猪八戒一路奔波舟车劳顿,就设计个容易的技能吧:“天变:出牌阶段,你可以将至多四张牌以任意顺序置于牌堆顶或牌堆底。”显然,这是一个视为技,由于没有要求视为一张已有的卡牌,所以我们选择用视为一张技能卡来实现。技能卡部分:视为技部分:接下来,我们要在技能卡的on_use部分实现具体的观星过程。askForGuanxing需要三个参数,第一个是执行观星的角色,那显然要填on_use里的那个参数source了!很好,得来毫不费功夫。第二个参数是参与观星的卡牌的编号列表,具体到这个技能上,就需要用到那些我们选出来发动技能的卡牌了。可是,在这个技能卡里,怎么能找到这些卡牌呢?在视为技的view_as部分,我们是用addSubcard函数将这些卡牌填充到这张技能卡中的。既然明确了有这样的一层关系,当然要好好利用一下。注意到技能卡的on_use部分,参数self正是用来表示这张技能卡的,那么几乎可以认定,这就是突破口了。为了获得一张技能卡中填充的卡牌,要用到Card先生的一个成员函数:getSubcards()。这个函数很简单,不需要参数就能用。它的结果是一个列表,其实就是这张技能卡中填充的所有卡牌的编号的列表了。诶?askForGuanxing的第二个参数也要卡牌编号的列表诶!今天真是个好日子~至于第三个参数,由于我们要在牌堆底和牌堆顶两处安排卡牌,所以当然要写false了。于是技能卡on_use部分的代码就应该是这样的:这样就完成了。到游戏中体验一下吧!看!我们有一张无中生有哦!很幸运吧?不过我们还是先发动一下“天变”改变一下摸牌堆的。选取了一张黑桃8的杀、一张黑桃9的酒和一张草花2的藤甲发动机能:观星中……把杀放到牌堆底,然后把藤甲和酒换个位置:好了,观星结束,手里还有三张牌。然后怀着满心的期待,打开了无中生有,但是……啊!草花2的藤甲!黑桃9的酒!又回来了!这点,游戏记录里还是说得很清楚的:大功告成~不过看样子,以后还是先用无中生有再发动技能吧……二、攻心明白观星是怎么回事了,接下来我们再体验一下攻心吧!攻心是控制牌堆的另一种方法,它可以将一名角色的一张红心手牌弃置或置于牌堆顶,进而影响摸牌堆的组成。负责攻心的方法是Room老兄的成员函数doGongxin,它的函数原型是:doGongxin(shenlvmeng,target)这里有两个参数:shenlvmeng:表示发动攻心的当前角色。target:表示被攻心的目标角色。由于攻心的过程是确定的,而且强度足够支撑起一个技能了,所以其实这个方法不是很常用,只在技能“攻心”中出现过。(编者:要不怎么会给它起这个名字呢?)现在我们将设计这样的一个技能:“戏月:回合开始阶段开始时,你可以观看一名角色的手牌,将其中的一张红心牌弃置或置于牌堆顶。”其实就是将“攻心”改成回合开始时触发发动了,那么这显然是一个触发技,发动的时机是阶段开始时(sgs.EventPhaseStart)。执行攻心的过程就交给函数doGongxin了,不过先要提供它需要的那两个参数shenlvmeng和target才行。shenlvmeng显然就是on_trigger里的player参数了,表示当前发动攻心的角色。但是……谁是target?应该是我们从所有存活角色中任选一个吧。用Room兄的getAlivePlayers函数获得所有存活角色列表,然后用askForPlayerChosen函数询问选择其中的一名角色,这个套路我们在当年移除私家牌堆中的卡牌时还是见过的,这次还这么干就好。那么这部分的代码就应该是这样的:可以了,到游戏中看看吧——选择对面的姜维,这是由askForPlayerChosen控制的部分。当然,也可以选择自己啦。哦?有张红心K的爪黄飞电!双击选中它~这么好的东西当然要归我们猪八戒所有了!果断选择“置于牌堆顶”。结果就是这样:摸到了两张牌,第一张就是那个爪黄飞电!哈哈哈哈……第三章隐藏技能不是吧?在我们如此兴高采烈地设计技能时,这个八戒竟然在一旁睡觉!怪不得半天都没听到他的评论呢。好,那就逗他一下吧:“酣睡:回合结束阶段开始时,你可以摸四张牌并将武将牌翻面。若如此做,其它角色与你计算距离时始终-1,直到你的下个回合开始。”回合结束阶段开始时,那一定是一个触发技了,技能的内容是摸牌和翻面,都是很容易做到的事情。但是,距离呢?看样子这里又是距离修改技的地盘了。如果说,这是两个分开的技能就好了,比如这样:“酣睡一:回合结束阶段开始时,你可以摸四张牌并将武将牌翻面,进入酣睡状态。”“酣睡二:在你处于酣睡状态时,其它角色与你计算的距离始终-1。”“酣睡一”是一个标准的触发技,而“酣睡二”作为距离修改技也很好理解。我