From 41cc92f73e39cec5dfea6b1164176610cccc7df4 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Sat, 15 Aug 2015 13:58:32 +0300
Subject: Add strong typed int for item color.

---
 src/CMakeLists.txt                        |  1 +
 src/Makefile.am                           |  1 +
 src/actions/actions.cpp                   | 17 +++---
 src/actions/commands.cpp                  |  2 +-
 src/actormanager.cpp                      |  6 +-
 src/actormanager.h                        |  2 +-
 src/being/being.cpp                       | 79 ++++++++++++++++++---------
 src/being/being.h                         | 17 +++---
 src/being/localplayer.cpp                 |  8 +--
 src/being/localplayer.h                   |  2 +-
 src/dragdrop.h                            | 26 +++++----
 src/dropshortcut.cpp                      |  4 +-
 src/enums/simpletypes/intdefines.h        |  6 +-
 src/enums/simpletypes/itemcolor.h         | 29 ++++++++++
 src/flooritem.cpp                         |  2 +-
 src/flooritem.h                           |  8 ++-
 src/gui/models/shopitems.cpp              |  9 +--
 src/gui/models/shopitems.h                | 10 ++--
 src/gui/popups/itempopup.cpp              |  6 +-
 src/gui/popups/itempopup.h                |  6 +-
 src/gui/popups/popupmenu.cpp              | 19 ++++---
 src/gui/popups/popupmenu.h                |  8 ++-
 src/gui/widgets/itemlinkhandler.cpp       |  4 +-
 src/gui/widgets/itemshortcutcontainer.cpp |  8 +--
 src/gui/widgets/selldialog.cpp            |  2 +-
 src/gui/widgets/selldialog.h              |  4 +-
 src/gui/widgets/virtshortcutcontainer.cpp |  4 +-
 src/gui/windows/buydialog.cpp             |  5 +-
 src/gui/windows/buydialog.h               |  3 +-
 src/gui/windows/buyingstoreselldialog.cpp |  2 +-
 src/gui/windows/charcreatedialog.cpp      |  9 ++-
 src/gui/windows/itemamountwindow.cpp      |  3 +-
 src/gui/windows/maileditwindow.cpp        |  3 +-
 src/gui/windows/mailviewwindow.cpp        |  3 +-
 src/gui/windows/npcdialog.cpp             |  4 +-
 src/gui/windows/outfitwindow.cpp          | 11 ++--
 src/gui/windows/outfitwindow.h            |  4 +-
 src/gui/windows/shopwindow.cpp            | 25 +++++----
 src/gui/windows/tradewindow.cpp           |  4 +-
 src/gui/windows/tradewindow.h             |  5 +-
 src/inventory.cpp                         | 13 +++--
 src/inventory.h                           |  7 ++-
 src/item.cpp                              | 10 ++--
 src/item.h                                | 11 ++--
 src/itemshortcut.cpp                      | 21 ++++---
 src/itemshortcut.h                        | 20 ++++---
 src/net/adminhandler.h                    |  4 +-
 src/net/cashshophandler.h                 |  4 +-
 src/net/ea/adminhandler.cpp               |  5 +-
 src/net/ea/adminhandler.h                 |  3 +-
 src/net/ea/beinghandler.cpp               |  2 +-
 src/net/ea/beinghandler.h                 |  2 +-
 src/net/ea/inventoryitem.h                |  5 +-
 src/net/ea/itemhandler.cpp                | 10 +++-
 src/net/eathena/beinghandler.cpp          | 50 +++++++++--------
 src/net/eathena/buyingstorehandler.cpp    |  4 +-
 src/net/eathena/buysellhandler.cpp        |  2 +-
 src/net/eathena/cashshophandler.cpp       |  4 +-
 src/net/eathena/cashshophandler.h         |  2 +-
 src/net/eathena/charserverhandler.cpp     |  6 +-
 src/net/eathena/inventoryhandler.cpp      | 91 ++++++++++++++++++++++++-------
 src/net/eathena/itemhandler.cpp           | 10 +++-
 src/net/eathena/markethandler.cpp         |  4 +-
 src/net/eathena/markethandler.h           |  2 +-
 src/net/eathena/npchandler.cpp            |  2 +-
 src/net/eathena/npchandler.h              |  2 +-
 src/net/eathena/tradehandler.cpp          | 12 ++--
 src/net/eathena/vendinghandler.cpp        |  2 +-
 src/net/markethandler.h                   |  4 +-
 src/net/npchandler.h                      |  3 +-
 src/net/tmwa/beinghandler.cpp             | 50 +++++++++--------
 src/net/tmwa/buysellhandler.cpp           |  2 +-
 src/net/tmwa/cashshophandler.cpp          |  2 +-
 src/net/tmwa/cashshophandler.h            |  2 +-
 src/net/tmwa/charserverhandler.cpp        |  7 ++-
 src/net/tmwa/inventoryhandler.cpp         | 65 +++++++++++++++++-----
 src/net/tmwa/itemhandler.cpp              |  2 +-
 src/net/tmwa/markethandler.cpp            |  2 +-
 src/net/tmwa/markethandler.h              |  2 +-
 src/net/tmwa/npchandler.cpp               |  2 +-
 src/net/tmwa/npchandler.h                 |  2 +-
 src/net/tmwa/tradehandler.cpp             | 12 ++--
 src/resources/beinginfo.cpp               |  4 +-
 src/resources/beinginfo.h                 |  7 ++-
 src/resources/db/colordb.cpp              | 36 ++++++------
 src/resources/db/colordb.h                | 29 ++++++----
 src/resources/iteminfo.cpp                | 20 +++----
 src/resources/iteminfo.h                  | 17 +++---
 src/shopitem.cpp                          |  4 +-
 src/shopitem.h                            |  4 +-
 src/shortcutbase.cpp                      | 16 +++---
 src/shortcutbase.h                        | 13 +++--
 92 files changed, 615 insertions(+), 373 deletions(-)
 create mode 100644 src/enums/simpletypes/itemcolor.h

(limited to 'src')

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 3610eb3e1..43a2e0c5f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1091,6 +1091,7 @@ SET(SRCS
     enums/simpletypes/identified.h
     enums/simpletypes/ignorerecord.h
     enums/simpletypes/intdefines.h
+    enums/simpletypes/itemcolor.h
     enums/simpletypes/keep.h
     enums/simpletypes/modal.h
     enums/simpletypes/modifiable.h
diff --git a/src/Makefile.am b/src/Makefile.am
index cf6a2a8a2..9ec08b226 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -561,6 +561,7 @@ SRC += events/actionevent.h \
 	      enums/simpletypes/identified.h \
 	      enums/simpletypes/ignorerecord.h \
 	      enums/simpletypes/intdefines.h \
+	      enums/simpletypes/itemcolor.h \
 	      enums/simpletypes/keep.h \
 	      enums/simpletypes/modal.h \
 	      enums/simpletypes/modifiable.h \
diff --git a/src/actions/actions.cpp b/src/actions/actions.cpp
index 92c0029ed..014ae10f8 100644
--- a/src/actions/actions.cpp
+++ b/src/actions/actions.cpp
@@ -439,7 +439,8 @@ impHandler(dropItemId)
         return false;
 
     // +++ ignoring item color for now
-    Item *const item = inv->findItem(atoi(event.args.c_str()), 1);
+    Item *const item = inv->findItem(atoi(event.args.c_str()),
+        ItemColor_one);
 
     if (item && !PlayerInfo::isItemProtected(item->getId()))
     {
@@ -467,7 +468,8 @@ impHandler(dropItemIdAll)
         return false;
 
     // +++ ignoring item color for now
-    Item *const item = inv->findItem(atoi(event.args.c_str()), 1);
+    Item *const item = inv->findItem(atoi(event.args.c_str()),
+        ItemColor_one);
 
     if (item && !PlayerInfo::isItemProtected(item->getId()))
         PlayerInfo::dropItem(item, item->getQuantity(), Sfx_true);
@@ -1485,14 +1487,14 @@ impHandler0(createItems)
 
         if (!colors)
         {
-            dialog->addItem(id, 0, 1, 100, 0);
+            dialog->addItem(id, 0, ItemColor_one, 100, 0);
         }
         else
         {
-            for (unsigned char f = 0; f < colors; f ++)
+            for (int f = 0; f < colors; f ++)
             {
-                if (!info->getColor(f).empty())
-                    dialog->addItem(id, 0, f, 100, 0);
+                if (!info->getColor(fromInt(f, ItemColor)).empty())
+                    dialog->addItem(id, 0, fromInt(f, ItemColor), 100, 0);
             }
         }
     }
@@ -1548,7 +1550,8 @@ impHandler(useItem)
         if (inv)
         {
             // +++ ignoring item color for now
-            const Item *const item = inv->findItem(itemId, 1);
+            const Item *const item = inv->findItem(itemId,
+                ItemColor_one);
             PlayerInfo::useEquipItem(item, Sfx_true);
         }
     }
diff --git a/src/actions/commands.cpp b/src/actions/commands.cpp
index 8070efcc7..0a8ef91ba 100644
--- a/src/actions/commands.cpp
+++ b/src/actions/commands.cpp
@@ -285,7 +285,7 @@ impHandler(chatAdd)
     if (inv)
     {
         // +++ need add also color here
-        item = inv->findItem(id, 1);
+        item = inv->findItem(id, ItemColor_one);
     }
 
     if (item)
