ETH官方钱包

前往
大廳
主題

【資料包工具箱】「獲得N種指定道具」的成就

| 2024-02-21 13:15:24 | 巴幣 12 | 人氣 284

最近想想好像該來開個(gè)工具箱系列,放一些資料包的實(shí)際應(yīng)用。
以前寫那些都偏理論,沒有用根本沒有用

前提知識
自訂進(jìn)度檔案 (wiki)
自訂函數(shù)檔案 (wiki)
計(jì)分板基礎(chǔ)操作 (wiki)
※ 這是內(nèi)容比較完整的英文wiki連結(jié),有語言選單能自己調(diào)成中文。

簡介
遊戲中偶爾會設(shè)計(jì)收集類的成就。
像是原版的「獲得鑽石」(鑽石!)、「馴服所有種類的貓」(貓科全書)。
或是做迷宮地圖的人會想放類似「收集3種寶石」的成就。

獲得一種物品
原版「獲得鑽石」這樣的基本款。
關(guān)鍵是設(shè)定inventory_changed條件,偵測玩家背包中有沒有指定物品。
實(shí)在不會的話,可以去拆原版的「鑽石!」進(jìn)度檔來參考。

所有指定種類的物品
例如「收集3種寶石」,而且寶石剛好有3種,也就是需要全拿的成就。
一般而言,收集類成就的機(jī)制會是圖鑑制度的「曾經(jīng)分別取得過每種物品」。
但是也有少數(shù)時(shí)候會想要「所有物品同時(shí)放在背包裡」。
兩個(gè)機(jī)制各自有適合的場合,設(shè)計(jì)的時(shí)候可以思考看看哪一個(gè)比較合理。

◆ 「所有物品同時(shí)在背包裡」
和單一物品的設(shè)定很像,只要微調(diào)conditions中的items清單,列舉每一個(gè)物品就完成了。
注意事項(xiàng)

"conditions": {
  "items": [ 這個(gè)清單 ]
}

而不是
"conditions": {
  "items": [
    { "items": [ 這個(gè)清單 ] }
  ]
}

◆ 「曾經(jīng)分別取得過」
需要為每一個(gè)物品分別設(shè)定一個(gè)條件
條件的概念類似「隱藏的小成就」,當(dāng)所有小成就解鎖之後,玩家就會解鎖進(jìn)度。

條件的設(shè)定寫在criteria,幫每一個(gè)物品各自設(shè)定一個(gè)inventory_changed條件。
這些條件的ID可以隨便取,但為了幾個(gè)月後修改檔案的自己著想,建議用有意義的詞,像是每個(gè)成就道具的名字。
進(jìn)度檔的requirements會決定條件之間的關(guān)係,可以完全不設(shè)定,讓遊戲用預(yù)設(shè)的「每一個(gè)條件都要完成」。
注意事項(xiàng)
「完全不設(shè)定」的意思是requirements不存在,
而不是像這樣的空清單:
"requirements": []

補(bǔ)充資料
「完成所有條件」也可以明確指定,例如:
"requirements": [ ["diamond"], ["emerald"], ["ruby"] ]

部分指定種類的物品
例如「收集3種寶石」,但寶石有5種,也就是只要拿一部分就能解的成就。
有兩種不同的方法可以做到,一般來說會用計(jì)分板輔助,不過也存在用單一進(jìn)度檔寫的方法。

◆ 計(jì)分板輔助的進(jìn)度
上面說過進(jìn)度條件的概念類似「隱藏的小成就」。
這裡要把這些「隱藏的小成就」實(shí)際寫出來,從條件變成一整批獨(dú)立的進(jìn)度檔。
原本的進(jìn)度剩下單純的顯示作用,只需要設(shè)定一個(gè)impossible條件留給指令觸發(fā)。

