趣百科

编写太阳神三国杀Lua基础教程

编辑:Simone 2024-12-26 04:19:19 555 阅读

编写太阳神三国杀Lua基础教程

太阳神三国杀,是一款基于C++ QT GUI框架的三国杀非官方开源软件,开发者:Moligaloo(太阳神上),现由Mogara团队,继续更新。拥有智能AI可以实现联机和单机的两种游戏方式,并能通过DIY接口进行自由的个性化修改和添加更多元素。本经验教你编写属于自己的lua!(基础教程)适用于1217(V2)版。

在开始之前我们了解下lua。

Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。

脚本语言,被嵌入到太阳神三国杀里面运行!

认识一个包最基本的定义语句(不知道我的语言新手们能否看懂。。):

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

extension = sgs.Package("xxx", sgs.Package_CardPack)

其中“sgs.Package_CardPack”是定义该包的类型,CardPack为手牌,武将包这样写:

extension = sgs.Package("xxx")

这样一个合格的空白包就做好了!

不过呢,英文看着多不爽啊,所以再写一点翻译的东西吧。

用sgs.LoadTranslationTable创建翻译标签,然后把我们会在游戏中看到的内容写进去。翻译的格式是:["原文"] = "译文"每两条翻译之间用英文逗号分割。(lua对大小写、逗号有严格要求哦!)

比如我的包名为study,那么在里面写入语句:

["study"] = "学习包",

最后效果:

sgs.LoadTranslationTable{

["study"] = "学习包",

}

这样在游戏中就显示为“学习包”。

将lua拖入extensions文件夹,打开游戏,

此时一个名为“study”的扩展包就被添加成功了!

创建新武将的话,首先也是要先想好武将的名字。但是这件事情就简单多了,一般来说都是用TA的姓名的汉语拼音直接作为名字的。比如司马懿的名字叫做simayi就可以了。武将的名字比起扩展包的名字就随意了些,大小写字母的组合都可以,不过最好不要使用下划线的。不变的要求依然是:不许重名!

那么,我们的新武将名为herobrine(mc里面的恐怖生物)吧!

创建一个新武将的函数原型为:

sgs.General(package,name,kingdom,max_hp=4,male=true,hidden=false,never_shown=false)

对应值:

sgs.General(包名, 武将名, 势力, 体力上限, 性别, 隐藏, 完全隐藏)

①package(扩展包):统一写extension就行了。②name(姓名):没忘刚才好不容易起的名字吧?herobrine,就它了!另外,如果是主公武将,需要在名字后面加上$符号,来显示这个武将"超凡脱俗"的气质。比如曹操就是caocao$什么的。③kingdom(所属势力):势力的拼音,比如吴就是wu。(ps:神是god不是shen)

④male(性别):填true就是男性,填false就是女性,……什么都不写也是男性!

根据函数原型,我们创建一个名为“herobrine”的男性角色!

herobrine = sgs.General(extension, "herobrine", "god", "6")

再写上翻译,启动游戏,发现“him”武将!

一个白板6血武将创建成功!

白板武将虽然不算弱,但是游戏体验还是差了点。解决方法?添加个技能吧。比如说……遗计。。

herobrine:addSkill("yiji")

像addskill这样的称之为函数。各种函数结合在一起才能顺利完成各种操作!

addskill拥有两种用法,其函数原型为:

1、addskill(skill)

2、addskill(skill_name)

skill是一个对象,添加一个脚本中已定义的新技能,而skill_name是一个string(字符串),用来添加一个已经存在的技能。

addskill在sgs.General下工作于sgs.General,所以addskill是sgs.General的成员函数。

武将有了技能,就该出来亮相了。但是总不能老让人家裸奔吧?该有的美化工作还是要有的。武将的美化,大体来说分为三个部分:武将卡牌、武将头像以及武将标签。

打开太阳神三国杀,在最上面找到DIY菜单,里面有个卡牌编辑器,在里面进行各种编辑,这部分教程与主题不太贴,就一代而过了,需要的童鞋到网上找教程吧!

只添加他人的技能是不是不够过瘾?好了,重点 was arrived.打造真正拥有自己个性的新技能!

听说周瑜因为长得帅所以能多摸牌?我们美猴王孙悟空怎么样?摸死你!

写一份英姿的代码吧:

LuaYingzi = sgs.CreateTriggerSkill{

name = "LuaYingzi",

frequency = sgs.Skill_Frequent,

events = {sgs.DrawNCards},

on_trigger = function(self, event, player, data)

local room = player:getRoom()

if room:askForSkillInvoke(player, "LuaYingzi", data) then

local count = data:toInt() + 1

data:setValue(count)

end

end

}

看见函数“toInt() + 1”了吗?我们就在这里下手,多摸10张!toInt() + 10

把整个技能代码段选中,CTRL+H把替换窗口叫出来。原来的技能叫什么来着……LuaYingzi,嗯就是它,写在“查找目标”那里。再起个新名字,就叫LuaHerobrine好了,写在“替换为”那里。

别忘了写翻译!

最后addskill(skill)注意不是skill_name!

herobrine:addskill(LuaHerobrine)

至此一个6血神势力武将就OK了!

至此武将基本教程结束!

较为简单,使用

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

extension = sgs.Package("xxx", sgs.Package_CardPack)

定义手牌包!

添加一张手牌的函数原型为:

xxx = sgs.CreateTrickCard{

name,

class_name,

subtype,

target_fixed,

can_recast,

suit,

number,

on_effect,

end,

}

“CreateTrickCard”为单体锦囊

CreateArmor为防具

CreateWeapon为武器

防具、武器的原型与锦囊不同!

例如,我们添加一张“三顾茅庐”卡牌,目标摸三张牌,目标武将牌翻面。

则代码为:

sgml = sgs.CreateTrickCard{

name = "sgml",

class_name = "sgml",

subtype = "single_target_trick",

target_fixed = false,

can_recast = true,

suit = sgs.Card_Spade,

number = 1,

on_effect = function(self, effect)

effect.to:drawCards(3)

effect.to:turnOver()

end,

}

name为卡牌名,class_name为类名,与name保持一致即可,subtype为卡牌类型,can_recast能否重铸,suit花色,number点数,on_effect使用后执行其成员函数的效果,effect.to是目标,effect.from是效果来源,drawCards函数,摸牌函数,turnOver函数,翻面。

drawCards的函数原型为drawCards(X)

turnOver的函数原型为void turnOver()

编写好了,但游戏中还没有?这在于我们没有setParent(相当于addskill),用法:

xxx:setParent(extension)

但是这种方法用一次只加一张,如何大规模添加呢?就像杀,数十张,serParent就显得力不从心了,此时我们需要定义过程。

我们需要一个大批量添加卡牌的过程,我们取名为“addcard”的过程,其代码为:

addcard = function(card, snn)

local n = #snn

for i=1, n, 2 do

local tcard = card:clone()

tcard:setSuit(snn[i])

tcard:setNumber(snn[i+1])

tcard:setParent(extension)

end

end

该自定义过程的用法为 addcard(xxx ,{suit, number})

例如我要添加一张黑桃A一张方片K,则写成:

addcard(sgml ,{sgs.Card_Spade, 1, sgs.Card_Diamond, 13})

翻译标签中,
表示换行,即Enter键。

版权声明:本站【趣百科】文章素材来源于网络或者用户投稿,未经许可不得用于商用,如转载保留本文链接:https://www.qubaik.com/answer/109393.html

相关推荐