太陽神三國殺,是一款基於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”的擴充套件包就被新增成功了!
建立新武將的話,首先也是要先想好武將的名字。但是這件事情就簡單多了,一般來說都是用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鍵。
注意事項
本教程僅僅適用於零基礎新手,高階教程我以後出!