每一個(gè)隱藏進(jìn)度負(fù)責(zé)偵測一種物品,所以會回歸到「鑽石!」那種基礎(chǔ)的設(shè)定。
隱藏進(jìn)度不需要對玩家展示,所以不設(shè)定display資料。
接著,把每一個(gè)隱藏進(jìn)度的rewards設(shè)定成同一個(gè)指令函數(shù)。

進(jìn)度獎勵函數(shù)負(fù)責(zé)把玩家的收集分?jǐn)?shù)加1,並且在收集分?jǐn)?shù)達(dá)標(biāo)後,用advancement指令觸發(fā)顯示用的主要進(jìn)度。
在進(jìn)度獎勵函數(shù)中,可以用@s指定獲得進(jìn)度的玩家,所以加分和給予主進(jìn)度都很容易達(dá)成。
補(bǔ)充資料
參考答案:
scoreboard players add @s gem_collection 1
execute if score @s gem_collection matches 3.. \
run advancement grant @s only custom:collect_3_gems

後兩行是分行語法,避免一條指令看起來太寬,對執(zhí)行沒有影響。
從1.20.2開始有這個(gè)語法,可以善加利用。

◆ 用單一進(jìn)度檔硬凹
進(jìn)度的requrements是兩層清單,外層執(zhí)行And邏輯,內(nèi)層執(zhí)行Or邏輯。
例如[[A], [B, C]]代表「一定要達(dá)成A,且B和C要達(dá)成至少一個(gè)」。

5選3要寫在這個(gè)結(jié)構(gòu)內(nèi),比較方便的思考方式是先列舉不符進(jìn)度條件的狀況,也就是「至少有3個(gè)還沒拿到」。
列舉的結(jié)果會是「外層Or、內(nèi)層And」的結(jié)構(gòu),像是:
「沒有A、B和C」或「沒有A、B和D」或…
這就是答案了,直接把這個(gè)組合原狀填進(jìn)requirements裡面。
補(bǔ)充資料
5選3會讓人混淆(剛好排除掉的數(shù)量也是3),
所以下面是5選4的條件設(shè)定範(fàn)例。
"requirements": [
  ["onyx", "pearl"],
  ["onyx", "topaz"],
  ["onyx", "sapphire"],
  ["onyx", "ruby"],
  ["pearl", "topaz"],
  ["pearl", "sapphire"],
  ["pearl", "ruby"],
  ["topaz", "sapphire"],
  ["topaz", "ruby"],
  ["sapphire", "ruby"]
]

不太好看,也不算很好維護(hù)。
沒有什麼特殊堅(jiān)持的話,拜託改用計(jì)分板。
原理是把不符條件反轉(zhuǎn)成符合條件,然後用笛摩根定理調(diào)整條件邏輯。
無法理解原理也沒關(guān)係,總之這麼做有用。

修理一下計(jì)分板輔助進(jìn)度
讓And邏輯在requirements外層是有理由的。
遊戲內(nèi)會顯示進(jìn)度的完成度,例如「貓科全書 (0/11)」,偵測的就是這堆And條件的完成度。
但是上面「收集部分物品」的兩種做法都沒有正確顯示完成度。
排除掉沒救的單檔案版本,有計(jì)分板輔助的版本應(yīng)該要補(bǔ)上完成度才對。

做法是把唯一一個(gè)impossible條件改成「用數(shù)字編號的很多個(gè)impossible條件」,像是c_1c_2等。
然後在加分之後,用function macro給予對應(yīng)的條件。
補(bǔ)充資料
實(shí)際寫起來會像是這樣:
execute store result storage custom:gem_count progress int 1 \
run scoreboard players add @s gem_collection 1
function custom:gem_advancement with storage custom:gem_count

被呼叫的檔案:
$advancement grant @s only custom:collect_3_gems c_$(progress)
會有分?jǐn)?shù)破表導(dǎo)致找不到條件的情況,不過沒關(guān)係,那行指令執(zhí)行失敗不會怎樣。

創(chuàng)作回應(yīng)

更多創(chuàng)作