mirror of
https://gitlab.com/hashborgir/d2tools.git
synced 2025-10-13 16:34:23 -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:
66
src/D2BitReader.php
Normal file
66
src/D2BitReader.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
class D2BitReader {
|
||||
|
||||
private string $bits;
|
||||
private int $offset = 0;
|
||||
|
||||
public function __construct(string $bits = '') {
|
||||
$this->bits = $bits;
|
||||
return true;
|
||||
}
|
||||
|
||||
public function skip(int $numBits): int {
|
||||
$this->offset += $numBits;
|
||||
return $this->offset;
|
||||
}
|
||||
|
||||
/* read X number of bits, like fread */
|
||||
|
||||
public function read(int $numBits = 0, bool $str = true) {
|
||||
$bits = null;
|
||||
for ($i = $this->offset; $i < $this->offset + $numBits; $i++) {
|
||||
$str ? $bits .= $this->bits[$i] : $bits[] = $this->bits[$i];
|
||||
}
|
||||
$this->offset += $numBits;
|
||||
return $bits;
|
||||
}
|
||||
|
||||
/* seek to offset (like fseek) */
|
||||
|
||||
public function seek(int $pos): bool {
|
||||
if ($pos < 0 || $pos > strlen($this->bits)) {
|
||||
return false;
|
||||
}
|
||||
$this->offset = $pos;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* rewind offset to 0 */
|
||||
|
||||
public function rewind(): bool {
|
||||
$this->offset = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Get Bit */
|
||||
|
||||
public function getBit(string $bitNum): int {
|
||||
if ($bitNum < 0 || $bitNum > strlen($this->bits)) {
|
||||
|
||||
return false;
|
||||
}
|
||||
return ((int) $this->bits[$bitNum] ? 1 : 0 );
|
||||
}
|
||||
|
||||
/* Set Bit */
|
||||
|
||||
public function setBit(int $bitNum, int $bitVal): bool {
|
||||
if ($bitVal < 0 || $bitVal > 1) {
|
||||
return false;
|
||||
}
|
||||
$this->bits[$bitNum] = $bitVal;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
@@ -75,11 +75,75 @@ function strtobits(string $str): string {
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function swapEndianness($hex) {
|
||||
function swapEndianness(string $hex) {
|
||||
return implode('', array_reverse(str_split($hex, 2)));
|
||||
}
|
||||
|
||||
|
||||
function modifyBit(int $n, int $p, bool $b){
|
||||
function setBit(int $n, int $p, bool $b){
|
||||
return ($b ? ($n | (1 << $p)) : ($n & ~(1 << $p)) );
|
||||
}
|
||||
|
||||
function getBit(int $b, int $p){
|
||||
return intval(($b & (1 << $p)) != 0);
|
||||
}
|
||||
|
||||
function checksum($fileData) {
|
||||
$nSignature = 0;
|
||||
foreach($fileData as $byte){
|
||||
$nSignature = ((($nSignature << 1) | ($nSignature >> 31)) + $byte) & 0xFFFFFFFF;
|
||||
}
|
||||
return swapEndianness(dechex($nSignature));
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the position of the Xth occurrence of a substring in a string
|
||||
* @param $haystack
|
||||
* @param $needle
|
||||
* @param $number integer > 0
|
||||
* @return int
|
||||
*/
|
||||
function strposX($haystack, $needle, $number) {
|
||||
if ($number == 1) {
|
||||
return strpos($haystack, $needle);
|
||||
} elseif ($number > 1) {
|
||||
return strpos($haystack, $needle, strposX($haystack, $needle, $number - 1) + strlen($needle));
|
||||
} else {
|
||||
return error_log('Error: Value for parameter $number is out of range');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function isBit(string $bit): int {
|
||||
return ((int) $bit ? 1 : 0 );
|
||||
}
|
||||
|
||||
function toBits($input): string {
|
||||
$output = '';
|
||||
if (is_string($input)){
|
||||
foreach(str_split($input) as $i){
|
||||
$output .= str_pad(decbin(ord($i)), 8, 0, STR_PAD_LEFT);
|
||||
}
|
||||
return $output;
|
||||
} else if (is_int($input)){
|
||||
return str_pad(decbin($input), 8, 0, STR_PAD_LEFT);
|
||||
} else if (is_array($input)){
|
||||
foreach ($input as $i) {
|
||||
$output .= tobits($i);
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function print_mem()
|
||||
{
|
||||
/* Currently used memory */
|
||||
$mem_usage = memory_get_usage();
|
||||
|
||||
/* Peak memory usage */
|
||||
$mem_peak = memory_get_peak_usage();
|
||||
|
||||
echo 'The script is now using: <strong>' . round($mem_usage / 1024) . 'KB</strong> of memory.<br>';
|
||||
echo 'Peak usage: <strong>' . round($mem_peak / 1024) . 'KB</strong> of memory.<br><br>';
|
||||
}
|
105
src/D2Item.php
Normal file
105
src/D2Item.php
Normal file
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
require_once 'D2BitReader.php';
|
||||
|
||||
class D2Item {
|
||||
|
||||
private string $_bits;
|
||||
public $basename = ''; //name of the base item
|
||||
public $item_name = ''; //name string
|
||||
public $item_rank = ''; //normal/exceptional/elite
|
||||
public $item_type = ''; //basic type: armor/weapon/misc
|
||||
//flags
|
||||
public $identified = 0;
|
||||
public $sockets = 0;
|
||||
public $ear = 0;
|
||||
public $starter = 0;
|
||||
public $compact = 0;
|
||||
public $ethereal;
|
||||
public $personalized;
|
||||
public $runeword;
|
||||
public $version;
|
||||
public $runeword_name = '';
|
||||
public $runes_title = '';
|
||||
//placement
|
||||
public $location = 0;
|
||||
public $body = 0;
|
||||
public $col = 0;
|
||||
public $row = 0;
|
||||
public $container = 0;
|
||||
public $parent;
|
||||
public $storage;
|
||||
public $bodypart;
|
||||
public $invH = 0;
|
||||
public $invW = 0;
|
||||
public $beltrows = 1;
|
||||
//features
|
||||
public $item_code = ''; //3 letter code from txt
|
||||
public $SocketsFilled = 0;
|
||||
public $SocketsNum = 0;
|
||||
public $socketable = false; //gem, rune, jewel
|
||||
public $fingerprint = '';
|
||||
public $itemlvl = 0; //item level
|
||||
public $quality = 0;
|
||||
public $isCharm = false;
|
||||
public $isJewel = false;
|
||||
public $magic_rank = 'Normal'; //normal/magic/rare/crafted/set/unique
|
||||
public $set_id = 0; //set item id from txt
|
||||
public $set_item = '';
|
||||
public $set_name = 0; //set name, if it is set item,
|
||||
public $personname = '';
|
||||
public $questdif = -1;
|
||||
public $gold;
|
||||
public $GUID = '';
|
||||
public $defense = 0;
|
||||
public $mindam = 0;
|
||||
public $maxdam = 0;
|
||||
public $mindam2 = 0;
|
||||
public $maxdam2 = 0;
|
||||
public $mindammi = 0;
|
||||
public $maxdammi = 0;
|
||||
public $MaxDur = 0;
|
||||
public $CurDur = 0;
|
||||
public $reqlvl = 0;
|
||||
public $reqstr = 0;
|
||||
public $reqdex = 0;
|
||||
public $speed = 0;
|
||||
public $throwing = 0;
|
||||
public $stackable = 0;
|
||||
public $charName = ''; //ear's name
|
||||
public $gfx; //graphic file name
|
||||
public $baseTrans = -1; //transform indexes for colour remap base item
|
||||
public $magicTrans = -1; //transform indexes for colour remap magic item
|
||||
public $type; //type column from txt
|
||||
public $spelldesc = ''; //desc for potions
|
||||
public $ditem; //link to item properties from txt
|
||||
//mods
|
||||
public $dammult = 100; //damage multiply
|
||||
public $damminadd = 0; //damage add
|
||||
public $dammaxadd = 0; //damage add
|
||||
public $defmult = 100; //defense multiply
|
||||
public $defadd = 0; //defense multiply
|
||||
public $resist = array(0, 0, 0, 0, 0, 0); //phy, mag, fire, light, cold, poison
|
||||
public $attributes = array(0, 0, 0, 0); //str, dex, vit, ene
|
||||
|
||||
//arrays
|
||||
|
||||
//socketed items, collected in above function,
|
||||
//because item has only data for itselt, and
|
||||
//gems/runes/jewels are standalone
|
||||
public $SocketItems = array();
|
||||
public $properties = array(); //item variable properties
|
||||
public $propids = array(); //properties ids list
|
||||
|
||||
|
||||
public function __construct(string $bits){
|
||||
if ($bit == '') return false;
|
||||
$this->bits = $bits;
|
||||
|
||||
$this->parseItem();
|
||||
}
|
||||
|
||||
public function parseItem(){}
|
||||
|
||||
|
||||
}
|
@@ -814,6 +814,28 @@ class D2ItemData {
|
||||
"min" => $return['min' . $counter],
|
||||
"max" => $return['max' . $counter],
|
||||
];
|
||||
} else if ($v['prop1'] == 'sock' ||
|
||||
$v['prop2'] == 'sock' ||
|
||||
$v['prop3'] == 'sock' ||
|
||||
$v['prop4'] == 'sock' ||
|
||||
$v['prop5'] == 'sock' ||
|
||||
$v['prop6'] == 'sock' ||
|
||||
$v['prop7'] == 'sock') {
|
||||
$params = [
|
||||
'string1' => "Sockets",
|
||||
'string2' => "",
|
||||
'gstring1' => "",
|
||||
'gstring2' => "",
|
||||
'descfunc' => "9",
|
||||
'descval' => "1",
|
||||
'dgrp' => "",
|
||||
'dgrpfunc' => "",
|
||||
'dgrpval' => "",
|
||||
"prop" => $return['prop' . $counter],
|
||||
"par" => $return['par' . $counter],
|
||||
"min" => $return['min' . $counter],
|
||||
"max" => $return['max' . $counter],
|
||||
];
|
||||
} else {
|
||||
$params = [
|
||||
'string1' => $v['desc']['string1'],
|
||||
|
@@ -297,268 +297,7 @@ class D2SaveFileStructureData {
|
||||
public $_qNM;
|
||||
public $_qHell;
|
||||
|
||||
public $xorTable = [
|
||||
"00" => 0x0,
|
||||
"01" => 0x77073096,
|
||||
"02" => 0xEE0E612C,
|
||||
"03" => 0x990951BA,
|
||||
"04" => 0x076DC419,
|
||||
"05" => 0x706AF48F,
|
||||
"06" => 0xE963A535,
|
||||
"07" => 0x9E6495A3,
|
||||
"08" => 0x0EDB8832,
|
||||
"09" => 0x79DCB8A4,
|
||||
"0A" => 0xE0D5E91E,
|
||||
"0B" => 0x97D2D988,
|
||||
"0C" => 0x09B64C2B,
|
||||
"0D" => 0x7EB17CBD,
|
||||
"0E" => 0xE7B82D07,
|
||||
"0F" => 0x90BF1D91,
|
||||
"10" => 0x1DB71064,
|
||||
"11" => 0x6AB020F2,
|
||||
"12" => 0xF3B97148,
|
||||
"13" => 0x84BE41DE,
|
||||
"14" => 0x1ADAD47D,
|
||||
"15" => 0x6DDDE4EB,
|
||||
"16" => 0xF4D4B551,
|
||||
"17" => 0x83D385C7,
|
||||
"18" => 0x136C9856,
|
||||
"19" => 0x646BA8C0,
|
||||
"1A" => 0xFD62F97A,
|
||||
"1B" => 0x8A65C9EC,
|
||||
"1C" => 0x14015C4F,
|
||||
"1D" => 0x63066CD9,
|
||||
"1E" => 0xFA0F3D63,
|
||||
"1F" => 0x8D080DF5,
|
||||
"20" => 0x3B6E20C8,
|
||||
"21" => 0x4C69105E,
|
||||
"22" => 0xD56041E4,
|
||||
"23" => 0xA2677172,
|
||||
"24" => 0x3C03E4D1,
|
||||
"25" => 0x4B04D447,
|
||||
"26" => 0xD20D85FD,
|
||||
"27" => 0xA50AB56B,
|
||||
"28" => 0x35B5A8FA,
|
||||
"29" => 0x42B2986C,
|
||||
"2A" => 0xDBBBC9D6,
|
||||
"2B" => 0xACBCF940,
|
||||
"2C" => 0x32D86CE3,
|
||||
"2D" => 0x45DF5C75,
|
||||
"2E" => 0xDCD60DCF,
|
||||
"2F" => 0xABD13D59,
|
||||
"30" => 0x26D930AC,
|
||||
"31" => 0x51DE003A,
|
||||
"32" => 0xC8D75180,
|
||||
"33" => 0xBFD06116,
|
||||
"34" => 0x21B4F4B5,
|
||||
"35" => 0x56B3C423,
|
||||
"36" => 0xCFBA9599,
|
||||
"37" => 0xB8BDA50F,
|
||||
"38" => 0x2802B89E,
|
||||
"39" => 0x5F058808,
|
||||
"3A" => 0xC60CD9B2,
|
||||
"3B" => 0xB10BE924,
|
||||
"3C" => 0x2F6F7C87,
|
||||
"3D" => 0x58684C11,
|
||||
"3E" => 0xC1611DAB,
|
||||
"3F" => 0xB6662D3D,
|
||||
"40" => 0x76DC4190,
|
||||
"41" => 0x01DB7106,
|
||||
"42" => 0x98D220BC,
|
||||
"43" => 0xEFD5102A,
|
||||
"44" => 0x71B18589,
|
||||
"45" => 0x06B6B51F,
|
||||
"46" => 0x9FBFE4A5,
|
||||
"47" => 0xE8B8D433,
|
||||
"48" => 0x7807C9A2,
|
||||
"49" => 0x0F00F934,
|
||||
"4A" => 0x9609A88E,
|
||||
"4B" => 0xE10E9818,
|
||||
"4C" => 0x7F6A0DBB,
|
||||
"4D" => 0x086D3D2D,
|
||||
"4E" => 0x91646C97,
|
||||
"4F" => 0xE6635C01,
|
||||
"50" => 0x6B6B51F4,
|
||||
"51" => 0x1C6C6162,
|
||||
"52" => 0x856530D8,
|
||||
"53" => 0xF262004E,
|
||||
"54" => 0x6C0695ED,
|
||||
"55" => 0x1B01A57B,
|
||||
"56" => 0x8208F4C1,
|
||||
"57" => 0xF50FC457,
|
||||
"58" => 0x65B0D9C6,
|
||||
"59" => 0x12B7E950,
|
||||
"5A" => 0x8BBEB8EA,
|
||||
"5B" => 0xFCB9887C,
|
||||
"5C" => 0x62DD1DDF,
|
||||
"5D" => 0x15DA2D49,
|
||||
"5E" => 0x8CD37CF3,
|
||||
"5F" => 0xFBD44C65,
|
||||
"60" => 0x4DB26158,
|
||||
"61" => 0x3AB551CE,
|
||||
"62" => 0xA3BC0074,
|
||||
"63" => 0xD4BB30E2,
|
||||
"64" => 0x4ADFA541,
|
||||
"65" => 0x3DD895D7,
|
||||
"66" => 0xA4D1C46D,
|
||||
"67" => 0xD3D6F4FB,
|
||||
"68" => 0x4369E96A,
|
||||
"69" => 0x346ED9FC,
|
||||
"6A" => 0xAD678846,
|
||||
"6B" => 0xDA60B8D0,
|
||||
"6C" => 0x44042D73,
|
||||
"6D" => 0x33031DE5,
|
||||
"6E" => 0xAA0A4C5F,
|
||||
"6F" => 0xDD0D7CC9,
|
||||
"70" => 0x5005713C,
|
||||
"71" => 0x270241AA,
|
||||
"72" => 0xBE0B1010,
|
||||
"73" => 0xC90C2086,
|
||||
"74" => 0x5768B525,
|
||||
"75" => 0x206F85B3,
|
||||
"76" => 0xB966D409,
|
||||
"77" => 0xCE61E49F,
|
||||
"78" => 0x5EDEF90E,
|
||||
"79" => 0x29D9C998,
|
||||
"7A" => 0xB0D09822,
|
||||
"7B" => 0xC7D7A8B4,
|
||||
"7C" => 0x59B33D17,
|
||||
"7D" => 0x2EB40D81,
|
||||
"7E" => 0xB7BD5C3B,
|
||||
"7F" => 0xC0BA6CAD,
|
||||
"80" => 0xEDB88320,
|
||||
"81" => 0x9ABFB3B6,
|
||||
"82" => 0x03B6E20C,
|
||||
"83" => 0x74B1D29A,
|
||||
"84" => 0xEAD54739,
|
||||
"85" => 0x9DD277AF,
|
||||
"86" => 0x04DB2615,
|
||||
"87" => 0x73DC1683,
|
||||
"88" => 0xE3630B12,
|
||||
"89" => 0x94643B84,
|
||||
"8A" => 0x0D6D6A3E,
|
||||
"8B" => 0x7A6A5AA8,
|
||||
"8C" => 0xE40ECF0B,
|
||||
"8D" => 0x9309FF9D,
|
||||
"8E" => 0x0A00AE27,
|
||||
"8F" => 0x7D079EB1,
|
||||
"90" => 0xF00F9344,
|
||||
"91" => 0x8708A3D2,
|
||||
"92" => 0x1E01F268,
|
||||
"93" => 0x6906C2FE,
|
||||
"94" => 0xF762575D,
|
||||
"95" => 0x806567CB,
|
||||
"96" => 0x196C3671,
|
||||
"97" => 0x6E6B06E7,
|
||||
"98" => 0xFED41B76,
|
||||
"99" => 0x89D32BE0,
|
||||
"9A" => 0x10DA7A5A,
|
||||
"9B" => 0x67DD4ACC,
|
||||
"9C" => 0xF9B9DF6F,
|
||||
"9D" => 0x8EBEEFF9,
|
||||
"9E" => 0x17B7BE43,
|
||||
"9F" => 0x60B08ED5,
|
||||
"A0" => 0xD6D6A3E8,
|
||||
"A1" => 0xA1D1937E,
|
||||
"A2" => 0x38D8C2C4,
|
||||
"A3" => 0x4FDFF252,
|
||||
"A4" => 0xD1BB67F1,
|
||||
"A5" => 0xA6BC5767,
|
||||
"A6" => 0x3FB506DD,
|
||||
"A7" => 0x48B2364B,
|
||||
"A8" => 0xD80D2BDA,
|
||||
"A9" => 0xAF0A1B4C,
|
||||
"AA" => 0x36034AF6,
|
||||
"AB" => 0x41047A60,
|
||||
"AC" => 0xDF60EFC3,
|
||||
"AD" => 0xA867DF55,
|
||||
"AE" => 0x316E8EEF,
|
||||
"AF" => 0x4669BE79,
|
||||
"B0" => 0xCB61B38C,
|
||||
"B1" => 0xBC66831A,
|
||||
"B2" => 0x256FD2A0,
|
||||
"B3" => 0x5268E236,
|
||||
"B4" => 0xCC0C7795,
|
||||
"B5" => 0xBB0B4703,
|
||||
"B6" => 0x220216B9,
|
||||
"B7" => 0x5505262F,
|
||||
"B8" => 0xC5BA3BBE,
|
||||
"B9" => 0xB2BD0B28,
|
||||
"BA" => 0x2BB45A92,
|
||||
"BB" => 0x5CB36A04,
|
||||
"BC" => 0xC2D7FFA7,
|
||||
"BD" => 0xB5D0CF31,
|
||||
"BE" => 0x2CD99E8B,
|
||||
"BF" => 0x5BDEAE1D,
|
||||
"C0" => 0x9B64C2B0,
|
||||
"C1" => 0xEC63F226,
|
||||
"C2" => 0x756AA39C,
|
||||
"C3" => 0x026D930A,
|
||||
"C4" => 0x9C0906A9,
|
||||
"C5" => 0xEB0E363F,
|
||||
"C6" => 0x72076785,
|
||||
"C7" => 0x05005713,
|
||||
"C8" => 0x95BF4A82,
|
||||
"C9" => 0xE2B87A14,
|
||||
"CA" => 0x7BB12BAE,
|
||||
"CB" => 0x0CB61B38,
|
||||
"CC" => 0x92D28E9B,
|
||||
"CD" => 0xE5D5BE0D,
|
||||
"CE" => 0x7CDCEFB7,
|
||||
"CF" => 0x0BDBDF21,
|
||||
"D0" => 0x86D3D2D4,
|
||||
"D1" => 0xF1D4E242,
|
||||
"D2" => 0x68DDB3F8,
|
||||
"D3" => 0x1FDA836E,
|
||||
"D4" => 0x81BE16CD,
|
||||
"D5" => 0xF6B9265B,
|
||||
"D6" => 0x6FB077E1,
|
||||
"D7" => 0x18B74777,
|
||||
"D8" => 0x88085AE6,
|
||||
"D9" => 0xFF0F6A70,
|
||||
"DA" => 0x66063BCA,
|
||||
"DB" => 0x11010B5C,
|
||||
"DC" => 0x8F659EFF,
|
||||
"DD" => 0xF862AE69,
|
||||
"DE" => 0x616BFFD3,
|
||||
"DF" => 0x166CCF45,
|
||||
"E0" => 0xA00AE278,
|
||||
"E1" => 0xD70DD2EE,
|
||||
"E2" => 0x4E048354,
|
||||
"E3" => 0x3903B3C2,
|
||||
"E4" => 0xA7672661,
|
||||
"E5" => 0xD06016F7,
|
||||
"E6" => 0x4969474D,
|
||||
"E7" => 0x3E6E77DB,
|
||||
"E8" => 0xAED16A4A,
|
||||
"E9" => 0xD9D65ADC,
|
||||
"EA" => 0x40DF0B66,
|
||||
"EB" => 0x37D83BF0,
|
||||
"EC" => 0xA9BCAE53,
|
||||
"ED" => 0xDEBB9EC5,
|
||||
"EE" => 0x47B2CF7F,
|
||||
"EF" => 0x30B5FFE9,
|
||||
"F0" => 0xBDBDF21C,
|
||||
"F1" => 0xCABAC28A,
|
||||
"F2" => 0x53B39330,
|
||||
"F3" => 0x24B4A3A6,
|
||||
"F4" => 0xBAD03605,
|
||||
"F5" => 0xCDD70693,
|
||||
"F6" => 0x54DE5729,
|
||||
"F7" => 0x23D967BF,
|
||||
"F8" => 0xB3667A2E,
|
||||
"F9" => 0xC4614AB8,
|
||||
"FA" => 0x5D681B02,
|
||||
"FB" => 0x2A6F2B94,
|
||||
"FC" => 0xB40BBE37,
|
||||
"FD" => 0xC30C8EA1,
|
||||
"FE" => 0x5A05DF1B,
|
||||
"FF" => 0x2D02EF8D
|
||||
];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Initialize Skills From Skills.txt
|
||||
*/
|
||||
|
@@ -52,7 +52,7 @@
|
||||
<link rel="stylesheet" href="/res/font-awesome.min.css">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Lato:wght@300&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://bootswatch.com/4/sketchy/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="https://bootswatch.com/4/lumen/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="/res/style.css">
|
||||
<link rel="stylesheet" href="/res/<?php echo $css ?>">
|
||||
<style>
|
||||
|
Reference in New Issue
Block a user