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.

pull/28/head
sigonasr2 1 year ago
parent e4fae723c9
commit 90d465fd7b
  1. 3
      Crawler/Crawler.cpp
  2. 5
      Crawler/Crawler.vcxproj
  3. 21
      Crawler/Crawler.vcxproj.filters
  4. 2
      Crawler/GameState.cpp
  5. 1
      Crawler/GameState.h
  6. 43
      Crawler/State_Story.cpp
  7. 41
      Crawler/State_Story.h
  8. 2
      Crawler/Version.h
  9. 198
      Crawler/VisualNovel.cpp
  10. 117
      Crawler/VisualNovel.h
  11. BIN
      Crawler/assets/backgrounds/cave.png
  12. BIN
      Crawler/assets/backgrounds/cave_dark.png
  13. BIN
      Crawler/assets/backgrounds/sea.png
  14. BIN
      Crawler/assets/characters/greg.png
  15. BIN
      Crawler/assets/characters/player_f.png
  16. BIN
      Crawler/assets/characters/player_m.png
  17. BIN
      Crawler/assets/characters/red_stone.png
  18. BIN
      Crawler/assets/characters/sherman.png
  19. 3
      Crawler/assets/config/configuration.txt
  20. 350
      Crawler/assets/config/story/Chapter 1.txt
  21. 0
      Crawler/assets/config/story/Chapter 2.txt
  22. 0
      Crawler/assets/config/story/Chapter 3.txt
  23. 0
      Crawler/assets/config/story/Chapter 4.txt
  24. 0
      Crawler/assets/config/story/Chapter 5.txt
  25. 0
      Crawler/assets/config/story/Chapter 6.txt
  26. 10
      Crawler/assets/config/story/characters.txt

@ -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,
};
};

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

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

@ -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();
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1004 B

Binary file not shown.

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

@ -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
}
Loading…
Cancel
Save