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