diff --git a/src/actormanager.cpp b/src/actormanager.cpp
index 8e26e2f6b..96d234327 100644
--- a/src/actormanager.cpp
+++ b/src/actormanager.cpp
@@ -300,7 +300,7 @@ FloorItem *ActorManager::createItem(const BeingId id,
                                     const int itemId,
                                     const int x, const int y,
                                     const int amount,
-                                    const unsigned char color,
+                                    const ItemColor color,
                                     const int subX, const int subY)
 {
     FloorItem *const floorItem = new FloorItem(id, itemId,
@@ -1840,12 +1840,12 @@ Being *ActorManager::cloneBeing(const Being *const srcBeing,
     for (int slot = 0; slot < sz; slot ++)
     {
         const int spriteId = srcBeing->getSpriteID(slot);
-        const unsigned char color = srcBeing->getSpriteColor(slot);
+        const ItemColor color = srcBeing->getSpriteColor(slot);
         dstBeing->setSprite(slot, spriteId, "", color, false);
     }
     const int hairSlot = charServerHandler->hairSprite();
     const int hairStyle = -srcBeing->getSpriteID(hairSlot);
-    const unsigned char hairColor = srcBeing->getHairColor();
+    const ItemColor hairColor = srcBeing->getHairColor();
     dstBeing->setSprite(hairSlot, hairStyle * -1,
         ItemDB::get(-hairStyle).getDyeColorsString(hairColor));
     dstBeing->setHairColor(hairColor);
diff --git a/src/actormanager.h b/src/actormanager.h
index 270530f48..af597cbfb 100644
--- a/src/actormanager.h
+++ b/src/actormanager.h
@@ -84,7 +84,7 @@ class ActorManager final: public ConfigListener
                               const int itemId,
                               const int x, const int y,
                               const int amount,
-                              const unsigned char color,
+                              const ItemColor color,
                               const int subX, const int subY);
 
         /**
diff --git a/src/being/being.cpp b/src/being/being.cpp
index 4ba600294..ca5d7fd1a 100644
--- a/src/being/being.cpp
+++ b/src/being/being.cpp
@@ -227,7 +227,7 @@ Being::Being(const BeingId id,
     mTeamId(0U),
     mLook(0U),
     mBadgesCount(0U),
-    mHairColor(0),
+    mHairColor(ItemColor_zero),
     mErased(false),
     mEnemy(false),
     mGotComment(false),
@@ -354,7 +354,7 @@ void Being::setSubtype(const BeingTypeId subtype,
             setupSpriteDisplay(mInfo->getDisplay(),
                 ForceDisplay_true,
                 0,
-                mInfo->getColor(mLook));
+                mInfo->getColor(fromInt(mLook, ItemColor)));
             mYDiff = mInfo->getSortOffsetY();
         }
     }
@@ -368,7 +368,7 @@ void Being::setSubtype(const BeingTypeId subtype,
             setupSpriteDisplay(mInfo->getDisplay(),
                 ForceDisplay_true,
                 0,
-                mInfo->getColor(mLook));
+                mInfo->getColor(fromInt(mLook, ItemColor)));
             mYDiff = mInfo->getSortOffsetY();
         }
     }
@@ -381,7 +381,7 @@ void Being::setSubtype(const BeingTypeId subtype,
             setupSpriteDisplay(mInfo->getDisplay(),
                 ForceDisplay_true,
                 0,
-                mInfo->getColor(mLook));
+                mInfo->getColor(fromInt(mLook, ItemColor)));
             mYDiff = mInfo->getSortOffsetY();
         }
     }
@@ -394,7 +394,7 @@ void Being::setSubtype(const BeingTypeId subtype,
             setupSpriteDisplay(mInfo->getDisplay(),
                 ForceDisplay_true,
                 0,
-                mInfo->getColor(mLook));
+                mInfo->getColor(fromInt(mLook, ItemColor)));
             mYDiff = mInfo->getSortOffsetY();
         }
     }
@@ -456,7 +456,7 @@ void Being::setSubtype(const BeingTypeId subtype,
             if (charServerHandler)
             {
                 setSprite(charServerHandler->baseSprite(),
-                    id, info.getColor(mLook));
+                    id, info.getColor(fromInt(mLook, ItemColor)));
             }
         }
     }
@@ -2296,9 +2296,12 @@ void Being::updateColors()
     }
 }
 
-void Being::updateSprite(const unsigned int slot, const int id,
-                         std::string color, const unsigned char colorId,
-                         const bool isWeapon, const bool isTempSprite)
+void Being::updateSprite(const unsigned int slot,
+                         const int id,
+                         std::string color,
+                         const ItemColor colorId,
+                         const bool isWeapon,
+                         const bool isTempSprite)
 {
     if (!charServerHandler || slot >= charServerHandler->maxSprite())
         return;
@@ -2311,9 +2314,12 @@ void Being::updateSprite(const unsigned int slot, const int id,
     setSprite(slot, id, color, colorId, isWeapon, isTempSprite);
 }
 
-void Being::setSprite(const unsigned int slot, const int id,
-                      std::string color, const unsigned char colorId,
-                      const bool isWeapon, const bool isTempSprite)
+void Being::setSprite(const unsigned int slot,
+                      const int id,
+                      std::string color,
+                      const ItemColor colorId,
+                      const bool isWeapon,
+                      const bool isTempSprite)
 {
     if (!charServerHandler || slot >= charServerHandler->maxSprite())
         return;
@@ -2328,7 +2334,7 @@ void Being::setSprite(const unsigned int slot, const int id,
         mSpriteColors.resize(slot + 1, "");
 
     if (slot >= static_cast<unsigned int>(mSpriteColorsIds.size()))
-        mSpriteColorsIds.resize(slot + 1, 1);
+        mSpriteColorsIds.resize(slot + 1, ItemColor_one);
 
     // disabled for now, because it may broke replace/reorder sprites logic
 //    if (slot && mSpriteIDs[slot] == id)
@@ -2421,7 +2427,7 @@ void Being::setHairStyle(const unsigned int slot, const int id)
 //    dumpSprites();
 }
 
-void Being::setHairColor(const unsigned int slot, const unsigned char color)
+void Being::setHairColor(const unsigned int slot, const ItemColor color)
 {
     mHairColor = color;
     setSprite(slot, mSpriteIDs[slot], ItemDB::get(
@@ -2434,15 +2440,15 @@ void Being::dumpSprites() const
     const std::vector<int>::const_iterator it1_end = mSpriteIDs.end();
     StringVectCIter it2 = mSpriteColors.begin();
     const StringVectCIter it2_end = mSpriteColors.end();
-    std::vector<unsigned char>::const_iterator it3 = mSpriteColorsIds.begin();
-    const std::vector<unsigned char>::const_iterator
+    std::vector<ItemColor>::const_iterator it3 = mSpriteColorsIds.begin();
+    const std::vector<ItemColor>::const_iterator
         it3_end = mSpriteColorsIds.end();
 
     logger->log("sprites");
     for (; it1 != it1_end && it2 != it2_end && it3 != it3_end;
          ++ it1, ++ it2, ++ it3)
     {
-        logger->log("%d,%s,%d", *it1, (*it2).c_str(), *it3);
+        logger->log("%d,%s,%d", *it1, (*it2).c_str(), toInt(*it3, int));
     }
 }
 
@@ -2994,14 +3000,18 @@ void Being::recalcSpritesOrder()
                                     {
                                         setSprite(remSprite, repIt->second,
                                             mSpriteColors[remSprite],
-                                            1, false, true);
+                                            ItemColor_one,
+                                            false,
+                                            true);
                                     }
                                     else
                                     {
                                         setSprite(remSprite, repIt->second,
                                             ItemDB::get(repIt->second)
                                             .getDyeColorsString(mHairColor),
-                                            1, false, true);
+                                            ItemColor_one,
+                                            false,
+                                            true);
                                     }
                                     updatedSprite[remSprite] = true;
                                 }
@@ -3023,7 +3033,9 @@ void Being::recalcSpritesOrder()
                                         {
                                             setSprite(slot2, repIt->second,
                                                 mSpriteColors[slot2],
-                                                1, false, true);
+                                                ItemColor_one,
+                                                false,
+                                                true);
                                         }
                                         else
                                         {
@@ -3031,7 +3043,9 @@ void Being::recalcSpritesOrder()
                                                 ItemDB::get(repIt->second)
                                                 .getDyeColorsString(
                                                 mHairColor),
-                                                1, false, true);
+                                                ItemColor_one,
+                                                false,
+                                                true);
                                         }
                                         updatedSprite[slot2] = true;
                                     }
@@ -3174,7 +3188,12 @@ void Being::recalcSpritesOrder()
                     continue;
 
                 updatedSprite[slot] = true;
-                setSprite(slot, id, mSpriteColors[slot], 1, false, true);
+                setSprite(slot,
+                    id,
+                    mSpriteColors[slot],
+                    ItemColor_one,
+                    false,
+                    true);
             }
         }
     }
@@ -3183,8 +3202,16 @@ void Being::recalcSpritesOrder()
         if (mSpriteHide[slot] == 0)
         {
             const int id = mSpriteIDs[slot];
-            if (updatedSprite[slot] == false && mSpriteDraw[slot] != id)
-                setSprite(slot, id, mSpriteColors[slot], 1, false, true);
+            if (updatedSprite[slot] == false &&
+                mSpriteDraw[slot] != id)
+            {
+                setSprite(slot,
+                    id,
+                    mSpriteColors[slot],
+                    ItemColor_one,
+                    false,
+                    true);
+            }
         }
     }
 }
@@ -3467,10 +3494,10 @@ int Being::getSpriteID(const int slot) const
     return mSpriteIDs[slot];
 }
 
-unsigned char Being::getSpriteColor(const int slot) const
+ItemColor Being::getSpriteColor(const int slot) const
 {
     if (slot < 0 || static_cast<size_t>(slot) >= mSpriteColorsIds.size())
-        return 1;
+        return ItemColor_one;
 
     return mSpriteColorsIds[slot];
 }
diff --git a/src/being/being.h b/src/being/being.h
index 8926e5548..7bb7def7d 100644
--- a/src/being/being.h
+++ b/src/being/being.h
@@ -27,6 +27,7 @@
 
 #include "enums/gui/usercolorid.h"
 
+#include "enums/simpletypes/itemcolor.h"
 #include "enums/simpletypes/move.h"
 
 #include "resources/beinginfo.h"
@@ -306,13 +307,13 @@ class Being notfinal : public ActorSprite,
          */
         void setSprite(const unsigned int slot, const int id,
                        std::string color = "",
-                       const unsigned char colorId = 1,
+                       const ItemColor colorId = ItemColor_one,
                        const bool isWeapon = false,
                        const bool isTempSprite = false);
 
         void updateSprite(const unsigned int slot, const int id,
                           std::string color = "",
-                          const unsigned char colorId = 1,
+                          const ItemColor colorId = ItemColor_one,
                           const bool isWeapon = false,
                           const bool isTempSprite = false);
 
@@ -784,17 +785,17 @@ class Being notfinal : public ActorSprite,
 
         int getSpriteID(const int slot) const A_WARN_UNUSED;
 
-        unsigned char getSpriteColor(const int slot) const A_WARN_UNUSED;
+        ItemColor getSpriteColor(const int slot) const A_WARN_UNUSED;
 
         void setHairStyle(const unsigned int slot, const int id);
 
         void setHairColor(const unsigned int slot,
-                          const unsigned char color);
+                          const ItemColor color);
 
-        void setHairColor(const unsigned char color)
+        void setHairColor(const ItemColor color)
         { mHairColor = color; }
 
-        unsigned char getHairColor() const A_WARN_UNUSED
+        ItemColor getHairColor() const A_WARN_UNUSED
         { return mHairColor; }
 
         void recalcSpritesOrder();
@@ -1007,7 +1008,7 @@ class Being notfinal : public ActorSprite,
 
         StringVect mSpriteColors;
         std::vector<int> mSpriteIDs;
-        std::vector<unsigned char> mSpriteColorsIds;
+        std::vector<ItemColor> mSpriteColorsIds;
         SpriteParticleInfo mSpriteParticles;
 
         // Character guild information
@@ -1139,7 +1140,7 @@ class Being notfinal : public ActorSprite,
         uint16_t mTeamId;
         uint16_t mLook;
         uint16_t mBadgesCount;
-        unsigned char mHairColor;
+        ItemColor mHairColor;
         bool mErased;
         bool mEnemy;
         bool mGotComment;
diff --git a/src/being/localplayer.cpp b/src/being/localplayer.cpp
index acc6e2c0e..6722d5a4b 100644
--- a/src/being/localplayer.cpp
+++ b/src/being/localplayer.cpp
@@ -813,7 +813,7 @@ void LocalPlayer::untarget()
 
 void LocalPlayer::pickedUp(const ItemInfo &itemInfo,
                            const int amount,
-                           const unsigned char color,
+                           const ItemColor color,
                            const BeingId floorItemId,
                            const PickupT fail)
 {
@@ -1317,7 +1317,7 @@ void LocalPlayer::changeEquipmentBeforeAttack(const Being *const target) const
         const WeaponsInfos &swords = WeaponsDB::getSwords();
         FOR_EACH (WeaponsInfosIter, it, swords)
         {
-            item = inv->findItem(*it, 0);
+            item = inv->findItem(*it, ItemColor_zero);
             if (item)
                 break;
         }
@@ -1337,7 +1337,7 @@ void LocalPlayer::changeEquipmentBeforeAttack(const Being *const target) const
             const WeaponsInfos &shields = WeaponsDB::getShields();
             FOR_EACH (WeaponsInfosIter, it, shields)
             {
-                item = inv->findItem(*it, 0);
+                item = inv->findItem(*it, ItemColor_zero);
                 if (item)
                     break;
             }
@@ -1352,7 +1352,7 @@ void LocalPlayer::changeEquipmentBeforeAttack(const Being *const target) const
         const WeaponsInfos &bows = WeaponsDB::getBows();
         FOR_EACH (WeaponsInfosIter, it, bows)
         {
-            item = inv->findItem(*it, 0);
+            item = inv->findItem(*it, ItemColor_zero);
             if (item)
                 break;
         }
diff --git a/src/being/localplayer.h b/src/being/localplayer.h
index 475101528..c258a14f1 100644
--- a/src/being/localplayer.h
+++ b/src/being/localplayer.h
@@ -176,7 +176,7 @@ class LocalPlayer final : public Being,
          */
         void pickedUp(const ItemInfo &itemInfo,
                       const int amount,
-                      const unsigned char color,
+                      const ItemColor color,
                       const BeingId floorItemId,
                       const PickupT fail);
 
diff --git a/src/dragdrop.h b/src/dragdrop.h
index 814434124..278fc7639 100644
--- a/src/dragdrop.h
+++ b/src/dragdrop.h
@@ -27,6 +27,8 @@
 
 #include "enums/dragdropsource.h"
 
+#include "enums/simpletypes/itemcolor.h"
+
 #include "gui/widgets/skilldata.h"
 #include "gui/widgets/skillinfo.h"
 
@@ -44,8 +46,8 @@ class DragDrop final
             mItem(item ? item->getId() : 0),
             mSelItem(0),
             mTag(-1),
-            mItemColor(item ? item->getColor() : static_cast<uint8_t>(1U)),
-            mSelItemColor(1)
+            mItemColor(item ? item->getColor() : ItemColor_one),
+            mSelItemColor(ItemColor_one)
         {
             if (mItemImage)
                 mItemImage->incRef();
@@ -62,7 +64,7 @@ class DragDrop final
         int getItem() const
         { return mItem; }
 
-        uint8_t getItemColor() const
+        ItemColor getItemColor() const
         { return mItemColor; }
 
         Image *getItemImage()
@@ -93,7 +95,7 @@ class DragDrop final
             else
             {
                 mItem = 0;
-                mItemColor = 1;
+                mItemColor = ItemColor_one;
                 mItemImage = nullptr;
                 mSource = DRAGDROP_SOURCE_EMPTY;
                 mTag = -1;
@@ -107,7 +109,7 @@ class DragDrop final
             if (mItemImage)
                 mItemImage->decRef();
             mItem = 0;
-            mItemColor = 1;
+            mItemColor = ItemColor_one;
 
             if (command)
             {
@@ -141,7 +143,7 @@ class DragDrop final
             if (mItemImage)
                 mItemImage->decRef();
             mItem = 0;
-            mItemColor = 1;
+            mItemColor = ItemColor_one;
             mText.clear();
             mItemImage = nullptr;
             mSource = DRAGDROP_SOURCE_EMPTY;
@@ -169,7 +171,7 @@ class DragDrop final
             if (mItem)
                 ItemSoundManager::playSfx(mItem, ItemSoundEvent::PUT);
             mItem = 0;
-            mItemColor = 1;
+            mItemColor = ItemColor_one;
             mItemImage = nullptr;
             mSource = DRAGDROP_SOURCE_EMPTY;
             mText.clear();
@@ -189,20 +191,20 @@ class DragDrop final
             else
             {
                 mSelItem = 0;
-                mSelItemColor = 1;
+                mSelItemColor = ItemColor_one;
             }
         }
 
         void deselect()
         {
             mSelItem = 0;
-            mSelItemColor = 1;
+            mSelItemColor = ItemColor_one;
         }
 
         int getSelected() const
         { return mSelItem; }
 
-        uint8_t getSelectedColor() const
+        ItemColor getSelectedColor() const
         { return mSelItemColor; }
 
         bool isSelected() const
@@ -242,8 +244,8 @@ class DragDrop final
         int mItem;
         int mSelItem;
         int mTag;
-        uint8_t mItemColor;
-        uint8_t mSelItemColor;
+        ItemColor mItemColor;
+        ItemColor mSelItemColor;
 };
 
 extern DragDrop dragDrop;
diff --git a/src/dropshortcut.cpp b/src/dropshortcut.cpp
index 02e831114..96d44311e 100644
--- a/src/dropshortcut.cpp
+++ b/src/dropshortcut.cpp
@@ -58,7 +58,7 @@ void DropShortcut::dropFirst() const
         return;
 
     const int itemId = getItem(0);
-    const unsigned char itemColor = getItemColor(0);
+    const ItemColor itemColor = getItemColor(0);
     if (PlayerInfo::isItemProtected(itemId))
         return;
 
@@ -116,7 +116,7 @@ bool DropShortcut::dropItem(const int cnt)
         return false;
 
     int itemId = 0;
-    unsigned char itemColor = 1;
+    ItemColor itemColor = ItemColor_one;
     while (mLastDropIndex < DROP_SHORTCUT_ITEMS && itemId < 1)
     {
         if (!PlayerInfo::isItemProtected(itemId))
diff --git a/src/enums/simpletypes/intdefines.h b/src/enums/simpletypes/intdefines.h
index 984e9d411..975c63c3f 100644
--- a/src/enums/simpletypes/intdefines.h
+++ b/src/enums/simpletypes/intdefines.h
@@ -29,7 +29,8 @@
     enum class name : type \
     { \
     }; \
-    const name name##_zero = static_cast<name>(0)
+    const name name##_zero = static_cast<name>(0); \
+    const name name##_one = static_cast<name>(1)
 
 #define fromInt(val, name) static_cast<name>(val)
 #define toInt(val, name) static_cast<name>(val)
@@ -39,7 +40,8 @@
 
 #define defIntEnum(name, type) \
     typedef type name; \
-    const name name##_zero = 0
+    const name name##_zero = 0; \
+    const name name##_one = 1
 #define fromInt(val, name) (val)
 #define toInt(val, name) (val)
 #define defIntEnumNeg(name) const name name##_negOne = -1
diff --git a/src/enums/simpletypes/itemcolor.h b/src/enums/simpletypes/itemcolor.h
new file mode 100644
index 000000000..55966596e
--- /dev/null
+++ b/src/enums/simpletypes/itemcolor.h
@@ -0,0 +1,29 @@
+/*
+ *  The ManaPlus Client
+ *  Copyright (C) 2015  The ManaPlus Developers
+ *
+ *  This file is part of The ManaPlus Client.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ENUMS_SIMPLETYPES_ITEMCOLOR_H
+#define ENUMS_SIMPLETYPES_ITEMCOLOR_H
+
+#include "enums/simpletypes/intdefines.h"
+
+defIntEnum(ItemColor, uint16_t);
+defIntEnumNeg(ItemColor);
+
+#endif  // ENUMS_SIMPLETYPES_ITEMCOLOR_H
diff --git a/src/flooritem.cpp b/src/flooritem.cpp
index ea4ae21d3..d846d5f9b 100644
--- a/src/flooritem.cpp
+++ b/src/flooritem.cpp
@@ -47,7 +47,7 @@ FloorItem::FloorItem(const BeingId id,
                      const int itemId,
                      const int x, const int y,
                      const int amount,
-                     const unsigned char color) :
+                     const ItemColor color) :
     ActorSprite(id),
     mItemId(itemId),
     mX(x),
diff --git a/src/flooritem.h b/src/flooritem.h
index 33c95c062..fe0bd26ad 100644
--- a/src/flooritem.h
+++ b/src/flooritem.h
@@ -23,6 +23,8 @@
 #ifndef FLOORITEM_H
 #define FLOORITEM_H
 
+#include "enums/simpletypes/itemcolor.h"
+
 #include "being/actorsprite.h"
 
 #include "resources/cursor.h"
@@ -49,7 +51,7 @@ class FloorItem final : public ActorSprite
                   const int itemId,
                   const int x, const int y,
                   const int amount,
-                  const unsigned char color);
+                  const ItemColor color);
 
         A_DELETE_COPY(FloorItem)
 
@@ -88,7 +90,7 @@ class FloorItem final : public ActorSprite
         unsigned getPickupCount() const A_WARN_UNUSED
         { return mPickupCount; }
 
-        unsigned char getColor() const A_WARN_UNUSED
+        ItemColor getColor() const A_WARN_UNUSED
         { return mColor; }
 
         bool getShowMsg() const A_WARN_UNUSED
@@ -111,7 +113,7 @@ class FloorItem final : public ActorSprite
         int mHeightPosDiff;
         unsigned int mPickupCount;
         Cursor::Cursor mCursor;
-        unsigned char mColor;
+        ItemColor mColor;
         bool mShowMsg;
         bool mHighlight;
 };
diff --git a/src/gui/models/shopitems.cpp b/src/gui/models/shopitems.cpp
index 409ca3f63..05c4a5e6c 100644
--- a/src/gui/models/shopitems.cpp
+++ b/src/gui/models/shopitems.cpp
@@ -53,7 +53,7 @@ std::string ShopItems::getElementAt(int i)
 
 ShopItem *ShopItems::addItem(const int id,
                              const int type,
-                             const unsigned char color,
+                             const ItemColor color,
                              const int amount,
                              const int price)
 {
@@ -65,7 +65,7 @@ ShopItem *ShopItems::addItem(const int id,
 
 ShopItem *ShopItems::addItemNoDup(const int id,
                                   const int type,
-                                  const unsigned char color,
+                                  const ItemColor color,
                                   const int amount,
                                   const int price)
 {
@@ -82,7 +82,7 @@ ShopItem *ShopItems::addItemNoDup(const int id,
 ShopItem *ShopItems::addItem2(const int inventoryIndex,
                               const int id,
                               const int type,
-                              const unsigned char color,
+                              const ItemColor color,
                               const int quantity,
                               const int price)
 {
@@ -155,7 +155,8 @@ void ShopItems::clear()
     mShopItems.clear();
 }
 
-ShopItem *ShopItems::findItem(const int id, const unsigned char color) const
+ShopItem *ShopItems::findItem(const int id,
+                              const ItemColor color) const
 {
     std::vector<ShopItem*>::const_iterator it = mShopItems.begin();
     const std::vector<ShopItem*>::const_iterator e = mShopItems.end();
diff --git a/src/gui/models/shopitems.h b/src/gui/models/shopitems.h
index b222f9385..c964bdfb9 100644
--- a/src/gui/models/shopitems.h
+++ b/src/gui/models/shopitems.h
@@ -23,6 +23,8 @@
 #ifndef GUI_MODELS_SHOPITEMS_H
 #define GUI_MODELS_SHOPITEMS_H
 
+#include "enums/simpletypes/itemcolor.h"
+
 #include "gui/models/listmodel.h"
 
 #include <vector>
@@ -60,7 +62,7 @@ class ShopItems final : public ListModel
          */
         ShopItem *addItem(const int id,
                           const int type,
-                          const unsigned char color,
+                          const ItemColor color,
                           const int amount,
                           const int price);
 
@@ -76,13 +78,13 @@ class ShopItems final : public ListModel
         ShopItem *addItem2(const int inventoryIndex,
                            const int id,
                            const int type,
-                           const unsigned char color,
+                           const ItemColor color,
                            const int amount,
                            const int price);
 
         ShopItem *addItemNoDup(const int id,
                                const int type,
-                               const unsigned char color,
+                               const ItemColor color,
                                const int amount,
                                const int price);
 
@@ -145,7 +147,7 @@ class ShopItems final : public ListModel
          * @return the item found or 0
          */
         ShopItem *findItem(const int id,
-                           const unsigned char color) const A_WARN_UNUSED;
+                           const ItemColor color) const A_WARN_UNUSED;
 
         bool findInAllItems(std::vector<ShopItem*>::iterator &it,
                             const ShopItem *const item);
diff --git a/src/gui/popups/itempopup.cpp b/src/gui/popups/itempopup.cpp
index 33b2eba91..ceb32cdaf 100644
--- a/src/gui/popups/itempopup.cpp
+++ b/src/gui/popups/itempopup.cpp
@@ -58,7 +58,7 @@ ItemPopup::ItemPopup() :
     mIcon(new Icon(this, nullptr)),
     mLastName(),
     mLastId(0),
-    mLastColor(1)
+    mLastColor(ItemColor_one)
 {
     // Item name
     mItemName->setFont(boldFont);
@@ -153,7 +153,7 @@ void ItemPopup::setItem(const Item *const item,
 }
 
 void ItemPopup::setItem(const ItemInfo &item,
-                        const unsigned char color,
+                        const ItemColor color,
                         const bool showImage,
                         int id,
                         const int *const cards)
@@ -336,6 +336,6 @@ void ItemPopup::mouseMoved(MouseEvent &event)
 void ItemPopup::resetPopup()
 {
     mLastName.clear();
-    mLastColor = 1;
+    mLastColor = ItemColor_one;
     mLastId = 0;
 }
diff --git a/src/gui/popups/itempopup.h b/src/gui/popups/itempopup.h
index fb3feefa2..a66262473 100644
--- a/src/gui/popups/itempopup.h
+++ b/src/gui/popups/itempopup.h
@@ -24,6 +24,8 @@
 #ifndef GUI_POPUPS_ITEMPOPUP_H
 #define GUI_POPUPS_ITEMPOPUP_H
 
+#include "enums/simpletypes/itemcolor.h"
+
 #include "gui/widgets/popup.h"
 
 #include "resources/itemtype.h"
@@ -58,7 +60,7 @@ class ItemPopup final : public Popup
          * Sets the info to be displayed given a particular item.
          */
         void setItem(const ItemInfo &item,
-                     const unsigned char color,
+                     const ItemColor color,
                      const bool showImage,
                      int id,
                      const int *const cards);
@@ -82,7 +84,7 @@ class ItemPopup final : public Popup
         Icon *mIcon;
         std::string mLastName;
         int mLastId;
-        unsigned char mLastColor;
+        ItemColor mLastColor;
 
         void setLabelColor(Label *label,
                            const ItemType::Type type) const A_NONNULL(2);
diff --git a/src/gui/popups/popupmenu.cpp b/src/gui/popups/popupmenu.cpp
index 9adcc7b58..71a6d81d5 100644
--- a/src/gui/popups/popupmenu.cpp
+++ b/src/gui/popups/popupmenu.cpp
@@ -105,7 +105,7 @@ PopupMenu::PopupMenu() :
     mFloorItemId(BeingId_zero),
     mItem(nullptr),
     mItemId(0),
-    mItemColor(1),
+    mItemColor(ItemColor_one),
     mMapItem(nullptr),
     mTab(nullptr),
     mSpell(nullptr),
@@ -1558,7 +1558,7 @@ void PopupMenu::handleLink(const std::string &link,
         replaceAll(cmd, "'BEINGID'", toString(toInt(mBeingId, int)));
         replaceAll(cmd, "'FLOORID'", toString(toInt(mFloorItemId, int)));
         replaceAll(cmd, "'ITEMID'", toString(mItemId));
-        replaceAll(cmd, "'ITEMCOLOR'", toString(mItemColor));
+        replaceAll(cmd, "'ITEMCOLOR'", toString(toInt(mItemColor, int)));
         replaceAll(cmd, "'BEINGTYPEID'", toString(static_cast<int>(mType)));
         replaceAll(cmd, "'PLAYER'", localPlayer->getName());
         if (mItem)
@@ -1594,7 +1594,7 @@ void PopupMenu::handleLink(const std::string &link,
     mFloorItemId = BeingId_zero;
     mItem = nullptr;
     mItemId = 0;
-    mItemColor = 1;
+    mItemColor = ItemColor_one;
     mMapItem = nullptr;
     mTab = nullptr;
     mSpell = nullptr;
@@ -1751,8 +1751,9 @@ void PopupMenu::showPopup(Window *const parent,
     showPopup(x, y);
 }
 
-void PopupMenu::showItemPopup(const int x, const int y, const int itemId,
-                              const unsigned char color)
+void PopupMenu::showItemPopup(const int x, const int y,
+                              const int itemId,
+                              const ItemColor color)
 {
     const Inventory *const inv = PlayerInfo::getInventory();
     if (!inv)
@@ -1788,7 +1789,8 @@ void PopupMenu::showItemPopup(const int x, const int y, const int itemId,
     }
 }
 
-void PopupMenu::showItemPopup(const int x, const int y, Item *const item)
+void PopupMenu::showItemPopup(const int x, const int y,
+                              Item *const item)
 {
     mItem = item;
     mX = x;
@@ -1801,7 +1803,7 @@ void PopupMenu::showItemPopup(const int x, const int y, Item *const item)
     else
     {
         mItemId = 0;
-        mItemColor = 1;
+        mItemColor = ItemColor_one;
     }
     mNick.clear();
     mBrowserBox->clearRows();
@@ -2103,7 +2105,8 @@ void PopupMenu::showPickupItemPopup(const int x, const int y,
 }
 
 void PopupMenu::showUndressPopup(const int x, const int y,
-                                 const Being *const being, Item *const item)
+                                 const Being *const being,
+                                 Item *const item)
 {
     if (!being || !item)
         return;
diff --git a/src/gui/popups/popupmenu.h b/src/gui/popups/popupmenu.h
index 727818317..3952178f2 100644
--- a/src/gui/popups/popupmenu.h
+++ b/src/gui/popups/popupmenu.h
@@ -28,6 +28,7 @@
 #include "enums/inventorytype.h"
 
 #include "enums/simpletypes/beingid.h"
+#include "enums/simpletypes/itemcolor.h"
 
 #include "gui/widgets/linkhandler.h"
 #include "gui/widgets/popup.h"
@@ -105,8 +106,9 @@ class PopupMenu final : public Popup, public LinkHandler
 
         void showItemPopup(const int x, const int y, Item *const item);
 
-        void showItemPopup(const int x, const int y, const int itemId,
-                           const unsigned char color);
+        void showItemPopup(const int x, const int y,
+                           const int itemId,
+                           const ItemColor color);
 
         void showDropPopup(const int x, const int y, Item *const item);
 
@@ -208,7 +210,7 @@ class PopupMenu final : public Popup, public LinkHandler
         BeingId mFloorItemId;
         Item *mItem;
         int mItemId;
-        unsigned char mItemColor;
+        ItemColor mItemColor;
         MapItem *mMapItem;
         ChatTab *mTab;
         TextCommand *mSpell;
diff --git a/src/gui/widgets/itemlinkhandler.cpp b/src/gui/widgets/itemlinkhandler.cpp
index 5a11103d9..388f563bd 100644
--- a/src/gui/widgets/itemlinkhandler.cpp
+++ b/src/gui/widgets/itemlinkhandler.cpp
@@ -111,9 +111,9 @@ void ItemLinkHandler::handleLink(const std::string &link, MouseEvent *event)
         splitToIntVector(str, link, ',');
         if (str.empty())
             return;
-        unsigned char color = 1;
+        ItemColor color = ItemColor_one;
         if (str.size() > 1)
-            color = static_cast<unsigned char>(str[1]);
+            color = fromInt(str[1], ItemColor);
         const int id = str[0];
         if (id > 0)
         {
diff --git a/src/gui/widgets/itemshortcutcontainer.cpp b/src/gui/widgets/itemshortcutcontainer.cpp
index 689d967c8..21fe944ac 100644
--- a/src/gui/widgets/itemshortcutcontainer.cpp
+++ b/src/gui/widgets/itemshortcutcontainer.cpp
@@ -124,7 +124,7 @@ void ItemShortcutContainer::draw(Graphics *graphics)
             itemX + 2, itemY + 2);
 
         const int itemId = selShortcut->getItem(i);
-        const unsigned char itemColor = selShortcut->getItemColor(i);
+        const ItemColor itemColor = selShortcut->getItemColor(i);
 
         if (itemId < 0)
             continue;
@@ -261,7 +261,7 @@ void ItemShortcutContainer::safeDraw(Graphics *graphics)
             itemX + 2, itemY + 2);
 
         const int itemId = selShortcut->getItem(i);
-        const unsigned char itemColor = selShortcut->getItemColor(i);
+        const ItemColor itemColor = selShortcut->getItemColor(i);
 
         if (itemId < 0)
             continue;
@@ -372,7 +372,7 @@ void ItemShortcutContainer::mouseDragged(MouseEvent &event)
                 return;
 
             const int itemId = selShortcut->getItem(index);
-            const unsigned char itemColor = selShortcut->getItemColor(index);
+            const ItemColor itemColor = selShortcut->getItemColor(index);
 
             if (itemId < 0)
                 return;
@@ -540,7 +540,7 @@ void ItemShortcutContainer::mouseMoved(MouseEvent &event)
         return;
 
     const int itemId = selShortcut->getItem(index);
-    const unsigned char itemColor = selShortcut->getItemColor(index);
+    const ItemColor itemColor = selShortcut->getItemColor(index);
 
     if (itemId < 0)
         return;
diff --git a/src/gui/widgets/selldialog.cpp b/src/gui/widgets/selldialog.cpp
index 6498c25b6..827d1c3ea 100644
--- a/src/gui/widgets/selldialog.cpp
+++ b/src/gui/widgets/selldialog.cpp
@@ -197,7 +197,7 @@ void SellDialog::addItem(const Item *const item, const int price)
 
 void SellDialog::addItem(const int id,
                          const int type,
-                         const unsigned char color,
+                         const ItemColor color,
                          const int amount,
                          const int price)
 {
diff --git a/src/gui/widgets/selldialog.h b/src/gui/widgets/selldialog.h
index dcc92cfd2..b5e91f67d 100644
--- a/src/gui/widgets/selldialog.h
+++ b/src/gui/widgets/selldialog.h
@@ -23,6 +23,8 @@
 #ifndef GUI_WIDGETS_SELLDIALOG_H
 #define GUI_WIDGETS_SELLDIALOG_H
 
+#include "enums/simpletypes/itemcolor.h"
+
 #include "gui/widgets/window.h"
 
 #include "listeners/actionlistener.h"
@@ -92,7 +94,7 @@ class SellDialog notfinal : public Window,
 
         void addItem(const int id,
                      const int type,
-                     const unsigned char color,
+                     const ItemColor color,
                      const int amount,
                      const int price);
 
diff --git a/src/gui/widgets/virtshortcutcontainer.cpp b/src/gui/widgets/virtshortcutcontainer.cpp
index 3c28f244f..4066a915c 100644
--- a/src/gui/widgets/virtshortcutcontainer.cpp
+++ b/src/gui/widgets/virtshortcutcontainer.cpp
@@ -233,7 +233,7 @@ void VirtShortcutContainer::mouseDragged(MouseEvent &event)
                 return;
 
             const int itemId = mShortcut->getItem(index);
-            const unsigned char itemColor = mShortcut->getItemColor(index);
+            const ItemColor itemColor = mShortcut->getItemColor(index);
 
             if (itemId < 0)
                 return;
@@ -347,7 +347,7 @@ void VirtShortcutContainer::mouseMoved(MouseEvent &event)
         return;
 
     const int itemId = mShortcut->getItem(index);
-    const unsigned char itemColor = mShortcut->getItemColor(index);
+    const ItemColor itemColor = mShortcut->getItemColor(index);
 
     if (itemId < 0)
         return;
diff --git a/src/gui/windows/buydialog.cpp b/src/gui/windows/buydialog.cpp
index 84a7a1182..667867ff4 100644
--- a/src/gui/windows/buydialog.cpp
+++ b/src/gui/windows/buydialog.cpp
@@ -363,7 +363,7 @@ void BuyDialog::reset()
 
 ShopItem *BuyDialog::addItem(const int id,
                              const int type,
-                             const unsigned char color,
+                             const ItemColor color,
                              const int amount,
                              const int price)
 {
@@ -493,7 +493,8 @@ void BuyDialog::action(const ActionEvent &event)
         if (mNpcId == fromInt(Items, BeingId))
         {
             adminHandler->createItems(item->getId(),
-                mAmountItems, item->getColor());
+                item->getColor(),
+                mAmountItems);
         }
         else if (mNpcId != fromInt(Nick, BeingId))
         {
diff --git a/src/gui/windows/buydialog.h b/src/gui/windows/buydialog.h
index 7aaa1e7c5..104b5c4ee 100644
--- a/src/gui/windows/buydialog.h
+++ b/src/gui/windows/buydialog.h
@@ -24,6 +24,7 @@
 #define GUI_WINDOWS_BUYDIALOG_H
 
 #include "enums/simpletypes/beingid.h"
+#include "enums/simpletypes/itemcolor.h"
 
 #include "gui/widgets/window.h"
 
@@ -105,7 +106,7 @@ class BuyDialog final : public Window,
          */
         ShopItem *addItem(const int id,
                           const int type,
-                          const unsigned char color,
+                          const ItemColor color,
                           const int amount,
                           const int price);
 
diff --git a/src/gui/windows/buyingstoreselldialog.cpp b/src/gui/windows/buyingstoreselldialog.cpp
index 55b6a96fb..637bdc5bd 100644
--- a/src/gui/windows/buyingstoreselldialog.cpp
+++ b/src/gui/windows/buyingstoreselldialog.cpp
@@ -58,7 +58,7 @@ void BuyingStoreSellDialog::sellAction(const ActionEvent &event A_UNUSED)
         return;
     // +++ need add colors
     Item *const item2 = PlayerInfo::getInventory()->findItem(
-        item1->getId(), 1);
+        item1->getId(), ItemColor_one);
     if (!item2)
         return;
 
diff --git a/src/gui/windows/charcreatedialog.cpp b/src/gui/windows/charcreatedialog.cpp
index 2168ad0a1..6af4a6437 100644
--- a/src/gui/windows/charcreatedialog.cpp
+++ b/src/gui/windows/charcreatedialog.cpp
@@ -624,11 +624,13 @@ void CharCreateDialog::updateHair()
     {
         mHairColor = minHairColor;
     }
-    mHairColorNameLabel->setCaption(ColorDB::getHairColorName(mHairColor));
+    mHairColorNameLabel->setCaption(ColorDB::getHairColorName(
+        fromInt(mHairColor, ItemColor)));
     mHairColorNameLabel->resizeTo(150, 150);
 
     mPlayer->setSprite(charServerHandler->hairSprite(),
-        mHairStyle * -1, item.getDyeColorsString(mHairColor));
+        mHairStyle * -1,
+        item.getDyeColorsString(fromInt(mHairColor, ItemColor)));
 }
 
 void CharCreateDialog::updateRace()
@@ -667,7 +669,8 @@ void CharCreateDialog::updateLook()
     }
     if (mLookNameLabel)
     {
-        mLookNameLabel->setCaption(item.getColorName(mLook));
+        mLookNameLabel->setCaption(item.getColorName(
+            fromInt(mLook, ItemColor)));
         mLookNameLabel->resizeTo(150, 150);
     }
 }
diff --git a/src/gui/windows/itemamountwindow.cpp b/src/gui/windows/itemamountwindow.cpp
index b1c10f058..a48a6dab2 100644
--- a/src/gui/windows/itemamountwindow.cpp
+++ b/src/gui/windows/itemamountwindow.cpp
@@ -355,7 +355,8 @@ void ItemAmountWindow::action(const ActionEvent &event)
         const int id = ItemDB::get(mItemsModal->getElementAt(
             mItemDropDown->getSelected())).getId();
 
-        mItem = new Item(id, 0, 10000, 0, 1,
+        mItem = new Item(id, 0, 10000, 0,
+            ItemColor_one,
             Identified_true,
             Damaged_true,
             Favorite_false,
diff --git a/src/gui/windows/maileditwindow.cpp b/src/gui/windows/maileditwindow.cpp
index 1699b979c..51495563d 100644
--- a/src/gui/windows/maileditwindow.cpp
+++ b/src/gui/windows/maileditwindow.cpp
@@ -138,7 +138,8 @@ void MailEditWindow::action(const ActionEvent &event)
             const Inventory *const inv = PlayerInfo::getInventory();
             if (inv)
             {
-                const Item *const item = inv->findItem(tempItem->getId(), 1);
+                const Item *const item = inv->findItem(
+                    tempItem->getId(), ItemColor_one);
                 if (item)
                 {
                     mailHandler->setAttach(item->getInvIndex(),
diff --git a/src/gui/windows/mailviewwindow.cpp b/src/gui/windows/mailviewwindow.cpp
index 544c80f0d..ad7eb8a88 100644
--- a/src/gui/windows/mailviewwindow.cpp
+++ b/src/gui/windows/mailviewwindow.cpp
@@ -111,7 +111,8 @@ MailViewWindow::MailViewWindow(const MailMessage *const message) :
         const ItemInfo &item = ItemDB::get(message->itemId);
         Image *const image = resman->getImage(combineDye2(
             paths.getStringValue("itemIcons").append(
-            item.getDisplay().image), item.getDyeColorsString(1)));
+            item.getDisplay().image),
+            item.getDyeColorsString(ItemColor_one)));
 
         mIcon = new Icon(this, image);
         if (message->itemAmount != 1)
diff --git a/src/gui/windows/npcdialog.cpp b/src/gui/windows/npcdialog.cpp
index 10eb3dc8a..c0396bc06 100644
--- a/src/gui/windows/npcdialog.cpp
+++ b/src/gui/windows/npcdialog.cpp
@@ -369,7 +369,7 @@ void NpcDialog::action(const ActionEvent &event)
                         if (item)
                         {
                             str = strprintf("%d,%d", item->getId(),
-                                item->getColor());
+                                toInt(item->getColor(), int));
                         }
                         else
                         {
@@ -382,7 +382,7 @@ void NpcDialog::action(const ActionEvent &event)
                             if (item)
                             {
                                 str.append(strprintf("%d,%d", item->getId(),
-                                    item->getColor()));
+                                    toInt(item->getColor(), int)));
                             }
                             else
                             {
diff --git a/src/gui/windows/outfitwindow.cpp b/src/gui/windows/outfitwindow.cpp
index a0a7fa7c2..7ce43333b 100644
--- a/src/gui/windows/outfitwindow.cpp
+++ b/src/gui/windows/outfitwindow.cpp
@@ -172,7 +172,7 @@ void OutfitWindow::load(const bool oldConfig)
         for (size_t i = 0, sz = tokens2.size();
              i < sz && i < OUTFIT_ITEM_COUNT; i++)
         {
-            mItemColors[o][i] = tokens2[i];
+            mItemColors[o][i] = fromInt(tokens2[i], ItemColor);
         }
 
         mItemsUnequip[o] = cfg->getValueBool("OutfitUnequip" + toString(o),
@@ -203,7 +203,7 @@ void OutfitWindow::save() const
             if (i < OUTFIT_ITEM_COUNT - 1)
                 outfitStr.append(" ");
             outfitColorsStr.append(toString(static_cast<int>(
-                mItemColors[o][i])));
+                toInt(mItemColors[o][i], int))));
             if (i < OUTFIT_ITEM_COUNT - 1)
                 outfitColorsStr.append(" ");
         }
@@ -278,7 +278,8 @@ void OutfitWindow::wearOutfit(const int outfit, const bool unwearEmpty,
     for (unsigned i = 0; i < OUTFIT_ITEM_COUNT; i++)
     {
         const Item *const item = PlayerInfo::getInventory()->findItem(
-            mItems[outfit][i], mItemColors[outfit][i]);
+            mItems[outfit][i],
+            mItemColors[outfit][i]);
         if (item
             && item->isEquipped() == Equipped_false
             && item->getQuantity())
@@ -453,7 +454,7 @@ void OutfitWindow::mouseDragged(MouseEvent &event)
                 return;
             }
             const int itemId = mItems[mCurrentOutfit][index];
-            const unsigned char itemColor = mItemColors[mCurrentOutfit][index];
+            const ItemColor itemColor = mItemColors[mCurrentOutfit][index];
             if (itemId < 0)
             {
                 Window::mouseDragged(event);
@@ -719,7 +720,7 @@ void OutfitWindow::clearCurrentOutfit()
     for (unsigned f = 0; f < OUTFIT_ITEM_COUNT; f++)
     {
         mItems[mCurrentOutfit][f] = -1;
-        mItemColors[mCurrentOutfit][f] = 1;
+        mItemColors[mCurrentOutfit][f] = ItemColor_one;
     }
     save();
 }
diff --git a/src/gui/windows/outfitwindow.h b/src/gui/windows/outfitwindow.h
index 7033a3f13..27a3d73aa 100644
--- a/src/gui/windows/outfitwindow.h
+++ b/src/gui/windows/outfitwindow.h
@@ -23,6 +23,8 @@
 #ifndef GUI_WINDOWS_OUTFITWINDOW_H
 #define GUI_WINDOWS_OUTFITWINDOW_H
 
+#include "enums/simpletypes/itemcolor.h"
+
 #include "gui/widgets/window.h"
 
 #include "listeners/actionlistener.h"
@@ -119,7 +121,7 @@ class OutfitWindow final : public Window,
         int mItems[OUTFITS_COUNT + 1][OUTFIT_ITEM_COUNT];
         int mAwayOutfit;
 
-        unsigned char mItemColors[OUTFITS_COUNT + 1][OUTFIT_ITEM_COUNT];
+        ItemColor mItemColors[OUTFITS_COUNT + 1][OUTFIT_ITEM_COUNT];
         bool mItemClicked;
         bool mItemsUnequip[OUTFITS_COUNT];
 };
