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 |
||||
} |