Advertisement
Guest User

Untitled

a guest
Sep 10th, 2013
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 5.92 KB | None | 0 0
  1. /// The flag bit for armor items.
  2. private enum int armorFlag    = 0b1;
  3. /// The flag bit for weapon items.
  4. private enum int weaponFlag   = 0b10;
  5. /// The flag bit for heavy items.
  6. private enum int heavyFlag    = 0b100;
  7.  
  8. enum Wear : ubyte {
  9.     none,
  10.     head,
  11.     shoulder,
  12.     leftArm,
  13.     rightArm,
  14.     torso,
  15.     legs,
  16.     feet,
  17.     innerTorso,
  18.     innerLegs,
  19.     belt,
  20.     leftFinger,
  21.     rightFinger,
  22.     robe,
  23.     cape
  24. }
  25.  
  26. enum Weapon : ubyte {
  27.     none,
  28.     blade,
  29.     blunt,
  30.     axe,
  31.     polearm,
  32.     thrown,
  33.     sling,
  34.     bow,
  35.     crossbow
  36. }
  37.  
  38. // The boundary of the enum flags.
  39. private enum int flagBoundary = heavyFlag / 2;
  40.  
  41. enum ItemType : ubyte {
  42.     // The value which is just the heavy flag and nothing else indicates
  43.     // a quest item.
  44.     questItem     = heavyFlag,
  45.     // Light armor items.
  46.     lightHead     = armorFlag | (Wear.head                    << flagBoundary),
  47.     lightShoulder = armorFlag | (Wear.shoulder                << flagBoundary),
  48.     lightLeftArm  = armorFlag | (Wear.leftArm                 << flagBoundary),
  49.     lightRightArm = armorFlag | (Wear.rightArm                << flagBoundary),
  50.     lightTorso    = armorFlag | (Wear.torso                   << flagBoundary),
  51.     lightLegs     = armorFlag | (Wear.legs                    << flagBoundary),
  52.     lightFeet     = armorFlag | (Wear.feet                    << flagBoundary),
  53.     // Heavy armor items.
  54.     heavyHead     = armorFlag | heavyFlag | (Wear.head        << flagBoundary),
  55.     heavyShoulder = armorFlag | heavyFlag | (Wear.shoulder    << flagBoundary),
  56.     heavyLeftArm  = armorFlag | heavyFlag | (Wear.leftArm     << flagBoundary),
  57.     heavyRightArm = armorFlag | heavyFlag | (Wear.rightArm    << flagBoundary),
  58.     heavyTorso    = armorFlag | heavyFlag | (Wear.torso       << flagBoundary),
  59.     heavyLegs     = armorFlag | heavyFlag | (Wear.legs        << flagBoundary),
  60.     heavyFeet     = armorFlag | heavyFlag | (Wear.feet        << flagBoundary),
  61.     // Dress items.
  62.     innerTorso    = armorFlag | (Wear.innerTorso              << flagBoundary),
  63.     innerLegs     = armorFlag | (Wear.innerLegs               << flagBoundary),
  64.     belt          = armorFlag | (Wear.belt                    << flagBoundary),
  65.     leftFinger    = armorFlag | (Wear.leftFinger              << flagBoundary),
  66.     rightFinger   = armorFlag | (Wear.rightFinger             << flagBoundary),
  67.     robe          = armorFlag | (Wear.robe                    << flagBoundary),
  68.     cape          = armorFlag | (Wear.cape                    << flagBoundary),
  69.     // One handed weapons
  70.     oneHandBlade  = weaponFlag | (Weapon.blade                << flagBoundary),
  71.     oneHandBlunt  = weaponFlag | (Weapon.blunt                << flagBoundary),
  72.     oneHandAxe    = weaponFlag | (Weapon.axe                  << flagBoundary),
  73.     // Two handed weapons.
  74.     twoHandBlade  = weaponFlag | heavyFlag | (Weapon.blade    << flagBoundary),
  75.     twoHandBlunt  = weaponFlag | heavyFlag | (Weapon.blunt    << flagBoundary),
  76.     twoHandAxe    = weaponFlag | heavyFlag | (Weapon.axe      << flagBoundary),
  77.     polearm       = weaponFlag | heavyFlag | (Weapon.polearm  << flagBoundary),
  78.     // One hand ranged weapons.
  79.     thrown        = weaponFlag | (Weapon.thrown               << flagBoundary),
  80.     slign         = weaponFlag | (Weapon.sling                << flagBoundary),
  81.     // Two hand ranged weapons.
  82.     bow           = weaponFlag | heavyFlag | (Weapon.bow      << flagBoundary),
  83.     crossbow      = weaponFlag | heavyFlag | (Weapon.crossbow << flagBoundary),
  84. }
  85.  
  86. /**
  87.  * Determine if an item is armor.
  88.  *
  89.  * Params:
  90.  * itemType = An item type.
  91.  *
  92.  * Returns: true if the item is armor.
  93.  */
  94. @safe pure nothrow
  95. bool isArmor(ItemType itemType) {
  96.     return (itemType & armorFlag) > 0;
  97. }
  98.  
  99. /**
  100.  * Determine if an item is a dress item.
  101.  *
  102.  * Params:
  103.  * itemType = An item type.
  104.  *
  105.  * Returns: true if the item is a dress item.
  106.  */
  107. @safe pure nothrow
  108. bool isDressItem(ItemType itemType) {
  109.     // Everything >= this number is in the dress item region.
  110.     enum ubyte dressRegion = (Wear.innerTorso << heavyFlag / 2);
  111.  
  112.     return (itemType & armorFlag) > 0 && itemType >= dressRegion;
  113. }
  114.  
  115. /**
  116.  * Determine if an item is a weapon.
  117.  *
  118.  * Params:
  119.  * itemType = An item type.
  120.  *
  121.  * Returns: true if the item is a weapon.
  122.  */
  123. @safe pure nothrow
  124. bool isWeapon(ItemType itemType) {
  125.     return (itemType & weaponFlag) != 0;
  126. }
  127.  
  128. /**
  129.  * Determine if an item is usuable.
  130.  *
  131.  * Params:
  132.  * itemType = An item type.
  133.  *
  134.  * Returns: true if the item is usuable.
  135.  */
  136. @safe pure nothrow
  137. bool isUsable(ItemType itemType) {
  138.     enum allFlags = heavyFlag & weaponFlag & armorFlag;
  139.  
  140.     // Usable items have none of the flags.
  141.     return (itemType & allFlags) == 0;
  142. }
  143.  
  144. /**
  145.  * Determine if an item is heavy.
  146.  *
  147.  * Params:
  148.  * itemType = An item type.
  149.  *
  150.  * Returns: true if the item is heavy.
  151.  */
  152. @safe pure nothrow
  153. bool isHeavy(ItemType itemType) {
  154.     return (itemType & heavyFlag) != 0;
  155. }
  156.  
  157. /**
  158.  * Determine if an item is a quest item.
  159.  *
  160.  * Params:
  161.  * itemType = An item type.
  162.  *
  163.  * Returns: true if the item is a quest item.
  164.  */
  165. @safe pure nothrow
  166. bool isQuestItem(ItemType itemType) {
  167.     return itemType == ItemType.questItem;
  168. }
  169.  
  170. /**
  171.  * Determine the wear slot for an item.
  172.  *
  173.  * Params:
  174.  * itemType = An item type.
  175.  *
  176.  * Returns: The wear slot, which may be none.
  177.  */
  178. @safe pure nothrow
  179. Wear equipmentSlot(ItemType itemType) {
  180.     // All possible bits that might be set in the wearable enum.
  181.     enum ubyte wearBits = 2 ^^ (bsr(Wear.max) + 1) - 1;
  182.  
  183.     if (itemType.isArmor) {
  184.         return cast(Wear) ((itemType >> flagBoundary) & wearBits);
  185.     }
  186.  
  187.     return Wear.none;
  188. }
  189.  
  190. @safe pure nothrow
  191. Weapon weaponType(ItemType itemType) {
  192.     enum ubyte weaponBits = 2 ^^ (bsr(Weapon.max) + 1) - 1;
  193.  
  194.     if (itemType.isWeapon) {
  195.         return cast(Weapon) ((itemType >> flagBoundary) & weaponBits);
  196.     }
  197.  
  198.     return Weapon.none;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement