#ifndef GLOBALS_HPP_INCLUDED
#define GLOBALS_HPP_INCLUDED

#include <vector>
#include <cstdint>
#include <map>

namespace Globals
{
    typedef struct SettingsDef
    {
        std::int32_t Index = -1;
        std::int32_t BitPos = -1;
        std::int32_t BitMask = -1;
    } SettingsDef;

    typedef struct WidgetDef
    {
        std::int32_t Parent = -1;
        std::int32_t Child = -1;
        std::int32_t Grandchild = -1;
    } WidgetDef;

    const SettingsDef SETTING_COMBAT_SPECIAL               = { 300 };
    const SettingsDef SETTING_COMBAT_SPECIAL_TOGGLE        = { 301 };
    const SettingsDef SETTING_COMBAT_AUTO_RETALIATE        = { 172 };
    const SettingsDef SETTING_COMBAT_POISON                = { 102 };
    const SettingsDef SETTING_WEAPON_STYLES                = { 43 }; // How many styles the current weapon has
    const SettingsDef SETTING_ACCEPT_AID                   = { 427 }; // 13 = on
    const SettingsDef SETTING_RUN_MODE                     = { 173 }; // 1 = running
    const SettingsDef SETTING_CURRENT_PRAYER               = { 83 }; // To be used with PrayerDefs
    const SettingsDef SETTING_BANK_WITHDRAW_MODE           = { 115, 0 };
    const SettingsDef SETTING_BANK_WITHDRAW_MODE_WIDGET    = { 1666 }; // Which Widget is selected, 0 = 1, 4 = 5, 8 = 10, 12 = X, 16 = ALL
    const SettingsDef SETTING_BANK_DEFAULT_QUANTITY        = { 304 }; // Seems to be the value / 2, so if it returns 50, then the default custom quantity is 25
    const SettingsDef SETTING_EXCHANGE_CURRENT_SLOT_INDEX          = { 375 };
    const SettingsDef SETTING_EXCHANGE_CURRENT_SLOT_ITEM_ID        = { 1151 };
    const SettingsDef SETTING_EXCHANGE_CURRENT_SLOT_ITEM_AMOUNT    = { 563 };
    const SettingsDef SETTING_EXCHANGE_CURRENT_SLOT_PRICE          = { 1043 };
    const SettingsDef SETTING_ESC_TO_CLOSE         = { 1224, 31 };
    const SettingsDef SETTING_SHIFT_CLICK_DROP     = { 1055, 17 };
    const SettingsDef SETTING_SCROLL_WHEEL_TO_ZOOM = { 1055, 29 };

    const SettingsDef SETTING_COMBAT_TAB_HOTKEY         = { 1224, 0 };
    const SettingsDef SETTING_STATS_TAB_HOTKEY          = { 1224, 5 };
    const SettingsDef SETTING_QUESTS_TAB_HOTKEY         = { 1224, 10 };
    const SettingsDef SETTING_INVENTORY_TAB_HOTKEY      = { 1224, 15 };
    const SettingsDef SETTING_EQUIPMENT_TAB_HOTKEY      = { 1224, 20 };
    const SettingsDef SETTING_PRAYER_TAB_HOTKEY         = { 1224, 25 };
    const SettingsDef SETTING_MAGIC_TAB_HOTKEY          = { 1225, 0 };
    const SettingsDef SETTING_CLAN_TAB_HOTKEY           = { 1225, 5 };
    const SettingsDef SETTING_FRIENDS_TAB_HOTKEY        = { 1225, 10 };
    const SettingsDef SETTING_ACCOUNT_TAB_HOTKEY        = { 1225, 15 };
    const SettingsDef SETTING_OPTIONS_TAB_HOTKEY        = { 1225, 20 };
    const SettingsDef SETTING_EMOTE_TAB_HOTKEY          = { 1225, 25 };
    const SettingsDef SETTING_MUSIC_TAB_HOTKEY          = { 1226, 0 };
    const SettingsDef SETTING_LOGOUT_TAB_HOTKEY         = { 1226, 5 };

    const std::int32_t WIDGET_ROOT_LOBBY                   = 165;
    const std::int32_t WIDGET_ROOT_FIXED                   = 548;
    const std::int32_t WIDGET_ROOT_RESIZABLE               = 161;
    const std::int32_t WIDGET_ROOT_RESIZABLE_SIDE_PANELS   = 164;

