Lycohinya 是怎麼搭起來的(三):副本怎麼加
Lycohinya 的副本沒辦法只寫一份設定檔就多一座。我用的副本引擎 HanaToki 是我自己寫、已經公開的插件,它的說明寫得很直接:YAML 描述場地,Kotlin 決定玩法,HanaToki 顧生命週期。
一座副本由哪幾顆插件組成
---
config:
layout: elk
---
flowchart TB
subgraph each["每座副本一顆"]
content["副本內容插件<br/>場地 YAML+玩法程式"]
end
engine["HanaToki 副本引擎<br/>場地、隊伍、階段、背包、收尾"]
core["核心插件<br/>副本選單、組隊"]
integ["整合插件<br/>發獎勵、記完成紀錄"]
lib["LycoLib<br/>次數、貨幣等介面"]
done[("完成紀錄")]
content -- 啟動時註冊 --> engine
core -- 整隊送進場 --> engine
engine -- 通關結果 --> integ
integ -- 要用時才查 --> lib
core -- 提供介面 --> lib
integ -- 唯一能寫 --> doneHanaToki 負責每座副本都一樣的部分:分配場地、追蹤隊伍、推進階段、保管玩家背包並歸還、保護地形,以及收尾。收尾順序是固定的:先還背包,再把人送出去,再還原場地,最後釋放場地給下一隊。它不認識伺服器的貨幣、裝備或任務。
副本內容插件每座一顆,裡面是描述場地、階段、文字、獎勵的 YAML,加上一個寫玩法的程式,啟動時向引擎註冊。
核心插件只管副本入口:選單和組隊。玩家組好隊之後,整隊交給引擎進場。
整合插件把引擎和伺服器接起來。通關時引擎把結果交給它,它再透過 LycoLib 向核心插件記次數、發貨幣。
加一座副本要做什麼
寫一顆新的內容插件,就這樣。引擎和整合插件都不用動,背包怎麼保管、玩家中途下線怎麼處理、場地怎麼回收,新副本直接沿用。
不過程式那部分通常比 YAML 大很多。玩法本來就不是設定檔寫得完的,這樣拆省下的是每座副本重寫一次背包和收尾的工夫,不是寫玩法的工夫。
內容插件對核心插件只是軟依賴。我熱修核心插件時,副本不會跟著被卸掉。
結算目前的缺口
通關時,每位成員會拿到一個隨機的完成編號,整合插件先用它在自己的資料庫佔一列,同一場不會結算兩次。
問題在核心插件剛好不在的時候,例如我正在熱換它。這時整合插件拿不到記次數和發貨幣的介面,這筆結算會留下紀錄、不算已發放、不扣次數,然後把佔位釋放掉。但之後不會自動補發,目前只能手動處理。
什麼時候值得這樣做
如果你只打算做一兩座副本,直接寫在一顆插件裡就好。引擎和內容分開,是等到副本數量多起來、每座都要處理背包和收尾時才划算。