From 410376d2d874662a2f04d81bdc06c66c43cd4f65 Mon Sep 17 00:00:00 2001 From: Hash Borgir Date: Sun, 18 Jun 2023 21:02:51 -0600 Subject: [PATCH] latest, mostly working, having trouble reading item props --- CharEditor.php | 2 +- src/D2Functions.php | 11 + src/D2Item.php | 548 +++++++- src/D2ItemStructureData.php | 2454 +++++++++++++++++++++++++++++++---- 4 files changed, 2729 insertions(+), 286 deletions(-) diff --git a/CharEditor.php b/CharEditor.php index 54ba458..9f0d07a 100644 --- a/CharEditor.php +++ b/CharEditor.php @@ -43,7 +43,7 @@ foreach ($ISCData as $k => $v) { //$filePath = "D:\Diablo II\MODS\MedianXL2012\save\Test.d2s"; -$filePath = "testa.d2s"; +$filePath = "Test110.d2s"; $char = new D2Char($filePath); //$char->setChar("CharacterStatus", "Died", 0); diff --git a/src/D2Functions.php b/src/D2Functions.php index 8056f0d..eb28a8e 100755 --- a/src/D2Functions.php +++ b/src/D2Functions.php @@ -67,6 +67,17 @@ function dump($var) { //echo json_encode($var, JSON_INVALID_UTF8_IGNORE | JSON_PRETTY_PRINT); } +function d($variable) { + echo '
';
+    if (is_string($variable)) {
+        echo 'String (' . strlen($variable) . ') "' . htmlspecialchars($variable) . '"';
+    } else {
+        print_r($variable);
+    }
+    echo '
'; +} + + /** * @param string $str * @return string diff --git a/src/D2Item.php b/src/D2Item.php index 43c48e6..190911d 100644 --- a/src/D2Item.php +++ b/src/D2Item.php @@ -4,12 +4,448 @@ require_once 'D2BitReader.php'; require_once 'D2ItemStructureData.php'; require_once 'D2Strings.php'; require_once 'D2Functions.php'; +require_once 'D2ItemData.php'; /** * */ + class D2Item { + /** + * @var null + */ + private $bits = null; + private $charName; + + /** + * @var null + */ + public $iData = null; + + /** + * @param $bits + */ + public function __construct($bits, $charName = null) { + if ($bits == '') + return false; + $this->bits = $bits; + $this->charName = $charName; + return $this->parseItem(); + } + + /* set $this->iData to array of item details + * + * @return array of item details + */ + + /** + * @return null + */ + private function parseItem() { + $b = new D2BitReader($this->bits); + $b->skip(16); // Skip JM + $b->skip(4); // skip unknown 4 bytes + $this->iData['identified'] = $b->read(1); // bit 20, identified + $b->skip(6); // skip unknown 6 bytes + $this->iData['socketed'] = $b->read(1); // bit 27, socketed + $b->skip(1); + // This bit is set on items which you have picked up since the last time the game was saved. + $this->iData['pickedUpSinceLastSave'] = $b->read(1); // bit 29 + $b->skip(2); + $this->iData['ear'] = $b->read(1); // bit 32 bool + $this->iData['startingItem'] = $b->read(1); // bit 33 bool + $b->skip(3); + $this->iData['compact'] = $b->read(1); // bit 37 compact + $this->iData['ethereal'] = $b->read(1); // bit 38 ethereal + $b->skip(1); // unknown, seems always 1 + $this->iData['personalized'] = $b->read(1); // bit 40 Item has been personalized (by Anya in Act V) + $b->skip(1); + $this->iData['runeword'] = $b->read(1); // bit 42 the item has been given a Rune Word. + $b->skip(15); // unknown; some of these bits may be set + // item location + $location = bindec($b->readr(3)); // bit 58 parent Item location. + $body = bindec($b->readr(4)); // bit 61 If the item is equipped + $col = bindec($b->readr(4)); // bit 65 Column number of the left corner of the item + $row = bindec($b->readr(4)); // bit 69 Row number of the top of the item, counting from 0. + $_stored = bindec($b->readr(3)); // bit 73 + // The number of gems (or skulls or jewels) which have been glued to this item (if socketed). There will be this many additional item structures for the gems immediately following this item, in the order that the gems were inserted. + // get item code + $b->seek(76); + $itemCode = ''; + foreach (str_split($b->read(32), 8) as $byte) { + $itemCode .= chr(bindec(strrev($byte))); + } + $this->iData['code'] = trim($itemCode); + $sql = "SELECT * from armor WHERE code = '{$this->iData['code']}'"; + $res = PDO_FetchRow($sql); + if (empty($res)) { + $sql = "SELECT * from misc WHERE code = '{$this->iData['code']}'"; + $res = PDO_FetchRow($sql); + } + if (empty($res)) { + $sql = "SELECT * from weapons WHERE code = '{$this->iData['code']}'"; + $res = PDO_FetchRow($sql); + } + + // set txt data array + $this->iData['txt'] = ($res); + + $sql = " + SELECT code, namestr + FROM armor + WHERE code = '{$this->iData['code']}' + UNION + SELECT code, namestr + FROM misc + WHERE code = '{$this->iData['code']}' + UNION + SELECT code, namestr + FROM weapons + WHERE code = '{$this->iData['code']}' + "; + $res = PDO_FetchAssoc($sql); + + $sql = "SELECT `String` FROM strings WHERE `Key`='{$res[$this->iData['code']]}'"; + $res = PDO_FetchOne($sql); + $this->iData['basename'] = $res; + $this->iData['basename'] = preg_replace('/ÿc[0-9]/', '', $this->iData['basename']); + + $b->seek(108); + $this->iData['gems_in'] = bindec($b->readr(3)); + + // if item is not compact, then we read extended properties + + if (!$this->iData['compact']) { + // bit 111, 32bits, Unique identifier. Diablo II randomly generates a value for this field in order to discourage cheaters from "duping" items. + //This appears to be the item's level; i.e., the level with which the item was created (or 'dropped'). The item level is based on the level of the monster who dropped it, the level of the area you're in if found in a chest, or, in rare cases, your characters level. The item level determines what modifiers are allowed on the item. + $b->seek(143); + $this->iData['ilvl'] = bindec($b->readr(7)); + + $b->seek(150); + $quality = bindec($b->readr(4)); + + switch ($quality) { + case D2ItemQuality::LOW_QUALITY: + $this->iData['iquality'] = "Low Quality"; + break; + case D2ItemQuality::NORMAL: + $this->iData['iquality'] = "Normal"; + break; + case D2ItemQuality::HIGH_QUALITY: + $this->iData['iquality'] = "High Quality"; + break; + case D2ItemQuality::MAGIC: + $this->iData['iquality'] = "Magic"; + break; + case D2ItemQuality::SET: + $this->iData['iquality'] = "Set"; + break; + case D2ItemQuality::RARE: + $this->iData['iquality'] = "Rare"; + break; + case D2ItemQuality::UNIQUE: + $this->iData['iquality'] = "Unique"; + break; + case D2ItemQuality::CRAFTED: + $this->iData['iquality'] = "Crafted"; + break; + default: + $this->iData['iquality'] = "Unknown"; + break; + } + + // after reading item quality, we're at 154 offset. + // ring/amu/jew/char or not. 1 or 0. if 1, next 3 are set + // If this bit is set, the item has one of multiple pictures associated with it; the next field determines which picture a particular item uses. If this bit is 0, the next field is absent. The picture field is used for rings, amulets, jewels, and charms. + // After the above data, if the item is a ring, amulet, jewel, or charm, then it has a 1 bit followed by three more bits. All other items (that I've seen) have just a single 0 bit. + $b->seek(154); // picture bit + $ring = bindec($b->read(1)); + if ($ring) { // we read 1 bit at 154, end up at 155 + $b->seek(155); + $ringPic = bindec($b->readr(3)); // for jew, amu, rin, char + } + // if ring bit is 0, go to 155 and read 1 bit + else { + // This bit apparently is set for certain class-specific Expansion Set items. It indicates the presence of the next 11-bit field. If this bit is 0, the next field is absent. + $b->seek(155); + $_class_specific = bindec($b->read(1)); + } + /* Credit for the discovery of this field's meaning goes entirely to Guillaume Courtin of France. Thanks! :-> + This field indicates magic properties which are inherent in certain class-specific items. A given class-specific item will (almost) always start with the same set of properties, even if its quality is "normal". Other quality ratings may add more properties to the standard set. It appears that items which will have this field are: + Amazon-only bows, spears, and javelins + Voodoo heads (Necromancer-only shields) + Paladin-only shields + Orbs (Sorceress-Only wands) + */ + // if class specific bit (155) is 1, then go to 156 and read 11 bits + if ($_class_specific) { + $b->seek(156); + $class_specific = bindec($b->readr(11)); + } + + //var_dump($b->getOffset()); + + switch ($quality) { + case D2ItemQuality::LOW_QUALITY: + $low_quality_item_data = bindec($b->readr(3)); + switch ($low_quality_item_data) { + case 0: + $this->iData['low_quality_item_data'] = "Crude"; + break; + case 1: + $this->iData['low_quality_item_data'] = "Cracked"; + break; + case 2: + $this->iData['low_quality_item_data'] = "Damaged"; + break; + case 3: + $this->iData['low_quality_item_data'] = "Low Quality"; + break; + default: + $this->iData['low_quality_item_data'] = "Unknown quality"; + break; + } + break; + // Normal items have no extra quality data. + case D2ItemQuality::NORMAL: + break; + case D2ItemQuality::HIGH_QUALITY: + $high_quality_item_data = bindec($b->readr(3)); + break; + case D2ItemQuality::MAGIC: + // read 11 bits, prefix. + // if no prefix, then next 11 bits will be suffix + $this->iData['magic_prefix'] = bindec($b->readr(11)); + if (!$this->iData['magic_prefix']) { + $this->iData['magic_suffix'] = bindec($b->readr(11)); + } + if (!empty($this->iData['magic_prefix'])) { + $sql = "SELECT * FROM magicprefix WHERE ROWID='{$this->iData['magic_prefix']}'"; + $res = PDO_FetchRow($sql); + $this->iData['magic_prefix'] = $res; + } + if (!empty($this->iData['magic_suffix'])) { + $sql = "SELECT * FROM magicsuffix WHERE ROWID='{$this->iData['magic_sufffix']}'"; + $res = PDO_FetchRow($sql); + $this->iData['magic_suffix'] = $res; + } + + break; + case D2ItemQuality::SET: + // Set items have a 12-bit field containing the ID of the set. (Not the set member, but the whole set.) The set member is identified by cross-referencing the item type with the set ID. Also note that set items have an extra field following the item-specific data. + // Set identifier; i.e., all items which are part of the set will have the same value in this field. + //var_dump($b->getOffset()); + $setid = bindec($b->readr(12)); + //var_dump($setid); + // first get set name + $sql = "SELECT `set` from setitems WHERE ROWID=$setid"; + $set = PDO_FetchOne($sql); + $this->iData["setname"] = $set; + + $sql = "SELECT * from setitems WHERE `set`=? AND item=?"; + $res = PDO_FetchRow($sql, [$set, $this->iData['code']]); + + $this->iData["data"] = $res; + + break; + case D2ItemQuality::RARE: + + // this is from rare suffix/prefix.txt + $ID1 = bindec($b->readr(8)); + $ID2 = bindec($b->readr(8)); + + $this->iData['iquality'] = 'Rare'; + + // these are from magix suffix/perfi + + $prefixes = []; + $suffixes = []; + + for ($i = 1; $i <= 3; $i++) { + $prefixBit = $b->read(1); + if ($prefixBit) { + $prefixes[] = bindec($b->readr(11)); + } + + $suffixBit = $b->read(1); + if ($suffixBit) { + $suffixes[] = bindec($b->readr(11)); + } + } + + // now for each prefix/suffix array, we need to + // generate ISC strings + + $this->iData['prefixes'] = $prefixes; + $this->iData['suffixes'] = $suffixes; + + break; + case D2ItemQuality::UNIQUE: + //Unique items have an additional 12 bit field, which in most cases is the unique item ID. The few exceptions are certain quest items (e.g., the Horadric Malus). + $unid = bindec($b->readr(12)); + $sql = "SELECT * from uniqueitems WHERE ROWID=$unid"; + $res = PDO_FetchRow($sql); + $this->iData['data'] = $res; + + break; + case D2ItemQuality::CRAFTED: + $this->iData['iquality'] = "Crafted"; + break; + default: + $this->iData['iquality'] = "Unknown"; + break; + } + } + + if ($this->iData['runeword']) { + $runeName_possibly = bindec($b->readr(12)); + $b->skip(4); + } + + if ($this->iData['personalized']) { + $charName = ""; + + $charBits = $b->readr(7); // Read the first 7 bits + while ($charBits !== "0000000") { // Check for null termination + $char = chr(bindec($charBits)); + $charName .= $char; + + $charBits = $b->readr(7); // Read the next 7 bits + } + } + + $tome = $b->readr(5); + + // Unknown (denoted as 'timestamp' in various places) + $b->skip(1); + + // Now begins item specific data/stats + + $sql = "SELECT code FROM armor WHERE code = ?"; + $res = PDO_FetchOne($sql, [$this->iData['code']]); + + // this is an armor + //Only exists if the item is an armor (i.e. the item code is found in Armor.txt) + // Defense of the armor. Subtract this value by 10 to get the true armor value (note: this -10 matches the "Save Add" column in ItemStatCost.txt for the armor stat). + if (!empty($res)) { + $defense = bindec($b->readr(11)) - 10; + $durability = bindec($b->readr(8)); + } + + $sql = "SELECT code FROM weapons WHERE code = ?"; + $res = PDO_FetchOne($sql, [$this->iData['code']]); + + // this is a weapon + // get durability + if (!empty($res)) { + $durability = bindec($b->readr(8)); + } + + // Only exists if the item's max durability is greater than zero + //The first 8 bits are the item's current durability. The last bit is unknown. + $b->skip(9); + + $sql = "SELECT code FROM armor WHERE code = ?"; + $res = PDO_FetchOne($sql, [$this->iData['code']]); + + // weird behavior/bug + // if item is in a container, bodypart will be NULL + // if item is on bodypart, container will be NULL + switch ($location) { + case D2ItemLocation::BELT: + $this->iData['container'] = 'Belt'; + break; + case D2ItemLocation::CURSOR: + break; + case D2ItemLocation::SOCKET: + break; + case D2ItemLocation::STORED: + switch ($_stored) { + case D2ItemLocationStored::NONE: + + $this->iData['container'] = 'None'; // item is not stored, check bit 58 + break; + case D2ItemLocationStored::INVENTORY: + $this->iData['container'] = 'Inventory'; + break; + case D2ItemLocationStored::CUBE: + $this->iData['container'] = 'Horadric Cube'; + break; + case D2ItemLocationStored::STASH: + $this->iData['container'] = 'Stash'; + break; + default: $this->iData['container'] = 'Unknown'; + break; + } + break; + case D2ItemLocation::EQUIPPED: + switch ($body) { + case D2ItemLocationBody::HELMET: $this->iData['location'] = 'Helmet'; + $this->iData['container'] = 'Body'; + break; + case D2ItemLocationBody::AMULET: $this->iData['location'] = 'Amulet'; + $this->iData['container'] = 'Body'; + break; + case D2ItemLocationBody::ARMOR: $this->iData['location'] = 'Armor'; + $this->iData['container'] = 'Body'; + break; + case D2ItemLocationBody::WEAPONR: $this->iData['location'] = 'Weapon R'; + $this->iData['container'] = 'Body'; + break; + case D2ItemLocationBody::WEAPONL: $this->iData['location'] = 'Weapon L'; + $this->iData['container'] = 'Body'; + break; + case D2ItemLocationBody::RINGR: $this->iData['location'] = 'Ring R'; + $this->iData['container'] = 'Body'; + break; + case D2ItemLocationBody::RINGL: $this->iData['location'] = 'Ring L'; + $this->iData['container'] = 'Body'; + break; + case D2ItemLocationBody::BELT: $this->iData['location'] = 'Belt'; + $this->iData['container'] = 'Body'; + break; + case D2ItemLocationBody::BOOTS: $this->iData['location'] = 'Boots'; + $this->iData['container'] = 'Body'; + break; + case D2ItemLocationBody::GLOVES: $this->iData['location'] = 'Gloves'; + $this->iData['container'] = 'Body'; + break; + case D2ItemLocationBody::WEAPONR2: $this->iData['location'] = 'Weapon Alt R'; + $this->iData['container'] = 'Body'; + break; + case D2ItemLocationBody::WEAPONL2: $this->iData['location'] = 'Weapon Alt L'; + $this->iData['container'] = 'Body'; + break; + default: $this->iData['location'] = 'Unknown'; + break; + } + break; + } + + // if item is ear + if ($this->iData['ear']) { + // set item code/basename + $this->iData['itemCode'] = 'ear'; + $this->iData['basename'] = 'Ear'; + // get ear class/level + $eclass = bindec($b->readr(3)); // bit 76 + $elevel = bindec($b->readr(7)); // bit 79 + // get ear char's name + } + + + + + + return $this->iData; + } + +} + + +class D2Item_NEW { + private $bits = null; // Item bitstring private $oldbits = null; // Old Item bits for comparison private $charName; // Character Name @@ -53,6 +489,12 @@ class D2Item { $this->b = new D2BitReader($bits); // D2BitReader object $this->oldbits = $bits; $this->charName = $charName; + + + $this->ISC = new D2ItemData(); + + //ddump($this->ISC->getIscStrings('mana')); + $this->parseItem(); } @@ -155,6 +597,7 @@ class D2Item { switch ($quality) { case D2ItemQuality::LOW_QUALITY: $this->quality = "Low Quality"; + echo $this->quality; $this->low_quality_item_data = $this->b->read(3); $low_quality_item_data = bindec(strrev($this->low_quality_item_data)); switch ($low_quality_item_data) { @@ -178,19 +621,21 @@ class D2Item { break; case D2ItemQuality::NORMAL: $this->quality = "Normal"; + echo $this->quality; break; case D2ItemQuality::HIGH_QUALITY: $this->quality = "High Quality"; + echo $this->quality; $this->high_quality_item_data = $this->b->read(3); break; case D2ItemQuality::MAGIC: $this->quality = "Magic"; + echo $this->quality; // read 11 bits, prefix. // if no prefix, then next 11 bits will be suffix $this->magic_prefix = $this->b->read(11); - if (!bindec($this->magic_prefix)) { - $this->magic_suffix = $this->b->read(11); - } + $this->magic_suffix = $this->b->read(11); + $prefix = bindec(strrev($this->magic_prefix)); $suffix = bindec(strrev($this->magic_suffix)); @@ -258,10 +703,34 @@ class D2Item { break; case D2ItemQuality::UNIQUE: $this->quality = "Unique"; + echo $this->quality; $this->unique = $this->b->read(12); break; case D2ItemQuality::CRAFTED: $this->quality = "Crafted"; + echo $this->quality; + // this is from rare suffix/prefix.txt + $this->rareID1 = $this->b->read(8); + $this->rareID2 = $this->b->read(8); + + // these are from magix suffix/perfi + + $prefixes = []; + $suffixes = []; + + for ($i = 0; $i < 3; $i++) { + $this->prefixBit = $this->b->read(1); + if ($this->prefixBit) { + $this->_prefixes[$i] = $this->b->read(11); + $prefixes[$i] = bindec(strrev($this->_prefixes[$i])); + } + + $this->suffixBit = $this->b->read(1); + if ($this->suffixBit) { + $this->_suffixes[$i] = $this->b->read(11); + $suffixes[$i] = bindec(strrev($this->_sufffixes[$i])); + } + } break; default: $this->quality = "Unknown"; @@ -305,7 +774,7 @@ class D2Item { // if it is an Armor, then get defense if (!empty($res)) { - $this->defense = $this->b->read($SaveAdd); + $this->defense = $this->b->read(11); $this->_defense = bindec(strrev($this->defense)) - 10; var_dump("Def:" . $this->defense); @@ -328,11 +797,11 @@ class D2Item { //Only exists if the item's max durability is greater than zero //The first 8 bits are the item's current durability. The last bit is unknown. if ($this->maxdurability !== 0) { - $this->currentdurability = $this->b->read(8); + $this->currentdurability = $this->b->read(9); $this->_currentdurability = bindec(strrev($this->currentdurability)); var_dump("CurDur:" . $this->currentdurability); var_dump("CurDur:" . $this->_currentdurability); - $this->currentdurability_unknown_bit = $this->b->read(1); + //$this->currentdurability_unknown_bit = $this->b->read(1); } } @@ -349,11 +818,11 @@ class D2Item { //Only exists if the item's max durability is greater than zero //The first 8 bits are the item's current durability. The last bit is unknown. if ($this->maxdurability !== 0) { - $this->currentdurability = $this->b->read(8); + $this->currentdurability = $this->b->read(9); $this->_currentdurability = bindec(strrev($this->currentdurability)); var_dump("CurDur:" . $this->currentdurability); var_dump("CurDur:" . $this->_currentdurability); - $this->currentdurability_unknown_bit = $this->b->read(1); + //$this->currentdurability_unknown_bit = $this->b->read(1); } } @@ -381,30 +850,57 @@ class D2Item { if (($quality == D2ItemQuality::SET)) { $this->setfield = $this->b->read(5); // mismatch, need to debug - //var_dump($this->setProps); + //d($this->setProps); } - $magicprops = new D2ItemProperties(); - - $props = $magicprops->magicprops; - + + $sql = "SELECT * FROM itemstatcost"; + $isc = PDO_FetchAll($sql); + + + + + $readbits = []; // read properties here $property = $this->b->read(9); $_property = bindec(strrev($property)); - - var_dump($property); + + $val = bindec(strrev($this->b->read((($isc[$_property]['Save Bits']))))); + var_dump($_property); - - //var_dump($props); -//// $properties = []; -// while ($property !== "111111111") { // property is not 0x1FF (9 1s) -// -// ddump($props[bindec(strrev($property))]['Bits'][0]); -// -// //$properties[bindec(strrev($property))] = $this->b->read($props[bindec(strrev($property))]['Bits'][0]); -// $property = $this->b->read(9); + var_dump($val); + var_dump($isc[$_property]); + + + +// foreach ($props[$_property]['Bits'] as $k => $v) { +// $readbits[$k] = $v; +// } +// +// //var_dump($readbits); +// +// $propval = []; +// if (!empty($readbits)) { +// foreach ($readbits as $k => $v) { +// $x = $this->b->read($v); +// $propval[$_property][] = $x; +// $_propval[$_property][] = bindec(strrev($x)); +// $_propval[$_property][] = $props[$_property]; +// +// } // } - //ddump($properties); +// +// var_dump("prop: " . (($property))); +// var_dump("prop: " . (($_property))); +// var_dump((($propval))); + + + + if($this->simple) { + echo "Simple"; + } + + // dump out data $oldbitsSplit = str_split($this->oldbits, 8); $dumpValuesSplit = str_split($this->dumpValues(), 8); @@ -484,7 +980,7 @@ class D2Item { $values[] = $this->currentdurability_unknown_bit; $values[] = $this->stackable; $values[] = $this->numsockets; - //$values[] = $this->numsockets_extra_bit; + $values[] = $this->numsockets_extra_bit; $values[] = $this->setfield; $values[] = ""; $values[] = ""; diff --git a/src/D2ItemStructureData.php b/src/D2ItemStructureData.php index 5e54132..6a3b219 100644 --- a/src/D2ItemStructureData.php +++ b/src/D2ItemStructureData.php @@ -145,265 +145,2201 @@ class D2ItemQuality { class D2ItemProperties { public $magicprops = [ - 0 => ['Bits' => [8], 'Bias' => 32, 'Name' => '+{0} to Strength'], - 1 => ['Bits' => [7], 'Bias' => 32, 'Name' => '+{0} to Energy'], - 2 => ['Bits' => [7], 'Bias' => 32, 'Name' => '+{0} to Dexterity'], - 3 => ['Bits' => [7], 'Bias' => 32, 'Name' => '+{0} to Vitality'], - 7 => ['Bits' => [9], 'Bias' => 32, 'Name' => '+{0} to Life'], - 9 => ['Bits' => [8], 'Bias' => 32, 'Name' => '+{0} to Mana'], - 11 => ['Bits' => [8], 'Bias' => 32, 'Name' => '+{0} to Maximum Stamina'], - 16 => ['Bits' => [9], 'Name' => '+{0}% Enhanced Defense'], - 17 => ['Bits' => [9, 9], 'Name' => '+{0}% Enhanced Damage'], - 19 => ['Bits' => [10], 'Name' => '+{0} to Attack rating'], - 20 => ['Bits' => [6], 'Name' => '+{0}% Increased chance of blocking'], - 21 => ['Bits' => [6], 'Name' => '+{0} to Minimum 1-handed damage'], - 22 => ['Bits' => [7], 'Name' => '+{0} to Maximum 1-handed damage'], - 23 => ['Bits' => [6], 'Name' => '+{0} to Minimum 2-handed damage'], - 24 => ['Bits' => [7], 'Name' => '+{0} to Maximum 2-handed damage'], - 25 => ['Bits' => [8], 'Name' => 'Unknown (Invisible)'], // damagepercent - 26 => ['Bits' => [8], 'Name' => 'Unknown (Invisible)'], // manarecovery - 27 => ['Bits' => [8], 'Name' => 'Regenerate Mana {0}%'], - 28 => ['Bits' => [8], 'Name' => 'Heal Stamina {0}%'], - 31 => ['Bits' => [11], 'Bias' => 10, 'Name' => '+{0} Defense'], - 32 => ['Bits' => [9], 'Name' => '+{0} vs. Missile'], - 33 => ['Bits' => [8], 'Bias' => 10, 'Name' => '+{0} vs. Melee'], - 34 => ['Bits' => [6], 'Name' => 'Damage Reduced by {0}'], - 35 => ['Bits' => [6], 'Name' => 'Magic Damage Reduced by {0}'], - 36 => ['Bits' => [8], 'Name' => 'Damage Reduced by {0}%'], - 37 => ['Bits' => [8], 'Name' => 'Magic Resist +{0}%'], - 38 => ['Bits' => [8], 'Name' => '+{0}% to Maximum Magic Resist'], - 39 => ['Bits' => [8], 'Bias' => 50, 'Name' => 'Fire Resist +{0}%'], - 40 => ['Bits' => [5], 'Name' => '+{0}% to Maximum Fire Resist'], - 41 => ['Bits' => [8], 'Bias' => 50, 'Name' => 'Lightning Resist +{0}%'], - 42 => ['Bits' => [5], 'Name' => '+{0}% to Maximum Lightning Resist'], - 43 => ['Bits' => [8], 'Bias' => 50, 'Name' => 'Cold Resist +{0}%'], - 44 => ['Bits' => [5], 'Name' => '+{0}% to Maximum Cold Resist'], - 45 => ['Bits' => [8], 'Bias' => 50, 'Name' => 'Poison Resist +{0}%'], - 46 => ['Bits' => [5], 'Name' => '+{0}% to Maximum Poison Resist'], - 48 => ['Bits' => [10], 'Name' => 'Light Radius +{0}'], - 49 => ['Bits' => [7], 'Bias' => 100, 'Name' => 'Light Color'], // lightcolor - 52 => ['Bits' => [8], 'Bias' => 50, 'Name' => 'Fire Damage: {0}-{0}'], - 53 => ['Bits' => [8], 'Bias' => 50, 'Name' => 'Lightning Damage: {0}-{0}'], - 54 => ['Bits' => [8], 'Bias' => 50, 'Name' => 'Magic Damage: {0}-{0}'], - 55 => ['Bits' => [8], 'Bias' => 50, 'Name' => 'Cold Damage: {0}-{0}'], - 56 => ['Bits' => [8], 'Bias' => 50, 'Name' => 'Poison Damage: {0}-{0} over {0} seconds'], - 57 => ['Bits' => [8], 'Name' => 'Unknown (Invisible)'], // aurastate - 58 => ['Bits' => [8], 'Name' => 'Unknown (Invisible)'], // auraeffect - 59 => ['Bits' => [8], 'Name' => 'Unknown (Invisible)'], // auralevel - 60 => ['Bits' => [8], 'Name' => 'Unknown (Invisible)'], // staminarecovery - 62 => ['Bits' => [9], 'Bias' => 50, 'Name' => '{0}% Damage to Demons'], - 63 => ['Bits' => [9], 'Bias' => 50, 'Name' => '{0}% Damage to Undead'], - 64 => ['Bits' => [8], 'Name' => 'Attack Rating Against Demons +{0}'], - 65 => ['Bits' => [8], 'Name' => 'Attack Rating Against Undead +{0}'], - 66 => ['Bits' => [7], 'Name' => '+{0} to Attack Rating'], - 67 => ['Bits' => [9], 'Bias' => 50, 'Name' => '{0}% Faster Hit Recovery'], - 68 => ['Bits' => [9], 'Bias' => 50, 'Name' => '{0}% Faster Block Rate'], - 69 => ['Bits' => [9], 'Bias' => 50, 'Name' => '{0}% Faster Run/Walk'], - 70 => ['Bits' => [9], 'Bias' => 50, 'Name' => '{0}% Increased Chance of Getting Magic Items'], - 72 => ['Bits' => [8], 'Bias' => 10, 'Name' => '{0} to Light Radius'], - 73 => ['Bits' => [8], 'Name' => '{0} to Minimum Fire Damage'], - 74 => ['Bits' => [8], 'Name' => '{0} to Maximum Fire Damage'], - 75 => ['Bits' => [8], 'Name' => '{0} to Minimum Lightning Damage'], - 76 => ['Bits' => [8], 'Name' => '{0} to Maximum Lightning Damage'], - 77 => ['Bits' => [8], 'Name' => '{0} to Minimum Magic Damage'], - 78 => ['Bits' => [8], 'Name' => '{0} to Maximum Magic Damage'], - 79 => ['Bits' => [8], 'Name' => '{0} to Minimum Cold Damage'], - 80 => ['Bits' => [8], 'Name' => '{0} to Maximum Cold Damage'], - 81 => ['Bits' => [8], 'Name' => '{0} to Minimum Poison Damage'], - 82 => ['Bits' => [8], 'Name' => '{0} to Maximum Poison Damage'], - 83 => ['Bits' => [8], 'Name' => '{0} to Minimum Damage'], - 84 => ['Bits' => [8], 'Name' => '{0} to Maximum Damage'], - 85 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Life Stolen per Hit'], - 86 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Mana Stolen per Hit'], - 87 => ['Bits' => [8], 'Name' => '{0}% Stamina Drain'], - 88 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Extra Gold from Monsters'], - 89 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Better Chance of Getting Magic Items'], - 90 => ['Bits' => [8], 'Name' => '{0}% Knockback'], - 91 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Increased Attack Speed'], - 92 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Faster Cast Rate'], - 93 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Faster Hit Recovery'], - 94 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Faster Block Rate'], - 95 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Faster Run/Walk'], - 96 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Faster Hit Stamina Drain'], - 97 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Faster Hit Mana Drain'], - 98 => ['Bits' => [8], 'Name' => 'Replenish Life +{0}'], - 99 => ['Bits' => [8], 'Name' => 'Increase Maximum Durability {0}%'], - 100 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Damage'], - 101 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Defense'], - 102 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Minimum Damage'], - 103 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Maximum Damage'], - 104 => ['Bits' => [8], 'Name' => '{0}% Life Stolen per Hit'], - 105 => ['Bits' => [8], 'Name' => '{0}% Mana Stolen per Hit'], - 106 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Experience Gained'], - 107 => ['Bits' => [8], 'Name' => '{0}% to Maximum Experience'], - 108 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance of Getting Magic Items'], - 109 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance of Getting Magic Items (Quality)'], - 110 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance of Getting Magic Items (Exceptional)'], - 111 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance of Getting Magic Items (Elite)'], - 112 => ['Bits' => [8], 'Name' => 'Unknown (Invisible)'], // mysticorbs - 113 => ['Bits' => [8], 'Name' => 'Socketed (Number of Sockets: {0})'], - 114 => ['Bits' => [8], 'Name' => 'Level Requirement {0}'], - 115 => ['Bits' => [8], 'Name' => 'Unknown (Invisible)'], // maxsockets - 116 => ['Bits' => [8], 'Name' => 'Unknown (Invisible)'], // runeword - 117 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Target Defense'], - 118 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Increased Attack Speed'], - 119 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Faster Cast Rate'], - 120 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Faster Hit Recovery'], - 121 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Faster Block Rate'], - 122 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Faster Run/Walk'], - 123 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Faster Hit Stamina Drain'], - 124 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Faster Hit Mana Drain'], - 125 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Damage'], - 126 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Defense'], - 127 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Minimum Damage'], - 128 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Maximum Damage'], - 129 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Strength'], - 130 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Energy'], - 131 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Dexterity'], - 132 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Vitality'], - 133 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Life'], - 134 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Mana'], - 135 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Enhanced Maximum Stamina'], - 136 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Damage to Demons'], - 137 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Damage to Undead'], - 138 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Attack Rating Against Demons'], - 139 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Attack Rating Against Undead'], - 140 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Damage Taken Goes to Mana'], - 141 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Damage Taken Goes to Life'], - 142 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} on Striking'], - 143 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Struck'], - 144 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} on Attack'], - 145 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When You Die'], - 146 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} on Kill'], - 147 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (1)'], - 148 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (2)'], - 149 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (3)'], - 150 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (4)'], - 151 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (5)'], - 152 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (6)'], - 153 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (7)'], - 154 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (8)'], - 155 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (9)'], - 156 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (10)'], - 157 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (11)'], - 158 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (12)'], - 159 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (13)'], - 160 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (14)'], - 161 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (15)'], - 162 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (16)'], - 163 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (17)'], - 164 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (18)'], - 165 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (19)'], - 166 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (20)'], - 167 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (21)'], - 168 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (22)'], - 169 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (23)'], - 170 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (24)'], - 171 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (25)'], - 172 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (26)'], - 173 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (27)'], - 174 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (28)'], - 175 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (29)'], - 176 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (30)'], - 177 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (31)'], - 178 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (32)'], - 179 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (33)'], - 180 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (34)'], - 181 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (35)'], - 182 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (36)'], - 183 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (37)'], - 184 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (38)'], - 185 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (39)'], - 186 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (40)'], - 187 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (41)'], - 188 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (42)'], - 189 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (43)'], - 190 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (44)'], - 191 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (45)'], - 192 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (46)'], - 193 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (47)'], - 194 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (48)'], - 195 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (49)'], - 196 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (50)'], - 197 => ['Bits' => [6, 10, 7], 'Name' => '{2}% Chance to Cast Level {0} {1} When you die'], - // Order is spell id, level, % chance. - 198 => ['Bits' => [6, 10, 7], 'Name' => '{2}% Chance to Cast Level {0} {1} On Striking'], - 199 => ['Bits' => [6, 10, 7], 'Name' => '{2}% Chance to Cast Level {0} {1} On Striking'], - 200 => ['Bits' => [6, 10, 7], 'Name' => '{2}% Chance to Cast Level {0} {1} On Striking'], - // Order is spell id, level, % chance. - 201 => ['Bits' => [6, 10, 7], 'Name' => '{2}% Chance to Cast Level {0} {1} When Struck'], - 202 => ['Bits' => [6, 10, 7], 'Name' => '{2}% Chance to Cast Level {0} {1} When Struck'], - 203 => ['Bits' => [6, 10, 7], 'Name' => '{2}% Chance to Cast Level {0} {1} When Struck'], - // First value selects the spell id, second value is level, third is remaining charges - // and the last is the total number of charges. - 204 => ['Bits' => [6, 10, 8, 8], 'Name' => 'Level {0} {1} ({2}/{3} Charges)'], - 205 => ['Bits' => [6, 10, 8, 8], 'Name' => 'Level {0} {1} ({2}/{3} Charges)'], - 206 => ['Bits' => [6, 10, 8, 8], 'Name' => 'Level {0} {1} ({2}/{3} Charges)'], - 207 => ['Bits' => [6, 10, 8, 8], 'Name' => 'Level {0} {1} ({2}/{3} Charges)'], - 208 => ['Bits' => [6, 10, 8, 8], 'Name' => 'Level {0} {1} ({2}/{3} Charges)'], - 209 => ['Bits' => [6, 10, 8, 8], 'Name' => 'Level {0} {1} ({2}/{3} Charges)'], - 210 => ['Bits' => [6, 10, 8, 8], 'Name' => 'Level {0} {1} ({2}/{3} Charges)'], - 211 => ['Bits' => [6, 10, 8, 8], 'Name' => 'Level {0} {1} ({2}/{3} Charges)'], - 212 => ['Bits' => [6, 10, 8, 8], 'Name' => 'Level {0} {1} ({2}/{3} Charges)'], - 213 => ['Bits' => [6, 10, 8, 8], 'Name' => 'Level {0} {1} ({2}/{3} Charges)'], - // All values based on character level are stored in eights, so take - // the number divide by 8 and multiply by the character level and round down. - // Or, just do (value * 0.125)% per level. - 214 => ['Bits' => [6], 'Name' => '+{0} to Defense (Based on Character Level)'], - 215 => ['Bits' => [6], 'Name' => '{0}% Enhanced Defense (Based on Character Level)'], - 216 => ['Bits' => [6], 'Name' => '+{0} to Life (Based on Character Level)'], - 217 => ['Bits' => [6], 'Name' => '+{0} to Mana (Based on Character Level)'], - 218 => ['Bits' => [6], 'Name' => '+{0} to Maximum Damage (Based on Character Level)'], - 219 => ['Bits' => [6], 'Name' => '{0}% Enhanced Maximum Damage (Based on Character Level)'], - 220 => ['Bits' => [6], 'Name' => '+{0} to Strength (Based on Character Level)'], - 221 => ['Bits' => [6], 'Name' => '+{0} to Dexterity (Based on Character Level)'], - 222 => ['Bits' => [6], 'Name' => '+{0} to Energy (Based on Character Level)'], - 223 => ['Bits' => [6], 'Name' => '+{0} to Vitality (Based on Character Level)'], - 224 => ['Bits' => [6], 'Name' => '+{0} to Attack Rating (Based on Character Level)'], - 225 => ['Bits' => [6], 'Name' => '{0}% Bonus to Attack Rating (Based on Character Level)'], - 226 => ['Bits' => [6], 'Name' => '+{0} Cold Damage (Based on Character Level)'], - 227 => ['Bits' => [6], 'Name' => '+{0} Fire Damage (Based on Character Level)'], - 228 => ['Bits' => [6], 'Name' => '+{0} Lightning Damage (Based on Character Level)'], - 229 => ['Bits' => [6], 'Name' => '+{0} Poison Damage (Based on Character Level)'], - 230 => ['Bits' => [6], 'Name' => 'Cold Resist +{0}% (Based on Character Level)'], - 231 => ['Bits' => [6], 'Name' => 'Fire Resist +{0}% (Based on Character Level)'], - 232 => ['Bits' => [6], 'Name' => 'Lightning Resist +{0}% (Based on Character Level)'], - 233 => ['Bits' => [6], 'Name' => 'Poison Resist +{0}% (Based on Character Level)'], - 234 => ['Bits' => [6], 'Name' => '+{0} Cold Absorb (Based on Character Level)'], - 235 => ['Bits' => [6], 'Name' => '+{0} Fire Absorb (Based on Character Level)'], - 236 => ['Bits' => [6], 'Name' => '+{0} Lightning Absorb (Based on Character Level)'], - 237 => ['Bits' => [6], 'Name' => '{0} Poison Absorb (Based on Character Level)'], - 238 => ['Bits' => [5], 'Name' => 'Attacker Takes Damage of {0} (Based on Character Level)'], - 239 => ['Bits' => [6], 'Name' => '{0}% Extra Gold from Monsters (Based on Character Level)'], - 240 => ['Bits' => [6], 'Name' => '{0}% Better Chance of Getting Magic Items (Based on Character Level)'], - 241 => ['Bits' => [6], 'Name' => 'Heal Stamina Plus {0}% (Based on Character Level)'], - 242 => ['Bits' => [6], 'Name' => '+{0} Maxmium Stamina (Based on Character Level)'], - 243 => ['Bits' => [6], 'Name' => '{0}% Damage to Demons (Based on Character Level)'], - 244 => ['Bits' => [6], 'Name' => '{0}% Damage to Undead (Based on Character Level)'], - 245 => ['Bits' => [6], 'Name' => '+{0} to Attack Rating against Demons (Based on Character Level)'], - 246 => ['Bits' => [6], 'Name' => '+{0} to Attack Rating against Undead (Based on Character Level)'], - 247 => ['Bits' => [6], 'Name' => '{0}% Chance of Crushing Blow (Based on Character Level)'], - 248 => ['Bits' => [6], 'Name' => '{0}% Chance of Open Wounds (Based on Character Level)'], - 249 => ['Bits' => [6], 'Name' => '+{0} Kick Damage (Based on Character Level)'], - 250 => ['Bits' => [6], 'Name' => '{0}% to Deadly Strike (Based on Character Level)'], - 252 => ['Bits' => [6], 'Name' => 'Repairs 1 Durability in {0} Seconds'], - 253 => ['Bits' => [6], 'Name' => 'Replenishes Quantity'], - 254 => ['Bits' => [8], 'Name' => 'Increased Stack Size'], - 305 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0} Pierce Cold'], - 306 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0} Pierce Fire'], - 307 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0} Pierce Lightning'], - 308 => ['Bits' => [8], 'Bias' => 50, 'Name' => '{0} Pierce Poision'], - 324 => ['Bits' => [6], 'Name' => 'Unknown (Invisible)'], - 329 => ['Bits' => [9], 'Bias' => 50, 'Name' => '{0}% To Fire Skill Damage'], - 330 => ['Bits' => [9], 'Bias' => 50, 'Name' => '{0}% To Lightning Skill Damage'], - 331 => ['Bits' => [9], 'Bias' => 50, 'Name' => '{0}% To Cold Skill Damage'], - 332 => ['Bits' => [9], 'Bias' => 50, 'Name' => '{0}% To Poison Skill Damage'], - 333 => ['Bits' => [8], 'Name' => '-{0}% To Enemy Fire Resistance'], - 334 => ['Bits' => [8], 'Name' => '-{0}% To Enemy Lightning Resistance'], - 335 => ['Bits' => [8], 'Name' => '-{0}% To Enemy Cold Resistance'], - 336 => ['Bits' => [8], 'Name' => '-{0}% To Enemy Poison Resistance'], - 356 => ['Bits' => [2], 'Name' => 'Quest Item Difficulty +{0} (Invisible)'], + 0 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 32, + 'Name' => NULL, + ], + 1 => + [ + 'Bits' => + [ + 0 => 7, + ], + 'Bias' => 32, + 'Name' => '+X to Energy', + ], + 2 => + [ + 'Bits' => + [ + 0 => 7, + ], + 'Bias' => 32, + 'Name' => '3', + ], + 3 => + [ + 'Bits' => + [ + 0 => 7, + ], + 'Bias' => 32, + 'Name' => '+X to Vitality', + ], + 7 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Bias' => 32, + 'Name' => NULL, + ], + 9 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 32, + 'Name' => NULL, + ], + 11 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 32, + 'Name' => '+X to Maximum Stamina', + ], + 16 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Name' => '+X% Enhanced Defense', + ], + 17 => + [ + 'Bits' => + [ + 0 => 9, + 1 => 9, + ], + 'Name' => '+X% Enhanced Damage', + ], + 19 => + [ + 'Bits' => + [ + 0 => 10, + ], + 'Name' => '+X to Attack Rating', + ], + 20 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'X% Increased Chance of Blocking', + ], + 21 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Minimum Damage', + ], + 22 => + [ + 'Bits' => + [ + 0 => 7, + ], + 'Name' => '+X to Maximum Damage', + ], + 23 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Minimum Damage', + ], + 24 => + [ + 'Bits' => + [ + 0 => 7, + ], + 'Name' => '+X to Maximum Damage', + ], + 25 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Unknown (Invisible)', + ], + 26 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Unknown (Invisible)', + ], + 27 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Regenerate Mana X%', + ], + 28 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Heal Stamina X%', + ], + 31 => + [ + 'Bits' => + [ + 0 => 11, + ], + 'Bias' => 10, + 'Name' => '+X Defense', + ], + 32 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Name' => '+X Defense vs. Missile', + ], + 33 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 10, + 'Name' => '+X Defense vs. Melee', + ], + 34 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'Damage Reduced by X', + ], + 35 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'Magic Damage Reduced by X', + ], + 36 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Damage Reduced by X%', + ], + 37 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Magic Resist +X%', + ], + 38 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => '+X% to Maximum Magic Resist', + ], + 39 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Fire Resist +X%', + ], + 40 => + [ + 'Bits' => + [ + 0 => 5, + ], + 'Name' => '+X% to Maximum Fire Resist', + ], + 41 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Lightning Resist +X%', + ], + 42 => + [ + 'Bits' => + [ + 0 => 5, + ], + 'Name' => '+X% to Maximum Lightning Resist', + ], + 43 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Cold Resist +X%', + ], + 44 => + [ + 'Bits' => + [ + 0 => 5, + ], + 'Name' => '+X% to Maximum Cold Resist', + ], + 45 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Poison Resist +X%', + ], + 46 => + [ + 'Bits' => + [ + 0 => 5, + ], + 'Name' => '+X% to Maximum Poison Resist', + ], + 48 => + [ + 'Bits' => + [ + 0 => 10, + ], + 'Name' => 'Adds X-Y fire damage', + ], + 49 => + [ + 'Bits' => + [ + 0 => 7, + ], + 'Bias' => 100, + 'Name' => 'Light Color', + ], + 52 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Adds X-Y magic damage', + ], + 53 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Lightning Damage: {0}-{0}', + ], + 54 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Adds X-Y cold damage', + ], + 55 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Cold Damage: {0}-{0}', + ], + 56 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Poison Damage: {0}-{0} over {0} seconds', + ], + 57 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Adds X-Y poison damage over Z seconds', + ], + 58 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Unknown (Invisible)', + ], + 59 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Unknown (Invisible)', + ], + 60 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'X% Life stolen per hit', + ], + 62 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Bias' => 50, + 'Name' => 'X% Mana stolen per hit', + ], + 63 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Bias' => 50, + 'Name' => '{0}% Damage to Undead', + ], + 64 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Attack Rating Against Demons +{0}', + ], + 65 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Attack Rating Against Undead +{0}', + ], + 66 => + [ + 'Bits' => + [ + 0 => 7, + ], + 'Name' => '+{0} to Attack Rating', + ], + 67 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Bias' => 50, + 'Name' => '{0}% Faster Hit Recovery', + ], + 68 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Bias' => 50, + 'Name' => '{0}% Faster Block Rate', + ], + 69 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Bias' => 50, + 'Name' => '{0}% Faster Run/Walk', + ], + 70 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Bias' => 50, + 'Name' => '{0}% Increased Chance of Getting Magic Items', + ], + 72 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 10, + 'Name' => '{0} to Light Radius', + ], + 73 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => '+X Maximum Durability', + ], + 74 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Replenish Life +X', + ], + 75 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Increase Maximum Durability X%', + ], + 76 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Increase Maximum Life X%', + ], + 77 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Increase Maximum Mana X%', + ], + 78 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Attacker Takes Damage of X', + ], + 79 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'X% Extra Gold from Monsters', + ], + 80 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'X% Better Chance of Getting Magic Items', + ], + 81 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Knockback', + ], + 82 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => '{0} to Maximum Poison Damage', + ], + 83 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => '+X to Amazon Skill Levels', + ], + 84 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => '+X to Paladin Skill Levels', + ], + 85 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X to Necromancer Skill Levels', + ], + 86 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X to Sorceress Skill Levels', + ], + 87 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => '+X to Barbarian Skill Levels', + ], + 88 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Extra Gold from Monsters', + ], + 89 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X to Light Radius', + ], + 90 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'This property is not displayed on the item, but its effect is to alter the color of the ambient light.', + ], + 91 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Requirements -X%', + ], + 92 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Faster Cast Rate', + ], + 93 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X% Increased Attack Speed', + ], + 94 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Faster Block Rate', + ], + 95 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Faster Run/Walk', + ], + 96 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X% Faster Run/Walk', + ], + 97 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Faster Hit Mana Drain', + ], + 98 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Replenish Life +{0}', + ], + 99 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'X% Faster Hit Recovery', + ], + 100 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Enhanced Damage', + ], + 101 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Enhanced Defense', + ], + 102 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X% Faster Block Rate', + ], + 103 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Enhanced Maximum Damage', + ], + 104 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => '{0}% Life Stolen per Hit', + ], + 105 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'X% Faster Cast Rate', + ], + 106 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Experience Gained', + ], + 107 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => '+Y to spell X (character class Only)', + ], + 108 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance of Getting Magic Items', + ], + 109 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance of Getting Magic Items (Quality)', + ], + 110 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Poison Length Reduced by X%', + ], + 111 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Damage +X', + ], + 112 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Hit Causes Monster to Flee X%', + ], + 113 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Hit Blinds Target +X', + ], + 114 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'X% Damage Taken Goes to Mana', + ], + 115 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Ignore Target Defense', + ], + 116 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'X% Target Defense', + ], + 117 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Prevent Monster Heal', + ], + 118 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Half Freeze Duration', + ], + 119 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X% Bonus to Attack Rating', + ], + 120 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X to Monster Defense Per Hit', + ], + 121 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X% Damage to Demons', + ], + 122 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X% Damage to Undead', + ], + 123 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X to Attack Rating against Demons', + ], + 124 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X to Attack Rating against Undead', + ], + 125 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Enhanced Damage', + ], + 126 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X to Fire Skills', + ], + 127 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X to All Skill Levels', + ], + 128 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Attacker Takes Lightning Damage of X', + ], + 129 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Enhanced Strength', + ], + 130 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Enhanced Energy', + ], + 131 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Enhanced Dexterity', + ], + 132 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Enhanced Vitality', + ], + 133 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Enhanced Life', + ], + 134 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Freezes Target', + ], + 135 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X% Chance of Open Wounds', + ], + 136 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X% Chance of Crushing Blow', + ], + 137 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X Kick Damage', + ], + 138 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X to Mana After Each Kill', + ], + 139 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X Life after each Demon Kill', + ], + 140 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Unknown. This property actually doesn\'t show up in the item\'s description. Found it on the Swordback Hold Spiked Shield.', + ], + 141 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X% Deadly Strike', + ], + 142 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Fire Absorb X%', + ], + 143 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X Fire Absorb', + ], + 144 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Lightning Absorb X%', + ], + 145 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X Lightning Absorb', + ], + 146 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Magic Absorb X%', + ], + 147 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X Magic Absorb', + ], + 148 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Cold Absorb X%', + ], + 149 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X Cold Absorb', + ], + 150 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Slows Target by X%', + ], + 151 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Blessed Aim', + ], + 152 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Defiance', + ], + 153 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Cannot Be Frozen', + ], + 154 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X% Slower Stamina Drain', + ], + 155 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'X% Chance to Reanimate Target', + ], + 156 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Piercing Attack', + ], + 157 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Fires Magic Arrows', + ], + 158 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Fires Explosive Arrows or Bolts', + ], + 159 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X to Minimum Damage', + ], + 160 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X to Maximum Damage', + ], + 161 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (15)', + ], + 162 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (16)', + ], + 163 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (17)', + ], + 164 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (18)', + ], + 165 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (19)', + ], + 166 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (20)', + ], + 167 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (21)', + ], + 168 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (22)', + ], + 169 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (23)', + ], + 170 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (24)', + ], + 171 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (25)', + ], + 172 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (26)', + ], + 173 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (27)', + ], + 174 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (28)', + ], + 175 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (29)', + ], + 176 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (30)', + ], + 177 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (31)', + ], + 178 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (32)', + ], + 179 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X to Druid Skill Levels', + ], + 180 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+X to Assassin Skill Levels', + ], + 181 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (35)', + ], + 182 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (36)', + ], + 183 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (37)', + ], + 184 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (38)', + ], + 185 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (39)', + ], + 186 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (40)', + ], + 187 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (41)', + ], + 188 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '+Y to skill set X Skills (character class Only)', + ], + 189 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (43)', + ], + 190 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (44)', + ], + 191 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (45)', + ], + 192 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (46)', + ], + 193 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (47)', + ], + 194 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Adds X extra sockets to the item.', + ], + 195 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => 'Z% Chance to cast level Y spell X on attack.', + ], + 196 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0}% Chance to Cast Level {0} {1} When Striking (50)', + ], + 197 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 7, + ], + 'Name' => '{2}% Chance to Cast Level {0} {1} When you die', + ], + 198 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 7, + ], + 'Name' => 'Z% Chance to cast level Y spell X on striking', + ], + 199 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 7, + ], + 'Name' => '{2}% Chance to Cast Level {0} {1} On Striking', + ], + 200 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 7, + ], + 'Name' => '{2}% Chance to Cast Level {0} {1} On Striking', + ], + 201 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 7, + ], + 'Name' => 'Z% Chance to cast level Y spell X when struck', + ], + 202 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 7, + ], + 'Name' => '{2}% Chance to Cast Level {0} {1} When Struck', + ], + 203 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 7, + ], + 'Name' => '{2}% Chance to Cast Level {0} {1} When Struck', + ], + 204 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 8, + 3 => 8, + ], + 'Name' => 'level X spell W (Y/Z Charges)', + ], + 205 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 8, + 3 => 8, + ], + 'Name' => 'Level {0} {1} ({2}/{3} Charges)', + ], + 206 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 8, + 3 => 8, + ], + 'Name' => 'Level {0} {1} ({2}/{3} Charges)', + ], + 207 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 8, + 3 => 8, + ], + 'Name' => 'Level {0} {1} ({2}/{3} Charges)', + ], + 208 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 8, + 3 => 8, + ], + 'Name' => 'Level {0} {1} ({2}/{3} Charges)', + ], + 209 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 8, + 3 => 8, + ], + 'Name' => 'Level {0} {1} ({2}/{3} Charges)', + ], + 210 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 8, + 3 => 8, + ], + 'Name' => 'Level {0} {1} ({2}/{3} Charges)', + ], + 211 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 8, + 3 => 8, + ], + 'Name' => 'Level {0} {1} ({2}/{3} Charges)', + ], + 212 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 8, + 3 => 8, + ], + 'Name' => 'Level {0} {1} ({2}/{3} Charges)', + ], + 213 => + [ + 'Bits' => + [ + 0 => 6, + 1 => 10, + 2 => 8, + 3 => 8, + ], + 'Name' => 'Level {0} {1} ({2}/{3} Charges)', + ], + 214 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Defense (Based on Character Level)', + ], + 215 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'X% Enhanced Defense (Based on Character Level)', + ], + 216 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Life (Based on Character Level)', + ], + 217 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Mana (Based on Character Level)', + ], + 218 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Maximum Damage (Based on Character Level)', + ], + 219 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'X% Enhanced Maximum Damage (Based on Character Level)', + ], + 220 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Strength (Based on Character Level)', + ], + 221 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Dexterity (Based on Character Level)', + ], + 222 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Energy (Based on Character Level)', + ], + 223 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Vitality (Based on Character Level)', + ], + 224 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Attack Rating (Based on Character Level)', + ], + 225 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'X% Bonus to Attack Rating (Based on Character Level)', + ], + 226 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X Cold Damage (Based on Character Level)', + ], + 227 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X Fire Damage (Based on Character Level)', + ], + 228 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X Lightning Damage (Based on Character Level)', + ], + 229 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X Poison Damage (Based on Character Level)', + ], + 230 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'Cold Resist +X% (Based on Character Level)', + ], + 231 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'Fire Resist +X% (Based on Character Level)', + ], + 232 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'Lightning Resist +X% (Based on Character Level)', + ], + 233 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'Poison Resist +X% (Based on Character Level)', + ], + 234 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X Cold Absorb (Based on Character Level)', + ], + 235 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X Fire Absorb (Based on Character Level)', + ], + 236 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X Lightning Absorb (Based on Character Level)', + ], + 237 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'X Poison Absorb (Based on Character Level)', + ], + 238 => + [ + 'Bits' => + [ + 0 => 5, + ], + 'Name' => 'Attacker Takes Damage of X (Based on Character Level)', + ], + 239 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'X% Extra Gold from Monsters (Based on Character Level)', + ], + 240 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'X% Better Chance of Getting Magic Items (Based on Character +Level)', + ], + 241 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'Heal Stamina Plus X% (Based on Character Level)', + ], + 242 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+{0} Maxmium Stamina (Based on Character Level)', + ], + 243 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'X% Damage to Demons (Based on Character Level)', + ], + 244 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'X% Damage to Undead (Based on Character Level)', + ], + 245 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Attack Rating against Demons (Based on Character +Level)', + ], + 246 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X to Attack Rating against Undead (Based on Character +Level)', + ], + 247 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'X% Chance of Crushing Blow (Based on Character Level)', + ], + 248 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'X% Chance of Open Wounds (Based on Character Level)', + ], + 249 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => '+X Kick Damage (Based on Character Level)', + ], + 250 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'X% to Deadly Strike (Based on Character Level) +contributed by Chris Moore', + ], + 252 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'Repairs 1 durability in X seconds', + ], + 253 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'Replenishes Quantity', + ], + 254 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => 'Increased Stack Size', + ], + 305 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0} Pierce Cold', + ], + 306 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0} Pierce Fire', + ], + 307 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0} Pierce Lightning', + ], + 308 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Bias' => 50, + 'Name' => '{0} Pierce Poision', + ], + 324 => + [ + 'Bits' => + [ + 0 => 6, + ], + 'Name' => 'Unknown (Invisible)', + ], + 329 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Bias' => 50, + 'Name' => '{0}% To Fire Skill Damage', + ], + 330 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Bias' => 50, + 'Name' => '{0}% To Lightning Skill Damage', + ], + 331 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Bias' => 50, + 'Name' => '{0}% To Cold Skill Damage', + ], + 332 => + [ + 'Bits' => + [ + 0 => 9, + ], + 'Bias' => 50, + 'Name' => '{0}% To Poison Skill Damage', + ], + 333 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => '-{0}% To Enemy Fire Resistance', + ], + 334 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => '-{0}% To Enemy Lightning Resistance', + ], + 335 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => '-{0}% To Enemy Cold Resistance', + ], + 336 => + [ + 'Bits' => + [ + 0 => 8, + ], + 'Name' => '-{0}% To Enemy Poison Resistance', + ], + 356 => + [ + 'Bits' => + [ + 0 => 2, + ], + 'Name' => 'Quest Item Difficulty +{0} (Invisible)', + ], ]; - + public function __construct() { + + } + }