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..85f3eee8 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,7 @@
+
diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters
index 94a086eb..437e4341 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,9 @@
Documentation\Mechanics
+
+ Configurations\Story
+
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/GameState.cpp b/Adventures in Lestoria/GameState.cpp
index 9d21e155..c43978c5 100644
--- a/Adventures in Lestoria/GameState.cpp
+++ b/Adventures in Lestoria/GameState.cpp
@@ -42,7 +42,8 @@ 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
@@ -56,6 +57,7 @@ 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){
diff --git a/Adventures in Lestoria/GameState.h b/Adventures in Lestoria/GameState.h
index 86ed8479..8a246f91 100644
--- a/Adventures in Lestoria/GameState.h
+++ b/Adventures in Lestoria/GameState.h
@@ -51,6 +51,7 @@ namespace States{
MAIN_MENU,
LEVEL_COMPLETE,
STORY,
+ DIALOG,
KEYBIND,
DEATH,
};
diff --git a/Adventures in Lestoria/Menu.cpp b/Adventures in Lestoria/Menu.cpp
index 658042db..45913cdb 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
+
+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){
+ Menu::CloseAllMenus();
+};
+void State_Dialog::OnLevelLoad(){}
+void State_Dialog::OnUserUpdate(AiL*game){
+ GameState::states[States::GAME_RUN]->OnUserUpdate(game);
+ VisualNovel::novel.Update();
+ game->ClearTimedOutGarbage();
+};
+void State_Dialog::Draw(AiL*game){
+ GameState::states[States::GAME_RUN]->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..16d10478 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 10402
#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..7b5e8885 100644
--- a/Adventures in Lestoria/VisualNovel.cpp
+++ b/Adventures in Lestoria/VisualNovel.cpp
@@ -184,14 +184,29 @@ 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.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());
}
@@ -219,25 +234,31 @@ 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();
+ GameState::STATE=GameState::states[States::GAME_RUN];
+ 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..a1803b3a 100644
--- a/Adventures in Lestoria/VisualNovel.h
+++ b/Adventures in Lestoria/VisualNovel.h
@@ -142,6 +142,7 @@ public:
class VisualNovel{
friend class State_Story;
+ friend class State_Dialog;
friend class AiL;
friend class Command;
friend class LocationCommand;
@@ -154,7 +155,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,6 +174,7 @@ class VisualNovel{
float prevBackgroundScrollAmt=0;
static constexpr float maxTextScrollTime=1.0f;
float audioPitch=1.f;
+ std::functiondialogFinishedCallbackFunc{[](){}};
public:
static Font font,narratorFont,locationFont;
private:
@@ -181,13 +183,15 @@ private:
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