SHOW:
|
|
- or go back to the newest paste.
1 | <?php | |
2 | ||
3 | // xmap_inst_v3.php | |
4 | ||
5 | ini_set('memory_limit', '900M'); | |
6 | ini_set('display_errors', '1'); | |
7 | ||
8 | $files = explode("\n", `dir /b /s *.xmap`); | |
9 | $section_const = "\x11\x11\x33\x33"; | |
10 | $inst_code = "\xce\x50\x14\x83"; | |
11 | $inst_token = "\x00\x00\x00\x00"; | |
12 | ||
13 | foreach ($files as $file) | |
14 | { | |
15 | if (!is_file($file)) continue; | |
16 | $data = file_get_contents($file); | |
17 | if ($data !== false) | |
18 | { | |
19 | // parse section list | |
20 | $loffset = fix_offset(substr($data, 0x40, 4)); | |
21 | while (substr($data, $loffset + 0xc, 4) == $section_const) | |
22 | { | |
23 | $code = substr($data, $loffset + 0x0, 4); | |
24 | $ssize = parse_int(substr($data, $loffset + 0x4, 4)); | |
25 | $soffset = fix_offset(substr($data, $loffset + 0x8, 4)); | |
26 | ||
27 | // parse inst section | |
28 | if ($code == $inst_code) | |
29 | { | |
30 | $size_parsed = 0; | |
31 | while ($size_parsed + 0x70 <= $ssize) | |
32 | { | |
33 | if (substr($data, $soffset + 0x0, 4) == $inst_token) | |
34 | { | |
35 | $h = "0x" . strtoupper( bin2hex(substr($data, $soffset + 0x4, 4)) ); | |
36 | $x = parse_float(substr($data, $soffset + 0x10, 4)); | |
37 | $y = parse_float(substr($data, $soffset + 0x14, 4)); | |
38 | $z = parse_float(substr($data, $soffset + 0x18, 4)); | |
39 | $rx = parse_float(substr($data, $soffset + 0x20, 4)); | |
40 | $ry = parse_float(substr($data, $soffset + 0x24, 4)); | |
41 | $rz = parse_float(substr($data, $soffset + 0x28, 4)); | |
42 | $rw = parse_float(substr($data, $soffset + 0x2c, 4)); | |
43 | ||
44 | ||
45 | printf("%.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %s\r\n", $x, $y, $z, $rx, $ry, $rz, $rw, $h); | |
46 | } | |
47 | ||
48 | $soffset += 0x70; | |
49 | $size_parsed += 0x70; | |
50 | } | |
51 | } | |
52 | ||
53 | $loffset += 0x10; | |
54 | } | |
55 | } | |
56 | } | |
57 | ||
58 | // takes 0x50XXXXXX offset and fixes it to file offset | |
59 | function fix_offset($data) | |
60 | { | |
61 | $data[0] = "\x00"; | |
62 | return 0x10 + array_pop(unpack("N", $data)); | |
63 | } | |
64 | ||
65 | function parse_int($data) | |
66 | { | |
67 | return array_pop(unpack("N", $data)); | |
68 | } | |
69 | ||
70 | function parse_float($data) | |
71 | { | |
72 | return array_pop(unpack("f", strrev($data))); | |
73 | } | |
74 | ||
75 | ?> |