function dump_pub($filetype, $filename, $formatfile, $prefix) { $format = pub_format_parse_file($formatfile); $reader = new PubReader($format, $filename); $header = $reader->readHeader(); $names = new NameManager(); if ($header['type'] != $filetype) { throw new Exception("{$filetype} file is not an {$filetype} file!"); } for ($i = 0; $i < $header['num']; ++$i) { $entry = $reader->readNextEntry(); if ($entry['name'] == 'eof') { break; } $gender = null; if ($filetype == 'EIF') { if ($entry['type'] == 'Armor') { $gender = $entry['spec2']; } } $idname = $names->generateName($entry['name'], $gender); // Re-order unknowns to the bottom foreach (array_keys($entry) as $k) { if (substr($k, 0, 7) == 'unknown') { $v = $entry[$k]; unset($entry[$k]); $entry[$k] = $v; } if (substr($k, 0, 5) == 'Xdrop') { unset($entry[$k]); } } // Re-order ID and name to the top... $name = $entry['name']; unset($entry['name']); if ($filetype == 'ESF') { $shout = $entry['shout']; } if ($filetype == 'EIF') { $size = $entry['size']; } if ($filetype == 'EIF') { $weight = $entry['weight']; } if ($filetype == 'ESF') { unset($entry['shout']); } if ($filetype == 'EIF') { unset($entry['size']); } if ($filetype == 'EIF') { unset($entry['weight']); } $entry = array_reverse($entry); $entry['name'] = $name; if ($filetype == 'ESF') { $entry['shout'] = $shout; } if ($filetype == 'EIF') { $entry['size'] = $size; } if ($filetype == 'EIF') { $entry['weight'] = $weight; } $entry['id'] = $i + 1; $entry = array_reverse($entry); $cleanup = array(); foreach ($entry as $k => $v) { if ($v === 0) { $cleanup[$k] = $k; } } if ($filetype == 'EIF') { $cleanup['unknown3'] = 'unknown3'; } foreach ($cleanup as $k) { unset($entry[$k]); } $filename = "{$prefix}{$idname}.json"; echo "Dumping: {$filename}\n"; file_put_contents($filename, json_encode($entry, JSON_PRETTY_PRINT)); } }
function generate_pub($filetype, $filename, $formatfile, $prefix) { $entries = array(); $format = pub_format_parse_file($formatfile); $pub = new PubWriter($format, $filename); $entries = array(); $max_id = 0; foreach (glob($prefix . '*.json') as $jsonfile) { $entry = json_clean_decode(file_get_contents($jsonfile), true); if (!$entry) { throw new Exception("Bad JSON file: {$jsonfile}"); } $entries[$entry['id']] = $entry; $max_id = max($max_id, $entry['id']); } $pub->writeHeader(array('type' => $filetype, 'num' => $max_id + 1)); for ($i = 1; $i <= $max_id; ++$i) { // testing /* if ($filetype == 'ENF') { foreach (array('unknown1', 'unknown4') as $k) { if ($entries[$i][$k] != 0) { echo "$i (" . $entries[$i]['name'] . ") has $k = ", $entries[$i][$k], "\n"; } } } */ if (isset($entries[$i])) { $pub->writeEntry($entries[$i]); } else { echo "{$filetype} #{$i} unused.\n"; $pub->writeDummyEntry(); } } $pub->writeEOFEntry(); $rid = sprintf('%x', $pub->finish()); $kbsize = number_format(filesize($filename) / 1024, 1); echo "Wrote {$max_id}+1 entries to {$filename} ({$kbsize} kB). RID={$rid}\n"; if ($kbsize > 62.5) { echo "WARNING! {$filename} may be too large.\n"; } }