#include "Textbox.h" #include "olcUTIL_Geometry2D.h" #include "util.h" Textbox::Textbox(){}; void Textbox::Initialize(std::string text,vf2d pos,std::string headerText,vf2d maxSize,std::vectorresourceCost,float letterDisplayDelay) { if(GetCurrentString()!=text){ //Make sure this is actually a new textbox SetDefaults(); this->text=text; this->headerText=headerText; this->maxSize=maxSize; this->resourceCost=resourceCost; this->letterDisplayDelay=letterDisplayDelay; visible=true; } } void Textbox::SetDefaults(){ lastLetterTime=0; textboxMarker=-1; lastWordMarker=-1; lastWord=""; lastHeaderWordMarker=-1; lastHeaderWord=""; displayText=""; displayHeaderText=""; text=""; headerText=""; } void Textbox::Update(PixelGameEngine*pge){ if(!visible)return; lastLetterTime-=pge->GetElapsedTime(); if(lastLetterTime<=0){ if(textboxMarkerGetTextSizeProp(tempText).x>=maxSize.x){ displayText=displayText.substr(0,lastWordMarker); displayText+='\n'; displayText+=lastWord; } if(text[textboxMarker+1]==' '||text[textboxMarker+1]=='\n'){ lastWord=""; lastWordMarker=textboxMarker+2; } else { lastWord+=text[textboxMarker+1]; } displayText+=text[textboxMarker+1]; }; WrapText(tempText,text,displayText,lastWordMarker,lastWord); if(textboxMarkerGetTextSizeProp(displayHeaderText).y+pge->GetTextSizeProp(displayText).y)); lastLetterTime=letterDisplayDelay; } } void Textbox::Draw(PixelGameEngine*pge,Resources&resources,std::map>&IMAGES){ if(visible){ geom2d::rectboxRect={pos-vf2d{3,3},maxSize+vf2d{6,6}}; if(resourceCost.size()>0){ boxRect.size.x+=36; boxRect.size.y=std::max(36.f,boxRect.size.y); } if(boxRect.bottom().start.y>=pge->ScreenHeight()){ boxRect.pos-={0,boxRect.bottom().start.y-pge->ScreenHeight()}; } if(boxRect.right().start.x>=pge->ScreenWidth()){ boxRect.pos-={boxRect.right().start.x-pge->ScreenWidth(),0}; } if(boxRect.top().start.y<0){ boxRect.pos+={0,-boxRect.top().start.y}; } if(boxRect.left().start.x<0){ boxRect.pos+={-boxRect.left().start.x,0}; } pge->FillRectDecal(boxRect.pos,maxSize+vf2d{6,6},backCol); pge->DrawRectDecal(boxRect.pos+vf2d{1,1},maxSize+vf2d{4,4},WHITE); pge->DrawShadowStringPropDecal(boxRect.pos+vf2d{3,3},displayHeaderText,{245, 218, 66}); pge->DrawShadowStringPropDecal(boxRect.pos+vf2d{3.f,float(3+pge->GetTextSizeProp(displayHeaderText).y)},displayText,{220,220,220}); if(resourceCost.size()>0){ geom2d::rectresourceBoxRect={boxRect.pos+vf2d{6+maxSize.x,0},{36,42}}; pge->FillRectDecal(resourceBoxRect.pos,resourceBoxRect.size,backCol); pge->DrawRectDecal(resourceBoxRect.pos+vf2d{1,1},resourceBoxRect.size-vf2d{2,2},WHITE); vf2d contentPos=resourceBoxRect.pos+vf2d{3,3}; Pixel drawcol=GREY,shadowCol={66, 164, 245}; auto DrawResourceAmount=[&](int index,int cost,int resourceAmt){ drawcol=resourceAmt>=cost?GREY:RED; shadowCol=drawcol==GREY?VERY_DARK_BLUE:VERY_DARK_RED; vf2d textScale = {0.4,0.4}; std::string displayString = std::to_string(resourceAmt)+(resourceAmt<10?" ":"")+"/"; if(resourceAmtFillRectDecal(contentPos+vf2d{0,float(index*6)},vf2d{resourceBoxRect.size.x-6,6},{160,0,0,192}); } pge->DrawShadowStringDecal(contentPos+vf2d{12.f,float(index*6)+1},displayString,drawcol,shadowCol,textScale,0.6); pge->DrawShadowStringDecal(contentPos+vf2d{12.f+pge->GetTextSize(displayString).x*textScale.x+2,float(index*6)+1},std::to_string(cost),drawcol,shadowCol,{0.4,0.4},0.6); }; int index=0; int totalCost=0; if(util::GetHealthCost(resourceCost)!=-1){ DrawResourceAmount(index,util::GetHealthCost(resourceCost),resources.health); pge->DrawDecal(contentPos+vf2d{0,index*6.f},IMAGES[RESOURCE]->Decal(),{0.5,0.5},CONSTANT::HEALTH_COLOR); totalCost+=util::GetHealthCost(resourceCost); index++; } if(util::GetAtkSpdCost(resourceCost)!=-1){ DrawResourceAmount(index,util::GetAtkSpdCost(resourceCost),resources.atkSpd); pge->DrawDecal(contentPos+vf2d{0,index*6.f},IMAGES[RESOURCE]->Decal(),{0.5,0.5},CONSTANT::ATKSPD_COLOR); totalCost+=util::GetAtkSpdCost(resourceCost); index++; } if(util::GetMoveSpdCost(resourceCost)!=-1){ DrawResourceAmount(index,util::GetMoveSpdCost(resourceCost),resources.moveSpd); pge->DrawDecal(contentPos+vf2d{0,index*6.f},IMAGES[RESOURCE]->Decal(),{0.5,0.5},CONSTANT::MOVESPD_COLOR); totalCost+=util::GetMoveSpdCost(resourceCost); index++; } if(util::GetRangeCost(resourceCost)!=-1){ DrawResourceAmount(index,util::GetRangeCost(resourceCost),resources.range); pge->DrawDecal(contentPos+vf2d{0,index*6.f},IMAGES[RESOURCE]->Decal(),{0.5,0.5},CONSTANT::RANGE_COLOR); totalCost+=util::GetRangeCost(resourceCost); index++; } if(util::GetProcedureCost(resourceCost)!=-1){ DrawResourceAmount(index,util::GetProcedureCost(resourceCost),resources.procedure); pge->DrawDecal(contentPos+vf2d{0,index*6.f},IMAGES[RESOURCE]->Decal(),{0.5,0.5},CONSTANT::PROCEDURE_COLOR); totalCost+=util::GetProcedureCost(resourceCost); index++; } std::string text="Size: "+std::to_string(totalCost)+" bytes"; vi2d size=pge->GetTextSizeProp(text); pge->DrawShadowStringPropDecal(contentPos+vf2d{0,index*6.f+1},text,WHITE,BLACK,{30/float(size.x),0.5},0.6); index++; } } } void Textbox::UpdatePosition(vf2d newPos){ pos=newPos; } std::string&Textbox::GetCurrentString(){ return text; } void Textbox::SetVisible(bool visible){ this->visible=visible; if(!visible){ SetDefaults(); } } void Textbox::UpdateAndDraw(vf2d pos,PixelGameEngine*pge,Resources&resources,std::map>&IMAGES){ UpdatePosition(pos); Update(pge); Draw(pge,resources,IMAGES); } vf2d Textbox::GetSize(){ return maxSize; } void Textbox::SetBackgroundColor(Pixel col){ backCol=col; } bool Textbox::IsVisible(){ return visible; }