shithub: zelda3

Download patch

ref: 2015bb0dbd8b6e8b1e0ede44d862318247887ad3
parent: 525fdc1416fcb8d10f7b2c253277d752e6992701
author: Snesrev <[email protected]>
date: Mon Sep 19 19:52:16 EDT 2022

Make it possible to display 24 items in inventory

 - Simplified hud drawing code
 - Shovel always available

--- a/hud.c
+++ b/hud.c
@@ -9,11 +9,16 @@
 #include "variables.h"
 #include "hud.h"
 
+enum {
+  kNewStyleInventory = 0,
+  kHudItemCount = kNewStyleInventory ? 24 : 20,
+};
+
 typedef struct ItemBoxGfx {
   uint16 v[4];
 } ItemBoxGfx;
 
-static void Hud_DrawItem(uint16 a, const ItemBoxGfx *src);
+static void Hud_DrawItem(uint16 *dst, const ItemBoxGfx *src);
 
 const uint8 kMaxBombsForLevel[] = { 10, 15, 20, 25, 30, 35, 40, 50 };
 const uint8 kMaxArrowsForLevel[] = { 30, 35, 40, 45, 50, 55, 60, 70 };
@@ -21,13 +26,23 @@
 
 #define HUDXY(x, y) ((x) + (y) * 32)
 
+static const uint16 kHudItemInVramPtr_New[24] = {
+  HUDXY(2,  7), HUDXY(5,  7), HUDXY(8,  7), HUDXY(11,  7), HUDXY(14,  7), HUDXY(17, 7),
+  HUDXY(2, 10), HUDXY(5, 10), HUDXY(8, 10), HUDXY(11, 10), HUDXY(14, 10), HUDXY(17, 10),
+  HUDXY(2, 13), HUDXY(5, 13), HUDXY(8, 13), HUDXY(11, 13), HUDXY(14, 13), HUDXY(17, 13),
+  HUDXY(2, 16), HUDXY(5, 16), HUDXY(8, 16), HUDXY(11, 16), HUDXY(14, 16), HUDXY(17, 16),
+};
 
-static const uint16 kHudItemInVramPtr[20] = {
-  0x11c8, 0x11ce, 0x11d4, 0x11da, 0x11e0,
-  0x1288, 0x128e, 0x1294, 0x129a, 0x12a0,
-  0x1348, 0x134e, 0x1354, 0x135a, 0x1360,
-  0x1408, 0x140e, 0x1414, 0x141a, 0x1420,
+static const uint16 kHudItemInVramPtr_Old[20] = {
+  HUDXY(4,  7), HUDXY(7,  7), HUDXY(10,  7), HUDXY(13,  7), HUDXY(16,  7),
+  HUDXY(4, 10), HUDXY(7, 10), HUDXY(10, 10), HUDXY(13, 10), HUDXY(16, 10),
+  HUDXY(4, 13), HUDXY(7, 13), HUDXY(10, 13), HUDXY(13, 13), HUDXY(16, 13),
+  HUDXY(4, 16), HUDXY(7, 16), HUDXY(10, 16), HUDXY(13, 16), HUDXY(16, 16),
 };
+
+
+#define kHudItemInVramPtr (kNewStyleInventory ? kHudItemInVramPtr_New : kHudItemInVramPtr_Old)
+
 static const uint16 kHudBottlesGfx[128] = {
   0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2564, 0x2562, 0x2557, 0x2561, 0x255e, 0x255e, 0x255c,
   0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x255e, 0x2563, 0x2563, 0x255b, 0x2554, 0x24f5, 0x24f5,
@@ -84,7 +99,7 @@
   {0x2cb0, 0x2cbe, 0x2cc0, 0x2cc1},
 };
 static const ItemBoxGfx kHudItemBombos[2] = {
-  {0x20f5, 0x20f5, 0x20f5,  0x20f5},
+  {0x20f5, 0x20f5, 0x20f5, 0x20f5},
   {0x287d, 0x287e, 0xe87e, 0xe87d},
 };
 static const ItemBoxGfx kHudItemEther[2] = {
@@ -135,23 +150,6 @@
   {0x2c62, 0x2c63, 0x2c72, 0x2c73},
   {0x2886, 0x2887, 0x2888, 0x2889},
 };
-static const ItemBoxGfx kHudItemGloves[3] = {
-  {0x20f5, 0x20f5, 0x20f5, 0x20f5},
-  {0x2130, 0x2131, 0x2140, 0x2141},
-  {0x28da, 0x28db, 0x28ea, 0x28eb},
-};
-static const ItemBoxGfx kHudItemBoots[2] = {
-  {0x20f5, 0x20f5, 0x20f5, 0x20f5},
-  {0x3429, 0x342a, 0x342b, 0x342c},
-};
-static const ItemBoxGfx kHudItemFlippers[2] = {
-  {0x20f5, 0x20f5, 0x20f5, 0x20f5},
-  {0x2c9a, 0x2c9b, 0x2c9d, 0x2c9e},
-};
-static const ItemBoxGfx kHudItemMoonPearl[2] = {
-  {0x20f5, 0x20f5, 0x20f5, 0x20f5},
-  {0x2433, 0x2434, 0x2435, 0x2436},
-};
 static const ItemBoxGfx kHudItemEmpty[1] = {
   {0x20f5, 0x20f5, 0x20f5, 0x20f5},
 };
@@ -173,121 +171,6 @@
   {0x2c68, 0x6c68, 0x2c78, 0x6c78},
   {0x2468, 0x6468, 0x2478, 0x6478},
 };
-static const ItemBoxGfx kHudItemDungeonCompass[2] = {
-  {0x20f5, 0x20f5, 0x20f5, 0x20f5},
-  {0x24bf, 0x64bf, 0x2ccf, 0x6ccf},
-};
-static const ItemBoxGfx kHudItemPalaceItem[3] = {
-  {0x20f5, 0x20f5, 0x20f5, 0x20f5},
-  {0x28d6, 0x68d6, 0x28e6, 0x28e7},
-  {0x354b, 0x354c, 0x354d, 0x354e},
-};
-static const ItemBoxGfx kHudItemDungeonMap[2] = {
-  {0x20f5, 0x20f5, 0x20f5, 0x20f5},
-  {0x28de, 0x28df, 0x28ee, 0x28ef},
-};
-static const ItemBoxGfx kHudPendants0[2] = {
-  {0x313b, 0x313c, 0x313d, 0x313e},
-  {0x252b, 0x252c, 0x252d, 0x252e}
-};
-static const ItemBoxGfx kHudPendants1[2] = {
-  {0x313b, 0x313c, 0x313d, 0x313e},
-  {0x2d2b, 0x2d2c, 0x2d2d, 0x2d2e}
-};
-static const ItemBoxGfx kHudPendants2[2] = {
-  {0x313b, 0x313c, 0x313d, 0x313e},
-  {0x3d2b, 0x3d2c, 0x3d2d, 0x3d2e}
-};
-static const ItemBoxGfx kHudItemHeartPieces[4] = {
-  {0x2484, 0x6484, 0x2485, 0x6485},
-  {0x24ad, 0x6484, 0x2485, 0x6485},
-  {0x24ad, 0x6484, 0x24ae, 0x6485},
-  {0x24ad, 0x64ad, 0x24ae, 0x6485},
-};
-static const uint16 kHudAbilityText[80] = {
-  0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d5b, 0x2d58, 0x2d55, 0x2d63, 0x2d27,
-  0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d61, 0x2d54, 0x2d50, 0x2d53,
-  0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d63, 0x2d50, 0x2d5b, 0x2d5a,
-  0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f,
-  0x2cf5, 0x2cf5, 0x2c2e, 0x2cf5, 0x2cf5, 0x2d5f, 0x2d64, 0x2d5b, 0x2d5b, 0x2cf5,
-  0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d61, 0x2d64, 0x2d5d, 0x2cf5,
-  0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d62, 0x2d66, 0x2d58, 0x2d5c,
-  0x2cf5, 0x2cf5, 0x2cf5, 0x207f, 0x207f, 0x2c01, 0x2c18, 0x2c28, 0x207f, 0x207f,
-};
-static const uint16 kHudGlovesText[20] = {
-  0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d5b, 0x2d58, 0x2d55, 0x2d63, 0x2d28,
-  0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d5b, 0x2d58, 0x2d55, 0x2d63, 0x2d29,
-};
-static const uint16 kProgressIconPendantsBg[90] = {
-  0x28fb, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x68fb,
-  0x28fc, 0x2521, 0x2522, 0x2523, 0x2524, 0x253f, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
-  0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
-  0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x213b, 0x213c, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
-  0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x213d, 0x213e, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
-  0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
-  0x28fc, 0x24f5, 0x213b, 0x213c, 0x24f5, 0x24f5, 0x213b, 0x213c, 0x24f5, 0x68fc,
-  0x28fc, 0x24f5, 0x213d, 0x213e, 0x24f5, 0x24f5, 0x213d, 0x213e, 0x24f5, 0x68fc,
-  0xa8fb, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xe8fb,
-};
-static const uint16 kProgressIconCrystalsBg[90] = {
-  0x28fb, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x68fb,
-  0x28fc, 0x252f, 0x2534, 0x2535, 0x2536, 0x2537, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
-  0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
-  0x28fc, 0x24f5, 0x24f5, 0x3146, 0x3147, 0x3146, 0x3147, 0x24f5, 0x24f5, 0x68fc,
-  0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
-  0x28fc, 0x24f5, 0x3146, 0x3147, 0x3146, 0x3147, 0x3146, 0x3147, 0x24f5, 0x68fc,
-  0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
-  0x28fc, 0x24f5, 0x24f5, 0x3146, 0x3147, 0x3146, 0x3147, 0x24f5, 0x24f5, 0x68fc,
-  0xa8fb, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xe8fb,
-};
-static const uint16 kHudItemText[320] = {
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x256b, 0x256c, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2577,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2557, 0x255e, 0x255e, 0x255a, 0x2562, 0x2557, 0x255e, 0x2563,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x255e, 0x255c, 0x2551, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2564, 0x2562, 0x2557, 0x2561, 0x255e, 0x255e, 0x255c,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x2558, 0x2561, 0x2554, 0x2561, 0x255e, 0x2553, 0x24f5,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2558, 0x2552, 0x2554, 0x2561, 0x255e, 0x2553, 0x24f5, 0x24f5,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x255e, 0x255c, 0x2551, 0x255e, 0x2562, 0x24f5, 0x24f5,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2554, 0x2563, 0x2557, 0x2554, 0x2561, 0x24f5, 0x24f5, 0x24f5,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2560, 0x2564, 0x2550, 0x255a, 0x2554, 0x24f5, 0x24f5, 0x24f5,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255b, 0x2550, 0x255c, 0x255f, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
-  0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2557, 0x2550, 0x255c, 0x255c, 0x2554, 0x2561,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2562, 0x2557, 0x255e, 0x2565, 0x2554, 0x255b, 0x24f5, 0x24f5,
-  0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407, 0x2408, 0x2409, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
-  0x2551, 0x255e, 0x255e, 0x255a, 0x24f5, 0x255e, 0x2555, 0x24f5, 0x255c, 0x2564, 0x2553, 0x255e, 0x2561, 0x2550, 0x24f5, 0x24f5,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2564, 0x2562, 0x2557, 0x2561, 0x255e, 0x255e, 0x255c,
-  0x2552, 0x2550, 0x255d, 0x2554, 0x24f5, 0x255e, 0x2555, 0x24f5, 0x24f5, 0x2562, 0x255e, 0x255c, 0x2550, 0x2561, 0x2558, 0x2550,
-  0x2552, 0x2550, 0x255d, 0x2554, 0x24f5, 0x255e, 0x2555, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x2568, 0x2561, 0x255d, 0x2550,
-  0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2552, 0x2550, 0x255f, 0x2554, 0x24f5,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
-};
-static const uint16 kHudBottlesItemText[128] = {
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2564, 0x2562, 0x2557, 0x2561, 0x255e, 0x255e, 0x255c,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x255e, 0x2563, 0x2563, 0x255b, 0x2554, 0x24f5, 0x24f5,
-  0x255b, 0x2558, 0x2555, 0x2554, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2554, 0x2553, 0x2558, 0x2552, 0x2558, 0x255d, 0x2554,
-  0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2554, 0x2553, 0x2558, 0x2552, 0x2558, 0x255d, 0x2554,
-  0x2552, 0x2564, 0x2561, 0x2554, 0x256a, 0x2550, 0x255b, 0x255b, 0x255c, 0x2554, 0x2553, 0x2558, 0x2552, 0x2558, 0x255d, 0x2554,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x2550, 0x2554, 0x2561, 0x2558, 0x2554, 0x24f5, 0x24f5,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x2554, 0x2554, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2556, 0x255e, 0x255e, 0x2553, 0x24f5, 0x2551, 0x2554, 0x2554,
-};
-static const uint16 kHudMushroomItemText[16] = {
-  0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5,
-  0x24f5, 0x255f, 0x255e, 0x2566, 0x2553, 0x2554, 0x2561, 0x24f5,
-};
-static const uint16 kHudFluteItemText[32] = {
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x255b, 0x2564, 0x2563, 0x2554, 0x24f5, 0x24f5, 0x24f5,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x255b, 0x2564, 0x2563, 0x2554, 0x24f5, 0x24f5, 0x24f5
-};
-static const uint16 kHudMirrorItemText[16] = {
-  0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2558, 0x2561, 0x2561, 0x255e, 0x2561
-};
-static const uint16 kHudBowItemText[48] = {
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x256b, 0x256c, 0x256e, 0x256f, 0x257c, 0x257d, 0x257e, 0x257f,
-  0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x256b, 0x256c, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
-  0x256b, 0x256c, 0x24f5, 0x256e, 0x256f, 0x24f5, 0x24f5, 0x24f5, 0x2578, 0x2579, 0x257a, 0x257b, 0x257c, 0x257d, 0x257e, 0x257f,
-};
 static const uint16 kHudTilemap[165] = {
   0x207f, 0x207f, 0x2850, 0xa856, 0x2852, 0x285b, 0x285b, 0x285c, 0x207f, 0x3ca8, 0x207f, 0x207f, 0x2c88, 0x2c89, 0x207f, 0x20a7, 0x20a9, 0x207f, 0x2871, 0x207f, 0x207f, 0x207f, 0x288b, 0x288f, 0x24ab, 0x24ac, 0x688f, 0x688b, 0x207f, 0x207f, 0x207f, 0x207f,
   0x207f, 0x207f, 0x2854, 0x2871, 0x2858, 0x207f, 0x207f, 0x285d, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f,
@@ -297,7 +180,7 @@
   0x207f, 0x207f, 0xa850, 0x2856, 0xe850,
 };
 
