放置修仙 制霸三界!陪我一起玩遊戲!戰法雙職業隨你選擇萬界修仙 隻手遮天!
LasmGratel ( Lasm Gratel )
信箱認證徽章
Lv. 1 | 文章數:2 | 推薦數:0 | 被推數:0 #1. 2021-02-26 09:37:06
[發問中]本問題提供 0 G 幣回饋給最佳解答者!
發問截止時間:2021-02-27 09:37:06(還有-113天13小時8分14秒
各位大大,大富翁3中的BB.MKF,SCREEN.MKF,WINDOW.MKF分別都是什麼格式呢? mkf解包之後SCREEN.MKF可以看到文件頭是05 02 FF,又代表這什麼?小弟嘗試用320x200,640x400,640x480的4plane格式均不能繪製MENU.PIC正常的圖像(如圖)如果有大大有相關經驗的話,那將感激不盡了!

chiuinan ( 青衫,詩樂為心棋為友 )
Lv. 34 | 文章數:2037 | 推薦數:710 | 被推數:1969 #2. 2021-02-26 12:51:13
回答者 第 2 篇
WINDOWS.MKF:

1

第一筆資料由0068h開始, 這裡的資料都是2 byte整數, 因此應該是遊戲裡使用的數值資料. 至於是什麼數值資料, 必須追蹤程式才能得知.

  • 1
▼ 顯示全部圖片
chiuinan ( 青衫,詩樂為心棋為友 )
Lv. 34 | 文章數:2037 | 推薦數:710 | 被推數:1969 #3. 2021-02-26 14:06:02
回答者 第 3 篇
BB.MKF:

2

第一筆資料看起來又是一個和MKF類似的資料集. 14 00 00 00不會是指標值, 因為和資料位址14C或150配不起來, 應該是後面的指標數目, 加上最後一個終結指標, 數目剛剛好. 第二個值16 00 00 00應該是指標, 而這些指標值應該都要乘上4, 於是實際資料位址為16*4+F4=14C, 下個值8E*4+F4=32C, 該位址開頭也是04 00 50 00, 所以這個分析結果是正確的.

至於資料部份, 開頭是04 00 50 00, 後面接著一堆以BYTE為單位的資料, 不排除是影像資料.  但影像大小與資料內容大小搭不起來, 因此也有可能不是影像資料, 必須實際追蹤程式才能得知.

  • 2
▼ 顯示全部圖片
chiuinan ( 青衫,詩樂為心棋為友 )
Lv. 34 | 文章數:2037 | 推薦數:710 | 被推數:1969 #4. 2021-02-26 14:22:12
回答者 第 4 篇
SCREEN.MKF裡面的資料, 開頭不全然是05 02 FF, 例如最後一筆資料在3544FC, 開頭為08 00 DE. 而每一筆大小均不同, 再看裡面的資料內容, 重複機率極低, 很明顯不是"純"影像資料, 有可能是經過壓縮的結果. 必須追蹤程式, 才能得知還原壓縮的方法.

LasmGratel ( Lasm Gratel )
信箱認證徽章
Lv. 1 | 文章數:2 | 推薦數:0 | 被推數:0 #6. 2021-02-26 16:14:42
回答者 第 6 篇
感謝大大的解答。我也認為應當反編譯來追踪文件如何使用,但反編譯結果發現大富翁3程式使用EPW 1.2 進行包裝,谷歌當中只能找到https://www.pcorner.com/list/UTILITY/EPW12.ZIP/ INFO/ 這款軟件了。所以目前大概是無辦法解包人物形象和界面資源了吧。 。
tricks1 ( tricks1 )
Lv. 3 | 文章數:14 | 推薦數:0 | 被推數:0 #7. 2021-02-26 20:08:35
回答者 第 7 篇
我也看过这些mkf,大宇的mkf格式都差不多,里面一层的格式就很难辨识,我有看过游戏读取文件的顺序,推测背景图是在 screen.mkf,但是 screen 拆解出的 文件是不定长大小的,所以一定不是 4plane,最近半年太忙也没有时间投进去,不过我没有「追蹤程式」这项技能,所以也没有什么下手点,一个可能的突破口是 mouse.mkf, 因为拆出的文件比较小
chiuinan ( 青衫,詩樂為心棋為友 )
Lv. 34 | 文章數:2037 | 推薦數:710 | 被推數:1969 #11. 2021-03-28 14:27:18
回答者 第 11 篇
在解析大富翁4檔案格式之前, 先把大宇大富翁1-3的檔案格式解析一番, 首先是大富翁1. 大富翁1我只關心三個部份, 一是地圖, 二是各地點的資訊, 三是事件訊息.

首先要介紹資料封裝格式, 這種格式在二代也會出現:

檔頭:1 byte,固定FDh
不明:4 byte
封裝資料大小:2 byte, 實際大小要+1
封裝資料

1.地圖: 北半在A1.MAP、南半在A2.MAP,資料封裝格式

封裝資料即影像資料(65536 byte):影像大小為1024x512,每個像素1 bit

2.地點名稱: 在ROAD.NAM, 文字檔格式,以行做為區分

3.地點資訊: 在ROAD.DAT,資料封裝格式

封裝資料分成多組資料,每組193=C1h個2 byte整數,即386=182h byte,各組第一個位置編號0不使用,只使用位置編號1~192

第01組(位置0007h):地點在地圖的方塊X座標
第02組(位置0189h):地點在地圖的方塊Y座標
第03組(位置030Bh):路名,指向ROAD.NAM的第幾行文字(由1開始),如忠孝東路三段
第04組(位置048Dh):地號1~6,如南京東路一段之幾
第05組(位置060Fh):地價
第06組(位置0791h):不明
第07組(位置0913h):不明
第08組(位置0A95h):擁有的玩家順序編號

以上資料會完整載入記憶體中處理

4.事件訊息: 在程式dfw.exe裡, 直接dump即可
chiuinan ( 青衫,詩樂為心棋為友 )
Lv. 34 | 文章數:2037 | 推薦數:710 | 被推數:1969 #12. 2021-03-28 14:46:27
回答者 第 12 篇
大富翁2的檔案格式比較複雜些, 必須分成多個部份一一解析. 首先還是介紹資料封裝格式, 和一代有些不同, 就是封裝資料大小為實際大小, 不用再+1:

*** 資料封裝格式

檔頭:1 byte,固定FDh
不明:4 byte
封裝資料大小:2 byte
封裝資料

先看一下最簡單的256色色盤資料:256.PAT,此為資料封裝格式,封裝資料即為色盤資料,每色3 byte,分別為RGB(0~63)。接著介紹封裝資料集格式:

*** 封裝資料集格式:同資料封裝格式,封裝資料的格式如下:

各組資料位置指標:2 byte,可有多個,實際位置=指標值*2,0或超出檔案大小為結束
各組資料

SS.MUS便是封裝資料集格式,各組資料即為音樂資料(裡面只有一組),格式和RIX檔相同,因為音樂資料沒什麼用處,所以不再繼續往下分析。通常資料集裡的各組資料都會有壓縮,唯一沒有壓縮的便是SS.MUS:

*** 封裝資料集壓縮格式:同封裝資料集格式,各組資料須採一般資料解壓法解壓

*** 一般資料解壓法

no = 讀取2 byte整數,低位元組在前
處理下列解壓程序no次
{
b = 讀取1 byte
c = (b低7位元) + 1
if b最高位元=1 then
讀取c byte資料輸出
else
b = 讀取1 byte
輸出b共c次
end if
}

純資料集的分析較困難,我們放到最後面再說明。以下先分析圖檔資料。
chiuinan ( 青衫,詩樂為心棋為友 )
Lv. 34 | 文章數:2037 | 推薦數:710 | 被推數:1969 #13. 2021-03-28 15:07:45
回答者 第 13 篇
首先解說背景圖,都是封裝資料集壓縮格式,且裡面均只有1組資料。以下為320x200背景圖,解壓後大小為64000 byte,每個像素1 byte,指向256色色盤資料:

777.PIX = 777遊樂場接金幣背景圖
DIE??.PIX = 各人物失敗圖
DTT.PIX = 賭場背景圖
E0.PIX = 遊戲開場背景圖
GOD.PIX = 股市背景圖
MW?.PIX = 單人遊戲過關圖
PART.PIX = 地圖選擇背景圖
Y10.PIX = 結局背景圖
KATO.P = 開場圖

其他維度的有:

PRBCK?.PIX = 游戲中各地圖左邊104x200背景圖(大小=20800)
R3B.PIX = 結局320x116背景圖(大小=37120)

接著便是前景圖,也是封裝資料集壓縮格式,且裡面均只有1組資料。但資料解壓後格式為:

圖像資料指標:2 byte,可有多個,實際位置=指標值*2,0表示結束
圖像資料:
 圖檔水平大小:2 byte
 圖檔垂直大小:2 byte
 圖像壓縮資料,請見圖像解壓法

*** 圖像解壓法

xsize = 圖檔水平大小
ysize = 圖檔垂直大小
處理ysize個水平圖像
{
s = xsize
while s > 0
{
b = 讀取1 byte
c = b低7位元
if b最高位元=1 then 輸出c byte背景色
else 讀取c byte輸出
s -= c
}
}

這類的圖像有:

BP?.PXX:人物介紹圖
CHINA.PXX:倒閉圖
DTT.PXX:賭場圖(多個)
EE.PXX:遊戲開場圖(多個)
MA.PXX:地圖場景如房屋、神明、人物等(多個)
END.PXX:製作群圖(多個)
GOPASS??.PXX:多人遊戲各人物過關圖(多個)
PHEAD.PXX:人物頭像(多個)
R3.PXX:結局圖(多個)
RUN?.PXX:接錢幣圖(多個)
SAY?.PXX:說話人物圖(多個)

最後是圖集封裝格式,它採用的並非資料封裝格式,而是另成一個體系,之後逐漸成為大宇最常見的格式:

各組資料位置指標:4 byte,可有多個,0或超出檔案大小為結束
各組資料

各組資料必須採一般解壓法解壓,解壓後和背景圖一樣,都是原始圖像資料:

CARDPIC.PAK = 卡片圖集,大小=8400,為120x70圖像資料
THPIC.PAK = 事件圖集,大小=17600,為176x100圖像資料

注意不是PAK檔都是圖集封裝格式,以下檔案都是封裝資料集壓縮格式,為多種資料的混搭壓縮封裝:

DATA.PAK = 9組,應該是系統資料
PART?.PAK = 3組,遊戲地圖的相關資訊
READMSG.PAK = 3組,第一組為遊戲說明的文字訊息、第三組為台灣地圖的320x200背景圖
READWOR.PAK = 6組,應該和文字的顯示字形有關,基本上可以略過不管
chiuinan ( 青衫,詩樂為心棋為友 )
Lv. 34 | 文章數:2037 | 推薦數:710 | 被推數:1969 #14. 2021-03-28 23:00:37
回答者 第 14 篇
最後我們要找出地圖的圖像。首先是PART?.PAK ,?=1-3分別代表台灣,香港,大富翁城的地圖資訊. 這些檔案為封裝資料集壓縮格式, 都有3組資訊:

(1)地圖方塊圖像:每個24x20=480 byte
(2)各座標的地點編號:共36x36x2 =2592 byte
(3)地點相關文字訊息(含事件)

現在我們要做的便是找出地圖形成資訊, 這個資訊其實是在存檔裡:

SAVE_7.DSK = 台灣初始遊戲資訊
SAVE_8.DSK = 香港初始遊戲資訊
SAVE_9.DSK = 大富翁城初始遊戲資訊

存檔一樣也是封裝資料集壓縮格式, 每個存檔有8組資訊:

(1)人物遊戲資訊:均2 byte整數,6個人物為一組,依次為現金、存款等
(2)不明
(3)人物位置資訊:X,Y,方向等
(4)地點資訊:X,Y,各方向下個地點,地段,所屬人物等
(5)不明
(6)地圖組成:共36x36個,每個2 byte,指向地圖方塊圖像
(7)不明
(8)地價資訊

所以解出地圖組成資訊, 依照其索引值, 從地圖方塊集找出圖像填入, 便能產出遊戲的地圖了.
chiuinan ( 青衫,詩樂為心棋為友 )
Lv. 34 | 文章數:2037 | 推薦數:710 | 被推數:1969 #15. 2021-04-02 23:55:50
回答者 第 15 篇
大富翁3的SCREEN.MKF格式已解出, 共有97張圖, 均為640x400x16色4 plane格式, 必須採用下列方式解壓 (不追蹤程式是不可能解出來的):

重複下列程序:
f = 讀取1 byte
case (f)
{
00:
解壓結束
01:
輸出1 byte背景色
02:
c = 讀取1 byte
輸出c byte背景色
03:
c = 讀取2 byte整數(低位元組在前)
輸出c byte背景色
04:
讀取4 byte分別輸出至4 Plane(由低位元Plane開始)
05:
c = 讀取1 byte
分別讀取c byte輸出至4 Plane(由低位元Plane開始)
06:
c = 讀取2 byte整數(低位元組在前)
分別讀取c byte輸出至4 Plane(由低位元Plane開始)
07:
b = 讀取1 byte
c = 讀取1 byte
輸出8個顏色值b共c次
08:
b = 讀取1 byte
c = 讀取2 byte整數(低位元組在前)
輸出8個顏色值b共c次
09:
d = 讀取1 byte
分別複製(4 Plane)在(目前位置-d)的1 byte資料
0A:
d = 讀取1 byte
c = 讀取1 byte
分別複製(4 Plane)在(目前位置-d)的1 byte資料c次
0B:
d = 讀取1 byte
c = 讀取2 byte整數(低位元組在前)
分別複製(4 Plane)在(目前位置-d)的1 byte資料c次
0C:
d = 讀取2 byte整數(低位元組在前)
分別複製(4 Plane)在(目前位置-d)的1 byte資料
0D:
d = 讀取2 byte整數(低位元組在前)
c = 讀取1 byte
分別複製(4 Plane)在(目前位置-d)的1 byte資料c次
0E:
d = 讀取2 byte整數(低位元組在前)
c = 讀取2 byte整數(低位元組在前)
分別複製(4 Plane)在(目前位置-d)的1 byte資料c次
0F:
d = 讀取1 byte整數
c = 讀取1 byte整數
分別複製(4 Plane)在(目前位置-d)的c byte資料
10:
d = 讀取1 byte整數
c = 讀取2 byte整數(低位元組在前)
分別複製(4 Plane)在(目前位置-d)的c byte資料
11:
d = 讀取2 byte整數(低位元組在前)
c = 讀取1 byte整數
分別複製(4 Plane)在(目前位置-d)的c byte資料
12:
d = 讀取2 byte整數(低位元組在前)
c = 讀取2 byte整數(低位元組在前)
分別複製(4 Plane)在(目前位置-d)的c byte資料
13:
調整輸入緩衝區指標在32KB以內
}


chiuinan ( 青衫,詩樂為心棋為友 )
Lv. 34 | 文章數:2037 | 推薦數:710 | 被推數:1969 #16. 2021-04-03 17:08:59
回答者 第 16 篇
*** 前景圖:資訊集封裝格式,各組資訊為前景圖格式

PPM.MKF = 人物中圖
PPS.MKF = 人物小圖
SAYWIN.MKF = 人物或事件話語圖
WINPPSAY.MKF = 人物勝利話語圖

*** 前景組圖:資訊集封裝格式

BB.MKF = 各式動畫與街道人物圖
CCGAME.MKF = 遊樂場錢幣掉落圖
PPCC.MKF = 人物遊樂場動作圖
PPG.MKF = 人物擲骰動作圖
PPW.MKF = 人物行進圖
WINTAB.MKF = 各種選單圖

各組資訊為子資訊集封裝格式,各子資訊格式為前景圖格式

*** 資訊集封裝格式

各組資料位置指標:4 byte,可有多個,0或超出檔案大小為結束
各組資料

*** 子資訊集封裝格式

資料位置指標數:4 byte
各組資料位置指標:各4 byte,實際位置=指標*4
資料結束指標:4 byte,檔尾位置=指標*4
各組資料

*** 前景圖格式

水平byte數:2 byte,水平點數=水平byte數*8
垂直點數:2 byte
影像資料:須採前景圖解壓法解壓

*** 前景圖解壓法 (注意和前篇的背景圖解壓法不同)

back = false
重複下列程序:
f = 讀取1 byte
case (f)
{
00: 解壓結束
01: if back then
back = false
檔案移到ret_p的位置
end if
換下一水平線 (y+=1, x-=xsize)
02: 輸出1 byte背景色
03: c = 讀取1 byte
輸出c byte背景色
04: mask = 讀取1 byte
分別讀取1 byte按mask值(位元1才輸出)輸出至4 Plane(由低位元Plane開始)
05: c = 讀取1 byte
執行下列c次:
mask = 讀取1 byte
分別讀取1 byte按mask值(位元1才輸出)輸出至4 Plane(由低位元Plane開始)
06: 分別讀取1 byte輸出至4 Plane(由低位元Plane開始)
07: c = 讀取1 byte
分別讀取c byte輸出至4 Plane(由低位元Plane開始)
08: b = 讀取1 byte
c = b高4位元+1
b = b低4位元
輸出8個顏色值b共c次
09: c = 讀取1 byte+1
b = 讀取1 byte
輸出8個顏色值b共c次
0A: 分別讀取1 byte輸出至4 Plane兩次(由低位元Plane開始)
0B: 分別讀取1 byte輸出至4 Plane三次(由低位元Plane開始)
0C: 分別讀取1 byte輸出至4 Plane四次(由低位元Plane開始)
0D: 讀取4 byte
c = 讀取1 byte+1
將前面讀取的4 byte分別輸出至4 Plane c次(由低位元Plane開始)
0E: p = 檔案目前位置
d = 讀取2 byte整數(低位元組在前)
ret_p = 檔案目前位置
back = true
檔案移到p-d的位置
0F: mask = 讀取1 byte
b = 讀取1 byte
c = b高4位元
b = b低4位元
按mask值(位元1才輸出)輸出8個顏色值b共c次
10: c = 讀取1 byte
mask = 讀取1 byte
b = 讀取1 byte
按mask值(位元1才輸出)輸出8個顏色值b共c次
11: p = 目前檔案位置
d = 讀取2 byte整數(低位元組在前)
到(p-d)分別讀取1 byte輸出至4 Plane(由低位元Plane開始)
12: p = 檔案目前位置
d = 讀取2 byte整數(低位元組在前)
到(p-d)分別讀取1 byte輸出至4 Plane兩次(由低位元Plane開始)
13: p = 檔案目前位置
d = 讀取2 byte整數(低位元組在前)
到(p-d)分別讀取1 byte輸出至4 Plane三次(由低位元Plane開始)
14: p = 檔案目前位置
d = 讀取2 byte整數(低位元組在前)
到(p-d)分別讀取1 byte輸出至4 Plane四次(由低位元Plane開始)
15: p = 檔案目前位置
d = 讀取2 byte整數(低位元組在前)
c = 讀取1 byte+1
到(p-d)分別讀取1 byte輸出至4 Plane c次(由低位元Plane開始)
16: p = 檔案目前位置
d = 讀取2 byte整數(低位元組在前)
到(p-d):
mask = 讀取1 byte
分別讀取1 byte按mask值(位元1才輸出)輸出至4 Plane(由低位元Plane開始)
17: c = 讀取1 byte
p = 檔案目前位置
d = 讀取2 byte整數(低位元組在前)
到(p-d)並執行下列c次:
mask = 讀取1 byte
分別讀取1 byte按mask值(位元1才輸出)輸出至4 Plane(由低位元Plane開始)
18: c = 讀取1 byte
p = 檔案目前位置
d = 讀取2 byte整數(低位元組在前)
到(p-d)分別讀取c byte輸出至4 Plane(由低位元Plane開始)
}

chiuinan ( 青衫,詩樂為心棋為友 )
Lv. 34 | 文章數:2037 | 推薦數:710 | 被推數:1969 #17. 2021-04-06 04:06:13
回答者 第 17 篇
WINDOWS.MKF格式為資訊集封裝格式, 各組資料主要用來定義遊戲各種對話視窗的位置, 組成圖像等資訊. 某些視窗在遊戲中可以移動位置, 所以遊戲結束時會回寫這些位置資訊. 由於這個資訊的用途不大, 因此不再繼續深入研究.

至此樓主詢問的幾個檔案, 其格式均已解析完畢.
tricks1 ( tricks1 )
Lv. 3 | 文章數:14 | 推薦數:0 | 被推數:0 #19. 2021-04-09 17:53:42
回答者 第 19 篇

打算写个程序试试解出 screen,有些问题请教一下大大:

1. 输出背景色 vs 4plane:是否指图像有两层,一层为背景色,一层为 4plane,还是说,需要将背景色转化为 4plane
2. 分別讀取c byte輸出至4 Plane:这个是指读取 c 个 byte 到 plane 0,再 c 个到 plane 1,以此类推
3. 分別複製(4 Plane)在(目前位置-d)的c byte資料:
   设当前位置为i,从 plane_0[i-d] 开始读取 c 个 byte,放到 plane[i] 开始的位置
4. 調整輸入緩衝區指標在32KB以內: 这个如何理解


chiuinan ( 青衫,詩樂為心棋為友 )
Lv. 34 | 文章數:2037 | 推薦數:710 | 被推數:1969 #20. 2021-04-09 21:01:13
回答者 第 20 篇
1.將背景色轉換成4place資料分別寫入, 例如顏色9, 就是1001, 4個位元各自寫到不同的plane. 背景色通常是讀取已繪製在螢幕上的內容. 如果我們自己產生成一個獨立圖檔, 就自己給個顏色(通常是黑或白)
2.沒錯
3.沒錯, 分別拷貝plane0[i-d]到plane0[i], 然後plane1[i-d]到plane1[i],... 共4plane
4.因為DOS一個segment只能存取64KB, 為避免offset太大, 導致超出範圍, 所以調整的方式便是將太多的offset移到segment的值. 例如0:8000和800:0是一樣的, 後者便是調整的結果. 這是用在程式的內部指標, 外界不用理會.
快速回覆 | 註冊 使用完整編輯模式回覆
討論板頭像 [ 設定 ] |簽名檔 [ 設定 ]
有人回覆時通知我 【通知管理