太阳神三国杀lua教程

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

--大家好我是hypercross。

--从这个文件开始讲解DIY接口的用法。

--首先,这个文件说明DIY需要的文件及其结构。

--DIY是以module的形式存在的。每个Module即是一个UTF8格式的Lua文件(建议用notepad++编辑),包含如下格式的代码:

module("extensions.moligaloo", package.seeall)

-- 进入module。这里moligaloo这个词必须和文件名相同。

extension = sgs.Package("moligaloo")

-- 创建扩展包对象。变量名必须为extension。参数名为扩展包的objectName,也是通常会使用的扩展包标识

shiqian = sgs.General(extension, "shiqian", "qun")

-- 创建武将对象,这里我们的武将是时迁。关于武将属性的详细说明见reference文档。

shentou = sgs.CreateViewAsSkill{

--创建技能,技能种类为ViewAsSkill。这里的技能是“出牌阶段,你可以将任意一张梅花手牌当作顺手牵羊使用。”

name = "shentou",

n = 1,

view_filter = function(self, selected, to_select)

return to_select:getSuit() == sgs.Card_Club and not to_select:isEquipped() end,

view_as = function(self, cards)

if #cards == 1 then

local card = cards[1]

local new_card =sgs.Sanguosha:cloneCard("snatch", card:getSuit(), card:getNumber())

new_card:addSubcard(card:getId())

new_card:setSkillName(self:objectName())

return new_card

end

end

}--关于技能的说明将是几乎所有其他帮助文件的重点。此处省略。

sgs.LoadTranslationTable{

["shentou"] = "神偷",

[":shentou"] = "你可以将你的梅花手牌当做顺手牵羊使用。",

}

--此段为翻译,将技能名称与描述中文化,否则你将会看到拼音

shiqian:addSkill(shentou)

--将神偷技能赋予时迁

--你可以将本文件保存至extension目录下的moligaloo.lua并启动游戏。此时扩展包即已经被添加至游戏。

--为了完善DIY扩展包,需要将音频、图片以及翻译代码放到指定目录。这一点将在其他文档中说明。

--技能详解1:ViewAsSkill(视为技,也叫视作技)

--在太阳神三国杀中,常用的基本技能是两种:触发技和视为技。我们使用这两种基本技能的复合来完成大多数复杂的技能。

--此外,我们还有距离技,禁止技等特殊类型的技能,它们用于实现某些某种程度上“要求改变游戏系统” 的技能。

--触发技可以用来实现”在某个时机,满足发动条件时,执行某个效果(包括做出选择)这样的技能。

--触发技也可以用来改变游戏事件而不仅是单纯的产生效果。比如,放弃摸牌阶段并执行xx 这样的技能也可以用触发技实现。

--事实上,一个触发技就是一条游戏规则。如果某名武将具有某个触发技,这个触发技就会被在服务端“注册”成为这局游戏的一条规则。

--被注册的触发技,通常会根据玩家“是否存活”以及玩家的武将“是否具有该技能”来决定是否被执行。

--视为技可以用来实现“可将某牌作为某牌打出”这样的技能。

--视为技的定义对于AI而言是无效的。为了让AI使用视为技,你基本上需要在AI中重新写一遍技能的定义。

--这是因为视为技是在客户端运行的,而AI在服务器端运行;触发技也是在服务端运行。--如果某名玩家具有某个视作技,该技能通常就会被”注册“到该玩家的客户端。这个动作与其他玩家是不相干的。

--总之,视为技负责在客户端管理,有哪些牌可以选中,选中的牌又会被当成什么牌,这样的效果;

--但是视为技的运行本身不影响游戏进程;视为技做的事情是通过将特定的牌(甚至没有牌)“视为”特定的牌,

--来允许你使用那张本来不存在的牌。这也是大多数”主动技能“的实现方式。

--距离技和禁止技则分别用于实现“修改玩家间的距离”,以及“某人不能对某人使用某牌”这样的效果。

--与其他两种技能不同,距离技和禁止技不需要在某局游戏中注册:距离技是永远生效。

--也就是说,如果你写了一个距离技能叫”所有玩家间的距离-1“,那么无论场上有没有玩

家具有这个技能,

--所有玩家间的距离都会被减一。禁止技也类似。

--这类技能的定义比较新,也比较清楚明了,可能你不需要看文档也能明白。

--正片开始

--首先讲解视为技。

--视为技在Lua中的创建使用了sgs.CreateViewAsSkill方法

-- **程序细节,以下可跳过

--sgs.CreateViewAsSkill方法可以在lua\sgs_ex.lua中找到。

--该方法会创建一个LuaViewAsSkill对象(定义见cpp源码),然后将你定义的Lua函数用于其成员函数。

--注意,本游戏cpp源码部分使用了类的继承重载来实现不同的技能,而在lua的DIY技能里面我们都使用固定的类

--我们通过将会被用作技能成员函数的lua function,直接赋给技能的实例来实现不同的技能。

-- **程序细节部分结束

--视为技在创建时,需要以下方法|变量的定义:

--name, n, view_filter, view_as, enabled_at_play和enabled_at_response

--name:

--一个字符串即技能名称。

--该字段必须定义。(无默认值)

--n:

--整数值,每次发动技能所用牌数的最大值。绝大多数DIY用到的n可能都为1或2.

--默认值为0,即不需要选择自己的任何牌.

--view_filter:

--lua函数,返回一个布尔值,即某张卡是否可被选中以用作发动技能。

--发动技能时,将对所有手牌、装备进行遍历,并执行view_filter方法。返回了true的牌可以被选择用作技能发动。

--传入的参数为self(技能对象本身),selected(lua表,已经选择的所有牌), to_select(当前需判断是否可选中的牌)

--默认为"永远返回false",即如果你没有定义,则这个技能的发动不允许你选择任何牌。

--view_as:

相关文档
最新文档