diff --git a/Adventures in Lestoria/AdventuresInLestoria.cpp b/Adventures in Lestoria/AdventuresInLestoria.cpp index 16ac9a2e..9f05ec28 100644 --- a/Adventures in Lestoria/AdventuresInLestoria.cpp +++ b/Adventures in Lestoria/AdventuresInLestoria.cpp @@ -261,15 +261,15 @@ bool AiL::OnUserCreate(){ sig::Animation::SetupPlayerAnimations(); view=TileTransformedView{GetScreenSize(),{1,1}}; + Audio::Initialize(); + EnvironmentalAudio::Initialize(); + SoundEffect::Initialize(); + Menu::InitializeMenus(); Inventory::AddItem("Minor Health Potion"s,3); Inventory::AddItem("Bandages"s,10); - Audio::Initialize(); - EnvironmentalAudio::Initialize(); - SoundEffect::Initialize(); - LoadLevel("starting_map"_S); ChangePlayerClass(WARRIOR); diff --git a/Adventures in Lestoria/InventoryWindow.cpp b/Adventures in Lestoria/InventoryWindow.cpp index 7e7a4c7a..b41ee02e 100644 --- a/Adventures in Lestoria/InventoryWindow.cpp +++ b/Adventures in Lestoria/InventoryWindow.cpp @@ -45,6 +45,7 @@ All rights reserved. #include "MenuItemItemButton.h" #include "RowItemDisplay.h" #include "PlayerMoneyLabel.h" +#include "SoundEffect.h" INCLUDE_game INCLUDE_ITEM_CATEGORIES @@ -61,12 +62,17 @@ void Menu::InitializeInventoryWindow(){ inventoryWindow->ADD("Inventory Label",MenuLabel)(geom2d::rect{{0,0},{inventoryWindow->size.x-1,24}},"Inventory",2,SHADOW|OUTLINE|BACKGROUND)END; inventoryWindow->ADD("Inventory Tabs Outline",MenuComponent)(geom2d::rect{{0,28},{72,inventoryWindow->size.y-44}},"",DO_NOTHING,UNSELECTABLE)END; - std::vector>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&cat1,std::pair&cat2){return cat1.second>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&cat1,std::pair&cat2){return cat1.second>categories=GetSortedCategories(); #pragma region Inventory Tabs bool first=true; @@ -83,6 +89,11 @@ void Menu::InitializeInventoryWindow(){ Component(data.menu.GetType(),"Inventory Display - "+data.component.lock()->S(A::CATEGORY_NAME))->Enable(); Component(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); + data.menu.I(A::ITEM_SLOT)=Component(data.menu.GetType(),"Inventory Display - "+data.component.lock()->S(A::CATEGORY_NAME))->GetComponents().size()-1; + if(data.menu.I(A::ITEM_SLOT)>=0){ + data.menu.SetSelection(Component(data.menu.GetType(),"Inventory Display - "+data.component.lock()->S(A::CATEGORY_NAME))->GetComponents()[0],true); + } + SoundEffect::PlaySFX("Button Click",SoundEffect::CENTERED); return true; },vf2d{textScaling,1.f})END; button->SetSelectionType(HIGHLIGHT); @@ -91,6 +102,7 @@ void Menu::InitializeInventoryWindow(){ auto inventoryDisplay=inventoryWindow->ADD("Inventory Display - "+category,RowInventoryScrollableWindowComponent)(geom2d::rect{{72,28},{150,inventoryWindow->size.y-44}},"Item Name Label","Item Description Label",DO_NOTHING, [](MenuFuncData data){ Component(data.menu.GetType(),"Item Icon")->SetItem(DYNAMIC_POINTER_CAST(data.component.lock())->GetItem()); + data.menu.I(A::ITEM_SLOT)=data.parentComponent.lock()->GetComponentIndex(data.component); return true; }, [](MenuFuncData data){ @@ -139,4 +151,332 @@ void Menu::InitializeInventoryWindow(){ Menu::CloseMenu(); return true; },vf2d{2.f,2.f})END; + + inventoryWindow->SetupKeyboardNavigation( + [](MenuType type,Data&returnData){ //On Open + std::string category=Menu::menus[type]->S(A::LAST_INVENTORY_TYPE_OPENED); + auto inventoryDisplay=Component(type,"Inventory Display - "+category); + if(inventoryDisplay->GetComponents().size()>0){ + returnData=inventoryDisplay->GetComponents()[0]; + }else{ + returnData=category+" Inventory Tab"; + } + }, + { //Button Key + {game->KEY_BACK,{"Back",[](MenuType type){ + Menu::CloseMenu(); + }}}, + {{game->KEY_SHOULDER,Pressed},{"Scroll Up/Down",[](MenuType type){}}}, + {{game->KEY_FACEUP,Pressed},{"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-=categories.size(); + } + Component(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_CONFIRM,{"Select",[](MenuType type){}}}, + } + ,{ //Button Navigation Rules + {"Inventory Display - Consumables",{ + .up=[](MenuType type,Data&returnData){ + Menu::menus[type]->I(A::ITEM_SLOT)--; + if(Menu::menus[type]->I(A::ITEM_SLOT)<0){ + Menu::menus[type]->I(A::ITEM_SLOT)=Component(type,"Inventory Display - Consumables")->GetComponents().size()-1; + } + returnData=Component(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(type,"Inventory Display - Consumables")->GetComponents().size()){ + Menu::menus[type]->I(A::ITEM_SLOT)-=Component(type,"Inventory Display - Consumables")->GetComponents().size(); + } + returnData=Component(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){ + returnData=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){ + Menu::menus[type]->I(A::ITEM_SLOT)=Component(type,"Inventory Display - Equipment")->GetComponents().size()-1; + } + returnData=Component(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(type,"Inventory Display - Equipment")->GetComponents().size()){ + Menu::menus[type]->I(A::ITEM_SLOT)-=Component(type,"Inventory Display - Equipment")->GetComponents().size(); + } + returnData=Component(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){ + returnData=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){ + Menu::menus[type]->I(A::ITEM_SLOT)=Component(type,"Inventory Display - Accessories")->GetComponents().size()-1; + } + returnData=Component(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(type,"Inventory Display - Accessories")->GetComponents().size()){ + Menu::menus[type]->I(A::ITEM_SLOT)-=Component(type,"Inventory Display - Accessories")->GetComponents().size(); + } + returnData=Component(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){ + returnData=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){ + Menu::menus[type]->I(A::ITEM_SLOT)=Component(type,"Inventory Display - Materials")->GetComponents().size()-1; + } + returnData=Component(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(type,"Inventory Display - Materials")->GetComponents().size()){ + Menu::menus[type]->I(A::ITEM_SLOT)-=Component(type,"Inventory Display - Materials")->GetComponents().size(); + } + returnData=Component(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){ + returnData=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=categories.size()-1; + } + Component(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-=categories.size(); + } + Component(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(Menu::menus[type]->I(A::ITEM_SLOT)>=0){ + returnData=Component(type,"Inventory Display - Consumables")->GetComponents()[Menu::menus[type]->I(A::ITEM_SLOT)]; + }else{ + returnData="Consumables Inventory Tab"; + } + }, + .right=[&](MenuType type,Data&returnData){ + if(Menu::menus[type]->I(A::ITEM_SLOT)>=0){ + returnData=Component(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=categories.size()-1; + } + Component(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-=categories.size(); + } + Component(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(Menu::menus[type]->I(A::ITEM_SLOT)>=0){ + returnData=Component(type,"Inventory Display - Equipment")->GetComponents()[Menu::menus[type]->I(A::ITEM_SLOT)]; + }else{ + returnData="Equipment Inventory Tab"; + } + }, + .right=[&](MenuType type,Data&returnData){ + if(Menu::menus[type]->I(A::ITEM_SLOT)>=0){ + returnData=Component(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=categories.size()-1; + } + Component(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-=categories.size(); + } + Component(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(Menu::menus[type]->I(A::ITEM_SLOT)>=0){ + returnData=Component(type,"Inventory Display - Accessories")->GetComponents()[Menu::menus[type]->I(A::ITEM_SLOT)]; + }else{ + returnData="Accessories Inventory Tab"; + } + }, + .right=[&](MenuType type,Data&returnData){ + if(Menu::menus[type]->I(A::ITEM_SLOT)>=0){ + returnData=Component(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=categories.size()-1; + } + Component(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-=categories.size(); + } + Component(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(Menu::menus[type]->I(A::ITEM_SLOT)>=0){ + returnData=Component(type,"Inventory Display - Materials")->GetComponents()[Menu::menus[type]->I(A::ITEM_SLOT)]; + }else{ + returnData="Materials Inventory Tab"; + } + }, + .right=[&](MenuType type,Data&returnData){ + if(Menu::menus[type]->I(A::ITEM_SLOT)>=0){ + returnData=Component(type,"Inventory Display - Materials")->GetComponents()[Menu::menus[type]->I(A::ITEM_SLOT)]; + }else{ + returnData="Materials Inventory Tab"; + } + }, + }}, + }); } \ No newline at end of file diff --git a/Adventures in Lestoria/MenuType.h b/Adventures in Lestoria/MenuType.h index a58de4b3..cf702a47 100644 --- a/Adventures in Lestoria/MenuType.h +++ b/Adventures in Lestoria/MenuType.h @@ -41,7 +41,7 @@ enum MenuType{ /////////////////////////////////////////////////////////// /*DO NOT REMOVE!!*/ENUM_START,/////////////////////////////// /////////////////////////////////////////////////////////// - // 36% Controller Compatibility. (100 total items, 4 items per menu * 25 menus) + // 40% Controller Compatibility. (100 total items, 4 items per menu * 25 menus) INVENTORY_CONSUMABLES, //100% Controller Compatibility CLASS_INFO, //100% Controller Compatibility CLASS_SELECTION, //100% Controller Compatibility @@ -51,7 +51,7 @@ enum MenuType{ LEVEL_COMPLETE, //100% Controller Compatibility OVERWORLD_MENU, //100% Controller Compatibility CHARACTER_MENU, //100% Controller Compatibility - INVENTORY, //0% Controller Compatibility + INVENTORY, //100% Controller Compatibility MERCHANT, //0% Controller Compatibility BUY_ITEM, //0% Controller Compatibility SELL_ITEM, //0% Controller Compatibility diff --git a/Adventures in Lestoria/Version.h b/Adventures in Lestoria/Version.h index c5ea9e03..8e534975 100644 --- a/Adventures in Lestoria/Version.h +++ b/Adventures in Lestoria/Version.h @@ -39,7 +39,7 @@ All rights reserved. #define VERSION_MAJOR 0 #define VERSION_MINOR 3 #define VERSION_PATCH 0 -#define VERSION_BUILD 7187 +#define VERSION_BUILD 7198 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Adventures in Lestoria/assets/config/Interface.txt b/Adventures in Lestoria/assets/config/Interface.txt index c5ccf5ee..e20b841a 100644 --- a/Adventures in Lestoria/assets/config/Interface.txt +++ b/Adventures in Lestoria/assets/config/Interface.txt @@ -1,10 +1,10 @@ Interface { # How long to wait for the first initial delay auto shift to occur. - InitialScrollDelay = 0.6s + InitialScrollDelay = 0.4s # How long to wait for subsequent scrolling through menu items. - ScrollDelay = 0.3s + ScrollDelay = 0.2s # Scroll speed for ScrollableWindowComponents in pixels/sec AnalogScrollSpeed = 220 diff --git a/x64/Release/Adventures in Lestoria.exe b/x64/Release/Adventures in Lestoria.exe index 4d157155..7675d210 100644 Binary files a/x64/Release/Adventures in Lestoria.exe and b/x64/Release/Adventures in Lestoria.exe differ