多语言展示
当前在线:379今日阅读:60今日分享:41

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

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

太阳神三国杀

2

Notepad++

初步编写武将牌
1

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

2

认识一个包最基本的定义语句(不知道我的语言新手们能否看懂。。):module('extensions.xxx', package.seeall)  extension = sgs.Package('xxx', sgs.Package_CardPack)其中“sgs.Package_CardPack”是定义该包的类型,CardPack为手牌,武将包这样写:extension = sgs.Package('xxx')这样一个合格的空白包就做好了!

3

不过呢,英文看着多不爽啊,所以再写一点翻译的东西吧。用sgs.LoadTranslationTable创建翻译标签,然后把我们会在游戏中看到的内容写进去。翻译的格式是:['原文'] = '译文'每两条翻译之间用英文逗号分割。(lua对大小写、逗号有严格要求哦!)比如我的包名为study,那么在里面写入语句:['study'] = '学习包',最后效果:sgs.LoadTranslationTable{['study'] = '学习包',}这样在游戏中就显示为“学习包”。将lua拖入extensions文件夹,打开游戏,此时一个名为“study”的扩展包就被添加成功了!

4

创建新武将的话,首先也是要先想好武将的名字。但是这件事情就简单多了,一般来说都是用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血武将创建成功!

5

白板武将虽然不算弱,但是游戏体验还是差了点。解决方法?添加个技能吧。比如说……遗计。。herobrine:addSkill('yiji')像addskill这样的称之为函数。各种函数结合在一起才能顺利完成各种操作!addskill拥有两种用法,其函数原型为:1、addskill(skill)2、addskill(skill_name)skill是一个对象,添加一个脚本中已定义的新技能,而skill_name是一个string(字符串),用来添加一个已经存在的技能。addskill在sgs.General下工作于sgs.General,所以addskill是sgs.General的成员函数。

6

武将有了技能,就该出来亮相了。但是总不能老让人家裸奔吧?该有的美化工作还是要有的。武将的美化,大体来说分为三个部分:武将卡牌、武将头像以及武将标签。打开太阳神三国杀,在最上面找到DIY菜单,里面有个卡牌编辑器,在里面进行各种编辑,这部分教程与主题不太贴,就一代而过了,需要的童鞋到网上找教程吧!

7

只添加他人的技能是不是不够过瘾?好了,重点 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了!至此武将基本教程结束!

初步编写手牌
1

较为简单,使用module('extensions.xxx', package.seeall)  extension = sgs.Package('xxx', sgs.Package_CardPack)定义手牌包!

2

添加一张手牌的函数原型为:xxx = sgs.CreateTrickCard{name,class_name,subtype,target_fixed,can_recast,suit,number,on_effect,end,}“CreateTrickCard”为单体锦囊CreateArmor为防具CreateWeapon为武器防具、武器的原型与锦囊不同!

3

例如,我们添加一张“三顾茅庐”卡牌,目标摸三张牌,目标武将牌翻面。则代码为: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()

4

编写好了,但游戏中还没有?这在于我们没有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) endend该自定义过程的用法为 addcard(xxx ,{suit, number})例如我要添加一张黑桃A一张方片K,则写成:addcard(sgml ,{sgs.Card_Spade, 1, sgs.Card_Diamond, 13})翻译标签中,
表示换行,即Enter键。

注意事项

本教程仅仅适用于零基础新手,高级教程我以后出!

推荐信息