From 808cc32418178d34ca85081c8b622513114684ef Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Wed, 6 Dec 2023 18:55:18 -0600 Subject: [PATCH] Implemented color code text in PGE. --- Crawler/CharacterMenuWindow.cpp | 28 +----- Crawler/MonsterAttribute.h | 2 +- Crawler/State_GameRun.cpp | 1 + Crawler/Version.h | 2 +- Crawler/VisualNovel.h | 3 +- Crawler/olcPGEX_TTF.h | 14 ++- Crawler/olcPixelGameEngine.h | 169 +++++++++++++++++++++++++++++--- 7 files changed, 178 insertions(+), 41 deletions(-) diff --git a/Crawler/CharacterMenuWindow.cpp b/Crawler/CharacterMenuWindow.cpp index 3fe1c459..cdb69b21 100644 --- a/Crawler/CharacterMenuWindow.cpp +++ b/Crawler/CharacterMenuWindow.cpp @@ -84,7 +84,7 @@ void Menu::InitializeCharacterMenuWindow(){ characterMenuWindow->AddComponent("Equip Selection Bottom Outline",equipSelectionBottomOutline); characterMenuWindow->AddComponent("Equip Selection Select Button",equipSelectionSelectButton); - const std::arraydisplayAttrs{ + const static std::arraydisplayAttrs{ ItemAttribute::health, ItemAttribute::attack, ItemAttribute::defense, @@ -133,43 +133,22 @@ void Menu::InitializeCharacterMenuWindow(){ },[&](MenuFuncData data){ MenuItemItemButton*button=(MenuItemItemButton*)data.component; Item&buttonItem=button->GetItem(); - const std::arraydisplayAttrs{ - ItemAttribute::health, - ItemAttribute::attack, - ItemAttribute::defense, - ItemAttribute::moveSpdPct, - ItemAttribute::cdrPct, - ItemAttribute::critPct, - ItemAttribute::critDmgPct, - }; for(ItemAttribute attribute:displayAttrs){ int stat=buttonItem.GetStats().get(attribute); if(stat>0){ MenuLabel*statDisplayLabel=Component(CHARACTER_MENU,"Attribute "+ItemAttributable::GetDisplayInfo(attribute).name+" Label"); - std::string baseLabel=statDisplayLabel->S(Attribute::DISPLAY_TEXT); - std::string newLabel=baseLabel+" (+"+std::to_string(stat)+")"; - statDisplayLabel->SetLabel(newLabel); + statDisplayLabel->I(Attribute::STAT_CHANGE)=stat; } } return true; },[&](MenuFuncData data){ MenuItemItemButton*button=(MenuItemItemButton*)data.component; Item&buttonItem=button->GetItem(); - const std::arraydisplayAttrs{ - ItemAttribute::health, - ItemAttribute::attack, - ItemAttribute::defense, - ItemAttribute::moveSpdPct, - ItemAttribute::cdrPct, - ItemAttribute::critPct, - ItemAttribute::critDmgPct, - }; for(ItemAttribute attribute:displayAttrs){ int stat=buttonItem.GetStats().get(attribute); if(stat>0){ MenuLabel*statDisplayLabel=Component(CHARACTER_MENU,"Attribute "+ItemAttributable::GetDisplayInfo(attribute).name+" Label"); - std::string baseLabel=statDisplayLabel->S(Attribute::DISPLAY_TEXT); - statDisplayLabel->SetLabel(baseLabel); + statDisplayLabel->I(Attribute::STAT_CHANGE)=stat; } } return true; @@ -206,7 +185,6 @@ void Menu::InitializeCharacterMenuWindow(){ attrStr+="%"; } MenuLabel*attrLabel=NEW MenuLabel(CHARACTER_MENU,{{245,36+2+float(yOffset)},{62,18}},attrStr,1,ComponentAttr::SHADOW|ComponentAttr::LEFT_ALIGN); - attrLabel->S(Attribute::DISPLAY_TEXT)=attrStr; yOffset+=20; characterMenuWindow->AddComponent("Attribute "+data.name+" Label",attrLabel); } diff --git a/Crawler/MonsterAttribute.h b/Crawler/MonsterAttribute.h index 9617c369..a98a2ab1 100644 --- a/Crawler/MonsterAttribute.h +++ b/Crawler/MonsterAttribute.h @@ -70,5 +70,5 @@ enum class Attribute{ LOADOUT_SLOT, //Which loadout slot we are selecting an item for. ALLOW_DRAGGING, //Whether or not to allow inventory dragging. EQUIP_TYPE, - DISPLAY_TEXT, + STAT_CHANGE, }; \ No newline at end of file diff --git a/Crawler/State_GameRun.cpp b/Crawler/State_GameRun.cpp index d326cfb9..085354f6 100644 --- a/Crawler/State_GameRun.cpp +++ b/Crawler/State_GameRun.cpp @@ -40,6 +40,7 @@ All rights reserved. #include "DEFINES.h" #include "Menu.h" #include "ItemDrop.h" +#include "VisualNovel.h" INCLUDE_MONSTER_LIST INCLUDE_game diff --git a/Crawler/Version.h b/Crawler/Version.h index 05b0d7e7..f8183211 100644 --- a/Crawler/Version.h +++ b/Crawler/Version.h @@ -39,7 +39,7 @@ All rights reserved. #define VERSION_MAJOR 0 #define VERSION_MINOR 2 #define VERSION_PATCH 1 -#define VERSION_BUILD 3479 +#define VERSION_BUILD 3510 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Crawler/VisualNovel.h b/Crawler/VisualNovel.h index 00b5180d..2f84c7ba 100644 --- a/Crawler/VisualNovel.h +++ b/Crawler/VisualNovel.h @@ -150,8 +150,9 @@ class VisualNovel{ std::string prevTheme=""; float textScrollTime=0; static constexpr float maxTextScrollTime=1.0f; +public: static Font font,narratorFont,locationFont; - +private: static std::setgraphicsToLoad; static safemap>>storyLevelData; diff --git a/Crawler/olcPGEX_TTF.h b/Crawler/olcPGEX_TTF.h index 2b2a944e..4e28ce75 100644 --- a/Crawler/olcPGEX_TTF.h +++ b/Crawler/olcPGEX_TTF.h @@ -287,9 +287,21 @@ namespace olc { olc::Font *prevToUse = nullptr; + Pixel textCol=color; + for (size_t i = 0; i < string.size(); i++) { char32_t chr = string[i]; if(chr=='\r')continue; + else if (chr>=-128&&chr<-105) + { + textCol={PixelGameEngine::charToColor[chr].r,PixelGameEngine::charToColor[chr].g,PixelGameEngine::charToColor[chr].b,color.a}; + continue; + } + else if (chr==Color::Reset[0]) + { + textCol=color; + continue; + } Font *toUse = this; FT_UInt chrIndex = GetCharIndex(chr); @@ -328,7 +340,7 @@ namespace olc { pen.x=rect.offset.x; } else { DrawBitmapTo(slot->bitmap_left, - pge->ScreenHeight() - slot->bitmap_top, bmp, color, + pge->ScreenHeight() - slot->bitmap_top, bmp, textCol, sprite); } } diff --git a/Crawler/olcPixelGameEngine.h b/Crawler/olcPixelGameEngine.h index 13f3d7b0..fdb164ed 100644 --- a/Crawler/olcPixelGameEngine.h +++ b/Crawler/olcPixelGameEngine.h @@ -1191,6 +1191,32 @@ namespace olc int32_t TextEntryGetCursor() const; bool IsTextEntryEnabled() const; + public: + static std::map charToColor; + static std::string Grey; + static std::string Dark_Grey; + static std::string Very_Dark_Grey; + static std::string Red; + static std::string Dark_Red; + static std::string Very_Dark_Red; + static std::string Yellow; + static std::string Dark_Yellow; + static std::string Very_Dark_Yellow; + static std::string Green; + static std::string Dark_Green; + static std::string Very_Dark_Green; + static std::string Cyan; + static std::string Dark_Cyan; + static std::string Very_Dark_Cyan; + static std::string Blue; + static std::string Dark_Blue; + static std::string Very_Dark_Blue; + static std::string Magenta; + static std::string Dark_Magenta; + static std::string Very_Dark_Magenta; + static std::string White; + static std::string Black; + static std::string Reset; private: @@ -1479,6 +1505,31 @@ namespace olc #pragma region pge_implementation namespace olc { + std::map PixelGameEngine::charToColor; + std::string PixelGameEngine::Grey; + std::string PixelGameEngine::Dark_Grey; + std::string PixelGameEngine::Very_Dark_Grey; + std::string PixelGameEngine::Red; + std::string PixelGameEngine::Dark_Red; + std::string PixelGameEngine::Very_Dark_Red; + std::string PixelGameEngine::Yellow; + std::string PixelGameEngine::Dark_Yellow; + std::string PixelGameEngine::Very_Dark_Yellow; + std::string PixelGameEngine::Green; + std::string PixelGameEngine::Dark_Green; + std::string PixelGameEngine::Very_Dark_Green; + std::string PixelGameEngine::Cyan; + std::string PixelGameEngine::Dark_Cyan; + std::string PixelGameEngine::Very_Dark_Cyan; + std::string PixelGameEngine::Blue; + std::string PixelGameEngine::Dark_Blue; + std::string PixelGameEngine::Very_Dark_Blue; + std::string PixelGameEngine::Magenta; + std::string PixelGameEngine::Dark_Magenta; + std::string PixelGameEngine::Very_Dark_Magenta; + std::string PixelGameEngine::White; + std::string PixelGameEngine::Black; + std::string PixelGameEngine::Reset; //Will render the original color provided when used. // O------------------------------------------------------------------------------O // | olc::Pixel IMPLEMENTATION | // O------------------------------------------------------------------------------O @@ -3288,6 +3339,7 @@ namespace olc void PixelGameEngine::DrawStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const olc::vf2d& scale) { olc::vf2d spos = { 0.0f, 0.0f }; + Pixel textCol=col; for (auto c : sText) { if(c=='\r')continue; //Ignore carriage returns. Stupid Linux. @@ -3299,11 +3351,19 @@ namespace olc { spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; } + else if (c>=-128&&c<-105) + { + textCol={charToColor[c].r,charToColor[c].g,charToColor[c].b,col.a}; + } + else if (c==Reset[0]) + { + textCol=col; + } else { int32_t ox = (c - 32) % 16; int32_t oy = (c - 32) / 16; - DrawPartialDecal(pos + spos, fontRenderable.Decal(), {float(ox) * 8.0f, float(oy) * 8.0f}, {8.0f, 8.0f}, scale, col); + DrawPartialDecal(pos + spos, fontRenderable.Decal(), {float(ox) * 8.0f, float(oy) * 8.0f}, {8.0f, 8.0f}, scale, textCol); spos.x += 8.0f * scale.x; } } @@ -3312,6 +3372,7 @@ namespace olc void PixelGameEngine::DrawStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const olc::vf2d& scale) { olc::vf2d spos = { 0.0f, 0.0f }; + Pixel textCol=col; for (auto c : sText) { if(c=='\r')continue; //Ignore carriage returns. Stupid Linux. @@ -3323,21 +3384,31 @@ namespace olc { spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; } + else if (c>=-128&&c<-105) + { + textCol={charToColor[c].r,charToColor[c].g,charToColor[c].b,col.a}; + } + else if (c==Reset[0]) + { + textCol=col; + } else { int32_t ox = (c - 32) % 16; int32_t oy = (c - 32) / 16; - DrawPartialDecal(pos + spos, fontRenderable.Decal(), { float(ox) * 8.0f + float(vFontSpacing[c - 32].x), float(oy) * 8.0f }, { float(vFontSpacing[c - 32].y), 8.0f }, scale, col); + DrawPartialDecal(pos + spos, fontRenderable.Decal(), { float(ox) * 8.0f + float(vFontSpacing[c - 32].x), float(oy) * 8.0f }, { float(vFontSpacing[c - 32].y), 8.0f }, scale, textCol); spos.x += float(vFontSpacing[c - 32].y) * scale.x; } } } void PixelGameEngine::DrawShadowStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const Pixel shadowCol, const olc::vf2d& scale,const float shadowSizeFactor){ + std::string strippedText=sText; + std::erase_if(strippedText,[](char chr){return chr<0;}); for(float y=-shadowSizeFactor;y<=shadowSizeFactor+0.1;y+=shadowSizeFactor/2){ for(float x=-shadowSizeFactor;x<=shadowSizeFactor+0.1;x+=shadowSizeFactor/2){ if(x!=0||y!=0){ - DrawStringDecal(pos+vf2d{x,y}, sText, shadowCol,scale); + DrawStringDecal(pos+vf2d{x,y}, strippedText, shadowCol,scale); } } } @@ -3421,10 +3492,12 @@ namespace olc } void PixelGameEngine::DrawShadowStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const Pixel shadowCol, const olc::vf2d& scale,const float shadowSizeFactor){ + std::string strippedText=sText; + std::erase_if(strippedText,[](char chr){return chr<0;}); for(float y=-shadowSizeFactor;y<=shadowSizeFactor+0.1;y+=shadowSizeFactor/2){ for(float x=-shadowSizeFactor;x<=shadowSizeFactor+0.1;x+=shadowSizeFactor/2){ if(x!=0||y!=0){ - DrawStringPropDecal(pos+vf2d{x,y}, sText, shadowCol,scale); + DrawStringPropDecal(pos+vf2d{x,y}, strippedText, shadowCol,scale); } } } @@ -3432,10 +3505,12 @@ namespace olc } void PixelGameEngine::DrawShadowString(const olc::vi2d& pos, const std::string& sText, Pixel col, const Pixel shadowCol, const olc::vf2d& scale,const float shadowSizeFactor){ + std::string strippedText=sText; + std::erase_if(strippedText,[](char chr){return chr<0;}); for(float y=-shadowSizeFactor;y<=shadowSizeFactor+0.1;y+=shadowSizeFactor/2){ for(float x=-shadowSizeFactor;x<=shadowSizeFactor+0.1;x+=shadowSizeFactor/2){ if(x!=0||y!=0){ - DrawString(int32_t(pos.x+x),int32_t(pos.y+y), sText, shadowCol,int(scale.x)); + DrawString(int32_t(pos.x+x),int32_t(pos.y+y), strippedText, shadowCol,int(scale.x)); } } } @@ -3443,10 +3518,12 @@ namespace olc } void PixelGameEngine::DrawShadowStringProp(const olc::vi2d& pos, const std::string& sText, Pixel col, const Pixel shadowCol, const olc::vf2d& scale,const float shadowSizeFactor){ + std::string strippedText=sText; + std::erase_if(strippedText,[](char chr){return chr<0;}); for(float y=-shadowSizeFactor;y<=shadowSizeFactor+0.1;y+=shadowSizeFactor/2){ for(float x=-shadowSizeFactor;x<=shadowSizeFactor+0.1;x+=shadowSizeFactor/2){ if(x!=0||y!=0){ - DrawStringProp(int32_t(pos.x+x),int32_t(pos.y+y), sText, shadowCol,int(scale.x)); + DrawStringProp(int32_t(pos.x+x),int32_t(pos.y+y), strippedText, shadowCol,int(scale.x)); } } } @@ -3545,6 +3622,7 @@ namespace olc int32_t sx = 0; int32_t sy = 0; Pixel::Mode m = nPixelMode; + Pixel textCol=col; // Thanks @tucna, spotted bug with col.ALPHA :P if (m != Pixel::CUSTOM) // Thanks @Megarev, required for "shaders" { @@ -3562,6 +3640,14 @@ namespace olc { sx += 8 * nTabSizeInSpaces * scale; } + else if (c>=-128&&c<-105) + { + textCol={charToColor[c].r,charToColor[c].g,charToColor[c].b,col.a}; + } + else if (c==Reset[0]) + { + textCol=col; + } else { int32_t ox = (c - 32) % 16; @@ -3574,14 +3660,14 @@ namespace olc if (fontRenderable.Sprite()->GetPixel(i + ox * 8, j + oy * 8).r > 0) for (uint32_t is = 0; is < scale; is++) for (uint32_t js = 0; js < scale; js++) - Draw(x + sx + (i * scale) + is, y + sy + (j * scale) + js, col); + Draw(x + sx + (i * scale) + is, y + sy + (j * scale) + js, textCol); } else { for (uint32_t i = 0; i < 8; i++) for (uint32_t j = 0; j < 8; j++) if (fontRenderable.Sprite()->GetPixel(i + ox * 8, j + oy * 8).r > 0) - Draw(x + sx + i, y + sy + j, col); + Draw(x + sx + i, y + sy + j, textCol); } sx += 8 * scale; } @@ -3615,7 +3701,7 @@ namespace olc int32_t sx = 0; int32_t sy = 0; Pixel::Mode m = nPixelMode; - + Pixel textCol=col; if (m != Pixel::CUSTOM) { if (col.a != 255) SetPixelMode(Pixel::ALPHA); @@ -3632,6 +3718,14 @@ namespace olc { sx += 8 * nTabSizeInSpaces * scale; } + else if (c>=-128&&c<-105) + { + textCol={charToColor[c].r,charToColor[c].g,charToColor[c].b,col.a}; + } + else if (c==Reset[0]) + { + textCol=col; + } else { int32_t ox = (c - 32) % 16; @@ -3644,14 +3738,14 @@ namespace olc if (fontRenderable.Sprite()->GetPixel(i + ox * 8 + vFontSpacing[c - 32].x, j + oy * 8).r > 0) for (int32_t is = 0; is < int(scale); is++) for (int32_t js = 0; js < int(scale); js++) - Draw(x + sx + (i * scale) + is, y + sy + (j * scale) + js, col); + Draw(x + sx + (i * scale) + is, y + sy + (j * scale) + js, textCol); } else { for (int32_t i = 0; i < vFontSpacing[c - 32].y; i++) for (int32_t j = 0; j < 8; j++) if (fontRenderable.Sprite()->GetPixel(i + ox * 8 + vFontSpacing[c - 32].x, j + oy * 8).r > 0) - Draw(x + sx + i, y + sy + j, col); + Draw(x + sx + i, y + sy + j, textCol); } sx += vFontSpacing[c - 32].y * scale; } @@ -4021,6 +4115,55 @@ namespace olc // Start OpenGL, the context is owned by the game thread if (platform->CreateGraphics(bFullScreen, bEnableVSYNC, vViewPos, vViewSize) == olc::FAIL) return; + charToColor[-128]=GREY; + charToColor[-127]=DARK_GREY; + charToColor[-126]=VERY_DARK_GREY; + charToColor[-125]=RED; + charToColor[-124]=DARK_RED; + charToColor[-123]=VERY_DARK_RED; + charToColor[-122]=YELLOW; + charToColor[-121]=DARK_YELLOW; + charToColor[-120]=VERY_DARK_YELLOW; + charToColor[-119]=GREEN; + charToColor[-118]=DARK_GREEN; + charToColor[-117]=VERY_DARK_GREEN; + charToColor[-116]=CYAN; + charToColor[-115]=DARK_CYAN; + charToColor[-114]=VERY_DARK_CYAN; + charToColor[-113]=BLUE; + charToColor[-112]=DARK_BLUE; + charToColor[-111]=VERY_DARK_BLUE; + charToColor[-110]=MAGENTA; + charToColor[-109]=DARK_MAGENTA; + charToColor[-108]=VERY_DARK_MAGENTA; + charToColor[-107]=WHITE; + charToColor[-106]=BLACK; + + Grey =std::string(1,char(-128)); + Dark_Grey =std::string(1,char(-127)); + Very_Dark_Grey =std::string(1,char(-126)); + Red =std::string(1,char(-125)); + Dark_Red =std::string(1,char(-124)); + Very_Dark_Red =std::string(1,char(-123)); + Yellow =std::string(1,char(-122)); + Dark_Yellow =std::string(1,char(-121)); + Very_Dark_Yellow =std::string(1,char(-120)); + Green =std::string(1,char(-119)); + Dark_Green =std::string(1,char(-118)); + Very_Dark_Green =std::string(1,char(-117)); + Cyan =std::string(1,char(-116)); + Dark_Cyan =std::string(1,char(-115)); + Very_Dark_Cyan =std::string(1,char(-114)); + Blue =std::string(1,char(-113)); + Dark_Blue =std::string(1,char(-112)); + Very_Dark_Blue =std::string(1,char(-111)); + Magenta =std::string(1,char(-110)); + Dark_Magenta =std::string(1,char(-109)); + Very_Dark_Magenta =std::string(1,char(-108)); + White =std::string(1,char(-107)); + Black =std::string(1,char(-106)); + Reset =std::string(1,char(-105)); + // Construct default font sheet olc_ConstructFontSheet(); @@ -6954,4 +7097,6 @@ namespace olc using namespace olc; -#define PI 3.14159f \ No newline at end of file +#define PI 3.14159f + +using Color=PixelGameEngine; \ No newline at end of file