Written the basic outlines for the story visual novel file management, the file parser, and the visual novel class commands. Untested parser initialization code implemented. Added some assets.
@ -58,6 +58,7 @@ SUCH DAMAGE.
|
||||
#include "State_OverworldMap.h"
|
||||
#include "Test.h"
|
||||
#include "ItemDrop.h"
|
||||
#include "VisualNovel.h"
|
||||
|
||||
INCLUDE_EMITTER_LIST
|
||||
|
||||
@ -184,6 +185,8 @@ bool Crawler::OnUserCreate(){
|
||||
Unlock::Initialize();
|
||||
ItemDrop::Initialize();
|
||||
|
||||
VisualNovel::Initialize();
|
||||
|
||||
ValidateGameStatus(); //Checks to make sure everything has been initialized properly.
|
||||
|
||||
return true;
|
||||
|
@ -329,6 +329,7 @@
|
||||
</ClInclude>
|
||||
<ClInclude Include="State_MainMenu.h" />
|
||||
<ClInclude Include="State_OverworldMap.h" />
|
||||
<ClInclude Include="VisualNovel.h" />
|
||||
<ClInclude Include="Test.h" />
|
||||
<ClInclude Include="Theme.h" />
|
||||
<ClInclude Include="TMXParser.h" />
|
||||
@ -397,6 +398,7 @@
|
||||
<ClCompile Include="Trapper.cpp" />
|
||||
<ClCompile Include="Turret.cpp" />
|
||||
<ClCompile Include="Unlock.cpp" />
|
||||
<ClCompile Include="VisualNovel.cpp" />
|
||||
<ClCompile Include="Warrior.cpp" />
|
||||
<ClCompile Include="util.cpp" />
|
||||
<ClCompile Include="Witch.cpp" />
|
||||
@ -424,6 +426,9 @@
|
||||
<Text Include="assets\config\Monsters.txt" />
|
||||
<Text Include="assets\config\MonsterStrategies.txt" />
|
||||
<Text Include="assets\config\Player.txt" />
|
||||
<Text Include="assets\config\story\Chapter 1.txt" />
|
||||
<Text Include="assets\config\story\characters.txt" />
|
||||
<Text Include="Crawler_Story_Chapter_1 (2).txt" />
|
||||
<Text Include="Crawler_System_Overview.txt" />
|
||||
<Text Include="NewClasses.txt" />
|
||||
<Text Include="InitialConcept.txt" />
|
||||
|
@ -67,6 +67,12 @@
|
||||
<Filter Include="Source Files\Utils">
|
||||
<UniqueIdentifier>{7d5c4dfd-a5a1-4a3d-8231-ace70551db5a}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Configurations\Story">
|
||||
<UniqueIdentifier>{fffc7975-0823-472f-8f07-0419586e05e7}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Documentation\Story">
|
||||
<UniqueIdentifier>{9ab34e07-c7ba-4f4b-9dad-29c7602c1550}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="olcPixelGameEngine.h">
|
||||
@ -261,6 +267,9 @@
|
||||
<ClInclude Include="ItemDrop.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="VisualNovel.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Player.cpp">
|
||||
@ -440,6 +449,9 @@
|
||||
<ClCompile Include="ItemDrop.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="VisualNovel.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="cpp.hint" />
|
||||
@ -509,6 +521,15 @@
|
||||
<Text Include="Crawler_System_Overview.txt">
|
||||
<Filter>Documentation</Filter>
|
||||
</Text>
|
||||
<Text Include="assets\config\story\Chapter 1.txt">
|
||||
<Filter>Configurations\Story</Filter>
|
||||
</Text>
|
||||
<Text Include="Crawler_Story_Chapter_1 (2).txt">
|
||||
<Filter>Documentation\Story</Filter>
|
||||
</Text>
|
||||
<Text Include="assets\config\story\characters.txt">
|
||||
<Filter>Configurations\Story</Filter>
|
||||
</Text>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="assets\heart.ico">
|
||||
|
@ -37,6 +37,7 @@ SUCH DAMAGE.
|
||||
#include "State_OverworldMap.h"
|
||||
#include "State_MainMenu.h"
|
||||
#include "State_LevelComplete.h"
|
||||
#include "State_Story.h"
|
||||
|
||||
INCLUDE_game
|
||||
|
||||
@ -47,6 +48,7 @@ void GameState::Initialize(){
|
||||
NEW_STATE(States::OVERWORLD_MAP,State_OverworldMap);
|
||||
NEW_STATE(States::MAIN_MENU,State_MainMenu);
|
||||
NEW_STATE(States::LEVEL_COMPLETE,State_LevelComplete);
|
||||
NEW_STATE(States::STORY,State_Story);
|
||||
|
||||
GameState::ChangeState(States::OVERWORLD_MAP);
|
||||
}
|
||||
|
@ -42,6 +42,7 @@ namespace States{
|
||||
OVERWORLD_MAP,
|
||||
MAIN_MENU,
|
||||
LEVEL_COMPLETE,
|
||||
STORY,
|
||||
};
|
||||
};
|
||||
|
||||
|
43
Crawler/State_Story.cpp
Normal file
@ -0,0 +1,43 @@
|
||||
#pragma region License
|
||||
/*
|
||||
License (OLC-3)
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Copyright 2018 - 2023 OneLoneCoder.com
|
||||
|
||||
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.
|
||||
*/
|
||||
#pragma endregion
|
||||
#include "State_Story.h"
|
||||
#include "VisualNovel.h"
|
||||
|
||||
void State_Story::OnStateChange(GameState*prevState){};
|
||||
void State_Story::OnUserUpdate(Crawler*game){
|
||||
VisualNovel::Update();
|
||||
};
|
||||
void State_Story::Draw(Crawler*game){
|
||||
VisualNovel::Draw();
|
||||
};
|
41
Crawler/State_Story.h
Normal file
@ -0,0 +1,41 @@
|
||||
#pragma region License
|
||||
/*
|
||||
License (OLC-3)
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Copyright 2018 - 2023 OneLoneCoder.com
|
||||
|
||||
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.
|
||||
*/
|
||||
#pragma endregion
|
||||
#pragma once
|
||||
#include "GameState.h"
|
||||
|
||||
class State_Story:public GameState{
|
||||
virtual void OnStateChange(GameState*prevState)override final;
|
||||
virtual void OnUserUpdate(Crawler*game)override final;
|
||||
virtual void Draw(Crawler*game)override final;
|
||||
};
|
@ -35,7 +35,7 @@ SUCH DAMAGE.
|
||||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 2
|
||||
#define VERSION_PATCH 1
|
||||
#define VERSION_BUILD 3158
|
||||
#define VERSION_BUILD 3160
|
||||
|
||||
#define stringify(a) stringify_(a)
|
||||
#define stringify_(a) #a
|
||||
|
198
Crawler/VisualNovel.cpp
Normal file
@ -0,0 +1,198 @@
|
||||
#pragma region License
|
||||
/*
|
||||
License (OLC-3)
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Copyright 2018 - 2023 OneLoneCoder.com
|
||||
|
||||
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.
|
||||
*/
|
||||
#pragma endregion
|
||||
#include "VisualNovel.h"
|
||||
#include "GameState.h"
|
||||
#include "Crawler.h"
|
||||
#include <fstream>
|
||||
|
||||
VisualNovel VisualNovel::novel;
|
||||
safemap<std::string,std::vector<std::unique_ptr<Command>>>VisualNovel::storyLevelData;
|
||||
|
||||
void VisualNovel::Initialize(){
|
||||
for(int chapter=1;chapter<=6;chapter++){
|
||||
std::string chapterFilename="story_directory"_S+"Chapter "+std::to_string(chapter)+".txt";
|
||||
std::ifstream file(chapterFilename);
|
||||
if(!file)ERR("Failed to open file "<<chapterFilename)
|
||||
std::string line;
|
||||
std::string currentStory;
|
||||
while(file.good()){
|
||||
|
||||
auto trim=[](std::string line){
|
||||
for(int counter=0;counter<line.length();counter++){
|
||||
if(line[counter]!=' '&&line[counter]!='\t')return line.substr(counter);
|
||||
}
|
||||
return line;
|
||||
};
|
||||
auto ReadCSVArgs=[](std::string text){
|
||||
std::vector<std::string>args;
|
||||
size_t counter=0;
|
||||
while(text.find(',',counter)!=std::string::npos){
|
||||
std::string arg=text.substr(counter,text.find(',',counter)-counter);
|
||||
counter=text.find(',',counter)+1;
|
||||
if(arg.find(',')!=std::string::npos)ERR("Found an erraneous comma inside parsed arg "<<arg<<". Inside of main text: "<<text);
|
||||
args.push_back(arg);
|
||||
}
|
||||
std::string arg=text.substr(counter);
|
||||
args.push_back(arg);
|
||||
return args;
|
||||
};
|
||||
std::getline(file,line);
|
||||
line=trim(line);
|
||||
if(line.length()==0)continue; //It's a blank line, so we skip it.
|
||||
|
||||
auto&data=storyLevelData.at(currentStory);
|
||||
|
||||
switch(line[0]){
|
||||
case '=':{ //Initializes a new story section.
|
||||
currentStory=line.substr(3,line.find('=',3)-3);
|
||||
if(currentStory.find('=')!=std::string::npos)ERR("Story name "<<currentStory<<" is an invalid name! Failed to load story.");
|
||||
storyLevelData[currentStory];
|
||||
}break;
|
||||
case '{':{ //Start of a command.
|
||||
size_t spacePos=line.find(' ');
|
||||
if(spacePos==std::string::npos)ERR("Cannot parse arguments from "<<line<<": No space found");
|
||||
size_t endingBracePos=line.find('}',spacePos+1);
|
||||
if(endingBracePos==std::string::npos)ERR("Cannot parse arguments from "<<line<<": No closing ending brace found")
|
||||
std::string args=line.substr(spacePos+1,endingBracePos-(spacePos+1));
|
||||
if(args.find(' ')!=std::string::npos||args.find('}')!=std::string::npos)ERR("Cannot parse args, found invalid tokens in "<<args)
|
||||
std::vector<std::string>arguments=ReadCSVArgs(args);
|
||||
|
||||
if(line.find("{LOCATION")!=std::string::npos){//Location command
|
||||
if(arguments.size()!=1)ERR("Arguments size is "<<arguments.size()<<". Expecting only 1 argument.")
|
||||
data.push_back(std::make_unique<LocationCommand>(arguments[0]));
|
||||
}else
|
||||
if(line.find("{BACKGROUND")!=std::string::npos){//Background command
|
||||
if(arguments.size()!=1)ERR("Arguments size is "<<arguments.size()<<". Expecting only 1 argument.")
|
||||
data.push_back(std::make_unique<BackgroundCommand>(arguments[0]));
|
||||
}else
|
||||
if(line.find("{LEFT")!=std::string::npos){//Left command
|
||||
data.push_back(std::make_unique<LeftCommand>(arguments));
|
||||
}else
|
||||
if(line.find("{RIGHT")!=std::string::npos){//Right command
|
||||
data.push_back(std::make_unique<RightCommand>(arguments));
|
||||
}else
|
||||
if(line.find("{PAUSE")!=std::string::npos){//Pause command
|
||||
if(arguments.size()!=0)ERR("Arguments size is "<<arguments.size()<<". Expecting no arguments.")
|
||||
data.push_back(std::make_unique<PauseCommand>());
|
||||
}else{
|
||||
ERR("Unknown command "<<line<<". Could not parse!");
|
||||
}
|
||||
}break;
|
||||
case '[':{
|
||||
size_t endingBracePos=line.find(']');
|
||||
if(endingBracePos==std::string::npos)ERR("Cannot parse arguments from "<<line<<": No closing ending bracket found")
|
||||
std::string args=line.substr(1,endingBracePos-1);
|
||||
if(args.find(']')!=std::string::npos)ERR("Cannot parse args, found invalid tokens in "<<args)
|
||||
std::vector<std::string>arguments=ReadCSVArgs(args);
|
||||
if(arguments.size()>2)ERR("Expecting a maximum of two arguments for parsed args in "<<args<<", got "<<arguments.size()<<" arguments instead.");
|
||||
if(arguments.size()!=2){
|
||||
data.push_back(std::make_unique<SpeakerCommand>(arguments[0]));
|
||||
}else{
|
||||
data.push_back(std::make_unique<SpeakerCommand>(arguments[0],arguments[1]));
|
||||
}
|
||||
}break;
|
||||
default:{
|
||||
data.push_back(std::make_unique<DialogCommand>(line));
|
||||
}break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
storyLevelData.SetInitialized();
|
||||
};
|
||||
void VisualNovel::LoadVisualNovel(std::string storyLevelName){
|
||||
novel.storyLevel=storyLevelName;
|
||||
GameState::ChangeState(States::STORY);
|
||||
}
|
||||
void VisualNovel::Update(){
|
||||
|
||||
}
|
||||
void VisualNovel::Draw(){
|
||||
|
||||
}
|
||||
|
||||
Command::Command(){}
|
||||
|
||||
void LocationCommand::Execute(VisualNovel&vn){
|
||||
|
||||
}
|
||||
LocationCommand::LocationCommand(std::string location){
|
||||
|
||||
}
|
||||
|
||||
void BackgroundCommand::Execute(VisualNovel&vn){
|
||||
|
||||
}
|
||||
BackgroundCommand::BackgroundCommand(std::string backgroundFilename){
|
||||
|
||||
}
|
||||
|
||||
void LeftCommand::Execute(VisualNovel&vn){
|
||||
|
||||
}
|
||||
LeftCommand::LeftCommand(std::vector<std::string>characters){
|
||||
|
||||
}
|
||||
|
||||
void RightCommand::Execute(VisualNovel&vn){
|
||||
|
||||
}
|
||||
RightCommand::RightCommand(std::vector<std::string>characters){
|
||||
|
||||
}
|
||||
|
||||
void SpeakerCommand::Execute(VisualNovel&vn){
|
||||
|
||||
}
|
||||
SpeakerCommand::SpeakerCommand(std::string speaker){
|
||||
|
||||
}
|
||||
SpeakerCommand::SpeakerCommand(std::string displayedName,std::string speaker){
|
||||
|
||||
}
|
||||
|
||||
void DialogCommand::Execute(VisualNovel&vn){
|
||||
|
||||
}
|
||||
DialogCommand::DialogCommand(std::string dialog){
|
||||
|
||||
}
|
||||
|
||||
void PauseCommand::Execute(VisualNovel&vn){
|
||||
|
||||
}
|
||||
PauseCommand::PauseCommand(){
|
||||
|
||||
}
|
117
Crawler/VisualNovel.h
Normal file
@ -0,0 +1,117 @@
|
||||
#pragma region License
|
||||
/*
|
||||
License (OLC-3)
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Copyright 2018 - 2023 OneLoneCoder.com
|
||||
|
||||
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.
|
||||
*/
|
||||
#pragma endregion
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include "safemap.h"
|
||||
|
||||
class VisualNovel;
|
||||
|
||||
class PauseCommand final:public Command{
|
||||
public:
|
||||
void Execute(VisualNovel&vn)override;
|
||||
PauseCommand();
|
||||
};
|
||||
|
||||
class DialogCommand final:public Command{
|
||||
std::string dialog;
|
||||
public:
|
||||
void Execute(VisualNovel&vn)override;
|
||||
DialogCommand(std::string dialog);
|
||||
};
|
||||
|
||||
class SpeakerCommand final:public Command{
|
||||
std::string displayedName;
|
||||
std::string actualSpeakerName;
|
||||
public:
|
||||
void Execute(VisualNovel&vn)override;
|
||||
SpeakerCommand(std::string speaker);
|
||||
SpeakerCommand(std::string displayedName,std::string speaker);
|
||||
};
|
||||
|
||||
class BackgroundCommand final:public Command{
|
||||
std::string backgroundFilename;
|
||||
public:
|
||||
void Execute(VisualNovel&vn)override;
|
||||
BackgroundCommand(std::string backgroundFilename);
|
||||
};
|
||||
|
||||
class RightCommand final:public Command{
|
||||
std::vector<std::string>characters;
|
||||
public:
|
||||
void Execute(VisualNovel&vn)override;
|
||||
RightCommand(std::vector<std::string>characters);
|
||||
};
|
||||
|
||||
class LeftCommand final:public Command{
|
||||
std::vector<std::string>characters;
|
||||
public:
|
||||
void Execute(VisualNovel&vn)override;
|
||||
LeftCommand(std::vector<std::string>characters);
|
||||
};
|
||||
|
||||
class LocationCommand final:public Command{
|
||||
std::string location;
|
||||
public:
|
||||
void Execute(VisualNovel&vn)override;
|
||||
LocationCommand(std::string location);
|
||||
};
|
||||
|
||||
class Command{
|
||||
virtual void Execute(VisualNovel&vn)=0;
|
||||
protected:
|
||||
Command();
|
||||
};
|
||||
|
||||
class VisualNovel{
|
||||
std::string storyLevel;
|
||||
std::string activeText;
|
||||
std::vector<std::string>leftCharacters;
|
||||
std::vector<std::string>rightCharacters;
|
||||
std::string backgroundFilename;
|
||||
std::vector<Command*>commands;
|
||||
int commandIndex;
|
||||
|
||||
static safemap<std::string,std::vector<std::unique_ptr<Command>>>storyLevelData;
|
||||
|
||||
static VisualNovel novel;
|
||||
public:
|
||||
VisualNovel()=delete;
|
||||
VisualNovel(VisualNovel&)=delete;
|
||||
VisualNovel(VisualNovel&&)=delete;
|
||||
static void Initialize();
|
||||
static void LoadVisualNovel(std::string storyLevelName);
|
||||
static void Update();
|
||||
static void Draw();
|
||||
};
|
BIN
Crawler/assets/backgrounds/cave.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
Crawler/assets/backgrounds/cave_dark.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
Crawler/assets/backgrounds/sea.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
Crawler/assets/characters/greg.png
Normal file
After Width: | Height: | Size: 813 B |
BIN
Crawler/assets/characters/player_f.png
Normal file
After Width: | Height: | Size: 813 B |
BIN
Crawler/assets/characters/player_m.png
Normal file
After Width: | Height: | Size: 814 B |
BIN
Crawler/assets/characters/red_stone.png
Normal file
After Width: | Height: | Size: 1004 B |
BIN
Crawler/assets/characters/sherman.png
Normal file
After Width: | Height: | Size: 812 B |
@ -48,6 +48,9 @@ item_directory = items/
|
||||
# Path to items configuration
|
||||
item_img_directory = items/
|
||||
|
||||
# Path to story files
|
||||
story_directory = config/story/
|
||||
|
||||
# Whether or not to show individual data accesses from config data structure.
|
||||
debug_access_options = 0
|
||||
|
||||
|
350
Crawler/assets/config/story/Chapter 1.txt
Normal file
@ -0,0 +1,350 @@
|
||||
===STORY_1_1===
|
||||
{LOCATION Bleakport Outskirts}
|
||||
{BACKGROUND sea.png}
|
||||
[]
|
||||
You are on your way from Bleakport to the Lestorian Forest, where you want to hunt slimes.
|
||||
|
||||
Slime Remains are used to brew healing potions and recent pirate attacks around Bleakport used up alot of those.
|
||||
|
||||
This makes it an easy opportunity to make some coin.
|
||||
|
||||
Merchant crossing is getting close, the smoke of the campfires can already be seen.
|
||||
|
||||
Merchant crossing is a Crossway that connects Bleakport, the Lestorian Forest, Eagleview Mountains and the Capitol of the Lestorian Kingdom, Clafton.
|
||||
|
||||
The crossing is famous for merchants to rest on there travels and trade goods with each other.
|
||||
|
||||
While you are getting closer you realise something isnt right. the Smoke on the sky is way thicker then what you would expect from a few campfires.
|
||||
|
||||
You reach the crossing where a horrible scenery awaits you.
|
||||
|
||||
Tents are burning and lifeless bodys lying on the floor. It looks like some Bandit attack, which also is a kinda strange occurance.
|
||||
|
||||
Bandit groups weren't active in the past 50 years because of the Lestorian military.
|
||||
|
||||
In the entire history of the Lestorian Kingdom, there are no wars on the records.
|
||||
|
||||
Which leads that the military is used more like a police force, which presence discourages large scale crimes.
|
||||
|
||||
The only active criminal group in the Area would be the Pirates in the Bleakport area.
|
||||
|
||||
But even they know that they can only operate because the Lestorian military isnt leaving the mainland.
|
||||
|
||||
You search the entire camp for any survivors. And finally, you found someone still breathing.
|
||||
|
||||
you feed him a health potion, clean his wounds with water and close them with bandages.
|
||||
|
||||
The health potion seem to work kinda fast. The mans consciousness returns a few minutes later.
|
||||
|
||||
[?,Sherman]
|
||||
{LEFT Sherman}
|
||||
{RIGHT You}
|
||||
Th..Thanks.
|
||||
|
||||
[You]
|
||||
|
||||
no Problem. Rest for now.
|
||||
|
||||
[]
|
||||
|
||||
after around half an hour of letting the health potion work the man finally seems to be in a somewhat stable state.
|
||||
|
||||
[You]
|
||||
|
||||
How are you feeling.
|
||||
|
||||
[?]
|
||||
|
||||
Better, i guess.
|
||||
|
||||
[You]
|
||||
|
||||
Can you tell me what happened here?
|
||||
|
||||
[?]
|
||||
|
||||
I... We... No, it happened way to fast.
|
||||
|
||||
[You]
|
||||
|
||||
Thats ok, maybe your memories come back later. Whats your Name?
|
||||
|
||||
[Sherman]
|
||||
|
||||
Sherman. Professor of the Lestorian Science Corporation.
|
||||
|
||||
[You]
|
||||
|
||||
I'm [Player Name]. Adventurer and Hunter.
|
||||
|
||||
[]
|
||||
|
||||
You are kinda surprised of his response. You did not expect anyone from the Science Corporation to leave the Capitol in the first place.
|
||||
|
||||
While you are deep in thoughts, suddenly Sherman starts to panic.
|
||||
|
||||
[Sherman]
|
||||
|
||||
The stone. did they... please, can you check if you can find a red colored stone? It was in my bag.
|
||||
|
||||
[You]
|
||||
|
||||
calm down. I see if i can find anything like that.
|
||||
|
||||
[]
|
||||
|
||||
You check every bag around the loaction where you found Sherman.
|
||||
|
||||
While searching you realise that whoever did this wasn't after money.
|
||||
|
||||
You don't find any red stone though.
|
||||
|
||||
[Sherman]
|
||||
|
||||
What shall I do. I can't return to the Kingdom without it.
|
||||
|
||||
[You]
|
||||
|
||||
First you should rest. Once you are able to walk on your own again, we can think about a solution for your lost object.
|
||||
|
||||
[]
|
||||
|
||||
You set up a tent and a campfire a little outside of the main camp where the tragedy happened and help Sherman to move over.
|
||||
|
||||
Without the corpses surrounding you, you relax a little bit. For the rest of the day you keep an Eye on Sherman while he recovers.
|
||||
|
||||
The next day Sherman no longer lying down, instead sitting on the grass.
|
||||
|
||||
[Sherman]
|
||||
|
||||
Good Morning. You told me you are an Adventurer right?
|
||||
|
||||
[You]
|
||||
|
||||
Morning... Yes i am. Why?
|
||||
|
||||
[]
|
||||
|
||||
Sherman is full of Energy you can barely tell that he almost died a day before. That health Potion you gave to him performed a miracle.
|
||||
|
||||
[Sherman]
|
||||
|
||||
Ok, So you remember the Stone i asked you about yesterday right? It's an source of Energy we currently are investigating.
|
||||
|
||||
We may have lost the first stone. But we got a clue that another one lies deep inside the Lestorian Forest.
|
||||
|
||||
With that Stone i could return to the kingdom with something to show. i obviously would pay you for it.
|
||||
|
||||
It should be in a cave somewhere in the middle of the Forest.
|
||||
|
||||
[]
|
||||
|
||||
For the Slime hunting you have to enter the Lestorian Forest anyway. Therefore searching for a cave while doing that doesnt sound like a big deal.
|
||||
|
||||
[You]
|
||||
|
||||
I am on my way to the Forest anyway. I can check any cave i come across and if I find any Red Stone i will report back.
|
||||
|
||||
No promises though. My main goal is Slime hunting. But i see what i can do to help.
|
||||
|
||||
[Sherman]
|
||||
|
||||
Great, i still feel a little weak so i will be staying in this camp for now.
|
||||
|
||||
Also i expect Lestorian Soldiers to show up soon to investigate the campside. Guess i can help as witness.
|
||||
|
||||
[You]
|
||||
|
||||
Did your Memories return?
|
||||
|
||||
[Sherman]
|
||||
|
||||
Well, a few things but i still need to sort myself. I cant really tell you more then what i did yesterday.
|
||||
|
||||
[You]
|
||||
|
||||
Guess i have to take that answer for now. I am on my way to the Forest. bye.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
===STORY_1_2===
|
||||
{LOCATION Lestorian Forest}
|
||||
{BACKGROUND sea.png}
|
||||
[?,Greg]
|
||||
Did you defeat the Monsters?
|
||||
|
||||
[]
|
||||
|
||||
A voice from the top of the trees appears.
|
||||
|
||||
[You]
|
||||
|
||||
I can't see any more atleast.
|
||||
|
||||
[?,Greg]
|
||||
|
||||
thats great. Give me a short moment i come down.
|
||||
|
||||
[]
|
||||
|
||||
A man Starts Climbing down a tree.
|
||||
|
||||
{LEFT Greg}
|
||||
{RIGHT You}
|
||||
[Greg]
|
||||
|
||||
Hello, my name is Greg. Thanks for the rescue.
|
||||
|
||||
[You]
|
||||
|
||||
Rescue? i am just hunting slimes. Anyway, [Player name]. Glad i could help.
|
||||
|
||||
[Greg]
|
||||
|
||||
You for sure did. I was wandering around and didnt realised that a bunch of slimes sneaked up on me.
|
||||
|
||||
Luckily those guys can't climb trees. But those damn slimes are really good in just waiting.
|
||||
|
||||
Was sitting for over one day on this tree.
|
||||
|
||||
[You]
|
||||
|
||||
Did you had any plan in case no one would have come around?
|
||||
|
||||
[Greg]
|
||||
|
||||
Nah, got enough food and water on me. Could have stayed there for like a week.
|
||||
|
||||
Last time this happened I was able to leave after 3 days.
|
||||
|
||||
[You]
|
||||
|
||||
Last time? ... Anyway, why are you even in the forest if you are not Hunting Slimes?
|
||||
|
||||
[Greg]
|
||||
|
||||
Ever heard of the Echanted Trees deep inside this Forest?
|
||||
|
||||
I dont have any proof that those really exist but since i heard about them i cant think of anything else then find one.
|
||||
|
||||
Its said that they look on first glance like a normal Cedar Tree, but there wood is hard as Steel.
|
||||
|
||||
Legends say that a sword out of this wood is Sharper then any normal sword made with steel and way lighter.
|
||||
|
||||
[You]
|
||||
|
||||
Sounds like a great material. But if its hard as steel. any Plans how to cut it down?
|
||||
|
||||
[Greg]
|
||||
|
||||
...
|
||||
|
||||
{PAUSE}
|
||||
|
||||
... well ...
|
||||
|
||||
{PAUSE}
|
||||
|
||||
Never thought about that part.
|
||||
|
||||
This could indeed become a Problem.
|
||||
|
||||
Maybe i leave the forest for now and think up a plan before returning.
|
||||
|
||||
If you search for me, i will be at merchant crossing. Offering my skills as a Blacksmith to Merchants.
|
||||
|
||||
[You]
|
||||
|
||||
About Merchant Crossing...
|
||||
|
||||
[]
|
||||
|
||||
You explain Greg what happened at the crossing.
|
||||
|
||||
[Greg]
|
||||
|
||||
Thats not good. You said you build a small camp nearby? Guess i will go there for now then.
|
||||
|
||||
If you need any weapons or armour. you can find me there.
|
||||
|
||||
See you later.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
===STORY_1_3===
|
||||
{LOCATION Stone Wall}
|
||||
{BACKGROUND sea.png}
|
||||
[]
|
||||
|
||||
You see a crack in the Stone Wall.
|
||||
|
||||
The closer you get to the crack the colder the air feels.
|
||||
|
||||
A shiver runs down your spine. This doesn't feel like a normal cave.
|
||||
|
||||
Its big enough that you can enter without any problem.
|
||||
|
||||
After a few steps inside, a glimmering red light lightens up the cave.
|
||||
|
||||
you follow the way until you hit an open Space.
|
||||
{BACKGROUND cave.png}
|
||||
The Walls are slick. No Rocks spiking out of the walls. the entire room has some unnatural feeling.
|
||||
|
||||
In the middle of the room is some kind of Pillar which is the same heigh as your Torso.
|
||||
{LEFT Red Stone}
|
||||
{RIGHT You}
|
||||
On Top of that Pillar lies a redish Stone Cube.
|
||||
|
||||
The Stone Cube seems to emit the light
|
||||
|
||||
In the Wall behind the Cube are runes engraved.
|
||||
|
||||
You never seen anything close to those runes and obviously can't read them.
|
||||
|
||||
[You]
|
||||
|
||||
This could be the Stone Sherman was looking for.
|
||||
|
||||
[]
|
||||
|
||||
You get closer to the pillar and grab the Cube.
|
||||
{LEFT}
|
||||
{RIGHT}
|
||||
*click*
|
||||
{BACKGROUND cave_dark.png}
|
||||
Darkness.
|
||||
|
||||
The Stone Cube is still glowing but the glow is way weaker then it was before.
|
||||
|
||||
The light its emitting is now to weak to see your own foot.
|
||||
|
||||
The sudden unexpected darkness casts fear on you.
|
||||
|
||||
You turn around and search for the way back.
|
||||
|
||||
Returning seems to be no Problem, until.
|
||||
|
||||
Halfway back you suddenly feel a movement.
|
||||
|
||||
An Earthquake.
|
||||
|
||||
Its not a strong one but in your current position it is extremly dangerous.
|
||||
|
||||
Even though you still can't see anything, you start running.
|
||||
|
||||
{PAUSE}
|
||||
|
||||
...
|
||||
|
||||
{PAUSE}
|
||||
{BACKGROUND sea.png}
|
||||
Finally. Sunlight. You are out of the cave.
|
||||
|
||||
{PAUSE}
|
||||
|
||||
Together with the Stone Cube you leave the Forest behind.
|
||||
|
0
Crawler/assets/config/story/Chapter 2.txt
Normal file
0
Crawler/assets/config/story/Chapter 3.txt
Normal file
0
Crawler/assets/config/story/Chapter 4.txt
Normal file
0
Crawler/assets/config/story/Chapter 5.txt
Normal file
0
Crawler/assets/config/story/Chapter 6.txt
Normal file
10
Crawler/assets/config/story/characters.txt
Normal file
@ -0,0 +1,10 @@
|
||||
character_image_location = assets/characters
|
||||
|
||||
Characters
|
||||
{
|
||||
Player_F = player_f.png
|
||||
Player_M = player_m.png
|
||||
Sherman = sherman.png
|
||||
Greg = greg.png
|
||||
Red Stone = red_stone.png
|
||||
}
|