diff --git a/src/gui/windows/shopwindow.cpp b/src/gui/windows/shopwindow.cpp
index b8e31ead8..c5014f902 100644
--- a/src/gui/windows/shopwindow.cpp
+++ b/src/gui/windows/shopwindow.cpp
@@ -348,7 +348,8 @@ void ShopWindow::action(const ActionEvent &event)
                     if (!item)
                         continue;
                     // +++ need add colors
-                    Item *const cartItem = inv->findItem(item->getId(), 1);
+                    Item *const cartItem = inv->findItem(item->getId(),
+                        ItemColor_one);
                     if (!cartItem)
                         continue;
                     item->setInvIndex(cartItem->getInvIndex());
@@ -391,7 +392,7 @@ void ShopWindow::action(const ActionEvent &event)
         return;
 
     // +++ need support for colors
-    Item *const item = inv->findItem(mSelectedItem, 0);
+    Item *const item = inv->findItem(mSelectedItem, ItemColor_zero);
     if (item)
     {
         if (eventId == "add")
@@ -551,12 +552,12 @@ void ShopWindow::loadList()
                     if (tokens[1] && tokens[2] && mBuyShopItems)
                     {
                         mBuyShopItems->addItem(
-                            tokens[0], 0, 1, tokens[1], tokens[2]);
+                            tokens[0], 0, ItemColor_one, tokens[1], tokens[2]);
                     }
                     if (tokens[3] && tokens[4] && mSellShopItems)
                     {
                         mSellShopItems->addItem(
-                            tokens[0], 0, 1, tokens[3], tokens[4]);
+                            tokens[0], 0, ItemColor_one, tokens[3], tokens[4]);
                     }
                 }
             }
