菜鳥的只狼Talk詳細(xì)教程(二)

大家好,我是Last孤影眾后面還有一個(gè)點(diǎn),今天專門列個(gè)專欄寫一下只狼中的talk教程。

注意:閱讀本文需要讀者擁有魂系列參數(shù)編輯能力和最基礎(chǔ)的事件編輯能力,想學(xué)習(xí)的可以移步瑣帝BNU的參數(shù)編輯教程和我的事件編輯教程。

一、Talk的組成結(jié)構(gòu)
我們先點(diǎn)開劍圣的talk:112240

這里我推薦大家使用visual studio code打開py文件,這樣無論是查看還是編輯都非常方便,也是我很喜歡用的文本編輯器。
瀏覽整個(gè)talk文件,有很多我們都是不懂的,不過問題不大,因?yàn)槲覀儾⒉恍枰炊袞|西。首先我們可以發(fā)現(xiàn),定義分兩種形式:
一種是t112240_+一個(gè)數(shù)字:

一種是t112240_x+數(shù)字:

我們將前者稱為觸發(fā)對(duì)話,后者成為執(zhí)行對(duì)話(沒錯(cuò)我自己命名的)
觸發(fā)對(duì)話指的是我們需要他來滿足一些條件,來進(jìn)行對(duì)話的觸發(fā),是對(duì)話必不可少的部分;
而執(zhí)行對(duì)話則是在觸發(fā)對(duì)話后執(zhí)行命令的對(duì)話,一般情況觸發(fā)對(duì)話都會(huì)鏈接一些執(zhí)行對(duì)話,這樣我們可以在觸發(fā)后直接跳轉(zhuǎn)到執(zhí)行對(duì)話執(zhí)行命令。
很關(guān)鍵的一點(diǎn):一個(gè)對(duì)話必須至少擁有一個(gè)觸發(fā)對(duì)話,不然它將無法觸發(fā)條件運(yùn)行執(zhí)行對(duì)話
觸發(fā)對(duì)話就像人體的頭部起到一個(gè)接收信息指揮作用,執(zhí)行語句就是軀干,沒有頭部一切都是空談。
而對(duì)于執(zhí)行對(duì)話,也不是毫無規(guī)律的,F(xiàn)S社最喜歡套模板,所以在每個(gè)talk的相同編號(hào)的執(zhí)行對(duì)話的內(nèi)容一般都大同小異,簡(jiǎn)單來說可以總結(jié)為以下東西:

我希望大家在新建talk編輯的時(shí)候也能遵循這個(gè)規(guī)則,不同功能的觸發(fā)對(duì)話選擇相應(yīng)的編號(hào),這樣才不至于亂套,比較關(guān)鍵的是我認(rèn)為esdtool解包并不完全,特別是觸發(fā)對(duì)話里面肯定有很多東西沒有被解包出來,所以大家照著fs社的標(biāo)準(zhǔn)來做準(zhǔn)沒錯(cuò)。
同樣我們需要注意的是,因?yàn)榻獍|發(fā)對(duì)話的不完全,所以新建觸發(fā)對(duì)話是個(gè)風(fēng)險(xiǎn)很大的操作,我的建議是當(dāng)我們需要某種觸發(fā)對(duì)話時(shí),我們應(yīng)當(dāng)找到原版中有類似觸發(fā)對(duì)話的敵人,將該敵人的talk文件復(fù)制并且修改編號(hào)變成我們所需要的talk文件,然后在這個(gè)復(fù)制過來的talk文件內(nèi)做一些修改,而不是新建一個(gè)空白文本自行編輯。
執(zhí)行對(duì)話的意義在于將龐大的內(nèi)容單獨(dú)放到一個(gè)對(duì)話中,并且我們可以在talk中隨時(shí)隨地引用,這個(gè)就類似于c語言中的子函數(shù),我們不建立子函數(shù)也能完成一些操作,但這樣一會(huì)顯得代碼臃腫,例如你也可以把執(zhí)行對(duì)話的內(nèi)容全放在觸發(fā)對(duì)話中,但是這樣觸發(fā)對(duì)話就很龐大,不利于修改;

二來當(dāng)我們需要多次進(jìn)行同一操作時(shí),多次引用執(zhí)行對(duì)話是明顯會(huì)方便很多的;最后一點(diǎn)則在于執(zhí)行對(duì)話可以設(shè)置未知數(shù),讓觸發(fā)對(duì)話提供未知數(shù)的具體數(shù)值帶入進(jìn)行計(jì)算,看起來很像事件中的通用事件,帶入數(shù)值計(jì)算的類型。