-static const ItemBoxGfx * const kHudItemBoxGfxPtrs[] = {
+static const ItemBoxGfx * const kHudItemBoxGfxPtrs[20] = {
   kHudItemBow,
   kHudItemBoomerang,
   kHudItemHookshot,
@@ -318,18 +201,6 @@
   kHudItemCaneByrna,
   kHudItemCape,
   kHudItemMirror,
-  kHudItemGloves,
-  kHudItemBoots,
-  kHudItemFlippers,
-  kHudItemMoonPearl,
-  kHudItemEmpty,
-  kHudItemSword,
-  kHudItemShield,
-  kHudItemArmor,
-  kHudItemBottles,
-  kHudItemBottles,
-  kHudItemBottles,
-  kHudItemBottles,
 };
 static const uint16 kUpdateMagicPowerTilemap[17][4] = {
   {0x3cf5, 0x3cf5, 0x3cf5, 0x3cf5},
@@ -385,7 +256,7 @@
 static int Hud_GetCurrentItemPosition() {
   if (hud_inventory_order[0] != 0) {
     int i = 0;
-    for (; i < 19 && hud_inventory_order[i] != hud_cur_item; i++) {}
+    for (; i < kHudItemCount - 1 && hud_inventory_order[i] != hud_cur_item; i++) {}
     return i;
   } else {
     return hud_cur_item ? hud_cur_item - 1 : hud_cur_item;
@@ -395,10 +266,10 @@
 void Hud_GotoPrevItem() {
   if (hud_inventory_order[0] != 0) {
     int i = Hud_GetCurrentItemPosition();
-    hud_cur_item = hud_inventory_order[i == 0 ? 19 : i - 1];
+    hud_cur_item = hud_inventory_order[i == 0 ? kHudItemCount - 1 : i - 1];
   } else {
     if (--hud_cur_item < 1)
-      hud_cur_item = 20;
+      hud_cur_item = kHudItemCount;
   }
 }
 
@@ -405,9 +276,9 @@
 void Hud_GotoNextItem() {
   if (hud_inventory_order[0] != 0) {
     int i = Hud_GetCurrentItemPosition();
-    hud_cur_item = hud_inventory_order[i >= 19 ? 0 : i + 1];
+    hud_cur_item = hud_inventory_order[i >= kHudItemCount - 1 ? 0 : i + 1];
   } else {
-    if (++hud_cur_item >= 21)
+    if (++hud_cur_item > kHudItemCount)
       hud_cur_item = 1;
   }
 }
@@ -599,50 +470,36 @@
   overworld_map_state++;
 }
 
-void Hud_Init() {  // 8dddab
-  Hud_SearchForEquippedItem();
-
-  Hud_DrawYButtonItems(Hud_GetPaletteMask(1));
-  Hud_DrawTopRightBox(Hud_GetPaletteMask(1));
-
-  Hud_DrawAbilityText(Hud_GetPaletteMask(1));
-  Hud_DrawAbilityIcons();
-  Hud_DrawProgressIcons();
-  Hud_DrawMoonPearl();
-
-  Hud_DrawEquipment(Hud_GetPaletteMask(1));
-  Hud_DrawShield();
-  Hud_DrawArmor();
-  Hud_DrawMapAndBigKey();
-  Hud_DrawCompass();
-
+bool Hud_HaveAnyItems() { // new
   uint8 or_all = 0;
   for (int i = 0; i < 20; i++)
     or_all |= (&link_item_bow)[i];
+  return or_all != 0;
+}
 
-  if (or_all) {
-    uint8 or_bottle = link_bottle_info[0] | link_bottle_info[1] | link_bottle_info[2] | link_bottle_info[3];
-    if (or_bottle == 0) {
+void Hud_Init() {  // 8dddab
+  Hud_SearchForEquippedItem();
+  Hud_DrawYButtonItems();
+  Hud_DrawAbilityBox();
+  Hud_DrawProgressIcons();
+  Hud_DrawEquipmentBox();
+
+  if (Hud_HaveAnyItems()) {
+    int first_bottle = 0;
+    while (first_bottle < 4 && link_bottle_info[first_bottle] == 0)
+      first_bottle++;
+    if (first_bottle == 4)
       link_item_bottle_index = 0;
-    } else if (!link_item_bottle_index) {
-      uint8 bottle_pos = 1;
-      if (!link_bottle_info[0]) {
-        bottle_pos++;
-        if (!link_bottle_info[1]) {
-          bottle_pos++;
-          if (!link_bottle_info[2])
-            bottle_pos++;
-        }
-      }
-      link_item_bottle_index = bottle_pos;
-    }
+    else if (link_item_bottle_index == 0)
+      link_item_bottle_index = first_bottle + 1;
 
     if (!Hud_DoWeHaveThisItem())
       Hud_EquipNextItem();
 
     Hud_DrawSelectedYButtonItem();
-    if (hud_cur_item == 16) {
-      Hud_DrawBottleMenu(Hud_GetPaletteMask(1));
+    if (hud_cur_item == kHudItem_BottleOld && !kNewStyleInventory) {
+      timer_for_flashing_circle = 16;
+      Hud_DrawBottleMenu();
     }
   }
 
@@ -659,11 +516,7 @@
 }
 
 void Hud_ChooseNextMode() {  // 8dde6e
-  uint8 or_all = 0;
-  for (int i = 0; i < 20; i++)
-    or_all |= (&link_item_bow)[i];
-
-  if (or_all != 0) {
+  if (Hud_HaveAnyItems()) {
     nmi_subroutine_index = 1;
     BYTE(nmi_load_target_addr) = 0x22;
     if (!Hud_DoWeHaveThisItem())
@@ -670,9 +523,7 @@
       Hud_EquipNextItem();
 
     Hud_DrawSelectedYButtonItem();
-    overworld_map_state = 4;
-    if (hud_cur_item == 16)
-      overworld_map_state = 10;
+    overworld_map_state = (hud_cur_item == kHudItem_BottleOld && !kNewStyleInventory) ? 10 : 4;
   } else {
     if (filtered_joypad_H)
       overworld_map_state = 5;
@@ -680,6 +531,17 @@
 }
 
 bool Hud_DoWeHaveThisItem() {  // 8ddeb0
+  assert(hud_cur_item != 0);
+
+  if (hud_cur_item == kHudItem_Flute && kNewStyleInventory)
+    return link_item_flute >= 2;
+
+  if (hud_cur_item == kHudItem_Shovel && kNewStyleInventory)
+    return link_item_flute >= 1;
+
+  if (hud_cur_item >= kHudItem_Bottle1)
+    return link_bottle_info[hud_cur_item - kHudItem_Bottle1] != 0;
+
   return (&link_item_bow)[hud_cur_item - 1] != 0;
 }
 
@@ -697,21 +559,15 @@
 
 void Hud_EquipItemAbove() {  // 8ddeeb
   do {
-    Hud_GotoPrevItem();
-    Hud_GotoPrevItem();
-    Hud_GotoPrevItem();
-    Hud_GotoPrevItem();
-    Hud_GotoPrevItem();
+    for(int i = 0; i < (kNewStyleInventory ? 6 : 5); i++)
+      Hud_GotoPrevItem();
   } while (!Hud_DoWeHaveThisItem());
 }
 
 void Hud_EquipItemBelow() {  // 8ddf00
   do {
-    Hud_GotoNextItem();
-    Hud_GotoNextItem();
-    Hud_GotoNextItem();
-    Hud_GotoNextItem();
-    Hud_GotoNextItem();
+    for (int i = 0; i < (kNewStyleInventory ? 6 : 5); i++)
+      Hud_GotoNextItem();
   } while (!Hud_DoWeHaveThisItem());
 }
 
@@ -728,9 +584,9 @@
 
   if (joypad1H_last & 0x40 && enhanced_features0 & kFeatures0_SwitchLR) {
     if (filtered_joypad_H & 8) {
-      Hud_ReorderItem(-5);
+      Hud_ReorderItem(kNewStyleInventory ? -6 : -5);
     } else if (filtered_joypad_H & 4) {
-      Hud_ReorderItem(5);
+      Hud_ReorderItem(kNewStyleInventory ? 6 : 5);
     } else if (filtered_joypad_H & 2) {
       Hud_ReorderItem(-1);
     } else if (filtered_joypad_H & 1) {
@@ -753,9 +609,9 @@
       sound_effect_2 = 32;
     }
   }
-  Hud_DrawYButtonItems(Hud_GetPaletteMask(1));
+  Hud_DrawYButtonItems();
   Hud_DrawSelectedYButtonItem();
-  if (hud_cur_item == 16)
+  if (hud_cur_item == kHudItem_BottleOld && !kNewStyleInventory)
     overworld_map_state = 7;
 
   nmi_subroutine_index = 1;
@@ -770,9 +626,27 @@
 }
 
 void Hud_UpdateEquippedItem() {  // 8ddfaf
-  static const uint8 kHudItemToItem[21] = { 0, 3, 2, 14, 1, 10, 5, 6, 15, 16, 17, 9, 4, 8, 7, 12, 11, 18, 13, 19, 20 };
-  assert(hud_cur_item < 21);
-  eq_selected_y_item = kHudItemToItem[hud_cur_item];
+  static const uint8 kHudItemToItemOrg[21] = { 
+    0, 
+    3,  2, 14, 1,  10,  5,
+    6, 15, 16, 17,  9,  4,
+    8,  7, 12, 11, 18, 13,
+    19, 20,
+  };
+
+  static const uint8 kHudItemToItemNew[25] = {
+    0,
+    3,  2, 14, 1,  10,  5,
+    6, 15, 16, 17,  9,  4,
+    8,  7, 12, 21, 18, 13, // 8 is ocarina / shovel combined. moved shovel to 21.
+    19, 20,11, 11, 11, 11, // 11 means bottle
+  };
+
+  if (hud_cur_item >= kHudItem_Bottle1)
+    link_item_bottle_index = hud_cur_item - kHudItem_Bottle1 + 1;
+
+  assert(hud_cur_item < 25);
+  eq_selected_y_item = kNewStyleInventory ? kHudItemToItemNew[hud_cur_item] : kHudItemToItemOrg[hud_cur_item];
 }
 
 void Hud_CloseMenu() {  // 8ddfba
@@ -801,7 +675,7 @@
 
 void Hud_InitBottleMenu() {  // 8de002
   int r = bottle_menu_expand_row;
-  uint16 *dst = uvram_screen.row[0].col;
+  uint16 *dst = uvram_screen.row[0].col + (kNewStyleInventory ? 1 : 0);
   for (int i = 21; i <= 30; i++)
     dst[HUDXY(i, 11 + r)] = 0x207f;
 
@@ -819,16 +693,11 @@
   static const uint16 kBottleMenuBottom[] = { 0xA8FB, 0xA8F9, 0xA8F9, 0xA8F9, 0xA8F9, 0xA8F9, 0xA8F9, 0xA8F9, 0xA8F9, 0xE8FB };
 
   int r = bottle_menu_expand_row;
-  uint16 *dst = uvram_screen.row[0].col;
-  for (int i = 0; i < 10; i++)
-    dst[HUDXY(21 + i, 11 + r)] = kBottleMenuTop[i];
+  uint16 *dst = uvram_screen.row[0].col + (kNewStyleInventory ? 1 : 0);
+  memcpy(&dst[HUDXY(21, 11 + r)], kBottleMenuTop, sizeof(uint16) * 10);
+  memcpy(&dst[HUDXY(21, 12 + r)], kBottleMenuTop2, sizeof(uint16) * 10);
+  memcpy(&dst[HUDXY(21, 29)], kBottleMenuBottom, sizeof(uint16) * 10);
 
-  for (int i = 0; i < 10; i++)
-    dst[HUDXY(21 + i, 12 + r)] = kBottleMenuTop2[i];
-
-  for (int i = 0; i < 10; i++)
-    dst[HUDXY(21 + i, 29)] = kBottleMenuBottom[i];
-
   if (sign8(--bottle_menu_expand_row))
     overworld_map_state++;
   nmi_subroutine_index = 1;
@@ -848,13 +717,13 @@
     }
     timer_for_flashing_circle = 16;
     sound_effect_2 = 32;
-    Hud_DrawYButtonItems(Hud_GetPaletteMask(1));
+    Hud_DrawYButtonItems();
     Hud_DrawSelectedYButtonItem();
     overworld_map_state++;
     bottle_menu_expand_row = 0;
     return;
   }
-  Hud_UpdateBottleMenu();
+  Hud_DrawBottleMenu_Update();
   if (filtered_joypad_H & 12) {
     uint8 old_val = link_item_bottle_index - 1, val = old_val;
 
@@ -875,62 +744,91 @@
   }
 }
 
-void Hud_UpdateBottleMenu() {  // 8de17f
-  uint16 *dst = uvram_screen.row[0].col;
-  for (int y = 12; y <= 28; y++)
-    for (int x = 0; x < 8; x++)
-      dst[HUDXY(22 + x, y)] = 0x24f5;
+static void Hud_DrawItem(uint16 *dst, const ItemBoxGfx *src) {  // new
+  dst[0] = src->v[0];
+  dst[1] = src->v[1];
+  dst[32] = src->v[2];
+  dst[33] = src->v[3];
+}
 
-  Hud_DrawItem(0x1372, &kHudItemBottles[link_bottle_info[0]]);
-  Hud_DrawItem(0x1472, &kHudItemBottles[link_bottle_info[1]]);
-  Hud_DrawItem(0x1572, &kHudItemBottles[link_bottle_info[2]]);
-  Hud_DrawItem(0x1672, &kHudItemBottles[link_bottle_info[3]]);
-  
-  int bottle_vram_pos = kHudItemInVramPtr[Hud_GetCurrentItemPosition()];
-  Hud_DrawItem(bottle_vram_pos, &kHudItemBottles[link_item_bottle_index ? link_bottle_info[link_item_bottle_index - 1] : 0]);
+static void Hud_DrawNxN(uint16 *dst, const uint16 *src, int w, int h) {  // new
+  for (int y = 0; y < h; y++) {
+    memcpy(dst, src, sizeof(uint16) * w);
+    dst += 32, src += w;
+  }
+}
 
-  uint16 *p = (uint16 *)&g_ram[bottle_vram_pos];
-  dst[HUDXY(25, 6)] = p[0];
-  dst[HUDXY(26, 6)] = p[1];
-  dst[HUDXY(25, 7)] = p[32];
-  dst[HUDXY(26, 7)] = p[33];
+static void Hud_Copy2x2(uint16 *dst, uint16 *src) {  // new
+  dst[0] = src[0];
+  dst[1] = src[1];
+  dst[32] = src[32];
+  dst[33] = src[33];
+}
 
-  if (timer_for_flashing_circle & 0x10) {
-    int o = ((link_item_bottle_index - 1) * 0x100 + 0x88) / 2;
+static void Hud_DrawBox(uint16 *dst, int x1, int y1, int x2, int y2, uint8 palette) {  // new
+  uint16 t;
 
-    dst[HUDXY(21 + o, 10)] = 0x3C61;
-    dst[HUDXY(22 + o, 10)] = 0x3C61 | 0x4000;
+  t = 0x20fb | palette << 10;
+  dst[HUDXY(x1, y1)] = t;
+  dst[HUDXY(x2, y1)] = t + 0x4000;
+  dst[HUDXY(x1, y2)] = t + 0x8000;
+  dst[HUDXY(x2, y2)] = t + 0xc000;
 
-    dst[HUDXY(20 + o, 11)] = 0x3C70;
-    dst[HUDXY(23 + o, 11)] = 0x3C70 | 0x4000;
+  t = 0x20fc | palette << 10;
+  for (int y = y1 + 1; y < y2; y++) {
+    dst[HUDXY(x1, y)] = t;
+    dst[HUDXY(x2, y)] = t + 0x4000;
+  }
 
-    dst[HUDXY(20 + o, 12)] = 0xBC70;
-    dst[HUDXY(23 + o, 12)] = 0xBC70 | 0x4000;
+  t = 0x20f9 | palette << 10;
+  for (int x = x1 + 1; x < x2; x++) {
+    dst[HUDXY(x, y1)] = t;
+    dst[HUDXY(x, y2)] = t + 0x8000;
+  }
 
-    dst[HUDXY(21 + o, 13)] = 0xBC61;
-    dst[HUDXY(22 + o, 13)] = 0xBC61 | 0x4000;
+  for (int y = y1 + 1; y < y2; y++) {
+    for (int x = x1 + 1; x < x2; x++)
+      dst[HUDXY(x, y)] = 0x24F5;
+  }
+}
 
-    dst[HUDXY(20 + o, 10)] = 0x3C60;
-    dst[HUDXY(23 + o, 10)] = 0x3C60 | 0x4000;
+static void Hud_DrawFlashingCircle(uint16 *p) {  // new
+  p[HUDXY(0, -1)] = 0x3C61;
+  p[HUDXY(1, -1)] = 0x3C61 | 0x4000;
+  p[HUDXY(-1, 0)] = 0x3C70;
+  p[HUDXY(2, 0)] = 0x3C70 | 0x4000;
+  p[HUDXY(-1, 1)] = 0xBC70;
+  p[HUDXY(2, 1)] = 0xBC70 | 0x4000;
+  p[HUDXY(0, 2)] = 0xBC61;
+  p[HUDXY(1, 2)] = 0xBC61 | 0x4000;
+  p[HUDXY(-1, -1)] = 0x3C60;
+  p[HUDXY(2, -1)] = 0x3C60 | 0x4000;
+  p[HUDXY(2, 2)] = 0x3C60 | 0xC000;
+  p[HUDXY(-1, 2)] = 0x3C60 | 0x8000;
+}
 
-    dst[HUDXY(23 + o, 13)] = 0x3C60 | 0xC000;
-    dst[HUDXY(20 + o, 13)] = 0x3C60 | 0x8000;
-  }
+void Hud_DrawBottleMenu() {  // 8def67
+  uint16 *dst = uvram_screen.row[0].col + (kNewStyleInventory ? 1 : 0);
+  Hud_DrawBox(dst, 21, 11, 30, 29, 2);
+  for (int i = 0; i < 4; i++)
+    Hud_DrawItem(dst + HUDXY(25, 13 + i * 4), &kHudItemBottles[link_bottle_info[i]]);
+  const ItemBoxGfx *p = &kHudItemBottles[link_bottle_info[link_item_bottle_index - 1]];
+  Hud_DrawItem(uvram_screen.row[0].col + kHudItemInVramPtr[15], p);
+  if (timer_for_flashing_circle & 0x10)
+    Hud_DrawFlashingCircle(dst + HUDXY(25, 13 + (link_item_bottle_index - 1) * 4));
+}
 
-  if (link_item_bottle_index) {
-    const uint16 *src = kHudBottlesGfx + (link_bottle_info[link_item_bottle_index - 1] - 1) * 16;
-    for (int i = 0; i < 8; i++) {
-      dst[HUDXY(22 + i, 8)] = src[i];
-      dst[HUDXY(22 + i, 9)] = src[i + 8];
-    }
-  }
 
+void Hud_DrawBottleMenu_Update() {  // 8de17f
+  Hud_DrawBottleMenu();
+  Hud_DrawSelectedYButtonItem();
+
   nmi_subroutine_index = 1;
   BYTE(nmi_load_target_addr) = 0x22;
 }
 
 void Hud_EraseBottleMenu() {  // 8de2fd
-  uint16 *dst = uvram_screen.row[0].col;
+  uint16 *dst = uvram_screen.row[0].col + (kNewStyleInventory ? 1 : 0);
   int r = bottle_menu_expand_row;
   for (int i = 0; i < 10; i++)
     dst[HUDXY(21 + i, 11 + r)] = 0x207f;
@@ -942,32 +840,14 @@
 
 void Hud_RestoreNormalMenu() {  // 8de346
   Hud_DrawProgressIcons();
-  Hud_DrawMoonPearl();
-  Hud_DrawEquipment(Hud_GetPaletteMask(1));
-  Hud_DrawShield();
-  Hud_DrawArmor();
-  Hud_DrawMapAndBigKey();
-  Hud_DrawCompass();
-
+  Hud_DrawEquipmentBox();
   overworld_map_state = 4;
   nmi_subroutine_index = 1;
   BYTE(nmi_load_target_addr) = 0x22;
 }
 
-static void Hud_DrawItem(uint16 a, const ItemBoxGfx *src) {  // 8de372
-  uint16 *dst = (uint16 *)&g_ram[a];
-  dst[0] = src->v[0];
-  dst[1] = src->v[1];
-  dst[32] = src->v[2];
-  dst[33] = src->v[3];
-}
-
 void Hud_SearchForEquippedItem() {  // 8de399
-  uint8 or_all = 0;
-  for (int i = 0; i < 20; i++)
-    or_all |= (&link_item_bow)[i];
-
-  if (or_all == 0) {
+  if (!Hud_HaveAnyItems()) {
     hud_cur_item = 0;
     hud_var1 = 0;
   } else {
@@ -978,178 +858,103 @@
   }
 }
 
-uint16 Hud_GetPaletteMask(uint8 what) {  // 8de3c8
-  return what == 0 ? 0xe3ff : 0xffff;
-}
+static const ItemBoxGfx *Hud_GetIconForItem(int i) {
+  if (i <= 0)
+    return kHudItemEmpty;
 
-void Hud_DrawYButtonItems(uint16 mask) {  // 8de3d9
-  uint16 t;
-  uint16 *dst = uvram_screen.row[0].col;
+  if (i >= kHudItem_Bottle1)
+    return &kHudItemBottles[link_bottle_info[i - kHudItem_Bottle1]];
+  if (i == kHudItem_Shovel && kNewStyleInventory)
+    return &kHudItemFlute[link_item_flute >= 1];
 
-  t = 0x3CFB & mask;
-  dst[HUDXY(1, 5)] = t;
-  dst[HUDXY(1, 19)] = (t |= 0x8000);
-  dst[HUDXY(19, 19)] = (t |= 0x4000);
-  dst[HUDXY(19, 5)] = (t ^= 0x8000);
-
-  for (int i = 6; i < 19; i++) {
-    dst[HUDXY(1, i)] = (t = 0x3cfc & mask);
-    dst[HUDXY(19, i)] = (t |= 0x4000);
-  }
-
-  for (int i = 2; i < 19; i++) {
-    dst[HUDXY(i, 5)] = (t = 0x3CF9 & mask);
-    dst[HUDXY(i, 19)] = (t |= 0x8000);
-  }
-
-  for (int y = 6; y < 19; y++) {
-    for (int x = 2; x < 19; x++)
-      dst[HUDXY(x, y)] = 0x24F5;
-  }
-  dst[HUDXY(2, 6)] = 0x3CF0;
-  dst[HUDXY(2, 7)] = 0x3CF1;
-  dst[HUDXY(3, 5)] = 0x246E;
-  dst[HUDXY(4, 5)] = 0x246F;
-
-  const ItemBoxGfx *item_box_gfxs[] = {
-    &kHudItemBow[link_item_bow],
-    &kHudItemBoomerang[link_item_boomerang],
-    &kHudItemHookshot[link_item_hookshot],
-    &kHudItemBombs[link_item_bombs ? 1 : 0],
-    &kHudItemMushroom[link_item_mushroom],
-    &kHudItemFireRod[link_item_fire_rod],
-    &kHudItemIceRod[link_item_ice_rod],
-    &kHudItemBombos[link_item_bombos_medallion],
-    &kHudItemEther[link_item_ether_medallion],
-    &kHudItemQuake[link_item_quake_medallion],
-    &kHudItemTorch[link_item_torch],
-    &kHudItemHammer[link_item_hammer],
-    &kHudItemFlute[link_item_flute],
-    &kHudItemBugNet[link_item_bug_net],
-    &kHudItemBookMudora[link_item_book_of_mudora],
-    &kHudItemBottles[link_item_bottle_index ? link_bottle_info[link_item_bottle_index - 1] : 0],
-    &kHudItemCaneSomaria[link_item_cane_somaria],
-    &kHudItemCaneByrna[link_item_cane_byrna],
-    &kHudItemCape[link_item_cape],
-    &kHudItemMirror[link_item_mirror],
-  };
-
-  for (int i = 0; i < 20; i++) {
-    int j = hud_inventory_order[i];
-    Hud_DrawItem(kHudItemInVramPtr[i], item_box_gfxs[j == 0 ? i: j - 1]);
-  }
+  uint8 item_val = (&link_item_bow)[i - 1];
+  if (i == kHudItem_Bombs) // bombs
+    item_val = (item_val != 0);
+  else if (i == kHudItem_BottleOld && !kNewStyleInventory)
+    item_val = link_item_bottle_index ? link_bottle_info[link_item_bottle_index - 1] : 0;
+  return &kHudItemBoxGfxPtrs[i - 1][item_val];
 }
 
-void Hud_DrawTopRightBox(uint16 palmask) {  // 8de647
-  uint16 t;
+void Hud_DrawYButtonItems() {  // 8de3d9
   uint16 *dst = uvram_screen.row[0].col;
+  int x = kNewStyleInventory ? 0 : 1;
 
-  t = 0x3CFB & palmask;
-  dst[HUDXY(21, 5)] = t;
-  dst[HUDXY(21, 10)] = (t |= 0x8000);
-  dst[HUDXY(30, 10)] = (t |= 0x4000);
-  dst[HUDXY(30, 5)] = (t ^= 0x8000);
+  Hud_DrawBox(dst, x, 5, 20 - x, 19, 7);
 
-
-  t = 0x3CFC & palmask;
-  for (int i = 0; i < 4; i++) {
-    dst[HUDXY(21, 6 + i)] = t;
-    dst[HUDXY(30, 6 + i)] = t | 0x4000;
+  if (!kNewStyleInventory) {
+    dst[HUDXY(2, 6)] = 0x3CF0;
+    dst[HUDXY(2, 7)] = 0x3CF1;
   }
+  dst[HUDXY(x + 2, 5)] = 0x246E;
+  dst[HUDXY(x + 3, 5)] = 0x246F;
 
-  t = 0x3CF9 & palmask;
-  for (int i = 0; i < 8; i++) {
-    dst[HUDXY(22 + i, 5)] = t;
-    dst[HUDXY(22 + i, 10)] = t | 0x8000;
+  for (int i = 0; i < kHudItemCount; i++) {
+    int j = hud_inventory_order[i];
+    Hud_DrawItem(dst + kHudItemInVramPtr[i], Hud_GetIconForItem(j == 0 ? i + 1: j) );
   }
-
-  for (int i = 0; i < 8; i++) {
-    dst[HUDXY(22 + i, 6)] = 0x24F5;
-    dst[HUDXY(22 + i, 7)] = 0x24F5;
-    dst[HUDXY(22 + i, 8)] = 0x24F5;
-    dst[HUDXY(22 + i, 9)] = 0x24F5;
-  }
 }
 
-void Hud_DrawAbilityText(uint16 palmask) {  // 8de6b6
+void Hud_DrawAbilityBox() {  // 8de6b6
+  static const uint16 kHudAbilityText[80] = {
+    0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d5b, 0x2d58, 0x2d55, 0x2d63, 0x2d27,
+    0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d61, 0x2d54, 0x2d50, 0x2d53,
+    0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d63, 0x2d50, 0x2d5b, 0x2d5a,
+    0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f,
+    0x2cf5, 0x2cf5, 0x2c2e, 0x2cf5, 0x2cf5, 0x2d5f, 0x2d64, 0x2d5b, 0x2d5b, 0x2cf5,
+    0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d61, 0x2d64, 0x2d5d, 0x2cf5,
+    0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d62, 0x2d66, 0x2d58, 0x2d5c,
+    0x2cf5, 0x2cf5, 0x2cf5, 0x207f, 0x207f, 0x2c01, 0x2c18, 0x2c28, 0x207f, 0x207f,
+  };
+  static const uint16 kHudGlovesText[20] = {
+    0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d5b, 0x2d58, 0x2d55, 0x2d63, 0x2d28,
+    0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d5b, 0x2d58, 0x2d55, 0x2d63, 0x2d29,
+  };
+  static const ItemBoxGfx kHudItemGloves[3] = {
+    {0x20f5, 0x20f5, 0x20f5, 0x20f5},
+    {0x2130, 0x2131, 0x2140, 0x2141},
+    {0x28da, 0x28db, 0x28ea, 0x28eb},
+  };
+  static const ItemBoxGfx kHudItemBoots[2] = {
+    {0x20f5, 0x20f5, 0x20f5, 0x20f5},
+    {0x3429, 0x342a, 0x342b, 0x342c},
+  };
+  static const ItemBoxGfx kHudItemFlippers[2] = {
+    {0x20f5, 0x20f5, 0x20f5, 0x20f5},
+    {0x2c9a, 0x2c9b, 0x2c9d, 0x2c9e},
+  };
+  static const ItemBoxGfx kHudItemMoonPearl[2] = {
+    {0x20f5, 0x20f5, 0x20f5, 0x20f5},
+    {0x2433, 0x2434, 0x2435, 0x2436},
+  };
   uint16 *dst = uvram_screen.row[0].col;
+  int x = kNewStyleInventory ? 0 : 1;
 
-  for (int i = 0; i < 17; i++) {
-    dst[HUDXY(2 + i, 22)] = 0x24F5;
-    dst[HUDXY(2 + i, 23)] = 0x24F5;
-    dst[HUDXY(2 + i, 24)] = 0x24F5;
-    dst[HUDXY(2 + i, 25)] = 0x24F5;
-    dst[HUDXY(2 + i, 26)] = 0x24F5;
-    dst[HUDXY(2 + i, 27)] = 0x24F5;
-    dst[HUDXY(2 + i, 28)] = 0x24F5;
-  }
+  Hud_DrawBox(dst, x, 21, 19, 29, 1);
 
   uint8 flags = link_ability_flags;
-  const uint16 *src = kHudAbilityText;
-  uint16 *dst2 = &dst[HUDXY(4, 22)];
-  for (int i = 0; i < 2; i++) {
-    for (int j = 0; j < 4; j++) {
-      if (flags & 0x80) {
-        dst2[0] = src[0];
-        dst2[1] = src[1];
-        dst2[2] = src[2];
-        dst2[3] = src[3];
-        dst2[4] = src[4];
-        dst2[32 + 0] = src[5];
-        dst2[32 + 1] = src[6];
-        dst2[32 + 2] = src[7];
-        dst2[32 + 3] = src[8];
-        dst2[32 + 4] = src[9];
-      }
-      src += 10;
-      dst2 += 5;
-      flags <<= 1;
+  for (int i = 0; i < 2; i++, flags <<= 1) {
+    for (int j = 0; j < 3; j++, flags <<= 1) {
+      if (flags & 0x80)
+        Hud_DrawNxN(dst + HUDXY(4 + j * 5, 22 + i * 2), kHudAbilityText + i * 40 + j * 10, 5, 2);
     }
-    dst2 += 2 * 32 - 5 * 4;
   }
-
-  uint16 t;
-
-  t = 0x24FB & palmask;
-  dst[HUDXY(1, 21)] = t;
-  dst[HUDXY(1, 29)] = (t |= 0x8000);
-  dst[HUDXY(19, 29)] = (t |= 0x4000);
-  dst[HUDXY(19, 21)] = (t ^= 0x8000);
-
-  t = 0x24FC & palmask;
-  for (int i = 0; i < 7; i++) {
-    dst[HUDXY(1, 22 + i)] = t;
-    dst[HUDXY(19, 22 + i)] = t | 0x4000;
+  // A
+  if (!kNewStyleInventory) {
+    dst[HUDXY(2, 22)] = 0xA4F0;
+    dst[HUDXY(2, 23)] = 0x24F2;
   }
+  // DO text
+  dst[HUDXY(x + 2, 21)] = 0x2482;
+  dst[HUDXY(x + 3, 21)] = 0x2483;
 
-  t = 0x24F9 & palmask;
-  for (int i = 0; i < 17; i++) {
-    dst[HUDXY(2 + i, 21)] = t;
-    dst[HUDXY(2 + i, 29)] = t | 0x8000;
-  }
-
-  dst[HUDXY(2, 22)] = 0xA4F0;
-  dst[HUDXY(2, 23)] = 0x24F2;
-  dst[HUDXY(3, 21)] = 0x2482;
-  dst[HUDXY(4, 21)] = 0x2483;
-}
-
-void Hud_DrawAbilityIcons() {  // 8de7b7
-  Hud_DrawItem(0x16D0, &kHudItemGloves[link_item_gloves]);
-  Hud_DrawItem(0x16C8, &kHudItemBoots[link_item_boots]);
-  Hud_DrawItem(0x16D8, &kHudItemFlippers[link_item_flippers]);
+  Hud_DrawItem(dst + HUDXY(8, 27), &kHudItemGloves[link_item_gloves]);
+  Hud_DrawItem(dst + HUDXY(4, 27), &kHudItemBoots[link_item_boots]);
+  Hud_DrawItem(dst + HUDXY(12, 27), &kHudItemFlippers[link_item_flippers]);
+  Hud_DrawItem(dst + HUDXY(16, 27), &kHudItemMoonPearl[link_item_moon_pearl]);
   if (link_item_gloves)
-    Hud_DrawGlovesText(link_item_gloves != 1);
+    Hud_DrawNxN(dst + HUDXY(4, 22), kHudGlovesText + (link_item_gloves != 1) * 10, 5, 2);
 }
 
-void Hud_DrawGlovesText(uint8 idx) {  // 8de81a
-  const uint16 *src = kHudGlovesText + idx * 10;
-  uint16 *dst = uvram_screen.row[0].col;
-  dst = &dst[HUDXY(4, 22)];
-  memcpy(dst, src, sizeof(uint16) * 5);
-  memcpy(dst + 32, src + 5, sizeof(uint16) * 5);
-}
-
 void Hud_DrawProgressIcons() {  // 8de9c8
   if (sram_progress_indicator < 3)
     Hud_DrawProgressIcons_Pendants();
@@ -1158,86 +963,146 @@
 }
 
 void Hud_DrawProgressIcons_Pendants() {  // 8de9d3
-  const uint16 *src = kProgressIconPendantsBg;
-  uint16 *dst = uvram_screen.row[0].col;
-  for (int y = 0; y < 9; y++) {
-    memcpy(&dst[HUDXY(21, 11 + y)], src, sizeof(uint16) * 10);
-    src += 10;
-  }
-
-  Hud_DrawItem(0x13B2, &kHudPendants0[(link_which_pendants >> 0) & 1]);
-  Hud_DrawItem(0x146E, &kHudPendants1[(link_which_pendants >> 1) & 1]);
-  Hud_DrawItem(0x1476, &kHudPendants2[(link_which_pendants >> 2) & 1]);
+  static const uint16 kProgressIconPendantsBg[90] = {
+    0x28fb, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x68fb,
+    0x28fc, 0x2521, 0x2522, 0x2523, 0x2524, 0x253f, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
+    0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
+    0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x213b, 0x213c, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
+    0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x213d, 0x213e, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
+    0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
+    0x28fc, 0x24f5, 0x213b, 0x213c, 0x24f5, 0x24f5, 0x213b, 0x213c, 0x24f5, 0x68fc,
+    0x28fc, 0x24f5, 0x213d, 0x213e, 0x24f5, 0x24f5, 0x213d, 0x213e, 0x24f5, 0x68fc,
+    0xa8fb, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xe8fb,
+  };
+  static const ItemBoxGfx kHudPendants0[2] = {
+    {0x313b, 0x313c, 0x313d, 0x313e},
+    {0x252b, 0x252c, 0x252d, 0x252e}
+  };
+  static const ItemBoxGfx kHudPendants1[2] = {
+    {0x313b, 0x313c, 0x313d, 0x313e},
+    {0x2d2b, 0x2d2c, 0x2d2d, 0x2d2e}
+  };
+  static const ItemBoxGfx kHudPendants2[2] = {
+    {0x313b, 0x313c, 0x313d, 0x313e},
+    {0x3d2b, 0x3d2c, 0x3d2d, 0x3d2e}
+  };
+  uint16 *dst = uvram_screen.row[0].col + (kNewStyleInventory ? HUDXY(22, 11) : HUDXY(21, 11));
+  Hud_DrawNxN(dst, kProgressIconPendantsBg, 10, 9);
+  Hud_DrawItem(dst + HUDXY(4, 3), &kHudPendants0[(link_which_pendants >> 0) & 1]);
+  Hud_DrawItem(dst + HUDXY(2, 6), &kHudPendants1[(link_which_pendants >> 1) & 1]);
+  Hud_DrawItem(dst + HUDXY(6, 6), &kHudPendants2[(link_which_pendants >> 2) & 1]);
 }
 
 void Hud_DrawProgressIcons_Crystals() {  // 8dea62
-  const uint16 *src = kProgressIconCrystalsBg;
-  uint16 *dst = uvram_screen.row[0].col;
-  for (int y = 0; y < 9; y++, src += 10)
-    memcpy(&dst[HUDXY(21, 11 + y)], src, sizeof(uint16) * 10);
+  static const uint16 kProgressIconCrystalsBg[90] = {
+    0x28fb, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x68fb,
+    0x28fc, 0x252f, 0x2534, 0x2535, 0x2536, 0x2537, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
+    0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
+    0x28fc, 0x24f5, 0x24f5, 0x3146, 0x3147, 0x3146, 0x3147, 0x24f5, 0x24f5, 0x68fc,
+    0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
+    0x28fc, 0x24f5, 0x3146, 0x3147, 0x3146, 0x3147, 0x3146, 0x3147, 0x24f5, 0x68fc,
+    0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc,
+    0x28fc, 0x24f5, 0x24f5, 0x3146, 0x3147, 0x3146, 0x3147, 0x24f5, 0x24f5, 0x68fc,
+    0xa8fb, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xe8fb,
+  };
 
+  uint16 *dst = uvram_screen.row[0].col + (kNewStyleInventory ? HUDXY(22, 11) : HUDXY(21, 11));
+  Hud_DrawNxN(dst, kProgressIconCrystalsBg, 10, 9);
+
   uint8 f = link_has_crystals;
   if (f & 1) {
-    dst[HUDXY(24, 14)] = 0x2D44;
-    dst[HUDXY(25, 14)] = 0x2D45;
+    dst[HUDXY(3, 3)] = 0x2D44;
+    dst[HUDXY(4, 3)] = 0x2D45;
   }
   if (f & 2) {
-    dst[HUDXY(26, 14)] = 0x2D44;
-    dst[HUDXY(27, 14)] = 0x2D45;
+    dst[HUDXY(5, 3)] = 0x2D44;
+    dst[HUDXY(6, 3)] = 0x2D45;
   }
   if (f & 4) {
-    dst[HUDXY(23, 16)] = 0x2D44;
-    dst[HUDXY(24, 16)] = 0x2D45;
+    dst[HUDXY(2, 5)] = 0x2D44;
+    dst[HUDXY(3, 5)] = 0x2D45;
   }
   if (f & 8) {
-    dst[HUDXY(25, 16)] = 0x2D44;
-    dst[HUDXY(26, 16)] = 0x2D45;
+    dst[HUDXY(4, 5)] = 0x2D44;
+    dst[HUDXY(5, 5)] = 0x2D45;
   }
   if (f & 16) {
-    dst[HUDXY(27, 16)] = 0x2D44;
-    dst[HUDXY(28, 16)] = 0x2D45;
+    dst[HUDXY(6, 5)] = 0x2D44;
+    dst[HUDXY(7, 5)] = 0x2D45;
   }
   if (f & 32) {
-    dst[HUDXY(24, 18)] = 0x2D44;
-    dst[HUDXY(25, 18)] = 0x2D45;
+    dst[HUDXY(3, 7)] = 0x2D44;
+    dst[HUDXY(4, 7)] = 0x2D45;
   }
   if (f & 64) {
-    dst[HUDXY(26, 18)] = 0x2D44;
-    dst[HUDXY(27, 18)] = 0x2D45;
+    dst[HUDXY(5, 7)] = 0x2D44;
+    dst[HUDXY(6, 7)] = 0x2D45;
   }
 }
 
 void Hud_DrawSelectedYButtonItem() {  // 8deb3a
-  uint16 *p = (uint16 *)&g_ram[kHudItemInVramPtr[Hud_GetCurrentItemPosition()]];
-  uint16 *dst = uvram_screen.row[0].col;
-  dst[HUDXY(25, 6)] = p[0];
-  dst[HUDXY(26, 6)] = p[1];
-  dst[HUDXY(25, 7)] = p[32];
-  dst[HUDXY(26, 7)] = p[33];
+  static const uint16 kHudBottlesItemText[128] = {
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2564, 0x2562, 0x2557, 0x2561, 0x255e, 0x255e, 0x255c,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x255e, 0x2563, 0x2563, 0x255b, 0x2554, 0x24f5, 0x24f5,
+    0x255b, 0x2558, 0x2555, 0x2554, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2554, 0x2553, 0x2558, 0x2552, 0x2558, 0x255d, 0x2554,
+    0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2554, 0x2553, 0x2558, 0x2552, 0x2558, 0x255d, 0x2554,
+    0x2552, 0x2564, 0x2561, 0x2554, 0x256a, 0x2550, 0x255b, 0x255b, 0x255c, 0x2554, 0x2553, 0x2558, 0x2552, 0x2558, 0x255d, 0x2554,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x2550, 0x2554, 0x2561, 0x2558, 0x2554, 0x24f5, 0x24f5,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x2554, 0x2554, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2556, 0x255e, 0x255e, 0x2553, 0x24f5, 0x2551, 0x2554, 0x2554,
+  };
+  static const uint16 kHudMushroomItemText[16] = {
+    0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5,
+    0x24f5, 0x255f, 0x255e, 0x2566, 0x2553, 0x2554, 0x2561, 0x24f5,
+  };
+  static const uint16 kHudFluteItemText[32] = {
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x255b, 0x2564, 0x2563, 0x2554, 0x24f5, 0x24f5, 0x24f5,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x255b, 0x2564, 0x2563, 0x2554, 0x24f5, 0x24f5, 0x24f5
+  };
+  static const uint16 kHudMirrorItemText[16] = {
+    0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2558, 0x2561, 0x2561, 0x255e, 0x2561
+  };
+  static const uint16 kHudBowItemText[48] = {
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x256b, 0x256c, 0x256e, 0x256f, 0x257c, 0x257d, 0x257e, 0x257f,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x256b, 0x256c, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
+    0x256b, 0x256c, 0x24f5, 0x256e, 0x256f, 0x24f5, 0x24f5, 0x24f5, 0x2578, 0x2579, 0x257a, 0x257b, 0x257c, 0x257d, 0x257e, 0x257f,
+  };
+  static const uint16 kHudItemText[320] = {
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x256b, 0x256c, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2577,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2557, 0x255e, 0x255e, 0x255a, 0x2562, 0x2557, 0x255e, 0x2563,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x255e, 0x255c, 0x2551, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2564, 0x2562, 0x2557, 0x2561, 0x255e, 0x255e, 0x255c,
+    
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x2558, 0x2561, 0x2554, 0x2561, 0x255e, 0x2553, 0x24f5,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2558, 0x2552, 0x2554, 0x2561, 0x255e, 0x2553, 0x24f5, 0x24f5,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x255e, 0x255c, 0x2551, 0x255e, 0x2562, 0x24f5, 0x24f5,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2554, 0x2563, 0x2557, 0x2554, 0x2561, 0x24f5, 0x24f5, 0x24f5,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2560, 0x2564, 0x2550, 0x255a, 0x2554, 0x24f5, 0x24f5, 0x24f5,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255b, 0x2550, 0x255c, 0x255f, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
+    0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2557, 0x2550, 0x255c, 0x255c, 0x2554, 0x2561,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2562, 0x2557, 0x255e, 0x2565, 0x2554, 0x255b, 0x24f5, 0x24f5,
+    0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407, 0x2408, 0x2409, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
+    0x2551, 0x255e, 0x255e, 0x255a, 0x24f5, 0x255e, 0x2555, 0x24f5, 0x255c, 0x2564, 0x2553, 0x255e, 0x2561, 0x2550, 0x24f5, 0x24f5,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2564, 0x2562, 0x2557, 0x2561, 0x255e, 0x255e, 0x255c,
+    0x2552, 0x2550, 0x255d, 0x2554, 0x24f5, 0x255e, 0x2555, 0x24f5, 0x24f5, 0x2562, 0x255e, 0x255c, 0x2550, 0x2561, 0x2558, 0x2550,
+    0x2552, 0x2550, 0x255d, 0x2554, 0x24f5, 0x255e, 0x2555, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x2568, 0x2561, 0x255d, 0x2550,
+    0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2552, 0x2550, 0x255f, 0x2554, 0x24f5,
+    0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5,
+  };
 
-  if (timer_for_flashing_circle & 0x10) {
-    p[-32] = 0x3C61;
-    p[-31] = 0x3C61 | 0x4000;
+  uint16 *dst_org = uvram_screen.row[0].col;
+  uint16 *dst_box = dst_org + (kNewStyleInventory ? 1 : 0);
+  Hud_DrawBox(dst_box, 21, 5, 21 + 9, 10, 7);
 
-    p[-1] = 0x3C70;
-    p[2] = 0x3C70 | 0x4000;
+  uint16 *p = dst_org + kHudItemInVramPtr[Hud_GetCurrentItemPosition()];
+  Hud_Copy2x2(dst_box + HUDXY(25, 6), p);
 
-    p[31] = 0xBC70;
-    p[34] = 0xBC70 | 0x4000;
+  if (timer_for_flashing_circle & 0x10)
+    Hud_DrawFlashingCircle(p);
 
-    p[64] = 0xBC61;
-    p[65] = 0xBC61 | 0x4000;
-
-    p[-33] = 0x3C60;
-    p[-30] = 0x3C60 | 0x4000;
-
-    p[66] = 0x3C60 | 0xC000;
-    p[63] = 0x3C60 | 0x8000;
-  }
-
   const uint16 *src_p;
-
-  if (hud_cur_item == 16 && link_item_bottle_index) {
+  if (hud_cur_item == kHudItem_BottleOld && !kNewStyleInventory && link_item_bottle_index) {
     src_p = &kHudBottlesItemText[(link_bottle_info[link_item_bottle_index - 1] - 1) * 16];
   } else if (hud_cur_item == 5 && link_item_mushroom != 1) {
     src_p = &kHudMushroomItemText[(link_item_mushroom - 2) * 16];
@@ -1247,148 +1112,71 @@
     src_p = &kHudFluteItemText[(link_item_flute - 2) * 16];
   } else if (hud_cur_item == 1 && link_item_bow != 1) {
     src_p = &kHudBowItemText[(link_item_bow - 2) * 16];
+  } else if (hud_cur_item >= kHudItem_Bottle1 && hud_cur_item <= kHudItem_Bottle4) {
+    src_p = &kHudBottlesItemText[(link_bottle_info[hud_cur_item - kHudItem_Bottle1] - 1) * 16];
+  } else if (hud_cur_item == kHudItem_Shovel) {
+    src_p = &kHudItemText[(13 - 1) * 16];
   } else {
     src_p = &kHudItemText[(hud_cur_item - 1) * 16];
   }
-  memcpy(&dst[HUDXY(22, 8)], src_p + 0, sizeof(uint16) * 8);
-  memcpy(&dst[HUDXY(22, 9)], src_p + 8, sizeof(uint16) * 8);
+  Hud_DrawNxN(dst_box + HUDXY(22, 8), src_p, 8, 2);
 }
 
-void Hud_DrawMoonPearl() {  // 8dece9
-  Hud_DrawItem(0x16e0, &kHudItemMoonPearl[link_item_moon_pearl]);
-}
+void Hud_DrawEquipmentBox() {  // 8ded29
+  uint16 *dst = uvram_screen.row[0].col + (kNewStyleInventory ? 1 : 0);
 
-void Hud_DrawEquipment(uint16 palmask) {  // 8ded29
-  uint16 t = palmask & 0x28FB;
-  uint16 *dst = uvram_screen.row[0].col;
-  dst[HUDXY(21, 21)] = t | 0x0000;
-  dst[HUDXY(21, 29)] = t | 0x8000;
-  dst[HUDXY(30, 29)] = t | 0xC000;
-  dst[HUDXY(30, 21)] = t | 0x4000;
+  Hud_DrawBox(dst, 21, 21, 30, 29, 2);
 
-  t = 0x28FC & palmask;
-  for (int i = 0; i < 7; i++) {
-    dst[HUDXY(21, 22 + i)] = t;
-    dst[HUDXY(30, 22 + i)] = t | 0x4000;
-  }
-
-  t = 0x28F9 & palmask;
-  for (int i = 0; i < 8; i++) {
-    dst[HUDXY(22 + i, 21)] = t;
-    dst[HUDXY(22 + i, 29)] = t | 0x8000;
-  }
-
-  for (int i = 0; i < 7; i++) {
-    for (int j = 0; j < 8; j++)
-      dst[HUDXY(22 + j, 22 + i)] = 0x24F5;
-  }
-
   // Draw dotted lines
-  t = 0x28D7 & palmask;
   for (int i = 0; i < 8; i++)
-    dst[HUDXY(22 + i, 25)] = t;
+    dst[HUDXY(22 + i, 25)] = 0x28D7;
 
   static const uint16 kHudEquipmentDungeonItemText[16] = {
     0x2479, 0x247a, 0x247b, 0x247c, 0x248c, 0x24f5, 0x24f5, 0x24f5,
     0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x24f5,
   };
+  memcpy(dst + HUDXY(22, 22), &kHudEquipmentDungeonItemText[0], 8 * sizeof(uint16));
+  memcpy(dst + HUDXY(22, 26), &kHudEquipmentDungeonItemText[8], 8 * sizeof(uint16));
 
-  for (int i = 0; i < 8; i++) {
-    dst[HUDXY(22 + i, 22)] = kHudEquipmentDungeonItemText[i + 0] & palmask;
-    dst[HUDXY(22 + i, 26)] = kHudEquipmentDungeonItemText[i + 8] & palmask;
-  }
+  static const ItemBoxGfx kHudItemHeartPieces[4] = {
+    {0x2484, 0x6484, 0x2485, 0x6485},
+    {0x24ad, 0x6484, 0x2485, 0x6485},
+    {0x24ad, 0x6484, 0x24ae, 0x6485},
+    {0x24ad, 0x64ad, 0x24ae, 0x6485},
+  };
   if (cur_palace_index_x2 == 0xff) {
     for (int i = 0; i < 8; i++)
       dst[HUDXY(22 + i, 26)] = 0x24F5;
-    Hud_DrawItem(0x16f2, &kHudItemHeartPieces[link_heart_pieces]);
+    Hud_DrawItem(dst + HUDXY(25, 27), &kHudItemHeartPieces[link_heart_pieces]);
   }
-  Hud_DrawItem(0x15ec, &kHudItemSword[link_sword_type == 0xff ? 0 : link_sword_type]);
-}
+  Hud_DrawItem(dst + HUDXY(22, 23), &kHudItemSword[link_sword_type == 0xff ? 0 : link_sword_type]);
+  Hud_DrawItem(dst + HUDXY(25, 23), &kHudItemShield[link_shield_type]);
+  Hud_DrawItem(dst + HUDXY(28, 23), &kHudItemArmor[link_armor]);
 
-void Hud_DrawShield() {  // 8dee21
-  Hud_DrawItem(0x15f2, &kHudItemShield[link_shield_type]);
-}
-
-void Hud_DrawArmor() {  // 8dee3c
-  Hud_DrawItem(0x15f8, &kHudItemArmor[link_armor]);
-}
-
-void Hud_DrawMapAndBigKey() {  // 8dee57
+  static const ItemBoxGfx kHudItemPalaceItem[2] = {
+    {0x28d6, 0x68d6, 0x28e6, 0x28e7},
+    {0x354b, 0x354c, 0x354d, 0x354e},
+  };
+  static const ItemBoxGfx kHudItemDungeonMap[1] = {
+    {0x28de, 0x28df, 0x28ee, 0x28ef},
+  };
+  static const ItemBoxGfx kHudItemDungeonCompass[1] = {
+    {0x24bf, 0x64bf, 0x2ccf, 0x6ccf},
+  };
   if (cur_palace_index_x2 != 0xff &&
-      (link_bigkey << (cur_palace_index_x2 >> 1)) & 0x8000) {
-    Hud_DrawItem(0x16F8, &kHudItemPalaceItem[CheckPalaceItemPosession() + 1]);
+     (link_bigkey << (cur_palace_index_x2 >> 1)) & 0x8000) {
+    Hud_DrawItem(dst + HUDXY(28, 27), &kHudItemPalaceItem[CheckPalaceItemPosession()]);
   }
   if (cur_palace_index_x2 != 0xff &&
-      (link_dungeon_map << (cur_palace_index_x2 >> 1)) & 0x8000) {
-    Hud_DrawItem(0x16EC, &kHudItemDungeonMap[1]);
+     (link_dungeon_map << (cur_palace_index_x2 >> 1)) & 0x8000) {
+    Hud_DrawItem(dst + HUDXY(22, 27), &kHudItemDungeonMap[0]);
   }
-}
-
-void Hud_DrawCompass() {  // 8def39
   if (cur_palace_index_x2 != 0xff &&
-      (link_compass << (cur_palace_index_x2 >> 1)) & 0x8000) {
-    Hud_DrawItem(0x16F2, &kHudItemDungeonCompass[1]);
+     (link_compass << (cur_palace_index_x2 >> 1)) & 0x8000) {
+    Hud_DrawItem(dst + HUDXY(25, 27), &kHudItemDungeonCompass[0]);
   }
 }
 
-void Hud_DrawBottleMenu(uint16 palmask) {  // 8def67
-  uint16 t = 0x28FB & palmask;
-  uint16 *dst = uvram_screen.row[0].col;
-  dst[HUDXY(21, 11)] = t;
-  dst[HUDXY(21, 29)] = t | 0x8000;
-  dst[HUDXY(30, 29)] = t | 0xC000;
-  dst[HUDXY(30, 11)] = t | 0x4000;
-
-  t = 0x28FC & palmask;
-  for (int i = 0; i < 17; i++) {
-    dst[HUDXY(21, 12 + i)] = t;
-    dst[HUDXY(30, 12 + i)] = t | 0x4000;
-  }
-  t = 0x28F9 & palmask;
-  for (int i = 0; i < 8; i++) {
-    dst[HUDXY(22 + i, 11)] = t;
-    dst[HUDXY(22 + i, 29)] = t | 0x8000;
-  }
-  for (int y = 12; y <= 28; y++)
-    for (int x = 0; x < 8; x++)
-      dst[HUDXY(22 + x, y)] = 0x24f5;
-
-  Hud_DrawItem(0x1372, &kHudItemBottles[link_bottle_info[0]]);
-  Hud_DrawItem(0x1472, &kHudItemBottles[link_bottle_info[1]]);
-  Hud_DrawItem(0x1572, &kHudItemBottles[link_bottle_info[2]]);
-  Hud_DrawItem(0x1672, &kHudItemBottles[link_bottle_info[3]]);
-  Hud_DrawItem(0x1408, &kHudItemBottles[link_bottle_info[link_item_bottle_index - 1]]);
-
-  uint16 *p = (uint16 *)&g_ram[kHudItemInVramPtr[hud_cur_item - 1]];
-
-  dst[HUDXY(25, 6)] = p[0];
-  dst[HUDXY(26, 6)] = p[1];
-  dst[HUDXY(25, 7)] = p[32];
-  dst[HUDXY(26, 7)] = p[33];
-
-  int o = ((link_item_bottle_index - 1) * 0x100 + 0x88) / 2;
-
-  dst[HUDXY(21 + o, 10)] = 0x3C61;
-  dst[HUDXY(22 + o, 10)] = 0x3C61 | 0x4000;
-
-  dst[HUDXY(20 + o, 11)] = 0x3C70;
-  dst[HUDXY(23 + o, 11)] = 0x3C70 | 0x4000;
-
-  dst[HUDXY(20 + o, 12)] = 0xBC70;
-  dst[HUDXY(23 + o, 12)] = 0xBC70 | 0x4000;
-
-  dst[HUDXY(21 + o, 13)] = 0xBC61;
-  dst[HUDXY(22 + o, 13)] = 0xBC61 | 0x4000;
-
-  dst[HUDXY(20 + o, 10)] = 0x3C60;
-  dst[HUDXY(23 + o, 10)] = 0x3C60 | 0x4000;
-
-  dst[HUDXY(23 + o, 13)] = 0x3C60 | 0xC000;
-  dst[HUDXY(20 + o, 13)] = 0x3C60 | 0x8000;
-
-  timer_for_flashing_circle = 16;
-}
-
 void Hud_IntToDecimal(unsigned int number, uint8 *out) {  // 8df0f7
   out[0] = number / 100 + 0x90;
   out[1] = (number %= 100) / 10 + 0x90;
@@ -1471,21 +1259,8 @@
     }
   }
 
-  if (!hud_cur_item)
-    return;
-
-  uint8 item_val = (&link_item_bow)[hud_cur_item - 1];
-  if (hud_cur_item == 4)
-    item_val = 1;
-  else if (hud_cur_item == 16)
-    item_val = link_bottle_info[item_val - 1];
-
-  const uint16 *p = kHudItemBoxGfxPtrs[hud_cur_item - 1][item_val].v;
-
-  hud_tile_indices_buffer[37] = p[0];
-  hud_tile_indices_buffer[38] = p[1];
-  hud_tile_indices_buffer[37 + 32] = p[2];
-  hud_tile_indices_buffer[38 + 32] = p[3];
+  if (hud_cur_item)
+    Hud_DrawItem(&hud_tile_indices_buffer[37], Hud_GetIconForItem(hud_cur_item));
 }
 
 void Hud_UpdateInternal() {  // 8dfb91
@@ -1563,7 +1338,7 @@
   if (filtered_joypad_L & (0x20 | 0x10)) {  // left/right shoulder
     int old_item = hud_cur_item;
     for (int i = 0; ; i++) {
-      if (i >= 20) {
+      if (i >= kHudItemCount) {
         hud_cur_item = 0;
         break;
       }
@@ -1590,12 +1365,12 @@
   }
   int old_pos = Hud_GetCurrentItemPosition(), new_pos = old_pos + direction;
   if (new_pos < 0)
-    new_pos += 20;
-  else if (new_pos >= 20)
-    new_pos -= 20;
+    new_pos += kHudItemCount;
+  else if (new_pos >= kHudItemCount)
+    new_pos -= kHudItemCount;
   uint8 t = hud_inventory_order[old_pos];
   hud_inventory_order[old_pos] = hud_inventory_order[new_pos];
   hud_inventory_order[new_pos] = t;
-  Hud_DrawYButtonItems(Hud_GetPaletteMask(1));
+  Hud_DrawYButtonItems();
   sound_effect_2 = 32;
 }
--- a/hud.h
+++ b/hud.h
@@ -1,6 +1,22 @@
 #pragma once
 #include "types.h"
 
+enum kHudItems {
+
+  kHudItem_Bombs = 4,
+  kHudItem_Mushroom = 5,
+  kHudItem_Hammer = 12,
+  kHudItem_Flute = 13,
+  kHudItem_BookMudora = 15,
+  kHudItem_BottleOld = 16,
+  
+  kHudItem_Shovel = 16,
+  kHudItem_Bottle1 = 21,
+  kHudItem_Bottle2 = 22,
+  kHudItem_Bottle3 = 23,
+  kHudItem_Bottle4 = 24,
+};
+
 void Hud_RefreshIcon();
 uint8 CheckPalaceItemPosession();
 void Hud_GotoPrevItem();
@@ -27,27 +43,18 @@
 void Hud_InitBottleMenu();
 void Hud_ExpandBottleMenu();
 void Hud_BottleMenu();
-void Hud_UpdateBottleMenu();
+void Hud_DrawBottleMenu_Update();
 void Hud_EraseBottleMenu();
 void Hud_RestoreNormalMenu();
 void Hud_SearchForEquippedItem();
-uint16 Hud_GetPaletteMask(uint8 what);
-void Hud_DrawYButtonItems(uint16 mask);
-void Hud_DrawTopRightBox(uint16 palmask);
-void Hud_DrawAbilityText(uint16 palmask);
-void Hud_DrawAbilityIcons();
-void Hud_DrawGlovesText(uint8 idx);
+void Hud_DrawYButtonItems();
+void Hud_DrawAbilityBox();
 void Hud_DrawProgressIcons();
 void Hud_DrawProgressIcons_Pendants();
 void Hud_DrawProgressIcons_Crystals();
 void Hud_DrawSelectedYButtonItem();
-void Hud_DrawMoonPearl();
-void Hud_DrawEquipment(uint16 palmask);
-void Hud_DrawShield();
-void Hud_DrawArmor();
-void Hud_DrawMapAndBigKey();
-void Hud_DrawCompass();
-void Hud_DrawBottleMenu(uint16 palmask);
+void Hud_DrawEquipmentBox();
+void Hud_DrawBottleMenu();
 void Hud_IntToDecimal(unsigned int number, uint8 *out);
 bool Hud_RefillHealth();
 void Hud_AnimateHeartRefill();
--- a/player.c
+++ b/player.c
@@ -1979,6 +1979,7 @@
   case 18: LinkItem_CaneOfSomaria(); break;
   case 19: LinkItem_Cape(); break;
   case 20: LinkItem_Mirror(); break;
+  case 21: LinkItem_Shovel(); break;
   default:
     assert(0);
   }
--- a/sprite_main.c
+++ b/sprite_main.c
@@ -6069,7 +6069,7 @@
     } else if (link_item_mushroom == 1) {
       if (!(joypad1H_last & 0x40)) {
         Sprite_ShowSolicitedMessage(k, 0x4c);
-      } else if (Sprite_CheckDamageToLink_same_layer(k) && hud_cur_item == 5) {
+      } else if (Sprite_CheckDamageToLink_same_layer(k) && hud_cur_item == kHudItem_Mushroom) {
         Witch_AcceptShroom(k);
       }
     } else {
@@ -6884,7 +6884,7 @@
     return;
 
   int j = 1;
-  if (!(hud_cur_item == 15 && (filtered_joypad_H & 0x40)) && (j = 0, !(filtered_joypad_L & 0x80)))
+  if (!(hud_cur_item == kHudItem_BookMudora && (filtered_joypad_H & 0x40)) && (j = 0, !(filtered_joypad_L & 0x80)))
     return;
   if (j) {
     player_handler_timer = 0;
@@ -6909,7 +6909,7 @@
     return;
 
   int j = 1;
-  if (!(hud_cur_item == 15 && (filtered_joypad_H & 0x40)) && (j = 0, !(filtered_joypad_L & 0x80)))
+  if (!(hud_cur_item == kHudItem_BookMudora && (filtered_joypad_H & 0x40)) && (j = 0, !(filtered_joypad_L & 0x80)))
     return;
 
   if (j) {
@@ -10160,7 +10160,7 @@
     sprite_ai_state[k] = 0;
     break;
   case 3:  // wait for music
-    if (hud_cur_item == 13 && joypad1H_last & 0x40) {
+    if (hud_cur_item == kHudItem_Flute && joypad1H_last & 0x40) {
       sprite_ai_state[k] = 4;
       music_control = 0xf2;
       sound_effect_1 = 0;
@@ -10447,7 +10447,7 @@
 }
 
 bool Smithy_ListenForHammer(int k) {  // 86b43d
-  return sprite_delay_aux1[k] == 0 && hud_cur_item == 12 && (link_item_in_hand & 2) && player_handler_timer == 2 && Sprite_CheckDamageToLink_same_layer(k);
+  return sprite_delay_aux1[k] == 0 && hud_cur_item == kHudItem_Hammer && (link_item_in_hand & 2) && player_handler_timer == 2 && Sprite_CheckDamageToLink_same_layer(k);
 }
 
 int Smithy_SpawnDwarfPal(int k) {  // 86b5a6
@@ -12929,7 +12929,7 @@
   } else if (link_item_flute < 2) {
     Sprite_ShowSolicitedMessage(k, 0xa1);
   } else if (!(Sprite_ShowSolicitedMessage(k, 0xa4) & 0x100) &&
-             hud_cur_item == 13 && (joypad1H_last&0x40) && Sprite_CheckDamageToLink_same_layer(k)) {
+             hud_cur_item == kHudItem_Flute && (joypad1H_last&0x40) && Sprite_CheckDamageToLink_same_layer(k)) {
     Sprite_ShowMessageUnconditional(0xa2);
     sprite_ai_state[k]++;
     sprite_graphics[k] = 2;
@@ -24290,9 +24290,7 @@
     sprite_floor[j] = link_is_on_lower_level;
     Sprite_SetX(j, link_x_coord + 8);
     Sprite_SetY(j, link_y_coord + 16);
-
-    uint8 t = (&link_item_bow)[hud_cur_item - 1];
-    if (link_bottle_info[t - 1] == 8)
+    if (link_bottle_info[link_item_bottle_index - 1] == 8)
       sprite_head_dir[j] = 1;
     InitializeSpawnedBee(j);
     sprite_x_vel[j] = kSpawnBee_XY[GetRandomNumber() & 7];
@@ -24466,7 +24464,7 @@
   if (BYTE(overworld_screen_index) != 48) {
     if (link_direction_facing || !Sprite_CheckDamageToLink_same_layer(k))
       return;
-    if (hud_cur_item != 15 || !(filtered_joypad_H & 0x40)) {
+    if (hud_cur_item != kHudItem_BookMudora || !(filtered_joypad_H & 0x40)) {
       if (!(filtered_joypad_L & 0x80))
         return;
       Sprite_ShowMessageUnconditional(0xb6);
@@ -24479,7 +24477,7 @@
   } else {
     if (link_direction_facing || !Sprite_CheckDamageToLink_same_layer(k))
       return;
-    if (hud_cur_item != 15 || !(filtered_joypad_H & 0x40)) {
+    if (hud_cur_item != kHudItem_BookMudora || !(filtered_joypad_H & 0x40)) {
       if (!(filtered_joypad_L & 0x80))
         return;
       Sprite_ShowMessageUnconditional(0xbc);