diff --git a/.gitignore b/.gitignore index 9cee0b3d..f44f6485 100644 --- a/.gitignore +++ b/.gitignore @@ -425,3 +425,4 @@ desktop.ini /Adventures in Lestoria Tests/x64/Unit Testing /x64/Unit Testing /Adventures in Lestoria/assets/2.10 +/Adventures in Lestoria/assets/items/Bird_s Treasure.png diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj b/Adventures in Lestoria/Adventures in Lestoria.vcxproj index cb4ccfee..390488e8 100644 --- a/Adventures in Lestoria/Adventures in Lestoria.vcxproj +++ b/Adventures in Lestoria/Adventures in Lestoria.vcxproj @@ -218,7 +218,7 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true stdcpp20 - C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\steam;C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;C:\Users\sigon\OneDrive\Documents\include;%(AdditionalIncludeDirectories) + C:\Users\LabUser\source\repos\AdventuresInLestoria\Adventures in Lestoria\steam;C:\Users\LabUser\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;C:\Users\LabUser\Documents\include;C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\steam;C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;C:\Users\sigon\OneDrive\Documents\include;%(AdditionalIncludeDirectories) /MP20 %(AdditionalOptions) 4099;5030;4715;4172;4834 true @@ -226,7 +226,7 @@ Console true - C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria;%(AdditionalLibraryDirectories) + C:\Users\LabUser\source\repos\AdventuresInLestoria\Adventures in Lestoria;C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria;%(AdditionalLibraryDirectories) discord_game_sdk.dll.lib;freetype.lib;steam_api64.lib;$(CoreLibraryDependencies);%(AdditionalDependencies); @@ -622,6 +622,7 @@ + @@ -725,6 +726,7 @@ + @@ -1054,6 +1056,7 @@ + @@ -1167,6 +1170,11 @@ + + + + + diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters index 94a086eb..2e952113 100644 --- a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters +++ b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters @@ -669,6 +669,9 @@ Header Files + + Header Files\State + @@ -1154,8 +1157,11 @@ Source Files\Bullet Types - - Configurations\Story + + Source Files\Game States + + + Source Files\Interface @@ -1340,6 +1346,21 @@ Documentation\Mechanics + + Configurations\Story + + + Configurations\Story + + + Configurations\Story + + + Configurations\Story + + + Configurations\Story + diff --git a/Adventures in Lestoria/AdventuresInLestoria.cpp b/Adventures in Lestoria/AdventuresInLestoria.cpp index 57371129..aec06d78 100644 --- a/Adventures in Lestoria/AdventuresInLestoria.cpp +++ b/Adventures in Lestoria/AdventuresInLestoria.cpp @@ -437,7 +437,7 @@ bool AiL::DownPressed(){ } void AiL::HandleUserInput(float fElapsedTime){ - if(!Menu::stack.empty())return; //A window being opened means there's no user input allowed. + if(!Menu::stack.empty()||GameState::STATE==GameState::states[States::DIALOG])return; //A window being opened means there's no user input allowed. if(GetKey(SCROLL).bPressed)displayHud=!displayHud; bool setIdleAnimation=true; diff --git a/Adventures in Lestoria/ArtificerWindow.cpp b/Adventures in Lestoria/ArtificerWindow.cpp new file mode 100644 index 00000000..f19af5eb --- /dev/null +++ b/Adventures in Lestoria/ArtificerWindow.cpp @@ -0,0 +1,100 @@ +#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 © 2024 The FreeType +Project (www.freetype.org). Please see LICENSE_FT.txt for more information. +All rights reserved. +*/ +#pragma endregion + +#include "Menu.h" +#include "MenuComponent.h" +#include "GameState.h" +#include "AdventuresInLestoria.h" +#include "Unlock.h" +#include "MenuLabel.h" +#include "VisualNovel.h" + +INCLUDE_game + +void Menu::InitializeArtificerWindow(){ + Menu*artificerWindow=CreateMenu(ARTIFICER,CENTERED,vi2d{144,144}); + + artificerWindow->ADD("Refine Button",MenuComponent)(geom2d::rect{{0.f,4.f},{144.f,24.f}},"Refine",[](MenuFuncData data){ + + return true; + },vf2d{2.f,2.f},ButtonAttr::FIT_TO_LABEL)END; + artificerWindow->ADD("Disassemble Button",MenuComponent)(geom2d::rect{{0.f,32.f},{144.f,24.f}},"Disassemble",[](MenuFuncData data){ + return true; + },vf2d{2.f,2.f},ButtonAttr::FIT_TO_LABEL)END; + artificerWindow->ADD("Enchant Button",MenuComponent)(geom2d::rect{{0.f,60.f},{144.f,24.f}},"Enchant",[](MenuFuncData data){ + + return true; + },vf2d{2.f,2.f},ButtonAttr::FIT_TO_LABEL)END; + artificerWindow->ADD("Help Button",MenuComponent)(geom2d::rect{{0.f,88.f},{144.f,24.f}},"Help",[](MenuFuncData data){ + VisualNovel::LoadDialog("ARTIFICER_HELP",[](){Menu::OpenMenu(MenuType::ARTIFICER);}); + return true; + },vf2d{2.f,2.f},ButtonAttr::FIT_TO_LABEL)END; + artificerWindow->ADD("Leave Button",MenuComponent)(geom2d::rect{{0.f,116.f},{144.f,24.f}},"Leave",[](MenuFuncData data){ + Menu::CloseMenu(); + return true; + },vf2d{2.f,2.f},ButtonAttr::FIT_TO_LABEL)END; + + artificerWindow->SetupKeyboardNavigation( + [](MenuType type,Data&returnData){ //On Open + returnData="Refine Button"; + }, + { //Button Key + {game->KEY_SCROLL,{"Navigate",[](MenuType type){}}}, + {game->KEY_BACK,{"Stay",[](MenuType type){ + Menu::CloseMenu(); + }}}, + {game->KEY_CONFIRM,{"Select",[](MenuType type){}}}, + } + ,{ //Button Navigation Rules + {"Refine Button",{ + .up="Leave Button", + .down="Disassemble Button",}}, + {"Disassemble Button",{ + .up="Refine Button", + .down="Enchant Button",}}, + {"Enchant Button",{ + .up="Disassemble Button", + .down="Help Button",}}, + {"Help Button",{ + .up="Enchant Button", + .down="Leave Button",}}, + {"Leave Button",{ + .up="Help Button", + .down="Refine Button",}}, + }); +} \ No newline at end of file diff --git a/Adventures in Lestoria/Buff.cpp b/Adventures in Lestoria/Buff.cpp index 8c523ac7..d7242133 100644 --- a/Adventures in Lestoria/Buff.cpp +++ b/Adventures in Lestoria/Buff.cpp @@ -108,22 +108,22 @@ void Buff::BuffTick(AiL*game,float fElapsedTime){ }break; case HP_PCT_RESTORATION:{ if(OwnerIsPlayer())GetPlayer()->Heal(GetPlayer()->GetMaxHealth()*intensity/100.f); - else if(OwnerIsMonster())GetMonster()->Heal(GetMonster()->GetMaxHealth()*intensity/100.f); + else if(OwnerIsMonster()){if(MonsterIsValid())GetMonster()->Heal(GetMonster()->GetMaxHealth()*intensity/100.f);} else ERR("WARNING! Buff Over Time attached Target is somehow not a Player nor a Monster Pointer! THIS SHOULD NOT BE HAPPENING!") }break; case MP_PCT_RESTORATION:{ if(OwnerIsPlayer())GetPlayer()->RestoreMana(GetPlayer()->GetMaxMana()*intensity/100.f); - else if(OwnerIsMonster())ERR("WARNING! Monsters don't have mana, this functionality is not supported!") + else if(OwnerIsMonster()){ERR("WARNING! Monsters don't have mana, this functionality is not supported!")} else ERR("WARNING! Buff Over Time attached Target is somehow not a Player nor a Monster Pointer! THIS SHOULD NOT BE HAPPENING!") }break; case HP_DAMAGE_OVER_TIME:{ if(OwnerIsPlayer())GetPlayer()->Hurt(intensity,GetPlayer()->OnUpperLevel(),GetPlayer()->GetZ(),HurtFlag::DOT); - else if(OwnerIsMonster())GetMonster()->Hurt(intensity,GetMonster()->OnUpperLevel(),GetMonster()->GetZ(),HurtFlag::DOT); + else if(OwnerIsMonster()){if(MonsterIsValid())GetMonster()->Hurt(intensity,GetMonster()->OnUpperLevel(),GetMonster()->GetZ(),HurtFlag::DOT);} else ERR("WARNING! Buff Over Time attached Target is somehow not a Player nor a Monster Pointer! THIS SHOULD NOT BE HAPPENING!") }break; case HP_PCT_DAMAGE_OVER_TIME:{ if(OwnerIsPlayer())GetPlayer()->Hurt(GetPlayer()->GetMaxHealth()*intensity/100.f,GetPlayer()->OnUpperLevel(),GetPlayer()->GetZ(),HurtFlag::DOT); - else if(OwnerIsMonster())GetMonster()->Hurt(GetMonster()->GetMaxHealth()*intensity/100.f,GetMonster()->OnUpperLevel(),GetMonster()->GetZ(),HurtFlag::DOT); + else if(OwnerIsMonster()){if(MonsterIsValid())GetMonster()->Hurt(GetMonster()->GetMaxHealth()*intensity/100.f,GetMonster()->OnUpperLevel(),GetMonster()->GetZ(),HurtFlag::DOT);} else ERR("WARNING! Buff Over Time attached Target is somehow not a Player nor a Monster Pointer! THIS SHOULD NOT BE HAPPENING!") }break; } diff --git a/Adventures in Lestoria/Chapter 2.txt b/Adventures in Lestoria/Chapter 2.txt deleted file mode 100644 index 15ed0929..00000000 --- a/Adventures in Lestoria/Chapter 2.txt +++ /dev/null @@ -1,26 +0,0 @@ -===ARTIFICER_INTRO=== -{BACKGROUND commercial_assets/Forest Clearing Campsite_Day.png} - -[Artificer] -Hello adventurer! Welcome to my artificing station! I have not met you yet, may I have the pleasure of knowing your name? - -[You] -Hello, my name is [You]. - -[Artificer] -Excellent! Nice to meet you, [You]. At my station you have the ability to refine and fix up imperfect jewelry discovered while exploring! - -Disassemble rings that are undesirable to you and retrieve fragments of them, then use the Refine station to empower your equipment further! - -This should let you get some use out of all those extra rings you're carrying around, eh? - -[You] -Great, I think I could make good use of this. Thank you. - -===ARTIFICER_HELP=== -[Artificer] -At this station you have the ability to refine and fix up imperfect jewelry discovered while exploring! - -Disassemble rings that are undesirable to you and retrieve fragments of them, then use the Refine station to empower your equipment further! - -You can make use of those extra rings you have been piling up! \ No newline at end of file diff --git a/Adventures in Lestoria/Crawler_Artificer.txt b/Adventures in Lestoria/Crawler_Artificer.txt index 8f31a372..9b25e9eb 100644 --- a/Adventures in Lestoria/Crawler_Artificer.txt +++ b/Adventures in Lestoria/Crawler_Artificer.txt @@ -19,6 +19,12 @@ Artificer: Excelent! Nice to meet you, [YOU]. Here you have the ability to refin Artificer: Break down rings that are undesirable to you to retrieve fragments, then use the Refining station to empower your equipment further! Artificer: This will let you get use out of all those extra rings you may be carrying around, eh? +(Auto-generate fragment item types for each ring) +Confirmation dialog for disassembly + +Refining: Popup a dialog showing current stats of selected ring, show possible upgraded stats as (+ ??) +Hit Refine button to consume fragment to upgrade some stat. Play an animation next to stat that was upgraded. +(Whichever is greater): Always go up by 20%/Always go up by 1 Artificer has 4 Dialog Options - Repair/Enhance/(Refine?) (Name may change in the future) @@ -28,7 +34,7 @@ Artificer has 4 Dialog Options - Leave -(Whichever is greater): Always go up by 20%/Always go up by 1 + Enhancing Gear - increases the stats of an item. diff --git a/Adventures in Lestoria/GameState.cpp b/Adventures in Lestoria/GameState.cpp index 9d21e155..1f824c30 100644 --- a/Adventures in Lestoria/GameState.cpp +++ b/Adventures in Lestoria/GameState.cpp @@ -42,12 +42,15 @@ All rights reserved. #include "State_LevelComplete.h" #include "State_Story.h" #include "State_GameHub.h" -#include "State_Death.h"; +#include "State_Death.h" +#include "State_Dialog.h" INCLUDE_game #define NEW_STATE(state,class) GameState::states[state]=NEW class(); +States::State GameState::currentState; + void GameState::Initialize(){ NEW_STATE(States::GAME_RUN,State_GameRun); NEW_STATE(States::OVERWORLD_MAP,State_OverworldMap); @@ -56,10 +59,12 @@ void GameState::Initialize(){ NEW_STATE(States::STORY,State_Story); NEW_STATE(States::GAME_HUB,State_GameHub); NEW_STATE(States::DEATH,State_Death); + NEW_STATE(States::DIALOG,State_Dialog); } void GameState::_ChangeState(States::State newState){ GameState*prevState=STATE; + currentState=newState; if(!states.count(newState)){ ERR("WARNING! State not defined for state "<states; @@ -75,4 +78,5 @@ public: virtual void GetAnyMouseRelease(int32_t mouseButton); static void ChangeState(States::State newState,float fadeOutDuration=0,uint8_t mosaicEffect=1U); virtual void OnLevelLoad()=0; + static States::State GetCurrentState(); }; \ No newline at end of file diff --git a/Adventures in Lestoria/Menu.cpp b/Adventures in Lestoria/Menu.cpp index 658042db..d29d2ef0 100644 --- a/Adventures in Lestoria/Menu.cpp +++ b/Adventures in Lestoria/Menu.cpp @@ -118,6 +118,7 @@ void Menu::InitializeMenus(){ InitializePauseWindow(); InitializeDeathWindow(); InitializeCreditsWindow(); + InitializeArtificerWindow(); for(MenuType type=MenuType(int(MenuType::ENUM_START)+1);type>Monster::GetNearestMonster(const vf2d point } const bool Monster::InUndamageableState(const bool onUpperLevel,const float z)const{ - return Invulnerable()||!IsAlive()||onUpperLevel!=OnUpperLevel()||AttackAvoided(z); + return Invulnerable()||!IsAlive()||onUpperLevel!=OnUpperLevel()||AttackAvoided(z)||IsNPC(); } void Monster::AddBuff(BuffRestorationType type,BuffOverTimeType::BuffOverTimeType overTimeType,float duration,float intensity,float timeBetweenTicks){ diff --git a/Adventures in Lestoria/NPC.cpp b/Adventures in Lestoria/NPC.cpp index cebb79ed..53b06421 100644 --- a/Adventures in Lestoria/NPC.cpp +++ b/Adventures in Lestoria/NPC.cpp @@ -45,6 +45,7 @@ All rights reserved. #include "RowInventoryScrollableWindowComponent.h" #include "InventoryCreator.h" #include "Tutorial.h" +#include "VisualNovel.h" using A=Attribute; @@ -66,7 +67,7 @@ void Monster::STRATEGY::NPC(Monster&m,float fElapsedTime,std::string strategy){ float distFromPlayer=geom2d::line(m.GetPos(),game->GetPlayer()->GetPos()).length(); if(distFromPlayerKEY_CONFIRM.Released()&&Menu::stack.size()==0){ + if(GameState::STATE!=GameState::states[States::DIALOG]&&game->KEY_CONFIRM.Released()&&Menu::stack.size()==0){ if(m.npcData.function=="Blacksmith"){ Menu::OpenMenu(MenuType::BLACKSMITH); //First reset all items displayed in the blacksmith's shop (showing only our equipment.) @@ -85,7 +86,12 @@ void Monster::STRATEGY::NPC(Monster&m,float fElapsedTime,std::string strategy){ Menu::OpenMenu(MenuType::MERCHANT); }else if(m.npcData.function=="Artificer"){ - Menu::OpenMenu(MenuType::MERCHANT); + if(!Tutorial::TaskIsComplete(TutorialTaskName::ARTIFICER_INTRO)){ + Tutorial::CompleteTask(TutorialTaskName::ARTIFICER_INTRO); + VisualNovel::LoadDialog("ARTIFICER_INTRO",[](){Menu::OpenMenu(MenuType::ARTIFICER);}); + }else{ + Menu::OpenMenu(MenuType::ARTIFICER); + } } } }else{ diff --git a/Adventures in Lestoria/State_Dialog.cpp b/Adventures in Lestoria/State_Dialog.cpp new file mode 100644 index 00000000..107d753d --- /dev/null +++ b/Adventures in Lestoria/State_Dialog.cpp @@ -0,0 +1,55 @@ +#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 © 2024 The FreeType +Project (www.freetype.org). Please see LICENSE_FT.txt for more information. +All rights reserved. +*/ +#pragma endregion +#include "State_Dialog.h" +#include "VisualNovel.h" +#include "Menu.h" +#include "AdventuresInLestoria.h" + +void State_Dialog::OnStateChange(GameState*prevState){ + if(Menu::IsMenuOpen())Menu::CloseAllMenus(); +}; +void State_Dialog::OnLevelLoad(){} +void State_Dialog::OnUserUpdate(AiL*game){ + GameState::states[VisualNovel::novel.previousState]->OnUserUpdate(game); + VisualNovel::novel.Update(); + game->ClearTimedOutGarbage(); +}; +void State_Dialog::Draw(AiL*game){ + GameState::states[VisualNovel::novel.previousState]->Draw(game); + VisualNovel::novel.Draw(0U); +}; \ No newline at end of file diff --git a/Adventures in Lestoria/State_Dialog.h b/Adventures in Lestoria/State_Dialog.h new file mode 100644 index 00000000..9fbf78b4 --- /dev/null +++ b/Adventures in Lestoria/State_Dialog.h @@ -0,0 +1,46 @@ +#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 © 2024 The FreeType +Project (www.freetype.org). Please see LICENSE_FT.txt for more information. +All rights reserved. +*/ +#pragma endregion +#pragma once +#include "GameState.h" + +class State_Dialog:public GameState { + virtual void OnStateChange(GameState*prevState)override final; + virtual void OnUserUpdate(AiL*game)override final; + virtual void Draw(AiL*game)override final; + virtual void OnLevelLoad()override final; +}; \ No newline at end of file diff --git a/Adventures in Lestoria/Tutorial.cpp b/Adventures in Lestoria/Tutorial.cpp index cffe40b5..b5e0a21b 100644 --- a/Adventures in Lestoria/Tutorial.cpp +++ b/Adventures in Lestoria/Tutorial.cpp @@ -51,6 +51,7 @@ void Tutorial::Initialize(){ CREATETASK(TutorialTaskName::USE_RECOVERY_ITEMS,UseRecoveryItemsTask); CREATETASK(TutorialTaskName::BLACKSMITH,BlacksmithTask); CREATETASK(TutorialTaskName::EQUIP_GEAR,EquipGearTask); + CREATETASK(TutorialTaskName::ARTIFICER_INTRO,ArtificerIntroductionTask); currentTaskState=TutorialTaskName::SET_LOADOUT_ITEM; ResetTasks(); } diff --git a/Adventures in Lestoria/Tutorial.h b/Adventures in Lestoria/Tutorial.h index 6a885d02..e905f3a1 100644 --- a/Adventures in Lestoria/Tutorial.h +++ b/Adventures in Lestoria/Tutorial.h @@ -63,6 +63,7 @@ enum class TutorialTaskName{ USE_RECOVERY_ITEMS, BLACKSMITH, EQUIP_GEAR, + ARTIFICER_INTRO, NONE, }; @@ -355,4 +356,14 @@ private: startGroup.DrawInput(game,{game->ScreenWidth()/2.f,48.f},"to equip your new gear.",255,InputType::KEY,{0.85f,1.f},"Open the #FFCF0CCharacter#FFFFFF menu with "); } } +}; + +class ArtificerIntroductionTask:public TutorialTask{ +public: + inline ArtificerIntroductionTask():TutorialTask(){}; +private: + virtual inline bool CompleteCondition()override final{ + return false; + } + virtual inline void OnComplete()override final{} }; \ No newline at end of file diff --git a/Adventures in Lestoria/Version.h b/Adventures in Lestoria/Version.h index 0f7f8987..12d0a194 100644 --- a/Adventures in Lestoria/Version.h +++ b/Adventures in Lestoria/Version.h @@ -39,7 +39,7 @@ All rights reserved. #define VERSION_MAJOR 1 #define VERSION_MINOR 2 #define VERSION_PATCH 3 -#define VERSION_BUILD 10399 +#define VERSION_BUILD 10421 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Adventures in Lestoria/VisualNovel.cpp b/Adventures in Lestoria/VisualNovel.cpp index e1f8c095..576dfe2a 100644 --- a/Adventures in Lestoria/VisualNovel.cpp +++ b/Adventures in Lestoria/VisualNovel.cpp @@ -184,14 +184,30 @@ void VisualNovel::Initialize(){ storyLevelData.SetInitialized(); }; +void VisualNovel::Reset(){ + activeText=U""; + leftCharacters.clear(); + rightCharacters.clear(); + backgroundFilename=novel.prevBackgroundFilename=""; + commands.clear(); + commandIndex=0; +} +void VisualNovel::LoadDialog(std::string dialogName,std::functiondialogFinishedCallbackFunc){ + novel.previousState=GameState::GetCurrentState(); + novel.dialogFinishedCallbackFunc=dialogFinishedCallbackFunc; + novel.storyLevel=dialogName; + novel.Reset(); + for(std::unique_ptr&command:storyLevelData.at(dialogName)){ + novel.commands.push_back(command.get()); + } + GameState::ChangeState(States::DIALOG); + novel.ExecuteNextCommand(); + novel.prevTheme=Menu::GetCurrentTheme().GetThemeName(); + Menu::themeSelection="Purple"; +} void VisualNovel::LoadVisualNovel(std::string storyLevelName){ novel.storyLevel=storyLevelName; - novel.activeText=U""; - novel.leftCharacters.clear(); - novel.rightCharacters.clear(); - novel.backgroundFilename=novel.prevBackgroundFilename=""; - novel.commands.clear(); - novel.commandIndex=0; + novel.Reset(); for(std::unique_ptr&command:storyLevelData.at(storyLevelName)){ novel.commands.push_back(command.get()); } @@ -203,7 +219,7 @@ void VisualNovel::LoadVisualNovel(std::string storyLevelName){ } void VisualNovel::Update(){ Audio::SetBGMPitch(audioPitch); - if(transitionTime==0&&game->KEY_CONFIRM.Pressed()){ + if(transitionTime==0&&game->KEY_CONFIRM.Released()){ activeText=U""; novel.ExecuteNextCommand(); } @@ -219,25 +235,33 @@ void VisualNovel::ExecuteNextCommand(){ commandIndex++; commands[size_t(commandIndex-1)]->Execute(novel); }else{ - if(game->GetCurrentMapName()=="NPCs.Greg.Camp Notification Unlock Condition"_S&& - !Unlock::IsUnlocked("NPCs.Greg.Camp Notification Unlock Condition"_S))State_OverworldMap::ConnectionPointFromString("HUB").value()->ResetVisitedFlag(); - Unlock::UnlockCurrentMap(); - Menu::themeSelection=novel.prevTheme; - GameState::ChangeState(States::OVERWORLD_MAP,0.5f); + if(GameState::STATE==GameState::states[States::DIALOG]){ + Reset(); + Menu::themeSelection=novel.prevTheme; + GameState::STATE=GameState::states[novel.previousState]; + GameState::currentState=novel.previousState; + dialogFinishedCallbackFunc(); + }else{ + if(game->GetCurrentMapName()=="NPCs.Greg.Camp Notification Unlock Condition"_S&& + !Unlock::IsUnlocked("NPCs.Greg.Camp Notification Unlock Condition"_S))State_OverworldMap::ConnectionPointFromString("HUB").value()->ResetVisitedFlag(); + Unlock::UnlockCurrentMap(); + Menu::themeSelection=novel.prevTheme; + GameState::ChangeState(States::OVERWORLD_MAP,0.5f); + } } } -void VisualNovel::Draw(){ +void VisualNovel::Draw(const uint8_t backgroundAlpha){ if(backgroundFilename!=""){ - float alpha=1; + float alpha=backgroundAlpha/255.f; if(transitionTime>0){ - alpha=util::lerp(0,1,1-(transitionTime/maxTransitionTime)); + alpha=alpha*util::lerp(0,1,1-(transitionTime/maxTransitionTime)); } if(prevBackgroundFilename!=""){ - game->DrawDecal({0,-prevBackgroundScrollAmt},GFX["story_background_image_location"_S+prevBackgroundFilename].Decal()); + game->DrawDecal({0,-prevBackgroundScrollAmt},GFX["story_background_image_location"_S+prevBackgroundFilename].Decal(),{1.f,1.f},{255,255,255,backgroundAlpha}); } game->DrawDecal({0,-backgroundScrollAmt},GFX["story_background_image_location"_S+backgroundFilename].Decal(),{1,1},{255,255,255,uint8_t(255*alpha)}); }else{ - game->FillRectDecal({0,0},game->GetScreenSize()); + game->FillRectDecal({0,0},game->GetScreenSize(),{255,255,255,backgroundAlpha}); } for(int i=leftCharacters.size()-1;i>=0;i--){ //Start 72 from the bottom. diff --git a/Adventures in Lestoria/VisualNovel.h b/Adventures in Lestoria/VisualNovel.h index da46f485..c1dfbdb6 100644 --- a/Adventures in Lestoria/VisualNovel.h +++ b/Adventures in Lestoria/VisualNovel.h @@ -41,6 +41,7 @@ All rights reserved. #include "safemap.h" #include #include "olcPGEX_TTF.h" +#include "GameState.h" class VisualNovel; @@ -142,6 +143,7 @@ public: class VisualNovel{ friend class State_Story; + friend class State_Dialog; friend class AiL; friend class Command; friend class LocationCommand; @@ -154,7 +156,7 @@ class VisualNovel{ friend class AudioPitchCommand; std::string storyLevel; std::u32string speakerDisplayName=U""; - std::u32string actualSpeakerName=U""; + std::u32string actualSpeakerName=U""; std::u32string activeText; std::vectorleftCharacters; std::vectorrightCharacters; @@ -173,21 +175,25 @@ class VisualNovel{ float prevBackgroundScrollAmt=0; static constexpr float maxTextScrollTime=1.0f; float audioPitch=1.f; + std::functiondialogFinishedCallbackFunc{[](){}}; public: static Font font,narratorFont,locationFont; private: static std::setgraphicsToLoad; static safemap>>storyLevelData; + States::State previousState{}; static VisualNovel novel; VisualNovel(); + void Reset(); public: VisualNovel(VisualNovel&)=delete; VisualNovel(VisualNovel&&)=delete; static void Initialize(); + static void LoadDialog(std::string dialogName,std::functiondialogFinishedCallbackFunc=[](){}); static void LoadVisualNovel(std::string storyLevelName); void ExecuteNextCommand(); void Update(); - void Draw(); + void Draw(const uint8_t backgroundAlpha=255U); std::string GetCharacterImage(std::u32string name); }; \ No newline at end of file diff --git a/Adventures in Lestoria/Witch.cpp b/Adventures in Lestoria/Witch.cpp index 28135d2c..13da3570 100644 --- a/Adventures in Lestoria/Witch.cpp +++ b/Adventures in Lestoria/Witch.cpp @@ -138,7 +138,7 @@ void Witch::InitializeClassAbilities(){ curseTarget.value().lock()->ApplyDot(buffDuration,p->GetAttack()*buffDamageMult,buffTimeBetweenTicks, [](std::weak_ptrm,Buff&b){ expireCallbackFunc: - m.lock()->Hurt(game->GetPlayer()->GetAttack()*"Witch.Ability 1.Final Tick Damage"_F,m.lock()->OnUpperLevel(),m.lock()->GetZ(),HurtFlag::DOT); + if(!m.expired())m.lock()->Hurt(game->GetPlayer()->GetAttack()*"Witch.Ability 1.Final Tick Damage"_F,m.lock()->OnUpperLevel(),m.lock()->GetZ(),HurtFlag::DOT); } ); curseTarget.value().lock()->AddBuff(BuffType::GLOW_PURPLE,buffDuration,1.f); diff --git a/Adventures in Lestoria/assets/config/story/Chapter 2.txt b/Adventures in Lestoria/assets/config/story/Chapter 2.txt index e69de29b..15ed0929 100644 --- a/Adventures in Lestoria/assets/config/story/Chapter 2.txt +++ b/Adventures in Lestoria/assets/config/story/Chapter 2.txt @@ -0,0 +1,26 @@ +===ARTIFICER_INTRO=== +{BACKGROUND commercial_assets/Forest Clearing Campsite_Day.png} + +[Artificer] +Hello adventurer! Welcome to my artificing station! I have not met you yet, may I have the pleasure of knowing your name? + +[You] +Hello, my name is [You]. + +[Artificer] +Excellent! Nice to meet you, [You]. At my station you have the ability to refine and fix up imperfect jewelry discovered while exploring! + +Disassemble rings that are undesirable to you and retrieve fragments of them, then use the Refine station to empower your equipment further! + +This should let you get some use out of all those extra rings you're carrying around, eh? + +[You] +Great, I think I could make good use of this. Thank you. + +===ARTIFICER_HELP=== +[Artificer] +At this station you have the ability to refine and fix up imperfect jewelry discovered while exploring! + +Disassemble rings that are undesirable to you and retrieve fragments of them, then use the Refine station to empower your equipment further! + +You can make use of those extra rings you have been piling up! \ No newline at end of file diff --git a/Adventures in Lestoria/packkey.cpp b/Adventures in Lestoria/packkey.cpp index 2da535d9..b125a608 100644 --- a/Adventures in Lestoria/packkey.cpp +++ b/Adventures in Lestoria/packkey.cpp @@ -1,3 +1,3 @@ #include -std::string PACK_KEY="INSERT_PACK_KEY_HERE"; \ No newline at end of file +std::string PACK_KEY="129jvgndsaf7dsa8932hJj0g43j20jajglikvczmlkvcmzx/"; \ No newline at end of file diff --git a/x64/Release/Adventures in Lestoria.exe b/x64/Release/Adventures in Lestoria.exe index ce61df1f..ca0bbf07 100644 Binary files a/x64/Release/Adventures in Lestoria.exe and b/x64/Release/Adventures in Lestoria.exe differ