| SITE ANNOUNCEMENTS: | |
|---|---|
| |
User:Quietust/rawextract.php
From Dwarf Fortress Wiki
<?
$versions = array(
1287 => '0.31.01',
1288 => '0.31.02',
1289 => '0.31.03',
1292 => '0.31.04',
1295 => '0.31.05',
1297 => '0.31.06',
1300 => '0.31.08',
1304 => '0.31.09',
1305 => '0.31.10',
1310 => '0.31.11',
1311 => '0.31.12',
1323 => '0.31.13',
1325 => '0.31.14',
1326 => '0.31.15',
1327 => '0.31.16',
1340 => '0.31.17',
1341 => '0.31.18',
1351 => '0.31.19',
1353 => '0.31.20',
1354 => '0.31.21',
1359 => '0.31.22',
1360 => '0.31.23',
1361 => '0.31.24',
1362 => '0.31.25',
1372 => '0.34.01',
1374 => '0.34.02',
1376 => '0.34.03',
1377 => '0.34.04',
1378 => '0.34.05',
1382 => '0.34.06',
1383 => '0.34.07',
1400 => '0.34.08',
1402 => '0.34.09',
1403 => '0.34.10',
1404 => '0.34.11',
);
function decompress ($version, $file)
{
$out = tmpfile();
// write 'uncompressed' header
fwrite($out, pack('VV', $version, 0));
while (1)
{
$len = readLong($file);
if (feof($file))
break;
$skip = readShort($file);
$block = fread($file, $len - 2);
fwrite($out, gzinflate($block));
}
rewind($out);
// seek past the headers
fseek($out, 8, SEEK_CUR);
fclose($file);
return $out;
}
function readLong ($file)
{
$x = fread($file, 4);
$pck = @unpack('Vdata', $x);
return $pck['data'];
}
function readShort ($file)
{
$x = fread($file, 2);
$pck = @unpack('vdata', $x);
return $pck['data'];
}
function readByte ($file)
{
$x = fread($file, 1);
$pck = @unpack('Cdata', $x);
return $pck['data'];
}
$dir = '';
if ($argc > 1)
$dir = $argv[1] .'\\';
$raw = @fopen($dir.'world.dat', 'rb');
if ($raw)
{
$version = readLong($raw);
if (isset($versions[$version]))
echo "World is from version $versions[$version]\n";
else echo "World is from an unrecognized version!\n";
$comp = readLong($raw);
if ($comp == 1)
$raw = decompress($version, $raw);
elseif ($comp > 0)
die("world.dat file is corrupted!");
fseek($raw, 0x46, SEEK_CUR);
if ($version >= 1372)
fseek($raw, 0x14, SEEK_CUR);
if ($version >= 1400)
fseek($raw, 0x4, SEEK_CUR);
if (readByte($raw))
{
fseek($raw, readShort($raw), SEEK_CUR);
fseek($raw, readShort($raw), SEEK_CUR);
fseek($raw, 0x30, SEEK_CUR);
}
fseek($raw, 0xF, SEEK_CUR);
$len = readShort($raw);
$world = fread($raw, $len);
echo "Extracting randomly generated raws of $world:\n\n";
}
else
{
$raw = @fopen($dir.'world.sav', 'rb');
if (!$raw)
die("Could not open world.dat or world.sav!");
$version = readLong($raw);
if (isset($versions[$version]))
echo "World is from version $versions[$version]\n";
else echo "World is from an unrecognized version!\n";
$comp = readLong($raw);
if ($comp == 1)
$raw = decompress($version, $raw);
elseif ($comp > 0)
die("world.sav file is corrupted!");
fseek($raw, 0x56, SEEK_CUR);
if ($version >= 1372)
fseek($raw, 0x14, SEEK_CUR);
if ($version >= 1400)
fseek($raw, 0x4, SEEK_CUR);
$len = readShort($raw);
$name = fread($raw, $len);
$len = readShort($raw);
$world = fread($raw, $len);
echo "Extracting randomly generated raws of $world:\n\n";
readLong($raw); // year
}
if ($version >= 1372)
{
$numMaterials = readLong($raw);
for ($i = 0; $i < $numMaterials; $i++)
{
$data = '';
$file = "material_$i";
$numLines = readLong($raw);
for ($j = 0; $j < $numLines; $j++)
{
$len = readShort($raw);
$str = fread($raw, $len);
$data .= "$str\r\n";
if (preg_match('/\[INORGANIC:(.*?)\]/', $str, $x))
$file = $x[1];
}
echo "$file...\n";
file_put_contents($file .'.txt', $data);
}
}
if ($version >= 1400)
{
$numItems = readLong($raw);
for ($i = 0; $i < $numItems; $i++)
{
$data = '';
$file = "item_$i";
$numLines = readLong($raw);
for ($j = 0; $j < $numLines; $j++)
{
$len = readShort($raw);
$str = fread($raw, $len);
$data .= "$str\r\n";
if (preg_match('/\[ITEM_.*?:(.*?)\]/', $str, $x))
$file = $x[1];
}
echo "$file...\n";
file_put_contents($file .'.txt', $data);
}
}
$numCreatures = readLong($raw);
for ($i = 0; $i < $numCreatures; $i++)
{
$data = '';
$file = "creature_$i";
$numLines = readLong($raw);
for ($j = 0; $j < $numLines; $j++)
{
$len = readShort($raw);
$str = fread($raw, $len);
$data .= "$str\r\n";
if (preg_match('/\[CREATURE:(.*?)\]/', $str, $x))
$file = $x[1];
}
echo "$file...\n";
file_put_contents($file .'.txt', $data);
}
if ($version >= 1372)
{
$numInteractions = readLong($raw);
for ($i = 0; $i < $numInteractions; $i++)
{
$data = '';
$file = "interaction_$i";
$numLines = readLong($raw);
for ($j = 0; $j < $numLines; $j++)
{
$len = readShort($raw);
$str = fread($raw, $len);
$data .= "$str\r\n";
if (preg_match('/\[INTERACTION:(.*?)\]/', $str, $x))
$file = $x[1];
}
echo "$file...\n";
file_put_contents($file .'.txt', $data);
}
}
echo "done!\n";
?>