#pragma once #include "Menu.h" #include "MenuLabel.h" #include "MenuIconButton.h" #include "DEFINES.h" #include "Crawler.h" #include "Item.h" #include "safemap.h" #include "olcPGEX_Graphics2D.h" #include "drawutil.h" INCLUDE_game INCLUDE_ITEM_DATA class MenuItemButton:public MenuIconButton{ private: std::vector&invRef; int inventoryIndex=0; public: int selected=-1; //0-2 representing which loadout slot this item consumes. -1 means not selected. inline MenuItemButton(MenuType parent,geom2d::rectrect,std::vector&invRef,int invIndex,MenuFunc onClick) :MenuIconButton(parent,rect,invRef.size()>invIndex?ITEM_DATA.at(invRef[invIndex]).Decal():nullptr,onClick),invRef(invRef),inventoryIndex(invIndex){ draggable=false; valid=invRef.size()>invIndex; } inline Item GetItem(){ return Inventory::GetItem(invRef.at(inventoryIndex)); } //Returns true if the item has been consumed completely and there are 0 remaining of that type in our inventory. inline bool UseItem(uint32_t amt=1){ if(invRef.size()<=inventoryIndex)return false; return Inventory::UseItem(invRef.at(inventoryIndex),amt); } protected: virtual inline void Update(Crawler*game)override{ MenuIconButton::Update(game); valid=invRef.size()>inventoryIndex&&ITEM_DATA.count(invRef[inventoryIndex]); if(Menu::stack.size()>0){ Menu*menu=Menu::stack.back(); if(valid){ icon=ITEM_DATA.at(invRef[inventoryIndex]).Decal(); if(hovered){ switch(parentMenu){ case INVENTORY:{ //There should be an itemName label to modify. Component(INVENTORY,"itemName")->label=ITEM_DATA.at(invRef[inventoryIndex]).Name(); //There should be an itemDescription label to modify. Component(INVENTORY,"itemDescription")->label=ITEM_DATA.at(invRef[inventoryIndex]).Description(); }break; } } }else{ icon=nullptr; if(hovered){ switch(parentMenu){ case INVENTORY:{ //There should be an itemName label to modify. Component(INVENTORY,"itemName")->label=""; //There should be an itemDescription label to modify. Component(INVENTORY,"itemDescription")->label=""; }break; } } } } } virtual inline void Draw(Crawler*game,vf2d parentPos)override{ MenuIconButton::Draw(game,parentPos); if(selected!=-1){ drawutil::DrawCrosshair(game,{parentPos+rect.pos,rect.size},0); } } virtual inline void DrawDecal(Crawler*game,vf2d parentPos,bool focused)override{ MenuIconButton::DrawDecal(game,parentPos,focused); if(valid){ std::string quantityText="x"+std::to_string(Inventory::GetItemCount(invRef.at(inventoryIndex))); vf2d textSize=vf2d(game->GetTextSizeProp(quantityText))*0.5; vf2d drawPos=parentPos+rect.pos+rect.size-textSize; if(PointWithinParent(this,drawPos)){ game->DrawShadowStringDecal(drawPos,quantityText,WHITE,BLACK,{0.5,0.5},0.5); } } } virtual inline MenuComponent*PickUpDraggableItem()override{ if(valid){ MenuItemButton*pickUp=NEW MenuItemButton(parentMenu,rect,invRef,inventoryIndex,onClick); valid=false; return pickUp; }else{ return nullptr; } } virtual inline bool DropDraggableItem(MenuComponent*draggable)override{ //HACK Warning! We're making a bold assumption that every component that is draggable is of the same type! This may change in the future.... MenuItemButton*draggedItem=(MenuItemButton*)draggable; ITCategory cat=ITEM_DATA.at(draggedItem->invRef.at(draggedItem->inventoryIndex)).Category(); return Inventory::SwapItems(cat,draggedItem->inventoryIndex,inventoryIndex); } };