@@ -748,7 +749,8 @@ void ShopWindow::giveList(const std::string &nick, const int mode)
         if (mode == SELL)
         {
             // +++ need support for colors
-            const Item *const item2 = inv->findItem(item->getId(), 0);
+            const Item *const item2 = inv->findItem(item->getId(),
+                ItemColor_zero);
             if (item2)
             {
                 int amount = item->getQuantity();
@@ -844,19 +846,19 @@ void ShopWindow::showList(const std::string &nick, std::string data)
         int amount = decodeStr(data.substr(f + 6, 3));
         // +++ need impliment colors?
         if (buyDialog && amount > 0)
-            buyDialog->addItem(id, 0, 1, amount, price);
+            buyDialog->addItem(id, 0, ItemColor_one, amount, price);
         if (sellDialog)
         {
             // +++ need support for colors
-            const Item *const item = inv->findItem(id, 0);
+            const Item *const item = inv->findItem(id, ItemColor_zero);
             if (item)
             {
                 if (item->getQuantity() < amount)
                     amount = item->getQuantity();
                 if (amount > 0)
-                    sellDialog->addItem(id, 0, 1, amount, price);
+                    sellDialog->addItem(id, 0, ItemColor_one, amount, price);
                 else
-                    sellDialog->addItem(id, 0, 1, -1, price);
+                    sellDialog->addItem(id, 0, ItemColor_one, -1, price);
             }
         }
     }
@@ -919,12 +921,13 @@ void ShopWindow::processRequest(const std::string &nick, std::string data,
 
     delete mTradeItem;
     // +++ need impliment colors?
-    mTradeItem = new ShopItem(-1, id, 0, 1, amount, price);
+    mTradeItem = new ShopItem(-1, id, 0, ItemColor_one, amount, price);
 
     if (mode == BUY)
     {
         // +++ need support for colors
-        const Item *const item2 = inv->findItem(mTradeItem->getId(), 0);
+        const Item *const item2 = inv->findItem(mTradeItem->getId(),
+            ItemColor_zero);
         if (!item2 || item2->getQuantity() < amount
             || !findShopItem(mTradeItem, SELL))
         {
diff --git a/src/gui/windows/tradewindow.cpp b/src/gui/windows/tradewindow.cpp
index bf4963daf..7a835b686 100644
--- a/src/gui/windows/tradewindow.cpp
+++ b/src/gui/windows/tradewindow.cpp
@@ -196,7 +196,7 @@ void TradeWindow::addItem(const int id,
                           const bool own,
                           const int quantity,
                           const uint8_t refine,
-                          const unsigned char color,
+                          const ItemColor color,
                           const Identified identified,
                           const Damaged damaged,
                           const Favorite favorite) const
@@ -221,7 +221,7 @@ void TradeWindow::addItem2(const int id,
                            const bool own,
                            const int quantity,
                            const uint8_t refine,
-                           const unsigned char color,
+                           const ItemColor color,
                            const Identified identified,
                            const Damaged damaged,
                            const Favorite favorite,
diff --git a/src/gui/windows/tradewindow.h b/src/gui/windows/tradewindow.h
index a191671d5..b1ac84045 100644
--- a/src/gui/windows/tradewindow.h
+++ b/src/gui/windows/tradewindow.h
@@ -29,6 +29,7 @@
 #include "enums/simpletypes/equipm.h"
 #include "enums/simpletypes/favorite.h"
 #include "enums/simpletypes/identified.h"
+#include "enums/simpletypes/itemcolor.h"
 
 #include "listeners/actionlistener.h"
 #include "listeners/selectionlistener.h"
@@ -75,7 +76,7 @@ class TradeWindow final : public Window,
                      const bool own,
                      const int quantity,
                      const uint8_t refine,
-                     const unsigned char color,
+                     const ItemColor color,
                      const Identified identified,
                      const Damaged damaged,
                      const Favorite favorite) const;
@@ -95,7 +96,7 @@ class TradeWindow final : public Window,
                       const bool own,
                       const int quantity,
                       const uint8_t refine,
-                      const unsigned char color,
+                      const ItemColor color,
                       const Identified identified,
                       const Damaged damaged,
                       const Favorite favorite,
diff --git a/src/inventory.cpp b/src/inventory.cpp
index 8b396e1d5..c83ea5353 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -83,15 +83,18 @@ Item *Inventory::getItem(const int index) const
     return mItems[index];
 }
 
-Item *Inventory::findItem(const int itemId, const unsigned char color) const
+Item *Inventory::findItem(const int itemId,
+                          const ItemColor color) const
 {
     for (unsigned i = 0; i < mSize; i++)
     {
         Item *const item = mItems[i];
         if (item && item->mId == itemId)
         {
-            if (color == 0 || item->mColor == color
-                || (color == 1 && item->mColor <= 1))
+            if (color == ItemColor_zero ||
+                item->mColor == color ||
+                (color == ItemColor_one &&
+                item->mColor <= ItemColor_one))
             {
                 return item;
             }
@@ -105,7 +108,7 @@ int Inventory::addItem(const int id,
                        const int type,
                        const int quantity,
                        const uint8_t refine,
-                       const uint8_t color,
+                       const ItemColor color,
                        const Identified identified,
                        const Damaged damaged,
                        const Favorite favorite,
@@ -123,7 +126,7 @@ void Inventory::setItem(const int index,
                         const int type,
                         const int quantity,
                         const uint8_t refine,
-                        const unsigned char color,
+                        const ItemColor color,
                         const Identified identified,
                         const Damaged damaged,
                         const Favorite favorite,
diff --git a/src/inventory.h b/src/inventory.h
index 588842d70..5fe92a84f 100644
--- a/src/inventory.h
+++ b/src/inventory.h
@@ -31,6 +31,7 @@
 #include "enums/simpletypes/equipped.h"
 #include "enums/simpletypes/favorite.h"
 #include "enums/simpletypes/identified.h"
+#include "enums/simpletypes/itemcolor.h"
 
 #include "enums/being/gender.h"
 
@@ -81,7 +82,7 @@ class Inventory final
          * @return Item found on success, NULL on failure.
          */
         Item *findItem(const int itemId,
-                       const unsigned char color) const A_WARN_UNUSED;
+                       const ItemColor color) const A_WARN_UNUSED;
 
         /**
          * Adds a new item in a free slot.
@@ -90,7 +91,7 @@ class Inventory final
                     const int type,
                     const int quantity,
                     const uint8_t refine,
-                    const unsigned char color,
+                    const ItemColor color,
                     const Identified identified,
                     const Damaged damaged,
                     const Favorite favorite,
@@ -105,7 +106,7 @@ class Inventory final
                      const int type,
                      const int quantity,
                      const uint8_t refine,
-                     const unsigned char color,
+                     const ItemColor color,
                      const Identified identified,
                      const Damaged damaged,
                      const Favorite favorite,
diff --git a/src/item.cpp b/src/item.cpp
index 7fa816c86..0ccfd025a 100644
--- a/src/item.cpp
+++ b/src/item.cpp
@@ -40,14 +40,14 @@ Item::Item(const int id,
            const int type,
            const int quantity,
            const uint8_t refine,
-           const unsigned char color,
+           const ItemColor color,
            const Identified identified,
            const Damaged damaged,
            const Favorite favorite,
            const Equipm equipment,
            const Equipped equipped) :
     mId(0),
-    mColor(0),
+    mColor(ItemColor_zero),
     mQuantity(quantity),
     mImage(nullptr),
     mDescription(),
@@ -78,7 +78,8 @@ Item::~Item()
     dragDrop.clearItem(this);
 }
 
-void Item::setId(const int id, const unsigned char color)
+void Item::setId(const int id,
+                 const ItemColor color)
 {
     mId = id;
     mColor = color;
@@ -114,7 +115,8 @@ bool Item::isHaveTag(const int tagId) const
     return (*it).second > 0;
 }
 
-Image *Item::getImage(const int id, const unsigned char color)
+Image *Item::getImage(const int id,
+                      const ItemColor color)
 {
     ResourceManager *const resman = ResourceManager::getInstance();
     const ItemInfo &info = ItemDB::get(id);
diff --git a/src/item.h b/src/item.h
index 815160c32..c3b22a9dc 100644
--- a/src/item.h
+++ b/src/item.h
@@ -28,6 +28,7 @@
 #include "enums/simpletypes/equipped.h"
 #include "enums/simpletypes/favorite.h"
 #include "enums/simpletypes/identified.h"
+#include "enums/simpletypes/itemcolor.h"
 
 #include "resources/db/itemdb.h"
 
@@ -50,7 +51,7 @@ class Item notfinal
              const int type,
              const int quantity,
              const uint8_t refine,
-             const uint8_t color,
+             const ItemColor color,
              const Identified identified,
              const Damaged damaged,
              const Favorite favorite,
@@ -67,7 +68,7 @@ class Item notfinal
         /**
          * Sets the item id, color the item type.
          */
-        void setId(const int id, const unsigned char color);
+        void setId(const int id, const ItemColor color);
 
         /**
          * Returns the item id.
@@ -168,11 +169,11 @@ class Item notfinal
         std::string getName() const A_WARN_UNUSED;
 
         static Image *getImage(const int id,
-                               const unsigned char color) A_WARN_UNUSED;
+                               const ItemColor color) A_WARN_UNUSED;
 
         bool isHaveTag(const int tagId) const A_WARN_UNUSED;
 
-        unsigned char getColor() const A_WARN_UNUSED
+        ItemColor getColor() const A_WARN_UNUSED
         { return mColor; }
 
         const std::string &getDescription() const A_WARN_UNUSED
@@ -214,7 +215,7 @@ class Item notfinal
         void addCard(const int card);
 
         int mId;              /**< Item type id. */
-        unsigned char mColor;
+        ItemColor mColor;
         int mQuantity;        /**< Number of items. */
 
     protected:
diff --git a/src/itemshortcut.cpp b/src/itemshortcut.cpp
index 05035c5d0..b9696a2a2 100644
--- a/src/itemshortcut.cpp
+++ b/src/itemshortcut.cpp
@@ -39,7 +39,7 @@ ItemShortcut *itemShortcut[SHORTCUT_TABS];
 
 ItemShortcut::ItemShortcut(const int number) :
     mItemSelected(-1),
-    mItemColorSelected(1),
+    mItemColorSelected(ItemColor_one),
     mNumber(number)
 {
     load();
@@ -74,8 +74,9 @@ void ItemShortcut::load(const bool oldConfig)
     for (unsigned int i = 0; i < SHORTCUT_ITEMS; i++)
     {
         const int itemId = cfg->getValue(name + toString(i), -1);
-        const unsigned char itemColor = static_cast<const unsigned char>(
-            cfg->getValue(color + toString(i), 1));
+        const ItemColor itemColor = fromInt(
+            cfg->getValue(color + toString(i), 1),
+            ItemColor);
 
         mItems[i] = itemId;
         mItemColors[i] = itemColor;
@@ -103,7 +104,8 @@ void ItemShortcut::save() const
     for (unsigned int i = 0; i < SHORTCUT_ITEMS; i++)
     {
         const int itemId = mItems[i] ? mItems[i] : -1;
-        const int itemColor = mItemColors[i] ? mItemColors[i] : 1;
+        const int itemColor = (mItemColors[i] != ItemColor_zero) ?
+            toInt(mItemColors[i], int) : 1;
         if (itemId != -1)
         {
             serverConfig.setValue(name + toString(i), itemId);
@@ -124,7 +126,7 @@ void ItemShortcut::useItem(const int index) const
         return;
 
     const int itemId = mItems[index];
-    const unsigned char itemColor = mItemColors[index];
+    const ItemColor itemColor = mItemColors[index];
     if (itemId >= 0)
     {
         if (itemId < SPELL_MIN_ID)
@@ -195,7 +197,7 @@ void ItemShortcut::setItemSelected(const Item *const item)
     else
     {
         mItemSelected = -1;
-        mItemColorSelected = 1;
+        mItemColorSelected = ItemColor_one;
     }
 }
 
@@ -206,8 +208,9 @@ void ItemShortcut::setItem(const int index)
     save();
 }
 
-void ItemShortcut::setItem(const int index, const int item,
-                           const unsigned char color)
+void ItemShortcut::setItem(const int index,
+                           const int item,
+                           const ItemColor color)
 {
     mItems[index] = item;
     mItemColors[index] = color;
@@ -226,7 +229,7 @@ void ItemShortcut::swap(const int index1, const int index2)
     const int tmpItem = mItems[index1];
     mItems[index1] = mItems[index2];
     mItems[index2] = tmpItem;
-    const unsigned char tmpColor = mItemColors[index1];
+    const ItemColor tmpColor = mItemColors[index1];
     mItemColors[index1] = mItemColors[index2];
     mItemColors[index2] = tmpColor;
     save();
diff --git a/src/itemshortcut.h b/src/itemshortcut.h
index 30549f0b8..7dd093abd 100644
--- a/src/itemshortcut.h
+++ b/src/itemshortcut.h
@@ -23,6 +23,8 @@
 #ifndef ITEMSHORTCUT_H
 #define ITEMSHORTCUT_H
 
+#include "enums/simpletypes/itemcolor.h"
+
 #include "localconsts.h"
 
 const unsigned int SHORTCUT_ITEMS = 20;
@@ -66,7 +68,7 @@ class ItemShortcut final
         int getItem(const int index) const A_WARN_UNUSED
         { return mItems[index]; }
 
-        unsigned char getItemColor(const int index) const A_WARN_UNUSED
+        ItemColor getItemColor(const int index) const A_WARN_UNUSED
         { return mItemColors[index]; }
 
         /**
@@ -88,8 +90,9 @@ class ItemShortcut final
          */
         void setItem(const int index);
 
-        void setItem(const int index, const int item,
-                     const unsigned char color);
+        void setItem(const int index,
+                     const int item,
+                     const ItemColor color);
 
         /**
          * Adds an item to the items store specified by the index.
@@ -97,8 +100,9 @@ class ItemShortcut final
          * @param index Index of the item.
          * @param itemId ID of the item.
          */
-        void setItems(const int index, const int itemId,
-                      const unsigned char color)
+        void setItems(const int index,
+                      const int itemId,
+                      const ItemColor color)
         { mItems[index] = itemId; mItemColors[index] = color; save(); }
 
         /**
@@ -149,10 +153,10 @@ class ItemShortcut final
         void swap(const int index1, const int index2);
 
     private:
-        int mItems[SHORTCUT_ITEMS];                /**< The items. */
-        unsigned char mItemColors[SHORTCUT_ITEMS]; /**< The item colors. */
+        int mItems[SHORTCUT_ITEMS];             /**< The items. */
+        ItemColor mItemColors[SHORTCUT_ITEMS];  /**< The item colors. */
         int mItemSelected;
-        unsigned char mItemColorSelected;
+        ItemColor mItemColorSelected;
         int mNumber;
 };
 
diff --git a/src/net/adminhandler.h b/src/net/adminhandler.h
index 77f0508a8..328290ea8 100644
--- a/src/net/adminhandler.h
+++ b/src/net/adminhandler.h
@@ -24,6 +24,7 @@
 #define NET_ADMINHANDLER_H
 
 #include "enums/simpletypes/beingid.h"
+#include "enums/simpletypes/itemcolor.h"
 
 #include <string>
 
@@ -69,7 +70,8 @@ class AdminHandler notfinal
         virtual void warp(const std::string &map,
                           const int x, const int y) const = 0;
 
-        virtual void createItems(const int id, const int color,
+        virtual void createItems(const int id,
+                                 const ItemColor color,
                                  const int amount) const = 0;
 
         virtual void gotoName(const std::string &name) const = 0;
diff --git a/src/net/cashshophandler.h b/src/net/cashshophandler.h
index 64a04d8ed..1577aa543 100644
--- a/src/net/cashshophandler.h
+++ b/src/net/cashshophandler.h
@@ -23,6 +23,8 @@
 
 #ifdef EATHENA_SUPPORT
 
+#include "enums/simpletypes/itemcolor.h"
+
 #include <string>
 
 #include "localconsts.h"
@@ -38,7 +40,7 @@ class CashShopHandler notfinal
 
         virtual void buyItem(const int points,
                              const int itemId,
-                             const unsigned char color,
+                             const ItemColor color,
                              const int amount) const = 0;
 
         virtual void close() const = 0;
diff --git a/src/net/ea/adminhandler.cpp b/src/net/ea/adminhandler.cpp
index bf4bd590c..2cc98acb0 100644
--- a/src/net/ea/adminhandler.cpp
+++ b/src/net/ea/adminhandler.cpp
@@ -74,7 +74,8 @@ void AdminHandler::ipcheckName(const std::string &name) const
     chatHandler->talk("@ipcheck " + name, GENERAL_CHANNEL);
 }
 
-void AdminHandler::createItems(const int id, const int color,
+void AdminHandler::createItems(const int id,
+                               const ItemColor color,
                                const int amount) const
 {
     if (!serverFeatures->haveItemColors())
@@ -85,7 +86,7 @@ void AdminHandler::createItems(const int id, const int color,
     else
     {
         chatHandler->talk(strprintf("@item %d %d %d",
-            id, color, amount), GENERAL_CHANNEL);
+            id, toInt(color, int), amount), GENERAL_CHANNEL);
     }
 }
 
diff --git a/src/net/ea/adminhandler.h b/src/net/ea/adminhandler.h
index acabd288a..ab7b8c557 100644
--- a/src/net/ea/adminhandler.h
+++ b/src/net/ea/adminhandler.h
@@ -60,7 +60,8 @@ class AdminHandler notfinal : public Net::AdminHandler
 
         void ipcheckName(const std::string &name) const override final;
 
-        void createItems(const int id, const int color,
+        void createItems(const int id,
+                         const ItemColor color,
                          const int amount) const override final;
 
     protected:
diff --git a/src/net/ea/beinghandler.cpp b/src/net/ea/beinghandler.cpp
index 76fe061ed..2c2c65652 100644
--- a/src/net/ea/beinghandler.cpp
+++ b/src/net/ea/beinghandler.cpp
@@ -76,7 +76,7 @@ Being *BeingHandler::createBeing(const BeingId id,
 
 void BeingHandler::setSprite(Being *const being, const unsigned int slot,
                              const int id, const std::string &color,
-                             const unsigned char colorId,
+                             const ItemColor colorId,
                              const bool isWeapon,
                              const bool isTempSprite)
 {
diff --git a/src/net/ea/beinghandler.h b/src/net/ea/beinghandler.h
index 20622e514..6c372ce1f 100644
--- a/src/net/ea/beinghandler.h
+++ b/src/net/ea/beinghandler.h
@@ -42,7 +42,7 @@ class BeingHandler notfinal : public Net::BeingHandler
         static void setSprite(Being *const being, const unsigned int slot,
                               const int id,
                               const std::string &color = "",
-                              const unsigned char colorId = 1,
+                              const ItemColor colorId = ItemColor_one,
                               const bool isWeapon = false,
                               const bool isTempSprite = false);
 
diff --git a/src/net/ea/inventoryitem.h b/src/net/ea/inventoryitem.h
index b318b2f23..d4d9c3637 100644
--- a/src/net/ea/inventoryitem.h
+++ b/src/net/ea/inventoryitem.h
@@ -27,6 +27,7 @@
 #include "enums/simpletypes/equipm.h"
 #include "enums/simpletypes/favorite.h"
 #include "enums/simpletypes/identified.h"
+#include "enums/simpletypes/itemcolor.h"
 
 #if defined(__GXX_EXPERIMENTAL_CXX0X__)
 #include <cstdint>
@@ -51,7 +52,7 @@ class InventoryItem final
         int cards[4];
         int quantity;
         uint8_t refine;
-        unsigned char color;
+        ItemColor color;
         Identified identified;
         Damaged damaged;
         Favorite favorite;
@@ -63,7 +64,7 @@ class InventoryItem final
                       const int *const cards0,
                       const int quantity0,
                       const uint8_t refine0,
-                      const unsigned char color0,
+                      const ItemColor color0,
                       const Identified identified0,
                       const Damaged damaged0,
                       const Favorite favorite0,
diff --git a/src/net/ea/itemhandler.cpp b/src/net/ea/itemhandler.cpp
index 2c297f69f..478c17990 100644
--- a/src/net/ea/itemhandler.cpp
+++ b/src/net/ea/itemhandler.cpp
@@ -43,7 +43,7 @@ void ItemHandler::processItemVisible(Net::MessageIn &msg)
 {
     const BeingId id = msg.readBeingId("item object id");
     const int itemId = msg.readInt16("item id");
-    const uint8_t identify = msg.readUInt8("identify");
+    const ItemColor identify = fromInt(msg.readUInt8("identify"), ItemColor);
     const int x = msg.readInt16("x");
     const int y = msg.readInt16("y");
     const int amount = msg.readInt16("amount");
@@ -52,8 +52,12 @@ void ItemHandler::processItemVisible(Net::MessageIn &msg)
 
     if (actorManager)
     {
-        actorManager->createItem(id, itemId,
-            x, y, amount, identify, subX, subY);
+        actorManager->createItem(id,
+            itemId,
+            x, y,
+            amount,
+            identify,
+            subX, subY);
     }
 }
 
diff --git a/src/net/eathena/beinghandler.cpp b/src/net/eathena/beinghandler.cpp
index 35d549149..5c748915b 100644
--- a/src/net/eathena/beinghandler.cpp
+++ b/src/net/eathena/beinghandler.cpp
@@ -585,100 +585,101 @@ void BeingHandler::processBeingChangeLookContinue(Net::MessageIn &msg,
                 dstBeing->getLook());
             break;
         case 1:  // eAthena LOOK_HAIR
-            dstBeing->setHairColor(id);
+            dstBeing->setHairColor(fromInt(id, ItemColor));
             dstBeing->setSpriteID(SPRITE_HAIR_COLOR, id * -1);
             break;
         case 2:  // LOOK_WEAPON Weapon ID in id, Shield ID in id2
-            dstBeing->setSprite(SPRITE_BODY, id, "", 1, true);
+            dstBeing->setSprite(SPRITE_BODY, id, "", ItemColor_one, true);
             dstBeing->setSprite(SPRITE_FLOOR, id2);
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_FLOOR);
             break;
         case 3:  // LOOK_HEAD_BOTTOM
             dstBeing->setSprite(SPRITE_WEAPON, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_WEAPON);
             break;
         case 4:  // LOOK_HEAD_TOP Change upper headgear for eAthena, hat for us
             dstBeing->setSprite(SPRITE_CLOTHES_COLOR, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_CLOTHES_COLOR);
             break;
         case 5:  // LOOK_HEAD_MID Change middle headgear for eathena,
                  // armor for us
             dstBeing->setSprite(SPRITE_HEAD_BOTTOM, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_HEAD_BOTTOM);
             break;
         case 6:  // eAthena LOOK_HAIR_COLOR
-            dstBeing->setHairColor(id);
+            dstBeing->setHairColor(fromInt(id, ItemColor));
             dstBeing->setSpriteColor(SPRITE_HAIR_COLOR,
                 ItemDB::get(dstBeing->getSpriteID(
-                SPRITE_HAIR_COLOR)).getDyeColorsString(id));
+                SPRITE_HAIR_COLOR)).getDyeColorsString(
+                fromInt(id, ItemColor)));
             break;
         case 7:  // Clothes color. Now used as look
             dstBeing->setLook(static_cast<uint8_t>(id));
             break;
         case 8:  // eAthena LOOK_SHIELD
             dstBeing->setSprite(SPRITE_FLOOR, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_FLOOR);
             break;
         case 9:  // eAthena LOOK_SHOES
             dstBeing->setSprite(SPRITE_HAIR, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_HAIR);
             break;
         case 10:  // LOOK_GLOVES
             dstBeing->setSprite(SPRITE_SHOES, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_SHOES);
             break;
         case 11:  // LOOK_FLOOR
             dstBeing->setSprite(SPRITE_SHIELD, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_SHIELD);
             break;
         case 12:  // LOOK_ROBE
             dstBeing->setSprite(SPRITE_HEAD_TOP, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_HEAD_TOP);
             break;
         case 13:  // COSTUME_HEAD_TOP
             dstBeing->setSprite(SPRITE_HEAD_MID, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_HEAD_MID);
             break;
         case 14:  // COSTUME_HEAD_MID
             dstBeing->setSprite(SPRITE_ROBE, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_ROBE);
             break;
         case 15:  // COSTUME_HEAD_LOW
             dstBeing->setSprite(SPRITE_EVOL2, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_EVOL2);
             break;
         case 16:  // COSTUME_GARMENT
             dstBeing->setSprite(SPRITE_EVOL3, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_EVOL3);
             break;
         case 17:  // ARMOR
             dstBeing->setSprite(SPRITE_EVOL4, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             if (localPlayer)
                 localPlayer->imitateOutfit(dstBeing, SPRITE_EVOL4);
             break;
@@ -769,7 +770,7 @@ void BeingHandler::processBeingVisible(Net::MessageIn &msg)
 
     const uint16_t headTop = msg.readInt16("head top");
     const uint16_t headMid = msg.readInt16("head mid");
-    const int hairColor = msg.readInt16("hair color");
+    const ItemColor hairColor = fromInt(msg.readInt16("hair color"), ItemColor);
     const uint16_t shoes = msg.readInt16("shoes or clothes color?");
 
     const uint16_t gloves = msg.readInt16("head dir / gloves");
@@ -795,7 +796,7 @@ void BeingHandler::processBeingVisible(Net::MessageIn &msg)
         setSprite(dstBeing, SPRITE_CLOTHES_COLOR, headTop);
         setSprite(dstBeing, SPRITE_HAIR, shoes);
         setSprite(dstBeing, SPRITE_SHOES, gloves);
-        setSprite(dstBeing, SPRITE_BODY, weapon, "", 1, true);
+        setSprite(dstBeing, SPRITE_BODY, weapon, "", ItemColor_one, true);
 //        setSprite(dstBeing, SPRITE_FLOOR, shield);
     }
     else if (dstBeing->getType() == ActorType::Npc
@@ -930,7 +931,8 @@ void BeingHandler::processBeingMove(Net::MessageIn &msg)
 
     const uint16_t headTop = msg.readInt16("head top");
     const uint16_t headMid = msg.readInt16("head mid");
-    const int hairColor = msg.readInt16("hair color");
+    const ItemColor hairColor = fromInt(
+        msg.readInt16("hair color"), ItemColor);
     const uint16_t shoes = msg.readInt16("shoes or clothes color?");
 
     const uint16_t gloves = msg.readInt16("head dir / gloves");
@@ -958,7 +960,7 @@ void BeingHandler::processBeingMove(Net::MessageIn &msg)
             setSprite(dstBeing, SPRITE_CLOTHES_COLOR, headTop);
             setSprite(dstBeing, SPRITE_HAIR, shoes);
             setSprite(dstBeing, SPRITE_SHOES, gloves);
-            setSprite(dstBeing, SPRITE_BODY, weapon, "", 1, true);
+            setSprite(dstBeing, SPRITE_BODY, weapon, "", ItemColor_one, true);
         }
 //        setSprite(dstBeing, SPRITE_FLOOR, shield);
     }
@@ -1097,9 +1099,9 @@ void BeingHandler::processBeingSpawn(Net::MessageIn &msg)
 
     const uint16_t headTop = msg.readInt16("head top");
     const uint16_t headMid = msg.readInt16("head mid");
-    const int hairColor = msg.readInt16("hair color");
+    const ItemColor hairColor = fromInt(
+        msg.readInt16("hair color"), ItemColor);
     const uint16_t shoes = msg.readInt16("shoes or clothes color?");
-
     const uint16_t gloves = msg.readInt16("head dir / gloves");
     // may be use robe as gloves?
     msg.readInt16("robe");
@@ -1123,7 +1125,7 @@ void BeingHandler::processBeingSpawn(Net::MessageIn &msg)
         setSprite(dstBeing, SPRITE_CLOTHES_COLOR, headTop);
         setSprite(dstBeing, SPRITE_HAIR, shoes);
         setSprite(dstBeing, SPRITE_SHOES, gloves);
-        setSprite(dstBeing, SPRITE_BODY, weapon, "", 1, true);
+        setSprite(dstBeing, SPRITE_BODY, weapon, "", ItemColor_one, true);
 //        setSprite(dstBeing, SPRITE_FLOOR, shield);
     }
     else if (dstBeing->getType() == ActorType::Npc
diff --git a/src/net/eathena/buyingstorehandler.cpp b/src/net/eathena/buyingstorehandler.cpp
index d42d66b07..4fcad8637 100644
--- a/src/net/eathena/buyingstorehandler.cpp
+++ b/src/net/eathena/buyingstorehandler.cpp
@@ -210,11 +210,11 @@ void BuyingStoreHandler::processBuyingStoreItemsList(Net::MessageIn &msg)
 
         if (!inv)
             continue;
-        const Item *const item = inv->findItem(itemId, 1);
+        const Item *const item = inv->findItem(itemId, ItemColor_one);
         if (!item)
             continue;
         // +++ need add colors support
-        dialog->addItem(itemId, itemType, 1, amount, price);
+        dialog->addItem(itemId, itemType, ItemColor_one, amount, price);
     }
 }
 
diff --git a/src/net/eathena/buysellhandler.cpp b/src/net/eathena/buysellhandler.cpp
index da64491ed..6e145a171 100644
--- a/src/net/eathena/buysellhandler.cpp
+++ b/src/net/eathena/buysellhandler.cpp
@@ -103,7 +103,7 @@ void BuySellHandler::processNpcBuy(Net::MessageIn &msg)
         msg.readInt32("dc value?");
         const int type = msg.readUInt8("type");
         const int itemId = msg.readInt16("item id");
-        const unsigned char color = 1;
+        const ItemColor color = ItemColor_one;
         mBuyDialog->addItem(itemId, type, color, 0, value);
     }
     mBuyDialog->sort();
diff --git a/src/net/eathena/cashshophandler.cpp b/src/net/eathena/cashshophandler.cpp
index 23d6ab66d..012923424 100644
--- a/src/net/eathena/cashshophandler.cpp
+++ b/src/net/eathena/cashshophandler.cpp
@@ -104,7 +104,7 @@ void CashShopHandler::processCashShopOpen(Net::MessageIn &msg)
         const int value = msg.readInt32("discount price");
         const int type = msg.readUInt8("item type");
         const int itemId = msg.readInt16("item id");
-        const int color = 1;
+        const ItemColor color = ItemColor_one;
         mBuyDialog->addItem(itemId, type, color, 0, value);
     }
     mBuyDialog->sort();
@@ -168,7 +168,7 @@ void CashShopHandler::processCashShopSchedule(Net::MessageIn &msg)
 
 void CashShopHandler::buyItem(const int points,
                               const int itemId,
-                              const unsigned char color A_UNUSED,
+                              const ItemColor color A_UNUSED,
                               const int amount) const
 {
     createOutPacket(CMSG_NPC_CASH_SHOP_BUY);
diff --git a/src/net/eathena/cashshophandler.h b/src/net/eathena/cashshophandler.h
index cc8859a89..851b62527 100644
--- a/src/net/eathena/cashshophandler.h
+++ b/src/net/eathena/cashshophandler.h
@@ -43,7 +43,7 @@ class CashShopHandler final : public MessageHandler,
 
         void buyItem(const int points,
                      const int itemId,
-                     const unsigned char color,
+                     const ItemColor color,
                      const int amount) const override final;
 
         void close() const override final;
diff --git a/src/net/eathena/charserverhandler.cpp b/src/net/eathena/charserverhandler.cpp
index b2310b029..960acf44d 100644
--- a/src/net/eathena/charserverhandler.cpp
+++ b/src/net/eathena/charserverhandler.cpp
@@ -235,7 +235,7 @@ void CharServerHandler::readPlayerData(Net::MessageIn &msg,
     const int option A_UNUSED = (msg.readInt16("weapon") | 1) ^ 1;
     const int weapon = 0;
 
-    tempPlayer->setSprite(SPRITE_BODY, weapon, "", 1, true);
+    tempPlayer->setSprite(SPRITE_BODY, weapon, "", ItemColor_one, true);
 
     data.mAttributes[Attributes::LEVEL] = msg.readInt16("level");
 
@@ -245,8 +245,8 @@ void CharServerHandler::readPlayerData(Net::MessageIn &msg,
     const int hat = msg.readInt16("head top");
     const int topClothes = msg.readInt16("head mid");
 
-    const uint16_t color = msg.readInt16("hair color");
-    tempPlayer->setHairColor(static_cast<unsigned char>(color));
+    const ItemColor color = fromInt(msg.readInt16("hair color"), ItemColor);
+    tempPlayer->setHairColor(color);
     tempPlayer->setSprite(SPRITE_HAIR_COLOR, hairStyle * -1,
         ItemDB::get(-hairStyle).getDyeColorsString(
         color));
diff --git a/src/net/eathena/inventoryhandler.cpp b/src/net/eathena/inventoryhandler.cpp
index 86faea2e7..c2b01be22 100644
--- a/src/net/eathena/inventoryhandler.cpp
+++ b/src/net/eathena/inventoryhandler.cpp
@@ -458,8 +458,12 @@ void InventoryHandler::processPlayerEquipment(Net::MessageIn &msg)
         flags.byte = msg.readUInt8("flags");
         if (inventory)
         {
-            inventory->setItem(index, itemId, itemType, 1, refine,
+            inventory->setItem(index,
+                itemId,
+                itemType,
                 1,
+                refine,
+                ItemColor_one,
                 fromBool(flags.bits.isIdentified, Identified),
                 fromBool(flags.bits.isDamaged, Damaged),
                 fromBool(flags.bits.isFavorite, Favorite),
@@ -542,14 +546,23 @@ void InventoryHandler::processPlayerInventoryAdd(Net::MessageIn &msg)
                 break;
         }
         if (localPlayer)
-            localPlayer->pickedUp(itemInfo, 0, 1, floorId, pickup);
+        {
+            localPlayer->pickedUp(itemInfo,
+                0,
+                ItemColor_one,
+                floorId,
+                pickup);
+        }
     }
     else
     {
         if (localPlayer)
         {
-            localPlayer->pickedUp(itemInfo, amount,
-                1, floorId, Pickup::OKAY);
+            localPlayer->pickedUp(itemInfo,
+                amount,
+                ItemColor_one,
+                floorId,
+                Pickup::OKAY);
         }
 
         if (inventory)
@@ -559,8 +572,12 @@ void InventoryHandler::processPlayerInventoryAdd(Net::MessageIn &msg)
             if (item && item->getId() == itemId)
                 amount += item->getQuantity();
 
-            inventory->setItem(index, itemId, itemType, amount, refine,
-                1,
+            inventory->setItem(index,
+                itemId,
+                itemType,
+                amount,
+                refine,
+                ItemColor_one,
                 fromBool(identified, Identified),
                 fromBool(damaged, Damaged),
                 Favorite_false,
@@ -608,8 +625,12 @@ void InventoryHandler::processPlayerInventory(Net::MessageIn &msg)
 
         if (inventory)
         {
-            inventory->setItem(index, itemId, itemType, amount,
-                0, 1,
+            inventory->setItem(index,
+                itemId,
+                itemType,
+                amount,
+                0,
+                ItemColor_one,
                 fromBool(flags.bits.isIdentified, Identified),
                 fromBool(flags.bits.isDamaged, Damaged),
                 fromBool(flags.bits.isFavorite, Favorite),
@@ -645,8 +666,13 @@ void InventoryHandler::processPlayerStorage(Net::MessageIn &msg)
         ItemFlags flags;
         flags.byte = msg.readUInt8("flags");
 
-        mInventoryItems.push_back(Ea::InventoryItem(index, itemId, itemType,
-            cards, amount, 0, 1,
+        mInventoryItems.push_back(Ea::InventoryItem(index,
+            itemId,
+            itemType,
+            cards,
+            amount,
+            0,
+            ItemColor_one,
             fromBool(flags.bits.isIdentified, Identified),
             fromBool(flags.bits.isDamaged, Damaged),
             fromBool(flags.bits.isFavorite, Favorite),
@@ -746,8 +772,13 @@ void InventoryHandler::processPlayerStorageEquip(Net::MessageIn &msg)
         ItemFlags flags;
         flags.byte = msg.readUInt8("flags");
 
-        mInventoryItems.push_back(Ea::InventoryItem(index, itemId, itemType,
-            cards, amount, refine, 1,
+        mInventoryItems.push_back(Ea::InventoryItem(index,
+            itemId,
+            itemType,
+            cards,
+            amount,
+            refine,
+            ItemColor_one,
             fromBool(flags.bits.isIdentified, Identified),
             fromBool(flags.bits.isDamaged, Damaged),
             fromBool(flags.bits.isFavorite, Favorite),
@@ -773,15 +804,19 @@ void InventoryHandler::processPlayerStorageAdd(Net::MessageIn &msg)
 
     if (Item *const item = mStorage->getItem(index))
     {
-        item->setId(itemId, 1);
+        item->setId(itemId, ItemColor_one);
         item->increaseQuantity(amount);
     }
     else
     {
         if (mStorage)
         {
-            mStorage->setItem(index, itemId, itemType, amount,
-                refine, 1,
+            mStorage->setItem(index,
+                itemId,
+                itemType,
+                amount,
+                refine,
+                ItemColor_one,
                 fromBool(identified, Identified),
                 Damaged_false,
                 Favorite_false,
@@ -960,8 +995,12 @@ void InventoryHandler::processPlayerCartAdd(Net::MessageIn &msg)
         if (item && item->getId() == itemId)
             amount += item->getQuantity();
 
-        inventory->setItem(index, itemId, itemType, amount, refine,
-            1,
+        inventory->setItem(index,
+            itemId,
+            itemType,
+            amount,
+            refine,
+            ItemColor_one,
             fromBool(identified, Identified),
             Damaged_false,
             Favorite_false,
@@ -995,8 +1034,13 @@ void InventoryHandler::processPlayerCartEquip(Net::MessageIn &msg)
         ItemFlags flags;
         flags.byte = msg.readUInt8("flags");
 
-        mCartItems.push_back(Ea::InventoryItem(index, itemId, itemType,
-            cards, amount, refine, 1,
+        mCartItems.push_back(Ea::InventoryItem(index,
+            itemId,
+            itemType,
+            cards,
+            amount,
+            refine,
+            ItemColor_one,
             fromBool(flags.bits.isIdentified, Identified),
             fromBool(flags.bits.isDamaged, Damaged),
             fromBool(flags.bits.isFavorite, Favorite),
@@ -1027,8 +1071,13 @@ void InventoryHandler::processPlayerCartItems(Net::MessageIn &msg)
         ItemFlags flags;
         flags.byte = msg.readUInt8("flags");
 
-        mCartItems.push_back(Ea::InventoryItem(index, itemId, itemType,
-            cards, amount, 0, 1,
+        mCartItems.push_back(Ea::InventoryItem(index,
+            itemId,
+            itemType,
+            cards,
+            amount,
+            0,
+            ItemColor_one,
             fromBool(flags.bits.isIdentified, Identified),
             fromBool(flags.bits.isDamaged, Damaged),
             fromBool(flags.bits.isFavorite, Favorite),
diff --git a/src/net/eathena/itemhandler.cpp b/src/net/eathena/itemhandler.cpp
index ce5dfadfb..4fa4a7e3e 100644
--- a/src/net/eathena/itemhandler.cpp
+++ b/src/net/eathena/itemhandler.cpp
@@ -82,7 +82,7 @@ void ItemHandler::processItemDropped(Net::MessageIn &msg)
     const BeingId id = msg.readBeingId("id");
     const int itemId = msg.readInt16("item id");
     msg.readInt16("type");
-    const uint8_t identify = msg.readUInt8("identify");
+    msg.readUInt8("identify");
     const int x = msg.readInt16("x");
     const int y = msg.readInt16("y");
     const int subX = static_cast<int>(msg.readInt8("subx"));
@@ -91,8 +91,12 @@ void ItemHandler::processItemDropped(Net::MessageIn &msg)
 
     if (actorManager)
     {
-        actorManager->createItem(id, itemId,
-            x, y, amount, identify, subX, subY);
+        actorManager->createItem(id,
+            itemId,
+            x, y,
+            amount,
+            ItemColor_one,
+            subX, subY);
     }
 }
 
diff --git a/src/net/eathena/markethandler.cpp b/src/net/eathena/markethandler.cpp
index 265fc7ca5..d0e8ff6ce 100644
--- a/src/net/eathena/markethandler.cpp
+++ b/src/net/eathena/markethandler.cpp
@@ -87,7 +87,7 @@ void MarketHandler::processMarketOpen(Net::MessageIn &msg)
         const int value = msg.readInt32("price");
         const int amount = msg.readInt32("amount");
         msg.readInt16("view");
-        const unsigned char color = 1;
+        const ItemColor color = ItemColor_one;
         mBuyDialog->addItem(itemId, type, color, amount, value);
     }
     mBuyDialog->sort();
@@ -116,7 +116,7 @@ void MarketHandler::close()
 
 void MarketHandler::buyItem(const int itemId,
                             const int type,
-                            const unsigned char color A_UNUSED,
+                            const ItemColor color A_UNUSED,
                             const int amount) const
 {
     const bool nonStack = type == 4 || type == 5 || type == 7 || type == 8;
diff --git a/src/net/eathena/markethandler.h b/src/net/eathena/markethandler.h
index 42a4bcac0..e58ac1e68 100644
--- a/src/net/eathena/markethandler.h
+++ b/src/net/eathena/markethandler.h
@@ -43,7 +43,7 @@ class MarketHandler final : public MessageHandler,
 
         void buyItem(const int itemId,
                      const int type,
-                     const unsigned char color,
+                     const ItemColor color,
                      const int amount) const override final;
 
     protected:
diff --git a/src/net/eathena/npchandler.cpp b/src/net/eathena/npchandler.cpp
index e8a7daf8b..7b376fbeb 100644
--- a/src/net/eathena/npchandler.cpp
+++ b/src/net/eathena/npchandler.cpp
@@ -212,7 +212,7 @@ void NpcHandler::sell(const BeingId beingId) const
 
 void NpcHandler::buyItem(const BeingId beingId A_UNUSED,
                          const int itemId,
-                         const unsigned char color A_UNUSED,
+                         const ItemColor color A_UNUSED,
                          const int amount) const
 {
     createOutPacket(CMSG_NPC_BUY_REQUEST);
diff --git a/src/net/eathena/npchandler.h b/src/net/eathena/npchandler.h
index 75d9a245d..3b35cadc5 100644
--- a/src/net/eathena/npchandler.h
+++ b/src/net/eathena/npchandler.h
@@ -60,7 +60,7 @@ class NpcHandler final : public MessageHandler, public Ea::NpcHandler
 
         void buyItem(const BeingId beingId,
                      const int itemId,
-                     const unsigned char color,
+                     const ItemColor color,
                      const int amount) const override final;
 
         void sellItem(const BeingId beingId,
diff --git a/src/net/eathena/tradehandler.cpp b/src/net/eathena/tradehandler.cpp
index 749d9343e..a76a08130 100644
--- a/src/net/eathena/tradehandler.cpp
+++ b/src/net/eathena/tradehandler.cpp
@@ -199,10 +199,14 @@ void TradeHandler::processTradeItemAdd(Net::MessageIn &msg)
         }
         else
         {
-            tradeWindow->addItem2(type, itemType,
-                cards, 4,
-                false, amount,
-                refine, 1,
+            tradeWindow->addItem2(type,
+                itemType,
+                cards,
+                4,
+                false,
+                amount,
+                refine,
+                ItemColor_one,
                 fromBool(identify, Identified),
                 Damaged_false,
                 Favorite_false,
diff --git a/src/net/eathena/vendinghandler.cpp b/src/net/eathena/vendinghandler.cpp
index 48b301a77..584aa1f23 100644
--- a/src/net/eathena/vendinghandler.cpp
+++ b/src/net/eathena/vendinghandler.cpp
@@ -158,7 +158,7 @@ void VendingHandler::processItemsList(Net::MessageIn &msg)
         for (int d = 0; d < 4; d ++)
             msg.readInt16("card");
 
-        const unsigned char color = 1;
+        const ItemColor color = ItemColor_one;
         ShopItem *const item = mBuyDialog->addItem(itemId, type,
             color, amount, value);
         if (item)
diff --git a/src/net/markethandler.h b/src/net/markethandler.h
index f98b1b18d..13027024e 100644
--- a/src/net/markethandler.h
+++ b/src/net/markethandler.h
@@ -23,6 +23,8 @@
 
 #ifdef EATHENA_SUPPORT
 
+#include "enums/simpletypes/itemcolor.h"
+
 #include <string>
 
 #include "localconsts.h"
@@ -40,7 +42,7 @@ class MarketHandler notfinal
 
         virtual void buyItem(const int itemId,
                              const int type,
-                             const unsigned char color,
+                             const ItemColor color,
                              const int amount) const = 0;
 };
 
diff --git a/src/net/npchandler.h b/src/net/npchandler.h
index 1f4642b4d..29ecc5632 100644
--- a/src/net/npchandler.h
+++ b/src/net/npchandler.h
@@ -28,6 +28,7 @@
 #include "enums/being/cookingtype.h"
 
 #include "enums/simpletypes/beingid.h"
+#include "enums/simpletypes/itemcolor.h"
 
 #include "localconsts.h"
 
@@ -65,7 +66,7 @@ class NpcHandler notfinal
 
         virtual void buyItem(const BeingId beingId,
                              const int itemId,
-                             const unsigned char color,
+                             const ItemColor color,
                              const int amount) const = 0;
 
         virtual void sellItem(const BeingId beingId,
diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp
index 8092a519f..d336bdf47 100644
--- a/src/net/tmwa/beinghandler.cpp
+++ b/src/net/tmwa/beinghandler.cpp
@@ -339,70 +339,70 @@ void BeingHandler::processBeingChangeLookContinue(Net::MessageIn &msg,
             break;
         }
         case 2:     // Weapon ID in id, Shield ID in id2
-            dstBeing->setSprite(SPRITE_BODY, id, "", 1, true);
+            dstBeing->setSprite(SPRITE_BODY, id, "", ItemColor_one, true);
             dstBeing->setSprite(SPRITE_FLOOR, id2);
             localPlayer->imitateOutfit(dstBeing, SPRITE_FLOOR);
             break;
         case 3:     // Change lower headgear for eAthena, pants for us
             dstBeing->setSprite(SPRITE_WEAPON, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             localPlayer->imitateOutfit(dstBeing, SPRITE_WEAPON);
             break;
         case 4:     // Change upper headgear for eAthena, hat for us
             dstBeing->setSprite(SPRITE_CLOTHES_COLOR, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             localPlayer->imitateOutfit(dstBeing, SPRITE_CLOTHES_COLOR);
             break;
         case 5:     // Change middle headgear for eathena, armor for us
             dstBeing->setSprite(SPRITE_HEAD_BOTTOM, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             localPlayer->imitateOutfit(dstBeing, SPRITE_HEAD_BOTTOM);
             break;
         case 6:     // eAthena LOOK_HAIR_COLOR
             dstBeing->setHairColor(SPRITE_HAIR_COLOR,
-                static_cast<uint8_t>(id));
+                fromInt(id, ItemColor));
             break;
         case 7:     // Clothes color
             // ignoring it
             break;
         case 8:     // eAthena LOOK_SHIELD
             dstBeing->setSprite(SPRITE_FLOOR, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             localPlayer->imitateOutfit(dstBeing, SPRITE_FLOOR);
             break;
         case 9:     // eAthena LOOK_SHOES
             dstBeing->setSprite(SPRITE_HAIR, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             localPlayer->imitateOutfit(dstBeing, SPRITE_HAIR);
             break;
         case 10:   // LOOK_GLOVES
             dstBeing->setSprite(SPRITE_SHOES, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             localPlayer->imitateOutfit(dstBeing, SPRITE_SHOES);
             break;
         case 11:  // LOOK_CAPE
             dstBeing->setSprite(SPRITE_SHIELD, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             localPlayer->imitateOutfit(dstBeing, SPRITE_SHIELD);
             break;
         case 12:
             dstBeing->setSprite(SPRITE_HEAD_TOP, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             localPlayer->imitateOutfit(dstBeing, SPRITE_HEAD_TOP);
             break;
         case 13:
             dstBeing->setSprite(SPRITE_HEAD_MID, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             localPlayer->imitateOutfit(dstBeing, SPRITE_HEAD_MID);
             break;
         case 14:
             dstBeing->setSprite(SPRITE_ROBE, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             localPlayer->imitateOutfit(dstBeing, SPRITE_ROBE);
             break;
         case 15:
             dstBeing->setSprite(SPRITE_EVOL2, id, color,
-                static_cast<unsigned char>(id2));
+                fromInt(id2, ItemColor));
             localPlayer->imitateOutfit(dstBeing, SPRITE_EVOL2);
             break;
         case 16:
@@ -483,7 +483,8 @@ void BeingHandler::processPlayerUpdate1(Net::MessageIn &msg)
 
     const uint16_t headTop = msg.readInt16("head top");
     const uint16_t headMid = msg.readInt16("head mid");
-    const uint8_t hairColor = msg.readUInt8("hair color");
+    const ItemColor hairColor = fromInt(
+        msg.readUInt8("hair color"), ItemColor);
     msg.readUInt8("unused");
     msg.readInt32("unused");
 
@@ -508,7 +509,7 @@ void BeingHandler::processPlayerUpdate1(Net::MessageIn &msg)
     if (!disguiseId)
     {
         // Set these after the gender, as the sprites may be gender-specific
-        dstBeing->updateSprite(SPRITE_BODY, weapon, "", 1, true);
+        dstBeing->updateSprite(SPRITE_BODY, weapon, "", ItemColor_one, true);
         dstBeing->updateSprite(SPRITE_FLOOR, shield);
         dstBeing->updateSprite(SPRITE_WEAPON, headBottom);
         dstBeing->updateSprite(SPRITE_HEAD_BOTTOM, headMid);
@@ -617,7 +618,8 @@ void BeingHandler::processPlayerUpdate2(Net::MessageIn &msg)
     const uint16_t headBottom = msg.readInt16("head bottom");
     const uint16_t headTop = msg.readInt16("head top");
     const uint16_t headMid = msg.readInt16("head mid");
-    const uint8_t hairColor = msg.readUInt8("hair color");
+    const ItemColor hairColor = fromInt(
+        msg.readUInt8("hair color"), ItemColor);
     msg.readUInt8("unused");
     msg.readInt32("unused");
 
@@ -642,7 +644,7 @@ void BeingHandler::processPlayerUpdate2(Net::MessageIn &msg)
     if (!disguiseId)
     {
         // Set these after the gender, as the sprites may be gender-specific
-        dstBeing->updateSprite(SPRITE_BODY, weapon, "", 1, true);
+        dstBeing->updateSprite(SPRITE_BODY, weapon, "", ItemColor_one, true);
         dstBeing->updateSprite(SPRITE_FLOOR, shield);
         dstBeing->updateSprite(SPRITE_WEAPON, headBottom);
         dstBeing->updateSprite(SPRITE_HEAD_BOTTOM, headMid);
@@ -751,7 +753,8 @@ void BeingHandler::processPlayerMove(Net::MessageIn &msg)
 
     const uint16_t headTop = msg.readInt16("head top");
     const uint16_t headMid = msg.readInt16("head mid");
-    const uint8_t hairColor = msg.readUInt8("hair color");
+    const ItemColor hairColor = fromInt(
+        msg.readUInt8("hair color"), ItemColor);
     msg.readUInt8("unused");
     msg.readInt32("unused");
 
@@ -776,7 +779,7 @@ void BeingHandler::processPlayerMove(Net::MessageIn &msg)
     if (!disguiseId)
     {
         // Set these after the gender, as the sprites may be gender-specific
-        dstBeing->updateSprite(SPRITE_BODY, weapon, "", 1, true);
+        dstBeing->updateSprite(SPRITE_BODY, weapon, "", ItemColor_one, true);
         dstBeing->updateSprite(SPRITE_FLOOR, shield);
         dstBeing->updateSprite(SPRITE_WEAPON, headBottom);
         dstBeing->updateSprite(SPRITE_HEAD_BOTTOM, headMid);
@@ -942,7 +945,7 @@ void BeingHandler::processBeingVisible(Net::MessageIn &msg)
     const uint16_t shield = msg.readInt16("shield");
     const uint16_t headTop = msg.readInt16("head top");
     const uint16_t headMid = msg.readInt16("head mid");
-    const uint8_t hairColor = msg.readUInt8("hair color");
+    const ItemColor hairColor = fromInt(msg.readUInt8("hair color"), ItemColor);
     msg.readUInt8("unused");
     const uint16_t shoes = msg.readInt16("shoes / clothes color");
 
@@ -1004,7 +1007,7 @@ void BeingHandler::processBeingVisible(Net::MessageIn &msg)
         setSprite(dstBeing, SPRITE_CLOTHES_COLOR, headTop);
         setSprite(dstBeing, SPRITE_HAIR, shoes);
         setSprite(dstBeing, SPRITE_SHOES, gloves);
-        setSprite(dstBeing, SPRITE_BODY, weapon, "", 1, true);
+        setSprite(dstBeing, SPRITE_BODY, weapon, "", ItemColor_one, true);
         setSprite(dstBeing, SPRITE_FLOOR, shield);
     }
     else if (dstBeing->getType() == ActorType::Npc
@@ -1143,7 +1146,8 @@ void BeingHandler::processBeingMove(Net::MessageIn &msg)
     const uint16_t shield = msg.readInt16("shield");
     const uint16_t headTop = msg.readInt16("head top");
     const uint16_t headMid = msg.readInt16("head mid");
-    const uint8_t hairColor = msg.readUInt8("hair color");
+    const ItemColor hairColor = fromInt(
+        msg.readUInt8("hair color"), ItemColor);
     msg.readUInt8("unused");
     const uint16_t shoes = msg.readInt16("shoes / clothes color");
 
@@ -1205,7 +1209,7 @@ void BeingHandler::processBeingMove(Net::MessageIn &msg)
         setSprite(dstBeing, SPRITE_CLOTHES_COLOR, headTop);
         setSprite(dstBeing, SPRITE_HAIR, shoes);
         setSprite(dstBeing, SPRITE_SHOES, gloves);
-        setSprite(dstBeing, SPRITE_BODY, weapon, "", 1, true);
+        setSprite(dstBeing, SPRITE_BODY, weapon, "", ItemColor_one, true);
         setSprite(dstBeing, SPRITE_FLOOR, shield);
     }
     else if (dstBeing->getType() == ActorType::Npc
diff --git a/src/net/tmwa/buysellhandler.cpp b/src/net/tmwa/buysellhandler.cpp
index e09fd2ae8..e41b1580e 100644
--- a/src/net/tmwa/buysellhandler.cpp
+++ b/src/net/tmwa/buysellhandler.cpp
@@ -110,7 +110,7 @@ void BuySellHandler::processNpcBuy(Net::MessageIn &msg)
         msg.readInt32("dc value?");
         const int type = msg.readUInt8("type");
         const int itemId = msg.readInt16("item id");
-        uint8_t color = 1;
+        const ItemColor color = ItemColor_one;
         mBuyDialog->addItem(itemId, type, color, 0, value);
     }
     mBuyDialog->sort();
diff --git a/src/net/tmwa/cashshophandler.cpp b/src/net/tmwa/cashshophandler.cpp
index c9fecd9fb..45a4aaacb 100644
--- a/src/net/tmwa/cashshophandler.cpp
+++ b/src/net/tmwa/cashshophandler.cpp
@@ -44,7 +44,7 @@ void CashShopHandler::handleMessage(Net::MessageIn &msg A_UNUSED)
 
 void CashShopHandler::buyItem(const int points A_UNUSED,
                               const int itemId A_UNUSED,
-                              const unsigned char color A_UNUSED,
+                              const ItemColor color A_UNUSED,
                               const int amount A_UNUSED) const
 {
 }
diff --git a/src/net/tmwa/cashshophandler.h b/src/net/tmwa/cashshophandler.h
index 588aba087..3b4c668ec 100644
--- a/src/net/tmwa/cashshophandler.h
+++ b/src/net/tmwa/cashshophandler.h
@@ -42,7 +42,7 @@ class CashShopHandler final : public MessageHandler,
 
         void buyItem(const int points,
                      const int itemId,
-                     const unsigned char color,
+                     const ItemColor color,
                      const int amount) const override final;
 
         void close() const override final;
diff --git a/src/net/tmwa/charserverhandler.cpp b/src/net/tmwa/charserverhandler.cpp
index 12d698186..229339ef4 100644
--- a/src/net/tmwa/charserverhandler.cpp
+++ b/src/net/tmwa/charserverhandler.cpp
@@ -168,7 +168,7 @@ void CharServerHandler::readPlayerData(Net::MessageIn &msg,
     const uint16_t look = msg.readUInt8("look");
     tempPlayer->setSubtype(fromInt(race, BeingTypeId), look);
     const uint16_t weapon = msg.readInt16("weapon");
-    tempPlayer->setSprite(SPRITE_BODY, weapon, "", 1, true);
+    tempPlayer->setSprite(SPRITE_BODY, weapon, "", ItemColor_one, true);
 
     data.mAttributes[Attributes::LEVEL] = msg.readInt16("level");
 
@@ -179,11 +179,12 @@ void CharServerHandler::readPlayerData(Net::MessageIn &msg,
     const int hat = msg.readInt16("hat");
     const int topClothes = msg.readInt16("top clothes");
 
-    const uint8_t hairColor = msg.readUInt8("hair color");
+    const ItemColor hairColor = fromInt(
+        msg.readUInt8("hair color"), ItemColor);
     msg.readUInt8("unused");
     tempPlayer->setSprite(SPRITE_HAIR_COLOR, hairStyle * -1,
         ItemDB::get(-hairStyle).getDyeColorsString(hairColor));
-    tempPlayer->setHairColor(static_cast<unsigned char>(hairColor));
+    tempPlayer->setHairColor(hairColor);
 
     const int misc2 = msg.readInt16("misc2");
     tempPlayer->setName(msg.readString(24, "name"));
diff --git a/src/net/tmwa/inventoryhandler.cpp b/src/net/tmwa/inventoryhandler.cpp
index 5ff9325ae..05ed6e40d 100644
--- a/src/net/tmwa/inventoryhandler.cpp
+++ b/src/net/tmwa/inventoryhandler.cpp
@@ -292,8 +292,12 @@ void InventoryHandler::processPlayerEquipment(Net::MessageIn &msg)
 
         if (inventory)
         {
-            inventory->setItem(index, itemId, itemType, 1, refine,
+            inventory->setItem(index,
+                itemId,
+                itemType,
                 1,
+                refine,
+                ItemColor_one,
                 fromBool(identified, Identified),
                 Damaged_false,
                 Favorite_false,
@@ -374,14 +378,23 @@ void InventoryHandler::processPlayerInventoryAdd(Net::MessageIn &msg)
                 break;
         }
         if (localPlayer)
-            localPlayer->pickedUp(itemInfo, 0, identified, floorId, pickup);
+        {
+            localPlayer->pickedUp(itemInfo,
+                0,
+                fromInt(identified, ItemColor),
+                floorId,
+                pickup);
+        }
     }
     else
     {
         if (localPlayer)
         {
-            localPlayer->pickedUp(itemInfo, amount,
-                identified, floorId, Pickup::OKAY);
+            localPlayer->pickedUp(itemInfo,
+                amount,
+                fromInt(identified, ItemColor),
+                floorId,
+                Pickup::OKAY);
         }
 
         if (inventory)
@@ -391,8 +404,12 @@ void InventoryHandler::processPlayerInventoryAdd(Net::MessageIn &msg)
             if (item && item->getId() == itemId)
                 amount += item->getQuantity();
 
-            inventory->setItem(index, itemId, type, amount, refine,
-                1,
+            inventory->setItem(index,
+                itemId,
+                type,
+                amount,
+                refine,
+                ItemColor_one,
                 fromBool(identified, Identified),
                 Damaged_false,
                 Favorite_false,
@@ -449,8 +466,12 @@ void InventoryHandler::processPlayerInventory(Net::MessageIn &msg)
 
         if (inventory)
         {
-            inventory->setItem(index, itemId, itemType, amount,
-                0, 1,
+            inventory->setItem(index,
+                itemId,
+                itemType,
+                amount,
+                0,
+                ItemColor_one,
                 fromBool(identified, Identified),
                 Damaged_false,
                 Favorite_false,
@@ -490,8 +511,13 @@ void InventoryHandler::processPlayerStorage(Net::MessageIn &msg)
                         cards[0], cards[1], cards[2], cards[3]);
         }
 
-        mInventoryItems.push_back(Ea::InventoryItem(index, itemId,
-            itemType, cards, amount, 0, 1,
+        mInventoryItems.push_back(Ea::InventoryItem(index,
+            itemId,
+            itemType,
+            cards,
+            amount,
+            0,
+            ItemColor_one,
             fromBool(identified, Identified),
             Damaged_false,
             Favorite_false,
@@ -559,8 +585,13 @@ void InventoryHandler::processPlayerStorageEquip(Net::MessageIn &msg)
                 static_cast<unsigned int>(refine));
         }
 
-        mInventoryItems.push_back(Ea::InventoryItem(index, itemId,
-            itemType, cards, amount, refine, 1,
+        mInventoryItems.push_back(Ea::InventoryItem(index,
+            itemId,
+            itemType,
+            cards,
+            amount,
+            refine,
+            ItemColor_one,
             fromBool(identified, Identified),
             Damaged_false,
             Favorite_false,
@@ -585,15 +616,19 @@ void InventoryHandler::processPlayerStorageAdd(Net::MessageIn &msg)
 
     if (Item *const item = mStorage->getItem(index))
     {
-        item->setId(itemId, identified);
+        item->setId(itemId, ItemColor_one);
         item->increaseQuantity(amount);
     }
     else
     {
         if (mStorage)
         {
-            mStorage->setItem(index, itemId, 0, amount,
-                refine, 1,
+            mStorage->setItem(index,
+                itemId,
+                0,
+                amount,
+                refine,
+                ItemColor_one,
                 fromBool(identified, Identified),
                 Damaged_false,
                 Favorite_false,
diff --git a/src/net/tmwa/itemhandler.cpp b/src/net/tmwa/itemhandler.cpp
index 7ad3f733a..745c79865 100644
--- a/src/net/tmwa/itemhandler.cpp
+++ b/src/net/tmwa/itemhandler.cpp
@@ -72,7 +72,7 @@ void ItemHandler::processItemDropped(Net::MessageIn &msg)
 {
     const BeingId id = msg.readBeingId("item object id");
     const int itemId = msg.readInt16("item id");
-    const uint8_t identify = msg.readUInt8("identify");
+    const ItemColor identify = fromInt(msg.readUInt8("identify"), ItemColor);
     const int x = msg.readInt16("x");
     const int y = msg.readInt16("y");
     const int subX = static_cast<int>(msg.readInt8("sub x"));
diff --git a/src/net/tmwa/markethandler.cpp b/src/net/tmwa/markethandler.cpp
index 6fff692c8..4e322b1cf 100644
--- a/src/net/tmwa/markethandler.cpp
+++ b/src/net/tmwa/markethandler.cpp
@@ -53,7 +53,7 @@ void MarketHandler::close()
 
 void MarketHandler::buyItem(const int itemId A_UNUSED,
                             const int type A_UNUSED,
-                            const unsigned char color A_UNUSED,
+                            const ItemColor color A_UNUSED,
                             const int amount A_UNUSED) const
 {
 }
diff --git a/src/net/tmwa/markethandler.h b/src/net/tmwa/markethandler.h
index bf817ac04..65d299251 100644
--- a/src/net/tmwa/markethandler.h
+++ b/src/net/tmwa/markethandler.h
@@ -43,7 +43,7 @@ class MarketHandler final : public MessageHandler,
 
         void buyItem(const int itemId,
                      const int type,
-                     const unsigned char color,
+                     const ItemColor color,
                      const int amount) const override final;
 };
 
diff --git a/src/net/tmwa/npchandler.cpp b/src/net/tmwa/npchandler.cpp
index 60d41a7ef..b01c3277f 100644
--- a/src/net/tmwa/npchandler.cpp
+++ b/src/net/tmwa/npchandler.cpp
@@ -178,7 +178,7 @@ void NpcHandler::sell(const BeingId beingId) const
 
 void NpcHandler::buyItem(const BeingId beingId A_UNUSED,
                          const int itemId,
-                         const unsigned char color A_UNUSED,
+                         const ItemColor color A_UNUSED,
                          const int amount) const
 {
     createOutPacket(CMSG_NPC_BUY_REQUEST);
diff --git a/src/net/tmwa/npchandler.h b/src/net/tmwa/npchandler.h
index c8da3fd42..35a6f9459 100644
--- a/src/net/tmwa/npchandler.h
+++ b/src/net/tmwa/npchandler.h
@@ -60,7 +60,7 @@ class NpcHandler final : public MessageHandler, public Ea::NpcHandler
 
         void buyItem(const BeingId beingId,
                      const int itemId,
-                     const unsigned char color,
+                     const ItemColor color,
                      const int amount) const override final;
 
         void sellItem(const BeingId beingId,
diff --git a/src/net/tmwa/tradehandler.cpp b/src/net/tmwa/tradehandler.cpp
index c445f8d06..845a7af6b 100644
--- a/src/net/tmwa/tradehandler.cpp
+++ b/src/net/tmwa/tradehandler.cpp
@@ -184,10 +184,14 @@ void TradeHandler::processTradeItemAdd(Net::MessageIn &msg)
         }
         else
         {
-            tradeWindow->addItem2(type, 0,
-                cards, 4,
-                false, amount,
-                refine, 1,
+            tradeWindow->addItem2(type,
+                0,
+                cards,
+                4,
+                false,
+                amount,
+                refine,
+                ItemColor_one,
                 fromBool(identify, Identified),
                 Damaged_false,
                 Favorite_false,
diff --git a/src/resources/beinginfo.cpp b/src/resources/beinginfo.cpp
index f63e65134..1f1033e3c 100644
--- a/src/resources/beinginfo.cpp
+++ b/src/resources/beinginfo.cpp
@@ -206,12 +206,12 @@ void BeingInfo::setColorsList(const std::string &name)
         mColors = ColorDB::getColorsList(name);
 }
 
-std::string BeingInfo::getColor(const int idx) const
+std::string BeingInfo::getColor(const ItemColor idx) const
 {
     if (!mColors)
         return std::string();
 
-    const std::map <int, ColorDB::ItemColor>::const_iterator
+    const std::map <ItemColor, ColorDB::ItemColorData>::const_iterator
         it = mColors->find(idx);
     if (it == mColors->end())
         return std::string();
diff --git a/src/resources/beinginfo.h b/src/resources/beinginfo.h
index 0a6330470..3429515e0 100644
--- a/src/resources/beinginfo.h
+++ b/src/resources/beinginfo.h
@@ -28,6 +28,7 @@
 #include "enums/resources/map/blocktype.h"
 
 #include "enums/simpletypes/beingtypeid.h"
+#include "enums/simpletypes/itemcolor.h"
 
 #include "resources/beingmenuitem.h"
 #include "resources/cursor.h"
@@ -38,7 +39,7 @@ struct Attack;
 
 namespace ColorDB
 {
-    class ItemColor;
+    class ItemColorData;
 }
 
 typedef std::map<int, Attack*> Attacks;
@@ -312,7 +313,7 @@ class BeingInfo final
 
         void setColorsList(const std::string &name);
 
-        std::string getColor(const int idx) const A_WARN_UNUSED;
+        std::string getColor(const ItemColor idx) const A_WARN_UNUSED;
 
         void addMenu(const std::string &name, const std::string &command);
 
@@ -332,7 +333,7 @@ class BeingInfo final
         std::vector<BeingMenuItem> mMenu;
         unsigned char mBlockWalkMask;
         BlockType::BlockType mBlockType;
-        const std::map <int, ColorDB::ItemColor> *mColors;
+        const std::map <ItemColor, ColorDB::ItemColorData> *mColors;
         int mTargetOffsetX;
         int mTargetOffsetY;
         int mNameOffsetX;
diff --git a/src/resources/db/colordb.cpp b/src/resources/db/colordb.cpp
index 1b636e407..62f7beef6 100644
--- a/src/resources/db/colordb.cpp
+++ b/src/resources/db/colordb.cpp
@@ -41,7 +41,7 @@ void ColorDB::load()
     if (mLoaded)
         unload();
 
-    std::map<int, ItemColor> colors;
+    std::map<ItemColor, ItemColorData> colors;
     ColorListsIterator it = mColorLists.find("hair");
     if (it != mColorLists.end())
         colors = it->second;
@@ -68,7 +68,7 @@ void ColorDB::load()
 }
 
 void ColorDB::loadHair(const std::string &fileName,
-                       std::map<int, ItemColor> &colors)
+                       std::map<ItemColor, ItemColorData> &colors)
 {
     XML::Document *doc = new XML::Document(fileName,
         UseResman_true,
@@ -78,8 +78,8 @@ void ColorDB::loadHair(const std::string &fileName,
     if (!root || !xmlNameEqual(root, "colors"))
     {
         logger->log("ColorDB: Failed to find hair colors file.");
-        if (colors.find(0) == colors.end())
-            colors[0] = ItemColor(0, "", "");
+        if (colors.find(ItemColor_zero) == colors.end())
+            colors[ItemColor_zero] = ItemColorData(ItemColor_zero, "", "");
         delete doc;
         return;
     }
@@ -95,12 +95,13 @@ void ColorDB::loadHair(const std::string &fileName,
         }
         else if (xmlNameEqual(node, "color"))
         {
-            const int id = XML::getProperty(node, "id", 0);
+            const ItemColor id = fromInt(XML::getProperty(
+                node, "id", 0), ItemColor);
 
             if (colors.find(id) != colors.end())
-                logger->log("ColorDB: Redefinition of dye ID %d", id);
+                logger->log("ColorDB: Redefinition of dye ID %d", toInt(id, int));
 
-            colors[id] = ItemColor(id, XML::langProperty(node, "name", ""),
+            colors[id] = ItemColorData(id, XML::langProperty(node, "name", ""),
                 XML::getProperty(node, "value", "#FFFFFF"));
         }
     }
@@ -135,7 +136,7 @@ void ColorDB::loadColorLists(const std::string &fileName)
             if (name.empty())
                 continue;
 
-            std::map <int, ItemColor> colors;
+            std::map <ItemColor, ItemColorData> colors;
             const ColorListsIterator it = mColorLists.find(name);
 
             if (it != mColorLists.end())
@@ -145,11 +146,14 @@ void ColorDB::loadColorLists(const std::string &fileName)
             {
                 if (xmlNameEqual(colorNode, "color"))
                 {
-                    ItemColor c(XML::getProperty(colorNode, "id", -1),
-                        XML::langProperty(colorNode, "name", ""),
-                        XML::getProperty(colorNode, "value", ""));
-                    if (c.id > -1)
-                        colors[c.id] = c;
+                    const int id = XML::getProperty(colorNode, "id", -1);
+                    if (id > -1)
+                    {
+                        ItemColorData c(fromInt(id, ItemColor),
+                            XML::langProperty(colorNode, "name", ""),
+                            XML::getProperty(colorNode, "value", ""));
+                            colors[c.id] = c;
+                    }
                 }
             }
             mColorLists[name] = colors;
@@ -166,7 +170,7 @@ void ColorDB::unload()
     mLoaded = false;
 }
 
-std::string &ColorDB::getHairColorName(const int id)
+std::string &ColorDB::getHairColorName(const ItemColor id)
 {
     if (!mLoaded)
         load();
@@ -182,7 +186,7 @@ std::string &ColorDB::getHairColorName(const int id)
 
     if (i == (*it).second.end())
     {
-        logger->log("ColorDB: Error, unknown dye ID# %d", id);
+        logger->log("ColorDB: Error, unknown dye ID# %d", toInt(id, int));
         return mFail;
     }
     else
@@ -196,7 +200,7 @@ int ColorDB::getHairSize()
     return mHairColorsSize;
 }
 
-const std::map <int, ColorDB::ItemColor>
+const std::map <ItemColor, ColorDB::ItemColorData>
      *ColorDB::getColorsList(const std::string &name)
 {
     const ColorListsIterator it = mColorLists.find(name);
diff --git a/src/resources/db/colordb.h b/src/resources/db/colordb.h
index c2923f382..6468b76e3 100644
--- a/src/resources/db/colordb.h
+++ b/src/resources/db/colordb.h
@@ -22,6 +22,8 @@
 #ifndef RESOURCES_DB_COLORDB_H
 #define RESOURCES_DB_COLORDB_H
 
+#include "enums/simpletypes/itemcolor.h"
+
 #include <map>
 #include <string>
 
@@ -32,24 +34,25 @@
  */
 namespace ColorDB
 {
-    class ItemColor final
+    class ItemColorData final
     {
         public:
-            ItemColor() :
-                id(0),
+            ItemColorData() :
+                id(ItemColor_zero),
                 name(),
                 color()
             { }
 
-            ItemColor(const int id0, const std::string &name0,
-                      const std::string &color0) :
+            ItemColorData(const ItemColor id0,
+                          const std::string &name0,
+                          const std::string &color0) :
                 id(id0),
                 name(name0),
                 color(color0)
             {
             }
 
-            int id;
+            ItemColor id;
             std::string name;
             std::string color;
     };
@@ -63,7 +66,7 @@ namespace ColorDB
      * Loads the color data from <code>colors.xml</code>.
      */
     void loadHair(const std::string &fileName,
-                  std::map<int, ItemColor> &colors);
+                  std::map<ItemColor, ItemColorData> &colors);
 
     void loadColorLists(const std::string &fileName);
 
@@ -72,17 +75,19 @@ namespace ColorDB
      */
     void unload();
 
-    std::string &getHairColorName(const int id) A_WARN_UNUSED;
+    std::string &getHairColorName(const ItemColor id) A_WARN_UNUSED;
 
     int getHairSize() A_WARN_UNUSED;
 
-    const std::map <int, ItemColor> *getColorsList(const std::string
-                                                   &name) A_WARN_UNUSED;
+    const std::map <ItemColor, ItemColorData> *getColorsList(const std::string
+                                                             &name)
+                                                             A_WARN_UNUSED;
 
     // Color DB
-    typedef std::map<int, ItemColor> Colors;
+    typedef std::map<ItemColor, ItemColorData> Colors;
     typedef Colors::iterator ColorIterator;
-    typedef std::map <std::string, std::map <int, ItemColor> > ColorLists;
+    typedef std::map <std::string, std::map <ItemColor, ItemColorData> >
+        ColorLists;
     typedef ColorLists::iterator ColorListsIterator;
 }  // namespace ColorDB
 
diff --git a/src/resources/iteminfo.cpp b/src/resources/iteminfo.cpp
index 768825f44..c439be5c5 100644
--- a/src/resources/iteminfo.cpp
+++ b/src/resources/iteminfo.cpp
@@ -201,12 +201,12 @@ void ItemInfo::setColorsList(const std::string &name)
     }
 }
 
-std::string ItemInfo::getDyeColorsString(const int color) const
+std::string ItemInfo::getDyeColorsString(const ItemColor color) const
 {
     if (!mColors || mColorList.empty())
         return "";
 
-    const std::map <int, ColorDB::ItemColor>::const_iterator
+    const std::map <ItemColor, ColorDB::ItemColorData>::const_iterator
         it = mColors->find(color);
     if (it == mColors->end())
         return "";
@@ -214,23 +214,23 @@ std::string ItemInfo::getDyeColorsString(const int color) const
     return it->second.color;
 }
 
-const std::string ItemInfo::getDescription(const unsigned char color) const
+const std::string ItemInfo::getDescription(const ItemColor color) const
 {
     return replaceColors(mDescription, color);
 }
 
-const std::string ItemInfo::getName(const unsigned char color) const
+const std::string ItemInfo::getName(const ItemColor color) const
 {
     return replaceColors(mName, color);
 }
 
 const std::string ItemInfo::replaceColors(std::string str,
-                                          const unsigned char color) const
+                                          const ItemColor color) const
 {
     std::string name;
     if (mColors && !mColorList.empty())
     {
-        const std::map <int, ColorDB::ItemColor>::const_iterator
+        const std::map <ItemColor, ColorDB::ItemColorData>::const_iterator
             it = mColors->find(color);
         if (it == mColors->end())
             name = "unknown";
@@ -369,24 +369,24 @@ void ItemInfo::setSprite(const std::string &animationFile,
     mAnimationFiles[static_cast<int>(gender) + race * 4] = animationFile;
 }
 
-std::string ItemInfo::getColorName(const int idx) const
+std::string ItemInfo::getColorName(const ItemColor idx) const
 {
     if (!mColors)
         return std::string();
 
-    const std::map <int, ColorDB::ItemColor>::const_iterator
+    const std::map <ItemColor, ColorDB::ItemColorData>::const_iterator
         it = mColors->find(idx);
     if (it == mColors->end())
         return std::string();
     return it->second.name;
 }
 
-std::string ItemInfo::getColor(const int idx) const
+std::string ItemInfo::getColor(const ItemColor idx) const
 {
     if (!mColors)
         return std::string();
 
-    const std::map <int, ColorDB::ItemColor>::const_iterator
+    const std::map <ItemColor, ColorDB::ItemColorData>::const_iterator
         it = mColors->find(idx);
     if (it == mColors->end())
         return std::string();
diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h
index 4d40390d9..976d30c1d 100644
--- a/src/resources/iteminfo.h
+++ b/src/resources/iteminfo.h
@@ -26,6 +26,7 @@
 #include "enums/being/gender.h"
 
 #include "enums/simpletypes/beingtypeid.h"
+#include "enums/simpletypes/itemcolor.h"
 
 #include "resources/cursor.h"
 #include "resources/itemtype.h"
@@ -34,7 +35,7 @@
 
 namespace ColorDB
 {
-    class ItemColor;
+    class ItemColorData;
 }
 
 // sprite, <itemfrom, itemto>
@@ -69,7 +70,7 @@ class ItemInfo final
         const std::string &getName() const A_WARN_UNUSED
         { return mName; }
 
-        const std::string getName(const unsigned char color)
+        const std::string getName(const ItemColor color)
                                   const A_WARN_UNUSED;
 
         void setDisplay(const SpriteDisplay &display)
@@ -84,7 +85,7 @@ class ItemInfo final
         const std::string &getDescription() const A_WARN_UNUSED
         { return mDescription; }
 
-        const std::string getDescription(const unsigned char color)
+        const std::string getDescription(const ItemColor color)
                                          const A_WARN_UNUSED;
 
         void setEffect(const std::string &effect)
@@ -238,7 +239,7 @@ class ItemInfo final
         const SpriteToItemMap *getSpriteToItemReplaceMap(const int directions)
                                                          const A_WARN_UNUSED;
 
-        std::string getDyeColorsString(const int color) const A_WARN_UNUSED;
+        std::string getDyeColorsString(const ItemColor color) const A_WARN_UNUSED;
 
         void setColorsList(const std::string &name);
 
@@ -246,7 +247,7 @@ class ItemInfo final
         { return !mColorList.empty(); }
 
         const std::string replaceColors(std::string str,
-                                        const unsigned char color)
+                                        const ItemColor color)
                                         const A_WARN_UNUSED;
 
         void setPickupCursor(const std::string &cursor)
@@ -267,9 +268,9 @@ class ItemInfo final
         int getColorsSize() const
         { return mColors ? static_cast<int>(mColors->size()) : 0; }
 
-        std::string getColorName(const int idx) const;
+        std::string getColorName(const ItemColor idx) const;
 
-        std::string getColor(const int idx) const;
+        std::string getColor(const ItemColor idx) const;
 
         int mDrawBefore[10];
         int mDrawAfter[10];
@@ -317,7 +318,7 @@ class ItemInfo final
         /** Stores the names of sounds to be played at certain event. */
         std::map <ItemSoundEvent::Type, SoundInfoVect> mSounds;
         std::map <int, int> mTags;
-        const std::map <int, ColorDB::ItemColor> *mColors;
+        const std::map <ItemColor, ColorDB::ItemColorData> *mColors;
         std::string mColorList;
         int mHitEffectId;
         int mCriticalHitEffectId;
diff --git a/src/shopitem.cpp b/src/shopitem.cpp
index 3fa7c6480..faf635fbd 100644
--- a/src/shopitem.cpp
+++ b/src/shopitem.cpp
@@ -35,7 +35,7 @@
 ShopItem::ShopItem(const int inventoryIndex,
                    const int id,
                    const int type,
-                   const unsigned char color,
+                   const ItemColor color,
                    const int quantity,
                    const int price) :
     Item(id, type, 0, 0, color,
@@ -57,7 +57,7 @@ ShopItem::ShopItem(const int inventoryIndex,
 
 ShopItem::ShopItem(const int id,
                    const int type,
-                   const unsigned char color,
+                   const ItemColor color,
                    const int price) :
     Item(id, type, 0, 0, color,
          Identified_true,
diff --git a/src/shopitem.h b/src/shopitem.h
index 68bdc51b5..a1c3d5649 100644
--- a/src/shopitem.h
+++ b/src/shopitem.h
@@ -47,7 +47,7 @@ class ShopItem final : public Item
         ShopItem(const int inventoryIndex,
                  const int id,
                  const int type,
-                 const unsigned char color,
+                 const ItemColor color,
                  const int quantity,
                  const int price);
 
@@ -60,7 +60,7 @@ class ShopItem final : public Item
          */
         ShopItem(const int id,
                  const int type,
-                 const unsigned char color,
+                 const ItemColor color,
                  const int price);
 
         A_DELETE_COPY(ShopItem)
diff --git a/src/shortcutbase.cpp b/src/shortcutbase.cpp
index 0b076b16b..8bb0b3a54 100644
--- a/src/shortcutbase.cpp
+++ b/src/shortcutbase.cpp
@@ -31,12 +31,12 @@ ShortcutBase::ShortcutBase(const std::string &itemName,
                            const std::string &colorName,
                            const int maxSize) :
     mItems(new int[maxSize]),
-    mItemColors(new unsigned char[maxSize]),
+    mItemColors(new ItemColor[maxSize]),
     mItemName(itemName),
     mColorName(colorName),
     mItemSelected(-1),
     mMaxSize(maxSize),
-    mItemColorSelected(1)
+    mItemColorSelected(ItemColor_one)
 {
     clear(false);
     load();
@@ -61,8 +61,9 @@ void ShortcutBase::load(const bool oldConfig)
     for (int i = 0; i < mMaxSize; i++)
     {
         const int itemId = cfg->getValue(mItemName + toString(i), -1);
-        const unsigned char itemColor = static_cast<const unsigned char>(
-            cfg->getValue(mColorName + toString(i), -1));
+        const ItemColor itemColor = fromInt(
+            cfg->getValue(mColorName + toString(i), -1),
+            ItemColor);
 
         if (itemId != -1)
         {
@@ -77,7 +78,8 @@ void ShortcutBase::save() const
     for (int i = 0; i < mMaxSize; i++)
     {
         const int itemId = mItems[i] ? mItems[i] : -1;
-        const int itemColor = mItemColors[i] ? mItemColors[i] : 1;
+        const int itemColor = (mItemColors[i] != ItemColor_zero)
+            ? toInt(mItemColors[i], int) : 1;
         if (itemId != -1)
         {
             serverConfig.setValue(mItemName + toString(i), itemId);
@@ -101,7 +103,7 @@ void ShortcutBase::setItemSelected(const Item *const item)
     else
     {
         mItemSelected = -1;
-        mItemColorSelected = 1;
+        mItemColorSelected = ItemColor_one;
     }
 }
 
@@ -120,7 +122,7 @@ void ShortcutBase::clear(const bool isSave)
     for (int i = 0; i < mMaxSize; i++)
     {
         mItems[i] = -1;
-        mItemColors[i] = 1;
+        mItemColors[i] = ItemColor_one;
     }
     if (isSave)
         save();
diff --git a/src/shortcutbase.h b/src/shortcutbase.h
index e742b6b18..58520a8ad 100644
--- a/src/shortcutbase.h
+++ b/src/shortcutbase.h
@@ -23,6 +23,8 @@
 #ifndef SHORTCUTBASE_H
 #define SHORTCUTBASE_H
 
+#include "enums/simpletypes/itemcolor.h"
+
 #include <string>
 
 #include "localconsts.h"
@@ -67,7 +69,7 @@ class ShortcutBase notfinal
         int getItem(const int index) const A_WARN_UNUSED
         { return mItems[index]; }
 
-        unsigned char getItemColor(const int index) const A_WARN_UNUSED
+        ItemColor getItemColor(const int index) const A_WARN_UNUSED
         { return mItemColors[index]; }
 
         /**
@@ -95,8 +97,9 @@ class ShortcutBase notfinal
          * @param index Index of the item.
          * @param itemId ID of the item.
          */
-        void setItems(const int index, const int itemId,
-                      const unsigned char color)
+        void setItems(const int index,
+                      const int itemId,
+                      const ItemColor color)
         { mItems[index] = itemId; mItemColors[index] = color; save(); }
 
         /**
@@ -125,12 +128,12 @@ class ShortcutBase notfinal
 
     private:
         int *mItems A_NONNULLPOINTER;
-        unsigned char *mItemColors A_NONNULLPOINTER;
+        ItemColor *mItemColors A_NONNULLPOINTER;
         std::string mItemName;
         std::string mColorName;
         int mItemSelected;
         int mMaxSize;
-        unsigned char mItemColorSelected;
+        ItemColor mItemColorSelected;
 };
 
 #endif  // SHORTCUTBASE_H
-- 
cgit v1.2.3-70-g09d2