    //************ Bank.cpp ************//
    const std::int32_t BANK_ITEM_CONTAINER_ID       = 95;
    const std::int32_t BANK_SPRITE_ID_CURRENT_TAB   = 1079;
    const std::int32_t BANK_PARENT                  = 12;

    const WidgetDef BANK_MAIN                               = { BANK_PARENT, 2 };
    const WidgetDef BANK_CLOSE                              = { BANK_PARENT, 2, 11 };

    const WidgetDef BANK_TABS_CONTAINER                     = { BANK_PARENT, 11 }; // Has all Tab children
    const WidgetDef BANK_ITEM_CONTAINER_WIDGET              = { BANK_PARENT, 13 }; // Used for scrolling, contains all items, middle of the bank interface

    const WidgetDef BANK_REARRANGE_MODE_SWAP                = { BANK_PARENT, 17 };
    const WidgetDef BANK_REARRANGE_MODE_INSERT              = { BANK_PARENT, 19 };
    const WidgetDef BANK_WITHDRAW_MODE_ITEM                 = { BANK_PARENT, 22 };
    const WidgetDef BANK_WITHDRAW_MODE_NOTED                = { BANK_PARENT, 24 };
    const std::int32_t BANK_WITHDRAW_QUANTITY_CHILDREN[5]   = { 28, 30, 32, 34, 36 }; // 1, 5, 10, x, all, uses BANK_PARENT
    const WidgetDef BANK_SET_PLACEHOLDERS                   = { BANK_PARENT, 39 };
    const WidgetDef BANK_SEARCH                             = { BANK_PARENT, 41 };
    const WidgetDef BANK_DEPOSIT_ALL                        = { BANK_PARENT, 43 };
    const WidgetDef BANK_DEPOSIT_EQUIPMENT                  = { BANK_PARENT, 45 };

    const WidgetDef BANK_INVENTORY                          = { 15, 3 }; // When the bank is open, the Inventory has it's own widgets for items

    const std::int32_t BANK_ENTER_PIN_PARENT               = 213;
    const WidgetDef BANK_ENTER_PIN_STATUS                  = { BANK_ENTER_PIN_PARENT, 10 }; // Text widget, has FIRST, SECOND, THIRD, FOURTH, Submitting in it
    const std::int32_t BANK_ENTER_PIN_BUTTON_CHILDREN[10]  = { 16, 18, 20, 22, 24, 26, 28, 30, 32, 34 }; // Buttons themselves, uses BANK_ENTER_PIN_PARENT,

    // grandchild 0 = proper widget bounds, grandchild 1 = text

    //************ Chat.cpp ************//
    const WidgetDef CHAT_DIALOGUE_NEST_PARENT   = { 162, 34 };
    const WidgetDef CHAT_DIALOGUE_IDLE          = { 162, 54 };

    //************ CollectionBox.cpp ************//
    const std::int32_t COLLECTION_BOX_PARENT            = 402;
    const WidgetDef    COLLECTION_BOX_MAIN              = {COLLECTION_BOX_PARENT, 2, 0};
    const WidgetDef    COLLECTION_BOX_CLOSE             = {COLLECTION_BOX_PARENT, 2, 11};
    const WidgetDef    COLLECTION_BOX_COLLECT_TO_BANK   = {COLLECTION_BOX_PARENT, 4, 1};
    const WidgetDef    COLLECTION_BOX_COLLECT_TO_INV    = {COLLECTION_BOX_PARENT, 3, 1};

    //************ DepositBox.cpp ************//
    const std::int32_t DEPOSIT_BOX_PARENT          = 192;
    const WidgetDef DEPOSIT_BOX_CLOSE              = { DEPOSIT_BOX_PARENT, 1, 11 };
    const WidgetDef DEPOSIT_BOX_DEPOSIT_ALL        = { DEPOSIT_BOX_PARENT, 4 };
    const WidgetDef DEPOSIT_BOX_DEPOSIT_EQUIPMENT  = { DEPOSIT_BOX_PARENT, 6 };
    const WidgetDef DEPOSIT_BOX_DEPOSIT_LOOT       = { DEPOSIT_BOX_PARENT, 8 };

    //************ Exchange.cpp ************//
    const std::int32_t EXCHANGE_PARENT                 = 465;
    const WidgetDef EXCHANGE_MAIN                      = { EXCHANGE_PARENT, 0 };
    const WidgetDef EXCHANGE_BACK                      = { EXCHANGE_PARENT, 4 };
    const WidgetDef EXCHANGE_CLOSE                     = { EXCHANGE_PARENT, 2, 11 };
    const WidgetDef EXCHANGE_SPRITE_TYPE               = { EXCHANGE_PARENT, 24, 19};
    const WidgetDef EXCHANGE_ITEM                      = { EXCHANGE_PARENT, 24, 21 };
    const WidgetDef EXCHANGE_COLLECT_CONTAINER_WIDGET  = { EXCHANGE_PARENT, 6, 1 };
    const WidgetDef EXCHANGE_COLLECT_SLOT_ONE          = { EXCHANGE_PARENT, 23, 2 };
    const WidgetDef EXCHANGE_COLLECT_SLOT_TWO          = { EXCHANGE_PARENT, 23, 3 };
    const WidgetDef EXCHANGE_AMOUNT                    = { EXCHANGE_PARENT, 24, 7 };
    const WidgetDef EXCHANGE_PRICE                     = { EXCHANGE_PARENT, 24, 12 };
    const WidgetDef EXCHANGE_GUIDE                     = { EXCHANGE_PARENT, 24, 11};
    const WidgetDef EXCHANGE_CONFIRM                   = { EXCHANGE_PARENT, 27, 0 };
    const WidgetDef EXCHANGE_ABORT                     = { EXCHANGE_PARENT, 22, 0 };

    const WidgetDef EXCHANGE_CHAT                      = { 162, 44 };
    const WidgetDef EXCHANGE_CHAT_ENTER                = { 162, 45 };
    const WidgetDef EXCHANGE_CHAT_CHOOSE               = { 162, 53 };

    const std::int32_t EXCHANGE_SLOT_START         = 7;
    const std::int32_t EXCHANGE_WIDGET_SPRITE_BUY  = 26; // Widget Grandchild
    const std::int32_t EXCHANGE_WIDGET_SPRITE_SELL = EXCHANGE_WIDGET_SPRITE_BUY + 1; // Widget Grandchild

    const std::int32_t EXCHANGE_SPRITE_BUY         = 1108;
    const std::int32_t EXCHANGE_SPRITE_SELL        = 1106;
    const std::int32_t EXCHANGE_SPRITE_MINI_BUY    = 1118;
    const std::int32_t EXCHANGE_SPRITE_MINI_SELL   = 1119;

    //************ Login.cpp ************//
    const WidgetDef LOGIN_LOBBY_PLAY = { 378, 78 };

    //************ Makescreen.cpp ************//
    const std::int32_t MAKESCREEN_PARENT           = 270;
    const WidgetDef MAKESCREEN_MAKE_ONE            = { MAKESCREEN_PARENT, 7, 0 }; // 0 is for the sprite
    const WidgetDef MAKESCREEN_MAKE_FIVE           = { MAKESCREEN_PARENT, 8, 0 }; // 0 is for the sprite
    const WidgetDef MAKESCREEN_MAKE_TEN            = { MAKESCREEN_PARENT, 9, 0 }; // 0 is for the sprite
    const WidgetDef MAKESCREEN_MAKE_CUSTOM         = { MAKESCREEN_PARENT, 10, 0 }; // 0 is for the sprite
    const WidgetDef MAKESCREEN_MAKE_CUSTOM_TEXT    = { MAKESCREEN_PARENT, 10, 9 };
    const WidgetDef MAKESCREEN_MAKE_X              = { MAKESCREEN_PARENT, 11 };
    const WidgetDef MAKESCREEN_MAKE_ALL            = { MAKESCREEN_PARENT, 12, 0 }; // 0 is for the sprite
    const WidgetDef MAKESCREEN_MAKE_MIDDLE         = { MAKESCREEN_PARENT, 14 };

    //************ Minimap.cpp ************//
    // 0 - Fixed; 1 - Resizable; 2 - Resizable + Side Panels
    const WidgetDef MINIMAP_MIDDLE[3]      = { { WIDGET_ROOT_FIXED, 21 }, { WIDGET_ROOT_RESIZABLE, 29 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 29 } };
    const WidgetDef MINIMAP_COMPASS[3]     = { { WIDGET_ROOT_FIXED, 23 }, { WIDGET_ROOT_RESIZABLE, 28 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 28 } };
    const WidgetDef MINIMAP_CURE           = { 160, 4 };
    const WidgetDef MINIMAP_QUICK_PRAYER   = { 160, 15 };
    const WidgetDef MINIMAP_TOGGLE_RUN     = { 160, 23 };
    const WidgetDef MINIMAP_SPECIAL_ATTACK = { 160, 31 };

    //************ Trade.cpp ************//
    const WidgetDef TRADE_SCREEN                           = { 335, 3 };
    const std::int32_t TRADE_ITEM_CONTAINER_MY_OFFER       = 90;
    const std::int32_t TRADE_ITEM_CONTAINER_THEIR_OFFER    = 32858;

    //************ Item.cpp ************//
    const std::int32_t EQUIPMENT_ITEM_CONTAINER_WIDGET = 387; // Item container parent, (Index + 6)

    //************ RandomHandler.cpp ************//
    const std::vector<std::string> RANDOM_NPC_NAMES =
    {   "Bee keeper",
        "Capt' Arnav",
        "Niles",
        "Miles",
        "Giles",
        "Sergeant Damien",
        "Drunken Dwarf",
        "Freaky Forester",
        "Frog",
        "Prince",
        "Princess",
        "Genie",
        "Evil Bob",
        "Postie Pete",
        "Molly",
        "Leo",
        "Dr. Jekyll",
        "Dr Jekyll",
        "Mr. Hyde",
        "Mysterious Old Man",
        "Mime",
        "Pillory Guard",
        "Flippa",
        "Tilt",
        "Prison Pete",
        "Quiz Master",
        "Rick Turpentine",
        "Sandwich lady",
        "Strange plant",
        "Dunce",
    };

    namespace GameTabs
    {
        //************************************ Tabs ************************************//
        // These are the "Sprite" widgets, these widgets' sprite IDs change when opened or closed (usually the lower number)
        // 0 - Fixed; 1 - Resizable; 2 - Resizable + Side Panels

        const WidgetDef TAB_CLAN[3]               = { { WIDGET_ROOT_FIXED, 46 }, { WIDGET_ROOT_RESIZABLE, 42 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 37 } };
        const WidgetDef TAB_ACCOUNT_MANAGEMENT[3] = { { WIDGET_ROOT_FIXED, 47 }, { WIDGET_ROOT_RESIZABLE, 43 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 38 } };
        const WidgetDef TAB_IGNORES[3]            = { { WIDGET_ROOT_FIXED, 48 }, { WIDGET_ROOT_RESIZABLE, 44 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 39 } };
        const WidgetDef TAB_FRIENDS[3]            = { { WIDGET_ROOT_FIXED, 48 }, { WIDGET_ROOT_RESIZABLE, 44 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 39 } };
        const WidgetDef TAB_LOGOUT[3]             = { { WIDGET_ROOT_FIXED, 49 }, { WIDGET_ROOT_RESIZABLE, 45 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 33 } };
        const WidgetDef TAB_OPTIONS[3]            = { { WIDGET_ROOT_FIXED, 50 }, { WIDGET_ROOT_RESIZABLE, 46 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 40 } };
        const WidgetDef TAB_EMOTES[3]             = { { WIDGET_ROOT_FIXED, 51 }, { WIDGET_ROOT_RESIZABLE, 47 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 41 } };
        const WidgetDef TAB_MUSIC[3]              = { { WIDGET_ROOT_FIXED, 52 }, { WIDGET_ROOT_RESIZABLE, 48 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 42 } };

        const WidgetDef TAB_COMBAT[3]             = { { WIDGET_ROOT_FIXED, 62 }, { WIDGET_ROOT_RESIZABLE, 58 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 51 } };
        const WidgetDef TAB_STATS[3]              = { { WIDGET_ROOT_FIXED, 63 }, { WIDGET_ROOT_RESIZABLE, 59 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 52 } };
        const WidgetDef TAB_QUESTS[3]             = { { WIDGET_ROOT_FIXED, 64 }, { WIDGET_ROOT_RESIZABLE, 60 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 53 } };
        const WidgetDef TAB_INVENTORY[3]          = { { WIDGET_ROOT_FIXED, 65 }, { WIDGET_ROOT_RESIZABLE, 61 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 54 } };
        const WidgetDef TAB_EQUIPMENT[3]          = { { WIDGET_ROOT_FIXED, 66 }, { WIDGET_ROOT_RESIZABLE, 62 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 55 } };
        const WidgetDef TAB_PRAYER[3]             = { { WIDGET_ROOT_FIXED, 67 }, { WIDGET_ROOT_RESIZABLE, 63 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 56 } };
        const WidgetDef TAB_MAGIC[3]              = { { WIDGET_ROOT_FIXED, 68 }, { WIDGET_ROOT_RESIZABLE, 64 }, { WIDGET_ROOT_RESIZABLE_SIDE_PANELS, 57 } };


        //************ Combat.cpp ************//
        const std::int32_t COMBAT_PARENT              = 593;
        const WidgetDef COMBAT_AUTORETALIATE          = { COMBAT_PARENT, 34 };
        const WidgetDef COMBAT_SPECIAL                = { COMBAT_PARENT, 40 };
        const std::int32_t COMBAT_STYLE_CHILDREN[4]   = { 4, 8, 12, 16 }; // Uses COMBAT_PARENT as Parent BROKEN

        //************ Equipment.cpp ************//
        const std::int32_t EQUIPMENT_CONTAINER_ID = 94;

        //************ Inventory.cpp ************//
        const WidgetDef INVENTORY_ITEM_CONTAINER_WIDGET       = { 149, 0 };
        const WidgetDef INVENTORY_TRADE_CONTAINER_WIDGET      = { 336, 0 }; // Used for GetSlotBoxes()
        const WidgetDef INVENTORY_EXCHANGE_CONTAINER_WIDGET   = { 467, 0 }; // Used for GetSlotBoxes()
        const std::int32_t INVENTORY_CONTAINER_ID       = 93;

        //************ Logout.cpp ************//
        const std::int32_t LOGOUT_BUTTONS_PARENT       = 182;
        const WidgetDef LOGOUT_LOGOUT_BUTTON           = { LOGOUT_BUTTONS_PARENT, 12 };
        const WidgetDef LOGOUT_WORLD_SWITCHER_BUTTON   = { LOGOUT_BUTTONS_PARENT, 7 };
        const std::int32_t LOGOUT_WORLD_SWITCHER_PARENT            = 69;
        const WidgetDef LOGOUT_WORLD_SWITCHER_TITLE                = { LOGOUT_WORLD_SWITCHER_PARENT, 2 }; // "Current World:" or "Loading" when loading
        const WidgetDef LOGOUT_WORLD_SWITCHER_LOGOUT               = { LOGOUT_WORLD_SWITCHER_PARENT, 23 }; // Logout button inside the World Switch interface
        const WidgetDef LOGOUT_WORLD_SWITCHER_WORLDS_CONTAINER     = { LOGOUT_WORLD_SWITCHER_PARENT, 16 }; // 69, 15, 301 (world id) Widget has the proper switch/favorite options
        const WidgetDef LOGOUT_WORLD_SWITCHER_WORLDS_BOX           = { LOGOUT_WORLD_SWITCHER_PARENT, 5 }; // Bounds/Box containing the entire list

        //************ Magic.cpp ************//
        const std::int32_t MAGIC_SPELLS_PARENT = 218; // Used with Magic spell defs

        typedef struct SpellDef
        {
            std::string Name;
            std::int32_t WidgetID;
            std::int32_t SpriteID;
            std::int32_t Level;
        } SpellDef;

        const std::vector<SpellDef> SpellDefs = // To be used with Magic:: SPELL enum
        {
            // Normal,
            { "Lumbridge Home Teleport", 6, 356, 0 },
            { "Wind Strike", 7, 65, 1 },
            { "Confuse", 8, 66, 3 },
            { "Enchant Crossbow Bolt", 9, 358, 0 },
            { "Water Strike", 10, 67, 5 },
            { "Lvl-1 Enchant", 11, 68, 7 },
            { "Earth Strike", 12, 69, 9 },
            { "Weaken", 13, 70, 11 },
            { "Fire Strike", 14, 71, 13 },
            { "Bones to Bananas", 15, 72, 15 },
            { "Wind Bolt", 16, 73, 17 },
            { "Curse", 17, 74, 19 },
            { "Bind", 18, 369, 20 },
            { "Low Level Alchemy", 19, 75, 21 },
            { "Water Bolt", 20, 76, 23 },
            { "Varrock Teleport", 21, 77, 25 },
            { "Lvl-2 Enchant", 22, 78, 27 },
            { "Earth Bolt", 23, 79, 29 },
            { "Lumbridge Teleport", 24, 80, 31 },
            { "Telekinetic Grab", 25, 81, 33 },
            { "Fire Bolt", 26, 82, 35 },
            { "Falador Teleport", 27, 83, 37 },
            { "Crumble Undead", 28, 84, 39 },
            { "Teleport to House", 29, 405, 40 },
            { "Wind Blast", 30, 85, 41 },
            { "Superheat Item", 31, 86, 43 },
            { "Camelot Teleport", 32, 87, 45 },
            { "Water Blast", 33, 88, 47 },
            { "Lvl-3 Enchant", 34, 89, 49 },
            { "Iban Blast", 35, 103, 50 },
            { "Snare", 36, 370, 50 },
            { "Magic Dart", 37, 374, 50 },
            { "Ardougne Teleport", 38, 104, 51 },
            { "Earth Blast", 39, 90, 53 },
            { "High Level Alchemy", 40, 91, 55 },
            { "Charge Water Orb", 41, 92, 56 },
            { "Lvl-4 Enchant", 42, 93, 57 },
            { "Watchtower Teleport", 43, 105, 58 },
            { "Fire Blast", 44, 94, 59 },
            { "Charge Earth Orb", 45, 95, 60 },
            { "Bones to Peaches", 46, 404, 60 },
            { "Saradomin strike", 47, 111, 60 },
            { "Claws of Guthix", 48, 110, 60 },
            { "Flames of Zamorak", 49, 109, 60 },
            { "Trollheim Teleport", 50, 373, 61 },
            { "Wind Wave", 51, 96, 62 },
            { "Charge Fire Orb", 52, 97, 63 },
            { "Teleport to Ape Atoll", 53, 407, 64 },
            { "Water Wave", 54, 98, 65 },
            { "Charge Air Orb", 55, 99, 66 },
            { "Vulnerability", 56, 106, 66 },
            { "Lvl-5 Enchant", 57, 100, 68 },
            { "Teleport to Kourend", 58, 410, 69 },
            { "Earth Wave", 59, 101, 70 },
            { "Enfeeble", 60, 107, 73 },
            { "Teleother Lumbridge", 61, 399, 74 },
            { "Fire Wave", 62, 102, 75 },
            { "Entangle", 63, 371, 79 },
            { "Stun", 64, 108, 80 },
            { "Charge", 65, 372, 80 },
            { "Wind Surge", 66, 412, 81 },
            { "Teleother Falador", 67, 400, 82 },
            { "Water Surge", 68, 413, 85 },
            { "Tele Block", 69, 402, 85 },
            { "Teleport to Bounty Target", 70, 409, 85 },
            { "Lvl-6 Enchant", 71, 403, 87 },
            { "Teleother Camelot", 72, 401, 90 },
            { "Earth Surge", 73, 414, 90 },
            { "Lvl-7 Enchant", 74, 411, 93 },
            { "Fire Surge", 75, 415, 95 },

            //Lunar 70-114
            { "Lunar Home Teleport", 101, 356, 0 },
            { "Bake Pie", 102, 543, 65 },
            { "Geomancy", 142, 613, 65 },
            { "Cure Plant", 103, 617, 66 },
            { "Monster Examine", 104, 627, 66 },
            { "NPC Contact", 105, 618, 67 },
            { "Cure Other", 106, 609, 68 },
            { "Humidify", 107, 578, 69 },
            { "Moonclan Teleport", 108, 594, 69 },
            { "Tele Group Moonclan", 109, 619, 70 },
            { "Cure Me", 110, 612, 71 },
            { "Ourania Teleport", 144, 636, 71 },
            { "Hunter Kit", 111, 629, 71 },
            { "Waterbirth Teleport", 112, 595, 72 },
            { "Tele Group Waterbirth", 113, 620, 73 },
            { "Cure Group", 114, 615, 74 },
            { "Stat Spy", 115, 626, 75 },
            { "Barbarian Teleport", 116, 597, 75 },
            { "Tele Group Barbarian", 117, 621, 76 },
            { "Spin Flax", 143, 635, 76 },
            { "Superglass Make", 118, 598, 77 },
            { "Tan Leather", 119, 633, 78 },
            { "Khazard Teleport", 120, 599, 78 },
            { "Tele Group Khazard", 121, 622, 79 },
            { "Dream", 122, 630, 79 },
            { "String Jewellery", 123, 600, 80 },
            { "Stat Restore Pot Share", 124, 604, 81 },
            { "Magic Imbue", 125, 602, 82 },
            { "Fertile Soil", 126, 603, 83 },
            { "Boost Potion Share", 127, 601, 84 },
            { "Fishing Guild Teleport", 128, 605, 85 },
            { "Teleport to Bounty Target", 70, 409, 85 },
            { "Tele Group Fishing Guild", 129, 623, 86 },
            { "Plank Make", 130, 631, 86 },
            { "Catherby Teleport", 131, 606, 87 },
            { "Tele Group Catherby", 132, 624, 88 },
            { "Recharge Dragonstone", 133, 634, 89 },
            { "Ice Plateau Teleport", 134, 607, 89 },
            { "Tele Group Ice Plateau", 135, 625, 90 },
            { "Energy Transfer", 136, 608, 91 },
            { "Heal Other", 137, 610, 92 },
            { "Vengeance Other", 138, 611, 93 },
            { "Vengeance", 139, 614, 94 },
            { "Heal Group", 140, 616, 95 },
            { "Spellbook Swap", 141, 632, 96 },

            //Ancients 115-140
            { "Ice Rush", 76, 375, 58 },
            { "Ice Blitz", 77, 377, 84 },
            { "Ice Burst", 78, 376, 70 },
            { "Ice Barrage", 79, 378, 94 },

            { "Blood Rush", 80, 383, 56 },
            { "Blood Blitz", 81, 385, 80 },
            { "Blood Burst", 82, 384, 68 },
            { "Blood Barrage", 83, 386, 92 },

            { "Smoke Rush", 84, 379, 50 },
            { "Smoke Blitz", 85, 381, 74 },
            { "Smoke Burst", 86, 380, 62 },
            { "Smoke Barrage", 87, 382, 86 },

            { "Shadow Rush", 88, 387, 52 },
            { "Shadow Blitz", 89, 389, 76 },
            { "Shadow Burst", 90, 388, 64 },
            { "Shadow Barrage", 91, 390, 88 },

            { "Paddewwa Teleport", 92, 391, 54 },
            { "Senntisten Teleport", 93, 392, 60 },
            { "Kharyrll Teleport", 94, 393, 66 },
            { "Lassar Teleport", 95, 394, 72 },
            { "Dareeyak Teleport", 96, 395, 78 },
            { "Carrallangar Teleport", 97, 396, 84 },
            { "Annakarl Teleport", 98, 397, 90 },
            { "Ghorrock Teleport", 99, 398, 96 },
            { "Teleport to Target", 70, 409, 85 },
            { "Edgeville Home Teleport", 100, 356, 0 },

            // Arceuus 141-177
            { "Arceuus Home Teleport", 145, 1251, 0 },
            { "Basic Reanimation", 146, 1272, 16 },
            { "Arceuus Library Teleport", 147, 1277, 6 },
            { "Adept Reanimation", 148, 1273, 41 },
            { "Expert Reanimation", 149, 1274, 72 },
            { "Master Reanimation", 150, 1275, 90 },
            { "Draynor Manor Teleport", 151, 1278, 17 },
            { "Mind Altar Teleport", 153, 1281, 28 },
            { "Respawn Teleport", 154, 1282, 34 },
            { "Salve Graveyard Teleport", 155, 1283, 40 },
            { "Fenkenstrain's Castle Teleport", 156, 1284, 48 },
            { "West Ardougne Teleport", 157, 1285, 61 },
            { "Harmony Island Teleport", 158, 1286, 65 },
            { "Cemetery Teleport", 159, 1289, 71 },
            { "Resurrect Crops", 160, 1291, 78 },
            { "Barrows Teleport", 161, 1287, 83 },
            { "Ape Atoll Teleport", 162, 1288, 90 },
            { "Battlefront Teleport", 163, 1280, 23 },
            { "Inferior Demonbane", 164, 1321, 44 },
            { "Superior Demonbane", 165, 1322, 62 },
            { "Dark Demonbane", 166, 1323, 82 },
            { "Mark of Darkness", 167, 1324, 59 },
            { "Ghostly Grasp", 168, 1292, 35 },
            { "Skeletal Grasp", 169, 1293, 56 },
            { "Undead Grasp", 170, 1294, 79 },
            { "Ward of Arceuus", 171, 1325, 73 },
            { "Lesser Corruption", 172, 1326, 64 },
            { "Greater Corruption", 173, 1327, 85 },
            { "Demonic Offering", 174, 1330, 84 },
            { "Sinister Offering", 175, 1331, 92 },
            { "Degrime", 176, 1337, 70 },
            { "Shadow Veil", 177, 1334, 47 },
            { "Vile Vigour", 178, 1336, 66 },
            { "Dark Lure", 179, 1335, 50 },
            { "Death Charge", 180, 1329, 80 },
            { "Resurrect Lesser Ghost", 181, 1295, 38 },
            { "Resurrect Lesser Skeleton", 182, 1296, 38 },
            { "Resurrect Lesser Zombie", 183, 1319, 38 },
            { "Resurrect Superior Ghost", 184, 2985, 57 },
            { "Resurrect Superior Skeleton", 185, 2987, 57 },
            { "Resurrect Superior Zombie", 186, 2989, 57 },
            { "Resurrect Greater Ghost", 187, 2986, 76 },
            { "Resurrect Greater Skeleton", 188, 2988, 76 },
            { "Resurrect Greater Zombie", 189, 2990, 76 }
        };

