mirror of
https://gitlab.com/hashborgir/d2tools.git
synced 2024-11-30 12:36:03 +00:00
Refactored items to proper classes
This commit is contained in:
parent
eb3bc1cb7d
commit
6c4feed124
@ -12,6 +12,7 @@ require_once './_pdo.php';
|
|||||||
|
|
||||||
require_once './src/D2Functions.php';
|
require_once './src/D2Functions.php';
|
||||||
require_once './src/D2BitReader.php';
|
require_once './src/D2BitReader.php';
|
||||||
|
require_once './src/D2ByteReader.php';
|
||||||
//require_once './src/D2Item.php';
|
//require_once './src/D2Item.php';
|
||||||
|
|
||||||
|
|
||||||
@ -39,35 +40,41 @@ $filePath = "D:\Diablo II\MODS\ironman-dev\save\Sorc.d2s";
|
|||||||
$fp = fopen($filePath, 'r+b');
|
$fp = fopen($filePath, 'r+b');
|
||||||
$data = file_get_contents($filePath);
|
$data = file_get_contents($filePath);
|
||||||
|
|
||||||
|
$i_TotalOffset = strpos($data, "JM");
|
||||||
|
fseek($fp, $i_TotalOffset + 2);
|
||||||
|
$i_Total = unpack('S*', (fread($fp, 2)))[1];
|
||||||
|
|
||||||
|
$i_Offsets = [];
|
||||||
$i_offset = strpos($data, "JM");
|
for($i=0; $i <= $i_Total; $i++){
|
||||||
|
$i_Offsets[] = strposX($data, "JM", $i+2);
|
||||||
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($i_Offsets as $k=>$v){
|
||||||
foreach ($_items as $_item) {
|
$itemOffsets[$v] = $i_Offsets[$k+1] - $i_Offsets[$k];
|
||||||
$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));
|
|
||||||
}
|
|
||||||
$items[] = $item;
|
|
||||||
}
|
}
|
||||||
|
array_pop($itemOffsets);
|
||||||
|
|
||||||
|
|
||||||
|
//$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));
|
||||||
|
// }
|
||||||
|
// $items[] = $item;
|
||||||
|
//}
|
||||||
|
|
||||||
// ddump($items);
|
// ddump($items);
|
||||||
|
|
||||||
|
20
genDocs.php
20
genDocs.php
@ -789,8 +789,8 @@ if ($cmd == "genDocGems") {
|
|||||||
|
|
||||||
$htmlFinal = '';
|
$htmlFinal = '';
|
||||||
$htmlFinal .= $htmltop;
|
$htmlFinal .= $htmltop;
|
||||||
echo $htmltop;
|
//echo $htmltop;
|
||||||
ob_flush();
|
//ob_flush();
|
||||||
$table = '<table border=1 class="gemtable">
|
$table = '<table border=1 class="gemtable">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -804,9 +804,9 @@ if ($cmd == "genDocGems") {
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>';
|
<tbody>';
|
||||||
echo $table;
|
//echo $table;
|
||||||
$htmlFinal .= $table;
|
$htmlFinal .= $table;
|
||||||
ob_flush();
|
//ob_flush();
|
||||||
|
|
||||||
// $gems are all the gems, processed, now display them
|
// $gems are all the gems, processed, now display them
|
||||||
foreach ($gems as $g) {
|
foreach ($gems as $g) {
|
||||||
@ -858,17 +858,17 @@ if ($cmd == "genDocGems") {
|
|||||||
$htmlRow .= "</tr>";
|
$htmlRow .= "</tr>";
|
||||||
|
|
||||||
$htmlFinal .= $htmlRow;
|
$htmlFinal .= $htmlRow;
|
||||||
echo $htmlRow;
|
//echo $htmlRow;
|
||||||
ob_flush();
|
// ob_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
$htmlFinal .= $tableBottom . $htmlbottom;
|
$htmlFinal .= $tableBottom . $htmlbottom;
|
||||||
echo $tableBottom . $htmlbottom;
|
//echo $tableBottom . $htmlbottom;
|
||||||
ob_flush();
|
//ob_flush();
|
||||||
|
|
||||||
ob_start();
|
//ob_start();
|
||||||
file_put_contents("$dir/gems.html", $htmlFinal);
|
file_put_contents("$dir/gems.html", $htmlFinal);
|
||||||
header("Location: /docs/{$_SESSION['modname']}/gems.html");
|
header("Location: /docs/{$_SESSION['modname']}/gems.html",TRUE,301);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
154
src/D2ByteReader.php
Normal file
154
src/D2ByteReader.php
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once './src/D2Functions.php';
|
||||||
|
require_once './src/D2BitReader.php';
|
||||||
|
|
||||||
|
class D2ByteReader {
|
||||||
|
|
||||||
|
private string $data;
|
||||||
|
private int $offset = 0;
|
||||||
|
|
||||||
|
public function __construct(string $data) {
|
||||||
|
if (!$data)
|
||||||
|
return false;
|
||||||
|
$this->data = $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function skip(int $numBytes): bool {
|
||||||
|
if ($numBytes < 0 || $numBytes > strlen($this->data))
|
||||||
|
return false;
|
||||||
|
$this->offset += $numBytes;
|
||||||
|
return $true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function seek(int $pos): bool {
|
||||||
|
if ($pos < 0 || $pos > strlen($this->data))
|
||||||
|
return false;
|
||||||
|
$this->offset = $pos;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readh(int $offset, int $numBytes, bool $str = true): string {
|
||||||
|
$this->seek($offset);
|
||||||
|
$bytes = null;
|
||||||
|
for ($i = $this->offset; $i < $this->offset + $numBytes; $i++) {
|
||||||
|
$str ? $bytes .= $this->data[$i] : $bytes[] = $this->data[$i];
|
||||||
|
}
|
||||||
|
return unpack('H*', $bytes)[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readc(int $offset, int $numBytes, bool $str = true): array {
|
||||||
|
$this->seek($offset);
|
||||||
|
$bytes = null;
|
||||||
|
for ($i = $this->offset; $i < $this->offset + $numBytes; $i++) {
|
||||||
|
$str ? $bytes .= $this->data[$i] : $bytes[] = $this->data[$i];
|
||||||
|
}
|
||||||
|
return unpack('C*', $bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function rewind(): bool {
|
||||||
|
$this->offset = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function writeByte(int $offset, int $byte) {
|
||||||
|
$this->data[$offset] = pack('C', $byte);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function writeBytes(int $offset, string $bytes) {
|
||||||
|
if ($offset < 0 || $offset > strlen($this->data) || $bytes == '')
|
||||||
|
return false;
|
||||||
|
$_bytes = str_split($bytes, 2);
|
||||||
|
foreach ($_bytes as $k => $byte) {
|
||||||
|
$pos = $offset + $k;
|
||||||
|
$this->data[$pos] = pack('H*', $byte);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getData() {
|
||||||
|
return $this->data ? $this->data : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getOffset(): int {
|
||||||
|
return $this->offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isHexString(string $str): bool {
|
||||||
|
if (strlen($str) % 2 == 0 && (ctype_xdigit($str))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function toBits($input): string {
|
||||||
|
$output = '';
|
||||||
|
if ($this->isHexString($input)) {
|
||||||
|
foreach (str_split($input, 2) as $byte) {
|
||||||
|
$output .= (strrev(str_pad(decbin(hexdec($byte)), 8, 0, STR_PAD_LEFT)));
|
||||||
|
}
|
||||||
|
return $output;
|
||||||
|
} else if (is_string($input)) {
|
||||||
|
foreach (str_split($input) as $i) {
|
||||||
|
$output .= strrev(str_pad(decbin(ord($i)), 8, 0, STR_PAD_LEFT));
|
||||||
|
}
|
||||||
|
return $output;
|
||||||
|
} else if (is_int($input)) {
|
||||||
|
return strrev(str_pad(decbin($input), 8, 0, STR_PAD_LEFT));
|
||||||
|
} else if (is_array($input)) {
|
||||||
|
foreach ($input as $i) {
|
||||||
|
$output .= $this->tobits($i);
|
||||||
|
}
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function toBytes(string $bits) {
|
||||||
|
foreach (str_split($bits, 8) as $byteString) {
|
||||||
|
$bytes[] = (bindec(strrev($byteString)));
|
||||||
|
}
|
||||||
|
foreach ($bytes as $byte) {
|
||||||
|
dump($byte);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function bitsToHexString(string $bits): string {
|
||||||
|
$bytes = '';
|
||||||
|
foreach (str_split($bits, 8) as $byte) {
|
||||||
|
$bytes .= (str_pad(dechex((bindec(strrev($byte)))), 2, 0, STR_PAD_LEFT));
|
||||||
|
}
|
||||||
|
return $bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function bitsToHexArray(string $bits): array {
|
||||||
|
$bytes = [];
|
||||||
|
foreach (str_split($bits, 8) as $byte) {
|
||||||
|
$bytes[] = (str_pad(dechex((bindec(strrev($byte)))), 2, 0, STR_PAD_LEFT));
|
||||||
|
}
|
||||||
|
return $bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function bitsToIntArray(string $bits): array {
|
||||||
|
$bytes = [];
|
||||||
|
foreach (str_split($bits, 8) as $byte) {
|
||||||
|
$bytes[] = (int) (str_pad(dechex((bindec(strrev($byte)))), 2, 0, STR_PAD_LEFT));
|
||||||
|
}
|
||||||
|
return $bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@return Byte with Nth bit set to X
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function setBit(int $byte, int $pos, bool $bit) {
|
||||||
|
return ($bit ? ($byte | (1 << $pos)) : ($byte & ~(1 << $pos)) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@return Bit at Nth position in Byte
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function getBit(int $byte, int $pos): int {
|
||||||
|
return intval(($byte & (1 << $pos)) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -5,6 +5,7 @@ require_once 'D2Files.php';
|
|||||||
require_once 'D2BitReader.php';
|
require_once 'D2BitReader.php';
|
||||||
require_once 'D2Strings.php';
|
require_once 'D2Strings.php';
|
||||||
require_once 'D2Item.php';
|
require_once 'D2Item.php';
|
||||||
|
require_once 'D2ByteReader.php';
|
||||||
|
|
||||||
class D2Char {
|
class D2Char {
|
||||||
|
|
||||||
@ -31,31 +32,24 @@ class D2Char {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function parseItems() {
|
public function parseItems() {
|
||||||
$_data = file_get_contents($this->filePath);
|
$data = file_get_contents($this->filePath);
|
||||||
// get offset of first JM and skip it
|
$ByteReader = new D2ByteReader($data);
|
||||||
$_offset = strpos($_data, "JM") + 2;
|
|
||||||
// seek to items_total offset
|
|
||||||
fseek($this->fp, $_offset);
|
|
||||||
// item total is a SHORT 16 bits, 2 bytes
|
|
||||||
$_total = unpack('S*', (fread($this->fp, 2)))[1];
|
|
||||||
|
|
||||||
// Items start from 2nd JM
|
$i_TotalOffset = strpos($data, "JM");
|
||||||
for ($i = 2; $i <= $_total; $i++) {
|
fseek($this->fp, $i_TotalOffset + 2);
|
||||||
// seek to Each JM (every item begins with JM
|
$i_Total = unpack('S*', (fread($this->fp, 2)))[1];
|
||||||
fseek($this->fp, strposX($_data, 'JM', $i));
|
|
||||||
// read and unpack 21 bytes as array of byte/char (8 bit each)
|
$i_Offsets = [];
|
||||||
$_items[] = unpack('C*', fread($this->fp, 21));
|
for ($i = 0; $i <= $i_Total; $i++) {
|
||||||
|
$i_Offsets[] = strposX($data, "JM", $i + 2);
|
||||||
}
|
}
|
||||||
// Convert item bytes to 21x8 bitfield
|
foreach ($i_Offsets as $k => $v) {
|
||||||
// each byte is reversed with strrev() for correct bit position
|
$itemOffsets[$v] = $i_Offsets[$k + 1] - $i_Offsets[$k];
|
||||||
// to convert back to ascii, read bits from any position, reverse, bindec(chr())
|
}
|
||||||
foreach ($_items as $_item) {
|
array_pop($itemOffsets);
|
||||||
$item = null;
|
$_items=[];
|
||||||
foreach ($_item as $i_bytes) {
|
foreach ($itemOffsets as $offset => $bytes) {
|
||||||
$item .= strrev(str_pad(decbin($i_bytes), 8, 0, STR_PAD_LEFT));
|
$this->items[] = new D2Item($ByteReader->toBits($ByteReader->readh($offset, $bytes)));
|
||||||
// $item .= (str_pad(dechex($i_bytes), 2, 0, STR_PAD_LEFT));
|
|
||||||
}
|
|
||||||
$this->items[] = new D2Item($item); // return an array of item details
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ $form = new Formr\Formr();
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
//ddump($charData);
|
ddump($charData);
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user