# pragma region License
/*
License ( OLC - 3 )
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
Copyright 2024 Joshua Sigona < sigonasr2 @ gmail . com >
Redistribution and use in source and binary forms , with or without modification ,
are permitted provided that the following conditions are met :
1. Redistributions or derivations of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2. Redistributions or derivative works in binary form must reproduce the above
copyright notice . This list of conditions and the following disclaimer must be
reproduced in the documentation and / or other materials provided with the distribution .
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without specific
prior written permission .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS " AND ANY
EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT ,
INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED
TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR
BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN
CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE .
Portions of this software are copyright © 2024 The FreeType
Project ( www . freetype . org ) . Please see LICENSE_FT . txt for more information .
All rights reserved .
*/
# pragma endregion
# include "Menu.h"
# include "AdventuresInLestoria.h"
# include "AccessoryRowItemDisplay.h"
# include "RowInventoryScrollableWindowComponent.h"
# include "MenuItemItemButton.h"
# include "MenuComponent.h"
# include "PlayerMoneyLabel.h"
# include "ItemMenuLabel.h"
# include "SoundEffect.h"
INCLUDE_game
INCLUDE_ITEM_CATEGORIES
INCLUDE_DATA
INCLUDE_GFX
void Menu : : InitializeMerchantWindow ( ) {
Menu * merchantWindow = CreateMenu ( MERCHANT , CENTERED , game - > GetScreenSize ( ) - vi2d { 52 , 52 } ) ;
static std : : string lastInventoryTypeOpened = " " ;
auto GetSortedCategories = [ ] ( ) {
std : : vector < std : : pair < std : : string , int > > categories ;
for ( auto & [ category , items ] : ITEM_CATEGORIES ) {
if ( DATA [ " ItemCategory " ] [ category ] . GetString ( 0 ) = = " !HIDE " ) continue ; //This category is meant to be hidden!
categories . push_back ( { category , DATA [ " ItemCategory " ] [ category ] . GetInt ( 0 ) } ) ; //We assume the first value becomes the sort order we wish to use.
}
std : : sort ( categories . begin ( ) , categories . end ( ) , [ ] ( std : : pair < std : : string , int > & cat1 , std : : pair < std : : string , int > & cat2 ) { return cat1 . second < cat2 . second ; } ) ;
return categories ;
} ;
std : : vector < std : : pair < std : : string , int > > categories = GetSortedCategories ( ) ;
auto buyTab = merchantWindow - > ADD ( " Buy Tab " , MenuComponent ) ( geom2d : : rect < float > { { 2 , 0 } , { merchantWindow - > size . x / 2 - 4 , 24 } } , " Buy " , [ ] ( MenuFuncData data ) {
Component < RowInventoryScrollableWindowComponent > ( MERCHANT , " Merchant Inventory Display " ) - > Enable ( ) ;
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > selected = false ;
Component < MenuComponent > ( MERCHANT , " Inventory Tabs Outline " ) - > Disable ( ) ;
for ( auto & [ category , items ] : ITEM_CATEGORIES ) {
if ( DATA [ " ItemCategory " ] [ category ] . GetString ( 0 ) = = " !HIDE " ) continue ; //This category is meant to be hidden!
Component < MenuComponent > ( MERCHANT , category + " Inventory Tab " ) - > Disable ( ) ;
}
Component < RowInventoryScrollableWindowComponent > ( data . menu . GetType ( ) , " Inventory Display - " + data . menu . S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) - > Disable ( ) ;
Component < MenuComponent > ( data . menu . GetType ( ) , data . menu . S ( A : : LAST_INVENTORY_TYPE_OPENED ) + " Inventory Tab " ) - > Disable ( ) ;
data . component . lock ( ) - > selected = true ;
if ( Menu : : IsCurrentlyActive ( data . menu . GetType ( ) ) ) {
SoundEffect : : PlaySFX ( " Button Click " , SoundEffect : : CENTERED ) ;
}
return true ;
} ) END ;
buyTab - > selected = true ;
buyTab - > selectionType = SelectionType : : HIGHLIGHT ;
auto sellTab = merchantWindow - > ADD ( " Sell Tab " , MenuComponent ) ( geom2d : : rect < float > { { merchantWindow - > size . x / 2 + 2 , 0 } , { merchantWindow - > size . x / 2 - 4 , 24 } } , " Sell " , [ ] ( MenuFuncData data ) {
Component < RowInventoryScrollableWindowComponent > ( MERCHANT , " Merchant Inventory Display " ) - > Disable ( ) ;
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected = false ;
Component < MenuComponent > ( MERCHANT , " Inventory Tabs Outline " ) - > Enable ( ) ;
for ( auto & [ category , items ] : ITEM_CATEGORIES ) {
if ( DATA [ " ItemCategory " ] [ category ] . GetString ( 0 ) = = " !HIDE " ) continue ; //This category is meant to be hidden!
Component < MenuComponent > ( MERCHANT , category + " Inventory Tab " ) - > Enable ( ) ;
}
Component < RowInventoryScrollableWindowComponent > ( data . menu . GetType ( ) , " Inventory Display - " + data . menu . S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) - > Enable ( ) ;
Component < MenuComponent > ( data . menu . GetType ( ) , data . menu . S ( A : : LAST_INVENTORY_TYPE_OPENED ) + " Inventory Tab " ) - > Enable ( ) ;
data . component . lock ( ) - > selected = true ;
if ( Menu : : IsCurrentlyActive ( data . menu . GetType ( ) ) ) {
SoundEffect : : PlaySFX ( " Button Click " , SoundEffect : : CENTERED ) ;
}
return true ;
} ) END ;
sellTab - > selectionType = SelectionType : : HIGHLIGHT ;
merchantWindow - > I ( A : : ITEM_SLOT ) = 0 ;
auto inventoryDisplay = merchantWindow - > ADD ( " Merchant Inventory Display " , RowInventoryScrollableWindowComponent ) ( geom2d : : rect < float > { { 2 , 28 } , { 220 , merchantWindow - > size . y - 44 } } , " Item Name Label " , " Item Description Label " ,
[ ] ( MenuFuncData data ) {
std : : weak_ptr < RowItemDisplay > item = DYNAMIC_POINTER_CAST < RowItemDisplay > ( data . component . lock ( ) ) ;
int qty = 1 ;
int pricePerItem = item . lock ( ) - > GetItem ( ) . lock ( ) - > BuyValue ( ) ;
Component < MenuLabel > ( BUY_ITEM , " Item Purchase Header " ) - > S ( A : : ITEM_NAME ) = item . lock ( ) - > GetItem ( ) . lock ( ) - > ActualName ( ) ;
Component < MenuLabel > ( BUY_ITEM , " Price per item Amount Label " ) - > SetLabel ( std : : to_string ( pricePerItem ) ) ;
Component < MenuLabel > ( BUY_ITEM , " Amount to buy Amount Label " ) - > SetLabel ( " 1 " ) ;
Component < MenuLabel > ( BUY_ITEM , " Total Price Amount Label " ) - > SetLabel ( std : : to_string ( item . lock ( ) - > GetItem ( ) . lock ( ) - > BuyValue ( ) ) ) ;
Merchant & merchant = Merchant : : GetCurrentTravelingMerchant ( ) ;
bool canPurchase = merchant . CanPurchaseItem ( item . lock ( ) - > GetItem ( ) . lock ( ) - > ActualName ( ) , 1 ) ;
std : : string colorCode = " " ;
if ( ! canPurchase ) colorCode = " #FF0000 " ;
Component < MenuLabel > ( BUY_ITEM , " Total Price Amount Label " ) - > SetLabel ( colorCode + std : : to_string ( item . lock ( ) - > GetItem ( ) . lock ( ) - > BuyValue ( ) ) ) ;
Component < MenuLabel > ( BUY_ITEM , " Item Purchase Header " ) - > SetLabel ( " Buying " + item . lock ( ) - > GetItem ( ) . lock ( ) - > DisplayName ( ) ) ;
Component < MenuComponent > ( BUY_ITEM , " Purchase Button " ) - > SetGrayedOut ( ! merchant . CanPurchaseItem ( item . lock ( ) - > GetItem ( ) . lock ( ) - > ActualName ( ) , 1 ) ) ;
Component < MenuComponent > ( BUY_ITEM , " Decrease buy amount Button " ) - > SetGrayedOut ( true ) ;
if ( pricePerItem * ( qty + 1 ) > game - > GetPlayer ( ) - > GetMoney ( ) ) {
Component < MenuComponent > ( BUY_ITEM , " Increase buy amount Button " ) - > SetGrayedOut ( true ) ;
} else {
Component < MenuComponent > ( BUY_ITEM , " Increase buy amount Button " ) - > SetGrayedOut ( false ) ;
}
Menu : : OpenMenu ( BUY_ITEM ) ;
return true ;
} ,
[ ] ( MenuFuncData data ) {
Component < MenuItemItemButton > ( data . menu . GetType ( ) , " Item Icon " ) - > SetItem ( DYNAMIC_POINTER_CAST < RowItemDisplay > ( data . component . lock ( ) ) - > GetItem ( ) ) ;
data . menu . I ( A : : MERCHANT_ITEM_SLOT ) = data . parentComponent . lock ( ) - > GetComponentIndex ( data . component ) ;
return true ;
} ,
[ ] ( MenuFuncData data ) {
Component < MenuItemItemButton > ( data . menu . GetType ( ) , " Item Icon " ) - > SetItem ( Item : : BLANK ) ;
return true ;
} ,
InventoryCreator : : RowMerchant_InventoryUpdate ,
InventoryWindowOptions { . padding = 1 , . size = { 220 - 13 , 28 } } ) END ;
inventoryDisplay - > SetPriceLabelType ( PriceLabel : : BUY_LABEL ) ;
for ( auto & [ category , items ] : ITEM_CATEGORIES ) {
Menu : : AddMerchantInventoryListener ( inventoryDisplay , category ) ;
}
merchantWindow - > ADD ( " Inventory Tabs Outline " , MenuComponent ) ( geom2d : : rect < float > { { 0 , 28 } , { 72 , merchantWindow - > size . y - 44 } } , " " , DO_NOTHING , ButtonAttr : : UNSELECTABLE ) END ;
# pragma region Inventory Tabs
bool first = true ;
for ( float yOffset = 0 ; auto & [ category , sortOrder ] : categories ) {
float textWidth = game - > GetTextSizeProp ( category ) . x ;
float buttonWidth = 64 ;
float textScaling = std : : min ( 1.f , buttonWidth / textWidth ) ;
auto button = merchantWindow - > ADD ( category + " Inventory Tab " , MenuComponent ) ( geom2d : : rect < float > { { 2 , 30 + yOffset } , { 68 , 16 } } , category ,
[ & ] ( MenuFuncData data ) {
//Close the old inventory window and show the proper one.
Component < RowInventoryScrollableWindowComponent > ( data . menu . GetType ( ) , " Inventory Display - " + data . menu . S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) - > Disable ( ) ;
Component < MenuComponent > ( data . menu . GetType ( ) , data . menu . S ( A : : LAST_INVENTORY_TYPE_OPENED ) + " Inventory Tab " ) - > SetSelected ( false ) ;
Component < RowInventoryScrollableWindowComponent > ( data . menu . GetType ( ) , " Inventory Display - " + data . component . lock ( ) - > S ( A : : CATEGORY_NAME ) ) - > Enable ( ) ;
Component < MenuComponent > ( data . menu . GetType ( ) , data . component . lock ( ) - > S ( A : : CATEGORY_NAME ) + " Inventory Tab " ) - > SetSelected ( true ) ;
data . menu . S ( A : : LAST_INVENTORY_TYPE_OPENED ) = data . component . lock ( ) - > S ( A : : CATEGORY_NAME ) ;
if ( Component < RowInventoryScrollableWindowComponent > ( data . menu . GetType ( ) , " Inventory Display - " + data . component . lock ( ) - > S ( A : : CATEGORY_NAME ) ) - > GetComponents ( ) . size ( ) > 0 ) {
data . menu . I ( A : : ITEM_SLOT ) = 0 ;
} else {
data . menu . I ( A : : ITEM_SLOT ) = - 1 ;
}
if ( data . menu . I ( A : : ITEM_SLOT ) > = 0 ) {
data . menu . SetSelection ( Component < RowInventoryScrollableWindowComponent > ( data . menu . GetType ( ) , " Inventory Display - " + data . component . lock ( ) - > S ( A : : CATEGORY_NAME ) ) - > GetComponents ( ) [ 0 ] , true ) ;
}
if ( Menu : : IsCurrentlyActive ( data . menu . GetType ( ) ) ) {
SoundEffect : : PlaySFX ( " Button Click " , SoundEffect : : CENTERED ) ;
}
return true ;
} , vf2d { textScaling , 1.f } ) END ;
button - > SetSelectionType ( HIGHLIGHT ) ;
button - > S ( A : : CATEGORY_NAME ) = category ;
auto inventoryDisplay = merchantWindow - > ADD ( " Inventory Display - " + category , RowInventoryScrollableWindowComponent ) ( geom2d : : rect < float > { { 72 , 28 } , { 150 , merchantWindow - > size . y - 44 } } , " Item Name Label " , " Item Description Label " ,
[ ] ( MenuFuncData data ) {
std : : weak_ptr < RowItemDisplay > item = DYNAMIC_POINTER_CAST < RowItemDisplay > ( data . component . lock ( ) ) ;
if ( item . lock ( ) - > GetItem ( ) . lock ( ) - > IsLocked ( ) ) {
SoundEffect : : PlaySFX ( " Locked Item " , SoundEffect : : CENTERED ) ;
return true ;
}
if ( item . lock ( ) - > GetItem ( ) . lock ( ) - > CanBeSold ( ) ) {
Component < ItemMenuLabel > ( SELL_ITEM , " Item Sell Header " ) - > SetItem ( item . lock ( ) - > GetItem ( ) ) ;
Component < MenuLabel > ( SELL_ITEM , " Price per item Amount Label " ) - > SetLabel ( std : : to_string ( item . lock ( ) - > GetItem ( ) . lock ( ) - > SellValue ( ) ) ) ;
Component < MenuLabel > ( SELL_ITEM , " Amount to sell Amount Label " ) - > SetLabel ( std : : format ( " {}/{} " , 1 , Inventory : : GetItemCount ( item . lock ( ) - > GetItem ( ) . lock ( ) - > ActualName ( ) ) ) ) ;
Component < MenuLabel > ( SELL_ITEM , " Total Price Amount Label " ) - > SetLabel ( std : : to_string ( item . lock ( ) - > GetItem ( ) . lock ( ) - > SellValue ( ) ) ) ;
Merchant & merchant = Merchant : : GetCurrentTravelingMerchant ( ) ;
bool canPurchase = merchant . CanSellItem ( item . lock ( ) - > GetItem ( ) , 1 ) ;
std : : string colorCode = " " ;
if ( ! canPurchase ) colorCode = " #FF0000 " ;
Component < MenuLabel > ( SELL_ITEM , " Total Price Amount Label " ) - > SetLabel ( colorCode + std : : to_string ( item . lock ( ) - > GetItem ( ) . lock ( ) - > SellValue ( ) ) ) ;
Component < MenuLabel > ( SELL_ITEM , " Item Sell Header " ) - > SetLabel ( " Selling " + item . lock ( ) - > GetItem ( ) . lock ( ) - > DisplayName ( ) ) ;
Component < MenuComponent > ( SELL_ITEM , " Sell Button " ) - > SetGrayedOut ( ! merchant . CanSellItem ( item . lock ( ) - > GetItem ( ) , 1 ) ) ;
Component < MenuComponent > ( SELL_ITEM , " Decrease sell amount Button " ) - > SetGrayedOut ( true ) ;
int qty = 1 ;
int inventoryQty = Inventory : : GetItemCount ( item . lock ( ) - > GetItem ( ) . lock ( ) - > ActualName ( ) ) ;
if ( qty > = inventoryQty ) {
Component < MenuComponent > ( SELL_ITEM , " Increase sell amount Button " ) - > SetGrayedOut ( true ) ;
} else {
Component < MenuComponent > ( SELL_ITEM , " Increase sell amount Button " ) - > SetGrayedOut ( false ) ;
}
Menu : : OpenMenu ( SELL_ITEM ) ;
}
return true ;
} ,
[ ] ( MenuFuncData data ) {
Component < MenuItemItemButton > ( data . menu . GetType ( ) , " Item Icon " ) - > SetItem ( DYNAMIC_POINTER_CAST < RowItemDisplay > ( data . component . lock ( ) ) - > GetItem ( ) ) ;
data . menu . I ( A : : ITEM_SLOT ) = data . parentComponent . lock ( ) - > GetComponentIndex ( data . component ) ;
return true ;
} ,
[ ] ( MenuFuncData data ) {
Component < MenuItemItemButton > ( data . menu . GetType ( ) , " Item Icon " ) - > SetItem ( Item : : BLANK ) ;
return true ;
} ,
InventoryCreator : : RowPlayer_InventoryUpdate ,
InventoryWindowOptions { . padding = 1 , . size = { 137 , 28 } } ) END ;
inventoryDisplay - > SetPriceLabelType ( PriceLabel : : SELL_LABEL ) ;
if ( first ) {
merchantWindow - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) = category ;
button - > onClick ( MenuFuncData { * merchantWindow , game , button } ) ; //Simulate a click of this button if it's the top one for an initial inventory display.
inventoryDisplay - > Enable ( ) ;
} else {
inventoryDisplay - > Disable ( ) ;
}
Menu : : AddInventoryListener ( inventoryDisplay , category ) ;
inventoryDisplay - > SetCompactDescriptions ( NON_COMPACT ) ;
yOffset + = 20 ;
first = false ;
}
# pragma endregion
# pragma region Inventory Description
float inventoryDescriptionWidth = merchantWindow - > pos . x + merchantWindow - > size . x - 26 - 224 ;
merchantWindow - > ADD ( " Item Description Outline " , MenuLabel ) ( geom2d : : rect < float > { { 224 , 28 } , { inventoryDescriptionWidth , merchantWindow - > size . y - 44 } } , " " , 1 , ComponentAttr : : LEFT_ALIGN | ComponentAttr : : OUTLINE | ComponentAttr : : BACKGROUND ) END ;
merchantWindow - > ADD ( " Item Icon " , MenuItemItemButton ) ( geom2d : : rect < float > { { 226 + inventoryDescriptionWidth / 2 - 24 , 30 } , { 48 , 48 } } , Item : : BLANK , DO_NOTHING , " " , " " , IconButtonAttr : : NOT_SELECTABLE ) END ;
merchantWindow - > ADD ( " Item Name Label " , MenuLabel ) ( geom2d : : rect < float > { { 226 , 84 } , { inventoryDescriptionWidth - 6 , 12 } } , " " , 0.75f , ComponentAttr : : LEFT_ALIGN | ComponentAttr : : SHADOW ) END ;
merchantWindow - > ADD ( " Item Description Label " , MenuLabel ) ( geom2d : : rect < float > { { 226 , 94 } , { inventoryDescriptionWidth - 6 , merchantWindow - > size . y - 44 - 66 } } , " " , 0.5f , ComponentAttr : : LEFT_ALIGN | ComponentAttr : : SHADOW ) END ;
# pragma endregion
# pragma region Money Display
vf2d moneyIconPos = { 224 + inventoryDescriptionWidth - 24 , 28 + merchantWindow - > size . y - 44 + 6 } ;
auto moneyIcon = merchantWindow - > ADD ( " Money Icon " , MenuIconButton ) ( geom2d : : rect < float > { moneyIconPos , { 24 , 24 } } , GFX [ " money.png " ] . Decal ( ) , DO_NOTHING , IconButtonAttr : : NOT_SELECTABLE | IconButtonAttr : : NO_OUTLINE | IconButtonAttr : : NO_BACKGROUND ) END ;
std : : string moneyText = std : : to_string ( game - > GetPlayer ( ) - > GetMoney ( ) ) ;
vf2d moneyTextSize = game - > GetTextSizeProp ( moneyText ) * 2 ;
auto moneyDisplay = merchantWindow - > ADD ( " Money Label " , PlayerMoneyLabel ) ( geom2d : : rect < float > { moneyIconPos - vf2d { 2 + moneyTextSize . x , - 2 } , moneyTextSize } , 2 , ComponentAttr : : SHADOW | ComponentAttr : : LEFT_ALIGN | ComponentAttr : : FIT_TO_LABEL ) END ;
moneyDisplay - > SetRightAlignment ( true ) ;
Player : : AddMoneyListener ( moneyDisplay ) ;
# pragma endregion
merchantWindow - > ADD ( " Leave Button " , MenuComponent ) ( geom2d : : rect < float > { { merchantWindow - > size . x / 2 - 48 , 28 + merchantWindow - > size . y - 44 + 6 } , { 96 , 24 } } , " Leave " ,
[ ] ( MenuFuncData data ) {
Menu : : CloseMenu ( ) ;
return true ;
} , vf2d { 2 , 2 } ) END ;
buyTab - > onClick ( MenuFuncData { * merchantWindow , game , buyTab } ) ;
merchantWindow - > SetupKeyboardNavigation (
[ ] ( MenuType type , Data & returnData ) { //On Open
if ( Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) - > IsEnabled ( ) ) {
returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) - > GetComponents ( ) [ 0 ] ;
} else {
auto itemList = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) - > GetComponents ( ) ;
if ( itemList . size ( ) > Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ) {
returnData = itemList [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} else
if ( itemList . size ( ) > 0 ) {
returnData = itemList [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
{ //Button Key
{ game - > KEY_BACK , { " Leave " , [ ] ( MenuType type ) {
Menu : : CloseMenu ( ) ;
} } } ,
{ game - > KEY_FACELEFT , { [ ] ( MenuFuncData data ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
return " Sell Page " ;
} else {
return " Buy Page " ;
}
} , [ ] ( MenuType type ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
Menu : : menus [ type ] - > SetSelection ( merchantList - > GetComponents ( ) [ merchantList - > GetComponents ( ) . size ( ) - 1 ] ) ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
Menu : : menus [ type ] - > SetSelection ( inventory - > GetComponents ( ) [ 0 ] ) ;
} else {
Menu : : menus [ type ] - > SetSelection ( std : : weak_ptr < MenuComponent > { Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) } ) ;
}
}
} } } ,
{ { game - > KEY_SHOULDER , Pressed } , { " Scroll Up/Down " , [ ] ( MenuType type ) { } } } ,
{ { game - > KEY_FACEUP , Pressed } , { [ ] ( MenuFuncData data ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
return " " ;
} else {
return " Change Category " ;
}
} , [ & ] ( MenuType type ) {
auto categories = GetSortedCategories ( ) ;
size_t index = 0 ;
for ( auto & [ category , item ] : categories ) {
if ( category = = Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) break ;
index + + ;
}
if ( index < categories . size ( ) ) {
index + + ;
if ( index > = categories . size ( ) ) {
index - = categories . size ( ) ;
}
Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ) - > Click ( ) ;
} else ERR ( " WARNING! Could not find current category! THIS SHOULD NOT BE HAPPENING! " ) ;
} } } ,
{ { game - > KEY_FASTSCROLLDOWN , PressedDAS } , { " " , [ & ] ( MenuType type ) {
if ( ! Menu : : menus [ type ] - > GetSelection ( ) . expired ( ) & &
! Menu : : menus [ type ] - > GetSelection ( ) . lock ( ) - > parentComponent . expired ( ) ) {
Menu : : menus [ type ] - > GetSelection ( ) . lock ( ) - > parentComponent . lock ( ) - > IncreaseSelectionIndex ( 3.f ) ;
}
} } } ,
{ { game - > KEY_FASTSCROLLUP , PressedDAS } , { " " , [ & ] ( MenuType type ) {
if ( ! Menu : : menus [ type ] - > GetSelection ( ) . expired ( ) & &
! Menu : : menus [ type ] - > GetSelection ( ) . lock ( ) - > parentComponent . expired ( ) ) {
Menu : : menus [ type ] - > GetSelection ( ) . lock ( ) - > parentComponent . lock ( ) - > IncreaseSelectionIndex ( - 3.f ) ;
}
} } } ,
{ { game - > KEY_SCROLL , Pressed } , { " Navigate " , [ ] ( MenuType type ) { } } } ,
{ game - > KEY_SELECT , { [ ] ( MenuFuncData data ) {
if ( ! data . menu . GetSelection ( ) . expired ( ) & &
! data . menu . GetSelection ( ) . lock ( ) - > parentComponent . expired ( ) & &
data . menu . GetSelection ( ) . lock ( ) - > parentComponent . lock ( ) - > GetName ( ) = = " Inventory Display - Accessories " ) {
if ( DYNAMIC_POINTER_CAST < AccessoryRowItemDisplay > ( data . menu . GetSelection ( ) . lock ( ) ) - > GetItem ( ) . lock ( ) - > IsLocked ( ) ) {
return " Unlock " ;
} else {
return " Lock " ;
}
}
return " " ;
} , [ ] ( MenuType type ) {
if ( ! Menu : : menus [ type ] - > GetSelection ( ) . expired ( ) & &
! Menu : : menus [ type ] - > GetSelection ( ) . lock ( ) - > parentComponent . expired ( ) & &
Menu : : menus [ type ] - > GetSelection ( ) . lock ( ) - > parentComponent . lock ( ) - > GetName ( ) = = " Inventory Display - Accessories "
& & Menu : : menus [ type ] - > GetSelection ( ) . lock ( ) - > GetSubcomponentParent ( ) . expired ( ) ) {
DYNAMIC_POINTER_CAST < AccessoryRowItemDisplay > ( Menu : : menus [ type ] - > GetSelection ( ) . lock ( ) ) - > GetLockButton ( ) . lock ( ) - > Click ( ) ;
}
} } } ,
}
, { //Button Navigation Rules
{ " Leave Button " , {
. up = [ ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ merchantList - > GetComponents ( ) . size ( ) - 1 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ inventory - > GetComponents ( ) . size ( ) - 1 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
. down = [ ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
. left = [ ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
. right = [ ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
} } ,
{ " Inventory Display - Consumables " , {
. up = [ ] ( MenuType type , Data & returnData ) {
Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) - - ;
if ( Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) < 0 ) {
returnData = " Leave Button " ;
} else returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Consumables " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} ,
. down = [ ] ( MenuType type , Data & returnData ) {
Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) + + ;
if ( Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) > = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Consumables " ) - > GetComponents ( ) . size ( ) ) {
returnData = " Leave Button " ;
} else returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Consumables " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} ,
. left = [ ] ( MenuType type , Data & returnData ) {
returnData = std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ;
} ,
. right = [ ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
}
} } ,
{ " Inventory Display - Equipment " , {
. up = [ ] ( MenuType type , Data & returnData ) {
Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) - - ;
if ( Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) < 0 ) {
returnData = " Leave Button " ;
} else returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Equipment " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} ,
. down = [ ] ( MenuType type , Data & returnData ) {
Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) + + ;
if ( Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) > = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Equipment " ) - > GetComponents ( ) . size ( ) ) {
returnData = " Leave Button " ;
} else returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Equipment " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} ,
. left = [ ] ( MenuType type , Data & returnData ) {
returnData = std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ;
} ,
. right = [ ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
}
} } ,
{ " Inventory Display - Accessories " , {
. up = [ ] ( MenuType type , Data & returnData ) {
Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) - - ;
if ( Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) < 0 ) {
returnData = " Leave Button " ;
} else returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Accessories " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} ,
. down = [ ] ( MenuType type , Data & returnData ) {
Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) + + ;
if ( Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) > = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Accessories " ) - > GetComponents ( ) . size ( ) ) {
returnData = " Leave Button " ;
} else returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Accessories " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} ,
. left = [ ] ( MenuType type , Data & returnData ) {
returnData = std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ;
} ,
. right = [ ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
}
} } ,
{ " Inventory Display - Materials " , {
. up = [ ] ( MenuType type , Data & returnData ) {
Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) - - ;
if ( Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) < 0 ) {
returnData = " Leave Button " ;
} else returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Materials " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} ,
. down = [ ] ( MenuType type , Data & returnData ) {
Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) + + ;
if ( Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) > = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Materials " ) - > GetComponents ( ) . size ( ) ) {
returnData = " Leave Button " ;
} else returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Materials " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} ,
. left = [ ] ( MenuType type , Data & returnData ) {
returnData = std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ;
} ,
. right = [ ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
}
} } ,
{ " Merchant Inventory Display " , {
. up = [ ] ( MenuType type , Data & returnData ) {
Menu : : menus [ type ] - > I ( A : : MERCHANT_ITEM_SLOT ) - - ;
if ( Menu : : menus [ type ] - > I ( A : : MERCHANT_ITEM_SLOT ) < 0 ) {
returnData = " Leave Button " ;
} else {
returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : MERCHANT_ITEM_SLOT ) ] ;
}
} ,
. down = [ ] ( MenuType type , Data & returnData ) {
Menu : : menus [ type ] - > I ( A : : MERCHANT_ITEM_SLOT ) + + ;
if ( Menu : : menus [ type ] - > I ( A : : MERCHANT_ITEM_SLOT ) > = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) - > GetComponents ( ) . size ( ) ) {
returnData = " Leave Button " ;
} else {
returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : MERCHANT_ITEM_SLOT ) ] ;
}
} ,
. left = [ ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
. right = [ ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
} } ,
{ " Consumables Inventory Tab " , {
. up = [ & ] ( MenuType type , Data & returnData ) {
auto categories = GetSortedCategories ( ) ;
size_t index = 0 ;
for ( auto & [ category , item ] : categories ) {
if ( category = = " Consumables " ) break ;
index + + ;
}
if ( index < categories . size ( ) ) {
index - - ;
if ( index > = categories . size ( ) ) {
index = categories . size ( ) - 1 ;
}
Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ) - > Click ( ) ;
returnData = std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ;
} else ERR ( " WARNING! Could not find current category! THIS SHOULD NOT BE HAPPENING! " ) ;
} ,
. down = [ & ] ( MenuType type , Data & returnData ) {
auto categories = GetSortedCategories ( ) ;
size_t index = 0 ;
for ( auto & [ category , item ] : categories ) {
if ( category = = " Consumables " ) break ;
index + + ;
}
if ( index < categories . size ( ) ) {
index + + ;
if ( index > = categories . size ( ) ) {
index - = categories . size ( ) ;
}
Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ) - > Click ( ) ;
returnData = std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ;
} else ERR ( " WARNING! Could not find current category! THIS SHOULD NOT BE HAPPENING! " ) ;
} ,
. left = [ & ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
. right = [ & ] ( MenuType type , Data & returnData ) {
if ( Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) > = 0 ) {
returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Consumables " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} else {
returnData = " Consumables Inventory Tab " ;
}
} ,
} } ,
{ " Equipment Inventory Tab " , {
. up = [ & ] ( MenuType type , Data & returnData ) {
auto categories = GetSortedCategories ( ) ;
size_t index = 0 ;
for ( auto & [ category , item ] : categories ) {
if ( category = = " Equipment " ) break ;
index + + ;
}
if ( index < categories . size ( ) ) {
index - - ;
if ( index > = categories . size ( ) ) {
index = categories . size ( ) - 1 ;
}
Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ) - > Click ( ) ;
returnData = std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ;
} else ERR ( " WARNING! Could not find current category! THIS SHOULD NOT BE HAPPENING! " ) ;
} ,
. down = [ & ] ( MenuType type , Data & returnData ) {
auto categories = GetSortedCategories ( ) ;
size_t index = 0 ;
for ( auto & [ category , item ] : categories ) {
if ( category = = " Equipment " ) break ;
index + + ;
}
if ( index < categories . size ( ) ) {
index + + ;
if ( index > = categories . size ( ) ) {
index - = categories . size ( ) ;
}
Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ) - > Click ( ) ;
returnData = std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ;
} else ERR ( " WARNING! Could not find current category! THIS SHOULD NOT BE HAPPENING! " ) ;
} ,
. left = [ & ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
. right = [ & ] ( MenuType type , Data & returnData ) {
if ( Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) > = 0 ) {
returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Equipment " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} else {
returnData = " Equipment Inventory Tab " ;
}
} ,
} } ,
{ " Accessories Inventory Tab " , {
. up = [ & ] ( MenuType type , Data & returnData ) {
auto categories = GetSortedCategories ( ) ;
size_t index = 0 ;
for ( auto & [ category , item ] : categories ) {
if ( category = = " Accessories " ) break ;
index + + ;
}
if ( index < categories . size ( ) ) {
index - - ;
if ( index > = categories . size ( ) ) {
index = categories . size ( ) - 1 ;
}
Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ) - > Click ( ) ;
returnData = std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ;
} else ERR ( " WARNING! Could not find current category! THIS SHOULD NOT BE HAPPENING! " ) ;
} ,
. down = [ & ] ( MenuType type , Data & returnData ) {
auto categories = GetSortedCategories ( ) ;
size_t index = 0 ;
for ( auto & [ category , item ] : categories ) {
if ( category = = " Accessories " ) break ;
index + + ;
}
if ( index < categories . size ( ) ) {
index + + ;
if ( index > = categories . size ( ) ) {
index - = categories . size ( ) ;
}
Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ) - > Click ( ) ;
returnData = std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ;
} else ERR ( " WARNING! Could not find current category! THIS SHOULD NOT BE HAPPENING! " ) ;
} ,
. left = [ & ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
. right = [ & ] ( MenuType type , Data & returnData ) {
if ( Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) > = 0 ) {
returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Accessories " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} else {
returnData = " Accessories Inventory Tab " ;
}
} ,
} } ,
{ " Materials Inventory Tab " , {
. up = [ & ] ( MenuType type , Data & returnData ) {
auto categories = GetSortedCategories ( ) ;
size_t index = 0 ;
for ( auto & [ category , item ] : categories ) {
if ( category = = " Materials " ) break ;
index + + ;
}
if ( index < categories . size ( ) ) {
index - - ;
if ( index > = categories . size ( ) ) {
index = categories . size ( ) - 1 ;
}
Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ) - > Click ( ) ;
returnData = std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ;
} else ERR ( " WARNING! Could not find current category! THIS SHOULD NOT BE HAPPENING! " ) ;
} ,
. down = [ & ] ( MenuType type , Data & returnData ) {
auto categories = GetSortedCategories ( ) ;
size_t index = 0 ;
for ( auto & [ category , item ] : categories ) {
if ( category = = " Materials " ) break ;
index + + ;
}
if ( index < categories . size ( ) ) {
index + + ;
if ( index > = categories . size ( ) ) {
index - = categories . size ( ) ;
}
Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ) - > Click ( ) ;
returnData = std : : format ( " {} Inventory Tab " , categories [ index ] . first ) ;
} else ERR ( " WARNING! Could not find current category! THIS SHOULD NOT BE HAPPENING! " ) ;
} ,
. left = [ & ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
Component < MenuComponent > ( MERCHANT , " Sell Tab " ) - > Click ( ) ;
} else {
Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > Click ( ) ;
}
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
. right = [ & ] ( MenuType type , Data & returnData ) {
if ( Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) > = 0 ) {
returnData = Component < RowInventoryScrollableWindowComponent > ( type , " Inventory Display - Materials " ) - > GetComponents ( ) [ Menu : : menus [ type ] - > I ( A : : ITEM_SLOT ) ] ;
} else {
returnData = " Materials Inventory Tab " ;
}
} ,
} } ,
{ " Buy Tab " , {
. up = " Leave Button " ,
. down = [ ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
. left = [ ] ( MenuType type , Data & returnData ) {
Component < MenuComponent > ( type , " Sell Tab " ) - > Click ( ) ;
returnData = " Sell Tab " ;
} ,
. right = [ ] ( MenuType type , Data & returnData ) {
Component < MenuComponent > ( type , " Sell Tab " ) - > Click ( ) ;
returnData = " Sell Tab " ;
} ,
} } ,
{ " Sell Tab " , {
. up = " Leave Button " ,
. down = [ ] ( MenuType type , Data & returnData ) {
if ( Component < MenuComponent > ( MERCHANT , " Buy Tab " ) - > selected ) {
auto merchantList = Component < RowInventoryScrollableWindowComponent > ( type , " Merchant Inventory Display " ) ;
returnData = merchantList - > GetComponents ( ) [ 0 ] ;
} else {
auto inventory = Component < RowInventoryScrollableWindowComponent > ( type , std : : format ( " Inventory Display - {} " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
if ( inventory - > GetComponents ( ) . size ( ) > 0 ) {
returnData = inventory - > GetComponents ( ) [ 0 ] ;
} else {
returnData = Component < MenuComponent > ( type , std : : format ( " {} Inventory Tab " , Menu : : menus [ type ] - > S ( A : : LAST_INVENTORY_TYPE_OPENED ) ) ) ;
}
}
} ,
. left = [ ] ( MenuType type , Data & returnData ) {
Component < MenuComponent > ( type , " Buy Tab " ) - > Click ( ) ;
returnData = " Buy Tab " ;
} ,
. right = [ ] ( MenuType type , Data & returnData ) {
Component < MenuComponent > ( type , " Buy Tab " ) - > Click ( ) ;
returnData = " Buy Tab " ;
} ,
} } ,
} ) ;
}