Added controller compatibility for player inventory window. Release Build 7198.

pull/35/head
sigonasr2 10 months ago
parent 783428dfa1
commit e67c233aaa
  1. 8
      Adventures in Lestoria/AdventuresInLestoria.cpp
  2. 352
      Adventures in Lestoria/InventoryWindow.cpp
  3. 4
      Adventures in Lestoria/MenuType.h
  4. 2
      Adventures in Lestoria/Version.h
  5. 4
      Adventures in Lestoria/assets/config/Interface.txt
  6. BIN
      x64/Release/Adventures in Lestoria.exe

@ -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);

@ -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<float>{{0,0},{inventoryWindow->size.x-1,24}},"Inventory",2,SHADOW|OUTLINE|BACKGROUND)END;
inventoryWindow->ADD("Inventory Tabs Outline",MenuComponent)(geom2d::rect<float>{{0,28},{72,inventoryWindow->size.y-44}},"",DO_NOTHING,UNSELECTABLE)END;
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;});
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();
#pragma region Inventory Tabs
bool first=true;
@ -83,6 +89,11 @@ void Menu::InitializeInventoryWindow(){
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);
data.menu.I(A::ITEM_SLOT)=Component<RowInventoryScrollableWindowComponent>(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<RowInventoryScrollableWindowComponent>(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<float>{{72,28},{150,inventoryWindow->size.y-44}},"Item Name Label","Item Description Label",DO_NOTHING,
[](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){
@ -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<RowInventoryScrollableWindowComponent>(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++;
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_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<RowInventoryScrollableWindowComponent>(type,"Inventory Display - Consumables")->GetComponents().size()-1;
}
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()){
Menu::menus[type]->I(A::ITEM_SLOT)-=Component<RowInventoryScrollableWindowComponent>(type,"Inventory Display - Consumables")->GetComponents().size();
}
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){
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<RowInventoryScrollableWindowComponent>(type,"Inventory Display - Equipment")->GetComponents().size()-1;
}
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()){
Menu::menus[type]->I(A::ITEM_SLOT)-=Component<RowInventoryScrollableWindowComponent>(type,"Inventory Display - Equipment")->GetComponents().size();
}
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){
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<RowInventoryScrollableWindowComponent>(type,"Inventory Display - Accessories")->GetComponents().size()-1;
}
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()){
Menu::menus[type]->I(A::ITEM_SLOT)-=Component<RowInventoryScrollableWindowComponent>(type,"Inventory Display - Accessories")->GetComponents().size();
}
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){
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<RowInventoryScrollableWindowComponent>(type,"Inventory Display - Materials")->GetComponents().size()-1;
}
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()){
Menu::menus[type]->I(A::ITEM_SLOT)-=Component<RowInventoryScrollableWindowComponent>(type,"Inventory Display - Materials")->GetComponents().size();
}
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){
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--;
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(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";
}
},
.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(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";
}
},
.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(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";
}
},
.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(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";
}
},
.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";
}
},
}},
});
}

@ -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

@ -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

@ -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

Loading…
Cancel
Save