mirror of
https://gitlab.com/hashborgir/d2tools.git
synced 2025-10-13 16:34:23 -05:00
Header parsed half way in D2S
This commit is contained in:
137
D2SaveFileStructure.php
Normal file
137
D2SaveFileStructure.php
Normal file
@@ -0,0 +1,137 @@
|
||||
<?php
|
||||
|
||||
error_reporting(E_ERROR | E_PARSE);
|
||||
set_time_limit(-1);
|
||||
ini_set('max_input_time', '-1');
|
||||
ini_set('max_execution_time', '0');
|
||||
session_start();
|
||||
ob_start();
|
||||
|
||||
require_once './D2SaveFileStructureData.php';
|
||||
|
||||
|
||||
|
||||
|
||||
$filePath = "D:\Diablo II\MODS\ironman-dev\save\Sorc.d2s";
|
||||
$fp = fopen($filePath, "rb");
|
||||
$offsets = [
|
||||
0 => 4, // Identifier
|
||||
4 => 4, // Version ID
|
||||
8 => 4, // File size
|
||||
12 => 4, // Checksum
|
||||
16 => 4, // Active weapon
|
||||
20 => 16, // Character Name
|
||||
36 => 1, // Character Status
|
||||
37 => 1, // Character progression
|
||||
38 => 2, // Unknown
|
||||
40 => 1, // Character Class
|
||||
41 => 2, // Unknown
|
||||
43 => 1, // Character Level
|
||||
44 => 4, // Unknown
|
||||
48 => 4, // Last played
|
||||
52 => 4, // Unknown
|
||||
56 => 64, // Assigned skills
|
||||
120 => 4, // Left mouse button skill ID
|
||||
124 => 4, // Right mouse button skill ID
|
||||
128 => 4, // Left swap mouse button skill ID
|
||||
132 => 4, // Right swap mouse button skill ID
|
||||
136 => 32, // Character menu appearance
|
||||
168 => 3, // Difficulty
|
||||
171 => 4, // Map ID
|
||||
175 => 2, // Unknown
|
||||
177 => 2, // Mercenary dead
|
||||
179 => 4, // Mercenary ID
|
||||
183 => 2, // Mercenary Name ID
|
||||
185 => 2, // Mercenary type
|
||||
187 => 4, // Mercenary experience
|
||||
191 => 144, // Unknown
|
||||
335 => 298, // Quests
|
||||
633 => 81, // Waypoints
|
||||
714 => 51, // NPC Introductions
|
||||
];
|
||||
|
||||
foreach ($offsets as $k => $v){
|
||||
fseek($fp, $k);
|
||||
$data[$k] = fread($fp, $v);
|
||||
}
|
||||
|
||||
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";
|
||||
}
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
$charData['Identifier'] = bin2hex($data['0']);
|
||||
|
||||
$charData['VersionID'] = unpack('l', $data['4'])[1]; // 96 is v1.10+ - check out
|
||||
|
||||
$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']);
|
||||
|
||||
$charData['Difficulty'] = strtobits($data['168']);
|
||||
|
||||
// $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'];
|
||||
|
||||
$charData['Quests'] = $data['335'];
|
||||
$charData['Waypoints'] = $data['633'];
|
||||
$charData['NPCIntroductions'] = $data['714'];
|
||||
|
||||
|
||||
echo "<pre>";
|
||||
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