Commit c6b62ad7 authored by aggsol's avatar aggsol 🙉

using new gamebook format

parent 7aaa94f5
Pipeline #26628662 failed with stage
in 1 minute and 38 seconds
......@@ -54,7 +54,7 @@ $ ./gamebook-checker --input ../example/sections.adoc
Generate a graph
```
$ ./gamebook-checker --dot --input ../example/sections.adoc
$ ./gamebook-checker --dot-file graph.dot --input ../example/sections.adoc
$ dot -Tpng graph.dot > graph.png
```
......@@ -95,7 +95,6 @@ The gamecheck tool can create a graph from the sections where every node is a se
Annotation sections with tags. Example:
```
[[section-1]
=== 1
[.TODO.combat]
[.my-tag.another-tag]
......@@ -109,7 +108,7 @@ Tags of sections helps to debug and naviagte the story quickliy with the generat
|.combat |Hexagon Node |Section has combat |
|.TODO |Node filled red |Mark section as unfinished |
|.location-xyz|Set a fillcolor |Color is random but the same for one location |
|.fixed |Box node |Section will no be shuffled, fixed section number |
|.fixed |Box node |Section will no be mixed in, fixed section number |
## How to Build the Book
......@@ -125,6 +124,7 @@ Tags of sections helps to debug and naviagte the story quickliy with the generat
2. Shuffle sections at the very end before the last edit and starting to layout
3. Fix plot holes asap
4. Write related sections together
5. Write one sentence per line
## Licenses
......
My First Gamebook
=================
:Revision: 1.0.0
= My First Gamebook
:Author: Mrs. Gamebook Writer
:Email: you|@example.com
:Revision: 1.0.0
:Email: you@example.com
:doctype: book
:keywords: Gamebook, Fantasy
:imagesdir: images
:figure-caption!:
:compat-mode!:
include::intro.adoc[]
......
......@@ -4,4 +4,4 @@ This is my first gamebook.
== Prologue
You enter the castle.
Turn to <<section-1>>
\ No newline at end of file
Turn to <<_1>>
\ No newline at end of file
[[section-1]]
=== 1
[.fixed]
The castle is well lit and cozy warm. But there is nobody her!
Do you want to go to the kitchen, turn to <<section-2>> +
Do you want to enter the throne room, turn to <<section-3>>
Do you want to go to the kitchen, turn to <<_2>> +
Do you want to enter the throne room, turn to <<_3>>
[[section-2]]
=== 2
[.location-kitchen]
The cook is missing and there is no food left. You are still very hungry.
Do you want to enter the throne room, turn to <<section-3>>
Do you want to enter the throne room, turn to <<_3>>
[[section-3]]
=== 3
[.location-throneroom]
You sit on the throne room. You are now the king!
Happy End!
\ No newline at end of file
*Happy End!*
\ No newline at end of file
......@@ -130,7 +130,7 @@ void Parser::parseLine(const std::string& line, std::map<int, Section>& sections
{
if(m_currSection >= 0)
{
sections[m_currSection].m_lines.push_back(line);
sections.at(m_currSection).m_lines.push_back(line);
}
return;
}
......@@ -156,18 +156,18 @@ void Parser::parseLine(const std::string& line, std::map<int, Section>& sections
{
addLine = false;
state = State::CommentStart;
if(m_lastLine == LineType::Anchor)
{
throw std::runtime_error("Missing section after anchor");
}
// if(m_lastLine == LineType::Anchor)
// {
// throw std::runtime_error("Missing section after anchor");
// }
m_lastLine = LineType::Other;
}
else if(c == '[')
{
if(m_lastLine == LineType::Anchor)
{
throw std::runtime_error("Missing section after anchor");
}
// if(m_lastLine == LineType::Anchor)
// {
// throw std::runtime_error("Missing section after anchor");
// }
state = State::DataStart;
}
else if(c == '=')
......@@ -195,24 +195,24 @@ void Parser::parseLine(const std::string& line, std::map<int, Section>& sections
throw std::runtime_error("Missing image filename");
}
sections[m_currSection].m_classes.insert("img-" + filename);
sections[m_currSection].m_classes.insert("img-attr-" + altTxt);
sections.at(m_currSection).m_classes.insert("img-" + filename);
sections.at(m_currSection).m_classes.insert("img-attr-" + altTxt);
m_lastLine = LineType::Image;
state = State::Done;
}
else
{
if(m_lastLine == LineType::Anchor)
{
throw std::runtime_error("Missing section after anchor");
}
// if(m_lastLine == LineType::Anchor)
// {
// throw std::runtime_error("Missing section after anchor");
// }
m_lastLine = LineType::Other;
}
break;
case State::ReferenceStart:
if(c == '<')
if(c == '<' && peek == '_')
{
value.clear();
state = State::ReferenceSection;
......@@ -225,11 +225,7 @@ void Parser::parseLine(const std::string& line, std::map<int, Section>& sections
break;
case State::ReferenceSection:
if(c == '<')
{
state = State::PageBreak;
}
else if(c == '>')
if(c == '>')
{
if(peek != '>')
{
......@@ -256,6 +252,10 @@ void Parser::parseLine(const std::string& line, std::map<int, Section>& sections
{
throw std::runtime_error("Invalid whitespace in section reference");
}
else if(c != '_')
{
throw std::runtime_error("Invalid section reference");
}
break;
case State::PageBreak:
......@@ -298,16 +298,17 @@ void Parser::parseLine(const std::string& line, std::map<int, Section>& sections
{
try
{
const int section = std::stoi(line.substr(i));
if(section != m_currSection)
m_currSection = std::stoi(line.substr(i));
// if(section != m_currSection)
// {
// throw std::runtime_error("Mismatch section title and section anchor");
// }
if(counter != 3 && m_currSection > 1)
{
throw std::runtime_error("Mismatch section title and section anchor");
}
if(counter != 3 && section > 1)
{
std::cerr << "section=" << section << "\n";
std::cerr << "section=" << m_currSection << "\n";
throw std::runtime_error("Level 2 header expected: ===");
}
sections[m_currSection].m_number = m_currSection;
state = State::Done;
}
catch(const std::exception& ex)
......@@ -315,7 +316,8 @@ void Parser::parseLine(const std::string& line, std::map<int, Section>& sections
// Section 0 is a special case
if(m_currSection != 0) {
std::ostringstream msg;
msg << "Invalid section title. Expected: " << m_currSection;
msg << "Invalid section title. Expected: " << m_currSection
<< " Exception: " << ex.what();
throw std::runtime_error(msg.str());
}
}
......@@ -334,9 +336,10 @@ void Parser::parseLine(const std::string& line, std::map<int, Section>& sections
}
else if(c == '[')
{
value.clear();
addLine = false;
state = State::Anchor;
throw std::runtime_error("Old style anchors are not supported anymore");
// value.clear();
// addLine = false;
// state = State::Anchor;
}
else
{
......@@ -344,42 +347,42 @@ void Parser::parseLine(const std::string& line, std::map<int, Section>& sections
}
break;
case State::Anchor:
if(c == ']')
{
if(peek != ']')
{
throw std::runtime_error("Expected ']' closing anchor");
}
try
{
int section = std::stoi(value);
if(section == m_currSection)
{
throw std::runtime_error("Section already defined");
}
auto it = sections.find(section);
if(it != sections.end())
{
throw std::runtime_error("Duplicate section");
}
sections[section].m_number = section;
m_currSection = section;
state = State::Done;
}
catch(const std::exception& ex)
{
throw std::runtime_error(std::string("Invalid section anchor: ") + ex.what());
}
m_lastLine = LineType::Anchor;
}
else if(std::isdigit(c))
{
value += c;
}
break;
// case State::Anchor:
// if(c == ']')
// {
// if(peek != ']')
// {
// throw std::runtime_error("Expected ']' closing anchor");
// }
// try
// {
// int section = std::stoi(value);
// if(section == m_currSection)
// {
// throw std::runtime_error("Section already defined");
// }
// auto it = sections.find(section);
// if(it != sections.end())
// {
// throw std::runtime_error("Duplicate section");
// }
// sections[section].m_number = section;
// m_currSection = section;
// state = State::Done;
// }
// catch(const std::exception& ex)
// {
// throw std::runtime_error(std::string("Invalid section anchor: ") + ex.what());
// }
// m_lastLine = LineType::Anchor;
// }
// else if(std::isdigit(c))
// {
// value += c;
// }
// break;
case State::CommentStart:
if(c != '/')
{
......@@ -410,7 +413,7 @@ void Parser::parseLine(const std::string& line, std::map<int, Section>& sections
if(addLine == true && m_currSection >= 0)
{
sections[m_currSection].m_lines.push_back(line);
sections.at(m_currSection).m_lines.push_back(line);
}
return;
......
......@@ -46,7 +46,7 @@ private:
enum class LineType
{
Other = 0,
Anchor = 1,
// Anchor = 1,
Section = 2,
Image = 3
};
......@@ -62,7 +62,7 @@ private:
Style = 4,
ReferenceStart = 5,
ReferenceSection = 6,
Anchor = 8,
// Anchor = 8,
PageBreak = 9
};
......
......@@ -48,7 +48,7 @@ namespace bodhi
std::map<std::string, std::string> placeholders;
for(auto& c: s.second.m_children)
{
std::string before = "<<section-";
std::string before = "<<_";
before += std::to_string(c);
before += ">>";
......@@ -58,7 +58,7 @@ namespace bodhi
placeholder += std::to_string(resultMapping.at(c));
placeholder += ">>";
std::string after = "<<section-";
std::string after = "<<_";
after += std::to_string(resultMapping.at(c));
after += ">>";
......@@ -95,13 +95,11 @@ namespace bodhi
if(f.second.m_number > 1)
{
strm << "[[section-" << f.second.m_number << "]]\n"
<< "=== " << f.second.m_number << "\n";
strm << "=== " << f.second.m_number << "\n";
}
else
{
strm << "[[section-" << f.second.m_number << "]]\n"
<< "== " << f.second.m_number << "\n";
strm << "== " << f.second.m_number << "\n";
}
for(auto& l: f.second.m_lines)
......
......@@ -64,7 +64,7 @@ int main(int argc, char* argv[])
bodhi::CliArguments args(argc, argv);
if(args.getOpt("", "version"))
{
std::cout << "v0.1.0\n";
std::cout << "v1.0.0-beta\n";
return 0;
}
......@@ -84,6 +84,17 @@ int main(int argc, char* argv[])
auto verbose = args.getOpt("v", "verbose");
auto noColor = args.getOpt("n", "no-color");
if(args.arguments().size() > 0)
{
std::cerr << "Unknown or missing parameter(s): ";
for(const auto & a: args.arguments())
{
std::cerr << a << " ";
}
std::cerr << "\n";
return 107;
}
if(noColor)
{
rang::setControlMode(rang::control::Off);
......
......@@ -51,6 +51,11 @@ public:
TINY_ASSERT_OK(not error);
TINY_ASSERT_EQUAL(2, sections.size());
for(auto s: sections)
{
TINY_ASSERT_EQUAL(s.first, s.second.m_number);
}
}
static void badheader()
......
......@@ -17,7 +17,6 @@ public:
{
tiny::Unit::registerTest(&ShuffleTest::minComplex, "minComplex");
tiny::Unit::registerTest(&ShuffleTest::basic, "basic");
tiny::Unit::registerTest(&ShuffleTest::shuffle, "shuffle");
}
static void minComplex()
......@@ -30,6 +29,13 @@ public:
TINY_ASSERT_OK(not error);
auto resultMapping = bodhi::createSectionMapping(sections, 123456);
TINY_ASSERT_EQUAL(sections.size(), resultMapping.size());
for(auto& s: sections)
{
TINY_ASSERT_OK(resultMapping.find(s.first) != resultMapping.end());
}
}
static void basic()
......@@ -58,11 +64,6 @@ public:
TINY_ASSERT_OK(resultMapping.find(s.first) != resultMapping.end());
}
}
static void shuffle()
{
}
};
ShuffleTest shuffleTest;
\ No newline at end of file
[[section-1]]
=== 1
blabliblubb
Turn to <<section-2>>
Turn to <<_2>>
[[section-2]]
===
blablibubb kj asd aw p3o0rlkfsd
\ No newline at end of file
[[section-1]]
=== 1
blabliblubb
Turn to <<section-2
Turn to <<_2
[[section-2]]
=== 2
blablibubb kj asd aw p3o0rlkfsd
\ No newline at end of file
[[section-0]]
== 0
[.intro]
Seit vielen Jahren ist Venyra deine Partnerin bei der Stadtwache. Ihr seid der Wache am Osttor von Oxhaven zugeteilt, der härtestens Truppe der Stadt. Zumindest behaupten Venyra und du das nach dem dritten Bier lautstark.
Lies weiter bei <<section-1>>
Lies weiter bei <<_1>>
[[section-1]]
=== 1
[.start]
// hier steht ein Kommentar
Es stinkt. So wie es in jeder Station im Sol-Sytem stinkt. Die Filter sind überlastet durch die Mengen an Schweiß und Urin in der Luft. Du wischt dir die dreckigen Hände an deinem Overall ab und betrachtest dein Werk. Eine frische Schweißnaht ziert die Ladeluke der _Bloody Mary 3_. Bei nächsten Druckabfall solltest du nicht wieder die Hälfte deiner Ladung verlieren. Denn eine Frachtversicherung kannst du dir nicht leisten und häufig ist deine Fracht auch nicht ganz legal. Für heute reicht es dir mit Maloche.
Willst du in die Bar gehen, springe zu <<section-2>> +
Willst du in der Sauna entspanne, spinge zu <<section-3>>
Willst du in die Bar gehen, springe zu <<_2>> +
Willst du in der Sauna entspanne, spinge zu <<_3>>
[[section-2]]
<<<
=== 2
......@@ -23,29 +20,26 @@ Kein freier Tisch in
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Springe zu <<section-4>> +
Springe zu <<section-6>>
Springe zu <<_4>> +
Springe zu <<_6>>
[[section-3]]
=== 3
Es ist ruhig in der Sauna.
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Springe zu <<section-4>> +
Springe zu <<section-5>>
Springe zu <<_4>> +
Springe zu <<_5>>
[[section-4]]
=== 4
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Blättere nach <<section-5>>
Blättere nach <<_5>>
[[section-5]]
=== 5
[.add-item-key]
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
......@@ -54,9 +48,8 @@ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
[.combat.skill-8.stamina-6]
Giak Skill: 8 Stamina: 6
Goto to <<section-7>>
Goto to <<_7>>
[[section-6]]
=== 6
[.final]
// this is a finale sectionion
......@@ -64,22 +57,18 @@ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
[.death]
*YOU DIED!*
[[section-7]]
=== 7
This is section 7
[[section-8]]
=== 8
This section is unreached
Turn to <<section-12>>
Turn to <<_12>>
[[section-16]]
=== 16
Far ahead in the story
[[section-10]]
=== 10
This section was written very late!
Turn to <<section-12>>
Turn to <<_12>>
[[section-1]]
=== 1
[.fixed]
AAA
Turn to <<section-2>>
Turn to <<_2>>
[[section-2]]
=== 2
BBB
Turn to <<section-3>>
Turn to <<_3>>
[[section-3]]
=== 3
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
[.value-2.dist-3.progress-4]
......
[[section-1]]
=== 1
text
image::images/example01.png[]
text
[[section-2]]
=== 2
image::images/example02.png[Hello,12,12]
// This comment is lost
[[section-1]]
=== 1
[.fixed]
AAA
Turn to <<section-2>>
Turn to <<_2>>
[[section-2]]
=== 2
BBB
Turn to <<section-3>>
Turn to <<_3>>
[[section-3]]
=== 3
CCC
Turn to <<section-4>>
Turn to <<_4>>
[[section-4]]
=== 4
DDD
Turn to <<section-5>>
Turn to <<_5>>
[[section-5]]
=== 5
[.combat.skill-7.stamina-6]
EEE
......@@ -29,29 +24,24 @@ Fight the Troll
Troll [.Skill]#Skill#:7 [.Stamina]#Stamina#:6
Turn to <<section-6>>
Turn to <<_6>>
[[section-6]]
=== 6
FFF
Turn to <<section-7>>
Turn to <<_7>>
[[section-7]]
=== 7
GGG
Turn to <<section-8>>
Turn to <<_8>>
// the next sections are not separated by a newline
[[section-8]]
=== 8
[.fixed]
HHH
Turn to <<section-9>>
[[section-9]]
Turn to <<_9>>
=== 9
III
Turn to <<section-10>>
[[section-10]]
Turn to <<_10>>
=== 10
JJJ
This is the end
[[section-11]]
=== 11
Senna verschläft nie ihren Dienst, diese Aufgabe übernimmst du. Wenn ihr nicht wieder den Zorn von Korporal Brian zu spüren bekommen wollt, müsst ihr beide pünktlich auf eurem Posten stehen. Die Zeit drängt, du musst sie suchen. Vielleicht hat sie sich im Wirtshaus _Zur Roten Eiche_ wieder bei einem Humpen fest gesoffen oder sie ist noch im Gewürzviertel Tee für euch kaufen.
Willst du zum Wirtshaus gehen, lies weiter bei <<section-12>> +
Willst du Senna im Gewürzviertel suchen gehen, lies weiter <<section-22>>
Willst du zum Wirtshaus gehen, lies weiter bei <<_12>> +
Willst du Senna im Gewürzviertel suchen gehen, lies weiter <<_22>>
[[section-12]]
=== 12
[.location-tavern]
In frischen Buchstaben steht _Zur Roten Eiche_ auf dem Schild neben der Eingangstür zum Wirtshaus. Du trittst in den Gastraum und lässt deinen Blick schweifen. Stickige Luft und der Duft von frischem Bier steigt dir in die Nase. Am Abend füllt sich der Gastraum mit Händlern und Handwerkern, die an schmalen Tischen sitzen.
......@@ -16,40 +14,35 @@ Direkt neben der Tür wird an einem Tisch laut grölend ein Würfelspiel gespiel
image::images/Zur-Roten-Eiche.png[width=50%,align=center]
[[section-22]]
=== 22
[.location-spices]
Das Gewürzviertel in Oxhaven erstreckt sich über drei kurze Gassen, die sich an einem Platz treffen. Die meisten Geschäfte schließen bereits und scheuchen ihre Kundschaft raus. Die letzten Kunden und Händler streifen durch die Gassen, aber Senna entdeckst unter ihnen nicht. Du stehst auf dem Platz und lässt deinen Blick streifen, als dir ein kleiner Laden auffällt, in dem noch Licht brennt. Auf einer Holztafel neben der Tür steht: _Kräuterallerlei & Druidenbedarf_. Ob es dort Tee zu kaufen gibt?
Willst du das Geschäft betreten, lies weiter bei <<section-26>> +
Willst du noch einmal die Gassen absuchen, lies weiter bei <<section-27>> +
Willst du zum Wirtshaus _Zur Roten Eiche_ gehen, lies weiter bei <<section-12>> +
Willst du das Geschäft betreten, lies weiter bei <<_26>> +
Willst du noch einmal die Gassen absuchen, lies weiter bei <<_27>> +
Willst du zum Wirtshaus _Zur Roten Eiche_ gehen, lies weiter bei <<_12>> +
[[section-26]]
=== 26
[.location-spices]
Im Laden sind die Regale gefüllt mit Tontöpfen, kleinen Kisten und Fläschchen. Von der Decke hängen getrocknete Pflanzen und es duftet nach Kardamom und Nelken. Hinter einem Tisch steht ein große, blasse Frau mit wallenden, roten Locken in einem grauen Gewand. Sie trägt eine schwarze Kette um den Hals, an dieser hängt eine Sichel. Sie lächelt leicht und sagt '"Es ist spät, ich wollte gerade abschließen."'.
Besitzt du das *Siegel der Stadtwache* und möchtest es der Händlerin zeigen, lies weiter bei <<section-29>> +
Willst du den Laden verlassen und weiter nach Senna suchen, lies weiter bei <<section-28>> +
Besitzt du das *Siegel der Stadtwache* und möchtest es der Händlerin zeigen, lies weiter bei <<_29>> +
Willst du den Laden verlassen und weiter nach Senna suchen, lies weiter bei <<_28>> +
image::images/DeanSpencer-filler-shelves.png[width=50%,align=center]
[[section-27]]
=== 27
[.location-spices]
Du bist zum zweiten Mal alle drei Gassen abgelaufen, nun stehst du schnaufend auf dem Platz. Mittlerweile sind alle Geschäfte geschlossen und auch die letzten Kunden sind verschwunden. Die Gassen liegen ruhig und Dunkel vor dir. Wäre Senna vor dem Dienst hier gewesen, dann hättest du sie treffen müssen. Es ist bereits zu spät um pünktlich auf eurem Posten zu sein. Den nächsten Dienst werdet ihr am stinkenden Kanal schieben müssen. Du beschließt doch noch Senna aus der Roten Eiche zu zerren.
Lies weiter bei <<section-12>> +
Lies weiter bei <<_12>> +
[[section-28]]
=== 28
[.location-spices]
Alle Geschäfte sind bereits geschlossen und du stehst alleine auf der Gasse. Senna befindet sich nicht hier im Gewürzviertel. Der Gedanke an einen brüllenden Korporal Brian und den kargen halben Sold trüben deine Laune. Ihr werdet viel zu spät auf eure Dienst antreten. Sie schuldet dir mehr als nur ein Bier nach dieser Schicht, denn der Wachposten am stinkenden Kanal verdirbt dir schon jetzt die Laune. Du beschließt Senna aus der Roten Eiche zu zerren.
Lies weiter bei <<section-12>> +
Lies weiter bei <<_12>> +
[[section-29]]
=== 29
[.location-spices]
Die Kräuterhändlerin stutzt für einen kurzen Moment. Doch dann winkt sie dich hinein in ihren Laden. Das große Angebot überwältigt dich, sodass sie dich freundlich fragt, was du suchst.
......@@ -66,4 +59,4 @@ Ein grünes Pulver befindet sich fast bis zum Rand darin. Du kannst die *Kleine
Du bedankst dich für ihre Hilfe, verabschiedest dich von der Händlerin und verlässt das Geschäft.
Lies weiter bei <<section-28>>
Lies weiter bei <<_28>>
[[section-12]]
=== 12
asd asd
asd asd [.style]#Hello World# asd asd <<section-13>>
asd asd [.style]#Hello World# asd asd <<_13>>
[[section-13]]
=== 13
[.nothing-here]
\ No newline at end of file
[.nothing-here]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment