# 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 "MenuItemItemButton.h"
# include "PlayerMoneyLabel.h"
# include "RowInventoryScrollableWindowComponent.h"
# include "EnhancementStatsLabel.h"
# include "RequiredMaterialsList.h"
# include "SoundEffect.h"
INCLUDE_game
INCLUDE_ITEM_CATEGORIES
INCLUDE_DATA
INCLUDE_GFX
void Menu : : InitializeConsumableCraftingWindow ( ) {
Menu * consumableCraftingWindow = CreateMenu ( CRAFT_CONSUMABLE , CENTERED , game - > GetScreenSize ( ) - vi2d { 52 , 52 } ) ;
float windowWidth = consumableCraftingWindow - > size . x ;
consumableCraftingWindow - > ADD ( " Craft Consumables Header " , MenuLabel ) ( geom2d : : rect < float > { { 0 , 0 } , { windowWidth , 24 } } , " Consumable Crafting " , 2.f , ComponentAttr : : BACKGROUND | ComponentAttr : : SHADOW | ComponentAttr : : OUTLINE ) END ;
# pragma region Craftables Inventory Display
auto craftingItemsDisplay = consumableCraftingWindow - > ADD ( " Crafting Inventory Display " , RowInventoryScrollableWindowComponent ) ( geom2d : : rect < float > { { 0 , 28 } , { 222 , consumableCraftingWindow - > size . y - 44 } } , " Item Name Label " , " Item Description Label " ,
[ ] ( MenuFuncData data ) {
std : : weak_ptr < RowItemDisplay > comp = DYNAMIC_POINTER_CAST < RowItemDisplay > ( data . component . lock ( ) ) ;
const std : : weak_ptr < Item > item = comp . lock ( ) - > GetItem ( ) ;
Component < MenuLabel > ( CONSUMABLE_CRAFT_ITEM , " Item Name Header " ) - > GetString ( A : : ITEM_NAME ) = item . lock ( ) - > ActualName ( ) ;
Component < MenuLabel > ( CONSUMABLE_CRAFT_ITEM , " Amount to Craft Amount Label " ) - > SetLabel ( " 1 " ) ;
Component < MenuLabel > ( CONSUMABLE_CRAFT_ITEM , " Item Name Header " ) - > SetLabel ( std : : format ( " Crafting {} " , item . lock ( ) - > DisplayName ( ) ) ) ;
Component < RequiredMaterialsList > ( CONSUMABLE_CRAFT_ITEM , " Required Materials List " ) - > SetItem ( item ) ;
Component < MenuComponent > ( CONSUMABLE_CRAFT_ITEM , " Craft Button " ) - > SetGrayedOut ( ! item . lock ( ) - > CanEnhanceItem ( ) ) ;
if ( item . lock ( ) - > GetEnhancementInfo ( ) [ 0 ] . chapterAvailable < = game - > GetCurrentChapter ( ) ) {
Component < MenuComponent > ( CONSUMABLE_CRAFT_ITEM , " Decrease Craft amount Button " ) - > SetGrayedOut ( true ) ;
Menu : : OpenMenu ( CONSUMABLE_CRAFT_ITEM ) ;
} else {
SoundEffect : : PlaySFX ( " Locked Item " , SoundEffect : : CENTERED ) ;
}
return true ;
} ,
[ ] ( MenuFuncData data ) {
std : : weak_ptr < RowItemDisplay > rowItem = DYNAMIC_POINTER_CAST < RowItemDisplay > ( data . component . lock ( ) ) ;
if ( rowItem . lock ( ) - > GetItem ( ) . lock ( ) - > GetEnhancementInfo ( ) [ 0 ] . chapterAvailable < = game - > GetCurrentChapter ( ) ) {
Component < MenuItemItemButton > ( CRAFT_CONSUMABLE , " Item Icon " ) - > SetHideDetails ( false ) ;
} else {
Component < MenuItemItemButton > ( CRAFT_CONSUMABLE , " Item Icon " ) - > SetHideDetails ( true ) ;
}
Component < MenuItemItemButton > ( CRAFT_CONSUMABLE , " Item Icon " ) - > SetItem ( rowItem . lock ( ) - > GetItem ( ) ) ;
return true ;
} ,
[ ] ( MenuFuncData data ) {
Component < MenuItemItemButton > ( CRAFT_CONSUMABLE , " Item Icon " ) - > SetItem ( Item : : BLANK ) ;
return true ;
} ,
InventoryCreator : : RowPlayerWeapons_InventoryUpdate ,
InventoryWindowOptions { . padding = 1 , . size = { 209 , 28 } }
) END ;
craftingItemsDisplay - > SetCompactDescriptions ( CRAFTING_INFO ) ;
vf2d buttonSize = craftingItemsDisplay - > options . size ;
vf2d totalSpacing = { craftingItemsDisplay - > options . padding + buttonSize . x , craftingItemsDisplay - > options . padding + buttonSize . y } ;
for ( auto item : ItemInfo : : craftableConsumables ) {
size_t invSize = craftingItemsDisplay - > components . size ( ) + 1 ;
int invWidth = int ( craftingItemsDisplay - > rect . size . x / ( float ( craftingItemsDisplay - > options . size . x ) + craftingItemsDisplay - > options . padding ) ) ;
int x = int ( ( invSize - 1 ) % invWidth ) ;
int y = int ( ( invSize - 1 ) / invWidth ) ;
int itemIndex = y * invWidth + x ;
auto newItem = craftingItemsDisplay - > ADD ( " item_Craftables_ " + std : : to_string ( itemIndex ) , RowItemDisplay ) ( geom2d : : rect < float > { totalSpacing * vf2d { float ( x ) , float ( y ) } , buttonSize } , item , craftingItemsDisplay - > inventoryButtonClickAction , craftingItemsDisplay - > itemNameLabelName , craftingItemsDisplay - > itemDescriptionLabelName , craftingItemsDisplay - > inventoryButtonsActive ? ButtonAttr : : NONE : ButtonAttr : : UNSELECTABLE ) END ;
newItem - > SetShowQuantity ( false ) ;
newItem - > SetCompactDescriptions ( craftingItemsDisplay - > compact ) ;
newItem - > SetPriceLabelType ( craftingItemsDisplay - > priceLabel ) ;
newItem - > SetHoverFunc ( craftingItemsDisplay - > inventoryButtonHoverAction ) ;
newItem - > SetMouseOutFunc ( craftingItemsDisplay - > inventoryButtonMouseOutAction ) ;
newItem - > SetCheckCraftingRequirements ( true ) ;
newItem - > SetHideLabelWhileLocked ( true ) ;
}
# pragma endregion
# pragma region Inventory Description
float inventoryDescriptionWidth = consumableCraftingWindow - > pos . x + consumableCraftingWindow - > size . x - 26 - 224 ;
consumableCraftingWindow - > ADD ( " Item Description Outline " , MenuLabel ) ( geom2d : : rect < float > { { 224 , 28 } , { inventoryDescriptionWidth , consumableCraftingWindow - > size . y - 44 } } , " " , 1 , ComponentAttr : : LEFT_ALIGN | ComponentAttr : : OUTLINE | ComponentAttr : : BACKGROUND ) END ;
consumableCraftingWindow - > ADD ( " Item Icon " , MenuItemItemButton ) ( geom2d : : rect < float > { { 226 + inventoryDescriptionWidth / 2 - 24 , 30 } , { 48 , 48 } } , Item : : BLANK , DO_NOTHING , " " , " " , IconButtonAttr : : NOT_SELECTABLE ) END
- > SetShowQuantity ( false ) ;
consumableCraftingWindow - > ADD ( " Item Name Label " , MenuLabel ) ( geom2d : : rect < float > { { 226 , 84 } , { inventoryDescriptionWidth - 6 , 12 } } , " " , 0.75f , ComponentAttr : : LEFT_ALIGN | ComponentAttr : : SHADOW ) END ;
consumableCraftingWindow - > ADD ( " Item Description Label " , MenuLabel ) ( geom2d : : rect < float > { { 226 , 94 } , { inventoryDescriptionWidth - 6 , consumableCraftingWindow - > size . y - 44 - 66 } } , " " , 0.5f , ComponentAttr : : LEFT_ALIGN | ComponentAttr : : SHADOW ) END ;
# pragma endregion
# pragma region Money Display
vf2d moneyIconPos = { 224 + inventoryDescriptionWidth - 24 , 28 + consumableCraftingWindow - > size . y - 44 + 6 } ;
auto moneyIcon = consumableCraftingWindow - > 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 = consumableCraftingWindow - > 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
consumableCraftingWindow - > ADD ( " Back Button " , MenuComponent ) ( geom2d : : rect < float > { { consumableCraftingWindow - > size . x / 2 - 48 , 28 + consumableCraftingWindow - > size . y - 44 + 6 } , { 96 , 24 } } , " Back " ,
[ ] ( MenuFuncData data ) {
Menu : : CloseMenu ( ) ;
return true ;
} , vf2d { 2.f , 2.f } ) END ;
consumableCraftingWindow - > SetupKeyboardNavigation (
[ ] ( MenuType type , Data & returnData ) { //On Open
auto & craftingList = Component < RowInventoryScrollableWindowComponent > ( type , " Crafting Inventory Display " ) - > GetComponents ( ) ;
if ( craftingList . size ( ) > 0 ) {
returnData = craftingList [ 0 ] ;
} else {
returnData = " Back Button " ;
}
} ,
{ //Button Key
{ { game - > KEY_SHOULDER2 , Pressed } , { " Scroll Up/Down " , [ ] ( MenuType type ) { } } } ,
{ { game - > KEY_SHOULDER , Pressed } , { " Scroll Up/Down " , [ ] ( MenuType type ) { } } } ,
{ { 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_BACK , { " Back " , [ ] ( MenuType type ) {
Menu : : CloseMenu ( ) ;
} } } ,
{ game - > KEY_CONFIRM , { " Select " , [ ] ( MenuType type ) { } } } ,
}
, { //Button Navigation Rules
{ " Back Button " , {
. up = [ ] ( MenuType type , Data & returnData ) {
auto & itemList = Component < RowInventoryScrollableWindowComponent > ( type , " Crafting Inventory Display " ) - > GetComponents ( ) ;
if ( itemList . size ( ) > 0 ) {
returnData = itemList [ itemList . size ( ) - 1 ] ;
} else {
returnData = " Back Button " ;
}
} ,
. down = [ ] ( MenuType type , Data & returnData ) {
auto & itemList = Component < RowInventoryScrollableWindowComponent > ( type , " Crafting Inventory Display " ) - > GetComponents ( ) ;
if ( itemList . size ( ) > 0 ) {
returnData = itemList [ 0 ] ;
} else {
returnData = " Back Button " ;
}
} , } } ,
{ " Crafting Inventory Display " , {
. up = [ ] ( MenuType type , Data & returnData ) {
auto itemDisplay = Component < RowInventoryScrollableWindowComponent > ( type , " Crafting Inventory Display " ) ;
size_t selectedIndex = itemDisplay - > GetComponentIndex ( Menu : : menus [ type ] - > GetSelection ( ) ) ;
if ( selectedIndex ! = itemDisplay - > GetComponents ( ) . size ( ) ) {
selectedIndex - - ;
if ( selectedIndex > = itemDisplay - > GetComponents ( ) . size ( ) ) {
returnData = " Back Button " ;
} else {
returnData = itemDisplay - > GetComponents ( ) [ selectedIndex ] ;
}
} else ERR ( " WARNING! Could not get selected item within crafting inventory display! THIS SHOULD NOT BE HAPPENING! " )
} ,
. down = [ ] ( MenuType type , Data & returnData ) {
auto itemDisplay = Component < RowInventoryScrollableWindowComponent > ( type , " Crafting Inventory Display " ) ;
size_t selectedIndex = itemDisplay - > GetComponentIndex ( Menu : : menus [ type ] - > GetSelection ( ) ) ;
if ( selectedIndex ! = itemDisplay - > GetComponents ( ) . size ( ) ) {
selectedIndex + + ;
if ( selectedIndex > = itemDisplay - > GetComponents ( ) . size ( ) ) {
returnData = " Back Button " ;
} else {
returnData = itemDisplay - > GetComponents ( ) [ selectedIndex ] ;
}
} else ERR ( " WARNING! Could not get selected item within crafting inventory display! THIS SHOULD NOT BE HAPPENING! " )
} , } } ,
} ) ;
}