更新於 2023/03/08閱讀時間約 1 分鐘

Doom engine reject解析筆記

Reject是附屬在map data裡面的一個表格,存放的位置和長度都是紀錄在WAD最前面的lump目錄裡。Reject是一個表格,用來設定放在某個sector(地圖上的一個被圍起來的空間, 詳細說明參照sectors和linedefs)的怪物有機會看到哪幾個sector的玩家。觸發查表的條件尚待確認
所有怪物在地圖產生時都是發呆不動,直到看到或聽到玩家才被觸發,reject table用來快速判斷怪物有沒有看到玩家的"可能性",如果有玩家在怪物視線可及的地方就會進行更進一步的觸發判斷。這是在電腦算力不足的年代用來節省計算資源的手段,算力爆發年代可以忽視他。
表格由一堆布林值組成,水平軸是玩家所在sector,垂直軸是怪物所在sector。每個布林值都是1bit,會以左到右、上到下的順序封裝成byte,解開資料時會從LSB開始讀。每個map的reject table size是roundup(sector^2 / 8),以E1M1來說sector有85個,所以是904byte。
以doom wiki的範例來說明,一個有5 sector的地圖,怪物在sector3看得到在sector 2,3的玩家、看不到sector 0,1,4的玩家。這個表會被封裝成b11000101, b00111110, b00100110, b00000001,轉成hex是0xC5, 0x3E, 0x26, 0x01。轉換時表格沒有用到的位數補0補滿到8的倍數。
   p0 p1 p2 p3 p4
m0  1  0  1  0  0
m1  0  1  1  0  1
m2  1  1  1  1  0
m3  0  0  1  1  0
m4  0  1  0  0  1
真正使用時通常只讀取半個表格,因為是對稱的。
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.