mirror of
https://gitlab.com/hashborgir/d2tools.git
synced 2025-10-13 08:24:24 -05:00
D2S/Item parser in progress. Still need to debug cubemain.txt doc generator output colulmns. Saving code for now
This commit is contained in:
189
CharEditor.php
189
CharEditor.php
@@ -7,130 +7,103 @@ ini_set('max_execution_time', '0');
|
||||
session_start();
|
||||
ob_start();
|
||||
|
||||
echo "<pre>";
|
||||
require_once './config.php';
|
||||
require_once './_pdo.php';
|
||||
|
||||
require_once './src/D2Functions.php';
|
||||
require_once './src/D2BitReader.php';
|
||||
//require_once './src/D2Item.php';
|
||||
|
||||
|
||||
define('DB_FILE', $_SESSION['modname'] . ".db");
|
||||
PDO_Connect("sqlite:" . DB_FILE);
|
||||
|
||||
|
||||
$sql = "SELECT * FROM strings";
|
||||
$strings = PDO_FetchAssoc($sql);
|
||||
|
||||
|
||||
$sql = "SELECT code,namestr
|
||||
FROM armor
|
||||
UNION SELECT code,namestr
|
||||
FROM misc
|
||||
UNION SELECT code,namestr
|
||||
FROM weapons
|
||||
";
|
||||
$namestr = PDO_FetchAssoc($sql);
|
||||
|
||||
|
||||
//ddump($namestr);
|
||||
|
||||
//$filePath = "D:\Diablo II\MODS\ironman-dev\save\Aldur.d2s";
|
||||
$filePath = "D:\Diablo II\MODS\ironman-dev\save\Sorc.d2s";
|
||||
$fp = fopen($filePath, "rb");
|
||||
//$filePath = "D:\Diablo II\MODS\MedianXL2012\save\Lok.d2s";
|
||||
//$filePath = "D:\Diablo II\MODS\MedianXL2012\save\Pal.d2s";
|
||||
|
||||
$fp = fopen($filePath, 'r+b');
|
||||
$data = file_get_contents($filePath);
|
||||
|
||||
$i_offset = strpos($data, "JM");
|
||||
|
||||
function strtobits(string $str): string {
|
||||
$ret = "";
|
||||
for ($i = 0; $i < strlen($str); ++$i) {
|
||||
$ord = ord($str[$i]);
|
||||
for ($bitnum = 7; $bitnum >= 0; --$bitnum) {
|
||||
if ($ord & (1 << $bitnum)) {
|
||||
$ret .= "1";
|
||||
} else {
|
||||
$ret .= "0";
|
||||
}
|
||||
}
|
||||
fseek($fp, $i_offset + 2);
|
||||
$i_total = unpack('S*', (fread($fp, 2)))[1];
|
||||
|
||||
$items = null;
|
||||
|
||||
$offset = $i_offset + 4; // JM00
|
||||
|
||||
$first_item_offset = strposX($data, "JM", 2);
|
||||
$second_item_offset = strposX($data, "JM", 3);
|
||||
|
||||
$item_size = $second_item_offset - $first_item_offset;
|
||||
|
||||
for ($i = 2; $i <= $i_total; $i++) {
|
||||
fseek($fp, strposX($data, 'JM', $i));
|
||||
$_items[] = unpack('C*', fread($fp, 21));
|
||||
}
|
||||
|
||||
foreach ($_items as $_item) {
|
||||
$item = null;
|
||||
foreach ($_item as $i_bytes) {
|
||||
$item .= strrev(str_pad(decbin($i_bytes), 8, 0, STR_PAD_LEFT));
|
||||
// $item .= (str_pad(dechex($i_bytes), 2, 0, STR_PAD_LEFT));
|
||||
}
|
||||
return $ret;
|
||||
$items[] = $item;
|
||||
}
|
||||
|
||||
foreach ($qNorm as $k => $v) {
|
||||
fseek($fp, $k);
|
||||
$questsNorm[$k] = fread($fp, 2);
|
||||
}
|
||||
// ddump($items);
|
||||
|
||||
foreach ($qNM as $k => $v) {
|
||||
fseek($fp, $k);
|
||||
$questsNM[$k] = fread($fp, 2);
|
||||
}
|
||||
foreach ($items as $_item) {
|
||||
|
||||
foreach ($qHell as $k => $v) {
|
||||
fseek($fp, $k);
|
||||
$questsHell[$k] = fread($fp, 2);
|
||||
}
|
||||
// dump($_item[19]);
|
||||
// dump($_item);
|
||||
// dump(strtoupper(implode(" ", str_split($_item, 8))));
|
||||
// dump((($_item[36])));
|
||||
|
||||
foreach ($offsets as $k => $v) {
|
||||
fseek($fp, $k);
|
||||
$data[$k] = fread($fp, $v);
|
||||
}
|
||||
$b = new D2BitReader($_item);
|
||||
|
||||
//$b->bseek(27);
|
||||
//dump($b->bread(1));
|
||||
|
||||
|
||||
$b->seek(76);
|
||||
// dump($b->bread(32));
|
||||
$codeBits = str_split($b->read(32), 8);
|
||||
|
||||
$charData['Identifier'] = bin2hex($data[0]);
|
||||
$itemCode = '';
|
||||
foreach ($codeBits as $byte) {
|
||||
|
||||
$charData['VersionID'] = unpack('l', $data[4])[1]; // 96 is v1.10+ - check out
|
||||
// dump(strrev($byte));
|
||||
//dump(sprintf('%c', bindec($byte)));
|
||||
|
||||
$charData['Filesize'] = round(unpack('l', $data[8])[1] / 1024, 2) . " KB"; // 1.41 KB (1,447 bytes) - checks out
|
||||
// $charData['Checksum'] = bin2hex($data['12']);
|
||||
// $charData['Activeweapon'] = unpack('l', $data['16']);
|
||||
|
||||
$charData['CharacterName'] = ($data[20]);
|
||||
|
||||
// $charData['CharacterStatus'] = array_filter(str_split(strtobits($data[36])));
|
||||
|
||||
foreach ($charData['CharacterStatus'] as $k => $v) {
|
||||
$str .= ($characterStatus[$k]) . " ";
|
||||
}
|
||||
|
||||
$charData['CharacterStatus'] = $str;
|
||||
|
||||
// $charData['Characterprogression'] = bindec($data['37']);
|
||||
|
||||
$charData['CharacterClass'] = $class[unpack('C', $data[40])[1]];
|
||||
|
||||
$charData['CharacterLevel'] = unpack('C', $data[43])[1];
|
||||
|
||||
$charData['Lastplayed'] = gmdate("Y-m-d\TH:i:s\Z", unpack('I', $data[48])[0]);
|
||||
|
||||
// $charData['Assignedskills'] = (unpack('i16', $data['56']));
|
||||
|
||||
$charData['LeftmousebuttonskillID'] = $skills[unpack('i', $data[120])[1]];
|
||||
$charData['RightmousebuttonskillID'] = $skills[unpack('i', $data[124])[1]];
|
||||
$charData['LeftswapmousebuttonskillID'] = $skills[unpack('i', $data[128])[1]];
|
||||
$charData['RightswapmousebuttonskillID'] = $skills[unpack('i', $data[132])[1]];
|
||||
|
||||
// $charData['Charactermenuappearance'] = unpack('i', $data[136]);
|
||||
|
||||
$x = str_split(strtobits($data[168]), 8);
|
||||
|
||||
$onDifficulty['Norm'] = $x[0][0];
|
||||
$onDifficulty['NM'] = $x[1][0];
|
||||
$onDifficulty['Hell'] = $x[2][0];
|
||||
|
||||
$charData['Difficulty'] = array_filter($onDifficulty);
|
||||
|
||||
//$charData['MapID'] = $data['171'];
|
||||
//$charData['Mercenarydead'] = unpack('i', $data['177']);
|
||||
//$charData['MercenaryID'] = $data['179'];
|
||||
//$charData['MercenaryNameID'] = $data['183'];
|
||||
//$charData['Mercenarytype'] = $data['185'];
|
||||
//$charData['Mercenaryexperience'] = $data['187'];
|
||||
|
||||
|
||||
foreach ($questsNorm as $k => $v) {
|
||||
$x = array_filter(str_split(strtobits($v), 8));
|
||||
if ($x[0][0]) {
|
||||
$quests[] = ($qNorm[$k] . " => " . (($x[0][0])) . "<br>");
|
||||
}
|
||||
}
|
||||
foreach ($questsNM as $k => $v) {
|
||||
$x = array_filter(str_split(strtobits($v), 8));
|
||||
if ($x[0][0]) {
|
||||
$quests[] = ($qNM[$k] . " => " . (($x[0][0])) . "<br>");
|
||||
}
|
||||
}
|
||||
foreach ($questsHell as $k => $v) {
|
||||
$x = array_filter(str_split(strtobits($v), 8));
|
||||
if ($x[0][0]) {
|
||||
$quests[] = ($qHell[$k] . " => " . (($x[0][0])) . "<br>");
|
||||
$itemCode .= chr(bindec(strrev($byte)));
|
||||
}
|
||||
|
||||
$itemCode = trim($itemCode);
|
||||
|
||||
dump($namestr[$itemCode]);
|
||||
dump($strings[$namestr[$itemCode]]);
|
||||
|
||||
// dump($strings[trim($itemCode)]);
|
||||
}
|
||||
|
||||
$charData['Quests'] = $quests;
|
||||
|
||||
$charData['Waypoints'] = $data[633];
|
||||
$charData['NPCIntroductions'] = $data[714];
|
||||
|
||||
print_r($charData);
|
||||
|
||||
// $charData['Unknown'] = $data['44'];
|
||||
// $charData['Unknown'] = $data['52'];
|
||||
// $charData['Unknown'] = $data['175'];
|
||||
// $charData['Unknown'] = $data['191'];
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user