-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathbfps2_bfpsp_bfwii.bms
More file actions
168 lines (160 loc) · 10.4 KB
/
bfps2_bfpsp_bfwii.bms
File metadata and controls
168 lines (160 loc) · 10.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# Ubisoft - *.BFPS2/*.BFPSP/*.BFWii
# ---
# Shaun White Snowboarding (PlayStation 2, PlayStation Portable)
# Shaun White Snowboarding: Road Trip (Wii)
# ---
# this is a file format related to what is internally known as the "Opal Engine".
# said engine was apparently made with non-HD (PlayStation 3, Xbox 360, Windows XP) versions of that Snowboarding game in mind.
# hash tables, needed for function calculate_asset_hash (currently unused)
set MEMORY_FILE2 binary "\x00\x00\x00\x00\x77\x07\x30\x96\xEE\x0E\x61\x2C\x99\x09\x51\xBA\x07\x6D\xC4\x19\x70\x6A\xF4\x8F\xE9\x63\xA5\x35\x9E\x64\x95\xA3\x0E\xDB\x88\x32\x79\xDC\xB8\xA4\xE0\xD5\xE9\x1E\x97\xD2\xD9\x88\x09\xB6\x4C\x2B\x7E\xB1\x7C\xBD\xE7\xB8\x2D\x07\x90\xBF\x1D\x91\x1D\xB7\x10\x64\x6A\xB0\x20\xF2\xF3\xB9\x71\x48\x84\xBE\x41\xDE\x1A\xDA\xD4\x7D\x6D\xDD\xE4\xEB\xF4\xD4\xB5\x51\x83\xD3\x85\xC7\x13\x6C\x98\x56\x64\x6B\xA8\xC0\xFD\x62\xF9\x7A\x8A\x65\xC9\xEC\x14\x01\x5C\x4F\x63\x06\x6C\xD9\xFA\x0F\x3D\x63\x8D\x08\x0D\xF5\x3B\x6E\x20\xC8\x4C\x69\x10\x5E\xD5\x60\x41\xE4\xA2\x67\x71\x72\x3C\x03\xE4\xD1\x4B\x04\xD4\x47\xD2\x0D\x85\xFD\xA5\x0A\xB5\x6B\x35\xB5\xA8\xFA\x42\xB2\x98\x6C\xDB\xBB\xC9\xD6\xAC\xBC\xF9\x40\x32\xD8\x6C\xE3\x45\xDF\x5C\x75\xDC\xD6\x0D\xCF\xAB\xD1\x3D\x59\x26\xD9\x30\xAC\x51\xDE\x00\x3A\xC8\xD7\x51\x80\xBF\xD0\x61\x16\x21\xB4\xF4\xB5\x56\xB3\xC4\x23\xCF\xBA\x95\x99\xB8\xBD\xA5\x0F\x28\x02\xB8\x9E\x5F\x05\x88\x08\xC6\x0C\xD9\xB2\xB1\x0B\xE9\x24\x2F\x6F\x7C\x87\x58\x68\x4C\x11\xC1\x61\x1D\xAB\xB6\x66\x2D\x3D\x76\xDC\x41\x90\x01\xDB\x71\x06\x98\xD2\x20\xBC\xEF\xD5\x10\x2A\x71\xB1\x85\x89\x06\xB6\xB5\x1F\x9F\xBF\xE4\xA5\xE8\xB8\xD4\x33\x78\x07\xC9\xA2\x0F\x00\xF9\x34\x96\x09\xA8\x8E\xE1\x0E\x98\x18\x7F\x6A\x0D\xBB\x08\x6D\x3D\x2D\x91\x64\x6C\x97\xE6\x63\x5C\x01\x6B\x6B\x51\xF4\x1C\x6C\x61\x62\x85\x65\x30\xD8\xF2\x62\x00\x4E\x6C\x06\x95\xED\x1B\x01\xA5\x7B\x82\x08\xF4\xC1\xF5\x0F\xC4\x57\x65\xB0\xD9\xC6\x12\xB7\xE9\x50\x8B\xBE\xB8\xEA\xFC\xB9\x88\x7C\x62\xDD\x1D\xDF\x15\xDA\x2D\x49\x8C\xD3\x7C\xF3\xFB\xD4\x4C\x65\x4D\xB2\x61\x58\x3A\xB5\x51\xCE\xA3\xBC\x00\x74\xD4\xBB\x30\xE2\x4A\xDF\xA5\x41\x3D\xD8\x95\xD7\xA4\xD1\xC4\x6D\xD3\xD6\xF4\xFB\x43\x69\xE9\x6A\x34\x6E\xD9\xFC\xAD\x67\x88\x46\xDA\x60\xB8\xD0\x44\x04\x2D\x73\x33\x03\x1D\xE5\xAA\x0A\x4C\x5F\xDD\x0D\x7C\xC9\x50\x05\x71\x3C\x27\x02\x41\xAA\xBE\x0B\x10\x10\xC9\x0C\x20\x86\x57\x68\xB5\x25\x20\x6F\x85\xB3\xB9\x66\xD4\x09\xCE\x61\xE4\x9F\x5E\xDE\xF9\x0E\x29\xD9\xC9\x98\xB0\xD0\x98\x22\xC7\xD7\xA8\xB4\x59\xB3\x3D\x17\x2E\xB4\x0D\x81\xB7\xBD\x5C\x3B\xC0\xBA\x6C\xAD\xED\xB8\x83\x20\x9A\xBF\xB3\xB6\x03\xB6\xE2\x0C\x74\xB1\xD2\x9A\xEA\xD5\x47\x39\x9D\xD2\x77\xAF\x04\xDB\x26\x15\x73\xDC\x16\x83\xE3\x63\x0B\x12\x94\x64\x3B\x84\x0D\x6D\x6A\x3E\x7A\x6A\x5A\xA8\xE4\x0E\xCF\x0B\x93\x09\xFF\x9D\x0A\x00\xAE\x27\x7D\x07\x9E\xB1\xF0\x0F\x93\x44\x87\x08\xA3\xD2\x1E\x01\xF2\x68\x69\x06\xC2\xFE\xF7\x62\x57\x5D\x80\x65\x67\xCB\x19\x6C\x36\x71\x6E\x6B\x06\xE7\xFE\xD4\x1B\x76\x89\xD3\x2B\xE0\x10\xDA\x7A\x5A\x67\xDD\x4A\xCC\xF9\xB9\xDF\x6F\x8E\xBE\xEF\xF9\x17\xB7\xBE\x43\x60\xB0\x8E\xD5\xD6\xD6\xA3\xE8\xA1\xD1\x93\x7E\x38\xD8\xC2\xC4\x4F\xDF\xF2\x52\xD1\xBB\x67\xF1\xA6\xBC\x57\x67\x3F\xB5\x06\xDD\x48\xB2\x36\x4B\xD8\x0D\x2B\xDA\xAF\x0A\x1B\x4C\x36\x03\x4A\xF6\x41\x04\x7A\x60\xDF\x60\xEF\xC3\xA8\x67\xDF\x55\x31\x6E\x8E\xEF\x46\x69\xBE\x79\xCB\x61\xB3\x8C\xBC\x66\x83\x1A\x25\x6F\xD2\xA0\x52\x68\xE2\x36\xCC\x0C\x77\x95\xBB\x0B\x47\x03\x22\x02\x16\xB9\x55\x05\x26\x2F\xC5\xBA\x3B\xBE\xB2\xBD\x0B\x28\x2B\xB4\x5A\x92\x5C\xB3\x6A\x04\xC2\xD7\xFF\xA7\xB5\xD0\xCF\x31\x2C\xD9\x9E\x8B\x5B\xDE\xAE\x1D\x9B\x64\xC2\xB0\xEC\x63\xF2\x26\x75\x6A\xA3\x9C\x02\x6D\x93\x0A\x9C\x09\x06\xA9\xEB\x0E\x36\x3F\x72\x07\x67\x85\x05\x00\x57\x13\x95\xBF\x4A\x82\xE2\xB8\x7A\x14\x7B\xB1\x2B\xAE\x0C\xB6\x1B\x38\x92\xD2\x8E\x9B\xE5\xD5\xBE\x0D\x7C\xDC\xEF\xB7\x0B\xDB\xDF\x21\x86\xD3\xD2\xD4\xF1\xD4\xE2\x42\x68\xDD\xB3\xF8\x1F\xDA\x83\x6E\x81\xBE\x16\xCD\xF6\xB9\x26\x5B\x6F\xB0\x77\xE1\x18\xB7\x47\x77\x88\x08\x5A\xE6\xFF\x0F\x6A\x70\x66\x06\x3B\xCA\x11\x01\x0B\x5C\x8F\x65\x9E\xFF\xF8\x62\xAE\x69\x61\x6B\xFF\xD3\x16\x6C\xCF\x45\xA0\x0A\xE2\x78\xD7\x0D\xD2\xEE\x4E\x04\x83\x54\x39\x03\xB3\xC2\xA7\x67\x26\x61\xD0\x60\x16\xF7\x49\x69\x47\x4D\x3E\x6E\x77\xDB\xAE\xD1\x6A\x4A\xD9\xD6\x5A\xDC\x40\xDF\x0B\x66\x37\xD8\x3B\xF0\xA9\xBC\xAE\x53\xDE\xBB\x9E\xC5\x47\xB2\xCF\x7F\x30\xB5\xFF\xE9\xBD\xBD\xF2\x1C\xCA\xBA\xC2\x8A\x53\xB3\x93\x30\x24\xB4\xA3\xA6\xBA\xD0\x36\x05\xCD\xD7\x06\x93\x54\xDE\x57\x29\x23\xD9\x67\xBF\xB3\x66\x7A\x2E\xC4\x61\x4A\xB8\x5D\x68\x1B\x02\x2A\x6F\x2B\x94\xB4\x0B\xBE\x37\xC3\x0C\x8E\xA1\x5A\x05\xDF\x1B\x2D\x02\xEF\x8D"
set MEMORY_FILE3 binary "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F\x60\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x7B\x7C\x7D\x7E\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF"
get bf_ext extension
get bf_name basename
if bf_ext == "BFWii"
endian big
elif bf_ext == "BFPS2"
endian little
elif bf_ext == "BFPSP"
endian little
endif
goto 0
get bf_sign string
if bf_sign == "Bigfile Data v2.07 "
elif bf_sign == "Bigfile Data v2.14 "
else
string print1 p " unknown BF signature (%s). " bf_sign
print "%print1%"
cleanexit
endif
goto 0x100
get decompressed_chunk_size long
get bf_unk1 long
math data_offset = 0x800
get chunks long
for i = 0 < chunks
get chunk1 long
putarray 0 i chunk1
next i
if bf_unk1 != 0
comtype lzo1x
else
comtype copy
endif
for i = 0 < chunks
goto data_offset
get chunk2 long
getarray compressed_chunk_size 0 i
xmath helper1 "compressed_chunk_size % 0x800"
xmath helper2 "compressed_chunk_size / 0x800"
if helper1 != 0
math helper2 + 1
endif
math helper2 * 0x800
putvarchr MEMORY_FILE decompressed_chunk_size 0
log MEMORY_FILE 0 0
xmath chunk_offset "data_offset + 4"
if compressed_chunk_size == decompressed_chunk_size
xmath alt_chunk_size "decompressed_chunk_size - 4"
log MEMORY_FILE chunk_offset alt_chunk_size
else
clog MEMORY_FILE chunk_offset compressed_chunk_size decompressed_chunk_size
endif
math m1_pos = 0
for j = 0 < chunk2
goto m1_pos MEMORY_FILE
get c2_size long MEMORY_FILE
xmath m1_ofst "m1_pos + 4"
savepos m1_temp1 MEMORY_FILE
get c2_sign long MEMORY_FILE
xmath m1_sz "c2_size - 4"
if c2_sign == 0x0fda0134 # Ubisoft BAO stuff
/*
set hash_target string "SOUND"
callfunction calculate_asset_hash 1
string a1 p "a1 - %08X" hash_target
print " %a1% "
*/
putarray 1 0 "ENGLISH"
putarray 1 1 "FRENCH"
putarray 1 2 "ITALIAN"
putarray 1 3 "SPANISH"
putarray 1 4 "GERMAN"
putarray 1 5 "CZECH"
putarray 1 6 "POLISH"
putarray 1 7 "HUNGARIAN"
putarray 1 8 "DUTCH"
putarray 1 9 "DANISH"
putarray 1 10 "NORWEGIAN"
putarray 1 11 "SWEDISH"
putarray 1 12 "FINNISH"
putarray 1 13 "JAPANESE"
putarray 1 14 "SIMP_CHINESE"
putarray 1 15 "TRAD_CHINESE"
putarray 1 16 "KOREAN"
putarray 1 17 "PORTUGUESE"
# this rest of BAO info needed to access it.
get bao1 long MEMORY_FILE
if bf_sign == "Bigfile Data v2.07 "
get bao_duplicate_info1 long MEMORY_FILE
# BFWii files manage to post the same bao1 value twice
endif
get bao2 long MEMORY_FILE
get adjacent_bao_id long MEMORY_FILE
get bao_id long MEMORY_FILE
get bao_mode1 byte MEMORY_FILE
get bao_mode2 byte MEMORY_FILE
get language_number byte MEMORY_FILE
if language_number != 0xff
getarray language_name 1 language_number
endif
get bao_size long MEMORY_FILE
savepos bao_offset MEMORY_FILE
/*
set opal_bao_name string ""
if language_number != 0xff
string opal_bao_name p "DB:>DARE_%08X_%08X_%s.BAO" adjacent_bao_id bao_id language_name
else
string opal_bao_name p "DB:>DARE_%08X_%08X.BAO" adjacent_bao_id bao_id
endif
set hash_target string opal_bao_name
callfunction calculate_asset_hash 1
string a2 p "a2 - %08X" hash_target
print " %a2% "
*/
if language_number != 0xff
string bao_name p "bao/%s/%08x.bao" language_name bao_id
else
string bao_name p "bao/%08x.bao" bao_id
endif
log bao_name bao_offset bao_size MEMORY_FILE
else
string temp_name p "unknown/%u_%u" i j
log temp_name m1_ofst m1_sz MEMORY_FILE
endif
math m1_pos + c2_size
next j
log MEMORY_FILE 0 0
math data_offset + helper2
next i
startfunction calculate_asset_hash
# 80304084(main.dol)
math r7 = 0xffffffff
for x1 = 0
getvarchr r0 hash_target x1 byte
xmath r0 "r0 & 0xff | ((r0 & 0x80) << 1)"
if r0 != 0
goto r0 MEMORY_FILE3
get r0 byte MEMORY_FILE3
xmath r6 "(r7 << 0x18) & 0xffffff"
xmath r0 "r0 ^ r7"
xmath r0 "(r0 << 2) & 0x3fc"
goto r0 MEMORY_FILE2
get r0 long MEMORY_FILE2
xmath r7 "r6 ^ r0"
else
math r0 = 0xffffffff
xmath hash_target "r7 ^ r0"
break
endif
next x1
endfunction