        //************ Options.cpp ************//
        const std::int32_t OPTIONS_PARENT  = 116;
        const WidgetDef OPTIONS_ACCEPT_AID = { OPTIONS_PARENT, 70 };
        const WidgetDef OPTIONS_RUN_MODE   = { OPTIONS_PARENT, 71 };

        //************ Prayer.cpp ************//
        const std::int32_t PRAYER_PRAYERS_PARENT = 541; // To be used with PrayerDefs

        typedef struct PrayerDef
        {
            std::string Name;
            std::int32_t BitPos;
            std::int32_t WidgetID;
            std::int32_t SpriteID;
            std::int32_t Level;
        } PrayerDef;

        static std::vector<PrayerDef> PrayerDefs = // To be used with Prayer:: PRAYERS enum
        {
            { "Thick Skin", 0, 5, 115, 1 },
            { "Burst of Strength", 1, 6, 116, 4 },
            { "Clarity of Thought", 2, 7, 117, 7 },
            { "Sharp Eye", 18, 23, 133, 8 },
            { "Mystic Will", 19, 24, 134, 9 },
            { "Rock Skin", 3, 8, 118, 10 },
            { "Superhuman Strength", 4, 9, 119, 13 },
            { "Improved Reflexes", 5, 10, 120, 16 },
            { "Rapid Restore", 6, 11, 121, 19 },
            { "Rapid Heal", 7, 12, 122, 22 },
            { "Protect Item", 8, 13, 123, 25 },
            { "Hawk Eye", 20, 25, 502, 26 },
            { "Mystic Lore", 21, 26, 503, 27 },
            { "Steel Skin", 9, 14, 124, 28 },
            { "Ultimate Strength", 10, 15, 125, 31 },
            { "Incredible Reflexes", 11, 16, 126, 34 },
            { "Protect from Magic", 12, 17, 127, 37 },
            { "Protect from Missiles", 13, 18, 128, 40 },
            { "Protect from Melee", 14, 19, 129, 43 },
            { "Eagle Eye", 22, 27, 504, 44 },
            { "Mystic Might", 23, 28, 505, 45 },
            { "Retribution", 15, 20, 131, 46 },
            { "Redemption", 16, 21, 130, 49 },
            { "Smite", 17, 22, 132, 52 },
            { "Preserve", 28, 33, 947, 55 },
            { "Chivalry", 25, 29, 945, 60 },
            { "Piety", 26, 30, 946, 70 },
            { "Rigour", 24, 31, 1420, 74 },
            { "Augury", 27, 32, 1421, 77 }
        };
    }
}

#endif // GLOBALS_HPP_INCLUDED
