diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj b/Adventures in Lestoria/Adventures in Lestoria.vcxproj index 797bce80..77a0f5ae 100644 --- a/Adventures in Lestoria/Adventures in Lestoria.vcxproj +++ b/Adventures in Lestoria/Adventures in Lestoria.vcxproj @@ -526,6 +526,10 @@ + + + + diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters index 61c6d975..fa74026c 100644 --- a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters +++ b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters @@ -441,6 +441,9 @@ Header Files + + Header Files\Interface + diff --git a/Adventures in Lestoria/AdventuresInLestoria.cpp b/Adventures in Lestoria/AdventuresInLestoria.cpp index 77e13220..32aaa5a0 100644 --- a/Adventures in Lestoria/AdventuresInLestoria.cpp +++ b/Adventures in Lestoria/AdventuresInLestoria.cpp @@ -2413,7 +2413,6 @@ void AiL::InitializeDefaultKeybinds(){ KEY_CONFIRM.AddKeybind({CONTROLLER,static_cast(GPButtons::FACE_R)}); //KEY_CONFIRM.AddKeybind({CONTROLLER,static_cast(GPButtons::START)}); KEY_CONFIRM.AddKeybind({KEY,Z}); - KEY_CONFIRM.AddKeybind({KEY,SPACE}); KEY_CONFIRM.AddKeybind({KEY,ENTER}); KEY_BACK.AddKeybind({KEY,X}); KEY_BACK.AddKeybind({KEY,SHIFT}); diff --git a/Adventures in Lestoria/ClassSelectionWindow.cpp b/Adventures in Lestoria/ClassSelectionWindow.cpp index 147ad248..3f5fbd7e 100644 --- a/Adventures in Lestoria/ClassSelectionWindow.cpp +++ b/Adventures in Lestoria/ClassSelectionWindow.cpp @@ -42,24 +42,37 @@ All rights reserved. #include "MenuAnimatedIconToggleButton.h" #include "GameState.h" #include "ClassInfo.h" +#include "SaveFileNameButton.h" +#include "TextEntryLabel.h" INCLUDE_game using A=Attribute; void Menu::InitializeClassSelectionWindow(){ - Menu*classSelectionWindow=CreateMenu(CLASS_SELECTION,CENTERED,game->GetScreenSize()-vi2d{24,24}); + vf2d windowSize=game->GetScreenSize()-vi2d{24,8}; + + Menu*classSelectionWindow=CreateMenu(CLASS_SELECTION,CENTERED,windowSize); classSelectionWindow->S(A::CLASS_SELECTION)="Warrior"; //Default selected class. - vf2d outlineSize=classSelectionWindow->size-vf2d{13,13}; + vf2d outlineSize=classSelectionWindow->size-vf2d{8,29}; + + classSelectionWindow->ADD("Class Selection Title Label",MenuLabel)(geom2d::rect{{4,12},{outlineSize.x,32}},"Choose a Character Class",2,ComponentAttr::SHADOW|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END; - classSelectionWindow->ADD("Class Selection Title Label",MenuLabel)(geom2d::rect{{4,20},{outlineSize.x,32}},"Choose a Character Class",2,ComponentAttr::SHADOW|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END; + auto outline=classSelectionWindow->ADD("Outline Border",MenuLabel)(geom2d::rect{{4,4},outlineSize+vf2d{0,25}},"",1,ComponentAttr::OUTLINE)END; - auto outline=classSelectionWindow->ADD("Outline Border",MenuLabel)(geom2d::rect{{4,4},outlineSize},"",1,ComponentAttr::OUTLINE)END; + classSelectionWindow->ADD("Character Name Label",MenuLabel)(geom2d::rect{{windowSize.x/2-144.f,60.f},{96.f,24.f}},"Name:",2.0f,ComponentAttr::BACKGROUND|ComponentAttr::OUTLINE|ComponentAttr::SHADOW)END; + + classSelectionWindow->ADD("Character Name Box",SaveFileNameButton)(geom2d::rect{{windowSize.x/2-48.f,60.f},{192.f,24}},[&](MenuFuncData data){ + Component(SAVE_FILE_NAME,"Save File Name Text Entry")->SetInput(std::string(SaveFile::GetSaveFileName())); + game->TextEntryEnable(true); + Menu::OpenMenu(SAVE_FILE_NAME); + return true; + },vf2d{2.f,2.f})END; vf2d navigationButtonSize={24*2.5f,16}; - classSelectionWindow->ADD("Confirm",MenuComponent)(geom2d::rect{{outlineSize.x+4-navigationButtonSize.x-2,outlineSize.y+4-navigationButtonSize.y-2},navigationButtonSize},"Confirm",[](MenuFuncData data){ + classSelectionWindow->ADD("Confirm",MenuComponent)(geom2d::rect{{outlineSize.x+4-navigationButtonSize.x-2,outlineSize.y+29-navigationButtonSize.y-2},navigationButtonSize},"Confirm",[](MenuFuncData data){ std::string selectedClass=data.component.lock()->S(A::CLASS_SELECTION); data.game->ChangePlayerClass(classutils::StringToClass(selectedClass)); GameState::ChangeState(States::OVERWORLD_MAP); @@ -72,7 +85,7 @@ void Menu::InitializeClassSelectionWindow(){ float buttonTotalWidth=(buttonSize.x+buttonPadding.x)*3; - vf2d buttonStartPos=outline->GetPos()+vf2d{outlineSize.x/2,outlineSize.y/3}-vf2d{buttonTotalWidth/2,0}; + vf2d buttonStartPos=outline->GetPos()+vf2d{outlineSize.x/2,outlineSize.y/3}-vf2d{buttonTotalWidth/2,0}+vf2d{0,24}; std::arrayclassNames={ Warrior::name, diff --git a/Adventures in Lestoria/LoadFileButton.h b/Adventures in Lestoria/LoadFileButton.h index eda20a27..98ab7ed6 100644 --- a/Adventures in Lestoria/LoadFileButton.h +++ b/Adventures in Lestoria/LoadFileButton.h @@ -70,8 +70,6 @@ public: if(playTime==-1){ window.DrawShadowStringPropDecal(rect.pos+vf2d{2,2},"UNKNOWN"); }else{ - window.DrawShadowStringPropDecal(rect.pos+vf2d{2,2},saveFileName); - const std::mapclassAnimations={ {Warrior::name,Warrior::walk_s}, {Ranger::name,Ranger::walk_s}, @@ -85,6 +83,16 @@ public: vf2d chapterTextSize=game->GetTextSize(chapterText); window.DrawShadowStringDecal(rect.pos+vf2d{rect.size.x-chapterTextSize.x-2,2},chapterText); + + vf2d saveFileNameSize=game->GetTextSizeProp(saveFileName); + float spaceAvailable=rect.size.x-chapterTextSize.x-8; + float scaleRatio=1.f; + if(saveFileNameSize.x>spaceAvailable){ + scaleRatio=spaceAvailable/saveFileNameSize.x; + } + + window.DrawShadowStringPropDecal(rect.pos+vf2d{2,2},saveFileName,WHITE,BLACK,vf2d{scaleRatio,1.f}); + const Animate2D::Frame&frame=ANIMATION_DATA[classAnimations.at(className)].GetFrame(animationTime); geom2d::rectsprRect=frame.GetSourceRect(); window.DrawPartialDecal(rect.pos+vf2d{rect.size.x-26,rect.size.y-36},sprRect.size,frame.GetSourceImage()->Decal(),sprRect.pos,sprRect.size); diff --git a/Adventures in Lestoria/LoadGameWindow.cpp b/Adventures in Lestoria/LoadGameWindow.cpp index aa578d0a..a5cea7c8 100644 --- a/Adventures in Lestoria/LoadGameWindow.cpp +++ b/Adventures in Lestoria/LoadGameWindow.cpp @@ -45,9 +45,9 @@ void Menu::InitializeLoadGameWindow(){ loadGameWindow->ADD("Game Files Label",MenuLabel)(geom2d::rect{{-8,-12},{112,12}},"Load Game",1.0f,ComponentAttr::SHADOW|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END; loadGameWindow->ADD("Game Files List",ScrollableWindowComponent)(geom2d::rect{{-8,4},{112,116}})END - ->Enable(false); - loadGameWindow->ADD("Online Game Files List",ScrollableWindowComponent)(geom2d::rect{{-8,4},{112,116}})END ->Enable(true); + loadGameWindow->ADD("Online Game Files List",ScrollableWindowComponent)(geom2d::rect{{-8,4},{112,116}})END + ->Enable(false); loadGameWindow->ADD("Go Back Button",MenuComponent)(geom2d::rect{{24,124},{48,12}},"Back",[](MenuFuncData menu){Menu::CloseMenu();return true;})END; diff --git a/Adventures in Lestoria/MainMenuWindow.cpp b/Adventures in Lestoria/MainMenuWindow.cpp index 71f5a048..0b63502b 100644 --- a/Adventures in Lestoria/MainMenuWindow.cpp +++ b/Adventures in Lestoria/MainMenuWindow.cpp @@ -40,25 +40,20 @@ All rights reserved. #include "Menu.h" #include "MenuComponent.h" #include "SaveFile.h" +#include "util.h" INCLUDE_game +INCLUDE_DATA using A=Attribute; void Menu::InitializeMainMenuWindow(){ Menu*mainMenuWindow=CreateMenu(MAIN_MENU,vi2d{132,120},vi2d{96,96}); auto newGameButton=mainMenuWindow->ADD("New Game Button",MenuComponent)(geom2d::rect{{12,4},{72,24}},"New Game",[&](MenuFuncData data){ - game->TextEntryEnable(true); - #ifdef __EMSCRIPTEN__ - data.menu.S(A::NEXT_MENU)="New Game"; - if(SaveFile::GetUserID().length()==0){ - Menu::OpenMenu(USER_ID); - }else{ - Menu::OpenMenu(SAVE_FILE_NAME); - } - #else - Menu::OpenMenu(SAVE_FILE_NAME); - #endif + std::string randomName=DATA["Player"]["Default Female Name"].GetString(util::random()%DATA["Player"]["Default Female Name"].GetValueCount()); + + SaveFile::SetSaveFileName(randomName); //Randomize a default name. + Menu::OpenMenu(CLASS_SELECTION); return true; })END; auto loadGameButton=mainMenuWindow->ADD("Load Game Button",MenuComponent)(geom2d::rect{{12,36},{72,24}},"Load Game",[](MenuFuncData data){ diff --git a/Adventures in Lestoria/Menu.cpp b/Adventures in Lestoria/Menu.cpp index 9749a38a..a90a050f 100644 --- a/Adventures in Lestoria/Menu.cpp +++ b/Adventures in Lestoria/Menu.cpp @@ -171,11 +171,9 @@ void Menu::Update(AiL*game){ bool itemHovered=false; if(!UsingMouseNavigation()){ - if(!game->IsTextEntryEnabled()){ - if(!selection.expired()){ - selection.lock()->hovered=true; - itemHovered=true; - } + if(!selection.expired()){ + selection.lock()->hovered=true; + itemHovered=true; } }else{ selection={}; @@ -204,14 +202,12 @@ void Menu::Update(AiL*game){ }; if(!UsingMouseNavigation()){ - if(!game->IsTextEntryEnabled()){ - if(game->KEY_CONFIRM.Released()){ - if(selection.expired()){//Dropping over an empty area. - ClearDraggingComponent(); - }else - if(selection.lock()->DropDraggableItem(std::move(draggingComponent))){ - ClearDraggingComponent(); - } + if(game->KEY_CONFIRM.Released()){ + if(selection.expired()){//Dropping over an empty area. + ClearDraggingComponent(); + }else + if(selection.lock()->DropDraggableItem(std::move(draggingComponent))){ + ClearDraggingComponent(); } } }else{ @@ -226,9 +222,7 @@ void Menu::Update(AiL*game){ } } - if(!game->IsTextEntryEnabled()){ - KeyboardButtonNavigation(game,pos); - } + KeyboardButtonNavigation(game,pos); for(auto&[key,component]:components){ if(component->renderInMain){ diff --git a/Adventures in Lestoria/MenuComponent.cpp b/Adventures in Lestoria/MenuComponent.cpp index 3bcce5d7..331f3ad0 100644 --- a/Adventures in Lestoria/MenuComponent.cpp +++ b/Adventures in Lestoria/MenuComponent.cpp @@ -109,9 +109,10 @@ void MenuComponent::DrawDecal(ViewPort&window,bool focused){ vi2d labelTextSize=vf2d(game->GetTextSizeProp(label))*adjustedScale; if(fitToLabel){ - float sizeRatio=((vf2d(labelTextSize)*adjustedScale).x)/(rect.size.x-2); + float sizeRatio=(vf2d(labelTextSize).x)/(rect.size.x-2); if(sizeRatio>1){ adjustedScale.x/=sizeRatio; + labelTextSize.x/=sizeRatio; } } window.DrawStringPropDecal(rect.pos+V(A::DRAW_OFFSET)+rect.size/2-vf2d(labelTextSize)/2.f,label,WHITE,adjustedScale); diff --git a/Adventures in Lestoria/SaveFile.cpp b/Adventures in Lestoria/SaveFile.cpp index 2821f13d..b39d4ad1 100644 --- a/Adventures in Lestoria/SaveFile.cpp +++ b/Adventures in Lestoria/SaveFile.cpp @@ -51,7 +51,7 @@ INCLUDE_game size_t SaveFile::saveFileID=0; std::string SaveFile::saveFileName=""; std::string SaveFile::username=""; -bool SaveFile::onlineMode=true; +bool SaveFile::onlineMode=false; const size_t SaveFile::GetSaveFileCount(){ std::filesystem::create_directories("save_file_path"_S); diff --git a/Adventures in Lestoria/SaveFileNameButton.h b/Adventures in Lestoria/SaveFileNameButton.h new file mode 100644 index 00000000..44960923 --- /dev/null +++ b/Adventures in Lestoria/SaveFileNameButton.h @@ -0,0 +1,53 @@ +#pragma region License +/* +License (OLC-3) +~~~~~~~~~~~~~~~ + +Copyright 2024 Joshua Sigona + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions or derivations of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions or derivative works in binary form must reproduce the above +copyright notice. This list of conditions and the following disclaimer must be +reproduced in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may +be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +Portions of this software are copyright © 2023 The FreeType +Project (www.freetype.org). Please see LICENSE_FT.txt for more information. +All rights reserved. +*/ +#pragma endregion +#pragma once + +#include "MenuComponent.h" +#include "SaveFile.h" + +class SaveFileNameButton:public MenuComponent{ +public: + inline SaveFileNameButton(geom2d::rectrect,MenuFunc onClick,vf2d labelScaling,ButtonAttr attributes=ButtonAttr::FIT_TO_LABEL) + :MenuComponent(rect,"",MenuType::ENUM_END,onClick,labelScaling,attributes){} + + inline void Update(AiL*game)override{ + MenuComponent::Update(game); + + label=SaveFile::GetSaveFileName(); + } +}; \ No newline at end of file diff --git a/Adventures in Lestoria/SaveFileWindow.cpp b/Adventures in Lestoria/SaveFileWindow.cpp index 726f3849..316a046e 100644 --- a/Adventures in Lestoria/SaveFileWindow.cpp +++ b/Adventures in Lestoria/SaveFileWindow.cpp @@ -42,12 +42,12 @@ All rights reserved. void Menu::InitializeSaveFileWindow(){ Menu*saveFileWindow=CreateMenu(SAVE_FILE_NAME,CENTERED,vi2d{96,96}); - saveFileWindow->ADD("Save File Name Entry Label",MenuLabel)(geom2d::rect{{-8,0},{112,36}},"Save File Name:",1.0f,ComponentAttr::SHADOW)END; + saveFileWindow->ADD("Save File Name Entry Label",MenuLabel)(geom2d::rect{{-8,0},{112,36}},"Character Name:",1.0f,ComponentAttr::SHADOW)END; saveFileWindow->ADD("Save File Name Text Entry",TextEntryLabel)(geom2d::rect{{-8,36},{112,24}},[](std::string_view updatedLabel){ Component(SAVE_FILE_NAME,"Continue Button")->SetGrayedOut(updatedLabel.length()==0); },false,16U,2.f,ComponentAttr::FIT_TO_LABEL|ComponentAttr::OUTLINE|ComponentAttr::SHADOW|ComponentAttr::BACKGROUND)END; - saveFileWindow->ADD("Back Button",MenuComponent)(geom2d::rect{{-8,68},{48,12}},"Back",[](MenuFuncData data){Menu::CloseMenu();game->TextEntryEnable(false);return true;})END; - saveFileWindow->ADD("Continue Button",MenuComponent)(geom2d::rect{{56,68},{48,12}},"Begin",MenuType::CLASS_SELECTION,[](MenuFuncData data){ + saveFileWindow->ADD("Back Button",MenuComponent)(geom2d::rect{{-8,68},{48,12}},"Cancel",[](MenuFuncData data){Menu::CloseMenu();game->TextEntryEnable(false);return true;})END; + saveFileWindow->ADD("Continue Button",MenuComponent)(geom2d::rect{{56,68},{48,12}},"Submit",MenuType::CLASS_SELECTION,[](MenuFuncData data){ SaveFile::SetSaveFileName(game->TextEntryGetString()); if(SaveFile::IsOnline()){ SaveFile::SetSaveFileID(SaveFile::GetOnlineSaveFileCount()); @@ -55,7 +55,6 @@ void Menu::InitializeSaveFileWindow(){ SaveFile::SetSaveFileID(SaveFile::GetSaveFileCount()); } game->TextEntryEnable(false); - SaveFile::SaveGame(); return true; })END ->SetGrayedOut(true); @@ -72,13 +71,6 @@ void Menu::InitializeSaveFileWindow(){ {game->KEY_SELECT,{"Return to Title Screen",[](MenuType type){ Component(type,"Back Button")->Click(); }}}, - } - ,{ //Button Navigation Rules - {"Continue Button",{ - .left="Back Button", - .right="Back Button",}}, - {"Back Button",{ - .left="Continue Button", - .right="Continue Button",}}, - }); + }, + {}); } \ No newline at end of file diff --git a/Adventures in Lestoria/ScrollableWindowComponent.h b/Adventures in Lestoria/ScrollableWindowComponent.h index 106cf39b..22c39db6 100644 --- a/Adventures in Lestoria/ScrollableWindowComponent.h +++ b/Adventures in Lestoria/ScrollableWindowComponent.h @@ -229,8 +229,8 @@ protected: float focusedWindowColorMult=(focused?1:"ThemeGlobal.MenuUnfocusedColorMult"_F); - window.FillRectDecal(rect.pos+parentPos+vf2d{rect.size.x-11.75f,scrollBarTop+12},{12,scrollBarHeight},PixelLerp(Menu::GetCurrentTheme().GetButtonCol(),Menu::GetCurrentTheme().GetHighlightCol(),scrollBarHoverTime/"ThemeGlobal.HighlightTime"_F)*focusedWindowColorMult); - window.DrawRectDecal(rect.pos+parentPos+vf2d{rect.size.x-11.75f,scrollBarTop+12},{12,scrollBarHeight},WHITE*focusedWindowColorMult); + window.FillRectDecal(rect.pos+parentPos+vf2d{rect.size.x-12.f,scrollBarTop+12},{12,scrollBarHeight},PixelLerp(Menu::GetCurrentTheme().GetButtonCol(),Menu::GetCurrentTheme().GetHighlightCol(),scrollBarHoverTime/"ThemeGlobal.HighlightTime"_F)*focusedWindowColorMult); + window.DrawRectDecal(rect.pos+parentPos+vf2d{rect.size.x-12.f,scrollBarTop+12},{12,scrollBarHeight},WHITE*focusedWindowColorMult); } inline float GetComponentIndex(std::weak_ptrcomp){ diff --git a/Adventures in Lestoria/TextEntryLabel.h b/Adventures in Lestoria/TextEntryLabel.h index 90668215..92a9f890 100644 --- a/Adventures in Lestoria/TextEntryLabel.h +++ b/Adventures in Lestoria/TextEntryLabel.h @@ -77,6 +77,12 @@ public: } } + inline virtual void SetInput(std::string text){ + game->TextEntrySetString(text); + label=text; + if(runOnLabelChangeFunc)onLabelChangeFunc(text); + } + inline const std::string&GetLabel()const override{ if(censored){ return game->TextEntryGetString(); diff --git a/Adventures in Lestoria/Version.h b/Adventures in Lestoria/Version.h index 354c2a0e..e0993a9c 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 6402 +#define VERSION_BUILD 6436 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Adventures in Lestoria/assets/config/Player.txt b/Adventures in Lestoria/assets/config/Player.txt index 61c6f026..4dd166a4 100644 --- a/Adventures in Lestoria/assets/config/Player.txt +++ b/Adventures in Lestoria/assets/config/Player.txt @@ -11,6 +11,12 @@ Player Starting Money = 100 + # A default starting name for the character. Specify multiple to randomize. + Default Female Name = Nia, Lea, Poppy, Ruby, Arc + + # A default starting name for the character. Specify multiple to randomize. + Default Male Name = Cyrus, Odin, Usio, Lucio + # Amount of spd to increase/decrease vertically as you climb staircases StaircaseClimbSpd = 45 diff --git a/Adventures in Lestoria/olcPixelGameEngine.h b/Adventures in Lestoria/olcPixelGameEngine.h index bc97d09f..8732595b 100644 --- a/Adventures in Lestoria/olcPixelGameEngine.h +++ b/Adventures in Lestoria/olcPixelGameEngine.h @@ -1208,6 +1208,7 @@ namespace olc // Text Entry Routines void TextEntryEnable(const bool bEnable, const std::string& sText = ""); const std::string&TextEntryGetString() const; + void TextEntrySetString(const std::string&str); int32_t TextEntryGetCursor() const; bool IsTextEntryEnabled() const; void TextEntrySetCharLimit(const uint8_t charLimit); @@ -4299,6 +4300,12 @@ namespace olc const std::string&PixelGameEngine::TextEntryGetString() const { return sTextEntryString; } + + void PixelGameEngine::TextEntrySetString(const std::string&str){ + sTextEntryString=str; + nTextEntryCursor=sTextEntryString.length(); + }; + int32_t PixelGameEngine::TextEntryGetCursor() const { return nTextEntryCursor; }