/DoroJark

《D4DJ Groovy Mix》Game API

Primary LanguagePythonBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

DoroJark

此庫主要是為了ChartViwer, 所以本體多處都為空, 並非完整的API

若你有興趣協助開發ChartViwer, 請移至DoroJark\models\chart.py

若你對於D4DJ API有興趣的話, 這裡可能對你幫助不大 :( 但我仍非常願意分享有關於D4的遊戲流程


API架構

D4DJ主要使用Grpc進行通訊, 而其架構都跟著grpc的規範走, 而服務主要分為兩部分:

  1. InitService
  2. MainService

對於版本與資源檢查, 這是InitService的工作 對於遊戲整體的內容, 這是MainService的工作

此庫並未包含多人遊戲(Muti-Play), 所以實際上可能不只上文兩種

Mst解密

與大部分遊戲一樣, 都是簡易的AES CBC加密模式, 但你得先找到Key, 很高興它始終是靜態的 :)

值得注意的是, D4的遊戲資源是否被加密可以透過.enc判斷 並且你可以發現大部分資源都包含了.msgpack, 請閱讀下一段落

遊戲資料處理 (MsgPack)

D4的資料均使用MsgPack進行壓縮, 值得慶幸的是這已是常見的資料壓縮手段

但當你反序列化後你將發現它有奇妙的地方: 都是陣列

是的, 你必須反編譯應用程式才能找到這些Key 在我印象當中, 他們使用MagicOnion運行伺服器, 而其中搭配了MessagePack C#的中間層, 而其資料最後才會經過主要邏輯處裡

若你只是想要解析這些Mst的值對, 那麼你可以參考ChartViwer中的範例 (沒錯, 就連譜面資料也是如此)

音樂解密 (Music decode)

相信除了Mst資料外, 這是第二個大家最想知道的問題 而這個未解之謎在於我們解密音檔時需要一個特殊的Key, 而最奇怪的點就是這個Key會改變!

這東西在我開發出這個API前是未解之謎沒錯, 但當我開發了一個段落後... 嘿嘿 這就非常簡單

我很快地就注意到了MusicService中有GetMusicInfoAsync, 從字面意思來看就是得到該音樂的資訊, 但它的返回資料卻不是結構體, 而是long(i64) 於是我很快的測試了一次

>>> cl.GetMusicInfoAsync(120006)

<<< (13419257940878755972, 1537118686)

我很快的就意識到這可能與解密有關, 最終在某個so檔案中找到了他們的處理方式, 實際上非常的簡單

結語

以上大概是本庫所有功能的概述 雖然大半程式碼都被屏蔽了, 但有心人仍可循著提示撰寫出來

若你還有任何有關於Game API問題, 請不要發起問題, 因為現階段這並非本庫的主旨

本庫著重於ChartViwer的開發, 感謝大家的觀看