# 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 <EFBFBD> 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 "RowInventoryScrollableWindowComponent.h"
# include "MenuItemItemButton.h"
# include "MenuLabel.h"
# include "MenuDecal.h"
# include "PlayerMoneyLabel.h"
INCLUDE_game
void Menu : : InitializeArtificerEnchantWindow ( ) {
Menu * artificerEnchantWindow = CreateMenu ( ARTIFICER_ENCHANT , CENTERED , game - > GetScreenSize ( ) - vi2d { 52 , 52 } ) ;
auto enchantingTitleLabel { artificerEnchantWindow - > ADD ( " Enchanting Title Label " , MenuLabel ) ( geom2d : : rect < float > { { 0.f , - 16.f } , { artificerEnchantWindow - > size . x , 24.f } } , " Accessory Enchanting " , 2.f , ComponentAttr : : SHADOW | ComponentAttr : : OUTLINE | ComponentAttr : : BACKGROUND ) END } ;
auto inventoryLabel { artificerEnchantWindow - > ADD ( " Accessory List Label " , MenuLabel ) ( geom2d : : rect < float > { { 0.f , 12.f } , { 180.f , 12.f } } , " Choose Accessory: " , 1.f , ComponentAttr : : SHADOW | ComponentAttr : : LEFT_ALIGN ) END } ;
auto itemIcon { artificerEnchantWindow - > ADD ( " Item Icon " , MenuItemItemButton ) ( geom2d : : rect < float > ( { artificerEnchantWindow - > size . x / 2 + 4.f , 16.f } , { 48 , 48 } ) , Item : : BLANK , DO_NOTHING , " " , " Item Description " , IconButtonAttr : : NOT_SELECTABLE ) END } ;
itemIcon - > SetIconScale ( { 2.f , 2.f } ) ;
itemIcon - > SetCompactDescriptions ( true ) ;
auto accessoryDescription { artificerEnchantWindow - > ADD ( " Item Description " , MenuLabel ) ( geom2d : : rect < float > { { artificerEnchantWindow - > size . x / 2 + 56.f , 16.f } , { artificerEnchantWindow - > size . x / 2 - 40.f , 72.f } } , " " , 0.5f , ComponentAttr : : BACKGROUND | ComponentAttr : : OUTLINE | ComponentAttr : : SHADOW | ComponentAttr : : LEFT_ALIGN ) END } ;
const auto ResetRefineDisplay { [ artificerEnchantWindow ] ( ) {
MenuType menuType { artificerEnchantWindow - > GetType ( ) } ;
Component < MenuItemItemButton > ( menuType , " Item Icon " ) - > SetItem ( Item : : BLANK ) ;
} } ;
const auto EnableRefineDisplay { [ artificerEnchantWindow ] ( ) {
MenuType menuType { artificerEnchantWindow - > GetType ( ) } ;
const std : : weak_ptr < Item > & selectedItem { Component < MenuItemItemButton > ( menuType , " Item Icon " ) - > GetItem ( ) } ;
std : : vector < ItemEnchantInfo > availableEnchants { ItemEnchant : : GetAvailableEnchants ( ) } ;
std : : string enchantList { std : : accumulate ( availableEnchants . begin ( ) , availableEnchants . end ( ) , " " s , [ ] ( const std : : string & acc , const ItemEnchantInfo & enchant ) {
return std : : format ( " {}{}{}#FFFFFF \n " , acc , enchant . DisplayCol ( ) . toHTMLColorCode ( ) , enchant . Name ( ) ) ;
} ) } ;
Component < MenuLabel > ( menuType , " Enchant List " ) - > SetLabel ( enchantList ) ;
} } ;
auto inventoryDisplay { artificerEnchantWindow - > ADD ( " Accessory List " , RowInventoryScrollableWindowComponent ) ( geom2d : : rect < float > { { 0.f , 28.f } , { artificerEnchantWindow - > size . x / 2 - 4.f , artificerEnchantWindow - > size . y - 44 } } , " " , " " , [ ] ( MenuFuncData data ) {
OnClick :
RowItemDisplay & item { * DYNAMIC_POINTER_CAST < RowItemDisplay > ( data . component ) } ;
DYNAMIC_POINTER_CAST < RowInventoryScrollableWindowComponent > ( data . parentComponent . lock ( ) ) - > SelectChild ( DYNAMIC_POINTER_CAST < RowItemDisplay > ( data . component ) ) ;
return true ;
} , [ EnableRefineDisplay ] ( MenuFuncData data ) { OnHover :
RowItemDisplay & item { * DYNAMIC_POINTER_CAST < RowItemDisplay > ( data . component ) } ;
Component < MenuItemItemButton > ( data . menu . type , " Item Icon " ) - > SetItem ( item . GetItem ( ) ) ;
EnableRefineDisplay ( ) ;
return true ;
} , [ ResetRefineDisplay , EnableRefineDisplay ] ( MenuFuncData data ) { OnMouseOut :
ResetRefineDisplay ( ) ;
auto childComponent { DYNAMIC_POINTER_CAST < RowInventoryScrollableWindowComponent > ( data . parentComponent . lock ( ) ) - > GetSelectedChild ( ) } ;
if ( childComponent ) {
RowItemDisplay & item { childComponent . value ( ) . get ( ) } ;
Component < MenuItemItemButton > ( data . menu . type , " Item Icon " ) - > SetItem ( item . GetItem ( ) ) ;
EnableRefineDisplay ( ) ;
}
return true ;
} ,
InventoryCreator : : RowPlayer_InventoryUpdate ,
InventoryWindowOptions { . padding = 1 , . size = { artificerEnchantWindow - > size . x / 2 - 5.f - 12.f , 28 } } ) END } ;
auto enchantListHeaderLabel { artificerEnchantWindow - > ADD ( " Enchant List Header " , MenuLabel ) ( geom2d : : rect < float > { { artificerEnchantWindow - > size . x / 2 + 4.f , 92.f } , { artificerEnchantWindow - > size . x / 2 + 12.f , 12.f } } , " Possible Enchantments: " , 1.f , ComponentAttr : : FIT_TO_LABEL | ComponentAttr : : BACKGROUND | ComponentAttr : : OUTLINE | ComponentAttr : : SHADOW ) END } ;
auto enchantContainer { artificerEnchantWindow - > ADD ( " Enchant Container " , ScrollableWindowComponent ) ( geom2d : : rect < float > { { artificerEnchantWindow - > size . x / 2 + 4.f , 104.f } , { artificerEnchantWindow - > size . x / 2 + 12.f , 44.f } } ) END } ;
auto enchantList { enchantContainer - > ADD ( " Enchant List " , MenuLabel ) ( geom2d : : rect < float > { { 0.f , 2.f } , { enchantContainer - > GetSize ( ) . x - 12.f , 0.f } } , " " , 1.f , ComponentAttr : : CENTER | ComponentAttr : : SHADOW ) END } ;
auto enchantCostLabel { artificerEnchantWindow - > ADD ( " Enchant Cost Label " , MenuLabel ) ( geom2d : : rect < float > { { artificerEnchantWindow - > size . x / 2 + 4.f , 152.f } , { 64.f , 20.f } } , " Enchant Cost: " , 1.f , ComponentAttr : : SHADOW | ComponentAttr : : BACKGROUND | ComponentAttr : : OUTLINE ) END } ;
auto fragmentCostIcon { artificerEnchantWindow - > ADD ( " Fragment Cost Icon " , MenuDecal ) ( geom2d : : rect < float > { { artificerEnchantWindow - > size . x / 2 + 68.f , 152.f } , { 12.f , 12.f } } ) END } ;
auto fragmentDisplayLabel { artificerEnchantWindow - > ADD ( " Fragment Label " , MenuLabel ) ( geom2d : : rect < float > { { artificerEnchantWindow - > size . x / 2 + 80.f , 152.f } , { artificerEnchantWindow - > size . x / 2 - 60.f , 12.f } } , " " , 1.f , ComponentAttr : : SHADOW | ComponentAttr : : FIT_TO_LABEL | ComponentAttr : : LEFT_ALIGN ) END } ;
auto fragmentMoneyCostLabel { artificerEnchantWindow - > ADD ( " Fragment Money Cost Label " , MenuLabel ) ( geom2d : : rect < float > { { artificerEnchantWindow - > size . x / 2 + 80.f , 164.f } , { artificerEnchantWindow - > size . x / 2 - 60.f , 12.f } } , " " , 1.f , ComponentAttr : : SHADOW | ComponentAttr : : LEFT_ALIGN ) END } ;
auto fragmentEnchantButton { artificerEnchantWindow - > ADD ( " Fragment Enchant Button " , MenuComponent ) ( geom2d : : rect < float > { { artificerEnchantWindow - > size . x / 2 + 96.f , 180.f } , { artificerEnchantWindow - > size . x / 2 - 80.f , 12.f } } , " Enchant " , [ EnableRefineDisplay ] ( MenuFuncData data ) {
onClick :
EnableRefineDisplay ( ) ; //Refresh the current display contents.
Menu : : OpenMenu ( ARTIFICER_ENCHANT_CONFIRM , true ) ;
return true ;
} ) END } ;
# pragma region Money Display
vf2d moneyIconPos { artificerEnchantWindow - > size . x / 2 - 28.f , artificerEnchantWindow - > size . y - 12.f } ;
auto moneyIcon = artificerEnchantWindow - > 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 = artificerEnchantWindow - > ADD ( " Money Label " , PlayerMoneyLabel ) ( geom2d : : rect < float > { moneyIconPos + vf2d { 26.f , 4.f } , moneyTextSize } , 2 , 1.85f , ComponentAttr : : SHADOW | ComponentAttr : : LEFT_ALIGN | ComponentAttr : : FIT_TO_LABEL ) END ;
Player : : AddMoneyListener ( moneyDisplay ) ;
# pragma endregion
auto backButton { artificerEnchantWindow - > ADD ( " Back " , MenuComponent ) ( geom2d : : rect < float > { { 0.f , artificerEnchantWindow - > size . y - 12.f } , { 96.f , 16.f } } , " Back " , [ ] ( MenuFuncData data ) {
Menu : : CloseMenu ( ) ;
return true ;
} ) END } ;
Menu : : AddInventoryListener ( inventoryDisplay , " Accessories " ) ;
artificerEnchantWindow - > SetupKeyboardNavigation (
[ ] ( MenuType type , Data & returnData ) { //On Open
returnData = " " ;
} ,
{ //Button Key
{ game - > KEY_SCROLL , { " Navigate " , [ ] ( MenuType type ) { } } } ,
{ game - > KEY_BACK , { " Stay " , [ ] ( MenuType type ) {
Menu : : CloseMenu ( ) ;
} } } ,
{ game - > KEY_CONFIRM , { " Select " , [ ] ( MenuType type ) { } } } ,
}
, { //Button Navigation Rules
{ " Sample Button " , {
. up = " " ,
. down = " " ,
. left = " " ,
. right = " " , } } ,
} ) ;
}