來翻新老專案 (3.5) - MapleLooker - 跑去改其他專案,然後翻車

原本打算去更新之前自己寫的遊戲檔案 Library NeoWZ
主要是因為 MapleLooker 上的 WzLib 版本非常舊,我覺得結構也不好,所以打算移除改用後來寫的版本
結果改好幾天都沒成果,時間就這樣白白浪費了 🙃

雖然專案本身沒有什麼進展,但還是寫個文章來紀錄一下,也順便證明我沒有失蹤 (?)

NeoWZ

先簡單介紹一下這次更新的專案 NeoWZ

NeoWZ 是我在寫私服的時候順便建立的,讀取 WZ 檔案的 Library
以前寫的版本都叫 WzLib,但是通常都是跟當時寫的工具比較適配
直到 NeoWZ 開始,在資料結構跟讀取方面做了一些調整,之後就不定時在維護 (主要是寫私服時才會做小更新)

更新 NeoWZ 的動機

如同一開始講的,因為 MapleLooker 上面用的 WzLib 是非常久以前寫的函式庫,年久失修加上個人覺得用起來不方便,所以打算換掉

然而即使是後來寫的 NeoWZ,也還是有一些缺陷在,所以我決定做一些改動:

  1. 拔掉自訂 WzStream
  2. 重整資料結構

看起來範圍挺大的吧?雖然這幾乎是整個專案的內容,不過主要的目標只有 1. 而已,所以過去寫的大部份的內容其實沒有改動

拔掉自訂的 WzStream

早期我一直都是使用自訂的 WzStream 來讀寫 WZ 檔案,設計其實沒那麼差
但在看了一些常見的 Stream 跟 Reader/Writer 後,我發覺以前建立的 WzStream 主要都在讀寫遊戲檔案的特定格式
也就是說,WzStream 整體來看不像是一個 Stream,而是 Stream + Reader 組合的感覺,甚至不能說是 Stream,實做 Stream 就只是去操作裡面的 BaseStream 而已

因為發現 WzStream 不太符合 Stream 的概念,所以我決定把它用 Reader/Writer 來做替換
這樣的好處在於,我不用再實作 Stream,僅需操作 Stream 物件即可

我認為 Stream 的概念應該只是一連串的資料流,可以做位移並讀寫資料
所以像是 DeflateStream 、 CryptoStream 等本身可以描述為資料流的類別才能夠繼承並實做 Stream
而像 WzStream 這種單純對 Stream 讀寫的工具,並不具備資料流的概念,應該以 Reader/Writer 來描述

重整資料結構

會想要重整結構只是因為心血來潮而已
原本設計結構其實我還算滿意,只是在拔除 WzStream 的過程中因為以前寫的結構遇到一點困難,就想說順便重整資料結構
沒想到花了很多時間,最後還翻車 🙃

我先簡單介紹一下 WZ 檔案
它其實就是類似 ZIP 結構的檔案,裡面包含目錄跟遊戲檔案,本身沒什麼特別的東西

而遊戲檔案似乎是使用 Windows 的 COM (Component Object Model) 做開發,它會使用到 VARIANT 跟 IUnknown
VARIANT 本身是 COM 中常用的結構,可以儲存多樣化的資料 (比如整數、浮點數、指標等等)
IUnknown 則是 COM 組件的基本介面,主要就是自訂類別的部份

遊戲檔案的資料節點大概會長下面這樣:
節點範例

可以看到,VARIANT 底下才是自訂物件 ParentClass,而自訂物件底下又接著多個 VARIANT
從根節點透過名稱往下訪問節點不是難事,但要往上就有些難度

如果我要對整個節點樹做向上遍歷,會讓自訂物件跟 VARIANT 互相耦合
而且,因為節點的名稱在檔案結構上屬於 VARIANT 而不是自訂物件,使得自訂物件的名子要馬從 VARIANT 拿,要馬存在自訂物件上並與 VARIANT 共用。
不論哪一種,都會增加了改名以及移動節點的難度

最後,我花了很長一段時間在做 VARIANT 跟自訂物件的解耦,但都沒有成功

後續

雖然大概兩週的時間被我浪費掉了,加上最近比較忙一點又拖了一週才生文章出來
但這更新也不全是失敗,至少 Stream 的部份我成功替換掉了,但只有到外層的 ZIP 結構而已,遊戲資料的部份並沒有處理完成

翻新老專案系列至今已經持續 2 個多月了,雖然我不是全力在做翻新,其實每週也就花大概 8 ~ 16 小時而已
畢竟開始工作後,時間沒有學生時期那麼多,下班後也比較偏好休閒而非寫 Code

寫這個系列除了讓 Blog 有點文章以外,也順便讓自己有個目標能夠帶動自己寫 Code
過去比較勤奮寫 Code ,主要還是因為楓之谷這款遊戲去帶動我去寫一些有的沒的東西
自從那些技術論壇逐漸式微,消失之後,就比較少在非工作時間寫 Code 了

我覺得自己還是喜歡寫 Code 並研究一些酷炫的寫法,只是缺乏一個目標
剛好藉著這次翻新專案,讓自己有目標寫寫程式,順便維持或提昇自己的能力

WzLib 這塊我想會先擱著,後續還是會以 MapleLooker 的翻新為主
畢竟原本寫的 WzLib 也沒有那麼不堪 (應該吧?)。既然還可以用,那就沒有需要接著做的必要
等 MapleLooker 都整理的差不多之後,再繼續更新並替換原有的 Lib 🙂