夜花櫻TINYYANA
今晚的顏色櫻粉

夜、花、櫻。名字裡的三個字就是上面那片天空,拉一下會跟著換。

今晚的音樂

月夜蝶~君ヲ想フ~,來自H/MIX GALLERY。 音量在這裡調,右上角能暫停。

← 回筆記
技術實作

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 -- 唯一能寫 --> done

HanaToki 負責每座副本都一樣的部分:分配場地、追蹤隊伍、推進階段、保管玩家背包並歸還、保護地形,以及收尾。收尾順序是固定的:先還背包,再把人送出去,再還原場地,最後釋放場地給下一隊。它不認識伺服器的貨幣、裝備或任務。

副本內容插件每座一顆,裡面是描述場地、階段、文字、獎勵的 YAML,加上一個寫玩法的程式,啟動時向引擎註冊。

核心插件只管副本入口:選單和組隊。玩家組好隊之後,整隊交給引擎進場。

整合插件把引擎和伺服器接起來。通關時引擎把結果交給它,它再透過 LycoLib 向核心插件記次數、發貨幣。

加一座副本要做什麼

寫一顆新的內容插件,就這樣。引擎和整合插件都不用動,背包怎麼保管、玩家中途下線怎麼處理、場地怎麼回收,新副本直接沿用。

不過程式那部分通常比 YAML 大很多。玩法本來就不是設定檔寫得完的,這樣拆省下的是每座副本重寫一次背包和收尾的工夫,不是寫玩法的工夫。

內容插件對核心插件只是軟依賴。我熱修核心插件時,副本不會跟著被卸掉。

結算目前的缺口

通關時,每位成員會拿到一個隨機的完成編號,整合插件先用它在自己的資料庫佔一列,同一場不會結算兩次。

問題在核心插件剛好不在的時候,例如我正在熱換它。這時整合插件拿不到記次數和發貨幣的介面,這筆結算會留下紀錄、不算已發放、不扣次數,然後把佔位釋放掉。但之後不會自動補發,目前只能手動處理。

什麼時候值得這樣做

如果你只打算做一兩座副本,直接寫在一顆插件裡就好。引擎和內容分開,是等到副本數量多起來、每座都要處理背包和收尾時才划算。