Checkpoint Eibenreith ink architecture

This commit is contained in:
2026-05-24 09:09:41 +02:00
parent beac5a2be3
commit d42540f29d
35 changed files with 12015 additions and 54 deletions
File diff suppressed because it is too large Load Diff
+379
View File
@@ -0,0 +1,379 @@
// ============================================================================
// EIBENREITH 02 BAHNHOF
// ============================================================================
// Kapitel 02: Mittag / Bahnhof und Umstieg.
//
// Architektur:
// - episode start/end + episode bucket
// - Räume mit entry, look, exits, bucket
// - Interaktionen als konditionierte Weaves in Buckets
// ============================================================================
// ============================================================================
// EPISODE DEFINITION
// ============================================================================
=== railway_station ===
-> station_midday
=== station_midday ===
~ state_reach(meal_plan_chosen)
~ character_move_to(viktor, loc_station_platform)
~ companion_join(viktor)
Die Station ist klein genug, dass der Zug kurz verlegen wirkt, als er dort hält. #chapter[Der Bahnhof] #image[muerzzuschlag.png](portrait)
Dampf hängt unter dem Stationsdach. Ein Gepäckträger mit zu großer Kappe eilt über den Bahnsteig. Jenseits des Gebäudes stampft ein Kutschpferd im gefrorenen Schlamm. Der Ortsname steht auf einem Schild, sachlich und kaiserlich, als hätte er nie vorgehabt, in einem Salon ausgesprochen zu werden. #gloss[Gepäckträger](Bahnhofsdienstmann für Koffer, Schachteln und jene kleine Demütigung, dass auch Besitz getragen werden muss.) #gloss[Stationsdach](Überdachung des Bahnsteigs. Sie schützt Reisende vor Wetter, nicht vor Blicken.)
{meal(MealPlan.dining_car):
~ state_reach(meal_taken_in_train)
Der Speisewagen hat dir ein kontrolliertes Mittagessen gegeben. Tischtuch, Besteck, gedämpfte Stimmen, Suppe unter Bewegung. Jetzt bleibt am Bahnhof vor allem der Umstieg.
- else:
{meal(MealPlan.station_restaurant):
Die Bahnhofsrestauration wartet mit Kaffee, Suppe, Zeitungen und dem Trost, dass jede Reiseklasse am Tisch wieder neu sortiert werden kann. #gloss[Bahnhofsrestauration](Gastwirtschaft am Bahnhof. Praktisch, laut und gesellschaftlich nützlich, weil Menschen dort essen, während sie so tun, als seien sie nur unterwegs.)
- else:
{meal(MealPlan.light_refreshment):
Tee, Gebäck und ein wenig Ruhe haben deinen Hunger nicht beseitigt, nur vertagt. Der Körper nimmt solche Höflichkeiten nicht immer dankbar an.
- else:
Du hast die Frage des Mittagessens noch nicht entschieden. Das ist kein Skandal, aber der Bahnhof wird aus kleinen Unterlassungen rasch praktische Schwierigkeiten machen.
}
}
}
-> station_platform
=== station_midday_episode_bucket ===
<- station_episode_viktor_current_room
<- station_episode_viktor_public_arrival
-> DONE
=== station_midday_end ===
-> DONE
// ============================================================================
// ROOM: STATION PLATFORM
// ============================================================================
=== station_platform ===
-> enter_room(loc_station_platform, -> station_platform_entry, -> station_platform_look, -> station_platform_exits, -> station_platform_bucket) -> provide_choices
=== station_platform_entry ===
~ state_reach(noticed_as_official_arrival)
Der Zug atmet aus. Menschen bewegen sich nicht chaotisch, sondern nach unsichtbaren Ranglinien. Wer zuerst aussteigt, wer wartet, wer trägt, wer nicht trägt, wer so tut, als habe er nichts gesehen. Viktor steht neben dir, korrekt genug, um als Sekretär durchzugehen, und zu aufmerksam, um einer zu sein.
-> DONE
=== station_platform_look ===
+ [__Schaue__: Über den Bahnsteig. #key:l]
Unter dem Stationsdach stehen Reisende, Kisten, Körbe und jene kleinen Gruppen, die nur auf Bahnhöfen entstehen. Niemand starrt offen. Stattdessen entstehen Leerstellen in den Bewegungen der Leute. Ein Blick wandert zu spät weiter. Ein Schritt ändert seine Richtung. Ein Gespräch besteht plötzlich nur noch aus Endungen.
-> provide_choices
-> DONE
=== station_platform_exits ===
+ {state_reached(baggage_handed_over)} [__Gehe__: Zur Kutsche. #key:s]
-> station_baggage_and_carriage
-> DONE
=== station_platform_bucket ===
<- station_platform_sign
<- station_platform_listen
<- station_platform_waiting_people
<- station_late_meal_choice
<- station_restaurant_offer
<- station_baggage
-> DONE
=== station_platform_sign ===
* [__Lies__: Das Schild am Bahnsteig. #key:x]
Der Ortsname ist mit schwarzer Farbe auf hellem Grund gemalt, zweckmäßig, kaiserlich, ohne jede Rücksicht auf den Eindruck, den er auf Ankommende macht. Die Buchstaben sehen aus, als hätten sie nur deshalb Haltung, weil man sie angeschraubt hat.
-> provide_choices
-> DONE
=== station_platform_listen ===
* [__Höre__: Auf den Bahnhof.]
Unter dem Zischen der Lokomotive liegen kleinere Geräusche. Ein Koffer wird auf Holz abgesetzt. Ein Beamter räuspert sich. Pferdehufe schlagen im gefrorenen Schlamm. Eine Frau beginnt ein Gebet und verschluckt das zweite Wort.
-> provide_choices
-> DONE
=== station_platform_waiting_people ===
* [__Untersuche__: Die Wartenden.]
Niemand scheint nur zu warten. Die einen zählen Gepäckstücke, die anderen Rangzeichen, wieder andere mögliche Fehler. Der Bahnhof ist kein Ort, an dem man unbemerkt ankommt. Er ist nur höflich genug, diese Tatsache nicht auszusprechen.
-> provide_choices
-> DONE
=== station_restaurant_offer ===
+ {meal(MealPlan.station_restaurant)} {state_before(meal_taken_at_station)} [__Speise__: In der Bahnhofsrestauration.]
-> station_restaurant_room
-> DONE
=== station_late_meal_choice ===
+ {meal(MealPlan.meal_unset)} {state_before(meal_skipped_or_light)} [__Speise__: In der Bahnhofsrestauration, auch wenn es eilt.]
Viktor sieht auf die Bahnhofsuhr. "Für ein ordentliches Essen ist wenig Zeit. Für eine schlechte Entscheidung immer genug."
~ meal_choose(MealPlan.station_restaurant)
Eine warme Suppe ist kein Luxus, wenn ein fremdes Haus den restlichen Tag besitzen wird.
-> station_restaurant_room
+ {meal(MealPlan.meal_unset)} {state_before(meal_skipped_or_light)} [__Nimm__: Nur Tee und etwas Gebäck.]
Viktor sieht auf die Bahnhofsuhr. "Für ein ordentliches Essen ist wenig Zeit. Für eine schlechte Entscheidung immer genug."
~ meal_choose(MealPlan.light_refreshment)
~ state_reach(meal_skipped_or_light)
Tee, Gebäck, ein paar Minuten Sitzen. Nicht genug, aber genug, um später nicht von Schwäche überrascht zu werden.
-> provide_choices
+ {meal(MealPlan.meal_unset)} {state_before(meal_skipped_or_light)} [__Verzichte__: Auf eine eigentliche Mahlzeit.]
Viktor sieht auf die Bahnhofsuhr. "Für ein ordentliches Essen ist wenig Zeit. Für eine schlechte Entscheidung immer genug."
~ meal_choose(MealPlan.skipped)
~ state_reach(meal_skipped_or_light)
Du behältst Zeit und verlierst Wärme. Der Körper wird sich die Rechnung merken.
-> provide_choices
-> DONE
=== station_baggage ===
+ {state_before(baggage_handed_over)} [__Überblicke__: Eine disziplinierte amtliche Zusammenstellung.]
Dein Gepäck wird in Etappen ausgeladen. Was zuerst sichtbar wird, ist nie ganz zufällig. Gepäck ist die kleine Autobiographie, die Bedienstete lesen dürfen.
~ route_inc(route_detective)
Zuerst kommt ein nüchterner Reisekoffer mit vom Gebrauch stumpfen Messingecken, dann eine Aktenmappe, dann eine Hutschachtel, dann der schmale schwarze Kasten, dessen Inhalt sowohl einen Priester als auch einen Taschenspieler in Verlegenheit bringen würde, falls einer von beiden ihn ohne Phantasie durchsuchte.
-> station_baggage_after_choice
+ {state_before(baggage_handed_over)} [__Überblicke__: Das Gepäck einer eleganten Dame.]
Dein Gepäck wird in Etappen ausgeladen. Was zuerst sichtbar wird, ist nie ganz zufällig. Gepäck ist die kleine Autobiographie, die Bedienstete lesen dürfen.
~ route_inc(route_composure)
Zuerst kommt ein großer Koffer aus dunklem Leder, dann ein kleinerer für Wäsche, dann eine runde Hutschachtel, ein Reise-Necessaire und das Ridikül, das du zu nahe bei der Hand behältst, als dass ein Gepäckträger seine Bedeutung missverstehen dürfte. #gloss[Reise-Necessaire](Kasten oder Tasche für Waschzeug, Fläschchen, Bürsten und jene Ausrüstung, mit der eine Dame nach einer Reise wieder wie eine Dame auszusehen hat.)
-> station_baggage_after_choice
+ {state_before(baggage_handed_over)} [__Überblicke__: Das Gepäck einer Darstellerin.]
Dein Gepäck wird in Etappen ausgeladen. Was zuerst sichtbar wird, ist nie ganz zufällig. Gepäck ist die kleine Autobiographie, die Bedienstete lesen dürfen.
~ route_inc(route_lover)
Zuerst kommt ein respektabler Koffer, dann eine Hutschachtel, dann ein Reisekasten mit Handschuhen, Schleiern, Bändern, Visitenkarten und kleinen Gegenständen, mit denen man ein Zimmer überreden kann, an Kräfte zu glauben, die längst anwesend sind.
-> station_baggage_after_choice
+ {state_before(baggage_handed_over)} [__Überblicke__: Eine praktische Auswahl, die zu viel Vorbereitung verrät.]
Dein Gepäck wird in Etappen ausgeladen. Was zuerst sichtbar wird, ist nie ganz zufällig. Gepäck ist die kleine Autobiographie, die Bedienstete lesen dürfen.
~ route_inc(route_detective)
Zuerst kommt ein abgenützter, an den Ecken verstärkter Koffer, dann eine Ledertasche mit Notizheften, Bleistiften, gefalteten Karten, Ersatzhandschuhen, einer kleinen Lampe und genug Notwendigkeiten, um jeden zu beleidigen, der Frauen lieber dekorativ hat.
-> station_baggage_after_choice
+ {state_before(baggage_handed_over)} [__Überblicke__: Ein übertriebener Haufen, der jede Tarnung erschwert.]
Dein Gepäck wird in Etappen ausgeladen. Was zuerst sichtbar wird, ist nie ganz zufällig. Gepäck ist die kleine Autobiographie, die Bedienstete lesen dürfen.
~ route_inc(route_careless)
Zuerst kommt ein Koffer, dann ein zweiter, dann eine Hutschachtel, dann eine Reisedecke, dann ein Toilettenkasten, dann der schmale schwarze Kasten, dann ein kleineres Paket, von dem du vergessen hattest, dass es das Packen überlebt hat. Am Ende sieht selbst Viktor einen Augenblick lang zahlenmäßig unterlegen aus.
-> station_baggage_after_choice
-> DONE
=== station_baggage_after_choice ===
Viktor überwacht die Umladung mit knapper Höflichkeit. Er trägt nicht wie ein Diener. Er weist an wie ein Mann, der vorgibt, nicht zu befehlen.
Die kleine Szene vor dem Waggon ist harmlos genug, um gefährlich zu sein. Ein Gepäckträger wartet mit geneigtem Kopf. Der Kutscher steht einige Schritte entfernt. Viktor ist nah genug, um dir beim Aussteigen die Hand zu reichen, aber nicht so nah, dass er es ohne dein stilles Einverständnis täte. Drei Männer, drei Stände, drei verschiedene Arten von Nützlichkeit.
Was hier geschieht, wird niemand in einem Bericht erwähnen. Gerade deshalb wird es behalten.
-> station_manners_puzzle
=== station_manners_puzzle ===
* {class ? noble} [__Warte__: Bis Viktor seine Hand anbietet. #key:z]
~ route_inc(route_composure)
~ rel_inc(viktor_reliable)
Du wartest einen Atemzug, bis Viktor seine Hand anbietet, und nimmst sie dann, als wäre dies keine Hilfe, sondern die Ordnung der Welt.
Du gibst ihm nicht dein Gewicht. Nur deine Hand. Genau genug, dass er dienen darf, ohne Diener zu werden. Der Gepäckträger senkt den Blick ein wenig tiefer. Der Kutscher sieht, was er sehen muss. Eine Dame, die ihren Rang nicht beweist, weil Beweise für Leute ohne Rang sind.
~ state_reach(public_mask_established)
* [__Gewähre__: Viktor die Hand und dem Gepäckträger das Gepäck.]
~ route_inc(route_composure)
~ rel_inc(viktor_reliable)
Du nimmst Viktors angebotene Hand knapp und sicher, dankst ihm mit einem Nicken und lässt den Gepäckträger das Gepäck nehmen.
Es ist gutes Benehmen ohne Prunk. Nicht zu vertraut gegenüber Viktor, nicht zu freundlich gegenüber dem Gepäckträger, nicht so kalt, dass es nach Unsicherheit riecht. Mittelstand könnte dies lernen. Adel könnte es billigen. Dienstboten würden erkennen, dass du ihre Arbeit nicht mit Herablassung verwechselst.
~ state_reach(public_mask_established)
* [__Dirigiere__: "Zuerst den kleineren Kasten, wenn ich bitten darf."]
~ route_inc(route_detective)
~ rel_inc(viktor_insightful)
Du steigst selbst aus, bevor Viktor sich entscheiden kann, und bittest den Gepäckträger sachlich, zuerst den kleineren Kasten zu nehmen.
Das ist nicht ganz falsch, aber auch nicht ganz richtig. Viktor bemerkt die kleine Missachtung der erwarteten Form. Der Gepäckträger gehorcht erleichtert, weil klare Anweisungen leichter zu tragen sind als feine Ungewissheit. Der Kutscher ordnet dich eher der Nützlichkeit als dem Rang zu.
~ state_reach(public_mask_strained)
~ state_reach(staff_as_witnesses_noticed)
* [__Reize__: Viktor einen Augenblick zu lang mit ausgestreckter Hand warten lassen.]
~ route_inc(route_lover)
~ rel_inc(viktor_unreliable)
~ rel_inc(viktor_open)
Du lässt Viktor zu lange mit ausgestreckter Hand warten und lächelst erst dann, als hättest du ihn absichtlich geprüft.
Es ist fast ein Fauxpas, gerettet durch Anmut und die Tatsache, dass Männer Demütigungen leichter verzeihen, wenn sie sich wie Aufmerksamkeit fühlen. Viktor hilft dir hinunter. Seine Hand bleibt vollkommen korrekt. Sein Blick nicht ganz.
~ state_reach(public_mask_strained)
* [__Verplappere dich__: "Ach, das macht doch zu viel Mühe."]
~ route_inc(route_careless)
~ rel_inc(viktor_concern)
Du entschuldigst dich beim Gepäckträger dafür, dass deine Sachen Mühe machen, und greifst selbst nach einem Koffer.
Der Gepäckträger erstarrt, als hättest du ihm eine philosophische Frage gestellt. Viktor tritt sofort dazwischen, höflich genug, um die Rettung wie Zufall aussehen zu lassen. Du hast gegen keine Moral verstoßen, nur gegen die unsichtbare Arbeitsteilung, auf der diese kleine Welt ruht.
~ state_reach(public_mask_strained)
~ state_reach(staff_as_witnesses_noticed)
* {class ? working} [__Greife zu__: Dem Gepäckträger beinahe den Koffer abnehmen. #key:t]
~ route_inc(route_careless)
~ rel_inc(viktor_concern)
~ rel_inc(viktor_control)
Du springst hinunter, bevor jemand dir helfen kann, und nimmst dem Gepäckträger beinahe den Koffer aus der Hand.
Für eine Sekunde bist du schneller als deine Verkleidung. Der Gepäckträger hält fest, Viktor greift nach deinem Ellbogen, der Kutscher sieht weg, weil Wegsehen manchmal die höflichste Form von Zeugenschaft ist. Es ist kein Unglück. Nur ein Riss, klein genug, um ihn mit Haltung zu schließen.
~ state_reach(public_mask_strained)
~ state_reach(staff_as_witnesses_noticed)
-
~ state_reach(baggage_handed_over)
-> provide_choices
// ============================================================================
// ROOM: STATION RESTAURANT
// ============================================================================
=== station_restaurant_room ===
-> enter_room(loc_station_restaurant, -> station_restaurant_entry, -> station_restaurant_look, -> station_restaurant_exits, -> station_restaurant_bucket) -> provide_choices
=== station_restaurant_entry ===
~ state_reach(meal_taken_at_station)
Die Bahnhofsrestauration ist wärmer als der Bahnsteig und weniger privat als das Abteil. Ein Kellner wischt einen Tisch, als könne er Reise, Klasse und Hunger mit demselben Tuch ordnen. An der Wand hängt eine Uhr, unter ihr ein Fahrplan, daneben ein Bild des Kaisers, das in diesem Licht mehr Geduld als Macht zeigt. #gloss[Fahrplan](Gedruckte Zusicherung, dass selbst Entfernung eine Bürokratie besitzt.)
Viktor wählt einen Tisch, von dem aus er Tür und Fenster sehen kann. Du wählst, ob du das bemerkst.
-> DONE
=== station_restaurant_look ===
+ [__Schaue__: Durch den Gastraum. #key:l]
Der Raum ist zu klein für Geheimnisse und groß genug für Gerüchte. Reisende essen mit der Ungeduld von Menschen, die weiter müssen. Der Kellner sieht alles, ohne etwas gesehen zu haben.
-> provide_choices
-> DONE
=== station_restaurant_exits ===
+ [__Verlasse__: Die Bahnhofsrestauration. #key:n]
Der Bahnsteig empfängt dich mit kalter Luft, Dampf und dem Gefühl, wieder öffentlich zu sein.
-> station_platform
-> DONE
=== station_restaurant_bucket ===
<- station_restaurant_viktor_table
-> DONE
=== station_restaurant_viktor_table ===
* [__Wahre Form__: "Ein Tisch, der Ihnen Ausblick erlaubt. Wie aufmerksam."]
~ route_inc(route_composure)
~ rel_inc(viktor_reliable)
"Ein Tisch, der Ihnen Ausblick erlaubt. Wie aufmerksam."
Viktor zieht den Stuhl nicht zu rasch zurück. "Gewohnheit, gnädiges Fräulein."
-> station_restaurant_lunch_end
* [__Prüfe__: "Sie setzen sich nie mit dem Rücken zur Tür."]
~ route_inc(route_detective)
~ rel_inc(viktor_insightful)
"Sie setzen sich nie mit dem Rücken zur Tür."
"Nicht, solange ich dafür bezahlt werde, es nicht zu tun."
-> station_restaurant_lunch_end
* [__Entschärfe__: "Ich verspreche, weder durch das Fenster noch durch die Küche zu entkommen."]
~ route_inc(route_careless)
~ rel_inc(viktor_open)
~ rel_inc(viktor_concern)
"Ich verspreche, weder durch das Fenster noch durch die Küche zu entkommen."
"Nehmen Sie mir nicht alle beruflichen Hoffnungen."
-> station_restaurant_lunch_end
=== station_restaurant_lunch_end ===
Das Essen ist einfach. Suppe, Brot, Kaffee, vielleicht ein Stück kaltes Fleisch. Es erfüllt keinen Traum, aber einen Zweck. Als du wieder aufstehst, hat der Bahnhof dich nicht weniger fremd gemacht, nur etwas belastbarer.
-> station_platform
// ============================================================================
// EPISODE BUCKET: VIKTOR PRESENT
// ============================================================================
=== station_episode_viktor_current_room ===
* {present(viktor)} {loc(loc_station_platform)} [__Frage__: Viktor, was er vom Bahnhof hält.]
"Ein Bahnhof ist selten nur ein Bahnhof", sagt Viktor. "Er zeigt, wer erwartet wird, wer abgefertigt wird und wer glaubt, ungesehen warten zu können."
-> provide_choices
-> DONE
=== station_episode_viktor_public_arrival ===
* {present(viktor)} {state_between(noticed_as_official_arrival, public_mask_established)} [__Frage__: Viktor, ob die Leute dich ansehen.]
"Ja", sagt er. "Aber noch nicht gefährlich. Neugier ist leichter zu lenken als Misstrauen."
-> provide_choices
-> DONE
// ============================================================================
// EXIT TO CHAPTER 03
// ============================================================================
=== station_baggage_and_carriage ===
~ state_reach(carriage_arranged)
~ state_reach(road_departure_ready)
Die Kutsche aus Hohenreith wartet jenseits des Stationshofes. Dunkelgrüner Lack, schwarze Räder, das gräfliche Wappen dezent auf der Tür, zwei Pferde bereits unruhig im Geschirr. Der Kutscher nimmt den Hut ab, als er dich sieht. Nicht zu tief. Tief genug für Rang, nicht tief genug für Ehrfurcht. #sfx[horse-neigh.ogg]
"Gnädiges Fräulein? Herr Sekretär?"
{class ? noble:
Man hat ihm genug gesagt, um dich einzuordnen. Das ist eine Höflichkeit. Es ist auch eine Warnung.
- else:
Er zögert bei dir um das kleinste Maß. Das Zögern ist keine Unhöflichkeit. Es ist Berechnung. Erste Klasse, Hofschreiben, kein Titel außer Fräulein, und ein Mann neben dir, der aussieht, als hätte er Menschen für weniger verhaften lassen als Starren.
}
Viktor antwortet, bevor du es kannst.
"Vom Jagdhaus Hohenreith?"
"Jawohl, Herr Sekretär. Der Weg ist befahrbar. Wenn der Nebel nicht dichter wird, sollten wir Eibenreith vor Einbruch der Dunkelheit erreichen."
Das Wort tritt ohne Zeremonie in die Luft.
Eibenreith.
Nicht Hohenreith, der Name, der in sauberer Hand auf der Einladung steht. Eibenreith. Das Dorf darunter. Ein kleinerer Name. Älter im Mund. Ein Name mit Wurzeln statt Briefpapier.
~ episode_end("normal")
~ time_move_to(afternoon)
~ loc_move_to(loc_carriage)
-> carriage_ride
@@ -0,0 +1,431 @@
// ============================================================================
// EIBENREITH 03 ROUTES / ANKUNFT HOHENREITH
// ============================================================================
// Zielknoten der Nachmittags-Episode "Anreise nach Hohenreith".
// Diese Datei gehört strukturell zu Kapitel 03: Kutschenfahrt, Eibenreith,
// Routenentscheidung und Ankunft in Hohenreith.
// ============================================================================
=== direct_hohenreith_arrival ===
~ loc_move_to(loc_hohenreith_arrival)
~ state_reach(HohenreithArrivalFrame.punctual_official_guest)
~ state_reach(HohenreithArrivalFrame.household_form_preserved)
Die Kutsche lässt Eibenreith unterhalb der Straße zurück. #chapter[Hohenreith]
Das Dorf bleibt nicht ungesehen, nur unbetreten: ein Kirchturm, niedrige Dächer, Rauch, ein paar Gesichter in Fenstern. Dann nimmt der Wald es wieder an sich. Der Weg steigt, und mit jedem Ruck der Kutsche wird der Nachmittag förmlicher. Du fährst nicht mehr irgendwohin. Du wirst erwartet.
Jagdhaus Hohenreith erscheint zwischen Fichten und kahlen Obstbäumen nicht wie ein Schloss, sondern wie ein sehr entschlossener Irrtum: zu neu im oberen Bau, zu alt in den Fundamenten, zu höflich in der Fassade für die Kälte, die darunter aus dem Hang steigt. Dunkle Holzgalerien, helle Mauern, ein vorspringender Mittelteil, Geweihe über dem Portal und Fenster, die das Tal betrachten, als hätten sie es gekauft. #gloss[Jagdhaus](Adeliger Landsitz für Jagden und kurze Aufenthalte. Weniger Hauptsitz als Bühne für Gäste, Förster, Gewehre und Geheimnisse.) #gloss[Portal](Haupteingang eines repräsentativen Gebäudes. Eine Tür, die gelernt hat, Menschen schon vor dem Eintreten zu beurteilen.)
Viktor steigt zuerst aus. Der Kutscher öffnet den Schlag. Ein Diener steht bereits vor der Tür, als wäre er aus dem Haus gesandt worden, noch ehe die Kutsche um die letzte Biegung kam.
Du kommst pünktlich an. Das ist keine Kleinigkeit. In Häusern wie diesem ist Pünktlichkeit die erste Lüge, die alle Beteiligten gemeinsam schützen.
* [__Wahre Form__: Den ersten Blick des Hauses annehmen.]
~ route_inc(route_composure)
~ state_reach(HohenreithArrivalFrame.expected_guest)
Du steigst aus, nimmst Viktor nur so weit in Anspruch, wie die Form verlangt, und lässt Mantel, Hut und Handschuhe sprechen, bevor du selbst etwas sagst.
Der Diener verneigt sich. Nicht tief. Richtig. Das Haus hat entschieden, dich zunächst als Dame zu behandeln.
-> hohenreith_direct_butler_welcome
* [__Prüfe__: Die Fassade, bevor du dich ihr überlässt.]
~ route_inc(route_detective)
~ state_reach(HohenreithArrivalFrame.expected_guest)
Dein Blick folgt den Linien des Hauses: neue Fenster über älterem Mauerwerk, ein sauberer Eingang über feuchtem Stein, Försterordnung über etwas, das nicht nach Jagd aussieht.
Viktor bemerkt deinen Blick. Er sagt nichts. Das ist klug von ihm.
-> pre_dinner_transition
* [__Entschärfe__: „Es sieht fast so aus, als wolle es uns gefallen.“]
„Es sieht fast so aus, als wolle es uns gefallen.“
~ route_inc(route_careless)
~ rel_inc(viktor_open)
„Häuser wollen nichts“, sagt Viktor.
„Dann ist dieses besonders schlecht darin.“
-> pre_dinner_transition
// ============================================================================
// VILLAGE DETOUR ROUTE
// ============================================================================
=== village_detour_start ===
~ loc_move_to(loc_eibenreith_village)
~ mark(AfternoonOutcome.village_knowledge_prioritised)
~ state_reach(EibenreithPublicFace.curious)
Zuerst kommt der Geruch von Rauch. Dann ein Dach, niedrig und dunkel vom Wetter. Dann ein zweites. Dann ein Kirchturm, nicht hoch, nicht anmutig, sondern breitschultrig und blass vor dem Hang dahinter. Seine Mauern wirken älter als das Dorf um sie her und weniger sicher ihres Sieges. Die Fenster sind klein. Die Kirchhofmauer hält die Straße auf Abstand, als bräuchten die Toten Schutz vor den Lebenden oder die Lebenden vor etwas anderem. #chapter[Eibenreith] #sfx[church-bells.ogg](max=8, fade) #image[eibenreith.png](landscape)
Eibenreith erscheint nicht, wie ein Dorf auf einem Bild erscheint, auf einmal und zur Bewunderung geordnet, sondern in Bruchstücken.
Eine Frau mit einem dunklen Kopftuch hält mit einem Eimer in der Hand inne. Ein Bub hört auf, Gänse zu treiben, und lässt sie um seine Stiefel klagen. Zwei Männer vor einem Schuppen beenden im selben Augenblick ihr Gespräch, ohne einander anzusehen. Vorhänge rühren sich an Fenstern, hinter denen niemand zugibt zu stehen. Ein Schmiedeschild bewegt sich leicht in Luft, die du nicht fühlen kannst. Wasser läuft irgendwo unter Brettern, unter Stein, unter der Straße selbst, schnell, kalt und verborgen. #gloss[Schmiedeschild](Schild einer Schmiede. In einem Dorf oft weniger Werbung als Zusicherung, dass Eisen, Pferde und Männer noch in Ordnung gebracht werden können.)
Die Häuser sind nicht arm, nicht eigentlich. Viele sind fest, weißgekalkt, geschindelt, erhalten mit der störrischen Anständigkeit von Menschen, die reparieren, was sie nicht ersetzen können. Und doch stört etwas in ihrer Anordnung das Auge. Sie wenden sich der Kirche zu, aber nicht ganz. Sie halten die Straße, aber lehnen sich von ihr weg. Sie lassen zwischen Hof, Zaun und Holzstoß schmale Durchgänge, in denen sich Schatten zu früh sammelt.
Die Kutsche hält.
Niemand läuft herbei, um dich zu begrüßen. Niemand muss das. Die Nachricht ist bereits ins Dorf eingetreten, auf Wegen schneller als Bahn, Telegraph oder kaiserliches Siegel.
Du sitzt sehr gerade, während Eibenreith dich zum ersten Mal betrachtet.
-> village_detour_surface
// ============================================================================
// VILLAGE DETOUR SURFACE
// ============================================================================
=== village_detour_surface ===
Die Dorfstraße ist kein Salon und gerade deshalb nicht weniger gesellschaftlich. Jeder Blick hat hier weniger Politur, aber mehr Gedächtnis.
* [__Schaue__: In die Gesichter am Straßenrand. #key:l]
Die Gesichter verschwinden nicht, wenn du hinsiehst. Sie verändern nur ihre Begründung: Eine Frau prüft plötzlich ihren Eimer. Ein Bub entdeckt die Gänse neu. Ein Mann tut, als habe er schon immer zum Kirchtor gesehen. Das Dorf besitzt keine Bühne, aber jeder hier kennt seinen Auftritt.
-> village_detour_surface
* [__Höre__: Auf das Wasser unter der Straße.]
Unter den Rädern, unter Brettern und Steinen, unter der höflichen Behauptung einer Dorfstraße läuft Wasser. Es klingt nicht tief, aber schnell. Als hätte der Ort einen zweiten Atem, einen kalten, verborgenen, der nicht durch menschliche Münder geht.
-> village_detour_surface
* [__Untersuche__: Die Kirche. #key:x]
~ state_reach(VillageReligiousTension.church_as_center_seen)
Der Turm ist nicht schlank genug, um in den Himmel zu zeigen. Er steht da wie eine Faust. Die kleinen Fenster geben wenig preis, und die Mauer des Kirchhofs wirkt weniger wie Einfriedung als wie eine alte Gewohnheit, sich gegen etwas zu stemmen.
{
- relig ? catholic:
Gerade das stört dich: nicht der Mangel an Schönheit, sondern der Mangel an Frieden.
- relig ? reform:
Du siehst weniger Andacht als Institution: Stein, Besitz, Grenze, Verwaltung der Furcht.
- else:
Die Kirche sieht nicht aus, als habe sie den älteren Dingen im Tal widersprochen. Eher, als habe sie gelernt, über ihnen zu stehen.
}
-> village_detour_surface
* [__Betrachte__: Das Bild neben dem Kirchhofstor.]
-> religious_image_reaction
* [__Warte__: Bis die Kutsche wieder bereit ist. #required #key:z]
-> village_exit_puzzle
=== religious_image_reaction ===
~ state_reach(VillageReligiousTension.christian_surface_noted)
~ state_reach(VillageReligiousTension.older_presence_hint)
Über dem alten Putz neben dem Kirchtor blickt eine verblasste gemalte Frau unter einem abblätternden blauen Mantel herab. Ihre Hände sind zum Gebet gefaltet. Ihre Augen, vom Wetter beschädigt, zeigen nicht mehr in dieselbe Richtung.
{
- relig ? catholic:
Für einen Atemzug stört dich nicht, dass das Bild alt ist. Es stört dich, dass es nicht mehr ganz heilig wirkt.
- relig ? reform:
Für einen Atemzug wirkt das Bild weniger wie Andacht als wie Verwaltung: ein aufgemaltes Siegel über etwas, das man nicht fortschaffen konnte.
- relig ? social:
Für einen Atemzug erkennst du die vertraute Geste und misstraust trotzdem dem Ort, an dem sie gemalt wurde.
- else:
Für einen Atemzug, als die Räder über ein verborgenes Wasserrinnsal fahren, wirkt das gemalte Gesicht weniger wie die Heilige Mutter als wie eine Maske, die etwas aufgesetzt wurde, das länger gewartet hatte.
}
-> village_detour_surface
// ============================================================================
// VILLAGE EXIT SOCIAL PUZZLE
// ============================================================================
=== village_exit_puzzle ===
~ state_reach(EibenreithPublicFace.cautious)
Der Kutscher hält vor dem Wirtshaus oder vielleicht nur vor dem Gebäude, das in einem besseren Dorf eines gewesen wäre. Ein Knecht aus dem Dorf tritt aus dem Schatten des Tors. Viktor öffnet die Kutschentür von innen nicht sofort; der Kutscher steigt ab, um den Schlag zu öffnen. Der Knecht sieht auf dein Gepäck, dann auf deine Handschuhe, dann auf Viktor.
Wieder stellt die Welt eine Frage, ohne sie auszusprechen: Wer darf dir helfen, wer muss dir helfen, und wem erlaubst du, dabei wichtig zu wirken?
* {class ? noble} [__Warte__ · **Adel**: Bis der Kutscher den Schlag öffnet und Viktor zuerst aussteigt. #key:z]
~ route_inc(route_composure)
~ rel_inc(viktor_reliable)
Du wartest, bis der Kutscher den Schlag öffnet und Viktor zuerst aussteigt; erst dann reichst du Viktor die behandschuhte Hand.
Es geschieht langsam genug, dass alle Beteiligten ihre Rolle finden. Der Kutscher ist Dienst, Viktor ist Begleitung, der Knecht ist noch nicht wichtig genug, um dich zu berühren. Dein Fuß erreicht den Boden, als hätte die Straße sich dafür bereitgehalten.
~ state_reach(EibenreithPublicFace.cautious)
* [__Gewähre__: Viktor die Hand und dem Kutscher den Dank.]
~ route_inc(route_composure)
~ rel_inc(viktor_reliable)
Du lässt Viktor aussteigen, nimmst seine Hand beim Abtreten und dankst dem Kutscher erst danach mit einem knappen Blick.
Der Ablauf ist korrekt genug, um keine Geschichte zu erzeugen. In einem Dorf, das von Geschichten lebt, ist das ein kleiner Sieg.
~ state_reach(EibenreithPublicFace.cautious)
* [__Dirigiere__: „Zuerst den kleineren Kasten.“]
~ route_inc(route_detective)
~ rel_inc(viktor_insightful)
Du gibst dem Knecht eine klare Anweisung, welches Gepäck zuerst abgeladen werden soll, bevor er danach fragen kann.
Er gehorcht sofort. Viktor registriert die Zweckmäßigkeit. Der Kutscher registriert die Ungewöhnlichkeit. Eine Dame, die Gepäckreihenfolgen kennt, ist entweder sehr erfahren, sehr nervös oder beides.
~ state_reach(EibenreithPublicFace.suspicious)
~ state_reach(ServiceWorld.staff_as_witnesses_noticed)
* [__Reize__: Den Kutscher mit zu warmer Freundlichkeit.]
~ route_inc(route_lover)
~ rel_inc(viktor_open)
~ rel_inc(viktor_unreliable)
Du bietest dem Kutscher ein sichtbares Lächeln und ein zu freundliches „Danke“ an.
Der Mann senkt den Blick, verwirrt und geschmeichelt. Viktor wird stiller. Freundlichkeit über Standesgrenzen hinweg kann Güte sein, Taktik oder Unachtsamkeit. Auf dem Dorf wird niemand lange brauchen, eine vierte Möglichkeit zu erfinden.
~ state_reach(EibenreithPublicFace.suspicious)
* [__Verplappere dich__: „Ach, das macht doch zu viel Mühe.“]
~ route_inc(route_careless)
~ rel_inc(viktor_concern)
Du entschuldigst dich beim Knecht dafür, dass deine Sachen Mühe machen, und greifst selbst nach einem Koffer.
Der Knecht erstarrt, als hättest du ihm eine philosophische Frage gestellt. Viktor tritt sofort dazwischen, höflich genug, um die Rettung wie Zufall aussehen zu lassen. Du hast gegen keine Moral verstoßen, nur gegen die unsichtbare Arbeitsteilung, auf der diese kleine Welt ruht.
~ state_reach(EibenreithPublicFace.unsettled)
~ state_reach(ServiceWorld.staff_as_witnesses_noticed)
* {class ? working} [__Rutsche aus__ · **Unterschicht**: Allein, bevor jemand dir helfen kann.]
~ route_inc(route_careless)
~ rel_inc(viktor_concern)
~ rel_inc(viktor_control)
Du steigst allein aus, nimmst deinen Rock hoch genug, um den Schlamm zu sehen, und sagst dem Knecht, er solle mit dem schweren Koffer vorsichtig sein.
Es ist praktisch, schnell und völlig falsch. Nicht, weil du unrecht hast, sondern weil du recht hast wie jemand, der selbst schon getragen hat. Der Knecht erkennt es. Viktor auch.
~ state_reach(EibenreithPublicFace.unsettled)
~ state_reach(ServiceWorld.staff_as_witnesses_noticed)
-
Neben dir senkt Viktor die Stimme.
„Vergessen Sie nicht: In Hohenreith wird jede Höflichkeit etwas bedeuten. Hier wird es jedes Schweigen tun.“
* [__Prüfe__: „Dann werden wir bereits empfangen.“]
„Dann werden wir bereits empfangen.“
~ route_inc(route_detective)
~ rel_inc(viktor_insightful)
„Ja“, sagt er. „Und geprüft.“
* [__Benenne__: „Sie lassen es klingen, als stünde das Dorf über dem Grafen.“]
„Sie lassen es klingen, als stünde das Dorf über dem Grafen.“
~ route_inc(route_eccentric)
~ rel_inc(viktor_adversarial)
„Nein“, sagt Viktor. „Nur, als hätte es vielleicht mehr als einen überlebt.“
* [__Entwaffne__: „Wie glücklich, dass ich mehrere Arten des Schweigens eingepackt habe.“]
„Wie glücklich, dass ich mehrere Arten des Schweigens eingepackt habe.“
~ route_inc(route_lover)
~ rel_inc(viktor_open)
Sein Mund bewegt sich beinahe. „Verwenden Sie zuerst das schlichteste.“
* [__Verplappere dich__: „Ich mag es nicht, von Leuten beobachtet zu werden, die sich nicht vorstellen.“]
„Ich mag es nicht, von Leuten beobachtet zu werden, die sich nicht vorstellen.“
~ route_inc(route_careless)
~ rel_inc(viktor_concern)
„Das“, sagt er, „wird sich heute kaum bessern.“
* [__Schone sie__: „Wenn Amalia ihr ganzes Leben unter diesem Blick gelebt hat, beginne ich zu verstehen, weshalb man nach Geistern sandte.“]
„Wenn Amalia ihr ganzes Leben unter diesem Blick gelebt hat, beginne ich zu verstehen, weshalb man nach Geistern sandte.“
~ route_inc(route_sapphic)
~ rel_inc(viktor_insightful)
Viktor sieht dich an, doch welche Antwort er auch erwägt, er behält sie hinter den Zähnen.
-
~ state_reach(EibenreithPublicFace.openly_watching_valerie)
-> village_departure_choice
// ============================================================================
// DIRECT CARRIAGE WELCOME
// ============================================================================
=== hohenreith_direct_butler_welcome ===
Ein Butler tritt an die unterste Stufe. Nicht der Diener von vorhin, sondern ein Mann, der dem Haus seine Stimme geliehen hat: schwarz gekleidet, glatt rasiert, mit dem leeren Gesichtsausdruck vollendeter Haushaltskenntnis. Er verneigt sich zuerst vor dir, dann vor Viktor.
„Willkommen in Hohenreith.“
Die Worte sind vollkommen richtig. Genau deshalb ist unklar, ob sie Gruß, Urteil oder Besitzanzeige sind.
-> pre_dinner_transition
// ============================================================================
// VILLAGE DEPARTURE CHOICE
// ============================================================================
=== village_departure_choice ===
Die Kutsche wartet. Das Dorf wartet nicht; es sieht nur so aus. Zwischen den Häusern haben sich die Blicke anders verteilt. Ein paar Menschen sind verschwunden, aber die Fenster haben mehr Augen bekommen.
Viktor hält die Kutschentür offen. „Wenn wir jetzt fahren, lässt sich die Verspätung noch als Wegverhältnis erklären.“
Der Kutscher sieht zu dir. Er hat verstanden, dass nicht er entscheidet, wann die Reise weitergeht.
* [__Wahre Form__: Wieder einsteigen und nach Hohenreith weiterfahren.]
~ route_inc(route_composure)
~ rel_inc(viktor_reliable)
~ state_reach(HohenreithArrivalFrame.delayed_after_village_detour)
Du steigst wieder ein. Die Entscheidung rettet nicht die Pünktlichkeit, aber die Form: Verspätung durch Aufenthalt, nicht durch Auflehnung.
-> delayed_hohenreith_arrival
* [__Prüfe__: Das Dorf gesehen haben; jetzt das Haus sehen.]
~ route_inc(route_detective)
~ rel_inc(viktor_insightful)
~ state_reach(HohenreithArrivalFrame.delayed_after_village_detour)
Du steigst ein, bevor das Dorf den Aufenthalt in eine zweite Szene verwandeln kann. Du hast nicht genug gesehen. Aber genug, um zu wissen, welche Fragen im Haus falsch beantwortet werden könnten.
-> delayed_hohenreith_arrival
* [__Verfüge__: Die Kutsche mit Gepäck und Nachricht vorausschicken.]
„Die Kutsche fährt voraus“, sagst du. „Mit dem Gepäck. Und mit einer Nachricht, dass wir nachkommen.“
~ route_inc(route_eccentric)
~ rel_inc(viktor_loss_of_control)
~ rel_inc(viktor_irritation)
~ rel_inc(viktor_concern)
~ state_reach(HohenreithArrivalFrame.household_form_disturbed)
Viktor sieht dich an, als hättest du nicht einen Weg, sondern eine Dienstvorschrift verlassen.
-> village_send_carriage_ahead
// ============================================================================
// CARRIAGE SENT AHEAD / ARRIVAL ON FOOT
// ============================================================================
=== village_send_carriage_ahead ===
Der Kutscher nimmt die Nachricht entgegen, als sei Papier unter bestimmten Umständen gefährlicher als Glatteis. Viktor prüft jedes Wort, das du ihm diktierst, ohne offen zu widersprechen. Das Gepäck wird wieder aufgeladen. Der Kutscher fährt an, langsam genug, dass das Dorf den Vorgang vollständig verstehen kann.
Zurück bleiben du, Viktor, die Straße nach Hohenreith und ein Schweigen, das nicht mehr in die Kutsche passt.
* [__Wahre Form__: Eine knappe, korrekte Nachricht schicken.]
„Teilen Sie mit, dass wir dem Jagdhaus zu Fuß folgen und vor dem Abend eintreffen.“
~ route_inc(route_composure)
~ rel_inc(viktor_reliable)
Die Nachricht klingt wie Absicht. Das ist das Mindeste, was man einer Unordnung schuldig ist.
-> footpath_to_hohenreith
* [__Prüfe__: Die Nachricht sachlich halten.]
„Wir kommen zu Fuß nach. Das Gepäck soll bereits aufgenommen werden. Man möge unseren verspäteten Eintritt erwarten.“
~ route_inc(route_detective)
~ rel_inc(viktor_insightful)
Keine Entschuldigung, keine Erklärung. Eine Erklärung vor der Beobachtung wäre Verschwendung.
-> footpath_to_hohenreith
* [__Benenne__: Die Nachricht als Warnung formulieren.]
„Sagen Sie, wir wollten Eibenreith nicht durchqueren wie ein Möbelstück im Besitz des Hauses.“
~ route_inc(route_eccentric)
~ rel_inc(viktor_adversarial)
Viktor schließt kurz die Augen. „Das werde ich nicht diktieren.“
„Dann schreiben Sie: Wir kommen zu Fuß.“
-> footpath_to_hohenreith
=== footpath_to_hohenreith ===
~ loc_move_to(loc_eibenreith_village)
~ state_reach(HohenreithArrivalFrame.delayed_after_village_detour)
~ state_reach(HohenreithArrivalFrame.household_form_disturbed)
Der Weg nach Hohenreith steigt nicht steil genug an, um dramatisch zu sein, aber stetig genug, um deine Schuhe, deinen Saum und deine Atmung an die Wirklichkeit zu erinnern. Hinter dir bleibt Eibenreith. Vor dir liegt das Jagdhaus. Dazwischen ist kein Salon, keine Kutsche, keine Polsterung der Verhältnisse.
Viktor geht neben dir, nicht vor dir und nicht hinter dir. Das ist vielleicht Takt. Vielleicht Aufsicht. Vielleicht die einzige Form von Zustimmung, die er sich im Freien leisten kann.
* [__Entschärfe__: „Sie dürfen jetzt sagen, dass Sie mir davon abgeraten hätten.“]
„Sie dürfen jetzt sagen, dass Sie mir davon abgeraten hätten.“
~ route_inc(route_careless)
~ rel_inc(viktor_open)
„Ich hätte Ihnen davon abgeraten.“
„Das kam überzeugender, als ich gehofft hatte.“
-> foot_hohenreith_arrival
* [__Prüfe__: „Wer uns jetzt sieht, sieht uns ohne Hausordnung.“]
„Wer uns jetzt sieht, sieht uns ohne Hausordnung.“
~ route_inc(route_detective)
~ rel_inc(viktor_insightful)
„Und wer uns erwartet, wird entscheiden, ob das Absicht oder Mangel an Disziplin war.“
-> foot_hohenreith_arrival
* [__Trotze__: „Manchmal muss man einem Haus den ersten Schritt verweigern.“]
„Manchmal muss man einem Haus den ersten Schritt verweigern.“
~ route_inc(route_eccentric)
~ rel_inc(viktor_adversarial)
„Häuser erinnern sich nicht.“
„Familien tun es.“
-> foot_hohenreith_arrival
=== foot_hohenreith_arrival ===
~ loc_move_to(loc_hohenreith_arrival)
Als ihr das Tor erreicht, steht die Kutsche bereits im Hof. Das Gepäck ist fortgetragen. Eure Ankunft dagegen hat niemand forttragen können. Zwei Diener wissen, dass ihr zu Fuß kamt. Ein Kutscher weiß, dass du es angeordnet hast. Ein Fenster im ersten Stock weiß es ebenfalls.
Der Butler wartet am Portal. Wenn ihn eure Ankunft überrascht, hat er die Überraschung vor vielen Jahren abgeschafft. Er verneigt sich mit einer Genauigkeit, die nicht wärmer wird, nur weil du Atem in der Brust hast und Wegschmutz am Saum.
„Willkommen in Hohenreith.“
Der Satz nimmt euch auf. Er verzeiht nichts.
-> pre_dinner_transition
// ============================================================================
// DELAYED ARRIVAL AFTER VILLAGE DETOUR BY CARRIAGE
// ============================================================================
=== delayed_hohenreith_arrival ===
~ loc_move_to(loc_hohenreith_arrival)
~ state_reach(HohenreithArrivalFrame.delayed_after_village_detour)
~ state_reach(HohenreithArrivalFrame.household_form_disturbed)
Die Pferde ziehen die Kutsche an der Kirchhofmauer vorbei und aus dem Dorf hinaus. Die Straße biegt zur unsichtbaren Höhe, auf der Jagdhaus Hohenreith über Eibenreith unter seinem neueren Namen steht.
Als das Jagdhaus erscheint, ist der Nachmittag bereits weiter fortgeschritten, als die Einladung vorsah. Das Haus empfängt dich nicht unhöflich. Das wäre zu ehrlich. Es empfängt dich mit jener gesteigerten Korrektheit, mit der bessere Häuser kleine Verstöße festhalten, ohne sie beim Namen zu nennen.
Ein Diener steht vor dem Portal. Hinter einem Fenster im ersten Stock bewegt sich ein Vorhang zu spät zurück.
Viktor sagt leise: „Jetzt weiß man, dass Sie eigene Umwege nehmen.“
Der Kutscher bringt die Pferde zum Stehen. Noch einmal wird der Schlag geöffnet. Wer verspätet mit der Kutsche ankommt, erhält die Form ein zweites Mal; nur ist sie nun nicht mehr unschuldig.
* [__Wahre Form__: Aussteigen, als sei die Verspätung Teil des Plans.]
„Dann wollen wir dafür sorgen, dass der Umweg Absicht war.“
~ route_inc(route_composure)
~ rel_inc(viktor_reliable)
Du wartest, bis Viktor aussteigt, und nimmst seine Hand gerade lange genug. Die Geste schützt euch beide vor der gröberen Wahrheit: dass du im Dorf getan hast, was eine eingeladene Dame nicht tun muss und vielleicht nicht tun sollte.
-> hohenreith_delayed_butler_welcome
* [__Prüfe__: Beim Aussteigen das Fenster beachten.]
„Wer am Fenster stand, wusste es schon vor dem Diener.“
~ route_inc(route_detective)
~ rel_inc(viktor_insightful)
Du steigst aus und siehst nicht zum Fenster. Nicht sofort. Das ist die einzige Höflichkeit, die Beobachtung manchmal braucht.
-> hohenreith_delayed_butler_welcome
* [__Benenne__: Die Verspätung nicht entschuldigen.]
„Ein Haus, das Verspätung kränkt, hat Angst vor eigener Zeit.“
~ route_inc(route_eccentric)
~ rel_inc(viktor_adversarial)
„Bitte sagen Sie das nicht beim Abendessen.“
„Ich sagte es Ihnen. Das ist beinahe dasselbe wie Zurückhaltung.“
-> hohenreith_delayed_butler_welcome
=== hohenreith_delayed_butler_welcome ===
Der Butler tritt an die unterste Stufe. Seine Verneigung ist nicht kürzer als sie bei pünktlicher Ankunft gewesen wäre. Das ist die Härte daran.
„Willkommen in Hohenreith.“
Die Worte lassen keinen Vorwurf hören. Sie brauchen keinen.
-> pre_dinner_transition
// ============================================================================
// PRE-DINNER TRANSITION / INTRO SCORE
// ============================================================================
@@ -0,0 +1,571 @@
// ============================================================================
// EIBENREITH 03 KUTSCHENFAHRT
// ============================================================================
// Kapitel 03: Nachmittag / Kutschenfahrt.
//
// Architektur:
// - episode start/end + episode bucket
// - Kutsche und Wegzeichen als Räume
// - Landschaft, Wegzeichen und Nachmittagsentscheidung als Bucket-Weaves
// - drei Ausgänge in Kapitel 04:
// direkt nach Hohenreith
// Dorfdetour, danach mit der Kutsche weiter
// Dorfdetour, Kutsche voraus, Ankunft zu Fuß
// ============================================================================
// ============================================================================
// EPISODE DEFINITION
// ============================================================================
=== coach_journey ===
-> carriage_ride
=== carriage_ride ===
~ character_move_to(viktor, loc_carriage)
~ companion_join(viktor)
Die Kutsche lässt die Station hinter sich und damit das letzte leicht erkennbare Zeichen der Monarchie. #chapter[Die Kutschenfahrt] #music[Kaiserpunk Jodler.mp3](crossfade, loop, lead=4)
Zuerst folgt der Weg einem Tal, in dem Telegraphendraht ihm noch Gesellschaft leistet und der Fluss in einem hellen, steinigen Bett läuft. Sägewerke, umzäunte Wiesen und Bauernhäuser erscheinen und verschwinden hinter Fichtenbeständen. Die Berge steigen nicht auf einmal. Sie rücken zuständigkeitsweise vor: ein bewaldeter Hang links, eine graue Wand aus Kalk im Norden, ein weiterer Rücken im Osten, bis selbst die Wolken in Dienst getreten scheinen. #gloss[Telegraphendraht](Drahtleitung für elektrische Nachrichten. Sehr modern, solange man nicht fragt, welche Dinge Menschen dadurch nur schneller missverstehen.) #gloss[Sägewerk](Ort, an dem Wald in Bretter, Lohn und Sägemehl übersetzt wird.)
Der Kutscher nennt Orte, wenn Viktor fragt, doch die Namen sind örtlich und praktisch, gedacht für Männer, die wissen, welche Brücke bei Hochwasser nachgibt und welcher Hof störrische Pferde hält. Irgendwo hinter den sichtbaren Rücken, sagt er, liegt der große weiße Rücken des Hochschwab. Nach Osten, jenseits von Wald und Pass, hält die Hohe Veitsch ihr eigenes Wetter. Er sagt das nicht wie ein Führer, sondern wie ein Mann, der Nachbarn erklärt, die vielleicht guter Laune sind und vielleicht nicht. #gloss[Hochschwab](Gebirgsstock der Obersteiermark. Für Wiener eine Landschaft, für Einheimische Wetter, Wasser, Wege und Verschüttungen.)
-> carriage_room
=== carriage_ride_episode_bucket ===
<- carriage_episode_viktor_road
<- carriage_episode_coachman_places
-> DONE
=== carriage_ride_end ===
-> DONE
// ============================================================================
// ROOM: CARRIAGE
// ============================================================================
=== carriage_room ===
-> enter_room(loc_carriage, -> carriage_entry, -> carriage_look, -> carriage_exits, -> carriage_bucket) -> provide_choices
=== carriage_entry ===
Die Kutsche schaukelt nicht wie ein Salon. Sie widerspricht dem Körper bei jeder Rinne. Nach der Bahn wirkt die Straße nicht langsamer, sondern persönlicher: Sie gibt jede Unebenheit mit eigener Handschrift weiter.
-> DONE
=== carriage_look ===
+ [__Schaue__: Durch das Kutschenfenster. #key:l]
Draußen läuft das Tal neben euch her, erst offen genug für Telegraphendraht und Flussbett, dann enger, dunkler, nasser. Die Straße gehört noch zur Karte, aber immer weniger zu Wien.
-> provide_choices
-> DONE
=== carriage_exits ===
+ [__Warte__: Während das Tal enger wird. #key:z]
-> carriage_graben_entry
-> DONE
=== carriage_bucket ===
<- carriage_touch_window
<- carriage_listen_wheels
<- carriage_observe_viktor
<- carriage_observe_coachman
-> DONE
=== carriage_touch_window ===
* [__Berühre__: Das kalte Kutschenfenster.]
Das Glas ist kälter, als es im Inneren der Kutsche sein dürfte. Feuchtigkeit sammelt sich an deinem Handschuh und verschwindet sofort wieder, als hätte sie es sich anders überlegt. Draußen streifen Zweige so nah vorbei, dass sie die Scheibe beinahe mit Nägeln prüfen.
-> provide_choices
-> DONE
=== carriage_listen_wheels ===
* [__Höre__: Auf die Räder im Tal.]
Auf der offenen Straße ist das Geräusch der Räder noch Rhythmus: Holz, Eisen, Stein, Wiederholung. Es lässt sich fast zählen. Vielleicht beruhigt deshalb jede moderne Ordnung so gern: Sie gibt dem Ungewissen Takt.
-> provide_choices
-> DONE
=== carriage_observe_viktor ===
* [__Untersuche__: Viktors Reaktion. #key:x]
Viktor betrachtet nicht die Landschaft. Er betrachtet ihre Möglichkeiten: Engstellen, Böschungen, tote Winkel, die Entfernung bis zum Kutscher, die Frage, wie rasch man aus einer Kutsche steigt, wenn die Straße selbst dagegen ist.
-> provide_choices
-> DONE
=== carriage_observe_coachman ===
* [__Bemerke__: Wie der Kutscher spricht.]
Der Kutscher erklärt nichts, wenn Viktor nicht fragt. Das ist keine Stumpfheit. Es ist Ortskenntnis. Wer hier lebt, weiß, welche Dinge fremd genug sind, dass man sie zeigen muss, und welche Dinge zu nah sind, um sie zu benennen.
-> provide_choices
-> DONE
=== carriage_graben_entry ===
~ state_reach(managed_landscape_seen)
~ state_reach(city_order_receding)
Das Haupttal verengt sich.
Der Weg biegt davon in einen Seitengraben, und die Veränderung ist augenblicklich. Der Klang ändert sich. Die Räder klingen nicht mehr gegen offene Entfernung, sondern mahlen zwischen Böschungen, Wurzeln und nassem Stein. Die Luft riecht nach Lauberde, Harz und kaltem Wasser. Eiben erscheinen zwischen den Fichten in dunkler, unwahrscheinlicher Geduld, ihre Nadeln zu schwarz für den Nachmittag. #gloss[Seitengraben](Ein kleineres Tal, das von einem Haupttal abzweigt. Auf der Karte eine Linie, in der Kutsche ein Eintritt.) #gloss[Eiben](Dunkle, langsam wachsende Nadelbäume. Giftig, langlebig und daher für Menschen mit Aberglauben oder Bildung gleichermaßen verdächtig.)
"Eibenreither Graben", sagt der Kutscher und bekreuzigt sich so rasch, dass die Geste auch einem Schlagloch gegolten haben könnte.
Viktor bemerkt es. Natürlich bemerkt er es.
"Schlechter Weg?", fragt er.
"Alter Weg", sagt der Kutscher.
Eine Weile spricht niemand.
~ state_reach(valley_order_emerging)
~ state_reach(local_rules_beginning)
~ state_reach(old_boundary_felt)
-> roadside_statue_room
// ============================================================================
// ROOM: ROADSIDE STATUE
// ============================================================================
=== roadside_statue_room ===
-> enter_room(loc_roadside_statue, -> roadside_statue_entry, -> roadside_statue_look, -> roadside_statue_exits, -> roadside_statue_bucket) -> provide_choices
=== roadside_statue_entry ===
~ state_reach(religious_markers_seen)
Du beobachtest die Bäume.
Es gibt Wälder, die zu Geschichten einladen, weil sie hübsch sind, und Wälder, die Geschichten zurückweisen, weil das, was dort geschah, keine Zeugen brauchte. Dieser gehört zur zweiten Art. Seine Stämme stehen eng, nicht wild, sondern mit der Haltung einer Menge, die Platz macht für etwas, das vor langer Zeit durch sie getragen wurde.
An einem Hang oberhalb des Weges, halb vom Unterholz verschluckt, erblickst du Stein.
Ein Wegheiligtum vielleicht. Ein Grenzzeichen. Eine Figur. Die Kutsche rollt schon vorbei, bevor deine Augen sich auf ihre Form einigen können. Für einen Augenblick bleibt der Eindruck eines Frauenkopfes zurück, geneigt nicht im Gebet, sondern im Lauschen. #image[statue.png](square) #gloss[Wegheiligtum](Religiöses Zeichen an Straße oder Weg: Kreuz, Bildstock, Heiligenfigur. Es erklärt, dass der Weg nicht nur Richtung, sondern auch Aufsicht besitzt.) #gloss[Grenzzeichen](Markierung einer Grenze. Manche Grenzen trennen Besitz, andere Gewohnheit, und die älteren geben sich selten Mühe, lesbar zu bleiben.)
Der Eindruck bleibt im Nacken sitzen.
-> DONE
=== roadside_statue_look ===
+ [__Schaue__: Zu dem Hang zurück. #key:l]
Die Kutsche ist bereits weiter. Der Hang, der Stein, der mögliche Frauenkopf: alles ist wieder Wald geworden. Das macht es nicht weniger wirklich. Nur weniger zitierfähig.
-> provide_choices
-> DONE
=== roadside_statue_exits ===
+ {state_reached(faculty_committed)} [__Warte__: Bis der Graben sich öffnet. #key:z]
Der Graben öffnet sich widerwillig.
-> afternoon_approach_choice
-> DONE
=== roadside_statue_bucket ===
<- supernatural_faculty_choice
<- roadside_viktor_response
-> DONE
=== supernatural_faculty_choice ===
+ {state_before(faculty_committed)} [__Leugne__: Nichts. Nur altes Gestein und bewegte Zweige.]
~ route_inc(route_composure)
~ state_reach(no_claim_made)
~ state_reach(faculty_committed)
Du hältst dich an das, was ein Bericht tragen kann. Stein. Hang. Unterholz. Bewegung. Alles andere ist Ermüdung, Erwartung oder die Unverschämtheit eines Waldes, der zu gut komponiert ist.
-> provide_choices
+ {state_before(faculty_committed)} [__Spüre__: Eine körperliche Warnung, ehe der Gedanke folgt.]
~ route_inc(route_sapphic)
~ state_reach(sensory_anomaly_framed)
~ state_reach(faculty_committed)
Der Nacken zieht sich zusammen, bevor du einen Grund dafür hast. Nicht Furcht. Wiedererkennen wäre schlimmer. Dein Körper ist manchmal schneller als deine gebildeten Ausreden.
-> provide_choices
+ {state_before(faculty_committed)} [__Deute__: Ein Muster, das andere übersehen würden.]
~ route_inc(route_detective)
~ state_reach(intuition_framed)
~ state_reach(faculty_committed)
Du glaubst nicht an zufällige Blickführung. Der Hang, der Stein, der alte Weg, das Kreuzzeichen des Kutschers: Es ist noch kein Beweis. Aber es ist eine Anordnung.
-> provide_choices
+ {state_before(faculty_committed)} [__Nutze__: Den Eindruck, weil andere ihn von dir erwarten.]
~ route_inc(route_lover)
~ state_reach(performance_framed)
~ state_reach(faculty_committed)
Vielleicht ist dort nichts. Vielleicht ist dort etwas. Für den Moment genügt, dass alle Beteiligten glauben, du könntest mehr gesehen haben als sie. Ein Ruf ist manchmal ein Instrument, ehe er eine Lüge wird.
-> provide_choices
-> DONE
=== roadside_viktor_response ===
* {state_reached(faculty_committed)} {TURNS_SINCE(-> roadside_viktor_response_done) < 0} [__Wahre Form__: "Ein Zeichen am Weg. Ich möchte es nicht voreilig benennen."]
"Ein Zeichen am Weg. Ich möchte es nicht voreilig benennen."
~ route_inc(route_composure)
~ rel_inc(viktor_reliable)
"Vorsicht ist in fremden Gegenden selten ein Fehler."
-> roadside_viktor_response_done
* {state_reached(faculty_committed)} {TURNS_SINCE(-> roadside_viktor_response_done) < 0} [__Prüfe__: "Ein Grenz- oder Wegzeichen. Ich wüsste gern, wohin dieser Pfad führt."]
"Ein Grenz- oder Wegzeichen. Ich wüsste gern, wohin dieser Pfad führt."
~ route_inc(route_detective)
~ rel_inc(viktor_insightful)
"Sie haben einen Pfad gesehen?"
"Nicht deutlich. Genug, um später danach zu fragen."
Viktor blickt durch das kleine rückwärtige Fenster. Die Biegung hat den Hang bereits ausgelöscht. "Fragen Sie vorsichtig. Orte, die man nicht erwähnt, sind oft aufschlussreicher als jene, die man empfiehlt."
-> roadside_viktor_response_done
* {state_reached(faculty_committed)} {TURNS_SINCE(-> roadside_viktor_response_done) < 0} [__Benenne__: "Vielleicht eine Frau im Wald. Oder ein Stein, der eine sein wollte."]
"Vielleicht eine Frau im Wald. Oder ein Stein, der eine sein wollte."
~ route_inc(route_eccentric)
~ rel_inc(viktor_adversarial)
~ rel_inc(viktor_bold)
Er betrachtet die vorbeiziehenden Bäume. "Ein Wegheiligtum?"
"Wenn es ein Heiligtum ist, wurde es seit langem nicht mehr geliebt."
"Sie sprechen, als bemerkten Steine Vernachlässigung."
-> roadside_viktor_response_done
* {state_reached(faculty_committed)} {TURNS_SINCE(-> roadside_viktor_response_done) < 0} [__Entschärfe__: "Nur Bäume. Die Art, bei der man für Herren mit Revolvern dankbar wird."]
"Nur Bäume. Die Art, bei der man für Herren mit Revolvern dankbar wird."
~ route_inc(route_careless)
~ rel_inc(viktor_concern)
Sein Ausdruck verdunkelt sich um einen amtlichen Grad. "Ein Revolver ist ein schlechtes Werkzeug gegen Bäume."
"Dann werde ich mich darauf verlassen, dass Ihre Unterhaltung sie einschüchtert."
Der Kutscher tut, als höre er nichts. Seine Schultern jedoch hören alles.
-> roadside_viktor_response_done
* {state_reached(faculty_committed)} {TURNS_SINCE(-> roadside_viktor_response_done) < 0} [__Locke__: "Würden Sie mir glauben, wenn ich sagte, ich hätte etwas gesehen?"]
"Würden Sie mir glauben, wenn ich sagte, ich hätte etwas gesehen?"
~ route_inc(route_lover)
~ rel_inc(viktor_unreliable)
"Das hinge davon ab, welchen Vorteil Sie sich von der Antwort versprechen."
"Herr Nowak. Sie verletzen mich."
"Noch nicht."
Es ist das Erste, was er an diesem Tag gesagt hat, das beinahe wie ein Flirt klingt, wenn auch vielleicht nur deshalb, weil Gefahr ein Talent dafür hat, wärmere Kleider zu borgen.
-> roadside_viktor_response_done
* {state_reached(faculty_committed)} {TURNS_SINCE(-> roadside_viktor_response_done) < 0} [__Verberge__: "Nein."]
"Nein."
~ route_inc(route_sapphic)
~ rel_inc(viktor_closed)
Die Verneinung kommt zu rasch, und ihr hört es beide.
Du denkst nicht mehr an den Stein. Du denkst an die junge Frau, die irgendwo vor euch wartet: die Tochter des Grafen, der Grund, der sorgsam nicht im Memorandum steht, die Fremde, deren Haushalt dich unter einem Titel herbeigerufen hat, der zugleich lächerlich und nützlich ist.
-> roadside_viktor_response_done
* {state_reached(faculty_committed)} {TURNS_SINCE(-> roadside_viktor_response_done) < 0} [__Halte__: Die Kutsche anhalten und zurückgehen.]
"Halten Sie an", sagst du.
Der Kutscher hört zuerst die Stimme, dann die Unmöglichkeit des Befehls. Die Pferde gehen noch ein paar Längen weiter, ehe der Wagen schwer in den Schlamm sinkt und steht.
Viktor sieht zur Biegung zurück, hinter der der Hang mit dem Stein verschwunden ist.
"Wegen eines undeutlichen Wegzeichens?"
"Wegen der Frage, weshalb es undeutlich bleiben soll."
~ route_inc(route_detective)
~ rel_inc(viktor_insightful)
-> carriage_halt_room
-> DONE
=== roadside_viktor_response_done ===
-> provide_choices
// ============================================================================
// ROOM: CARRIAGE HALT AFTER STATUE
// ============================================================================
=== carriage_halt_room ===
-> enter_room(loc_carriage_halt, -> carriage_halt_entry, -> carriage_halt_look, -> carriage_halt_exits, -> carriage_halt_bucket) -> provide_choices
=== carriage_halt_entry ===
Die Kutsche hält eine Biegung weiter, dort, wo der Weg breiter wird und trotzdem nicht einladender. Der Kutscher bleibt auf dem Bock sitzen, als habe er beschlossen, für diese Entscheidung nicht verantwortlich zu sein. Hinter euch liegt die Stelle mit dem Stein. Vor euch wartet der Nachmittag, verstimmt durch eure Verzögerung.
-> DONE
=== carriage_halt_look ===
+ [__Schaue__: Zurück zur Biegung. #key:l]
Von hier aus sieht man den Hang nicht mehr. Nur die dunkle Stelle, an der der Weg die Bäume wieder freigibt. Es ist erstaunlich, wie rasch ein Ort so tun kann, als sei dort nichts gewesen.
-> provide_choices
-> DONE
=== carriage_halt_exits ===
+ [__Bitte__: Viktor soll auf die Höflichkeiten verzichten.]
"Lassen Sie die Hand und den Schlag. Hier ist niemand, der daraus eine Etikette machen müsste."
{class ? noble:
Viktor öffnet die Tür trotzdem selbst, aber sein Blick ist nicht bei der Geste. "Gnädiges Fräulein, der Umstand, dass niemand zusieht, macht den Wald nicht weniger ungeeignet für Einfälle."
- else:
Viktor lässt die Hand einen Augenblick sichtbar unangeboten. "Warum sollte ich Sie wie eine Dame behandeln, wenn Sie sich so undamenhaft benehmen, mitten auf der Straße eine Untersuchung zu beginnen?"
Es ist zu trocken gesagt, um ganz ein Vorwurf zu sein.
}
-> crossroad_statue_room
+ [__Bestehe__: Viktor soll dich wie eine Dame aussteigen lassen.]
"Herr Nowak. Wenn ich schon im Wald aussteige, dann wenigstens nicht wie ein Paket."
{class ? noble:
Er reicht dir die Hand mit tadelloser Korrektheit und schlecht verborgener Gereiztheit. "Sie wählen einen bemerkenswerten Ort, um auf Form zu bestehen."
- else:
Er reicht dir die Hand mit der Miene eines Mannes, der eine Herausforderung angenommen hat. "Warum sollte ich Sie wie eine Dame behandeln, wenn Sie sich so un-damenhaft benehmen, mitten auf der Straße anzuhalten?"
"Weil Sie soeben bewiesen haben, dass Sie es können."
}
-> crossroad_statue_room
-> DONE
=== carriage_halt_bucket ===
<- carriage_halt_coachman
-> DONE
=== carriage_halt_coachman ===
* [__Frage__: Den Kutscher, ob hier jemand anhält.]
"Hier?", sagt der Kutscher.
Er blickt nicht zurück. Das genügt als Antwort beinahe.
"Nur wenn was am Rad ist."
~ state_reach(old_name_heard)
-> provide_choices
-> DONE
// ============================================================================
// ROOM: CROSSROAD STATUE WITHOUT CARRIAGE
// ============================================================================
=== crossroad_statue_room ===
-> enter_room(loc_crossroad_statue, -> crossroad_statue_entry, -> crossroad_statue_look, -> crossroad_statue_exits, -> crossroad_statue_bucket) -> provide_choices
=== crossroad_statue_entry ===
Der Weg zurück ist kurz genug, um vernünftig zu wirken, und lang genug, um dem Entschluss Gewicht zu geben. Ohne Kutsche klingt der Graben anders. Wasser unter Stein. Ein Vogel, der aufhört. Viktors Schritte hinter dir, nicht weit genug entfernt, um zufällig zu sein.
An der Biegung zeigt sich der Hang wieder. Diesmal siehst du, dass der Stein nicht am Weg steht. Er steht dahinter, jenseits eines schmalen Durchlasses zwischen Eiben, als hätte jemand den Zugang nicht versteckt, nur nicht erklärt. #gloss[Eiben](Dunkle, langsam wachsende Nadelbäume. Giftig, langlebig und daher für Menschen mit Aberglauben oder Bildung gleichermaßen verdächtig.)
-> DONE
=== crossroad_statue_look ===
+ [__Schaue__: Den Hang hinauf. #key:l]
Das Unterholz hat die Formen zurückgenommen, aber nicht vollständig. Zwischen den Zweigen liegt ein heller Fleck Stein. Kein Kreuz. Keine klare Nische. Eher eine Schulter, ein geneigter Kopf, eine Linie, die nicht zu einem Wegheiligtum passen will.
-> provide_choices
-> DONE
=== crossroad_statue_exits ===
+ [__Gehe__: Durch die Eiben zur Lichtung. #key:n]
-> forest_clearing_room
-> DONE
=== crossroad_statue_bucket ===
<- crossroad_old_path
-> DONE
=== crossroad_old_path ===
* [__Untersuche__: Den schmalen Durchlass.]
Der Boden ist nicht oft begangen, aber auch nicht unberührt. Unter Laub und Nadeln liegt eine ältere Linie, fester als Zufall. Ein Weg, der nicht mehr Weg heißen möchte.
~ state_reach(prechristian_underlayer_suspected)
-> provide_choices
-> DONE
// ============================================================================
// ROOM: FOREST CLEARING
// ============================================================================
=== forest_clearing_room ===
-> enter_room(loc_forest_clearing, -> forest_clearing_entry, -> forest_clearing_look, -> forest_clearing_exits, -> forest_clearing_bucket) -> provide_choices
=== forest_clearing_entry ===
Die Eiben geben eine kleine Lichtung frei. Nicht groß genug für Versammlung, nicht offen genug für Zufall. In ihrer Mitte steht die überwachsene Steinfigur, halb von Moos, Brombeerranken und altem Laub gehalten.
Auf den ersten Blick könnte sie die Jungfrau Maria sein. Eine Frauengestalt, ein geneigter Kopf, etwas Mantelartiges über den Schultern. Doch der Stein kennt keine rechte Demut. Die Haltung ist nicht Fürbitte. Sie ist Wachen. Oder Lauschen. Oder etwas Älteres, dem später ein christlicher Name übergestülpt wurde. #gloss[Jungfrau Maria](Mutter Jesu und zentrale Heiligenfigur der katholischen Verehrung. Ihre Bilder können Orte heiligen, aber manchmal auch ältere Orte überdecken.)
Viktor bleibt am Rand der Lichtung stehen.
"Das ist kein gewöhnlicher Bildstock", sagt er.
-> DONE
=== forest_clearing_look ===
+ [__Schaue__: Die Lichtung an. #key:l]
Die Bäume stehen zu gleichmäßig, um ganz natürlich zu wirken, und zu alt, um einer jüngeren Absicht zu gehorchen. Der Boden ist weich, aber darunter liegt Stein. Irgendwo sammelt Wasser sich, ohne sichtbar zu werden.
-> provide_choices
-> DONE
=== forest_clearing_exits ===
+ {TURNS_SINCE(-> forest_clearing_statue_done) >= 0} [__Kehre__: Zur Kutsche zurück. #key:s]
-> return_to_carriage_with_tear
-> DONE
=== forest_clearing_bucket ===
<- forest_clearing_statue
-> DONE
=== forest_clearing_statue ===
* {TURNS_SINCE(-> forest_clearing_statue_done) < 0} [__Untersuche__: Die überwachsene Frauengestalt. #key:x]
Aus der Nähe verliert die Figur ihre bequeme Erklärung. Der Mantel ist kein Mantel. Die Hände sind nicht gefaltet, sondern liegen am Körper, als hielten sie etwas, das abgeschlagen oder nie fertig gemeißelt wurde. Unter dem Moos erkennst du Reste einer Linie, die weder Rosenkranz noch Faltenwurf ist.
"Römisch?", fragt Viktor.
"Vielleicht", sagst du. "Oder keltisch. Oder etwas, das beide schon falsch benannt hätten."
Das Wort heidnisch liegt kurz in der Luft und wird von niemandem ausgesprochen. #gloss[heidnisch](Christliche Sammelbezeichnung für vor- oder außerchristliche Kulte. Nützlich, wenn man vieles auf einmal verurteilen will, ohne es genau zu kennen.) #gloss[keltisch](Bezeichnung für vor- und frühgeschichtliche Kulturen und Sprachen in Europa. Im 19. Jahrhundert oft halb Wissenschaft, halb romantische Projektionsfläche.)
~ state_reach(prechristian_underlayer_suspected)
~ state_reach(old_site_has_claim)
-> forest_clearing_statue_done
-> DONE
=== forest_clearing_statue_done ===
-> provide_choices
=== return_to_carriage_with_tear ===
Der Rückweg ist enger, als er beim Hineingehen war. Oder du bist unvorsichtiger. Eine Brombeerranke fängt den Saum deines Reisekleids, hält ihn einen Atemzug lang fest und gibt ihn mit einem kleinen, beleidigend klaren Reißen wieder frei.
Viktor hört es.
Natürlich hört er es.
"Verletzt?"
"Nur beleidigt."
Der Riss ist klein. Sichtbar genug, um später nicht mehr ganz zu verschwinden.
-> afternoon_approach_choice
// ============================================================================
// EPISODE BUCKET: CARRIAGE JOURNEY
// ============================================================================
=== carriage_episode_viktor_road ===
* {present(viktor)} {loc(loc_carriage)} [__Frage__: Viktor nach dem Weg.]
"Was erwarten Sie dort oben?", fragst du.
"Ein Haus, das Ordnung zeigen möchte", sagt Viktor. "Das genügt fast immer, um Unordnung zu verbergen."
-> provide_choices
-> DONE
=== carriage_episode_coachman_places ===
* {loc(loc_carriage)} [__Frage__: Den Kutscher nach den Namen am Weg.]
Der Kutscher nennt die Höfe, Gräben und Stege ohne die kleinste Absicht, poetisch zu sein. Gerade deshalb wirken die Namen älter als die Karten.
~ state_reach(old_name_heard)
-> provide_choices
-> DONE
// ============================================================================
// AFTERNOON APPROACH CHOICE
// ============================================================================
=== afternoon_approach_choice ===
Der Kutscher zeigt mit der Peitsche nicht auf etwas, sondern in eine Richtung.
"Dort unten liegt Eibenreith. Wenn gnädiges Fräulein wünscht, kann ich im Dorf halten. Das Jagdhaus liegt höher, hinterm Wald. Wenn wir gleich weiterfahren, kommen wir ordentlich vor dem Abend an."
Viktor sieht dich nicht an, was bei ihm die strengere Form von Erwartung ist.
Nun zum ersten Mal gehört der Nachmittag dir.
+ [__Fahre__: Direkt nach Hohenreith.]
~ route_inc(route_composure)
~ rel_inc(viktor_reliable)
~ mark(punctual_arrival_preserved)
Du entscheidest dich für die Form. Wer eingeladen wurde, erscheint nicht verspätet, nur weil ein Dorf Fragen verspricht. Fragen laufen nicht davon. Ein erster Eindruck manchmal schon.
-> direct_to_hohenreith
+ [__Halte__: In Eibenreith, aber lass die Kutsche warten.]
~ route_inc(route_detective)
~ rel_inc(viktor_insightful)
~ mark(village_knowledge_prioritised)
Ein Haus erklärt sich selten selbst. Ein Dorf tut es ebenfalls nicht, aber es verrät manchmal, wo die Erklärungen begraben liegen.
-> depart_for_village_detour
+ [__Verfüge__: In Eibenreith aussteigen und die Kutsche voraus schicken.]
"Die Kutsche fährt voraus", sagst du. "Mit dem Gepäck. Und mit einer Nachricht, dass wir nachkommen."
~ route_inc(route_eccentric)
~ rel_inc(viktor_loss_of_control)
~ rel_inc(viktor_irritation)
~ rel_inc(viktor_concern)
~ mark(village_knowledge_prioritised)
~ mark(arrival_form_compromised)
Viktor sieht dich an, als hättest du nicht einen Weg, sondern eine Dienstvorschrift verlassen.
-> depart_for_village_on_foot
// ============================================================================
// EXIT BRANCHES INTO CHAPTER 04
// ============================================================================
=== direct_to_hohenreith ===
~ companion_join(viktor)
~ loc_move_to(loc_hohenreith_arrival)
Die Kutsche fährt am Dorf vorbei, nicht schnell genug, um ungesehen zu bleiben. Häuser, Kirche, ein Brunnen, ein paar Gesichter im Fenster: Eibenreith wird zur Randnotiz eines höflichen Entschlusses. Doch Randnotizen haben die schlechte Gewohnheit, später den Sinn eines Schreibens zu verändern.
-> direct_hohenreith_arrival
=== depart_for_village_detour ===
~ companion_join(viktor)
~ loc_move_to(loc_eibenreith_village)
Die Kutsche hält im Dorf. Sofort verändert sich das Verhältnis der Dinge: Das Jagdhaus ist nicht mehr Ziel, sondern Verspätung; Viktor nicht mehr nur Begleiter, sondern Zeuge; Eibenreith nicht mehr Kulisse, sondern erster Gesprächspartner.
-> village_detour_start
=== depart_for_village_on_foot ===
~ companion_join(viktor)
~ loc_move_to(loc_eibenreith_village)
Die Kutsche hält im Dorf. Das Jagdhaus ist nicht mehr Ziel, sondern eine Adresse, an die Gepäck und Nachricht vorausgeschickt werden können. Viktor ist nicht mehr nur Begleiter, sondern Zeuge einer Eigenmächtigkeit. Eibenreith wird nicht Kulisse, sondern Boden unter deinen Schuhen.
-> village_send_carriage_ahead
+186
View File
@@ -0,0 +1,186 @@
// ============================================================================
// EIBENREITH 04 ABEND-PAUSE / ANKUNFT HOHENREITH
// ============================================================================
// Abend-Pause / Übergang nach Hohenreith.
//
// Kapitel 03 endet mit der Ankunft am Portal. Erst pre_dinner_transition
// beendet die Nachmittags-Episode und öffnet die feste Abend-Pause:
// Ankunft in Hohenreith, Übergang zum Haushalt und abschließender Intro-#score.
// ============================================================================
// ============================================================================
// COMPATIBILITY ALIAS
// ============================================================================
=== village_arrival_options ===
-> village_detour_start
// ============================================================================
// PRE-DINNER TRANSITION
// ============================================================================
=== pre_dinner_transition ===
~ episode_end("normal")
~ time_move_to(TimeSlot.evening)
~ loc_move_to(loc_hohenreith_dining_room)
~ episode_start(EpisodeId.episode_first_dinner, TimeSlot.evening)
Das Portal schließt sich hinter dir nicht laut. Es muss nicht. Das Haus nimmt Mantel, Hut, Namen, Ruf und Verspätung entgegen und verteilt alles unsichtbar auf Diener, Treppe, Salon, Küche und künftige Tischgespräche.
Noch bevor du die Familie siehst, ist aus der Reise eine Person geworden, die man erklären kann.
-> intro_score
=== intro_score ===
~ temp score_origin = ""
~ temp score_body = ""
~ temp score_outfit = ""
~ temp score_hair = ""
~ temp score_hairstyle = ""
~ temp score_face = ""
~ temp score_religion = ""
~ temp score_belief = ""
~ temp score_approach = ""
~ temp score_route = ""
{
- class ? noble:
~ score_origin = "Glückwunsch. Du hast {given_names} {title_part} {surname} erschaffen: eine junge Dame aus niederem Adel, hofnah genug, um eingeladen zu werden, aber nicht hoch genug, um unantastbar zu sein."
- class ? middle:
~ score_origin = "Glückwunsch. Du hast {title_part} {given_names} {surname} erschaffen: eine bürgerlich geborene Frau, die gelernt hat, Bildung, Ehrgeiz und gesellschaftliche Lesbarkeit als Aufstiegsmittel zu führen."
- else:
~ score_origin = "Glückwunsch. Du hast {title_part} {given_names} {surname} erschaffen: eine Frau aus niedrigerer Herkunft, die sich so weit in die feinen Räume Wiens gearbeitet hat, dass nun jedes falsche Wort doppelt zählt."
}
{
- body ? small_slender:
~ score_body = "Sie ist klein und schmal gebaut; ein Körper, den die Welt leicht unterschätzt, gerade weil er schnell aus ihrem Blick geraten kann."
- body ? medium_soft:
~ score_body = "Sie ist mittelgroß, geformt und gegenwärtig; nicht zerbrechlich, nicht schwerfällig, sondern körperlich präsenter, als manche an einer jungen Dame bequem finden."
- body ? tall_slender:
~ score_body = "Sie ist hochgewachsen und schlank; eine Gestalt, die mehr Raum beansprucht, als ihre Rolle ihr zugestehen möchte."
- body ? compact_strong:
~ score_body = "Sie ist kompakt und kräftiger gebaut; unter Reisekleid und Korsett bleibt eine praktische Stärke sichtbar, die nicht recht zur Erwartung einer Dame passt."
- else:
~ score_body = "Ihr Körper ist noch nicht vollständig beschrieben."
}
{
- outfit ? charcoal_plum_velvet:
~ score_outfit = "Ihr Reisekostüm aus anthrazitfarbener Wolle mit pflaumenfarbenem Samt wirkt gedämpft, teuer und kontrolliert."
- outfit ? black_brown_ivory_lace:
~ score_outfit = "Ihr schwarzbraunes Wollkostüm mit elfenbeinfarbener Bluse wirkt streng, korrekt und beinahe fromm."
- outfit ? blue_grey_practical:
~ score_outfit = "Ihr graublaues Reisekostüm wirkt praktischer, beweglicher und weniger dekorativ, ohne die gesellschaftliche Form aufzugeben."
- outfit ? dark_green_black_trim:
~ score_outfit = "Ihr dunkelgrünes Kostüm mit schwarzem Besatz bleibt diskret und doch schwer zu vergessen."
- outfit ? black_veil_severe:
~ score_outfit = "Ihr schwarzes Reisekleid mit Schleier gibt ihr eine Strenge, die nicht offiziell Trauer ist, aber sehr gut mit ihrem Ruf zusammenarbeitet."
- else:
~ score_outfit = "Ihr Reisekostüm ist noch nicht vollständig beschrieben."
}
{
- hair ? dark_brown:
~ score_hair = "Sie hat dunkelbraunes Haar."
- hair ? chestnut:
~ score_hair = "Sie hat kastanienbraunes Haar mit warmem Glanz."
- hair ? dark_blond_ash:
~ score_hair = "Sie hat dunkelblondes bis aschbraunes Haar."
- hair ? auburn:
~ score_hair = "Sie hat rotbraunes Haar, das selbst unter Hut und Nadeln nicht ganz unauffällig wird."
- else:
~ score_hair = "Ihre Haarfarbe ist noch nicht vollständig beschrieben."
}
{
- style ? centre_part_low_bun:
~ score_hairstyle = "Sie trägt einen glatten Mittelscheitel und einen tiefen Knoten: streng, sauber, ohne überflüssige Bitte um Nachsicht."
- style ? soft_waves_chignon:
~ score_hairstyle = "Sie trägt weiche Stirnwellen und einen sorgfältigen Chignon: zugänglicher in der Wirkung, aber nicht weniger berechnet."
- style ? braided_low_knot:
~ score_hairstyle = "Sie trägt geflochtene Partien und einen schweren Knoten im Nacken: praktisch, geordnet und etwas erdiger als die glatte Wiener Form."
- style ? raised_front_modern:
~ score_hairstyle = "Sie trägt eine modisch gehobene Stirnpartie: gerade noch anständig, aber nicht ganz bereit, älteren Damen zu gefallen."
- else:
~ score_hairstyle = "Ihre Frisur ist noch nicht vollständig beschrieben."
}
{
- face ? cool_sharp:
~ score_face = "Ihr helles, kühles Gesicht mit bestimmten Brauen wirkt wacher und schärfer, als ihr Alter erwarten lässt."
- face ? soft_alert:
~ score_face = "Ihr Gesicht verbindet weicheren Mund und wachen Blick; sie wirkt zugänglich, aber nicht einfach."
- face ? calm_dark_eyes:
~ score_face = "Ihr wärmerer Teint und die dunkleren Augen geben ihr eine ruhige Gegenwart, weniger ätherisch als wach."
- face ? fine_controlled:
~ score_face = "Ihre feinen, blassen Züge wirken zerbrechlich, bis man die sichtbare Kontrolle darin bemerkt."
- face ? marked_jaw:
~ score_face = "Ihr markanteres Gesicht mit gerader Nase und festem Kinn verrät eher Willen als Gefälligkeit."
- else:
~ score_face = "Ihr Gesicht ist noch nicht vollständig beschrieben."
}
{
- relig ? catholic:
~ score_religion = "Ihr Glaube ist ernsthaft katholisch; sie weiß, dass Sünde, Gnade und unsichtbare Mächte keine bloßen Salonwörter sind."
- relig ? social:
~ score_religion = "Ihr Katholizismus ist Erziehung, Gewohnheit und gesellschaftliche Grammatik; vertraut genug, um zu wirken, aber nicht immer tief genug, um zu tragen."
- relig ? reform:
~ score_religion = "Sie begegnet Kirche und Frömmigkeit mit reformerischer Nüchternheit: nützlich, wenn sie ordnen; verdächtig, wenn sie Angst verwalten."
- relig ? spiritist:
~ score_religion = "Sie verbindet katholische Bilder, Totenmessen, Séancen und Ahnungen leichter, als es einem Katechismus lieb wäre."
- relig ? wounded:
~ score_religion = "Der Glaube hat sie geformt und verwundet; sie kennt Gebet und Schuld zu genau, um beides harmlos zu nennen."
- else:
~ score_religion = "Ihr Verhältnis zur Religion ist noch nicht vollständig beschrieben."
}
{
- belief ? believer:
~ score_belief = "Sie hält das Unsichtbare für möglich und manchmal für näher, als die Gebildeten zugeben möchten."
- belief ? sceptic:
~ score_belief = "Sie sucht zuerst irdische Ursachen: Nutzen, Spuren, Gewohnheiten, Lügen und Menschen, die vom Glauben anderer profitieren."
- belief ? performer:
~ score_belief = "Sie weiß, dass ihr mystischer Ruf auch Bühne, Werkzeug und Schutzkleidung ist. Ob Wahrheit oder Trick: Wirkung ist bereits Macht."
- belief ? unsure:
~ score_belief = "Sie hält ihr Urteil zurück; nicht aus Schwäche, sondern weil vorschnelle Gewissheit oft nur eine elegantere Form der Dummheit ist."
- else:
~ score_belief = "Ihr Glaube an das Übernatürliche ist noch nicht vollständig beschrieben."
}
{
- has(arrival_form_compromised):
~ score_approach = "Am Nachmittag ließ sie die Kutsche mit Gepäck und Nachricht vorausfahren und kam zu Fuß in Hohenreith an: eigenmächtig, beobachtet und schwerer zu erklären."
- has(village_knowledge_prioritised):
~ score_approach = "Am Nachmittag wählte sie den Umweg durch Eibenreith und fuhr anschließend verspätet weiter: weniger korrekt, aber reicher an Blicken, Stimmen und Ortswissen."
- else:
~ score_approach = "Am Nachmittag bewahrte sie die Form und fuhr direkt nach Hohenreith: pünktlich, kontrolliert und standesgemäß."
}
{
- axis_up(order_axis):
~ score_route = "Ihre bisher stärkste Maske ist Fassung: Form, Abstand und Selbstbeherrschung als Waffe."
- axis_up(inquiry_axis):
~ score_route = "Ihre bisher stärkste Methode ist Untersuchung: Sie ordnet, prüft und entlarvt, bevor sie sich rühren lässt."
- route_up(route_lover):
~ score_route = "Ihre bisher stärkste Methode ist Wirkung: Charme, Blick und soziale Wärme werden zu Werkzeugen."
- route_up(route_sapphic):
~ score_route = "Ihre bisher stärkste Bewegung ist Resonanz: Sie erkennt besonders dort Gefangenschaft, wo Frauen gelernt haben, sie schön zu nennen."
- route_up(route_careless):
~ score_route = "Ihre bisher stärkste Bewegung ist entwaffnende Unsicherheit: kleine Kontrollverluste, die andere näher heranlassen."
- axis_down(order_axis):
~ score_route = "Ihre bisher stärkste Bewegung ist Regelbruch: Sie benennt, was höfliche Menschen nur umstellen."
- else:
~ score_route = "Ihre Persönlichkeit ist noch nicht auf eine einzige Maske festgelegt. Sie trägt mehrere Möglichkeiten nach Hohenreith hinein."
}
#score[{score_origin} {score_body} {score_outfit} {score_hair} {score_hairstyle} {score_face} {score_religion} {score_belief} {score_approach} {score_route} Charaktererschaffung abgeschlossen. Willkommen in Hohenreith.]
-> END
File diff suppressed because it is too large Load Diff
+31
View File
@@ -0,0 +1,31 @@
// ============================================================================
// EIBENREITH BUCKET SURFACE
// ============================================================================
// Rooms and episodes install bucket entry points as divert-target variables.
// The active choice surface collects the buckets in priority order.
// Room definitions provide one first-entry bucket and one repeat-look bucket:
// first entry shows the room description, later entries offer the Look choice.
// ============================================================================
=== provide_choices ===
{
- room_seen_on_enter():
<- current_moment_bucket
<- current_room_look_bucket
- else:
<- current_room_entry_bucket
<- current_moment_bucket
}
<- current_room_exit_bucket
<- current_episode_bucket
<- current_game_bucket
-> DONE
=== empty_bucket ===
-> DONE
=== game_bucket ===
-> DONE
+137
View File
@@ -0,0 +1,137 @@
// ============================================================================
// EIBENREITH 00 CHARACTER RELATIONSHIPS
// ============================================================================
// Include after eibenreith_00_helpers.ink and before all chapter files.
//
// This file contains only relationship variable definitions and starting values.
// It deliberately contains no helper functions, no route counters, no LIST
// declarations, and no scene logic.
//
// Relationship variables use this naming convention:
//
// normalized_character_id + "_" + value_name
//
// The ten standard values follow the Scarlet-Hollow-style impression model:
//
// agreeable / adversarial
// open / closed
// bold / passive
// reliable / unreliable
// insightful / dull
//
// These are separate counters, not signed opposites. A character can experience
// Valerie as both open and closed, both reliable and unreliable, depending on
// the history of choices.
//
// Project-specific values may be added per character when needed, but should be
// clearly separated from the ten standard values.
// ============================================================================
// ============================================================================
// AMALIA
// ============================================================================
// Relationship meaning:
// These values describe how Amalia experiences Valerie.
// At story start, Amalia has not yet encountered Valerie directly, so all
// standard impressions begin at 0.
// ============================================================================
VAR amalia_agreeable = 0
VAR amalia_adversarial = 0
VAR amalia_open = 0
VAR amalia_closed = 0
VAR amalia_bold = 0
VAR amalia_passive = 0
VAR amalia_reliable = 0
VAR amalia_unreliable = 0
VAR amalia_insightful = 0
VAR amalia_dull = 0
// Project-specific Amalia values.
// These track the special emotional field between Valerie and Amalia.
VAR amalia_desire = 0
VAR amalia_shame = 0
VAR amalia_alarm = 0
VAR amalia_fascination = 0
VAR amalia_empowerment = 0
VAR amalia_containment = 0
// ============================================================================
// VIKTOR
// ============================================================================
// Relationship meaning:
// These values describe how Viktor experiences Valerie.
// Viktor begins with a slight professional reserve and a mild assumption that
// Valerie is an official responsibility rather than a fully trusted partner.
// ============================================================================
VAR viktor_location = loc_train_compartment
VAR viktor_agreeable = 0
VAR viktor_adversarial = 0
VAR viktor_open = 0
VAR viktor_closed = 1
VAR viktor_bold = 0
VAR viktor_passive = 0
VAR viktor_reliable = 0
VAR viktor_unreliable = 0
VAR viktor_insightful = 0
VAR viktor_dull = 0
// Project-specific Viktor values.
// These track his role as escort, handler, witness, and potential ally.
VAR viktor_concern = 0
VAR viktor_irritation = 0
VAR viktor_alarm = 0
VAR viktor_control = 1
VAR viktor_loss_of_control = 0
VAR viktor_professional_distance = 2
VAR viktor_personal_involvement = 0
// ============================================================================
// HOHENREITH FAMILY — RESERVED IDS
// ============================================================================
// Add these only when the characters are named and mechanically active.
// Keep reserved ids stable once introduced, because they become part of save
// data and authoring convention.
//
// Suggested ids:
// graf_...
// graefin_...
// tante_...
// amalias_brother_...
// amalias_mother_...
//
// Do not define counters for every named NPC unless the game actually branches,
// gates content, or changes tone based on their relationship to Valerie.
// ============================================================================
// ============================================================================
// HOUSEHOLD / SERVICE WORLD — RESERVED IDS
// ============================================================================
// Suggested ids:
// steward_...
// housekeeper_...
// maid_...
// valet_...
// coachman_...
// cook_...
// ============================================================================
// ============================================================================
// VILLAGE / CHURCH / OFFICIALS — RESERVED IDS
// ============================================================================
// Suggested ids:
// priest_...
// station_master_...
// teacher_...
// doctor_...
// mayor_...
// forester_...
// ============================================================================
File diff suppressed because it is too large Load Diff
+712
View File
@@ -0,0 +1,712 @@
// ============================================================================
// EIBENREITH 00 HELPERS
// ============================================================================
// Include after global LIST definitions in Eibenreith.ink and before all
// character relationship and chapter files.
//
// Contains:
// - global non-character variables
// - route counters and route helper functions
// - time-slot, meal-plan, episode, location, and traversal helpers
// - global story-state storage and LIST/state-tree helpers
// - relationship helper functions
//
// Does not contain:
// - global LIST declarations
// - chapter-specific LIST declarations
// - character relationship variables
// - chapter prose or scene knots
// ============================================================================
// ============================================================================
// GLOBAL SCHEDULE / LOCATION / EPISODE VARIABLES
// ============================================================================
// The LIST values used here are declared in Eibenreith.ink before this file is
// included.
VAR current_day = 1
VAR current_slot = mid_morning
VAR active_episode = episode_train_intro
VAR last_slot_outcome = "normal"
VAR meal_plan = meal_unset
VAR current_location = loc_train_compartment
VAR companions = ()
VAR current_room_entry_bucket = -> empty_bucket
VAR current_moment_bucket = -> empty_bucket
VAR current_room_look_bucket = -> empty_bucket
VAR current_room_exit_bucket = -> empty_bucket
VAR current_episode_bucket = -> empty_bucket
VAR current_episode_start = -> empty_bucket
VAR current_episode_end = -> empty_bucket
VAR current_game_bucket = -> game_bucket
VAR slot_early_morning_episode = no_episode
VAR slot_mid_morning_episode = episode_train_intro
VAR slot_noon_episode = episode_station_midday
VAR slot_afternoon_episode = episode_carriage_ride
VAR slot_evening_episode = episode_first_dinner
VAR slot_early_night_episode = no_episode
VAR slot_late_night_episode = no_episode
// ============================================================================
// INTRO / CHARACTER-GENERATION VARIABLES
// ============================================================================
// These values are defined during chapter 01, but they are global character
// facts and may be referenced by later chapters.
VAR tut_choice_intro = false
VAR tut_traversal_intro = false
VAR tut_character_intro = false
VAR tut_dialog_intro = false
VAR tut_optional_intro = false
VAR class = ()
VAR title_part = ""
VAR given_names = ""
VAR common_name = ""
VAR surname = ""
VAR birthplace = ""
VAR birthdate = ""
VAR zodiac = ""
VAR relig = ()
VAR belief = ()
VAR body = ()
VAR outfit = ()
VAR hair = ()
VAR style = ()
VAR face = ()
// ============================================================================
// VALERIE ROUTE VALUES
// ============================================================================
// These are counters, not mutually exclusive classes.
// They describe the strategies the player repeatedly chooses for Valerie.
VAR route_composure = 0
VAR route_detective = 0
VAR route_lover = 0
VAR route_sapphic = 0
VAR route_careless = 0
VAR route_eccentric = 0
// ============================================================================
// ROUTE HELPERS
// ============================================================================
// Ink does not support overloaded functions or optional parameters.
// Therefore:
// - route_inc(route) increases by 1
// - route_inc_by(route, amount) increases by amount
=== function route(value) ===
~ return value
=== function route_inc(ref value) ===
~ value += 1
=== function route_inc_by(ref value, amount) ===
~ value += amount
=== function route_dec(ref value) ===
~ value -= 1
=== function route_dec_by(ref value, amount) ===
~ value -= amount
=== function route_move_to(ref value, amount) ===
~ value = amount
=== function route_clear(ref value) ===
~ value = 0
=== function route_is(value, amount) ===
~ return value == amount
=== function route_before(value, amount) ===
~ return value <= amount
=== function route_reached(value, amount) ===
~ return value >= amount
=== function route_between(value, min, max) ===
~ return value >= min && value <= max
=== function route_min(a, b) ===
{
- a <= b:
~ return a
- else:
~ return b
}
=== function route_max(a, b) ===
{
- a >= b:
~ return a
- else:
~ return b
}
=== function route_diff(positive, negative) ===
~ return positive - negative
=== function route_diff_reached(positive, negative, threshold) ===
~ return positive - negative >= threshold
=== function route_diff_before(positive, negative, threshold) ===
~ return positive - negative <= threshold
=== function route_diff_between(positive, negative, min, max) ===
~ temp d = positive - negative
~ return d >= min && d <= max
=== function route_total() ===
~ return route_composure + route_detective + route_lover + route_sapphic + route_careless + route_eccentric
=== function route_share_reached(value, numerator, denominator) ===
~ temp total = route_total()
~ return total > 0 && value * denominator >= total * numerator
=== function route_share_before(value, numerator, denominator) ===
~ temp total = route_total()
~ return total > 0 && value * denominator < total * numerator
=== function route_high(value) ===
~ return route_share_reached(value, 9, 10)
=== function route_up(value) ===
~ return route_share_reached(value, 7, 10)
=== function route_down(value) ===
~ return route_share_before(value, 3, 10)
=== function route_low(value) ===
~ return route_share_before(value, 1, 10)
=== function matrix_total(positive, negative) ===
~ return positive + negative
=== function matrix_share_reached(positive, negative, numerator, denominator) ===
~ temp total = matrix_total(positive, negative)
~ return total > 0 && positive * denominator >= total * numerator
=== function matrix_high(positive, negative) ===
~ return matrix_share_reached(positive, negative, 9, 10)
=== function matrix_up(positive, negative) ===
~ return matrix_share_reached(positive, negative, 7, 10)
=== function matrix_down(positive, negative) ===
~ return matrix_share_reached(negative, positive, 7, 10)
=== function matrix_low(positive, negative) ===
~ return matrix_share_reached(negative, positive, 9, 10)
=== function axis_positive(axis) ===
{
- axis == order_axis:
~ return route_composure
- axis == inquiry_axis:
~ return route_detective
- axis == allure_axis:
~ return route_lover + route_sapphic
- else:
~ return 0
}
=== function axis_negative(axis) ===
{
- axis == order_axis:
~ return route_eccentric
- axis == inquiry_axis:
~ return route_careless
- axis == allure_axis:
~ return route_composure
- else:
~ return 0
}
=== function axis_high(axis) ===
~ return matrix_high(axis_positive(axis), axis_negative(axis))
=== function axis_up(axis) ===
~ return matrix_up(axis_positive(axis), axis_negative(axis))
=== function axis_down(axis) ===
~ return matrix_down(axis_positive(axis), axis_negative(axis))
=== function axis_low(axis) ===
~ return matrix_low(axis_positive(axis), axis_negative(axis))
// ============================================================================
// TIME-SLOT HELPERS
// ============================================================================
// TimeSlot is an ordered LIST declared in Eibenreith.ink.
// Use these helpers for the daily schedule structure.
=== function day(value) ===
~ return current_day == value
=== function day_move_to(value) ===
~ current_day = value
=== function day_inc() ===
~ current_day += 1
=== function time(slot) ===
~ return current_slot == slot
=== function time_move_to(slot) ===
~ current_slot = slot
=== function time_is(slot) ===
~ return current_slot == slot
=== function time_before(slot) ===
~ return current_slot < slot
=== function time_reached(slot) ===
~ return current_slot >= slot
=== function time_between(first, last) ===
~ return current_slot >= first && current_slot <= last
// ============================================================================
// TIMETABLE / EPISODE DISPATCH
// ============================================================================
// Content files define episode entry knots and buckets. Timetable control lives
// here so authored episode files do not choose themselves.
=== start_game ===
-> run_slot(mid_morning)
=== run_slot(slot) ===
{
- slot == mid_morning:
-> run_episode(slot_mid_morning_episode)
- slot == noon:
-> run_episode(slot_noon_episode)
- slot == afternoon:
-> run_episode(slot_afternoon_episode)
- slot == evening:
-> run_episode(slot_evening_episode)
- else:
-> END
}
=== function slot_episode(slot, episode_to_run) ===
{
- slot == early_morning:
~ return slot_early_morning_episode == episode_to_run
- slot == mid_morning:
~ return slot_mid_morning_episode == episode_to_run
- slot == noon:
~ return slot_noon_episode == episode_to_run
- slot == afternoon:
~ return slot_afternoon_episode == episode_to_run
- slot == evening:
~ return slot_evening_episode == episode_to_run
- slot == early_night:
~ return slot_early_night_episode == episode_to_run
- slot == late_night:
~ return slot_late_night_episode == episode_to_run
- else:
~ return false
}
=== function slot_schedule(slot, episode_to_run) ===
{
- slot == early_morning:
~ slot_early_morning_episode = episode_to_run
- slot == mid_morning:
~ slot_mid_morning_episode = episode_to_run
- slot == noon:
~ slot_noon_episode = episode_to_run
- slot == afternoon:
~ slot_afternoon_episode = episode_to_run
- slot == evening:
~ slot_evening_episode = episode_to_run
- slot == early_night:
~ slot_early_night_episode = episode_to_run
- slot == late_night:
~ slot_late_night_episode = episode_to_run
}
=== run_episode(episode_to_run) ===
{
- episode_to_run == episode_train_intro:
-> enter_episode(episode_train_intro, mid_morning, -> train_intro_start, -> train_intro_end, -> train_intro_episode_bucket) -> train_intro_start
- episode_to_run == episode_station_midday:
-> enter_episode(episode_station_midday, noon, -> station_midday, -> station_midday_end, -> station_midday_episode_bucket) -> station_midday
- episode_to_run == episode_carriage_ride:
-> enter_episode(episode_carriage_ride, afternoon, -> carriage_ride, -> carriage_ride_end, -> carriage_ride_episode_bucket) -> carriage_ride
- episode_to_run == episode_first_dinner:
-> pre_dinner_transition
- else:
-> END
}
=== advance_to_slot(slot) ===
~ current_slot = slot
-> run_slot(slot)
// ============================================================================
// EPISODE HELPERS
// ============================================================================
// EpisodeId is a LIST declared in Eibenreith.ink.
// active_episode is the coarse structural episode currently being played.
=== function episode(value) ===
~ return active_episode == value
=== function episode_start(value, slot) ===
~ active_episode = value
~ current_slot = slot
~ last_slot_outcome = "normal"
=== function episode_move_to(value) ===
~ active_episode = value
=== function episode_end(outcome) ===
~ active_episode = no_episode
~ current_episode_bucket = -> empty_bucket
~ current_episode_start = -> empty_bucket
~ current_episode_end = -> empty_bucket
~ last_slot_outcome = outcome
=== function episode_active(value) ===
~ return active_episode == value
=== function outcome_is(value) ===
~ return last_slot_outcome == value
=== function outcome_move_to(value) ===
~ last_slot_outcome = value
// ============================================================================
// MEAL-PLAN HELPERS
// ============================================================================
// MealPlan is a LIST declared in Eibenreith.ink.
// The arrival day uses this to remember how lunch is handled.
=== function meal(value) ===
~ return meal_plan == value
=== function meal_choose(value) ===
~ meal_plan = value
=== function meal_is(value) ===
~ return meal_plan == value
=== function meal_clear() ===
~ meal_plan = meal_unset
// ============================================================================
// LOCATION HELPERS
// ============================================================================
// Location is a LIST declared in Eibenreith.ink.
// current_location is intentionally coarse and exists so episode/game buckets
// can react to where Valerie currently is.
=== function loc(value) ===
~ return current_location == value
=== function loc_move_to(value) ===
~ current_location = value
~ move_companions_to(value)
=== function loc_is(value) ===
~ return current_location == value
=== function accompanied_by(character) ===
~ return companions ? character
=== function companion_join(character) ===
~ companions += character
=== function companion_leave(character) ===
~ companions -= character
=== function present(character) ===
{
- character == viktor:
~ return viktor_location == current_location
- else:
~ return false
}
=== function character_move_to(character, location) ===
{
- character == viktor:
~ viktor_location = location
}
=== function move_companions_to(location) ===
{
- accompanied_by(viktor):
~ viktor_location = location
}
=== enter_episode(value, slot, start_bucket, end_bucket, episode_bucket) ===
~ episode_start(value, slot)
~ current_episode_start = start_bucket
~ current_episode_end = end_bucket
~ current_episode_bucket = episode_bucket
->->
=== enter_room(location, entry_bucket, look_bucket, exit_bucket, moment_bucket) ===
~ loc_move_to(location)
~ current_room_entry_bucket = entry_bucket
~ current_moment_bucket = moment_bucket
~ current_room_look_bucket = look_bucket
~ current_room_exit_bucket = exit_bucket
->->
=== function room_seen_on_enter() ===
~ return TURNS_SINCE(current_room_entry_bucket) >= 0
// ============================================================================
// GLOBAL STORY-STATE STORAGE
// ============================================================================
// Chapter-specific state machines are declared as LISTs in the main file,
// directly above the chapter index they belong to.
//
// story_state stores all reached states from all LIST-based state machines.
// State functions below implement high-watermark logic:
// reaching a later state automatically reaches all earlier states in the same
// LIST chain.
VAR story_state = ()
// ============================================================================
// STATE HELPERS
// ============================================================================
// Remove and return the lowest item from a list.
// Internal helper for state_reach().
=== function state_pop(ref list) ===
~ temp x = LIST_MIN(list)
~ list -= x
~ return x
// Return true if the given forward state has been reached.
// Use only with one-way encounter/progress LISTs advanced through state_reach().
// For independent checklist facts, use has() / lacks() / mark().
// Example:
// {state_reached(CourtMission.hidden_instruction_revealed): ...}
=== function state_reached(state) ===
~ return LIST_COUNT(story_state ^ state) > 0
// Return true if the given forward state has not yet been reached.
// Use only with one-way encounter/progress LISTs advanced through state_reach().
// Example:
// {state_before(CourtMission.hidden_instruction_revealed): ...}
=== function state_before(state) ===
~ return not state_reached(state)
// Return true if lower_state has been reached but upper_state has not.
// Lower bound inclusive, upper bound exclusive.
// Example:
// {state_between(CourtMission.official_cover_understood, CourtMission.hidden_instruction_revealed): ...}
=== function state_between(lower_state, upper_state) ===
~ return state_reached(lower_state) && not state_reached(upper_state)
// Return true if state is the highest reached state in its LIST chain.
// This is the practical equivalent of current-state testing for a high-watermark chain.
=== function state_is(state) ===
~ temp chain = LIST_ALL(state)
~ temp reached_in_chain = story_state ^ chain
{
- reached_in_chain:
~ return LIST_MAX(reached_in_chain) == state
- else:
~ return false
}
// Return the highest reached state in the same LIST chain as state.
// Useful mainly for debugging or diagnostic text.
=== function state_current(state) ===
~ temp chain = LIST_ALL(state)
~ temp reached_in_chain = story_state ^ chain
{
- reached_in_chain:
~ return LIST_MAX(reached_in_chain)
- else:
~ return ()
}
// Mark a state, or a list of states, as reached.
// High-watermark behavior:
// reaching a state automatically reaches all earlier states in the same LIST chain.
//
// Examples:
// ~ state_reach(CourtMission.hidden_instruction_revealed)
// ~ state_reach((CourtMission.official_cover_understood, ViktorRelationFrame.handler_role_understood))
=== function state_reach(states_to_set) ===
~ temp x = state_pop(states_to_set)
{
- not x:
~ return false
- not state_reached(x):
~ temp chain = LIST_ALL(x)
~ temp states_gained = LIST_RANGE(chain, LIST_MIN(chain), x)
~ story_state += states_gained
~ state_reach(states_to_set)
~ return true
- else:
~ return false || state_reach(states_to_set)
}
// Return true if every given independent fact has been marked.
// Facts are exact checklist items, not forward-moving encounter states.
// Example:
// {has(class_def)}
// {has((class_def, name_def))}
=== function has(facts) ===
~ return story_state ? facts
// Return true if at least one given independent fact is still missing.
// Example:
// {lacks(relig_def)}
// {lacks((body_def, face_def))}
=== function lacks(facts) ===
~ return not has(facts)
// Mark an independent fact, or a list of independent facts.
// Unlike state_reach(), this does not imply earlier items in the same LIST.
// Example:
// ~ mark(class_def)
// ~ mark((class_def, name_def))
=== function mark(facts_to_set) ===
~ story_state += facts_to_set
~ return true
// Alias for readability when scene code wants to say move_to.
// Same high-watermark behavior as state_reach().
=== function state_move_to(state) ===
~ state_reach(state)
// Remove all reached states in the same LIST chain as state.
// Use rarely: debug, dream logic, simulation reset, or deliberate memory loss.
=== function state_clear(state) ===
~ story_state -= LIST_ALL(state)
// Clear all reached states from all state machines.
// Use only for debug or full reinitialization.
=== function state_clear_all() ===
~ story_state = ()
// ============================================================================
// RELATIONSHIP HELPERS
// ============================================================================
// Relationship variables are defined in eibenreith_00_character_relationships.ink.
// These helpers operate on those variables by reference.
//
// Ink does not support overloaded functions or optional parameters.
// Therefore:
// - rel_inc(rel) increases by 1
// - rel_inc_by(rel, amount) increases by amount
=== function rel(value) ===
~ return value
=== function rel_inc(ref value) ===
~ value += 1
=== function rel_inc_by(ref value, amount) ===
~ value += amount
=== function rel_dec(ref value) ===
~ value -= 1
=== function rel_dec_by(ref value, amount) ===
~ value -= amount
=== function rel_move_to(ref value, amount) ===
~ value = amount
=== function rel_clear(ref value) ===
~ value = 0
=== function rel_is(value, amount) ===
~ return value == amount
=== function rel_before(value, amount) ===
~ return value <= amount
=== function rel_reached(value, amount) ===
~ return value >= amount
=== function rel_between(value, min, max) ===
~ return value >= min && value <= max
=== function rel_min(a, b) ===
{
- a <= b:
~ return a
- else:
~ return b
}
=== function rel_max(a, b) ===
{
- a >= b:
~ return a
- else:
~ return b
}
=== function rel_diff(positive, negative) ===
~ return positive - negative
=== function rel_diff_reached(positive, negative, threshold) ===
~ return positive - negative >= threshold
=== function rel_diff_before(positive, negative, threshold) ===
~ return positive - negative <= threshold
=== function rel_diff_between(positive, negative, min, max) ===
~ temp d = positive - negative
~ return d >= min && d <= max
=== function rel_share_reached(value, total, numerator, denominator) ===
~ return total > 0 && value * denominator >= total * numerator
=== function rel_high(positive, negative) ===
~ return matrix_high(positive, negative)
=== function rel_up(positive, negative) ===
~ return matrix_up(positive, negative)
=== function rel_down(positive, negative) ===
~ return matrix_down(positive, negative)
=== function rel_low(positive, negative) ===
~ return matrix_low(positive, negative)
+83
View File
@@ -0,0 +1,83 @@
// ============================================================================
// EIBENREITH.INK - MAIN INDEX / GLOBAL REFERENCE
// ============================================================================
// Root file compiled by Ink. Keep this file to reference vocabularies, include
// order, and the entry divert. Authoring guidance belongs in the design docs;
// episode flow belongs in helpers.ink.
// ============================================================================
// GLOBAL STRUCTURAL LISTS
// ============================================================================
LIST TimeSlot = early_morning, mid_morning, noon, afternoon, evening, early_night, late_night
LIST EpisodeId = no_episode, episode_train_intro, episode_station_midday, episode_carriage_ride, episode_first_dinner
LIST MealPlan = meal_unset, dining_car, station_restaurant, light_refreshment, skipped
LIST Location = loc_train_compartment, loc_train_home_corridor, loc_train_clergy_corridor, loc_train_washroom_corridor, loc_train_washroom, loc_train_dining_car, loc_train_rear_lookout, loc_train_second_class_door, loc_station_platform, loc_station_restaurant, loc_carriage, loc_carriage_halt, loc_crossroad_statue, loc_forest_clearing, loc_roadside_statue, loc_eibenreith_village, loc_hohenreith_arrival, loc_hohenreith_dining_room
LIST Character = viktor
LIST Class = noble, middle, working
LIST Relig = catholic, social, reform, spiritist, wounded
LIST Belief = believer, sceptic, performer, unsure
LIST Body = small_slender, medium_soft, tall_slender, compact_strong
LIST Outfit = charcoal_plum_velvet, black_brown_ivory_lace, blue_grey_practical, dark_green_black_trim, black_veil_severe
LIST Hair = dark_brown, chestnut, dark_blond_ash, auburn
LIST Style = centre_part_low_bun, soft_waves_chignon, braided_low_knot, raised_front_modern
LIST Face = cool_sharp, soft_alert, calm_dark_eyes, fine_controlled, marked_jaw
LIST Def = class_def, name_def, relig_def, body_def, face_def, belief_def, route_language_def, dining_car_known_def, intro_def
LIST RouteAxis = order_axis, inquiry_axis, allure_axis
// ============================================================================
// SYSTEM INCLUDES
// ============================================================================
INCLUDE helpers.ink
INCLUDE buckets.ink
INCLUDE characters.ink
// ============================================================================
// CHAPTER 01 STATE LISTS
// ============================================================================
LIST CourtMission = court_mission_unknown, sealed_letter_known, official_cover_understood, household_affair_named, supernatural_pretext_named, hidden_instruction_revealed, mission_contradictions_suspected
LIST ViktorRelationFrame = viktor_frame_unknown, escort_present, secretary_cover_understood, handler_role_understood, skepticism_registered, methods_negotiated, mutual_risk_recognized
LIST ValerieWorkingMask = valerie_mask_unformed, courtly_woman_presented, name_claimed, medium_reputation_invoked, method_as_mask_understood, social_strategy_established
INCLUDE 01_zug.ink
// ============================================================================
// CHAPTER 02 STATE LISTS
// ============================================================================
LIST PublicPersona = public_unseen, noticed_as_lady, noticed_as_official_arrival, station_audience_tested, public_mask_established, public_mask_strained
LIST ServiceWorld = service_unseen, staff_as_function_noticed, staff_as_witnesses_noticed, staff_as_network_suspected, staff_as_power_source_understood
LIST ArrivalLogistics = arrival_logistics_unknown, meal_plan_chosen, meal_taken_in_train, meal_taken_at_station, meal_skipped_or_light, carriage_arranged, baggage_handed_over, road_departure_ready
INCLUDE 02_bahnhof.ink
// ============================================================================
// CHAPTER 03 STATE LISTS
// ============================================================================
LIST OldSiteKnowledge = old_site_unknown, managed_landscape_seen, religious_markers_seen, old_boundary_felt, old_name_heard, prechristian_underlayer_suspected, old_site_has_claim
LIST ThresholdCrossing = ordinary_travel, city_order_receding, valley_order_emerging, local_rules_beginning, return_feels_less_simple
LIST SupernaturalFaculty = faculty_unframed, no_claim_made, intuition_framed, sensory_anomaly_framed, performance_framed, faculty_committed
LIST AfternoonOutcome = punctual_arrival_preserved, village_knowledge_prioritised, arrival_form_compromised
INCLUDE 03_kutschenfahrt.ink
INCLUDE 03_anreise_routes.ink
// ============================================================================
// CHAPTER 04 STATE LISTS
// ============================================================================
LIST EibenreithPublicFace = eibenreith_face_unknown, curious, cautious, suspicious, unsettled, openly_watching_valerie
LIST VillageReligiousTension = village_religion_unknown, church_as_center_seen, christian_surface_noted, older_presence_hint, two_orders_in_conflict, village_fear_has_form
LIST HohenreithArrivalFrame = hohenreith_arrival_unknown, expected_guest, punctual_official_guest, delayed_after_village_detour, household_form_preserved, household_form_disturbed, amalia_seen_before_dinner
INCLUDE 04_ankunft.ink
// ============================================================================
// CHAPTER 05 STATE LISTS
// ============================================================================
LIST FirstDinner = dinner_not_started, household_assembled, seating_order_read, amalia_seen_as_spoken_for, valerie_tested_at_table, dinner_completed
// INCLUDE 05_dinner.ink
// ============================================================================
// ENTRY POINT
// ============================================================================
-> start_game
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

+2 -2
View File
@@ -947,7 +947,7 @@ Viktors Höflichkeit ist glatt genug, um keine Fingerabdrücke zu behalten. Daru
** [__Summe__: Eine Antwort, die keine Worte braucht.] #action:conversation #optional
#route:eccentric
~ eccentric += 1
Du summst so leise, dass es mehr Haltung als Ton ist. Der Rhythmus der Räder nimmt die Melodie auf und gibt sie höflicher zurück, als sie gekommen ist. #tts[Hum this line very softly, almost under the breath. Keep it restrained, intimate, and wordless, with a faint ironic composure.]
Du summst so leise, dass es mehr Haltung als Ton ist. Der Rhythmus der Räder nimmt die Melodie auf und gibt sie höflicher zurück, als sie gekommen ist. #tts[Hum the Kaiserhymne 'Gott erhalte Franz den Kaiser, Unsern guten Kaiser Franz!' very softly, almost under the breath. Keep it restrained, intimate, and wordless, with a faint ironic composure.]
Viktor sieht nicht auf.
@@ -956,7 +956,7 @@ Viktors Höflichkeit ist glatt genug, um keine Fingerabdrücke zu behalten. Daru
** [__Singe__: Die Kaiserhymne, beinahe ohne Stimme.] #action:conversation #optional
#route:eccentric
~ eccentric += 1
Du singst kaum lauter als das Rauschen im Polster: „Gott beschütze Franz den Kaiser ...“ Nicht fromm genug für ein Gebet, nicht spöttisch genug für Hochverrat. #tts[Sing the quoted hymn fragment almost silently, like a controlled private murmur. Use a formal, old Austrian ceremonial feel, but keep the delivery restrained and ambiguous.]
Du singst kaum lauter als das Rauschen im Polster: „Gott erhalte Franz den Kaiser, Unsern guten Kaiser Franz!“ Nicht fromm genug für ein Gebet, nicht spöttisch genug für Hochverrat. #tts[Sing the Kaiserhymne almost silently, like a controlled private murmur. Use a formal, old Austrian ceremonial feel, but keep the delivery restrained and ambiguous.]
Ein Muskel an Viktors Kiefer bewegt sich.