編寫太陽神三國殺Lua基礎教程?

太陽神三國殺,是一款基於C++ QT GUI框架的三國殺非官方開源軟體,開發者:Moligaloo(太陽神上),現由Mogara團隊,繼續更新。擁有智慧AI可以實現聯機和單機的兩種遊戲方式,並能通過DIY介面進行自由的個性化修改和新增更多元素。本經驗教你編寫屬於自己的lua!(基礎教程)適用於1217(V2)版。

工具/原料

太陽神三國殺

Notepad++

初步編寫武將牌

在開始之前我們瞭解下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”的擴充套件包就被新增成功了!

編寫太陽神三國殺Lua基礎教程

編寫太陽神三國殺Lua基礎教程

建立新武將的話,首先也是要先想好武將的名字。但是這件事情就簡單多了,一般來說都是用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血武將建立成功!

編寫太陽神三國殺Lua基礎教程

編寫太陽神三國殺Lua基礎教程

白板武將雖然不算弱,但是遊戲體驗還是差了點。解決方法?添加個技能吧。比如說……遺計。。

herobrine:addSkill("yiji")

像addskill這樣的稱之為函式。各種函式結合在一起才能順利完成各種操作!

addskill擁有兩種用法,其函式原型為:

1、addskill(skill)

2、addskill(skill_name)

skill是一個物件,新增一個指令碼中已定義的新技能,而skill_name是一個string(字串),用來新增一個已經存在的技能。

addskill在sgs.General下工作於sgs.General,所以addskill是sgs.General的成員函式。

編寫太陽神三國殺Lua基礎教程

編寫太陽神三國殺Lua基礎教程

武將有了技能,就該出來亮相了。但是總不能老讓人家裸奔吧?該有的美化工作還是要有的。武將的美化,大體來說分為三個部分:武將卡牌、武將頭像以及武將標籤。

開啟太陽神三國殺,在最上面找到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了!

至此武將基本教程結束!

編寫太陽神三國殺Lua基礎教程

編寫太陽神三國殺Lua基礎教程

編寫太陽神三國殺Lua基礎教程

編寫太陽神三國殺Lua基礎教程

初步編寫手牌

較為簡單,使用

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鍵。

編寫太陽神三國殺Lua基礎教程

編寫太陽神三國殺Lua基礎教程

注意事項

本教程僅僅適用於零基礎新手,高階教程我以後出!

相關問題答案