此庫主要是為了ChartViwer
, 所以本體多處都為空, 並非完整的API
若你有興趣協助開發ChartViwer
, 請移至DoroJark\models\chart.py
若你對於D4DJ API有興趣的話, 這裡可能對你幫助不大 :( 但我仍非常願意分享有關於D4的遊戲流程
D4DJ主要使用Grpc
進行通訊, 而其架構都跟著grpc的規範走, 而服務主要分為兩部分:
- InitService
- MainService
對於版本與資源檢查, 這是InitService
的工作
對於遊戲整體的內容, 這是MainService
的工作
此庫並未包含多人遊戲(Muti-Play), 所以實際上可能不只上文兩種
與大部分遊戲一樣, 都是簡易的AES CBC加密模式, 但你得先找到Key, 很高興它始終是靜態的 :)
值得注意的是, D4的遊戲資源是否被加密可以透過.enc
判斷
並且你可以發現大部分資源都包含了.msgpack
, 請閱讀下一段落
D4的資料均使用MsgPack
進行壓縮, 值得慶幸的是這已是常見的資料壓縮手段
但當你反序列化後你將發現它有奇妙的地方: 都是陣列
是的, 你必須反編譯應用程式才能找到這些Key
在我印象當中, 他們使用MagicOnion
運行伺服器, 而其中搭配了MessagePack C#
的中間層, 而其資料最後才會經過主要邏輯處裡
若你只是想要解析這些Mst的值對, 那麼你可以參考ChartViwer
中的範例 (沒錯, 就連譜面資料也是如此)
相信除了Mst資料外, 這是第二個大家最想知道的問題 而這個未解之謎在於我們解密音檔時需要一個特殊的Key, 而最奇怪的點就是這個Key會改變!
這東西在我開發出這個API前是未解之謎沒錯, 但當我開發了一個段落後... 嘿嘿 這就非常簡單
我很快地就注意到了MusicService
中有GetMusicInfoAsync
, 從字面意思來看就是得到該音樂的資訊, 但它的返回資料卻不是結構體, 而是long(i64)
於是我很快的測試了一次
>>> cl.GetMusicInfoAsync(120006)
<<< (13419257940878755972, 1537118686)
我很快的就意識到這可能與解密有關, 最終在某個so檔案中找到了他們的處理方式, 實際上非常的簡單
以上大概是本庫所有功能的概述 雖然大半程式碼都被屏蔽了, 但有心人仍可循著提示撰寫出來
若你還有任何有關於Game API問題, 請不要發起問題, 因為現階段這並非本庫的主旨
本庫著重於ChartViwer
的開發, 感謝大家的觀看