二、單個(gè)對(duì)話結(jié)構(gòu)
前面我們談了整個(gè)talk的組成,一般來說是由觸發(fā)對(duì)話和執(zhí)行對(duì)話構(gòu)成,而觸發(fā)對(duì)話是必須的,執(zhí)行對(duì)話則不是必要,只是為了方便表達(dá)和使用而建立。
下面我們來談?wù)搯蝹€(gè)對(duì)話,也就是一個(gè)觸發(fā)/執(zhí)行對(duì)話由哪些組成:
我們下面這個(gè)例子:

如果大家也是用vscode打開的話,可以發(fā)現(xiàn)這個(gè)執(zhí)行對(duì)話有很多種顏色的部分構(gòu)成:
首先是紅色的內(nèi)容,包括while(循環(huán)函數(shù)),if(條件判斷函數(shù)),break(c語言里沒怎么見過,大概意思就是跳出循環(huán)),pass(空操作,保證結(jié)構(gòu)完整性,沒有什么實(shí)際意義)等等,這些如果我們有一些c語言基礎(chǔ)都是很好理解的。而其中的assert是很重要的部分,他能直接調(diào)用其他的執(zhí)行對(duì)話。
接下來是深藍(lán)色部分,一般都是些邏輯運(yùn)算符,and not or之類的,代表一種邏輯,這個(gè)我相信有事件基礎(chǔ)的一看就懂。
然后是淡藍(lán)色的部分,這些一般都是對(duì)話的未知待定參數(shù),需要我們將具體數(shù)值帶入進(jìn)行運(yùn)算,其中這個(gè)call比較有趣,他的作用和前面的assert差不多,但是他著重于執(zhí)行完對(duì)話后的結(jié)果,根據(jù)返回的結(jié)果進(jìn)行一些操作。
游戲中,很多時(shí)候call會(huì)和continue配合使用,來達(dá)到一種循環(huán)檢測(cè)直到成立的效果,目的就是為了讓同一對(duì)話中敵人在滿足條件的情況下依舊無法執(zhí)行對(duì)應(yīng)代碼,因?yàn)闄z測(cè)途中,系統(tǒng)只會(huì)一直在call中循環(huán),就算其他部分滿足判定條件,也不會(huì)去觸發(fā)。

這里的兩個(gè)call+continue如果各位能看懂,就離搞懂talk不遠(yuǎn)了:首先第一個(gè)call+continue,劍圣在說完上吧只狼之后,就會(huì)處于循環(huán)檢測(cè),直到滿足
f120() - f121() == 1 and not GetEventStatus(71120205):
大概意思就是一心掉了一個(gè)紅點(diǎn),并且還未說出熱血沸騰那句話,直到這個(gè)時(shí)候才會(huì)跳出call,檢測(cè)對(duì)話中的其他判定條件是否成立
第二個(gè)也是同理的,當(dāng)一心被我們致命忍殺后(擁有30008特效),會(huì)跪在那里,此時(shí)call+continue鎖住對(duì)話一直循環(huán)檢測(cè),直到我們不死斬將其處決,也就是他擁有特效30009之后,他會(huì)說出:動(dòng)手。
但如果我們直接讓一心擁有30009特效的話,他說的則不是"動(dòng)手",而是"熱血沸騰起來了"

所以說call+continue的使用,能讓我們的對(duì)話具有順序性,強(qiáng)制在某句話說在某句話之后,中途不會(huì)收到其他影響。當(dāng)然我們也可以手動(dòng)控制特效的添加順序,不用call也行,這里介紹給大伙主要是方便之后在原基礎(chǔ)上修改時(shí)不會(huì)出錯(cuò)。
4.回到正題,我們可以發(fā)現(xiàn)有很多畫了黃色波浪線的語句,這些代碼就是今天的重點(diǎn),也是大家最想知道的:命令語句和功能語句。
功能語句一般用在條件判斷if之后,設(shè)立各種各樣的判斷條件:

例如這里就是判斷talk鏈接的人物是否擁有30009特效。
那么功能語句這么多到底都有代表了什么呢?這里我整理了一些,歷代魂系列和只狼都包含在內(nèi):

命令語句一般用來執(zhí)行命令的,例如打開菜單,給特效之類的操作,一般是在滿足功能語句的條件后,進(jìn)行命令語句的操作。同上,這里我整理了一些命令語句:

在talk中,所有命令語句的表達(dá)格式為:c1_xxx,這里c代表command,即命令;1代表block代表分區(qū)(意義不大,因?yàn)橹挥幸粋€(gè)分區(qū))。xxx代表的就是我上面表中語句前的編號(hào),例如OpenBonfireSubmenu這個(gè)命令語句我們可以表示為c1_127,實(shí)際上我們看到的OpenBonfireSubmenu都是c1_127的注釋,當(dāng)然這個(gè)注釋是作者給我們加的,不然我們打開talk啥都看不懂了,但這就代表了我們可以在對(duì)應(yīng)文件中修改注釋,例如這樣:

這個(gè)是我自己注釋的空缺功能語句,本來顯示成f1_xxx的(f代表function),不過我還是建議大家使用英文,如果一個(gè)對(duì)話中半英文半中文看起來就很怪。
多的我也不說了,大家自己對(duì)照?qǐng)D片理解對(duì)話含義,我都整理這么完整了。
三、talk中的“talk”
上個(gè)部分我們談到了命令語句和功能語句,其中一個(gè)我要著重介紹,那就是命令語句中的TalkToPlayer:

首先可以看到這個(gè)命令語句里有四個(gè)參數(shù),第二個(gè)第四個(gè)不太清楚,第一個(gè)代表的是我們talkparam的編號(hào),也就是參數(shù)編輯器中的talkparam。

打開talkparam,右邊菜單欄可以看到很多項(xiàng)目:

也就是說talk中的對(duì)話是使用了talktoplayer,然后這個(gè)命令語句調(diào)用對(duì)應(yīng)編號(hào)的talkparam,talkparam鏈接對(duì)應(yīng)的文本和語音,最后將文本顯示,語音播放在游戲中。
這里我們需要注意的點(diǎn)是,talkparam的編號(hào)和文本編號(hào),語音編號(hào)并不一定是相同的(當(dāng)然大部分情況下相同),如下圖

文本id我相信大家都知道,目錄如下:


打開就可以看到文本對(duì)應(yīng)的編號(hào):

而音頻則是在sound中,對(duì)話語音被放在地圖語音中,文件名格式為:vm+地圖編號(hào)+_jaj.fsb
比較麻煩的事我們想看就必須要將音頻解密,具體的我這里就不說了,大家自己去b站找教程學(xué)一下,很簡(jiǎn)單的東西,解密完了就可以用DSSI v2.1.exe打開音頻,然后在軟件中試聽語音。

而TalkToPlayer的第三個(gè)參數(shù)代表的是對(duì)話出現(xiàn)的類型,對(duì)話可以分為戰(zhàn)斗對(duì)話和非戰(zhàn)斗對(duì)話,戰(zhàn)斗對(duì)話就是一心那種,在戰(zhàn)斗中說一些話,不會(huì)影響到玩家;非戰(zhàn)斗對(duì)話一般是玩家主動(dòng)互動(dòng)觸發(fā),然后玩家會(huì)站在原地,一句一句聽完對(duì)話,也可以按下互動(dòng)鍵跳過對(duì)話。
但其實(shí)戰(zhàn)斗對(duì)話和非戰(zhàn)斗對(duì)話的根本區(qū)別就在于是否能跳過對(duì)話,能否移動(dòng)之類的是其他命令語句的效果,如果第三個(gè)參數(shù),也就是圖中的flag14=1,那么對(duì)話不可以被跳過;反之對(duì)話可以被跳過。
四、在talk基礎(chǔ)上修改
那么一開始修改talk,我是不建議大家直接新建對(duì)話的,我們可以先去嘗試修改一些有talk的敵人,例如弦一郎,葦名一心,義父等等。
例如我們想給葦名一心進(jìn)入三階段(最后一個(gè)紅點(diǎn))時(shí)加個(gè)臺(tái)詞“還沒完啊,只狼”,那么我們首先需要使用事件編輯器,檢測(cè)一心紅點(diǎn)只有1時(shí),給予一心一個(gè)30004特效,這個(gè)特效30002到30009都能用,這個(gè)是游戲?qū)iT用來觸發(fā)對(duì)話的空檢測(cè)特效,但是最好不要和對(duì)話中的特效重合,避免出錯(cuò)。

然后模仿下下面的熱血沸騰對(duì)話,仿造一個(gè)對(duì)話的觸發(fā):


最終結(jié)果如下:

接著打包文件,然后我們進(jìn)入游戲中檢測(cè)一下看看有沒有正常觸發(fā)就行了。
這里有一個(gè)要提的點(diǎn),t112240_x3有四個(gè)參數(shù),其中第二個(gè)參數(shù)代表開啟的事件標(biāo)志,我們可以改成-1,這樣就不會(huì)改動(dòng)任何eventflag。
那其實(shí)這種在原本基礎(chǔ)上加對(duì)話是非常簡(jiǎn)單的,可以看到我就用了短短幾行代碼就加了一句對(duì)話,大家也可以去試試修改。
五、后話
今天先講到這里,下一篇文章我將教大家如何新建不同類型的對(duì)話,可能就是talk教學(xué)的最終篇了,點(diǎn)贊100更下一篇。
