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.
@ -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(); |
||||||
|
}; |
@ -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; |
||||||
|
}; |
@ -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(){ |
||||||
|
|
||||||
|
} |
@ -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(); |
||||||
|
}; |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 813 B |
After Width: | Height: | Size: 813 B |
After Width: | Height: | Size: 814 B |
After Width: | Height: | Size: 1004 B |
After Width: | Height: | Size: 812 B |
@ -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,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 |
||||||
|
} |