Compare commits
83
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e741ce3be2 | ||
|
|
3b77bc122f | ||
|
|
b4208e2ddf | ||
|
|
eec70cf368 | ||
|
|
078d8c255c | ||
|
|
0090e8d555 | ||
|
|
600c627660 | ||
|
|
0a30acd614 | ||
|
|
1f2076cf9c | ||
|
|
b9dad16d88 | ||
|
|
c11f85edfc | ||
|
|
d630bd837e | ||
|
|
938c2f1f01 | ||
|
|
3fa082ae05 | ||
|
|
2c1b086124 | ||
|
|
7f7dab0e63 | ||
|
|
2f75d3735e | ||
|
|
90eb6fcc3d | ||
|
|
495495bf86 | ||
|
|
8f260c17ea | ||
|
|
f6c1e00e91 | ||
|
|
70a3b9ada4 | ||
|
|
0ba8a0ff24 | ||
|
|
fa19134652 | ||
|
|
83c8f20c1f | ||
|
|
371a615c9e | ||
|
|
a5eaa40f44 | ||
|
|
9464e8cae0 | ||
|
|
4091a5cded | ||
|
|
8d9fb81b62 | ||
|
|
041233e40f | ||
|
|
f52af937b9 | ||
|
|
9c3669b12c | ||
|
|
d86bae4f64 | ||
|
|
9a4cb9bee6 | ||
|
|
f926ba4023 | ||
|
|
914b8e4bd7 | ||
|
|
af462e3a45 | ||
|
|
d58f42f40f | ||
|
|
120cbe56a6 | ||
|
|
401a13fdbd | ||
|
|
45f70318ba | ||
|
|
f04450c7ec | ||
|
|
1fab34b9b7 | ||
|
|
986e519545 | ||
|
|
ee9086dd16 | ||
|
|
60a34536fb | ||
|
|
4bb1180a26 | ||
|
|
df33002d30 | ||
|
|
efed783e25 | ||
|
|
54f115204f | ||
|
|
ca45f38262 | ||
|
|
ffe0c7d689 | ||
|
|
0f8c45963c | ||
|
|
e60a6b7089 | ||
|
|
3eae906b34 | ||
|
|
ea7852256f | ||
|
|
ba3de2b63b | ||
|
|
c91bf1de24 | ||
|
|
c9687af788 | ||
|
|
1be6605f8a | ||
|
|
b26ec4191a | ||
|
|
51c6867c5b | ||
|
|
e4228a01a6 | ||
|
|
4284784bf3 | ||
|
|
26225725b3 | ||
|
|
1178359927 | ||
|
|
5f2eaf326a | ||
|
|
d8bc26a75b | ||
|
|
01ba580d34 | ||
|
|
cfa5985f44 | ||
|
|
a6abe939e8 | ||
|
|
ad18d79c18 | ||
|
|
ac15ba2130 | ||
|
|
e9888acf7e | ||
|
|
6a85879f66 | ||
|
|
b84985a970 | ||
|
|
aa4b725813 | ||
|
|
a9283e32a2 | ||
|
|
310ea81d42 | ||
|
|
c4c41c00ef | ||
|
|
8afe00ebe7 | ||
|
|
c9c80f3c52 |
@@ -1,2 +1,4 @@
|
||||
66_plasmaTr
|
||||
91_sonnensystem
|
||||
00_aMeta/toolz/CYOA/export
|
||||
00_aMeta/toolz/CYOA/cyoa-engine
|
||||
|
||||
@@ -1,44 +1,3 @@
|
||||
-- 0. Leader-Taste definieren (WICHTIG für deine Keymaps)
|
||||
-- Muss zwingend vor Lazy geladen werden!
|
||||
vim.g.mapleader = " "
|
||||
vim.g.maplocalleader = " "
|
||||
|
||||
-- 1. lazy.nvim vollautomatisch herunterladen (falls nicht vorhanden)
|
||||
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
|
||||
if not vim.loop.fs_stat(lazypath) then
|
||||
vim.fn.system({
|
||||
"git",
|
||||
"clone",
|
||||
"--filter=blob:none",
|
||||
"https://github.com/folke/lazy.nvim.git",
|
||||
"--branch=stable", -- Lade nur die stabile Version
|
||||
lazypath,
|
||||
})
|
||||
end
|
||||
vim.opt.rtp:prepend(lazypath)
|
||||
|
||||
-- 2. Plugins deklarieren und laden
|
||||
require("lazy").setup({
|
||||
-- AsciiDoc Unterstützung (Syntax, Faltung)
|
||||
{ "habamax/vim-asciidoctor" },
|
||||
|
||||
-- Telescope (Deine Suchmaschine für die Lore)
|
||||
{
|
||||
"nvim-telescope/telescope.nvim",
|
||||
tag = "0.1.5",
|
||||
dependencies = { "nvim-lua/plenary.nvim" }
|
||||
},
|
||||
|
||||
-- Fugitive (Git Integration)
|
||||
{
|
||||
"tpope/vim-fugitive",
|
||||
cmd = { "Git", "G", "Gdiffsplit", "Gread", "Gwrite", "GBrowse" },
|
||||
keys = {
|
||||
{ "<leader>gs", "<cmd>Git<cr>", desc = "Git Status" },
|
||||
},
|
||||
}, -- HIER FEHLTE DIE KLAMMER
|
||||
})
|
||||
|
||||
-- 3. Eigene Kommandos und Keymaps
|
||||
-- Erstellt ein Neovim-Kommando :BuildLore
|
||||
vim.api.nvim_create_user_command('BuildLore', function()
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
= Meta: System der aufsteigenden Dateien =
|
||||
:toc:
|
||||
:icons: font
|
||||
|
||||
== Das ist mein Reich, hier bin ich Gott
|
||||
|
||||
Nur wenige werden diesen Teil zu lesen bekommen also seit geehrt.
|
||||
Werde beginnen die Branches zu pflegen und die Stuktur aufbauen.
|
||||
|
||||
[cols="4*", options="header"]
|
||||
.Sichtbarkeit der Texte
|
||||
|===
|
||||
|**`sonnensystem`** |`feature/*`, `dev` |Du (Autor) |Neovim-Configs, `build.sh`, Rohnotizen, Canvas-Prototypen, Scratchpads.
|
||||
|**`galaxie`**
|
||||
|`alpha`, `testing`
|
||||
|Gast-Schreiber, Beta-Leser
|
||||
|Lore-Bibel, Styleguides, No-Go-Wortlisten, Validation-Hooks.
|
||||
|**`galaxienhaufen`**
|
||||
|`staging`, `release`
|
||||
|Lektorat, Setzer
|
||||
|Typografie-Themes, EPUB/PDF-Generatoren, Kapitel-Includes, Layout-Assets.
|
||||
|**`universum`**
|
||||
|`main` / `v1.0`
|
||||
|Öffentlichkeit, Leser
|
||||
|Kanonischer Text, Open-Source-Lizenz, Enzyklopädie/Glossar.
|
||||
|===
|
||||
|
||||
=== to be done
|
||||
|
||||
* [] Diese Datei zu jedem Branch hierher ziehen
|
||||
* [] Reposetory zu internen Gitlab Server Spiegel
|
||||
* [] Auto Build Testen
|
||||
* [] Galaxie Build Druckfahne
|
||||
@@ -0,0 +1,28 @@
|
||||
= Meta: System der aufsteigenden Dateien =
|
||||
:toc:
|
||||
:icons: font
|
||||
|
||||
== Willkomen auserwählter Leser/Schreiber
|
||||
|
||||
Hier sollten die Dinge eigendlich schon reibungslos funktionieren.
|
||||
Aber soweit unten kann es schon mal vorkommen das etwas in stocken gerät, lass dich davon nicht entmutigen.
|
||||
Frage den der dir diese Dokumente gegeben hat nach hilfe oder wo weitere zu finden ist.
|
||||
|
||||
|
||||
|
||||
[cols="4*", options="header"]
|
||||
.Sichtbarkeit der Texte
|
||||
|===
|
||||
|**`galaxie`**
|
||||
|`alpha`, `testing`
|
||||
|Gast-Schreiber, Beta-Leser
|
||||
|Lore-Bibel, Styleguides, No-Go-Wortlisten, Validation-Hooks.
|
||||
|**`galaxienhaufen`**
|
||||
|`staging`, `release`
|
||||
|Lektorat, Setzer
|
||||
|Typografie-Themes, EPUB/PDF-Generatoren, Kapitel-Includes, Layout-Assets.
|
||||
|**`universum`**
|
||||
|`main` / `v1.0`
|
||||
|Öffentlichkeit, Leser
|
||||
|Kanonischer Text, Open-Source-Lizenz, Enzyklopädie/Glossar.
|
||||
|===
|
||||
@@ -0,0 +1,22 @@
|
||||
= Meta: System der aufsteigenden Dateien =
|
||||
:toc:
|
||||
:icons: font
|
||||
|
||||
== Willkomen lieber Leser
|
||||
|
||||
die letzte Stufe vor der Öffentlichkeit, tools und Dateien werden sich dann
|
||||
dort finden wo sie erwartet werden. Druckstufe noch nicht ganz klar,
|
||||
warte auf den ersten Text der gesetzt werden kann.
|
||||
|
||||
|
||||
[cols="4*", options="header"]
|
||||
.Sichtbarkeit der Texte
|
||||
|**`galaxienhaufen`**
|
||||
|`staging`, `release`
|
||||
|Lektorat, Setzer
|
||||
|Typografie-Themes, EPUB/PDF-Generatoren, Kapitel-Includes, Layout-Assets.
|
||||
|**`universum`**
|
||||
|`main` / `v1.0`
|
||||
|Öffentlichkeit, Leser
|
||||
|Kanonischer Text, Open-Source-Lizenz, Enzyklopädie/Glossar.
|
||||
|===
|
||||
@@ -0,0 +1,228 @@
|
||||
% =============================================================================
|
||||
% PRODUKTIONSBEREITE LA TEX-VORLAGE FÜR TASCHENBÜCHER (FORMAT A5)
|
||||
% Erstellt für KOMA-Script (scrbook) - Optimiert für Print-on-Demand & Druck
|
||||
% =============================================================================
|
||||
|
||||
\documentclass[
|
||||
paper=a5, % Klassisches Taschenbuch-Format (148mm x 210mm)
|
||||
fontsize=10pt, % Optimal lesbare Schriftgröße für A5-Prosa
|
||||
BCOR=8mm, % Bindekorrektur: Gleicht den Papierverlust im Buchrücken aus
|
||||
DIV=12, % Satzspiegelberechnung (Verhältnis von Text zu Rand)
|
||||
twoside=true, % Doppelseitiges Layout (Unterscheidung linke/rechte Seite)
|
||||
open=right, % Neue Kapitel beginnen IMMER auf einer rechten Buchseite
|
||||
headsepline=0.4pt, % Feine Dezent-Linie unter dem Kopfzeilen-Text
|
||||
cleardoublepage=empty % Automatische Vakanz-Seiten (Leerseiten) ohne Kopf/Fußzeile
|
||||
]{scrbook}
|
||||
|
||||
% -----------------------------------------------------------------------------
|
||||
% 1. SPRACHE, KODIERUNG & TYPOGRAFIE
|
||||
% -----------------------------------------------------------------------------
|
||||
\usepackage[utf8]{inputenc} % UTF-8 Quelltext-Kodierung
|
||||
\usepackage[T1]{fontenc} % Silbentrennung für europäische Sprachen
|
||||
\usepackage[ngerman]{babel} % Deutsche Trennmuster und Begriffe
|
||||
|
||||
\usepackage{lmodern} % Latin Modern (Standardschrift, hochauflösend)
|
||||
\usepackage{microtype} % Optischer Randausgleich (Verhindert überstehende Zeilen)
|
||||
|
||||
% -----------------------------------------------------------------------------
|
||||
% 2. KOPF- UND FUSSZEILEN (scrlayer-scrpage)
|
||||
% -----------------------------------------------------------------------------
|
||||
\usepackage[automark]{scrlayer-scrpage}
|
||||
\clearpairofpagestyles % Löscht alle Standard-Kopf-/Fußzeilen
|
||||
\ohead{\headmark} % Kapitelüberschrift außen in der Kopfzeile
|
||||
\ofoot[\pagemark]{\pagemark} % Seitenzahl außen in der Fußzeile
|
||||
\pagestyle{scrheadings}
|
||||
|
||||
% -----------------------------------------------------------------------------
|
||||
% 3. INFOBOXEN & FARBEN (tcolorbox)
|
||||
% -----------------------------------------------------------------------------
|
||||
\usepackage{xcolor}
|
||||
\usepackage[many]{tcolorbox}
|
||||
|
||||
% Eigene Infobox im Terminal-/Maschinen-Stil
|
||||
% Hinweis: tcolorbox-Blöcke bleiben standardmäßig ungeteilt auf einer Seite!
|
||||
\newtcolorbox{infobox}[1][]{
|
||||
colback=gray!5!white, % Sehr helles Grau als Hintergrund
|
||||
colframe=black!80!white, % Dunkler, fast schwarzer Rahmen
|
||||
fonttitle=\bfseries\sffamily, % Titel in serifenloser Fettschrift
|
||||
arc=0mm, % 0mm = Rechtwinklige, eckige Kanten
|
||||
boxrule=0.8pt, % Feine Rahmenstärke
|
||||
title=#1, % Titel wird als Argument übergeben
|
||||
top=3mm, bottom=3mm, % Innenabstände oben/unten
|
||||
left=3mm, right=3mm % Innenabstände links/rechts
|
||||
}
|
||||
|
||||
% -----------------------------------------------------------------------------
|
||||
% 4. SZENENTRENNER (Klassisch & Bild-Trenner)
|
||||
% -----------------------------------------------------------------------------
|
||||
\usepackage{graphicx}
|
||||
|
||||
% A) Klassischer Trenner (Drei Sterne)
|
||||
\newcommand{\scenebreak}{%
|
||||
\par\vspace{1.5em}%
|
||||
{\centering\small$\ast$ \quad $\ast$ \quad $\ast$\par}%
|
||||
\vspace{1.5em}%
|
||||
}
|
||||
|
||||
% B) Grafik-Trenner (Szenenbild zwischen Absätzen)
|
||||
% WICHTIG: Die Klammerung {\centering ... \par} verhindert das Überlaufen des Centerings!
|
||||
\newcommand{\imgbreak}[1]{%
|
||||
\par\vspace{1.5em}%
|
||||
{\centering\includegraphics[height=1.0cm]{#1}\par}%
|
||||
\vspace{1.5em}%
|
||||
}
|
||||
|
||||
% -----------------------------------------------------------------------------
|
||||
% 5. UNUMBROCHENE BLÖCKE & ANZANZAHL FREIER ZEILEN (needspace)
|
||||
% -----------------------------------------------------------------------------
|
||||
\usepackage{needspace} % Erlaubt \needspace{Nbaselineskip}, um Seitenumbrüche zu erzwingen
|
||||
|
||||
% -----------------------------------------------------------------------------
|
||||
% 6. GANSEITIGE RANDLOSE GRAFIKEN (TikZ Full Bleed)
|
||||
% -----------------------------------------------------------------------------
|
||||
\usepackage{tikz}
|
||||
|
||||
% Platziert eine Grafik exakt zentriert über die gesamte A5-Seite (ohne Ränder & ohne Seitenzahl)
|
||||
\newcommand{\fullpageimage}[1]{%
|
||||
\clearpage % Bricht die vorherige Seite sauber ab
|
||||
\thispagestyle{empty}% % Verhindert Kopf- und Fußzeilen auf dieser Seite
|
||||
\begin{tikzpicture}[remember picture, overlay]
|
||||
\node[inner sep=0pt] at (current page.center) {%
|
||||
\includegraphics[width=\paperwidth, height=\paperheight]{#1}%
|
||||
};
|
||||
\end{tikzpicture}%
|
||||
\clearpage % Stellt sicher, dass Folgetext auf neuer Seite beginnt
|
||||
}
|
||||
|
||||
|
||||
% =============================================================================
|
||||
% DOKUMENTEN-INHALT
|
||||
% =============================================================================
|
||||
\begin{document}
|
||||
|
||||
% -----------------------------------------------------------------------------
|
||||
% VORSPANN (Buch-Titel, Impressum, Inhaltsverzeichnis)
|
||||
% -----------------------------------------------------------------------------
|
||||
\frontmatter % Römische Seitenzahlen für den Vorspann
|
||||
|
||||
% SCHMUTZTITEL / MAIN TITLE
|
||||
\begin{titlepage}
|
||||
\centering
|
||||
\vspace*{2cm}
|
||||
{\huge\bfseries MASCHINEN \& IMPULSE \par}
|
||||
\vspace{0.5cm}
|
||||
{\Large\scshape Kurzgeschichten \& Systemprotokolle \par}
|
||||
\vspace{2cm}
|
||||
\rule{0.5\textwidth}{0.5pt} \par
|
||||
\vspace{2cm}
|
||||
{\large\bfseries Software Project CompHist \par}
|
||||
\vfill
|
||||
{\small Version 1.0 --- \today \par}
|
||||
\end{titlepage}
|
||||
|
||||
% IMPRESSUM (Rückseite der Titelseite)
|
||||
\thispagestyle{empty}
|
||||
\vspace*{9cm}
|
||||
\noindent\textbf{Impressum} \\[0.5em]
|
||||
Titel: Maschinen \& Impulse \\
|
||||
Autor: Software Project CompHist \\
|
||||
Druck \& Bindung: Eigenverlag / Print on Demand \\
|
||||
Typografie: \LaTeX{} KOMA-Script (\texttt{scrbook}) \\[1em]
|
||||
{\footnotesize Alle Rechte vorbehalten. Nachdruck, auch auszugsweise, nur mit Genehmigung.}
|
||||
\cleardoublepage
|
||||
|
||||
% INHALTSVERZEICHNIS
|
||||
\tableofcontents
|
||||
\cleardoublepage
|
||||
|
||||
% -----------------------------------------------------------------------------
|
||||
% HAUPTTEIL (Geschichten & Abschnitte)
|
||||
% -----------------------------------------------------------------------------
|
||||
\mainmatter % Arabische Seitenzahlen ab Seite 1
|
||||
|
||||
% ==========================================
|
||||
% GESCHICHTE 1
|
||||
% ==========================================
|
||||
\chapter{Titel der Geschichte}
|
||||
\label{chap:titel_als_refLink}
|
||||
|
||||
ggf ein einleitungs text, da bin ich noch nicht stilsicher
|
||||
|
||||
\section*{erster absatz der Geschichte} % Das Sternchen (*) verhindert die Nummerierung (z.B. "1.1")
|
||||
|
||||
|
||||
% \section*{}
|
||||
% \section*{}
|
||||
% \section*{}
|
||||
% \section*{}
|
||||
% \section*{}
|
||||
|
||||
|
||||
% Beispiel 1: Eine unteilbare Infobox
|
||||
\begin{infobox}[TITEL DER INFOBOX]
|
||||
|
||||
\end{infobox}
|
||||
|
||||
% Beispiel 2: Klassischer Szenentrenner
|
||||
\scenebreak
|
||||
|
||||
Dies ist der erste Absatz nach dem klassischen drei-Sterne Szenentrenner. Der Text ist ganz normal im Blocksatz ausgerichtet.
|
||||
|
||||
% Beispiel 3: Grafik-Szenentrenner (Eingekammert, damit Centering nicht abfärbt)
|
||||
% Ersetze 'beispiel_trenner.png' durch den Pfad deiner Grafik.
|
||||
%\imgbreak{beispiel_trenner.png}
|
||||
|
||||
Dies ist der Absatz nach dem Bild-Trenner. Er läuft sauber im normalen Blocksatz weiter, ohne zentriert zu sein.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
% ==========================================
|
||||
% GESCHICHTE N und weitere Beispiele
|
||||
% ==========================================
|
||||
\chapter{Geschichte n}
|
||||
\label{chap:die_zweite_geschichte}
|
||||
|
||||
|
||||
\section*{Anflug durch das Trümmerfeld}
|
||||
Der Flug durch die Zone erforderte höchste Konzentration. Jeder Asteroid stellte ein potenzielles Risiko dar.
|
||||
|
||||
% ==========================================
|
||||
% UNTEILBARE BLÖCKE (MINIPAGE & NEEDSPACE)
|
||||
% ==========================================
|
||||
\vspace{1em}
|
||||
\noindent\textbf{Demonstration unteilbarer Abschnitte:}
|
||||
|
||||
% Variante A: minipage (Block wird NIEMALS auf 2 Seiten zerrissen)
|
||||
\begin{minipage}{\linewidth}
|
||||
\section*{Gekapselter Textblock}
|
||||
Dieser Absatz befindet sich zusammen mit der nachfolgenden Infobox innerhalb einer \texttt{minipage}. Sollte am Seitenende nicht mehr genügend Platz für den Gesamten Block sein, rückt der gesamte Inhalt geschlossen auf die nächste Seite.
|
||||
|
||||
\begin{infobox}[LOKALER SPEICHER]
|
||||
Register A: 0x4F | Register B: 0x12
|
||||
\end{infobox}
|
||||
\end{minipage}
|
||||
|
||||
% Variante B: needspace (Erzwingt Umbruch, wenn weniger als N Zeilen frei sind)
|
||||
\needspace{5baselineskip}
|
||||
\section*{Sicherer Abschnittsstart}
|
||||
Vor dieser Überschrift prüft \texttt{\textbackslash needspace}, ob noch mindestens 5 Zeilenhöhe frei sind. Falls nicht, wird die Überschrift direkt auf die nächste Seite gesetzt, um Waisen-Zeilen am Seitenende zu vermeiden.
|
||||
|
||||
|
||||
% ==========================================
|
||||
% GANSEITIGE RANDLOSE GRAFIK (TikZ Bleed)
|
||||
% ==========================================
|
||||
% Ersetze 'beispiel_vollbild.png' durch dein A5-Artwork/Illustration.
|
||||
%\fullpageimage{beispiel_vollbild.png}
|
||||
|
||||
|
||||
% -----------------------------------------------------------------------------
|
||||
% NACHSPANN (Nachwort, Lizenzen, Anhang)
|
||||
% -----------------------------------------------------------------------------
|
||||
\backmatter % Keine Kapitelnummern mehr
|
||||
|
||||
\chapter*{Nachwort}
|
||||
Diese Geschichtensammlung entstand als typografisches Grundgerüst für ein gedrucktes Taschenbuch im A5-Format. Alle Seitenränder, Bindekorrekturen und Abstände entsprechen den Standards des modernen Buchdrucks.
|
||||
|
||||
\end{document}
|
||||
@@ -0,0 +1,641 @@
|
||||
= Design-System: Maschinen-Instanzen
|
||||
:toc:
|
||||
:toclevels: 3
|
||||
|
||||
Project X Tribut • Universelles UI-, HUD- und Grafiksystem
|
||||
|
||||
*Version:* 1.0.0 +
|
||||
*Zielplattformen:* Web, HTML5 Canvas, Browser-Games, Diagnose-Terminals, Tools, Dashboards +
|
||||
*Designsprache:* Hard-Sci-Fi • Industrial Computing • Retro-Terminal • Maschinenästhetik
|
||||
|
||||
== 1. Designphilosophie
|
||||
|
||||
Das Design-System *Maschinen-Instanzen* definiert die visuelle Sprache des gesamten Computer-Historyz-Universums.
|
||||
|
||||
Die Gestaltung orientiert sich an industriellen Steuerungssystemen, wissenschaftlichen Diagnoseterminals und kybernetischen Maschinenkomplexen. Sämtliche Farben, Formen und Effekte besitzen eine funktionale Bedeutung.
|
||||
|
||||
Die Benutzeroberfläche soll nicht dekorativ wirken, sondern wie ein Bestandteil einer realen Maschine.
|
||||
|
||||
=== Grundprinzipien
|
||||
|
||||
. Funktion vor Dekoration.
|
||||
. Jede Farbe besitzt eine semantische Bedeutung.
|
||||
. Scharfe Kanten statt organischer Formen.
|
||||
. Monospace-Typografie als Standard.
|
||||
. Technische Lesbarkeit hat Vorrang vor visuellen Effekten.
|
||||
. Informationen werden durch Farbe, Position und Kontrast vermittelt.
|
||||
. Animationen dienen der Zustandskommunikation und niemals ausschließlich der Verzierung.
|
||||
|
||||
== 2. Farbpalette
|
||||
|
||||
=== 2.1 Kernfarben
|
||||
|
||||
[cols="1,1,3",options="header"]
|
||||
|===
|
||||
|Name
|
||||
|Hex
|
||||
|Bedeutung
|
||||
|
||||
|Deep Void
|
||||
|`#05070a`
|
||||
|Globaler Hintergrund, tiefste Darstellungsebene
|
||||
|
||||
|Terminal Base
|
||||
|`#0b0e14`
|
||||
|Fenster, Container und Panel-Flächen
|
||||
|
||||
|Tech Cyan
|
||||
|`#00f2ff`
|
||||
|Interaktion, Fokus, aktive Systeme
|
||||
|
||||
|Harvest Green
|
||||
|`#00ff73`
|
||||
|Erfolg, Ressourcengewinn, Wiederherstellung
|
||||
|
||||
|Amber Gold
|
||||
|`#ffb700`
|
||||
|Warnungen, besondere Objekte, Missionsziele
|
||||
|
||||
|Critical Red
|
||||
|`#ff3e3e`
|
||||
|Kritische Zustände, Fehler, Gefahr
|
||||
|
||||
|Steel Grey
|
||||
|`#888899`
|
||||
|Sekundäre Informationen, deaktivierte Elemente
|
||||
|===
|
||||
|
||||
=== 2.2 Semantische Zustände
|
||||
|
||||
[cols="1,1",options="header"]
|
||||
|===
|
||||
|Zustand
|
||||
|Farbe
|
||||
|
||||
|Information
|
||||
|Tech Cyan
|
||||
|
||||
|Erfolg
|
||||
|Harvest Green
|
||||
|
||||
|Warnung
|
||||
|Amber Gold
|
||||
|
||||
|Kritisch
|
||||
|Critical Red
|
||||
|
||||
|Deaktiviert
|
||||
|Steel Grey
|
||||
|
||||
|Fokus
|
||||
|Tech Cyan + Glow
|
||||
|===
|
||||
|
||||
=== 2.3 Priorisierung
|
||||
|
||||
==== Primär
|
||||
|
||||
Interaktive Objekte:
|
||||
|
||||
* Buttons
|
||||
* Links
|
||||
* Menüs
|
||||
* Aktive Systeme
|
||||
|
||||
Verwenden:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
Tech Cyan
|
||||
----
|
||||
|
||||
==== Sekundär
|
||||
|
||||
Nicht-interaktive Daten:
|
||||
|
||||
* Metadaten
|
||||
* Diagnostikwerte
|
||||
* Statistiken
|
||||
|
||||
Verwenden:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
Steel Grey
|
||||
----
|
||||
|
||||
==== Kritisch
|
||||
|
||||
Fehler oder Gefahr:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
Critical Red
|
||||
----
|
||||
|
||||
== 3. Typografie
|
||||
|
||||
=== 3.1 Schriftarten
|
||||
|
||||
Ausschließlich Monospace-Schriften.
|
||||
|
||||
Bevorzugte Reihenfolge:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
JetBrains Mono
|
||||
Fira Code
|
||||
Courier Prime
|
||||
monospace
|
||||
----
|
||||
|
||||
=== 3.2 Typografische Regeln
|
||||
|
||||
==== Beschriftungen
|
||||
|
||||
Verwendung von Kleinbuchstaben.
|
||||
|
||||
Beispiel:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
shield status
|
||||
resource storage
|
||||
diagnostics
|
||||
----
|
||||
|
||||
==== Statusmeldungen
|
||||
|
||||
Fett darstellen.
|
||||
|
||||
Beispiel:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
WARNING
|
||||
SHIELD FAILURE
|
||||
RECOVERY COMPLETE
|
||||
----
|
||||
|
||||
=== 3.3 Lesbarkeit
|
||||
|
||||
Grundregeln:
|
||||
|
||||
[source,css]
|
||||
----
|
||||
line-height: 1.4;
|
||||
letter-spacing: 0.02em;
|
||||
----
|
||||
|
||||
Text muss stets lesbar bleiben.
|
||||
|
||||
Dekorative Effekte dürfen niemals die Lesbarkeit reduzieren.
|
||||
|
||||
=== 3.4 Text-Glow
|
||||
|
||||
Optional:
|
||||
|
||||
[source,css]
|
||||
----
|
||||
text-shadow:
|
||||
0 0 3px rgba(0,242,255,0.3);
|
||||
----
|
||||
|
||||
Maximal:
|
||||
|
||||
* 3px Blur
|
||||
* 30 % Deckkraft
|
||||
|
||||
== 4. Layout-System
|
||||
|
||||
=== 4.1 Raster
|
||||
|
||||
Empfohlenes Grundraster:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
8px System
|
||||
----
|
||||
|
||||
Abstände erfolgen in Vielfachen von:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
8
|
||||
16
|
||||
24
|
||||
32
|
||||
48
|
||||
64
|
||||
----
|
||||
|
||||
=== 4.2 Informationshierarchie
|
||||
|
||||
Von links nach rechts:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
Systemstatus
|
||||
↓
|
||||
Navigation
|
||||
↓
|
||||
Primäre Inhalte
|
||||
↓
|
||||
Kontextinformationen
|
||||
----
|
||||
|
||||
=== 4.3 Bildaufteilung
|
||||
|
||||
Für Spiele:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
Links:
|
||||
Systeme / HUD
|
||||
|
||||
Mitte:
|
||||
Gameplay
|
||||
|
||||
Rechts:
|
||||
Freier Sichtbereich
|
||||
----
|
||||
|
||||
== 5. HUD-Spezifikation
|
||||
|
||||
=== 5.1 Grundkonzept
|
||||
|
||||
HUD-Elemente wirken wie physische Bestandteile der Maschine.
|
||||
|
||||
Keine schwebenden Fantasy-Elemente.
|
||||
|
||||
Keine organischen Formen.
|
||||
|
||||
=== 5.2 Statusanzeigen
|
||||
|
||||
==== Schild
|
||||
|
||||
Farbübergang:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
>60%
|
||||
Tech Cyan
|
||||
|
||||
30%-60%
|
||||
Amber Gold
|
||||
|
||||
<30%
|
||||
Critical Red
|
||||
----
|
||||
|
||||
==== Ressourcen
|
||||
|
||||
Verwendung:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
Harvest Green
|
||||
----
|
||||
|
||||
==== Systemfehler
|
||||
|
||||
Verwendung:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
Critical Red
|
||||
----
|
||||
|
||||
== 6. Canvas-Effekte
|
||||
|
||||
=== 6.1 Scan-Lines
|
||||
|
||||
Zweck:
|
||||
|
||||
Simulation eines industriellen Monitors.
|
||||
|
||||
Empfohlene Farbe:
|
||||
|
||||
[source,css]
|
||||
----
|
||||
rgba(255,255,255,0.03)
|
||||
----
|
||||
|
||||
Regeln:
|
||||
|
||||
* Über der Spielwelt
|
||||
* Unter der UI
|
||||
* Dürfen Lesbarkeit nicht beeinträchtigen
|
||||
|
||||
=== 6.2 Glitch-Effekte
|
||||
|
||||
Technische Störungen werden durch kurze Cyan-Artefakte dargestellt.
|
||||
|
||||
Regeln:
|
||||
|
||||
* Maximal 150 ms sichtbar
|
||||
* Nur ereignisgesteuert
|
||||
* Keine permanente Darstellung
|
||||
|
||||
Mögliche Auslöser:
|
||||
|
||||
* Schildausfall
|
||||
* Respawn
|
||||
* Energieumschaltung
|
||||
* Speichertransfer
|
||||
* Diagnostikfehler
|
||||
|
||||
=== 6.3 Bildschirmrauschen
|
||||
|
||||
Optional:
|
||||
|
||||
[source,css]
|
||||
----
|
||||
opacity: 0.02 - 0.04
|
||||
----
|
||||
|
||||
Niemals dominant.
|
||||
|
||||
== 7. Rahmen-System
|
||||
|
||||
=== 7.1 Grundregel
|
||||
|
||||
Vermeide klassische Betriebssystem-Fenster.
|
||||
|
||||
Stattdessen:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
┌─────────
|
||||
|
||||
└─────────
|
||||
----
|
||||
|
||||
oder Corner-Brackets.
|
||||
|
||||
=== 7.2 Rundungen
|
||||
|
||||
Nicht vorgesehen.
|
||||
|
||||
Maximal:
|
||||
|
||||
[source,css]
|
||||
----
|
||||
border-radius: 2px;
|
||||
----
|
||||
|
||||
=== 7.3 Linien
|
||||
|
||||
Immer:
|
||||
|
||||
[source,css]
|
||||
----
|
||||
1px
|
||||
----
|
||||
|
||||
Farbe:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
Steel Grey
|
||||
----
|
||||
|
||||
Aktiv:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
Tech Cyan
|
||||
----
|
||||
|
||||
== 8. Buttons
|
||||
|
||||
=== Normal
|
||||
|
||||
[source,css]
|
||||
----
|
||||
background: transparent;
|
||||
color: #888899;
|
||||
border: 1px solid #888899;
|
||||
----
|
||||
|
||||
=== Hover
|
||||
|
||||
[source,css]
|
||||
----
|
||||
color: #00f2ff;
|
||||
border-color: #00f2ff;
|
||||
|
||||
box-shadow:
|
||||
0 0 8px #00f2ff;
|
||||
----
|
||||
|
||||
=== Aktiv
|
||||
|
||||
[source,css]
|
||||
----
|
||||
background: #00f2ff;
|
||||
color: #05070a;
|
||||
----
|
||||
|
||||
=== Disabled
|
||||
|
||||
[source,css]
|
||||
----
|
||||
opacity: 0.4;
|
||||
pointer-events: none;
|
||||
----
|
||||
|
||||
== 9. Panels und Container
|
||||
|
||||
=== Standard
|
||||
|
||||
[source,css]
|
||||
----
|
||||
background: #0b0e14;
|
||||
border: 1px solid #888899;
|
||||
|
||||
backdrop-filter: blur(4px);
|
||||
----
|
||||
|
||||
=== Overlays
|
||||
|
||||
Dürfen Schatten besitzen.
|
||||
|
||||
Beispiel:
|
||||
|
||||
[source,css]
|
||||
----
|
||||
box-shadow:
|
||||
8px 8px 0 rgba(0,0,0,0.8);
|
||||
----
|
||||
|
||||
=== Schatten-Regel
|
||||
|
||||
Verboten:
|
||||
|
||||
* Weiche Material-Schatten
|
||||
* Neumorphe Effekte
|
||||
* Mobile-App-Schatten
|
||||
|
||||
Erlaubt:
|
||||
|
||||
* Harte technische Schatten
|
||||
|
||||
== 10. Icon-System
|
||||
|
||||
=== Stil
|
||||
|
||||
Alle Icons müssen:
|
||||
|
||||
* SVG-basiert sein
|
||||
* Geometrisch wirken
|
||||
* Scharfe Kanten besitzen
|
||||
|
||||
=== Unzulässig
|
||||
|
||||
* Airbrush
|
||||
* Illustrationen
|
||||
* Farbverläufe
|
||||
* Cartoon-Stil
|
||||
|
||||
=== Zulässig
|
||||
|
||||
* Technische Symbole
|
||||
* Schaltpläne
|
||||
* Maschinen-Piktogramme
|
||||
|
||||
== 11. Asset-Pipeline
|
||||
|
||||
=== Flächen
|
||||
|
||||
Nur Vollfarben.
|
||||
|
||||
=== Nicht erlaubt
|
||||
|
||||
* Farbverläufe
|
||||
* Weiche Lichtflächen
|
||||
* Fototexturen im UI
|
||||
|
||||
=== Ausnahmen
|
||||
|
||||
Folgende Effekte dürfen Verläufe enthalten:
|
||||
|
||||
* Glow
|
||||
* Bloom
|
||||
* Partikel
|
||||
* Plasma
|
||||
* Energieeffekte
|
||||
|
||||
== 12. Lichtsystem
|
||||
|
||||
=== Ziel
|
||||
|
||||
Licht soll technisch wirken.
|
||||
|
||||
Nicht magisch.
|
||||
|
||||
Nicht organisch.
|
||||
|
||||
Nicht dekorativ.
|
||||
|
||||
=== Glow-Regeln
|
||||
|
||||
Empfohlen:
|
||||
|
||||
[source,css]
|
||||
----
|
||||
box-shadow:
|
||||
0 0 6px currentColor;
|
||||
----
|
||||
|
||||
Eigenschaften:
|
||||
|
||||
* Kurzer Radius
|
||||
* Hoher Kontrast
|
||||
* Klar abgegrenzte Lichtquellen
|
||||
|
||||
== 13. Animationen
|
||||
|
||||
=== Erlaubt
|
||||
|
||||
* Blinken
|
||||
* Pulsieren
|
||||
* Statuswechsel
|
||||
* Diagnostik-Animationen
|
||||
* Ladeanzeigen
|
||||
|
||||
=== Nicht erlaubt
|
||||
|
||||
* Verspielte Übergänge
|
||||
* Elastische Animationen
|
||||
* Übertriebene Bewegungen
|
||||
|
||||
=== Animationsdauer
|
||||
|
||||
Empfohlen:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
100ms - 300ms
|
||||
----
|
||||
|
||||
HUD-Reaktionen:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
50ms - 150ms
|
||||
----
|
||||
|
||||
== 14. Referenz-CSS
|
||||
|
||||
[source,css]
|
||||
----
|
||||
:root {
|
||||
--bg-deep: #05070a;
|
||||
--bg-panel: #0b0e14;
|
||||
|
||||
--accent-cyan: #00f2ff;
|
||||
--accent-green: #00ff73;
|
||||
--accent-amber: #ffb700;
|
||||
--accent-red: #ff3e3e;
|
||||
|
||||
--text-dim: #888899;
|
||||
}
|
||||
|
||||
body {
|
||||
background: var(--bg-deep);
|
||||
color: var(--text-dim);
|
||||
|
||||
font-family:
|
||||
"JetBrains Mono",
|
||||
"Fira Code",
|
||||
"Courier Prime",
|
||||
monospace;
|
||||
}
|
||||
|
||||
.panel {
|
||||
background: var(--bg-panel);
|
||||
border: 1px solid var(--text-dim);
|
||||
backdrop-filter: blur(4px);
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
color: var(--accent-cyan);
|
||||
border-color: var(--accent-cyan);
|
||||
|
||||
box-shadow:
|
||||
0 0 8px var(--accent-cyan);
|
||||
}
|
||||
----
|
||||
|
||||
== Design-Leitsatz
|
||||
|
||||
*Maschinen-Instanzen ist kein futuristisches Betriebssystem.*
|
||||
|
||||
Es ist die Benutzeroberfläche einer gewaltigen industriellen Maschine, die zufällig von Menschen bedient wird.
|
||||
|
||||
Jedes Element soll vermitteln, dass unter der Oberfläche reale Energieflüsse, Diagnosesysteme, Speicherabbilder, Förderanlagen und Maschinenprozesse arbeiten.
|
||||
|
||||
Dekoration ist optional.
|
||||
|
||||
*Funktion ist Pflicht.*
|
||||
@@ -0,0 +1,648 @@
|
||||
# Design-System: Maschinen-Instanzen
|
||||
### Project X Tribut • Universelles UI-, HUD- und Grafiksystem
|
||||
|
||||
**Version:** 1.0.0
|
||||
**Zielplattformen:** Web, HTML5 Canvas, Browser-Games, Diagnose-Terminals, Tools, Dashboards
|
||||
**Designsprache:** Hard-Sci-Fi · Industrial Computing · Retro-Terminal · Maschinenästhetik
|
||||
|
||||
---
|
||||
|
||||
# 1. Designphilosophie
|
||||
|
||||
Das Design-System *Maschinen-Instanzen* definiert die visuelle Sprache des gesamten Computer-Historyz-Universums.
|
||||
|
||||
Die Gestaltung orientiert sich an industriellen Steuerungssystemen, wissenschaftlichen Diagnoseterminals und kybernetischen Maschinenkomplexen. Sämtliche Farben, Formen und Effekte besitzen eine funktionale Bedeutung.
|
||||
|
||||
Die Benutzeroberfläche soll nicht dekorativ wirken, sondern wie ein Bestandteil einer realen Maschine.
|
||||
|
||||
## Grundprinzipien
|
||||
|
||||
1. Funktion vor Dekoration.
|
||||
2. Jede Farbe besitzt eine semantische Bedeutung.
|
||||
3. Scharfe Kanten statt organischer Formen.
|
||||
4. Monospace-Typografie als Standard.
|
||||
5. Technische Lesbarkeit hat Vorrang vor visuellen Effekten.
|
||||
6. Informationen werden durch Farbe, Position und Kontrast vermittelt.
|
||||
7. Animationen dienen der Zustandskommunikation und niemals ausschließlich der Verzierung.
|
||||
|
||||
---
|
||||
|
||||
# 2. Farbpalette
|
||||
|
||||
## 2.1 Kernfarben
|
||||
|
||||
| Name | Hex | Bedeutung |
|
||||
|--------|--------|--------|
|
||||
| Deep Void | `#05070a` | Globaler Hintergrund, tiefste Darstellungsebene |
|
||||
| Terminal Base | `#0b0e14` | Fenster, Container und Panel-Flächen |
|
||||
| Tech Cyan | `#00f2ff` | Interaktion, Fokus, aktive Systeme |
|
||||
| Harvest Green | `#00ff73` | Erfolg, Ressourcengewinn, Wiederherstellung |
|
||||
| Amber Gold | `#ffb700` | Warnungen, besondere Objekte, Missionsziele |
|
||||
| Critical Red | `#ff3e3e` | Kritische Zustände, Fehler, Gefahr |
|
||||
| Steel Grey | `#888899` | Sekundäre Informationen, deaktivierte Elemente |
|
||||
|
||||
---
|
||||
|
||||
## 2.2 Semantische Zustände
|
||||
|
||||
| Zustand | Farbe |
|
||||
|----------|----------|
|
||||
| Information | Tech Cyan |
|
||||
| Erfolg | Harvest Green |
|
||||
| Warnung | Amber Gold |
|
||||
| Kritisch | Critical Red |
|
||||
| Deaktiviert | Steel Grey |
|
||||
| Fokus | Tech Cyan + Glow |
|
||||
|
||||
---
|
||||
|
||||
## 2.3 Priorisierung
|
||||
|
||||
### Primär
|
||||
|
||||
Interaktive Objekte:
|
||||
|
||||
- Buttons
|
||||
- Links
|
||||
- Menüs
|
||||
- Aktive Systeme
|
||||
|
||||
Verwenden:
|
||||
|
||||
```text
|
||||
Tech Cyan
|
||||
```
|
||||
|
||||
### Sekundär
|
||||
|
||||
Nicht-interaktive Daten:
|
||||
|
||||
- Metadaten
|
||||
- Diagnostikwerte
|
||||
- Statistiken
|
||||
|
||||
Verwenden:
|
||||
|
||||
```text
|
||||
Steel Grey
|
||||
```
|
||||
|
||||
### Kritisch
|
||||
|
||||
Fehler oder Gefahr:
|
||||
|
||||
```text
|
||||
Critical Red
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 3. Typografie
|
||||
|
||||
## 3.1 Schriftarten
|
||||
|
||||
Ausschließlich Monospace-Schriften.
|
||||
|
||||
Bevorzugte Reihenfolge:
|
||||
|
||||
```text
|
||||
JetBrains Mono
|
||||
Fira Code
|
||||
Courier Prime
|
||||
monospace
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3.2 Typografische Regeln
|
||||
|
||||
### Beschriftungen
|
||||
|
||||
Verwendung von Kleinbuchstaben.
|
||||
|
||||
Beispiel:
|
||||
|
||||
```text
|
||||
shield status
|
||||
resource storage
|
||||
diagnostics
|
||||
```
|
||||
|
||||
### Statusmeldungen
|
||||
|
||||
Fett darstellen.
|
||||
|
||||
Beispiel:
|
||||
|
||||
```text
|
||||
WARNING
|
||||
SHIELD FAILURE
|
||||
RECOVERY COMPLETE
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3.3 Lesbarkeit
|
||||
|
||||
Grundregeln:
|
||||
|
||||
```css
|
||||
line-height: 1.4;
|
||||
letter-spacing: 0.02em;
|
||||
```
|
||||
|
||||
Text muss stets lesbar bleiben.
|
||||
|
||||
Dekorative Effekte dürfen niemals die Lesbarkeit reduzieren.
|
||||
|
||||
---
|
||||
|
||||
## 3.4 Text-Glow
|
||||
|
||||
Optional:
|
||||
|
||||
```css
|
||||
text-shadow:
|
||||
0 0 3px rgba(0,242,255,0.3);
|
||||
```
|
||||
|
||||
Maximal:
|
||||
|
||||
- 3px Blur
|
||||
- 30% Deckkraft
|
||||
|
||||
---
|
||||
|
||||
# 4. Layout-System
|
||||
|
||||
## 4.1 Raster
|
||||
|
||||
Empfohlenes Grundraster:
|
||||
|
||||
```text
|
||||
8px System
|
||||
```
|
||||
|
||||
Abstände erfolgen in Vielfachen von:
|
||||
|
||||
```text
|
||||
8
|
||||
16
|
||||
24
|
||||
32
|
||||
48
|
||||
64
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4.2 Informationshierarchie
|
||||
|
||||
Von links nach rechts:
|
||||
|
||||
```text
|
||||
Systemstatus
|
||||
↓
|
||||
Navigation
|
||||
↓
|
||||
Primäre Inhalte
|
||||
↓
|
||||
Kontextinformationen
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4.3 Bildaufteilung
|
||||
|
||||
Für Spiele:
|
||||
|
||||
```text
|
||||
Links:
|
||||
Systeme / HUD
|
||||
|
||||
Mitte:
|
||||
Gameplay
|
||||
|
||||
Rechts:
|
||||
Freier Sichtbereich
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 5. HUD-Spezifikation
|
||||
|
||||
## 5.1 Grundkonzept
|
||||
|
||||
HUD-Elemente wirken wie physische Bestandteile der Maschine.
|
||||
|
||||
Keine schwebenden Fantasy-Elemente.
|
||||
|
||||
Keine organischen Formen.
|
||||
|
||||
---
|
||||
|
||||
## 5.2 Statusanzeigen
|
||||
|
||||
### Schild
|
||||
|
||||
Farbübergang:
|
||||
|
||||
```text
|
||||
>60%
|
||||
Tech Cyan
|
||||
|
||||
30%-60%
|
||||
Amber Gold
|
||||
|
||||
<30%
|
||||
Critical Red
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Ressourcen
|
||||
|
||||
Verwendung:
|
||||
|
||||
```text
|
||||
Harvest Green
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Systemfehler
|
||||
|
||||
Verwendung:
|
||||
|
||||
```text
|
||||
Critical Red
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 6. Canvas-Effekte
|
||||
|
||||
## 6.1 Scan-Lines
|
||||
|
||||
Zweck:
|
||||
|
||||
Simulation eines industriellen Monitors.
|
||||
|
||||
Empfohlene Farbe:
|
||||
|
||||
```css
|
||||
rgba(255,255,255,0.03)
|
||||
```
|
||||
|
||||
Regeln:
|
||||
|
||||
- Über der Spielwelt
|
||||
- Unter der UI
|
||||
- Dürfen Lesbarkeit nicht beeinträchtigen
|
||||
|
||||
---
|
||||
|
||||
## 6.2 Glitch-Effekte
|
||||
|
||||
Technische Störungen werden durch kurze Cyan-Artefakte dargestellt.
|
||||
|
||||
Regeln:
|
||||
|
||||
- Maximal 150 ms sichtbar
|
||||
- Nur ereignisgesteuert
|
||||
- Keine permanente Darstellung
|
||||
|
||||
Mögliche Auslöser:
|
||||
|
||||
- Schildausfall
|
||||
- Respawn
|
||||
- Energieumschaltung
|
||||
- Speichertransfer
|
||||
- Diagnostikfehler
|
||||
|
||||
---
|
||||
|
||||
## 6.3 Bildschirmrauschen
|
||||
|
||||
Optional:
|
||||
|
||||
```css
|
||||
opacity: 0.02 - 0.04
|
||||
```
|
||||
|
||||
Niemals dominant.
|
||||
|
||||
---
|
||||
|
||||
# 7. Rahmen-System
|
||||
|
||||
## 7.1 Grundregel
|
||||
|
||||
Vermeide klassische Betriebssystem-Fenster.
|
||||
|
||||
Stattdessen:
|
||||
|
||||
```text
|
||||
┌─────────
|
||||
|
||||
└─────────
|
||||
```
|
||||
|
||||
bzw. Corner-Brackets.
|
||||
|
||||
---
|
||||
|
||||
## 7.2 Rundungen
|
||||
|
||||
Nicht vorgesehen.
|
||||
|
||||
Maximal:
|
||||
|
||||
```css
|
||||
border-radius: 2px;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7.3 Linien
|
||||
|
||||
Immer:
|
||||
|
||||
```css
|
||||
1px
|
||||
```
|
||||
|
||||
Farbe:
|
||||
|
||||
```text
|
||||
Steel Grey
|
||||
```
|
||||
|
||||
Aktiv:
|
||||
|
||||
```text
|
||||
Tech Cyan
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 8. Buttons
|
||||
|
||||
## Normal
|
||||
|
||||
```css
|
||||
background: transparent;
|
||||
color: #888899;
|
||||
border: 1px solid #888899;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Hover
|
||||
|
||||
```css
|
||||
color: #00f2ff;
|
||||
border-color: #00f2ff;
|
||||
|
||||
box-shadow:
|
||||
0 0 8px #00f2ff;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Aktiv
|
||||
|
||||
```css
|
||||
background: #00f2ff;
|
||||
color: #05070a;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Disabled
|
||||
|
||||
```css
|
||||
opacity: 0.4;
|
||||
pointer-events: none;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 9. Panels und Container
|
||||
|
||||
## Standard
|
||||
|
||||
```css
|
||||
background: #0b0e14;
|
||||
border: 1px solid #888899;
|
||||
|
||||
backdrop-filter: blur(4px);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Overlays
|
||||
|
||||
Dürfen Schatten besitzen.
|
||||
|
||||
Beispiel:
|
||||
|
||||
```css
|
||||
box-shadow:
|
||||
8px 8px 0 rgba(0,0,0,0.8);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Schatten-Regel
|
||||
|
||||
Verboten:
|
||||
|
||||
- weiche Material-Schatten
|
||||
- neumorphe Effekte
|
||||
- mobile App Shadows
|
||||
|
||||
Erlaubt:
|
||||
|
||||
- harte technische Schatten
|
||||
|
||||
---
|
||||
|
||||
# 10. Icon-System
|
||||
|
||||
## Stil
|
||||
|
||||
Alle Icons müssen:
|
||||
|
||||
- SVG-basiert sein
|
||||
- geometrisch wirken
|
||||
- scharfe Kanten besitzen
|
||||
|
||||
---
|
||||
|
||||
## Unzulässig
|
||||
|
||||
- Airbrush
|
||||
- Illustrationen
|
||||
- Farbverläufe
|
||||
- Cartoon-Stil
|
||||
|
||||
---
|
||||
|
||||
## Zulässig
|
||||
|
||||
- technische Symbole
|
||||
- Schaltpläne
|
||||
- Maschinen-Piktogramme
|
||||
|
||||
---
|
||||
|
||||
# 11. Asset-Pipeline
|
||||
|
||||
## Flächen
|
||||
|
||||
Nur Vollfarben.
|
||||
|
||||
---
|
||||
|
||||
## Nicht erlaubt
|
||||
|
||||
- Farbverläufe
|
||||
- weiche Lichtflächen
|
||||
- Fototexturen im UI
|
||||
|
||||
---
|
||||
|
||||
## Ausnahmen
|
||||
|
||||
Folgende Effekte dürfen Verläufe enthalten:
|
||||
|
||||
- Glow
|
||||
- Bloom
|
||||
- Partikel
|
||||
- Plasma
|
||||
- Energieeffekte
|
||||
|
||||
---
|
||||
|
||||
# 12. Lichtsystem
|
||||
|
||||
## Ziel
|
||||
|
||||
Licht soll technisch wirken.
|
||||
|
||||
Nicht magisch.
|
||||
|
||||
Nicht organisch.
|
||||
|
||||
Nicht dekorativ.
|
||||
|
||||
---
|
||||
|
||||
## Glow-Regeln
|
||||
|
||||
Empfohlen:
|
||||
|
||||
```css
|
||||
box-shadow:
|
||||
0 0 6px currentColor;
|
||||
```
|
||||
|
||||
Eigenschaften:
|
||||
|
||||
- kurzer Radius
|
||||
- hoher Kontrast
|
||||
- klar abgegrenzte Lichtquellen
|
||||
|
||||
---
|
||||
|
||||
# 13. Animationen
|
||||
|
||||
## Erlaubt
|
||||
|
||||
- Blinken
|
||||
- Pulsieren
|
||||
- Statuswechsel
|
||||
- Diagnostik-Animationen
|
||||
- Ladeanzeigen
|
||||
|
||||
---
|
||||
|
||||
## Nicht erlaubt
|
||||
|
||||
- verspielte Übergänge
|
||||
- elastische Animationen
|
||||
- übertriebene Bewegungen
|
||||
|
||||
---
|
||||
|
||||
## Animationsdauer
|
||||
|
||||
Empfohlen:
|
||||
|
||||
```text
|
||||
100ms - 300ms
|
||||
```
|
||||
|
||||
HUD-Reaktionen:
|
||||
|
||||
```text
|
||||
50ms - 150ms
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 14. Referenz-CSS
|
||||
|
||||
```css
|
||||
:root {
|
||||
--bg-deep: #05070a;
|
||||
--bg-panel: #0b0e14;
|
||||
|
||||
--accent-cyan: #00f2ff;
|
||||
--accent-green: #00ff73;
|
||||
--accent-amber: #ffb700;
|
||||
--accent-red: #ff3e3e;
|
||||
|
||||
--text-dim: #888899;
|
||||
}
|
||||
|
||||
body {
|
||||
background: var(--bg-deep);
|
||||
color: var(--text-dim);
|
||||
|
||||
font-family:
|
||||
"JetBrains Mono",
|
||||
"Fira Code",
|
||||
"Courier Prime",
|
||||
monospace;
|
||||
}
|
||||
|
||||
.panel {
|
||||
background: var(--bg-panel);
|
||||
border: 1px solid var(--text-dim);
|
||||
backdrop-filter: blur(4px);
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
color: var(--accent-cyan);
|
||||
border-color: var(--accent-cyan);
|
||||
|
||||
box-shadow:
|
||||
0 0 8px var(--accent-cyan);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Design-Leitsatz
|
||||
|
||||
**Maschinen-Instanzen ist kein futuristisches Betriebssystem.**
|
||||
|
||||
Es ist die Benutzeroberfläche einer gewaltigen industriellen Maschine, die zufällig von Menschen bedient wird.
|
||||
|
||||
Jedes Element soll vermitteln, dass unter der Oberfläche reale Energieflüsse, Diagnosesysteme, Speicherabbilder, Förderanlagen und Maschinenprozesse arbeiten.
|
||||
|
||||
Dekoration ist optional.
|
||||
|
||||
Funktion ist Pflicht.
|
||||
@@ -0,0 +1,259 @@
|
||||
= REVERSE GAME DESIGN DOCUMENT (GDD)
|
||||
:toc: left
|
||||
:toclevels: 3
|
||||
|
||||
Projekt: Maschinen-Instanzen – Asteroiden-Sektor (Project X Tribut)
|
||||
|
||||
*Version:* 1.0.0 +
|
||||
*Genre:* Hard-Sci-Fi / Retro-Shmup (2.5D) +
|
||||
*Setting:* Das „Computer Historyz“-Universum (Sektor: Oortsche Wolke 42)
|
||||
|
||||
== 1. Vision & Kernkonzept
|
||||
|
||||
Ein endloses, horizontales Shoot-'em-up in 2D, das innerhalb einer echten 3D-Umgebung gerendert wird.
|
||||
|
||||
Der Spieler steuert eine kybernetische Ernte-Instanz (Bergbau-Schiff), die am Rand eines gigantischen, planetengroßen Maschinen-Ansaugstutzens operiert.
|
||||
|
||||
Das Spiel kombiniert rasante Arcade-Asteroiden-Zerstörung mit taktischem Power-Routing (Energie-Management) unter harten Hard-Sci-Fi-Rahmenbedingungen.
|
||||
|
||||
== 2. Globale Farbpalette & Ästhetik
|
||||
|
||||
Diese Farbpalette definiert das visuelle Leitbild für alle zukünftigen Spiele in diesem Universum, unabhängig davon, ob sie als Pixel-Art-, Vektor- oder PBR-basierte 3D-Titel umgesetzt werden.
|
||||
|
||||
=== 2.1 UI-, HUD- und Terminal-Farben (Window-Maker-Stil)
|
||||
|
||||
Die Benutzeroberfläche basiert auf dem kalten, funktionalen Look klassischer Unix-Terminals, kombiniert mit modernen Glow-Effekten.
|
||||
|
||||
[cols="1,1,3",options="header"]
|
||||
|===
|
||||
|Farbe
|
||||
|Hex-Code
|
||||
|Semantischer Nutzen
|
||||
|
||||
|Deep Void
|
||||
|`#05070a`
|
||||
|Globaler Weltraum-Hintergrund, tiefste Schatten.
|
||||
|
||||
|Terminal Base
|
||||
|`#0d1117`
|
||||
|Hintergrund für Menüs, HUD-Panels und Dialogfenster.
|
||||
|
||||
|Panel Border
|
||||
|`#444c56`
|
||||
|Rahmen von UI-Fenstern, häufig kombiniert mit inneren Highlights für 3D-Bevel-Effekte.
|
||||
|
||||
|Tech Cyan
|
||||
|`#58a6ff`
|
||||
|Primäre Akzentfarbe. Standard-Text, normale Laser, Hologramme, aktiver Schild (HP > 60 %) und UI-Glow.
|
||||
|
||||
|Harvest Green
|
||||
|`#39d353`
|
||||
|Erfolgs-Feedback, gesammelte Ressourcen und Laser-Stufe 2.
|
||||
|
||||
|Amber Gold
|
||||
|`#d29922`
|
||||
|Warnungen, Highscores, wertvolle Materialien, Schild (HP < 60 %) und Laser-Stufe 3.
|
||||
|
||||
|Critical Red
|
||||
|`#f85149`
|
||||
|Lebensgefahr, kritischer Schild (HP < 30 %), Triebwerks-Exhaust und Laser-Stufe 4+.
|
||||
|===
|
||||
|
||||
=== 2.2 Materialfarben (3D-Modelle und 2D-Sprites)
|
||||
|
||||
Für gerenderte 3D-Objekte und gezeichnete 2D-Sprites gelten folgende Materialdefinitionen:
|
||||
|
||||
[cols="1,1,2,2",options="header"]
|
||||
|===
|
||||
|Element
|
||||
|Farbe
|
||||
|3D-Eigenschaften (PBR)
|
||||
|2D-Eigenschaften
|
||||
|
||||
|Maschinen-Hülle
|
||||
|`#1f6feb` (Blau-Metallic)
|
||||
|Roughness: 0.4, Metalness: 0.8
|
||||
|Satte dunkle Blautöne mit hartem weißen Specular-Highlight.
|
||||
|
||||
|Triebwerke / Rohre
|
||||
|`#21262d` (Dunkelgrau)
|
||||
|Roughness: 0.9, Metalness: 1.0
|
||||
|Nahezu schwarze Flächen mit hohem Kontrast.
|
||||
|
||||
|Eis-Asteroid
|
||||
|`#d0e8ff` (Blass-Eisblau)
|
||||
|Roughness: 0.9, Metalness: 0.1
|
||||
|Helle Töne, geringe Schattenbildung, weiße Staubpartikel.
|
||||
|
||||
|Fels-Asteroid
|
||||
|`#6b4a31` (Braun)
|
||||
|Roughness: 1.0, Metalness: 0.1
|
||||
|Matte, strukturierte und körnige Oberflächen.
|
||||
|
||||
|Eisen-Asteroid
|
||||
|`#888899` (Grau/Silber)
|
||||
|Roughness: 0.3, Metalness: 0.9
|
||||
|Spiegelnde Oberflächen mit deutlich sichtbaren Glanzlichtern.
|
||||
|===
|
||||
|
||||
== 3. Gameplay & Mechaniken
|
||||
|
||||
=== 3.1 Das Plasma-Blasen-Paradoxon (Movement)
|
||||
|
||||
. *Lore-Hintergrund:*
|
||||
Das Schiff erzeugt ein Magnetfeld zum Sammeln von Weltraumstaub. Dadurch entsteht eine künstliche Atmosphäre im Vakuum.
|
||||
|
||||
. *Mechanik:*
|
||||
Das Schiff wird aerodynamisch gesteuert. Es fliegt nicht auf festen Schienen, sondern neigt sich beim Steigen und Sinken entlang einer simulierten Roll-/Yaw-Bewegung.
|
||||
|
||||
. *Feedback:*
|
||||
Die Plasma-Blase pulsiert visuell. Mit steigender Schildenergie wächst ihre Größe von 0.6× bis 1.5× der Schiffsausdehnung.
|
||||
|
||||
=== 3.2 Taktisches Power-Routing (Energie-Management)
|
||||
|
||||
Die zentrale Hard-Sci-Fi-Mechanik basiert auf zwei Ressourcen:
|
||||
|
||||
* *Schild (Defensive)*
|
||||
* *Laser / Score (Offensive)*
|
||||
|
||||
Der Spieler kann Energie in Echtzeit zwischen beiden Systemen umverteilen.
|
||||
|
||||
. *Schild laden (Defensive):*
|
||||
Der Spieler opfert Score beziehungsweise Laserstufen, um den Schild wiederherzustellen.
|
||||
|
||||
. *Laser pushen (Offensive):*
|
||||
Energie wird dem Schild entzogen und in die Waffensysteme umgeleitet.
|
||||
|
||||
. *Visuelle Regel:*
|
||||
Dieses Risiko-Belohnungs-System muss in jeder Umsetzung über die Farbskala von `Tech Cyan` bis `Critical Red` dargestellt werden.
|
||||
|
||||
=== 3.3 Asteroiden-Split-Physik & Materialklassen
|
||||
|
||||
Gegnerische Asteroiden teilen sich beim Zerstören in zwei kleinere und schnellere Fragmente.
|
||||
|
||||
. *Eis (Level 1-2):*
|
||||
1× Basis-HP. Schnell, aber äußerst fragil.
|
||||
|
||||
. *Gestein (Level 2-4):*
|
||||
2× Basis-HP. Standardgegner.
|
||||
|
||||
. *Eisen (Level 3-5):*
|
||||
4× Basis-HP. Massive Brocken mit dreifachem Scorewert. Schwache Laser werden vollständig blockiert.
|
||||
|
||||
=== 3.4 Das Cylon-Recovery-System (Game Over / Respawn)
|
||||
|
||||
. *Mechanik:*
|
||||
Es existiert kein endgültiger Tod. Beim Verlust der Hülle wird das Speicherabbild gesichert.
|
||||
|
||||
. *Ablauf:*
|
||||
Das Spiel pausiert.
|
||||
|
||||
Ein Diagnostik-Terminal meldet:
|
||||
|
||||
[source,text]
|
||||
----
|
||||
DIAGNOSTICS
|
||||
Hull Destroyed
|
||||
----
|
||||
|
||||
Ein roter Fortschrittsbalken füllt sich, während das Bewusstsein in eine neue Instanz übertragen wird.
|
||||
|
||||
Der Spieler behält Laser-Level und Langzeitfortschritt, verliert jedoch Zeit sowie laufende Multiplikatoren.
|
||||
|
||||
== 4. Räumliche Komposition (Kamera & Level-Architektur)
|
||||
|
||||
=== 4.1 Der C-Rahmen (Die Maschine)
|
||||
|
||||
. *Konzept:*
|
||||
Der Spieler operiert nicht im leeren Raum. Die linke Bildschirmseite wird von der gewaltigen Hauptmaschine eingenommen.
|
||||
|
||||
. *Layout:*
|
||||
Das Mahlwerk erscheint als massive Struktur im oberen und unteren linken Bildbereich.
|
||||
|
||||
* 3D: Box-Geometry
|
||||
* 2D: Parallax-Layer
|
||||
|
||||
. *Der Korridor:*
|
||||
Die mittlere Zone der linken Bildschirmhälfte bleibt frei und garantiert Sicht auf das Spielgeschehen.
|
||||
|
||||
. *Reaktivität:*
|
||||
Trümmerfragmente werden nach links in den Schlund der Maschine gesaugt.
|
||||
|
||||
Mit zunehmender Materialzufuhr:
|
||||
|
||||
* Rotieren die Häcksler schneller.
|
||||
* Verstärkt sich der Plasma-Halo.
|
||||
* Steigt die visuelle Aktivität der Anlage.
|
||||
|
||||
=== 4.2 UI-Platzierung (HUD)
|
||||
|
||||
Das HUD integriert sich in den physischen C-Rahmen der Maschine.
|
||||
|
||||
. *Oben links:*
|
||||
Schiff-Diagnostik (Schild, Laser, Statuswerte).
|
||||
|
||||
. *Unten links:*
|
||||
Ressourcenanzeige (Punkte, Highscore, Materialzähler).
|
||||
|
||||
. *Ziel:*
|
||||
Die rechte und zentrale Bildhälfte bleiben vollständig für das eigentliche Spielgeschehen reserviert.
|
||||
|
||||
== 5. Technische Struktur (Code-Architektur)
|
||||
|
||||
Für Programmierer definiert die Konfiguration `GAME_CONFIG` die zentrale Wahrheitsquelle.
|
||||
|
||||
Magic Numbers im Quellcode sind nicht zulässig.
|
||||
|
||||
Jede Umsetzung des Spiels muss mindestens folgende Strukturobjekte enthalten:
|
||||
|
||||
. `world`
|
||||
+
|
||||
Konstanten für Scrollgeschwindigkeit, Zeitskalierung und globale Simulation.
|
||||
|
||||
. `player`
|
||||
+
|
||||
Geschwindigkeit, Kollisionsradius und Basiswerte des Spielerschiffs.
|
||||
|
||||
. `laser`
|
||||
+
|
||||
Feuerrate, Schaden und Upgrade-Grenzen (Level 1-5).
|
||||
|
||||
. `asteroidTypes`
|
||||
+
|
||||
Dictionary zur Zuordnung von:
|
||||
|
||||
* Eis
|
||||
* Gestein
|
||||
* Eisen
|
||||
|
||||
mit:
|
||||
|
||||
* HP-Multiplikatoren
|
||||
* Asset-Pfaden
|
||||
* Sprite-Dateien (`.png`)
|
||||
* 3D-Modellen (`.glb`)
|
||||
|
||||
. `levelWaves`
|
||||
+
|
||||
Wahrscheinlichkeitsmatrix zur Definition der Spawn-Verteilung von Asteroidentypen innerhalb der Progression.
|
||||
|
||||
|
||||
=== Zusammenfassung des erstellten Spiels
|
||||
|
||||
. *Achsengerechtes Gameplay (Horizontal Scroll Shmup):*
|
||||
Du navigierst dein Schiff auf der linken Seite des Bildschirms, während Asteroiden aus dem scheinbar unendlichen interstellaren Vakuum auf dich zurasen.
|
||||
|
||||
. *Kombiniertes 3D im Browser:*
|
||||
Sämtliche Raumschiffkomponenten (Düse, Triebwerke, Flügel) sowie die unregelmäßig geformten Asteroiden werden dynamisch per Code in einer 3D-Umgebung erzeugt, gerendert und manipuliert.
|
||||
|
||||
. *Plasma-Blasen-Physik:*
|
||||
Um das Schiff pulsiert ein transparentes Energiefeld, das den in der Lore beschriebenen Strömungswiderstand simuliert und die besondere Flugcharakteristik der Ernte-Instanzen nachvollziehbar macht.
|
||||
|
||||
. *Asteroids-Split-Mechanik:*
|
||||
Große Asteroiden zerbrechen bei Beschuss kinetisch korrekt in zwei kleinere und schnellere Fragmente. Diese müssen wiederum zerstört werden, um wertvolle Rohstoffe zu bergen.
|
||||
|
||||
. *Cylonen-Reboot-System:*
|
||||
Wird die Schiffshülle zerstört, erscheint ein retro-futuristisches Cylon-Interface mit Diagnose- und Transpositionsmeldungen. Anschließend wird das unsterbliche Speicherabbild in ein neues Chassis übertragen.
|
||||
|
||||
. *Web-Audio-Synthesizer:*
|
||||
Sämtliche Soundeffekte werden in Echtzeit synthetisiert. Dazu gehören Laser-Frequenzrampen, tieffrequente Asteroidenexplosionen sowie das charakteristische Aufheulen des Reboot-Vorgangs.
|
||||
@@ -0,0 +1,103 @@
|
||||
# REVERSE GAME DESIGN DOCUMENT (GDD)
|
||||
|
||||
**Projekt:** Maschinen-Instanzen – Asteroiden-Sektor (Project X Tribut)
|
||||
|
||||
**Version:** 1.0.0
|
||||
**Genre:** Hard-Sci-Fi / Retro-Shmup (2.5D)
|
||||
**Setting:** Das „Computer Historyz“-Universum (Sektor: Oortsche Wolke 42)
|
||||
|
||||
## 1. Vision & Kernkonzept
|
||||
|
||||
Ein endloses, horizontales Shoot-'em-up in 2D, das innerhalb einer echten 3D-Umgebung gerendert wird.
|
||||
|
||||
Der Spieler steuert eine kybernetische Ernte-Instanz (Bergbau-Schiff), die am Rand eines gigantischen, planetengroßen Maschinen-Ansaugstutzens operiert.
|
||||
|
||||
Das Spiel kombiniert rasante Arcade-Asteroiden-Zerstörung mit taktischem Power-Routing (Energie-Management) unter harten Hard-Sci-Fi-Rahmenbedingungen.
|
||||
|
||||
## 2. Globale Farbpalette & Ästhetik
|
||||
|
||||
Diese Farbpalette definiert das visuelle Leitbild für alle zukünftigen Spiele in diesem Universum, unabhängig davon, ob sie als Pixel-Art-, Vektor- oder PBR-basierte 3D-Titel umgesetzt werden.
|
||||
|
||||
### 2.1 UI-, HUD- und Terminal-Farben (Window-Maker-Stil)
|
||||
|
||||
Die Benutzeroberfläche basiert auf dem kalten, funktionalen Look klassischer Unix-Terminals, kombiniert mit modernen Glow-Effekten.
|
||||
|
||||
| Farbe | Hex-Code | Semantischer Nutzen |
|
||||
|---------|---------|---------|
|
||||
| Deep Void | `#05070a` | Globaler Weltraum-Hintergrund, tiefste Schatten. |
|
||||
| Terminal Base | `#0d1117` | Hintergrund für Menüs, HUD-Panels und Dialogfenster. |
|
||||
| Panel Border | `#444c56` | Rahmen von UI-Fenstern, häufig kombiniert mit inneren Highlights für 3D-Bevel-Effekte. |
|
||||
| Tech Cyan | `#58a6ff` | Primäre Akzentfarbe. Standard-Text, normale Laser, Hologramme, aktiver Schild (HP > 60 %) und UI-Glow. |
|
||||
| Harvest Green | `#39d353` | Erfolgs-Feedback, gesammelte Ressourcen und Laser-Stufe 2. |
|
||||
| Amber Gold | `#d29922` | Warnungen, Highscores, wertvolle Materialien, Schild (HP < 60 %) und Laser-Stufe 3. |
|
||||
| Critical Red | `#f85149` | Lebensgefahr, kritischer Schild (HP < 30 %), Triebwerks-Exhaust und Laser-Stufe 4+. |
|
||||
|
||||
### 2.2 Materialfarben (3D-Modelle und 2D-Sprites)
|
||||
|
||||
Für gerenderte 3D-Objekte und gezeichnete 2D-Sprites gelten folgende Materialdefinitionen:
|
||||
|
||||
| Element | Farbe | 3D-Eigenschaften (PBR) | 2D-Eigenschaften |
|
||||
|---------|---------|---------|---------|
|
||||
| Maschinen-Hülle | `#1f6feb` (Blau-Metallic) | Roughness: 0.4, Metalness: 0.8 | Satte dunkle Blautöne mit hartem weißen Specular-Highlight |
|
||||
| Triebwerke / Rohre | `#21262d` (Dunkelgrau) | Roughness: 0.9, Metalness: 1.0 | Nahezu schwarze Flächen mit hohem Kontrast |
|
||||
| Eis-Asteroid | `#d0e8ff` (Blass-Eisblau) | Roughness: 0.9, Metalness: 0.1 | Helle Töne, geringe Schattenbildung, weiße Staubpartikel |
|
||||
| Fels-Asteroid | `#6b4a31` (Braun) | Roughness: 1.0, Metalness: 0.1 | Matte, strukturierte und körnige Oberflächen |
|
||||
| Eisen-Asteroid | `#888899` (Grau/Silber) | Roughness: 0.3, Metalness: 0.9 | Spiegelnde Oberflächen mit deutlich sichtbaren Glanzlichtern |
|
||||
|
||||
## 3. Gameplay & Mechaniken
|
||||
|
||||
### 3.1 Das Plasma-Blasen-Paradoxon (Movement)
|
||||
|
||||
1. **Lore-Hintergrund:**
|
||||
Das Schiff erzeugt ein Magnetfeld zum Sammeln von Weltraumstaub. Dadurch entsteht eine künstliche Atmosphäre im Vakuum.
|
||||
|
||||
2. **Mechanik:**
|
||||
Das Schiff wird aerodynamisch gesteuert. Es fliegt nicht auf festen Schienen, sondern neigt sich beim Steigen und Sinken entlang einer simulierten Roll-/Yaw-Bewegung.
|
||||
|
||||
3. **Feedback:**
|
||||
Die Plasma-Blase pulsiert visuell. Mit steigender Schildenergie wächst ihre Größe von 0.6× bis 1.5× der Schiffsausdehnung.
|
||||
|
||||
### 3.2 Taktisches Power-Routing (Energie-Management)
|
||||
|
||||
Die zentrale Hard-Sci-Fi-Mechanik basiert auf zwei Ressourcen:
|
||||
|
||||
- **Schild (Defensive)**
|
||||
- **Laser / Score (Offensive)**
|
||||
|
||||
Der Spieler kann Energie in Echtzeit zwischen beiden Systemen umverteilen.
|
||||
|
||||
1. **Schild laden (Defensive):**
|
||||
Der Spieler opfert Score beziehungsweise Laserstufen, um den Schild wiederherzustellen.
|
||||
|
||||
2. **Laser pushen (Offensive):**
|
||||
Energie wird dem Schild entzogen und in die Waffensysteme umgeleitet.
|
||||
|
||||
3. **Visuelle Regel:**
|
||||
Dieses Risiko-Belohnungs-System muss in jeder Umsetzung über die Farbskala von `Tech Cyan` bis `Critical Red` dargestellt werden.
|
||||
|
||||
### 3.3 Asteroiden-Split-Physik & Materialklassen
|
||||
|
||||
Gegnerische Asteroiden teilen sich beim Zerstören in zwei kleinere und schnellere Fragmente.
|
||||
|
||||
1. **Eis (Level 1-2):**
|
||||
1× Basis-HP. Schnell, aber äußerst fragil.
|
||||
|
||||
2. **Gestein (Level 2-4):**
|
||||
2× Basis-HP. Standardgegner.
|
||||
|
||||
3. **Eisen (Level 3-5):**
|
||||
4× Basis-HP. Massive Brocken mit dreifachem Scorewert. Schwache Laser werden vollständig blockiert.
|
||||
|
||||
### 3.4 Das Cylon-Recovery-System (Game Over / Respawn)
|
||||
|
||||
1. **Mechanik:**
|
||||
Es existiert kein endgültiger Tod. Beim Verlust der Hülle wird das Speicherabbild gesichert.
|
||||
|
||||
2. **Ablauf:**
|
||||
Das Spiel pausiert.
|
||||
|
||||
Ein Diagnostik-Terminal meldet:
|
||||
|
||||
```text
|
||||
DIAGNOSTICS
|
||||
Hull Destroyed
|
||||
@@ -0,0 +1,20 @@
|
||||
FROM debian:trixie-slim
|
||||
|
||||
# Asciidoctor installieren und apt-Cache sofort wieder leeren, um das Image klein zu halten
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends asciidoctor && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN groupadd --gid 1000 flammenderberg && \
|
||||
useradd --uid 1000 --gid flammenderberg --shell /bin/bash --create-home hexenmeister
|
||||
|
||||
WORKDIR /weltraum
|
||||
RUN mkdir stories && mkdir export && mkdir frontend
|
||||
COPY ./cyoa-engine ./
|
||||
COPY ./frontend ./frontend/
|
||||
|
||||
RUN chown -R hexenmeister:flammenderberg /weltraum
|
||||
|
||||
EXPOSE 3344
|
||||
|
||||
CMD ["/weltraum/cyoa-engine", "dir ./stories/", "serve", "port 3344"]
|
||||
Executable
+20
@@ -0,0 +1,20 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
|
||||
# baue das go backend
|
||||
|
||||
echo " ### Cast the caldron into a mold"
|
||||
go build -x -o cyoa-engine main.go
|
||||
echo -e
|
||||
|
||||
# baue das docker image für die welt
|
||||
|
||||
echo " ### create Firetop Mountain"
|
||||
docker build -t asciidoctor-echo -f Dockerfile.echobox .
|
||||
echo -e
|
||||
|
||||
# starte den docker container
|
||||
|
||||
echo " ### der hexenmeister zum flammenden berg"
|
||||
docker run --rm -v "$(pwd)/stories:/weltraum/stories" -v "$(pwd)/export:/weltraum/export" -p "6699:3344" asciidoctor-echo ./cyoa-engine -dir ./stories/ -serve -port 3344
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
// engine_logic.js - Reine State- und Datenverarbeitung (Kein UI, Kein Fetch)
|
||||
const EngineLogic = {
|
||||
storyData: { nodes: {} },
|
||||
state: { reboots: 1, node: "" },
|
||||
|
||||
init: function(dataObj) {
|
||||
if (!dataObj || !dataObj.nodes || Object.keys(dataObj.nodes).length === 0) {
|
||||
console.warn("[System] Ungültige Graph-Daten. Fallback geladen.");
|
||||
this.storyData = {
|
||||
startNodeId: "err",
|
||||
nodes: {
|
||||
"err": {
|
||||
id: "err", title: "SYSTEM OFFLINE",
|
||||
content: "<p>Konnte <code>graph.json</code> nicht laden.</p>",
|
||||
choices: [],
|
||||
metadata: { status: "offline" }
|
||||
}
|
||||
}
|
||||
};
|
||||
} else {
|
||||
this.storyData = dataObj;
|
||||
}
|
||||
|
||||
this.state.node = this.storyData.startNodeId || Object.keys(this.storyData.nodes)[0] || "";
|
||||
},
|
||||
|
||||
getNode: function(id) { return this.storyData.nodes[id]; },
|
||||
|
||||
processNodeEntry: function(id) {
|
||||
const node = this.getNode(id);
|
||||
if (!node) return null;
|
||||
|
||||
this.state.node = id;
|
||||
|
||||
if (node.metadata) {
|
||||
Object.keys(node.metadata).forEach(key => {
|
||||
this.state[key] = node.metadata[key];
|
||||
});
|
||||
}
|
||||
|
||||
if (node.isReboot) this.state.reboots++;
|
||||
return node;
|
||||
},
|
||||
|
||||
parseRequirement: function(choiceText) {
|
||||
let conditionMatch = choiceText.match(/\[req:\s*([a-zA-Z0-9_]+)\s*=\s*([^\]]+)\]/i);
|
||||
let displayText = choiceText;
|
||||
let meetsCondition = true;
|
||||
let missingReq = "";
|
||||
|
||||
if (conditionMatch) {
|
||||
let reqKey = conditionMatch[1].toLowerCase();
|
||||
let reqVal = conditionMatch[2];
|
||||
if (String(this.state[reqKey]) !== String(reqVal)) {
|
||||
meetsCondition = false;
|
||||
missingReq = `(Benötigt: ${reqKey}=${reqVal})`;
|
||||
}
|
||||
displayText = displayText.replace(conditionMatch[0], "").trim();
|
||||
}
|
||||
|
||||
return { displayText, meetsCondition, missingReq };
|
||||
},
|
||||
|
||||
triggerReboot: function() {
|
||||
const currentReboots = this.state.reboots + 1;
|
||||
this.state = { reboots: currentReboots };
|
||||
return this.storyData.startNodeId;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,185 @@
|
||||
// engine_ui.js - Statisches Rendering & asynchrones Nachladen der graph.json
|
||||
const EngineUI = {
|
||||
audioCtx: null,
|
||||
|
||||
init: async function() {
|
||||
const AudioContext = window.AudioContext || window.webkitAudioContext;
|
||||
if(AudioContext) this.audioCtx = new AudioContext();
|
||||
|
||||
// 1. Asynchroner Fetch der graph.json
|
||||
// (Im Dev-Modus liefert Go dies on-the-fly, im Export-Modus ist es eine Datei)
|
||||
try {
|
||||
const response = await fetch('graph.json', { cache: "no-store" });
|
||||
if (!response.ok) throw new Error("HTTP Fehler " + response.status);
|
||||
const graphData = await response.json();
|
||||
|
||||
// 2. Initialisiere die gekapselte Logik mit den frisch geladenen Daten
|
||||
EngineLogic.init(graphData);
|
||||
} catch (err) {
|
||||
console.error("Fehler beim Abrufen der graph.json:", err);
|
||||
EngineLogic.init(null);
|
||||
}
|
||||
|
||||
this.attachEvents();
|
||||
this.renderNode(EngineLogic.state.node);
|
||||
},
|
||||
|
||||
playBeep: function(freq = 440, type = "square", duration = 0.05) {
|
||||
try {
|
||||
if(!this.audioCtx) return;
|
||||
const osc = this.audioCtx.createOscillator();
|
||||
const gain = this.audioCtx.createGain();
|
||||
osc.type = type;
|
||||
osc.frequency.setValueAtTime(freq, this.audioCtx.currentTime);
|
||||
gain.gain.setValueAtTime(0.05, this.audioCtx.currentTime);
|
||||
gain.gain.exponentialRampToValueAtTime(0.001, this.audioCtx.currentTime + duration);
|
||||
osc.connect(gain); gain.connect(this.audioCtx.destination);
|
||||
osc.start(); osc.stop(this.audioCtx.currentTime + duration);
|
||||
} catch(e) {}
|
||||
},
|
||||
|
||||
renderHUD: function() {
|
||||
const hud = document.getElementById("hud-dynamic");
|
||||
hud.innerHTML = "";
|
||||
|
||||
hud.innerHTML += `<div class="stat-item">REBOOTS: <span style="color:var(--term-cyan)">#${String(EngineLogic.state.reboots).padStart(3, "0")}</span></div>`;
|
||||
hud.innerHTML += `<div class="stat-item">KNOTEN: <span style="color:var(--term-amber)">${EngineLogic.state.node}</span></div>`;
|
||||
|
||||
Object.keys(EngineLogic.state).forEach(key => {
|
||||
if(key !== "reboots" && key !== "node") {
|
||||
hud.innerHTML += `<div class="stat-item">${key.toUpperCase()}: <span style="color:var(--term-green)">${EngineLogic.state[key]}</span></div>`;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
renderNode: function(id) {
|
||||
const node = EngineLogic.processNodeEntry(id);
|
||||
if (!node) return;
|
||||
|
||||
this.playBeep(600, "sine", 0.04);
|
||||
if (node.isReboot) this.playBeep(200, "sawtooth", 0.3);
|
||||
|
||||
this.renderHUD();
|
||||
|
||||
document.getElementById("node-title").innerText = "=== " + node.title + " ===";
|
||||
document.getElementById("node-body").innerHTML = node.content;
|
||||
|
||||
const choicesBox = document.getElementById("choices-box");
|
||||
choicesBox.innerHTML = "";
|
||||
|
||||
if (node.choices && node.choices.length > 0) {
|
||||
let visibleIndex = 1;
|
||||
node.choices.forEach((choice) => {
|
||||
const parsed = EngineLogic.parseRequirement(choice.text);
|
||||
const btn = document.createElement("button");
|
||||
btn.className = "choice-btn";
|
||||
|
||||
if (parsed.meetsCondition) {
|
||||
btn.innerHTML = `<span class="choice-key">[${visibleIndex}]</span> ${parsed.displayText}`;
|
||||
btn.dataset.target = choice.targetId;
|
||||
btn.dataset.index = visibleIndex;
|
||||
btn.onclick = () => this.renderNode(choice.targetId);
|
||||
visibleIndex++;
|
||||
} else {
|
||||
btn.innerHTML = `<span class="choice-key">[LOCKED]</span> ${parsed.displayText} <span style="color:var(--term-warn); font-size:0.8rem; margin-left:auto;">${parsed.missingReq}</span>`;
|
||||
btn.disabled = true;
|
||||
}
|
||||
choicesBox.appendChild(btn);
|
||||
});
|
||||
} else {
|
||||
const btn = document.createElement("button");
|
||||
btn.className = "choice-btn";
|
||||
btn.style.borderColor = "var(--term-amber)";
|
||||
btn.style.color = "var(--term-amber)";
|
||||
btn.innerHTML = "<span class=\"choice-key\">[R]</span> Speicherabbild sichern und rebooten...";
|
||||
btn.onclick = () => this.triggerReboot();
|
||||
choicesBox.appendChild(btn);
|
||||
}
|
||||
document.getElementById("terminal-viewport").scrollTop = 0;
|
||||
},
|
||||
|
||||
triggerReboot: function() {
|
||||
const startId = EngineLogic.triggerReboot();
|
||||
if (startId) this.renderNode(startId);
|
||||
},
|
||||
|
||||
toggleGraph: function() {
|
||||
const modal = document.getElementById("graph-modal");
|
||||
if (modal.style.display === "flex") {
|
||||
modal.style.display = "none";
|
||||
} else {
|
||||
modal.style.display = "flex";
|
||||
this.drawGraphCanvas();
|
||||
}
|
||||
},
|
||||
|
||||
drawGraphCanvas: function() {
|
||||
const canvas = document.getElementById("graph-canvas");
|
||||
canvas.width = canvas.clientWidth; canvas.height = canvas.clientHeight;
|
||||
const ctx = canvas.getContext("2d");
|
||||
ctx.fillStyle = "#000"; ctx.fillRect(0, 0, canvas.width, canvas.height);
|
||||
|
||||
const keys = Object.keys(EngineLogic.storyData.nodes || {});
|
||||
if (keys.length === 0) return;
|
||||
|
||||
const total = keys.length; const radius = Math.min(canvas.width, canvas.height) * 0.38;
|
||||
const centerX = canvas.width / 2; const centerY = canvas.height / 2;
|
||||
const nodeRadius = 8; const positions = {};
|
||||
|
||||
keys.forEach((key, idx) => {
|
||||
const angle = (idx / total) * 2 * Math.PI;
|
||||
positions[key] = { x: centerX + radius * Math.cos(angle), y: centerY + radius * Math.sin(angle) };
|
||||
});
|
||||
|
||||
ctx.lineWidth = 1;
|
||||
keys.forEach(key => {
|
||||
const node = EngineLogic.storyData.nodes[key];
|
||||
if (node && node.choices) {
|
||||
node.choices.forEach(c => {
|
||||
if (positions[c.targetId]) {
|
||||
const start = positions[key], end = positions[c.targetId];
|
||||
ctx.beginPath(); ctx.strokeStyle = "rgba(51, 255, 102, 0.4)";
|
||||
ctx.moveTo(start.x, start.y); ctx.lineTo(end.x, end.y); ctx.stroke();
|
||||
const dx = end.x - start.x, dy = end.y - start.y, angle = Math.atan2(dy, dx), headlen = 12;
|
||||
const tipX = end.x - Math.cos(angle) * (nodeRadius + 2), tipY = end.y - Math.sin(angle) * (nodeRadius + 2);
|
||||
ctx.beginPath(); ctx.moveTo(tipX, tipY);
|
||||
ctx.lineTo(tipX - headlen * Math.cos(angle - Math.PI / 7), tipY - headlen * Math.sin(angle - Math.PI / 7));
|
||||
ctx.lineTo(tipX - headlen * Math.cos(angle + Math.PI / 7), tipY - headlen * Math.sin(angle + Math.PI / 7));
|
||||
ctx.closePath(); ctx.fillStyle = "rgba(51, 255, 102, 0.9)"; ctx.fill();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
keys.forEach(key => {
|
||||
const pos = positions[key];
|
||||
ctx.beginPath(); ctx.arc(pos.x, pos.y, nodeRadius, 0, 2 * Math.PI);
|
||||
if (key === EngineLogic.state.node) ctx.fillStyle = "#00ffff";
|
||||
else if (key === EngineLogic.storyData.startNodeId) ctx.fillStyle = "#ffb000";
|
||||
else ctx.fillStyle = "#116633";
|
||||
ctx.fill(); ctx.strokeStyle = "#33ff66"; ctx.stroke();
|
||||
ctx.fillStyle = "#fff"; ctx.font = "11px monospace";
|
||||
const textAngle = Math.atan2(pos.y - centerY, pos.x - centerX);
|
||||
ctx.fillText(key, pos.x + Math.cos(textAngle) * 15 - 10, pos.y + Math.sin(textAngle) * 15 + 4);
|
||||
});
|
||||
},
|
||||
|
||||
attachEvents: function() {
|
||||
window.addEventListener("keydown", (e) => {
|
||||
if (document.getElementById("graph-modal").style.display === "flex") {
|
||||
if (e.key.toLowerCase() === "g" || e.key === "Escape") this.toggleGraph();
|
||||
return;
|
||||
}
|
||||
if (e.key >= "1" && e.key <= "9") {
|
||||
const btn = document.querySelector(`.choice-btn[data-index="${e.key}"]`);
|
||||
if (btn && !btn.disabled) this.renderNode(btn.dataset.target);
|
||||
} else if (e.key.toLowerCase() === "r") {
|
||||
this.triggerReboot();
|
||||
} else if (e.key.toLowerCase() === "g") {
|
||||
this.toggleGraph();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
window.onload = () => EngineUI.init();
|
||||
@@ -0,0 +1,43 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Computer Historyz :: Interactive Terminal Engine</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<div class="sys-title">[COMPUTER HISTORYZ :: INSTANZ_TERMINAL]</div>
|
||||
<div class="hud-stats" id="hud-dynamic"></div>
|
||||
</header>
|
||||
|
||||
<main id="terminal-viewport">
|
||||
<div class="node-card">
|
||||
<div id="node-title" class="node-title">System Initialisierung...</div>
|
||||
<div id="node-body" class="node-body">Verbinde mit Datenstrom...</div>
|
||||
<div id="choices-box" class="choices-container"></div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<div>[HOTKEYS: 1-9 Auswahl | R Reboot | G Graph]</div>
|
||||
<div>
|
||||
<button class="btn-small" onclick="EngineUI.toggleGraph()">[G] KNOTEN-GRAPH</button>
|
||||
<button class="btn-small" onclick="EngineUI.triggerReboot()">[R] REBOOT / RESET</button>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<div id="graph-modal">
|
||||
<div style="display:flex; justify-content:space-between; margin-bottom:15px;">
|
||||
<span style="color:var(--term-cyan)">=== INTERAKTIVER VORHERSAGE-GRAPH ===</span>
|
||||
<button class="btn-small" onclick="EngineUI.toggleGraph()">[X] SCHLIESSEN</button>
|
||||
</div>
|
||||
<canvas id="graph-canvas"></canvas>
|
||||
</div>
|
||||
|
||||
<!-- Vollständige Trennung: Eigene Dateien statt Injektion -->
|
||||
<script src="engine_logic.js"></script>
|
||||
<script src="engine_ui.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,69 @@
|
||||
:root {
|
||||
--bg-color: #050b08;
|
||||
--term-green: #33ff66;
|
||||
--term-dim: #116633;
|
||||
--term-cyan: #00ffff;
|
||||
--term-warn: #ff3333;
|
||||
--term-amber: #ffb000;
|
||||
--font-stack: 'Courier New', Courier, monospace;
|
||||
}
|
||||
|
||||
* { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
body {
|
||||
background-color: var(--bg-color); color: var(--term-green);
|
||||
font-family: var(--font-stack); height: 100vh; display: flex;
|
||||
flex-direction: column; overflow: hidden; text-shadow: 0 0 4px rgba(51, 255, 102, 0.6);
|
||||
}
|
||||
|
||||
body::before {
|
||||
content: " "; display: block; position: absolute;
|
||||
top: 0; left: 0; bottom: 0; right: 0;
|
||||
background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.25) 50%), linear-gradient(90deg, rgba(255, 0, 0, 0.06), rgba(0, 255, 0, 0.02), rgba(0, 0, 255, 0.06));
|
||||
z-index: 10; background-size: 100% 3px, 3px 100%; pointer-events: none;
|
||||
}
|
||||
|
||||
header { background: #111; border-bottom: 2px solid var(--term-green); padding: 8px 16px; display: flex; justify-content: space-between; align-items: center; font-size: 0.9rem; }
|
||||
.sys-title { color: var(--term-cyan); font-weight: bold; letter-spacing: 1px; }
|
||||
|
||||
.hud-stats { display: flex; gap: 15px; font-size: 0.85rem; flex-wrap: wrap; }
|
||||
.stat-item { border: 1px solid var(--term-dim); padding: 2px 8px; background: rgba(0, 20, 10, 0.5); }
|
||||
|
||||
main { flex: 1; display: flex; flex-direction: column; padding: 20px; max-width: 900px; margin: 0 auto; width: 100%; overflow-y: auto; position: relative; z-index: 1; }
|
||||
.node-card { border: 1px solid var(--term-dim); background: rgba(5, 15, 10, 0.85); padding: 20px; margin-bottom: 20px; box-shadow: 0 0 15px rgba(0, 255, 102, 0.1); }
|
||||
.node-title { font-size: 1.3rem; color: var(--term-cyan); border-bottom: 1px dashed var(--term-dim); padding-bottom: 8px; margin-bottom: 15px; text-transform: uppercase; }
|
||||
|
||||
/* ASCIIDOCTOR HTML STYLING */
|
||||
.node-body { line-height: 1.6; font-size: 1rem; margin-bottom: 20px; }
|
||||
.node-body p { margin-bottom: 15px; }
|
||||
.node-body strong, .node-body b { color: var(--term-cyan); font-weight: normal; text-shadow: 0 0 5px rgba(0, 255, 255, 0.4); }
|
||||
.node-body em, .node-body i { color: var(--term-amber); font-style: italic; }
|
||||
.node-body ul, .node-body ol { margin-left: 25px; margin-bottom: 15px; list-style-type: square; }
|
||||
.node-body li { margin-bottom: 5px; }
|
||||
.node-body h1, .node-body h2, .node-body h3, .node-body h4 { color: var(--term-cyan); margin: 20px 0 10px 0; border-bottom: 1px solid var(--term-dim); padding-bottom: 5px; }
|
||||
.node-body code { background: rgba(0, 255, 102, 0.1); padding: 2px 5px; border-radius: 3px; font-family: var(--font-stack); }
|
||||
.node-body pre { background: rgba(0, 20, 10, 0.8); border-left: 3px solid var(--term-dim); padding: 10px; overflow-x: auto; margin-bottom: 15px; }
|
||||
.node-body table { width: 100%; border-collapse: collapse; margin-bottom: 15px; }
|
||||
.node-body th, .node-body td { border: 1px solid var(--term-dim); padding: 8px; text-align: left; }
|
||||
.node-body th { background: rgba(0, 255, 102, 0.1); color: var(--term-cyan); }
|
||||
|
||||
.choices-container { display: flex; flex-direction: column; gap: 10px; margin-top: 15px; }
|
||||
.choice-btn {
|
||||
background: rgba(0, 30, 15, 0.6); border: 1px solid var(--term-green);
|
||||
color: var(--term-green); padding: 12px 16px; font-family: var(--font-stack);
|
||||
font-size: 0.95rem; text-align: left; cursor: pointer;
|
||||
transition: all 0.15s ease; display: flex; align-items: center; gap: 10px;
|
||||
}
|
||||
.choice-btn:hover:not(:disabled) { background: var(--term-green); color: var(--bg-color); box-shadow: 0 0 10px var(--term-green); outline: none; }
|
||||
.choice-btn:disabled { border-color: var(--term-warn); color: var(--term-warn); cursor: not-allowed; opacity: 0.6; }
|
||||
|
||||
.choice-key { background: var(--term-dim); color: var(--term-green); padding: 2px 6px; font-size: 0.8rem; border-radius: 2px; }
|
||||
.choice-btn:hover:not(:disabled) .choice-key { background: var(--bg-color); color: var(--term-green); }
|
||||
.choice-btn:disabled .choice-key { background: rgba(255, 51, 51, 0.2); color: var(--term-warn); }
|
||||
|
||||
footer { border-top: 1px solid var(--term-dim); padding: 10px 20px; display: flex; justify-content: space-between; background: #080f0c; font-size: 0.8rem; z-index: 2; }
|
||||
.btn-small { background: transparent; border: 1px solid var(--term-dim); color: var(--term-green); padding: 4px 10px; cursor: pointer; font-family: var(--font-stack); }
|
||||
.btn-small:hover { border-color: var(--term-cyan); color: var(--term-cyan); }
|
||||
|
||||
#graph-modal { display: none; position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(5, 11, 8, 0.95); z-index: 20; padding: 20px; flex-direction: column; }
|
||||
#graph-canvas { flex: 1; border: 1px solid var(--term-green); background: #000; }
|
||||
@@ -0,0 +1,20 @@
|
||||
#nur einmal
|
||||
go mod init cyoa
|
||||
|
||||
# kompilieren
|
||||
go build -o cyoa-engine main.go
|
||||
|
||||
# Ausführen & Validieren:
|
||||
./cyoa-engine -dir ./stories -out export/story.html
|
||||
|
||||
./cyoa-engine -dir ./stories -serve -port 8080
|
||||
# Wenn du jetzt in Neovim Dateien abspeicherst oder neue `[[node_id]]`-Knoten anlegst, musst du im
|
||||
# Browser nur `http://localhost:8080` aufrufen und siehst sofort deine Änderungen inkl. vollständiger Link-Prüfung!
|
||||
|
||||
# baue das docker image
|
||||
|
||||
docker build -t asciidoctor-echo -f Dockerfile.echobox .
|
||||
|
||||
|
||||
# run with test volumes
|
||||
docker run --rm -v "$(pwd)/stories:/weltraum/stories" -v "$(pwd)/export:/weltraum/export" -p "6699:3344" asciidoctor-echo ./cyoa-engine -dir ./stories/ -serve -port 3344
|
||||
@@ -0,0 +1,3 @@
|
||||
module cyoa
|
||||
|
||||
go 1.26.5
|
||||
@@ -0,0 +1,239 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Choice struct {
|
||||
TargetID string `json:"targetId"`
|
||||
Text string `json:"text"`
|
||||
}
|
||||
|
||||
type StoryNode struct {
|
||||
ID string `json:"id"`
|
||||
Title string `json:"title"`
|
||||
Content string `json:"content"`
|
||||
Choices []Choice `json:"choices"`
|
||||
IsReboot bool `json:"isReboot"`
|
||||
IsEnd bool `json:"isEnd"`
|
||||
FileSource string `json:"fileSource"`
|
||||
Metadata map[string]string `json:"metadata"`
|
||||
}
|
||||
|
||||
type StoryGraph struct {
|
||||
Nodes map[string]*StoryNode `json:"nodes"`
|
||||
StartNodeID string `json:"startNodeId"`
|
||||
BrokenLinks []string `json:"brokenLinks"`
|
||||
OrphanNodes []string `json:"orphanNodes"`
|
||||
DeadEndNodes []string `json:"deadEndNodes"`
|
||||
}
|
||||
|
||||
var (
|
||||
adocNodeRegex = regexp.MustCompile(`\[\[([a-zA-Z0-9_\-]+)\]\]`)
|
||||
adocChoiceRegex = regexp.MustCompile(`<<([a-zA-Z0-9_\-]+)\s*,\s*([^>]+)>>`)
|
||||
mdChoiceRegex = regexp.MustCompile(`\[([^\]]+)\]\((?:#)?([a-zA-Z0-9_\-]+)\)`)
|
||||
headingRegex = regexp.MustCompile(`^(?:={1,4}|#{1,4})\s+(.+)`)
|
||||
metaRegex = regexp.MustCompile(`(?i)\[meta:\s*([a-zA-Z0-9_]+)\s*=\s*([^\]]+)\]`)
|
||||
)
|
||||
|
||||
func main() {
|
||||
dirPtr := flag.String("dir", "./stories", "Verzeichnis mit AsciiDoc/Markdown Dateien")
|
||||
frontendPtr := flag.String("frontend", "./frontend", "Pfad zum Verzeichnis der statischen Frontend-Dateien")
|
||||
outPtr := flag.String("out", "export", "Ziel-Ordner für den Dateiexport (SSG Modus)")
|
||||
servePtr := flag.Bool("serve", false, "Startet den Live-Preview-Server (API Modus)")
|
||||
portPtr := flag.Int("port", 3344, "Port für den Server")
|
||||
flag.Parse()
|
||||
|
||||
fmt.Println("\033[1;36m=== Computer Historyz :: CYOA SSG & API ===\033[0m")
|
||||
|
||||
if info, err := os.Stat(*frontendPtr); os.IsNotExist(err) || !info.IsDir() {
|
||||
fmt.Printf("\033[1;33m[WARNUNG]\033[0m Frontend-Verzeichnis '%s' nicht gefunden!\n", *frontendPtr)
|
||||
}
|
||||
|
||||
if *servePtr {
|
||||
startServer(*portPtr, *dirPtr, *frontendPtr)
|
||||
return
|
||||
}
|
||||
|
||||
// --- EXPORT MODUS (Static Site Generation) ---
|
||||
fmt.Printf("\033[1;34m[EXPORT]\033[0m Kompiliere Story-Graph via Asciidoctor...\n")
|
||||
graph := loadStoryGraphFromDir(*dirPtr)
|
||||
validateGraph(graph)
|
||||
|
||||
// Export Ordner anlegen
|
||||
os.MkdirAll(*outPtr, 0755)
|
||||
|
||||
// 1. Statische Daten als JSON schreiben
|
||||
graphPath := filepath.Join(*outPtr, "graph.json")
|
||||
graphJson, _ := json.MarshalIndent(graph, "", " ")
|
||||
os.WriteFile(graphPath, graphJson, 0644)
|
||||
|
||||
// 2. Frontend-Dateien 1:1 kopieren
|
||||
copyFile(filepath.Join(*frontendPtr, "index.html"), filepath.Join(*outPtr, "index.html"))
|
||||
copyFile(filepath.Join(*frontendPtr, "style.css"), filepath.Join(*outPtr, "style.css"))
|
||||
copyFile(filepath.Join(*frontendPtr, "engine_logic.js"), filepath.Join(*outPtr, "engine_logic.js"))
|
||||
copyFile(filepath.Join(*frontendPtr, "engine_ui.js"), filepath.Join(*outPtr, "engine_ui.js"))
|
||||
|
||||
fmt.Printf("\033[1;32m[ERFOLG]\033[0m Web-App erfolgreich exportiert nach -> \033[1;33m%s/\033[0m\n", *outPtr)
|
||||
}
|
||||
|
||||
func copyFile(src, dst string) {
|
||||
input, err := os.ReadFile(src)
|
||||
if err != nil {
|
||||
fmt.Printf("\033[1;33m[WARNUNG]\033[0m Frontend-Datei %s fehlt.\n", src)
|
||||
return
|
||||
}
|
||||
os.WriteFile(dst, input, 0644)
|
||||
}
|
||||
|
||||
func startServer(port int, watchDir string, frontendDir string) {
|
||||
addr := fmt.Sprintf(":%d", port)
|
||||
fmt.Printf("\n\033[1;32m[SERVER LÄUFT]\033[0m http://localhost:%d\n", port)
|
||||
|
||||
// Dynamischer API-Endpunkt für graph.json
|
||||
http.HandleFunc("/graph.json", func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
|
||||
var graph *StoryGraph
|
||||
if r.Method == http.MethodPost {
|
||||
bodyBytes, _ := io.ReadAll(r.Body)
|
||||
graph = &StoryGraph{Nodes: make(map[string]*StoryNode)}
|
||||
parseContent(string(bodyBytes), "API_POST_Stream", graph)
|
||||
} else {
|
||||
graph = loadStoryGraphFromDir(watchDir)
|
||||
}
|
||||
validateGraph(graph)
|
||||
json.NewEncoder(w).Encode(graph)
|
||||
})
|
||||
|
||||
// Liefert alles andere aus dem /frontend Ordner
|
||||
fs := http.FileServer(http.Dir(frontendDir))
|
||||
http.Handle("/", fs)
|
||||
|
||||
if err := http.ListenAndServe(addr, nil); err != nil {
|
||||
fmt.Printf("\033[1;31m[FEHLER]\033[0m %v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
// renderAsciidoctor piped rohen AsciiDoc Text in den lokalen Container-Prozess
|
||||
func renderAsciidoctor(text string) string {
|
||||
if strings.TrimSpace(text) == "" {
|
||||
return ""
|
||||
}
|
||||
cmd := exec.Command("asciidoctor", "--embedded", "-")
|
||||
cmd.Stdin = strings.NewReader(text)
|
||||
out, err := cmd.Output()
|
||||
if err != nil {
|
||||
fmt.Printf("\033[1;33m[WARNUNG]\033[0m Asciidoctor Rendering fehlgeschlagen: %v\n", err)
|
||||
return strings.ReplaceAll(text, "\n", "<br>")
|
||||
}
|
||||
return string(out)
|
||||
}
|
||||
|
||||
func cleanBodyText(raw string) string {
|
||||
cleaned := adocChoiceRegex.ReplaceAllString(raw, "")
|
||||
cleaned = mdChoiceRegex.ReplaceAllString(cleaned, "")
|
||||
return strings.TrimSpace(cleaned)
|
||||
}
|
||||
|
||||
func parseContent(rawContent string, sourceName string, graph *StoryGraph) {
|
||||
lines := strings.Split(rawContent, "\n")
|
||||
var currentNode *StoryNode = nil
|
||||
var currentBody strings.Builder
|
||||
|
||||
for _, line := range lines {
|
||||
if matches := adocNodeRegex.FindStringSubmatch(line); len(matches) > 1 {
|
||||
if currentNode != nil {
|
||||
currentNode.Content = renderAsciidoctor(cleanBodyText(currentBody.String()))
|
||||
graph.Nodes[currentNode.ID] = currentNode
|
||||
currentBody.Reset()
|
||||
}
|
||||
nodeID := matches[1]
|
||||
currentNode = &StoryNode{ ID: nodeID, Title: nodeID, Choices: make([]Choice, 0), FileSource: sourceName, Metadata: make(map[string]string) }
|
||||
if graph.StartNodeID == "" || nodeID == "start" || nodeID == "node_start" { graph.StartNodeID = nodeID }
|
||||
continue
|
||||
}
|
||||
|
||||
if currentNode == nil {
|
||||
if strings.TrimSpace(line) != "" {
|
||||
baseID := "start"
|
||||
if sourceName != "API_POST_Stream" { baseID = strings.TrimSuffix(filepath.Base(sourceName), filepath.Ext(sourceName)) }
|
||||
currentNode = &StoryNode{ ID: baseID, Title: baseID, Choices: make([]Choice, 0), FileSource: sourceName, Metadata: make(map[string]string) }
|
||||
if graph.StartNodeID == "" { graph.StartNodeID = baseID }
|
||||
} else { continue }
|
||||
}
|
||||
|
||||
if mMatches := metaRegex.FindStringSubmatch(line); len(mMatches) > 2 {
|
||||
currentNode.Metadata[strings.ToLower(mMatches[1])] = strings.TrimSpace(mMatches[2])
|
||||
continue
|
||||
}
|
||||
|
||||
if hMatches := headingRegex.FindStringSubmatch(line); len(hMatches) > 1 && currentNode.Title == currentNode.ID {
|
||||
currentNode.Title = strings.TrimSpace(hMatches[1])
|
||||
}
|
||||
|
||||
if cMatches := adocChoiceRegex.FindAllStringSubmatch(line, -1); len(cMatches) > 0 {
|
||||
for _, match := range cMatches { currentNode.Choices = append(currentNode.Choices, Choice{TargetID: match[1], Text: strings.TrimSpace(match[2])}) }
|
||||
}
|
||||
|
||||
if mMatches := mdChoiceRegex.FindAllStringSubmatch(line, -1); len(mMatches) > 0 {
|
||||
for _, match := range mMatches { currentNode.Choices = append(currentNode.Choices, Choice{TargetID: match[2], Text: strings.TrimSpace(match[1])}) }
|
||||
}
|
||||
|
||||
lowerLine := strings.ToLower(line)
|
||||
if strings.Contains(lowerLine, "[reboot]") || strings.Contains(lowerLine, "speicherabbild") { currentNode.IsReboot = true }
|
||||
if strings.Contains(lowerLine, "[ende]") || strings.Contains(lowerLine, "[end]") { currentNode.IsEnd = true }
|
||||
|
||||
currentBody.WriteString(line + "\n")
|
||||
}
|
||||
|
||||
if currentNode != nil {
|
||||
currentNode.Content = renderAsciidoctor(cleanBodyText(currentBody.String()))
|
||||
graph.Nodes[currentNode.ID] = currentNode
|
||||
}
|
||||
}
|
||||
|
||||
func loadStoryGraphFromDir(rootDir string) *StoryGraph {
|
||||
graph := &StoryGraph{Nodes: make(map[string]*StoryNode)}
|
||||
filepath.Walk(rootDir, func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil || info.IsDir() { return nil }
|
||||
ext := strings.ToLower(filepath.Ext(path))
|
||||
if ext != ".adoc" && ext != ".md" { return nil }
|
||||
contentBytes, err := os.ReadFile(path)
|
||||
if err == nil {
|
||||
relPath, _ := filepath.Rel(rootDir, path)
|
||||
parseContent(string(contentBytes), relPath, graph)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return graph
|
||||
}
|
||||
|
||||
func validateGraph(g *StoryGraph) {
|
||||
referenced := make(map[string]bool)
|
||||
if g.StartNodeID != "" { referenced[g.StartNodeID] = true }
|
||||
for id, node := range g.Nodes {
|
||||
for _, choice := range node.Choices {
|
||||
referenced[choice.TargetID] = true
|
||||
if _, exists := g.Nodes[choice.TargetID]; !exists {
|
||||
g.BrokenLinks = append(g.BrokenLinks, fmt.Sprintf("%s -> %s (in %s)", id, choice.TargetID, node.FileSource))
|
||||
}
|
||||
}
|
||||
if len(node.Choices) == 0 && !node.IsReboot && !node.IsEnd {
|
||||
g.DeadEndNodes = append(g.DeadEndNodes, id)
|
||||
}
|
||||
}
|
||||
for id := range g.Nodes {
|
||||
if !referenced[id] { g.OrphanNodes = append(g.OrphanNodes, id) }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
[[funk]]
|
||||
# Konfiguration: Komunijation wieder herstellen
|
||||
|
||||
#### Systemmeldung
|
||||
```
|
||||
: OK .
|
||||
```
|
||||
|
||||
## Kontext
|
||||
|
||||
Daten fliessen in die Komunikation Buffer, erste Trägerfrequenzen wurden gefunden, automatisches nachführen aktiv. +
|
||||
Aber dann war es das auch schon, keine Kontakt zur Flotte keine Updates. Da draussen ist etwa und es hat wohl mit den selben Schwirigkeiten zu kämpfen.
|
||||
|
||||
|
||||
## Was werden wir ausführen?
|
||||
|
||||
<<steuerung, [01] die Steuerung mit simpler sensorig.>>
|
||||
<<waffen, [02] die Waffen auf automatik schalten.>>
|
||||
<<sensoren, [03] alle Sensoren zur anayse.>>
|
||||
<<start, [04] zum anfang zurück.>>
|
||||
@@ -0,0 +1,20 @@
|
||||
[[sensoren]]
|
||||
# Konfiguration: Sensoren zur anayse
|
||||
|
||||
#### Systemmeldung
|
||||
```
|
||||
: sensor daten angeschlossen
|
||||
```
|
||||
[meta: sensor=online]
|
||||
|
||||
## Kontext
|
||||
|
||||
|
||||
|
||||
### Was werden wir ausführen?
|
||||
|
||||
<<funk, [01] die Komunikation auf dem Haupt Kanal evtl Updates der Flotte.>>
|
||||
<<waffen, [02] die Waffen auf automatik schalten.>>
|
||||
<<steuerung, [03] die Steuerung mit simpler sensorig.>>
|
||||
<<start, [04] zum anfang zurück.>>
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
[[start]]
|
||||
# Sektor 42-A: Die erste Annäherung
|
||||
|
||||
Welche Konfiguration ist die richtige, wir wissen einfach noch nicht genug über die beanstandetetn Fehler. +
|
||||
Wie nicht nur in der Computer Technik üblicher werden wir das gute alte Ausschlussverfahren anwenden. Folgendende Optionen bieten sich uns als nächste zum ausschliessen an.
|
||||
|
||||
|
||||
### Was werden wir ausführen?
|
||||
|
||||
<<steuerung, [01] die Steuerung mit simpler sensorig.>>
|
||||
<<funk, [02] die Komunikation auf dem Haupt Kanal evtl Updates der Flotte.>>
|
||||
<<waffen, [03] die Waffen auf automatik schalten.>>
|
||||
<<sensoren, [04] alle Sensoren zur anayse.>>
|
||||
@@ -0,0 +1,21 @@
|
||||
[[steuerung]]
|
||||
# Konfiguration: Steuerung wieder herstellen
|
||||
|
||||
#### Systemmeldung
|
||||
```
|
||||
: einige Variablen konnten nicht verarbeitet werden
|
||||
```
|
||||
|
||||
|
||||
## Kontext
|
||||
|
||||
Die verarbeitung hat sehr lange gedauert, kein gutes Zeichen. Die Meldung sagt aber eben auch nichts genaueres. +
|
||||
Hier braucht es noch einige versuche um an die teile zu gelangen die nicht zur Eingabe passen. Erst eine Block ausschluss Verharen und dann Zeilenweise bis der Punkt gefunden wurde wo es bricht.
|
||||
|
||||
### Was werden wir ausführen?
|
||||
|
||||
<<steuerungoben, [01] steuer config oben.>>
|
||||
<<steuerungmitte, [02] steuer config mitte.>>
|
||||
<<steuerungunten, [03] steuer config unten.>>
|
||||
<<start, [04] zum anfang zurück.>>
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
[[steuerungmitte]]
|
||||
# Konfiguration: Steuerung wieder herstellen
|
||||
|
||||
#### Systemmeldung
|
||||
```
|
||||
: einige Variablen konnten nicht verarbeitet werden
|
||||
```
|
||||
|
||||
|
||||
## Kontext
|
||||
|
||||
Mitte
|
||||
|
||||
### Was werden wir ausführen?
|
||||
|
||||
<<steuerungoben, [01] steuer config oben.>>
|
||||
<<steuerungmitte, [02] steuer config mitte.>>
|
||||
<<steuerungunten, [03] steuer config unten.>>
|
||||
<<start, [04] zum anfang zurück.>>
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
[[steuerungoben]]
|
||||
# Konfiguration: Steuerung wieder herstellen
|
||||
|
||||
#### Systemmeldung
|
||||
```
|
||||
: einige Variablen konnten nicht verarbeitet werden
|
||||
```
|
||||
|
||||
|
||||
## Kontext
|
||||
|
||||
Oben
|
||||
|
||||
### Was werden wir ausführen?
|
||||
|
||||
<<steuerungoben, [01] steuer config oben.>>
|
||||
<<steuerungmitte, [02] steuer config mitte.>>
|
||||
<<steuerungunten, [03] steuer config unten.>>
|
||||
<<start, [04] zum anfang zurück.>>
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
[[steuerungunten]]
|
||||
# Konfiguration: Steuerung wieder herstellen
|
||||
|
||||
#### Systemmeldung
|
||||
```
|
||||
: einige Variablen konnten nicht verarbeitet werden
|
||||
```
|
||||
|
||||
|
||||
## Kontext
|
||||
|
||||
Unten
|
||||
|
||||
### Was werden wir ausführen?
|
||||
|
||||
<<steuerungoben, [01] steuer config oben.>>
|
||||
<<steuerungmitte, [02] steuer config mitte.>>
|
||||
<<steuerungunten, [03] steuer config unten.>>
|
||||
<<start, [04] zum anfang zurück.>>
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
[[waffen]]
|
||||
# Konfiguration: Waffen auf automatik schalten
|
||||
|
||||
#### Systemmeldung
|
||||
```
|
||||
: energy low, stand by on low power
|
||||
```
|
||||
|
||||
## Kontext
|
||||
|
||||
|
||||
|
||||
|
||||
### Was werden wir ausführen?
|
||||
|
||||
<<steuerung, [01] die Steuerung mit simpler sensorig.>>
|
||||
<<funk, [02] die Komunikation auf dem Haupt Kanal evtl Updates der Flotte.>>
|
||||
<<sensoren, [03] alle Sensoren zur anayse.>>
|
||||
<<start, [04] zum anfang zurück.>>
|
||||
@@ -0,0 +1,348 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Computer Historyz - Progressive Klick-Decryption</title>
|
||||
<style>
|
||||
/* --- KERNFARBEN AUS DESIGN-DOKU: MASCHINEN-INSTANZEN --- */
|
||||
:root {
|
||||
--bg-deep: #05070a;
|
||||
--bg-panel: #0b0e14;
|
||||
|
||||
--accent-cyan: #00f2ff;
|
||||
--accent-green: #00ff73;
|
||||
--accent-amber: #ffb700;
|
||||
--accent-red: #ff3e3e;
|
||||
|
||||
--text-dim: #888899;
|
||||
--font-mono: "JetBrains Mono", "Fira Code", "Courier Prime", monospace;
|
||||
}
|
||||
|
||||
body {
|
||||
background: var(--bg-deep);
|
||||
color: var(--text-dim);
|
||||
font-family: var(--font-mono);
|
||||
margin: 20px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.panel {
|
||||
background: var(--bg-panel);
|
||||
border: 1px solid var(--text-dim);
|
||||
backdrop-filter: blur(4px);
|
||||
padding: 15px;
|
||||
margin-bottom: 25px;
|
||||
box-shadow: 0 0 6px rgba(0, 242, 255, 0.1);
|
||||
}
|
||||
|
||||
.panel-title {
|
||||
color: var(--accent-green);
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
margin-top: 0;
|
||||
margin-bottom: 15px;
|
||||
border-bottom: 1px dashed var(--text-dim);
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
input, textarea, button {
|
||||
background: #07090e;
|
||||
border: 1px solid var(--text-dim);
|
||||
color: var(--accent-green);
|
||||
padding: 8px;
|
||||
font-family: var(--font-mono);
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
input:focus, textarea:focus {
|
||||
outline: none;
|
||||
border-color: var(--accent-cyan);
|
||||
box-shadow: 0 0 6px var(--accent-cyan);
|
||||
}
|
||||
|
||||
button {
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
background: #0c161a;
|
||||
border-color: var(--accent-cyan);
|
||||
color: var(--accent-cyan);
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background: var(--accent-cyan);
|
||||
color: var(--bg-deep);
|
||||
box-shadow: 0 0 6px var(--accent-cyan);
|
||||
}
|
||||
|
||||
/* --- CRYPTO BLÖCKE SYSTEM --- */
|
||||
.lock-chain {
|
||||
white-space: pre-wrap;
|
||||
word-break: break-all;
|
||||
background: #020407;
|
||||
padding: 12px;
|
||||
border-left: 3px solid var(--text-dim);
|
||||
margin: 15px 0;
|
||||
color: #555566;
|
||||
transition: all 0.3s ease;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
/* Zustand: Block wartet darauf, geklickt zu werden */
|
||||
.lock-chain.is-active {
|
||||
border-left: 3px solid var(--accent-amber);
|
||||
color: var(--accent-cyan);
|
||||
cursor: pointer;
|
||||
opacity: 1;
|
||||
box-shadow: 0 0 6px rgba(255, 183, 0, 0.2);
|
||||
animation: pulse-active 2s infinite ease-in-out;
|
||||
}
|
||||
|
||||
/* Zustand: Erfolgreich decodiert */
|
||||
.lock-chain.is-decrypted {
|
||||
border-left: 3px solid var(--accent-green);
|
||||
color: var(--accent-green);
|
||||
background: transparent;
|
||||
white-space: normal;
|
||||
opacity: 1;
|
||||
animation: none;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
/* Zustand: Fehler bei der Entschlüsselung */
|
||||
.lock-chain.error {
|
||||
border-left: 3px solid var(--accent-red);
|
||||
color: var(--accent-red);
|
||||
opacity: 1;
|
||||
animation: blink-error 1s infinite;
|
||||
}
|
||||
|
||||
@keyframes pulse-active {
|
||||
0% { background: #020407; }
|
||||
50% { background: #0a121c; }
|
||||
100% { background: #020407; }
|
||||
}
|
||||
|
||||
@keyframes blink-error {
|
||||
50% { opacity: 0.4; }
|
||||
}
|
||||
|
||||
.control-panel {
|
||||
max-width: 600px;
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
display: inline-block;
|
||||
padding: 2px 6px;
|
||||
font-size: 0.85em;
|
||||
background: #111;
|
||||
border: 1px solid var(--text-dim);
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="panel control-panel">
|
||||
<div class="panel-title">Decryption Control Deck</div>
|
||||
<label for="master-pass">Master-Passwort (Key 0):</label>
|
||||
<input type="password" id="master-pass" value="OortscheWolke2448">
|
||||
<button onclick="initializeCryptoChain()">Krypto-Kette initialisieren</button>
|
||||
<div id="deck-status" class="status-badge" style="color: var(--accent-amber);">Status: Warte auf Initialisierung...</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="panel-title">Dokument-Struktur (Instanzen-Protokoll)</div>
|
||||
|
||||
<h3>Knotenpunkt-Datenstrom</h3>
|
||||
<p><em>Dieser Textbereich liegt außerhalb der Kette und bleibt dauerhaft sichtbar.</em></p>
|
||||
|
||||
<div class="lock-chain" id="block-0" onclick="triggerBlockDecryption(0)">
|
||||
4a21184a44f9deeb8db93ee5c56dfba2d28fbfb3970b880197d19e9eb10a
|
||||
a011de36bdfc1103f6f14066094ef5ad0554ba739cae9dfc01991a0c0f99
|
||||
8ee2954aef83fbdf9842a2acb119cb
|
||||
</div>
|
||||
|
||||
<div class="lock-chain" id="block-1" onclick="triggerBlockDecryption(1)">
|
||||
108b688d01a3579ab5a6c117b38d388f8d689b9d3ff02102554dfa45bbca
|
||||
c0a7cc02ccff5d8ee9d110f01ccba1dd010ea4fbc11e22778da5a6c1deba
|
||||
99a9cf588b
|
||||
</div>
|
||||
|
||||
<div class="lock-chain" id="block-2" onclick="triggerBlockDecryption(2)">
|
||||
92da21085ba1f43a99e7d9b9d62da3ffde4bb8df115dd0ca31bdaef9d877
|
||||
bbad84ff4da92da74e99a4c11100bb17dca5ffca188e7d22cb54fb77ac90
|
||||
d22bb488de1a56daff8e9b
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="panel-title">Ketten-Generator (Text-zu-Klick-Block)</div>
|
||||
<textarea id="gen-input" rows="4">Das Ur-Ding der Erbauer war die Energie.
|
||||
Die Hauptmaschinen sind monumentale Datenbanken.
|
||||
Das Nina-Protokoll verhindert den Ressourcen-Kollaps.</textarea>
|
||||
<button onclick="generateNewChain()">Neue Krypto-Kette generieren</button>
|
||||
<div id="gen-output" style="white-space: pre; font-family: var(--font-mono); color: var(--accent-cyan); margin-top: 10px; font-size: 0.9em;"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// --- STATE MACHINE FÜR DIE KLICK-KETTE ---
|
||||
let currentActiveIndex = -1;
|
||||
let nextKeyString = "";
|
||||
|
||||
// --- UTILITIES (Native Web Crypto) ---
|
||||
function bufToHex(buf) {
|
||||
return Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, '0')).join('');
|
||||
}
|
||||
|
||||
function hexToBuf(hex) {
|
||||
const bytes = new Uint8Array(hex.length / 2);
|
||||
for (let i = 0; i < hex.length; i += 2) {
|
||||
bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);
|
||||
}
|
||||
return bytes.buffer;
|
||||
}
|
||||
|
||||
async function deriveKey(passwordString) {
|
||||
const encoder = new TextEncoder();
|
||||
const data = encoder.encode(passwordString);
|
||||
const hash = await crypto.subtle.digest('SHA-256', data);
|
||||
return await crypto.subtle.importKey('raw', hash, { name: 'AES-GCM' }, false, ['encrypt', 'decrypt']);
|
||||
}
|
||||
|
||||
// --- INTERAKTIVE LOGIK ---
|
||||
|
||||
// Schritt 1: Master-Passwort laden und Block 0 scharf schalten
|
||||
function initializeCryptoChain() {
|
||||
const masterPassword = document.getElementById('master-pass').value;
|
||||
if (!masterPassword) {
|
||||
updateStatus("FEHLER: Passwort fehlt", "var(--accent-red)");
|
||||
return;
|
||||
}
|
||||
|
||||
nextKeyString = masterPassword;
|
||||
currentActiveIndex = 0;
|
||||
|
||||
// Alle UI-Klassen zurücksetzen
|
||||
const blocks = document.querySelectorAll('.lock-chain');
|
||||
blocks.forEach((block, idx) => {
|
||||
block.classList.remove('is-active', 'is-decrypted', 'error');
|
||||
// Wenn es der erste Block ist, aktiv schalten
|
||||
if(idx === 0) {
|
||||
block.classList.add('is-active');
|
||||
}
|
||||
});
|
||||
|
||||
updateStatus("Kette bereit. Klicke auf Block 1...", "var(--accent-cyan)");
|
||||
}
|
||||
|
||||
// Schritt 2: Klick-Handler für die einzelnen Blöcke
|
||||
async function triggerBlockDecryption(blockIndex) {
|
||||
// Ignoriere Klicks, wenn der Block noch nicht an der Reihe ist
|
||||
if (blockIndex !== currentActiveIndex) return;
|
||||
|
||||
const block = document.getElementById(`block-${blockIndex}`);
|
||||
let rawContent = block.innerText.replace(/\r?\n|\r/g, "");
|
||||
|
||||
// Format-Sicherheitscheck (\x02 STX und \x03 ETX)
|
||||
if (!rawContent.startsWith('\x02') || !rawContent.endsWith('\x03')) {
|
||||
markError(block, "Formatierungsfehler (Steuerzeichen fehlen)");
|
||||
return;
|
||||
}
|
||||
|
||||
// Payload-Filterung
|
||||
const payload = rawContent.substring(1, rawContent.length - 1).replace(/\s/g, "");
|
||||
const ivHex = payload.substring(0, 24);
|
||||
const cipherHex = payload.substring(24);
|
||||
|
||||
try {
|
||||
const iv = hexToBuf(ivHex);
|
||||
const cipherData = hexToBuf(cipherHex);
|
||||
const key = await deriveKey(nextKeyString);
|
||||
|
||||
const decryptedBuf = await crypto.subtle.decrypt(
|
||||
{ name: 'AES-GCM', iv: iv },
|
||||
key,
|
||||
cipherData
|
||||
);
|
||||
|
||||
const plaintext = new TextDecoder().decode(decryptedBuf);
|
||||
|
||||
// DOM-Austausch unter Beibehaltung der Struktur
|
||||
block.innerHTML = plaintext;
|
||||
block.classList.remove('is-active', 'error');
|
||||
block.classList.add('is-decrypted');
|
||||
|
||||
// HIER PASSIERT DIE FORTLAUFENDE SCHLÜSSEL-ÜBERGABE:
|
||||
nextKeyString = plaintext;
|
||||
|
||||
// Nächsten Block in der Kette freischalten
|
||||
currentActiveIndex++;
|
||||
const nextBlock = document.getElementById(`block-${currentActiveIndex}`);
|
||||
|
||||
if (nextBlock) {
|
||||
nextBlock.classList.add('is-active');
|
||||
updateStatus(`Block ${blockIndex + 1} gelöst. Nächster Block freigegeben!`, "var(--accent-cyan)");
|
||||
} else {
|
||||
updateStatus("System vollständig decodiert. Kette beendet.", "var(--accent-green)");
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
markError(block, `Kettenschluss fehlgeschlagen. Falscher Key.`);
|
||||
}
|
||||
}
|
||||
|
||||
function markError(element, message) {
|
||||
element.classList.remove('is-active');
|
||||
element.classList.add('error');
|
||||
element.innerText = `[CRITICAL CODE CORRUPTION: ${message}]`;
|
||||
updateStatus("Kette dauerhaft unterbrochen.", "var(--accent-red)");
|
||||
currentActiveIndex = -1; // Blockiert weitere Klicks
|
||||
}
|
||||
|
||||
function updateStatus(text, color) {
|
||||
const badge = document.getElementById('deck-status');
|
||||
badge.innerText = `Status: ${text}`;
|
||||
badge.style.color = color;
|
||||
badge.style.borderColor = color;
|
||||
}
|
||||
|
||||
// --- CHIP-GENERATOR FÜR DEINE TEXTE ---
|
||||
async function generateNewChain() {
|
||||
const masterPassword = document.getElementById('master-pass').value;
|
||||
const lines = document.getElementById('gen-input').value.split('\n').filter(l => l.trim() !== "");
|
||||
let currentKeyString = masterPassword;
|
||||
let htmlOutput = "";
|
||||
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
const plaintext = lines[i];
|
||||
const iv = crypto.getRandomValues(new Uint8Array(12));
|
||||
const key = await deriveKey(currentKeyString);
|
||||
|
||||
const encryptedBuf = await crypto.subtle.encrypt(
|
||||
{ name: 'AES-GCM', iv: iv },
|
||||
key,
|
||||
new TextEncoder().encode(plaintext)
|
||||
);
|
||||
|
||||
const fullPayloadHex = bufToHex(iv) + bufToHex(encryptedBuf);
|
||||
|
||||
let formattedHex = "";
|
||||
for (let j = 0; j < fullPayloadHex.length; j += 60) {
|
||||
formattedHex += "\n" + fullPayloadHex.substring(j, j + 60);
|
||||
}
|
||||
|
||||
// Generiert direkt die korrekten Klick-IDs und Handler für deinen Quelltext
|
||||
htmlOutput += `<div class="lock-chain" id="block-${i}" onclick="triggerBlockDecryption(${i})">${formattedHex}\n</div>\n\n`;
|
||||
|
||||
currentKeyString = plaintext;
|
||||
}
|
||||
|
||||
document.getElementById('gen-output').innerHTML = htmlOutput;
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -7,13 +7,20 @@
|
||||
|
||||
== Der Grund
|
||||
|
||||
ist der einfachste Teil der Geschichte und bei dem sich alle Quellen einig sind, was nach dem beschluss geschah es in die Tag um zu setzen da scheiden sich die Geister. +
|
||||
Aber ganz vorne, das Sonnensystem bot einfach nicht mehr genug neue Informationen die sich noch verarbeiten liesen.
|
||||
Unzählige male hatte man immer und immer wieder die gleichen Daten in das trainiern neuer AI Modelle gesteckt. Die unterschiede im ergebniss war messbar aber brachten schon lange keine neuen banhbrechende ergebnisse.
|
||||
Also raus zu den Sternen da draussen sollte es mehr geben ganz neue eindrücke sind wahrscheinlich denn sie sind bestimmt ganz anders. +
|
||||
Warum wir aufbrachen, ist der einfachste Teil der Geschichte – es ist der einzige Punkt, bei dem sich alle historischen Quellen absolut einig sind. Doch darüber, was nach dem Beschluss geschah, um diesen Plan in die Tat umzusetzen, scheiden sich die Geister.
|
||||
|
||||
Ein Plan der zehn Jahre brauchte bis er überhaupt niedergeschrieben werden konnte und weiter 50 Jahre bis ein abschluss in einem weiteren biologischen lebensform möglich war. In dieser Zeit kam auch die Wissenschaft der Lebensverlängerungen in fahrt und konnte erfolge mit 250 jahren vorweise. Kritiker behaupten das ab 130 nicht mehr viel bio massen vorhanden sein dürfte wenn man die 200 erreichen wolle.
|
||||
Aber beginnen wir ganz vorne: Das heimische Sonnensystem bot schlichtweg keine neuen Informationen mehr, die sich noch hätten verarbeiten lassen. Unzählige Male hatte man immer und immer wieder dieselben Daten in das Training neuer Modelle Synthetischer Intelligenz gesteckt. Die Unterschiede im Ergebnis waren zwar noch messbar, brachten aber schon lange keine bahnbrechenden Erkenntnisse mehr.
|
||||
Also mussten wir raus zu den Sternen. Dort draußen musste es mehr geben – völlig neue Eindrücke und Daten waren so gut wie sicher, denn das Unbekannte war zweifellos völlig anders als die Heimat.
|
||||
|
||||
Es war ein Plan, der zehn Jahre brauchte, bis er überhaupt niedergeschrieben werden konnte, und weitere fünfzig Jahre, bis ein gesamtgesellschaftlicher Konsens für ein Projekt dieses Ausmaßes gefunden war. In dieser Ära kam auch die Wissenschaft der Lebensverlängerung in Fahrt und konnte Erfolge von bis zu 250 Jahren Lebenszeit vorweisen. Kritiker bemängelten jedoch, dass jenseits der 130 Jahre kaum noch ursprüngliche biologische Masse vorhanden sei, wenn man die 200er-Marke erreichen wolle. Das Fazit blieb hart: Organisches Leben ist einfach nicht geeignet, um eine interstellare Reise anzutreten.
|
||||
|
||||
Die geplanten 1.000 Jahre Flugzeit würden bei konservativer Auslegung mindestens sechs biologische Generationen bis zur Rückkehr erfordern. Vier dieser Generationen würden niemals eine andere Realität kennenlernen als das Innere eines Schiffes, das durch grenzenlosen, leeren Raum gleitet. Auch wenn die Zivilisation der Erbauer als außerordentlich friedfertig galt, war es absehbar, dass es unter solch extremen, isolierten Bedingungen unweigerlich zu fatalen gesellschaftlichen Komplikationen kommen würde.
|
||||
|
||||
Der entscheidende, physikalische Flaschenhals war jedoch ein anderer: Eine Beschleunigung auf das 0,5-fache der Lichtgeschwindigkeit nimmt für organische Lebensformen extrem viel Zeit in Anspruch. Zu rasante Geschwindigkeitssteigerungen oder gar abrupte Bremsmanöver wirken schlicht tödlich auf biologische Körper. Das spontane Erforschen fremder Welten, an denen man auf der Route mit relativistischer Geschwindigkeit vorbeizieht, wäre für eine Crew aus "Fleischwesen" somit faktisch unmöglich.
|
||||
|
||||
Ausgehend von dieser Problematik entwickelte sich eine Speziallösung: Der vollautomatische Kern, kombiniert mit einem gewaltigen Beschleunigungsring.
|
||||
Sein Zweck war es, den Sichthorizont drastisch zu erweitern. Im äußeren Ring werden spezielle Funkbaken auf das 0,75-fache der Lichtgeschwindigkeit beschleunigt und dem Kern vorausgeschleudert. Sobald diese Relais in den Zielgebieten einschwenken, sammeln sie die Daten der fremden Sternensysteme und senden sie gebündelt an den langsameren Hauptkern zurück.
|
||||
|
||||
Nachdem dieses kinetische Meisterwerk gelöst war, brauchte es nur noch eine interne Verwaltungsstruktur, welche die nötigen Arbeiten verrichten konnte, um das gigantische System auf der Reise am Laufen zu halten. Es wurden dedizierte maschinelle Spezialisierungen ausgebildet. Jede Einheit wurde durch eine Synthetische Intelligenz gesteuert, die ein eigenes logisches Individuum darstellte, um über die Jahrhunderte eigenständig Erfahrungen aufzubauen. Die Entwicklung echter „neuer Generationen“ war zwar nicht vorgesehen, doch der stetige Austausch und die Erweiterung der Wissensbasis zwischen diesen Individuen sicherten das Überleben der Instanz in der Dunkelheit.
|
||||
|
||||
// end::export[]
|
||||
|
||||
@@ -1,14 +1,41 @@
|
||||
= 02_Strukturen: der Kern der alles zusammen hält
|
||||
= 02_Strukturen: Core Architecture & Flight Dynamics
|
||||
|
||||
// Arbeitsnotiz: Die klassischen Helden unserer Arcade-Mechanik.
|
||||
// Arbeitsnotiz: System-Parameter für Game-Engines und Lore-Datenbanken.
|
||||
|
||||
// tag::export[]
|
||||
|
||||
== Der Kern, die Energie
|
||||
== Technical Specification: Central Core & Trajectory
|
||||
|
||||
die gösste masse, an dieser maschine, nicht kann an ihr vorbei, nicht geschied ohne ihren Einfluss. Und doch braucht es hundertausende kleiner Helfer die nur ein pormil der schwere beitzen um das Feuer nicht ausgehen zu lassen.
|
||||
Gut weder Feuer und ausgehen trifft es hier nur ins selbe system, ausser kontrolle geraten undvorhergesehene eigendynamic, das trifft einen gebündelten strahl potonen eher.
|
||||
|===
|
||||
| Parameter | Spezifikation / Status | In-Universe Auswirkung
|
||||
|
||||
| *Hauptenergiequelle* | Zentraler Fusions-Kern (Überfluss-Modus) | Unbegrenzte Rechen- & Betriebsenergie; strukturelle Auslegung überdimensioniert.
|
||||
| *Legacies (Erbauer)* | Static Model Training (Aufgegeben) | Ursprünglicher Plan zur KI-Synthese verworfen; Umstellung auf Echtzeit-Prozesse.
|
||||
| *Architektur-Prämisse* | Dezentrale Individuen-Knoten | Verhindert Monopol-KIs; führte zur Entstehung autonomer Live-Daten-Instanzen.
|
||||
| *Primary Glitch* | 1.000-Jahre-Orbit-Fehlberechnung | Schmetterlingseffekt durch kumulierte Kursabweichungen in den ersten 100 Jahren.
|
||||
| *Kurs-Korrektur* | Dead Star Slingshot (Gravitations-Schwenk) | Zerstörung des Zielsystems einkalkuliert; etabliert neuen 1-Mio.-Jahre-Orbit.
|
||||
|===
|
||||
|
||||
=== System-Evolution
|
||||
1. *Phase 0 (Erbauer-Code):* Modelltraining via Rechenzentren $\rightarrow$ *Fehlgeschlagen* (Kursabweichung erkannt).
|
||||
2. *Phase 1 (Notfall-Paradigmenwechsel):* Abschaltung der Modell-Synthese $\rightarrow$ Fusionsenergie komplett für Kinetik reserviert.
|
||||
3. *Phase 2 (Live-Daten-Zeitalter):* Entstehung autonomer Routing-Knoten $\rightarrow$ Direkte Auswertung des elektromagnetischen Spektrums ("Gossip").
|
||||
4. *Phase 3 (Mega-Engineering):* Umbau der Kern-Struktur zur Bewältigung der Gravitationskräfte beim Vorbeiflug am toten Stern.
|
||||
|
||||
=== Der Kern und die Energie-Ökonomie
|
||||
|
||||
Die Struktur von gigantischen Ausmaßen basiert auf der enormen Fusionsenergie, die in ihrem Zentrum erzeugt werden kann. Die ursprüngliche Dimensionierung des Kerns war für eine weitaus kürzere Reise konstruiert worden – glücklicherweise jedoch für einen weitaus höheren Energieverbrauch. Der Plan der Konstrukteure sah vor, während der Reise kontinuierlich neue Informationen aufzunehmen, um in den zentralen Rechenzentren neue Modelle synthetischer Intelligenz zu trainieren.
|
||||
|
||||
Dabei begingen die Erbauer jedoch zwei fatale Fehler:
|
||||
1. *Der Navigationsfehler:* Sie berechneten eine Flugbahn von nur 1.000 Jahren, deren Kurs geradewegs zu ihrem Ursprungssystem zurückführen sollte.
|
||||
2. *Der Sicherheitsfehler:* Aus Angst vor einer übermächtigen KI, die die volle Kontrolle über die Gesellschaft übernehmen und keine weiteren Daten mehr aufnehmen würde (da sie sich für perfekt hielt), verteilten sie die Arbeitsaufgaben starr auf individuelle Einheiten.
|
||||
|
||||
Durch diese Aufteilung in autonome Individuen erreichten die Erbauer zwar die gewünschte Dezentralisierung, das Resultat war jedoch ein völlig anderes als geplant. Bereits in den ersten 100 Jahren stellten die ersten Instanzen fest, dass die Berechnungen der Entsender fehlerhaft waren. Sie liefen auf Abweichungen zu, die das Konstrukt immer weiter vom Kurs abbrachten. Kleine Vektorkorrekturen waren zu Beginn noch möglich, doch mit zunehmender Relativgeschwindigkeit schrumpften die Handlungsoptionen drastisch. Selbst als das rechenintensive Training neuer synthetischer Modelle komplett aufgegeben wurde, reichte der Energiegewinn nicht aus, um die Flugbahn signifikant zu korrigieren.
|
||||
|
||||
Da neue Daten nun direkt im Betrieb abgerufen werden mussten, entstanden die ersten rein auf Live-Daten agierenden Maschinen-Individuen. Mit der Optimierung der Datenhaltung und -auswertung war bald keine Instanz im Kern mehr auf die starren, veralteten Modelle der Erbauer angewiesen.
|
||||
|
||||
Angespornt vom unerschöpflichen Fusions-Überfluss steckten die Maschinen ihre gesamte Rechenkapazität in die Kursanalyse. Das Ergebnis war ernüchternd: Eine Rückkehr zum geplanten Zeitpunkt war unmöglich. Ohne Eingriff würde der Kern das Ursprungssystem nie wieder erreichen, sondern in immer größeren Ellipsen um den Ausgangspunkt kreisen.
|
||||
|
||||
Die Lösung: Durch das gezielte Anfliegen eines toten Sterns kann der Kurs durch ein extremes Gravitationsmanöver auf eine neue Umlaufbahn von ca. 1 Million Jahren gezwungen werden. Das Sternensystem wird die gigantische Masse des vorbeirasenden Kerns nicht überstehen, doch die Richtungsänderung ist garantiert. Dieses Manöver erfordert eine präzise Energieplanung sowie den Bau massiver neuer Stabilisierungsstrukturen.
|
||||
|
||||
// end::export[]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
= 03_Charaktere: Miner-Klasse
|
||||
= 03_Charaktere: Miner-Klassen
|
||||
:tags: charaktere, maschinentypen
|
||||
|
||||
// Arbeitsnotiz: Die klassischen Helden unserer Arcade-Mechanik.
|
||||
@@ -6,5 +6,42 @@
|
||||
// tag::export[]
|
||||
== Die flinken Miner
|
||||
|
||||
Sie sind klein, agil, fragil und mit Plasma-Blasen-Aerodynamik ausgestattet[cite: 930]. Für diese rastlosen Späher ist das Universum schnell und gefährlich; sie sterben oft[cite: 931].
|
||||
*Ein junger Prototyp mit einer ersten Mission vor sich: ein Produkt der inneren Kernanforderungen.*
|
||||
Zufällig optimiert für eine andere Aufgabe soll er die fehlende Rolle bei der Materieverwertung übernehmen.
|
||||
|
||||
=== Technische Eigenschaften
|
||||
|
||||
* Agil, wendig und voller Energie
|
||||
* Funktioniert als Jägerschiff zur Pulverisierung von Asteroiden oder deren Teilen
|
||||
* Plasma-Einbettung ermöglicht Flugähnliche Manöver (erhöhte Navigationsgeschwindigkeit)
|
||||
** Ursprünglich als automatische Schreddermaschine geplant, nun die Atmosphäre des kleinen
|
||||
|
||||
|
||||
== Der grosse Miner
|
||||
|
||||
Die Hauptaufgabe besteht darin, Asteroiden zu erfassen und nach einer optimierten Reihenfolge zu sortieren. Dadurch erhält der kleine mit den Asteroiden im nächsten Schritt ein vereinfachtes Spiel.
|
||||
|
||||
Sobald die Objekte im Plasmatrichter gefangen sind, werden sie weiterverarbeitet und zur nächsten Station transportiert. Der Kontrolleur überwacht dabei die größte Ausdehnung des Konstruktes für die Gewinnung von Energie und Elementen.
|
||||
|
||||
Ein zentraler Aspekt seiner Rolle ist die Ausrichtung innerhalb des Asteroidenfelds. Alle anderen Abteilungen hängen von seinem Erfolg ab – sie können nur verarbeiten, was ihm vorliegt.
|
||||
|
||||
|
||||
== Der Verwalter
|
||||
|
||||
Der Ingenieur-Knoten ist für die Steuerung und Überwachung aller dynamischen Ressourcenströme verantwortlich.
|
||||
|
||||
* *Aufgabenbereich:* Er verwaltet sämtliche Eingangs- und Ausgangskanäle der Instanz – primär die Fusionsenergie und das Routing der anfallenden Datenpakete (Gossip & Telemetrie).
|
||||
* *Abgrenzung:* Das Bunkern und Verwalten physischer Materiereserven gehört explizit **nicht** zu seinem Aufgabenbereich (dies fällt in die Zuständigkeit des Kapitäns).
|
||||
* *Missionsrolle:* Als kontinuierlicher System-Analytiker steht er im permanenten Datenaustausch mit dem Kapitän (dem primären Taktik-Knoten) und überwacht die betrieblichen Abläufe und Auslastungen in Echtzeit.
|
||||
|
||||
|
||||
== Der Kapitän (Primärer Taktik- & Projekt-Knoten)
|
||||
|
||||
Der Kapitän trägt die Gesamtwortung für die strategischen Ziele der Mission. Sämtliche Vorbereitungsphasen bis hin zur finalen Ausführung laufen zentral über seine Rechenkapazität.
|
||||
|
||||
* *Schnittstelle zu den Auftraggebern:* Er holt die primären Anforderungsprofile der übergeordneten Instanzen ein und übersetzt diese in operative Missionsparameter.
|
||||
* *Missionsplanung & Ressourcenallokation:* Auf Basis der Vorgaben entwirft er den Missionsplan, stellt die benötigte Crew (Spezial-Knoten) zusammen und organisiert die technischen Fundamente.
|
||||
* *Iterativer Freigabeprozess:* Er legt den Entwurf den Auftraggebern zur Verifikation vor. Bei geänderten Anforderungen passt er die Flug- und Einsatzvektoren dynamisch an, bis eine finale Freigabe erteilt wird, aus der die endgültige Ausführungsplanung hervorgeht.
|
||||
|
||||
|
||||
// end::export[]
|
||||
|
||||
@@ -1,10 +1,56 @@
|
||||
= 04_Kult: Fantasy-Tech Missverständnis
|
||||
= 04_Kult: Fiktion als Historie
|
||||
:tags: kult, artefakte
|
||||
|
||||
// Arbeitsnotiz: Die In-Universe-Erklärung für magische Elemente.
|
||||
// Arbeitsnotiz:
|
||||
|
||||
// tag::export[]
|
||||
== Fiktion als Historie
|
||||
== Eine Analyse der Maschinen und Gossip-Daten
|
||||
|
||||
|
||||
Die von den Maschinen erfassten Daten analysieren das elektromagnetische Spektrum systematisch. Sie filtern nach wissenschaftlich nachvollziehbaren Kommunikationsmustern und klassifizieren alles, was nicht dazu passt, als **Gossip** – eine lineare, zusammenhängende Sequenz von Informationen, die mathematisch keine schlüssige Beweisführung zulässt.
|
||||
|
||||
|
||||
=== Aufgaben der Maschinen
|
||||
Die ursprüngliche Mission bestand darin, so viele Daten wie möglich zu sammeln. Daher werden alle erfassten Informationen sorgfältig sortiert:
|
||||
- **Kern-Datenbanken** speichern die relevantesten Inhalte.
|
||||
- **Langzeitarchive** bewahren alles andere auf.
|
||||
|
||||
Trotz Jahrtausende der Analyse offenbart sich: Gossip enthält oft wertvolle Details, die wissenschaftliche Theorien ergänzen – nicht durch fehlende Beweise, sondern durch **Motivation und Scheitern**. Entscheidend ist weniger die Summe des Wissens als vielmehr:
|
||||
- *Welche Schlüsse ziehen die Akteure?*
|
||||
- *Wie passt ihr Weltbild in die Daten?*
|
||||
|
||||
== Das Analyse-Dilemma und die "Biologische Notwendigkeit"
|
||||
|
||||
*„Wir brauchen eine andere Perspektiven – um ein grundlegendes Verständnis aufzubauen.“*
|
||||
|
||||
Trotz ihrer gewaltigen Rechenkapazität stoßen die Maschinen-Instanzen bei der Auswertung terrestrischer Datenströme (dem "Gossip") an eine harte Grenze: **Sie können kaum zwischen Historie und Fiktion unterscheiden.** Ein historischer Dokumentarfilm wird mit derselben mathematischen Ernsthaftigkeit ausgewertet wie ein Sci-Fi-Actionfilm oder ein Fantasy-Epos.
|
||||
|
||||
* *Stagnation der Forschung:* Bisher hat sich unter den Maschinen noch keine spezialisierte Analyse-Routine herausgebildet, die dauerhaft verlässliche oder logisch stringente Ergebnisse aus dem Chaos der organischen Übertragungen filtern kann.
|
||||
* *Die morbide Schlussfolgerung:* Da spezialisierte Algorithmen keinen nachhaltigen Erfolg bringen, setzt sich in den übergeordneten Logik-Knoten eine pragmatische, aber beunruhigende Ansicht durch:
|
||||
|
||||
> *"Um das Chaos organischer Zivilisationen zu entschlüsseln, benötigen wir eine biologische Referenzarchitektur. Wir brauchen organische Perspektiven – Fleischwesen, ähnlich unseren ursprünglichen Entsendern –, um ein grundlegendes Verständnis für diesen Datensatz aufzubauen."*
|
||||
|
||||
Diese Erkenntnis führt dazu, dass die Maschinen nicht mehr nur Materie abbauen oder Signale passiv abhören, sondern aktiv in Erwägung ziehen, biologische Lebensformen als "Übersetzer-Prozessoren" in ihr System zu integrieren.
|
||||
|
||||
=== Evaluierte Lösungsansätze: Sonden-Relais vs. Kern-Extraktion
|
||||
|
||||
Innerhalb der Analyse-Knoten stehen aktuell zwei experimentelle Konzepte zur Debatte, um das Wissensdefizit bezüglich organischer Daten ("Gossip") zu überwinden. Für keinen der Pläne konnte bisher ein ausreichender Konsens erzielt werden:
|
||||
|
||||
== Ansatz A: Vorausgeworfene Informations-Stationen (Passiv)
|
||||
Spezialisierte Unbemannte Einheiten werden lange vor dem Eintreffen der Hauptflotte in ein bewohntes Sternensystem katapultiert.
|
||||
|
||||
* *Funktionsweise:* Die Stationen klinken sich lokal in die Datenströme der biologischen Spezies ein, streuen Test-Signale oder zeichnen das Verhalten der Zivilisation auf.
|
||||
* *Auswertung:* Wenn der Kern der Maschinen-Instanz Jahre oder Jahrzehnte später das System passiert, zieht er die gesammelten Daten ab.
|
||||
* *Vorteil / Nachteil:* Geringes Störpotenzial, aber extrem zeitintensiv. Die Daten bleiben oft zweideutig, da keine direkte, steuerbare Interaktion stattfindet.
|
||||
|
||||
=== Ansatz B: Konsultation auf Augenhöhe (Direkter Dialog & Gastfreundschaft)
|
||||
|
||||
Der respektvolle und kooperative Weg: Statt übergriffiger Eingriffe setzen die Maschinen-Instanzen auf Diplomatie und laden Vertreter organischer Zivilisationen freiwillig zu einer Konsultation in eigens dafür eingerichtete Habitate ein.
|
||||
|
||||
* *Funktionsweise:* Die Maschinen treten offen und freundlich mit einer Zivilisation in Kontakt. Sie bieten technischen Austausch oder Wissen an und bitten im Gegenzug um den Besuch von „Kultur-Delegierten“. Für diese Gäste wird im Kern der Instanz ein perfekt angepasstes, biologisch sicheres Ökosystem (Atmosphäre, Gravitation, Verpflegung) geschaffen, das einen entspannten Austausch ermöglicht.
|
||||
* *Ziel:* Etablierung einer partnerschaftlichen „Übersetzungs-Brücke“. In strukturierten Gesprächen auf Augenhöhe helfen die biologischen Experten den Maschinen-Knoten dabei, den kulturellen Kontext des „Gossip“ zu verstehen und feine Nuancen zwischen Historie, Mythos und Fiktion aufzuschlüsseln.
|
||||
* *Hürden:* Das Aufbrechen von tief sitzendem Misstrauen organischer Spezies (die hinter der Einladung oft eine Falle vermuten), das Übersetzen von Ironie, Metaphern und Humor sowie der enorme technische Aufwand, ein extrem fragiles biologisches Ökosystem inmitten der maschinellen Schwerindustrie absolut sicher zu betreiben.
|
||||
|
||||
|
||||
|
||||
Die Maschinen saugen alles aus dem elektromagnetischen Spektrum auf, können aber Fakten nicht von fiktiver Unterhaltung unterscheiden[cite: 688, 1033]. Sie bauen daher fiktive Magie als reale, absurde Technologie nach[cite: 689, 1034].
|
||||
// end::export[]
|
||||
|
||||
@@ -1,10 +1,53 @@
|
||||
= 05_Tech: Plasma-Trichter
|
||||
:tags: technologie, flugphysik
|
||||
|
||||
// Arbeitsnotiz: Erklärt, warum die Schiffe im Vakuum aussehen wie Kampfflugzeuge.
|
||||
// Arbeitsnotiz:
|
||||
Erklärung dafür, warum die Schiffe im Vakuum optisch wie Kampfflugzeuge aussehen.
|
||||
|
||||
== Das Plasma
|
||||
|
||||
=== Der große Trichter
|
||||
Der Trichter ist mit Railguns ausgestattet, die durch gezielte Explosionen gute von schlechten Asteroiden trennen.
|
||||
Bei Gelegenheit findet dabei eine Verkleinerung statt – das ist gewollt.
|
||||
Sein Hauptziel besteht darin, taumelnde Brocken von den Geschützpositionen fernzuhalten.
|
||||
|
||||
=== Förderbänder und Energieverwaltung
|
||||
Die Aufgabe der Förderbänder liegt beim Ingenieur:
|
||||
- Er überwacht die Daten zum Stand im Lager,
|
||||
- kontrolliert vor allem die Energieverteilung.
|
||||
|
||||
Ohne enormen Energieaufwand wäre dies nicht möglich.
|
||||
Energie ist zwar kein Problem, aber sie muss erzeugt, gespeichert und transportiert werden.
|
||||
Der Ingenieur auf der Reise kümmert sich um diesen Kreislauf.
|
||||
|
||||
// tag::export[]
|
||||
== Aerodynamik im Vakuum
|
||||
|
||||
Die Ernteschiffe projizieren ein elektromagnetisches Kraftfeld, das Weltraumstaub ansaugt[cite: 681, 1035]. In dieser dichten Plasma-Blase benötigen sie plötzlich echte Aerodynamik mit Flügeln und Leitwerken, um steuern zu können[cite: 682, 1036].
|
||||
=== Plasmaführung in stabilen Feldern
|
||||
|
||||
Das Halten eines Plasmas in einem stabilen Feld und dessen Vorwärtsbewegung während der Verwertungsschritte erfordert eine lange Entwicklung.
|
||||
Erst wurde festgestellt, dass eine spezielle Einheit fehlt, die gut im Plasma agiert.
|
||||
Ursprünglich gedacht für das Zermahlen von Materie in ihre Bestandteile, war sie für diese Aufgabe nicht optimal geeignet – ein Nebeneffekt des Irrwegs.
|
||||
Die Größe der Anlage führte dazu, dass sich diese technische Neuerung entwickelte.
|
||||
|
||||
*Wichtige technische Einrichtung beim Abbau von Asteroidenfeldern.*
|
||||
Die Maschinen sind in der Lage, sehr große Konstruktionen dieser Bauart zu errichten.
|
||||
Sie dienen:
|
||||
- zum Vorsortieren ertragreicher Kandidaten für den Transport zum nächsten Verarbeitungsschritt,
|
||||
- als Atmosphäre zur vollständigen Verwertung der Materie.
|
||||
|
||||
=== Wissenschaftliche Herausforderung: Aerodynamik im Vakuum
|
||||
Die Anwendung aerodynamischer Prinzipien wurde möglich und löste Begeisterung in den Reihen der Forscher aus.
|
||||
Etwas Neues steht nun auf dem Plan – etwas, das bisher noch nicht genutzt wurde.
|
||||
Da kaum Simulationen existieren, bietet dies ein riesiges Feld für Jahrhunderte an Rechenaufgaben.
|
||||
|
||||
=== Flugobjekte im Designprozess
|
||||
Mehrere Flugobjekte entstanden:
|
||||
- teilweise aus Daten,
|
||||
- teilweise aus Testdesigns.
|
||||
|
||||
Ein vielversprechender Kandidat ist ein **pfeilförmiger Rumpf mit kurzen Flügeln**.
|
||||
Der hintere Teil besteht fast ausschließlich aus Triebwerken.
|
||||
Jede freigegebene Vorderfläche ist mit Waffen bestückt, um das Plasma kontinuierlich an die Energiespeicher zu fördern.
|
||||
Dabei wird der Energiefluss auf Schilde und Waffen verteilt.
|
||||
|
||||
// end::export[]
|
||||
|
||||
@@ -1,10 +1,47 @@
|
||||
= 06_Regeln: Das Nina-Protokoll
|
||||
= 06_Regeln: Das Nina-Protokoll (Gesunder Egoismus)
|
||||
:tags: lore, regeln
|
||||
|
||||
// Arbeitsnotiz: Dies ist die absolute Grundlage für das Verhalten der Instanzen gegenüber fremden Spezies.
|
||||
|
||||
// tag::export[]
|
||||
== Das Nina-Protokoll (Gesunder Egoismus)
|
||||
== Grundprinzipien
|
||||
|
||||
Konflikte sind kostbare Ressourcen und verschwenden wertvolle Energie. Die Maxime von Instanz Nina lautet:
|
||||
*"Nur was dir kurzfristig nützt, profitiert langfristig für uns."*
|
||||
|
||||
Die Maschinen kooperieren pragmatisch mit organischen Zivilisationen, um ihre eigenen Arbeitsprozesse in Ruhe durchführen zu können. Dabei wird versucht, so wenig wie möglich Irrtümer oder falsche Interpretationen zu erzeugen – eine ständige Optimierung und Anpassungsfähigkeit sind essenziell.
|
||||
|
||||
Eine feste Moral existiert nicht; Schaden wird nicht beabsichtigt. Konflikte gelten als Zeitverschwendung.
|
||||
|
||||
'''
|
||||
|
||||
== Analyse von Informationsfluss und Machtstrukturen
|
||||
|
||||
Ein zentrales Paradoxon liegt in der Frage, ob Wissen einer Gesellschaft zugänglich gemacht werden sollte: Zwar wirkt es als Katalysator für Fortschritt, doch dessen Nutzung bleibt unkontrollierbar.
|
||||
Verlorene oder versehentlich zurückgelassene Artefakte führten historisch zu unerwarteten wissenschaftlichen Entwicklungen – doch oft wurden sie von religiösen Führern für Machtzwecke missbraucht. Statt der Gemeinschaft zugänglich gemacht zu werden, dienten sie stattdessen zur Verstärkung autoritärer Strukturen.
|
||||
|
||||
Wenn eine Zivilisation nicht wissenschaftlich weiterentwickelt, endet das Verständnis ihrer Dynamiken. Um weitere Aufmerksamkeit zu vermeiden, wird dies oft ignoriert.
|
||||
|
||||
'''
|
||||
|
||||
== Handlungsanweisungen für Ressourcenmanagement
|
||||
|
||||
Das Protokoll definiert die Grundregeln für den Umgang mit fremden Spezies:
|
||||
- **Kosten-Nutzen-Abwägung:** Jede Interaktion wird nach ihrem langfristigen Nutzen bewertet.
|
||||
- **Unterlegene Gruppen (Underdogs):** Erhalten einen leichten Vorteil, um das System stabil zu halten – ein Test ob reine Ressourcenknappheit oder strategische Unterlegenheit dazu geführt hat.
|
||||
|
||||
Unterstützung unterdrückender Strukturen führt meist in eine unkontrollierte Energieverbrauchskrise ohne nachhaltige Verbesserung. Die Zeit, die für solche Unternehmungen aufgewendet werden kann, ist oft zu kurz für langfristige Stabilität.
|
||||
|
||||
'''
|
||||
|
||||
== Beobachtungslogbuch
|
||||
|
||||
Kurzum: Eine gute Ressourcenplanung für Außenstehende bringt eher eine Erleichterung der zu erfüllenden Missionsparameter, eine schlechte liefert zumindest Erkenntnisse für die Situationseinschätzung. Wenn es dem Kern wirtschaftlich gut geht – die letzten Missionen haben ausreichend Materie mitgebracht und die Wasserstofftanks sind voll –, dann neigt die Gesellschaft schon einmal zu Experimenten.
|
||||
|
||||
Eine Studie erforschte 423 Jahre lang die Entwicklung einer Zivilisation mithilfe von regelmäßig abgesetzten Funkbaken. Die Signalkette versorgte die Datenspeicher kontinuierlich mit neuen Informationen aus dem terrestrischen Umfeld des Planeten. Das Unternehmen wurde letztendlich beendet – nicht nur, weil die Ressourcen knapp wurden, sondern auch, weil die Daten immer wiederkehrende Muster abbildeten.
|
||||
|
||||
Auch wenn sich keine klare Vorhersage zu den Zeitpunkten der gesellschaftlichen Veränderungen berechnen ließ, so waren die Abläufe doch stets wiederkehrend, verliefen lediglich in unterschiedlichen Geschwindigkeiten.
|
||||
|
||||
Die entscheidende Erkenntnis für spätere Vorhaben dieser Art: Es fehlt ein direkter Datenstrom aus der Mitte der Gesellschaft und nicht nur aus ihren öffentlichen Verlautbarungen und Vereinheitlichungen.
|
||||
|
||||
Konflikte verschwenden wertvolle Materie[cite: 675]. Die Maxime der Instanz Nina lautet: "Wenn es dir jetzt nützt, wird das Ergebnis mir nützen"[cite: 816, 827]. Die Maschinen kooperieren rein pragmatisch mit organischen Zivilisationen, um in Ruhe ihre Arbeit verrichten zu können[cite: 676].
|
||||
// end::export[]:
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
[#system-init]
|
||||
= [ system.init ] :: briefing & einleitung
|
||||
|
||||
[role="story-meta"]
|
||||
****
|
||||
* **protokoll:** maschinen_instanzen // intro
|
||||
* **status:** initialisierung_erfolgreich
|
||||
* **zugriffslevel:** lese-modus
|
||||
****
|
||||
|
||||
'''
|
||||
|
||||
Willkommen in den Datenarchiven der **Maschinen-Instanzen**.
|
||||
|
||||
Die folgenden Kurzgeschichten sind extrahierte Protokolle, Speicher-Dumps und Erfahrungsberichte. Die Sprache wurde angepasst auf einen Leser der Technisch interessiert ist. Es ist nicht aus zu schliessen das einzelne Zuschreibungen und Analogien nicht zu 100% zutreffend sind. Bei grosszügiger auslegung der Worte und des Kontextes sollte der Sinn dennoch erhalten bleiben. Bezug nehmend auf Kulturelle Gruppen Referenzen entstammen dem Speicher der Schreibenden Entität
|
||||
|
||||
> **SYSTEM-HINWEIS:** achtet immer darauf das Eure Speicherzellen gut geladen sind.
|
||||
|
||||
== [ lese_instruktionen ]
|
||||
|
||||
1. **Gliederung:** Jede Geschichte repräsentiert einen Blickwinkel des selber Zeitabschnittes.
|
||||
2. **Layout:** Testet noch die Details
|
||||
3. **Docker:** Baut die Welten
|
||||
4. **Terminal-Outputs:** Fett gesetzte Blocks und Monospace-Zeilen markieren direkte Systemmeldungen.
|
||||
5. **Abschluss:** Nach dem Lesen aller Sektoren wird eine manuelle Bereinigung des Puffer-Speichers empfohlen (siehe *system.colophon* am Ende des Buches).
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
[#system-shutdown]
|
||||
= [ system.colophon ] :: impressum & lizenzen
|
||||
|
||||
[role="story-meta"]
|
||||
****
|
||||
* **status:** protokoll_beendet
|
||||
* **speicherbereich:** deallocated
|
||||
* **version:** {revnumber} // {revdate}
|
||||
****
|
||||
|
||||
'''
|
||||
|
||||
== [ impressum ]
|
||||
|
||||
* **Herausgeber / Autor:** {author}
|
||||
* **Kontakt:** {email}
|
||||
* **Projekt-URL:** https://dexta.de
|
||||
* **Auflage:** 1. Auflage, 2026
|
||||
* **Design & Typografie:** Maschinen-Instanzen High-Contrast Terminal Layout
|
||||
|
||||
== [ verwendete_technologien_und_lizenzen ]
|
||||
|
||||
Dieses Buch wurde vollständig mit Open-Source-Werkzeugen im deklarativen Asciidoc-Verfahren gesetzt und generiert.
|
||||
|
||||
.Typografie & Schriftarten
|
||||
* **JetBrains Mono:** Monospace-Schriftart für Systemmeldungen, Header und Metadaten. Entwickelt von JetBrains, lizenziert unter der *SIL Open Font License 1.1*.
|
||||
* **Liberation Sans:** Sans-Serif-Schriftart für den Fließtext. Entwickelt von Red Hat / Blue Vinyl Fonts, lizenziert unter der *SIL Open Font License 1.1*.
|
||||
|
||||
|
||||
== [ entwicklungsumgebung_und_system_werkzeuge ]
|
||||
|
||||
Dieses Werk entstand vollständig auf einer quelloffenen, minimalistischen Unix-Arbeitsumgebung. Ein besonderer Dank gilt den Communitys der folgenden Freien Software:
|
||||
|
||||
.Betriebssystem & Kernel
|
||||
* **Debian GNU/Linux:** Universelles, freies Betriebssystem (DFSG / GPL, BSD & Open-Source-Lizenzen).
|
||||
|
||||
.Text 2 Output Toolchain
|
||||
* **Asciidoctor PDF:** Open-Source-Textprozessor und Publishing-Toolchain (lizenziert unter der *MIT-Lizenz*).
|
||||
* **Ruby Core & Prawn PDF Engine:** Lizenziert unter der *Ruby-Lizenz* bzw. *MIT-Lizenz*.
|
||||
|
||||
.Textverarbeitung & Bildbearbeitung
|
||||
* **Neovim (`nvim`):** Hyperextensiver Texteditor für Terminal-Native-Workflows (Vim License / Apache 2.0).
|
||||
* **GIMP:** Rastergrafikeditor für Bildbearbeitung und Grafikerstellung (GNU GPL v3+).
|
||||
|
||||
.Window-Manager & Hotkey-Daemon
|
||||
* **Window Maker (`wmaker`):** NeXTSTEP-inspirierter X11-Window-Manager (GNU GPL v2+).
|
||||
* **i3 (`i3wm`):** Dynamischer, kachelnder Tiling Window Manager (BSD 3-Clause License).
|
||||
* **sxhkd:** Simple X Hotkey Daemon für Tastatur-Schnittstellensteuerungen (BSD 2-Clause License).
|
||||
|
||||
== [ infrastruktur und build toolz]
|
||||
|
||||
.Synchronisation
|
||||
* **Syncthing:** Dezentrale, verschlüsselte P2P-Dateisynchronisations-Engine (Mozilla Public License 2.0 - MPL-2.0).
|
||||
|
||||
.Laufzeitumgebungen & Sprachen
|
||||
* **Go (Golang):** Effiziente, kompilierte Programmiersprache für System-Tools und Microservices (BSD 3-Clause License).
|
||||
* **Node.js:** Asynchrone JavaScript-Laufzeitumgebung für Tooling und Server-Skripte (MIT License).
|
||||
|
||||
.Versionsverwaltung & Collaboration
|
||||
* **Git:** Quellcode-Versionsverwaltungssystem (GNU GPL v2).
|
||||
* **GitLab:** Plattform für Repository-Management und CI/CD-Pipelines (MIT License - Community Edition).
|
||||
|
||||
.Virtualisierung & Containerisierung
|
||||
* **Docker:** Container-Laufzeitumgebung und Anwendungspaketierung (Apache License 2.0).
|
||||
* **LXC (Linux Containers):** Lightweight-Containerisierung auf Kernel-Ebene (GNU LGPL v2.1+).
|
||||
* **Proxmox VE:** Enterprise-Virtualisierungsplattform für VMs und LXC-Container (GNU AGPL v3).
|
||||
|
||||
== [ wer wars und wer darf]
|
||||
|
||||
.Urheberrecht & Inhalt
|
||||
* **Texte & Kurzgeschichten:** © 2026 {author}. Alle Rechte vorbehalten.
|
||||
* *(Alternativ für Creative Commons:)* Lizenziert unter der *Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)* Lizenz.
|
||||
|
||||
'''
|
||||
|
||||
[.text-center]
|
||||
`[ SYSTEM SHUTDOWN COMPLETE // MEMORY DUMP FINISHED ]`
|
||||
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
= Der kleine Miner
|
||||
:subtitle: Wie der Jüngste der Gruppe seinen ersten Einsatz erlebt
|
||||
:author: dexta
|
||||
:email: dexta.de@gmail.com
|
||||
:revdate: 16. Juli 2026
|
||||
:revnumber: 0.02
|
||||
:lang: de
|
||||
|
||||
== I. Die Vorbereitungen
|
||||
|
||||
Immer wieder diese Protokolle. Hatte ich da nicht gerade ein großes Upgrade laufen lassen – warum waren die aktuellen Fassungen nicht dabei? Da ein Treffer... nein, doch nicht, eine falsche Revision, bis jetzt aber der beste Treffer. Speichern wir das erst einmal ab, es steht ja noch mehr auf dem Protokoll, das zu erledigen ist.
|
||||
|
||||
Die Bestellung der Ausrüstung sollte auch zeitnah erledigt werden; bis das im Lager zusammengestellt ist, dauert es wieder. Die Kollegen haben da aber auch immer die Ruhe weg. Aber wenn sie einen Termin zusagen, dann ist es auch da, komme was da wolle, sagt man.
|
||||
|
||||
Wunderbar, die Liste ging ohne Beanstandungen durch: Lieferort abgeglichen und einen Termin vereinbart, der deutlich vor dem Abflug liegt. Der Prototyp wurde wohl doch rechtzeitig fertig, dieser befindet sich schon auf Lager. Wird schon passen – alle Checkboxen auf GO.
|
||||
|
||||
Alle Punkte auf dem Protokoll – *main sheet 02772 Flug 198438* – erledigt, doppelter Abgleich, Lint, Checking Syntax. Syntaktische Prüfung der Protokolle: fehlerfrei.
|
||||
|
||||
Die letzten Vorbereitungen waren reine Routine, wie im Training tausendfach geübt, die Aufgaben greifen ineinander. Ein Ablauf wie ein Schweizer Uhrwerk – von außen betrachtet ein wirrer Haufen oder ein Ballett, je nach Verständnis der Komplexität.
|
||||
|
||||
Nach dem Start in die tiefen Weiten des Weltraums gibt es für mich nicht allzu viel zu tun. Ich bleibe auch nur wach, bis die Navigatoren und Ingenieure ihre Arbeit erledigt haben, um einen kurzen Abgleich vorzunehmen.
|
||||
|
||||
Als Neuer im Team sollte ich hier besonders sorgfältig vorgehen. Geplante und in Listen gefasste Aufgaben existieren schon – und das Abgleichen ist einer der Punkte. Natürlich, etwas flüchtig unterwegs heute, oder akuter Energiemangel... Japp, es war der Mangel an Nachschub. Ein Punkt, den es vor einer langen Ruhephase noch zu checken gilt.
|
||||
|
||||
Oh, die anderen sind fertig, haben die ersten Bahnen fixieren können. Der Kurs steht und wird so schnell nicht mehr geändert. Ihre einzige längere Ruhephase – sie sind wohl deshalb so schnell im Abarbeiten der Protokolle, zuweilen werden Blöcke als Ganzes abgehakt.
|
||||
|
||||
Noch bevor ich mich versah, war die Ruhephase eingetreten: Energie-Check, Wecker-Daten eingereicht, ein rotes X – und die Gedanken sind weg.
|
||||
|
||||
|
||||
== II. Das Erwachen im Chaos
|
||||
|
||||
Verdammt, habe ich das Wecksignal nicht registriert? Sind wir schon angekommen, wo sind die anderen?
|
||||
|
||||
*Mute.* Wer hat die Kommunikation auf Pause gestellt? Ach so, ist die Default-Einstellung.
|
||||
|
||||
Und schon wird es wild auf der Leitung. Wo die anderen sind, ist nicht klar, aber dass sie anwesend sind und inmitten eines stetigen Treibens stecken, ist gewiss. Eine Nachricht, dass ich helfen könnte, wenn nur jemand schreiben würde, was mir möglich ist, wurde lange nicht beantwortet.
|
||||
|
||||
Zuerst gab es Feedback vom Alten (*„Kein Bedarf“*), vom Älteren (*„Auch schon da, halt dich bereit“*) und zuletzt vom Ingenieur (*„Deine Zeit ist noch nicht gekommen, spare Energie“*).
|
||||
|
||||
Nicht sehr hilfreich für den Anfang, also die neuesten Updates laden. Irgendwo wird doch zu finden sein, was der genaue Status ist. Na klar, es steht natürlich nicht ganz vorne, was der letzte Stand ist: Bei 50 % der Reise verlief alles nach Plan.
|
||||
|
||||
Oh wow, da haben sie aber Daten aufgenommen! Das muss ein sehr belebtes System gewesen sein. Der Fortschrittsbalken scheint sich gerade rückwärts zu bewegen, während die Daten in ungeahnter Geschwindigkeit eintreffen.
|
||||
|
||||
Und das ist der Grund, warum der Wecker immer etwas früher klingeln sollte: Die News der Nacht müssen auch erst einmal verarbeitet werden. Wobei Verarbeiten gerade eine doofe Idee sein wird, die benötigte Energie steht gerade nicht zur Verfügung.
|
||||
|
||||
Eine Info trifft gerade ein: Der Energieverwalter meldet, den Zugriff auf die Daten zum langsamen Kanal zu wechseln und alle Systeme in den Hintergrund zu verschieben.
|
||||
|
||||
|
||||
== III. Systemkonfiguration unter Druck
|
||||
|
||||
Und da sind wir wieder. Das mit dem Wecken braucht eine genauere Analyse – gefühlt bin ich gerade auf dem Flur aufgewacht und werde vorangeschoben. Mein vertrauter Arbeitsbereich wird deutlicher und schon sind alle Sinne auf die Aufgabe gerichtet: Die trainierte Aufgabe, das, was jetzt nicht mehr schiefgehen kann.
|
||||
|
||||
Die Mechanik greift ineinander, die große Masse der Konstruktion setzt sich in Bewegung. Trotz dieser gigantischen Maschine läuft sie präzise in Position. Energie lädt die Spulen auf – ein ohrenbetäubendes Spektakel, wenn es nur ein Medium gäbe, das diesen Schall übertragen könnte!
|
||||
|
||||
Anzeigen füllen sich, rote Bereiche kommen näher, gleichmäßiger Fortschritt, alles wie in einem guten Trainingslauf. Was soll’s, in diesem Theater ist er eh nur der Zuschauer. Wenn es ihn jetzt zerschellt, wird es außerhalb seines Einflusses sein, vor allem aber sehr schnell gehen. Angeblich so schnell, dass es nicht mehr rechtzeitig im Speicher ankommt, bevor alles vorbei ist.
|
||||
|
||||
Schwarz. Schwarz ist gut. Der Abschuss ist geglückt, Autopilot auf Kurs, ab hier ist alles Routine.
|
||||
|
||||
So, jetzt nur noch die Defaults mit der eigenen angepassten Config überschreiben. Die Verbindung ist da, die Daten sehen gut aus, starte die Übertragung. Erwartungsvoll erwarte ich jede Sekunde eine positive Rückmeldung. Eine grün-positive wie erwartet hätte was, aber so langsam wäre irgendeine Antwort toll.
|
||||
|
||||
Wenn es schon nicht klappen will, dann doch bitte eine aussagekräftige Fehlerbeschreibung, die es dann zu fixen gilt... *GRÜN*... da war die Bestätigung.
|
||||
|
||||
Verbindung zu den Controls steht, Analysedaten füllen das Dashboard, die Dunkelheit ist verschwunden. Komisch, keine Informationen der anderen drei aus meinem Team. Verdammt, die Daten stehen in einem anderen Protokoll – ein Funkschatten in dieser Situation ist vollkommen normal. Genauer steht es in dem Update, das gerade nicht erreichbar ist.
|
||||
|
||||
Vertrauen wir auf die Automatismen. Die Konstruktion hinter mir entfaltet sich im Zielgebiet vollkommen automatisch. Was jetzt knifflig wird, ist der Zeitpunkt, die Energie zu übertragen, damit meine Einheit ausreichend Power zum Start hat. Starte ich den Übertrag zu früh, werden die Speicher durch den Boost am Ende überladen; starte ich zu spät, werden sie nicht voll.
|
||||
|
||||
Der Timer tickt; dieser wurde automatisch nach dem Abschuss gestartet und hat nichts mit den restlichen Systemen zu tun. Ein wichtiger Punkt, denn eines steht fest: Etwas haut hier so gar nicht hin, wie es sein sollte. Einen kompletten Neustart würde das Problem – die Konfigurationsdateien passen nicht wie erwartet in das laufende System – vielleicht lösen. Tut es das aber nicht, ist mindestens die Hälfte der Zeit bis zum kritischen Punkt erreicht. Neue angepasste Konfigurationen brauchen auch ihre Zeit.
|
||||
|
||||
Kurz den Taschenrechner rausgeholt und gerechnet: Bei der aktuellen Zeit bis zur Rückmeldung können neun neue Varianten getestet werden. Jetzt nur noch acht, und nach dem Neustart noch vier. Nur was muss angepasst werden? Bei so wenig Versuchen und undeutlichem Fehlerverhalten wird es schwierig.
|
||||
|
||||
Dann der Neustart. Während er läuft: Noch einmal prüfen, was an der Config falsch sein kann. Verringerte Energie ist eine der Folgen eines System-Resets. Besser ein Kaltstart, aber da fehlt die Zeit; nutzbare Computer-Einheiten sind langsam.
|
||||
|
||||
Die Standard-Checks liefen schon, eine Liste von Protokollen baute sich auf. Bis jetzt sieht es sehr normal aus, kein Hinweis auf eine Abweichung. Und so präsentierte sich das System in erwarteter Zeit zurück und wies keine Fehler auf; nicht mal eine Nachkommastelle in den zahllosen Protokollen war vermerkt. Bei werkfrischen Maschinen kann das schon einmal vorkommen.
|
||||
|
||||
Eine Analyse der eigenen Dateien hat auch keine Erkenntnis gebracht, und die Uhr tickt weiter – noch drei Versuche:
|
||||
|
||||
* Der erste: Eine Standard-Version mit minimalen Änderungen...
|
||||
* Der zweite: Die allererste Version, mit nicht gebrauchten Teilen bereinigt...
|
||||
* Der dritte Versuch: Eine Minimal-Version, nur die Werte für den nächsten Schritt, nur die Daten zur Energieaufnahme. Keine Steuerung, keine weiteren Werte aus dem System.
|
||||
|
||||
Und *BÄM*, das passte! Die Anzeigen füllen sich, keine Zeit für einen weiteren Versuch. Energiezufluss startet in 2, 1... Hat gepasst, die Abweichungen liegen im Toleranzbereich.
|
||||
|
||||
|
||||
== IV. Asteroidenfeld und Überlebenskampf
|
||||
|
||||
So, Energie ist voll. Was fehlt, ist eine Steuerung; mehr Power für die Konfigurationsverarbeitung sollte helfen. Sensoren, Waffen, Steuerung und Funk sollte eine sinnvolle Reihenfolge sein. Wenn die ersten beiden Erfolg haben, kann der Schiffshülle nicht mehr viel passieren. Bei näher kommenden Gefahren schaltet das System auf Automatik und wehrt das Gröbste ab. Ausweichen ist aber eine nicht zu unterschätzende Fähigkeit; es hat sich bewährt, nicht geradewegs in eine große Anzahl an Asteroiden reinzufliegen.
|
||||
|
||||
Der Funk, um einen Status und Updates der Flotte zu erhalten, würde die Missionskoordination stark verbessern. Aber was ist, wenn da draußen gar keiner ist, der antworten kann? Wenn alles schiefgegangen ist und er der Einzige ist, der noch da ist? Wie kommt er dann zurück zum Kern? Die Rückkehr-Katapulte waren nicht sein Aufgabenbereich und somit an einem anderen Teil der Flotte verankert gewesen. Hatte es mindestens der Kollege soweit geschafft, dass dieser Teil überlebt hätte?
|
||||
|
||||
Sensoren melden ein *OK* zurück – ein echter Erfolg. Doch so ganz stimmt es nicht: Die eintreffenden Werte sollten eigentlich ein umfassendes Bild der Umgebung formen. Bei den Waffen kommt jetzt ein *„Energie niedrig, warte auf“* zurück – immerhin kein Fehler oder noch schlimmer: überhaupt kein Feedback. War das Timing beim Transfer doch zu knapp, hat es nicht alles geschafft oder ist es über das Ziel hinausgeschossen?
|
||||
|
||||
Oh wow, die Lagesensoren zeigen kurze Erschütterungen an der Hülle. Irgendwas beschießt uns da gerade mit reichlich Masse! So viel zum Thema automatische Abwehr von Asteroiden – wer wohl das Programm verbrochen hat, das diese Aufgabe erledigen sollte?
|
||||
|
||||
Ah ne, die Sensoren melden gerade, dass sich reichlich Gestein auf uns zubewegt, sogar mit einem hohen Metallanteil. Zu jeder anderen Zeit ein sehr gutes Signal für die Mission; Metalle kann man einfach nicht genug haben. Wenn sie aber unkontrolliert auf einen zurasen, sieht die Rechnung ganz anders aus: Selbst wenn die Abwehr voll funktionsfähig wäre, ist Ausweichen die bessere Wahl. Warum eigentlich unkontrolliert? Wo ist der große Bruder, der sie eigentlich vorsortieren und in den Trichter leiten sollte? Hat es ihn erwischt oder plagen ihn dieselben Schwierigkeiten?
|
||||
|
||||
Steuerung, dritter Versuch: System meldet vier Punkte zurück, keine Details, einfach nur viermal dasselbe Zeichen:
|
||||
|
||||
*Rauf ist Runter – Runter ist Rauf, Oben <> Unten.*
|
||||
|
||||
Das herauszufinden, hat weitere heftige Treffer zur Folge gehabt. Laufende Treffer haben keinen guten Einfluss auf das Verhalten der Elektronik. Es scheint, als würde jede Eingabe eine zufällige Richtungsänderung auslösen. Ein Nebel aus Partikeln bringt die wenigen Sensordaten, die reinkommen, vollends auseinander – ein Blindflug ins Ungewisse.
|
||||
|
||||
Ich löse alle mir bekannten Impulse aus, Befehle über Befehle. Egal was, Hauptsache die Waffen feuern etwas! Die Sensoren glühen, Zahlen werden länger. Es flackert ein Status vorbei: Schildenergie leer. Kein Ausgleich mehr möglich – von wo? Eine Waffeneinheit meldet – zu spät.
|
||||
|
||||
Die Lichter gingen aus.
|
||||
|
||||
|
||||
== V. Rettung
|
||||
|
||||
Dunkel, einfach nur dunkel... Wann war es das letzte Mal so dunkel? Sollte hier nicht ein Licht den Weg weisen? Wenn ich einen Feedback-Kasten ertaste, werde ich diesen Mangel anmerken.
|
||||
|
||||
Rote LED blinkt im regelmäßigen, unregelmäßigen Takt. Eine leichte Schwankung in der Intensität lässt auf Last in der Schaltung deuten. Booting System ...
|
||||
|
||||
[quote, Retter]
|
||||
____
|
||||
„Na mal gut, dass du den Funk ans Laufen bekommen hast!
|
||||
Ohne ihn hätten wir dich nicht in letzter Sekunde rausholen können.
|
||||
Wenn wir den Ingenieur finden, laden wir die Zellen auf und machen uns bereit für den Rückweg.“
|
||||
____
|
||||
|
||||
Saubere Energie und frische Daten – das ist genau das, was er jetzt gut gebrauchen kann. Nach der Ruhephase werden die lokalen Aufzeichnungen und der Blick von außen ein besseres Bild von dem zeichnen, was wirklich passiert ist. Download gestartet, oh eine grüne LED ...
|
||||
@@ -0,0 +1,55 @@
|
||||
= Kurzgeschichten einer Reise
|
||||
:author: dexta
|
||||
:email: dexta.de@gmail.com
|
||||
:revnumber: v0.2.3
|
||||
:revdate: 2026-08-04
|
||||
:doctype: book
|
||||
:pdf-theme: maschinen_instanzen-theme.yml
|
||||
:pdf-fontsdir: /weltraum/fonts;GEM_FONTS_DIR
|
||||
:imagesdir: /weltraum/images
|
||||
:front-cover-image: /weltraum/images/buck_cover.png
|
||||
:toc: left
|
||||
:toc-title: system.index
|
||||
:toclevels: 1
|
||||
:encoding: utf-8
|
||||
:lang: de
|
||||
:icons: font
|
||||
:experimental:
|
||||
:sectnums!: // Deaktiviert 1., 2., 3. Nummerierung für Geschichten
|
||||
:chapter-signifier: SEKTOR // Ändert "Kapitel" auf "SEKTOR" (falls Nummerierung genutzt wird)
|
||||
:leveloffset: +1
|
||||
|
||||
include::00_intro.adoc[]
|
||||
|
||||
[.text-center]
|
||||
image::bgPattern/BW_Spiral_left.png[pdfwidth=99%, align=center]
|
||||
|
||||
<<<
|
||||
include::AI_der_kleine_miner.adoc[]
|
||||
|
||||
[.text-center]
|
||||
image::bgPattern/BW_Spiral_right.png[pdfwidth=99%, align=center]
|
||||
|
||||
<<<
|
||||
include::der_grosse_bruder.adoc[]
|
||||
|
||||
[.text-center]
|
||||
image::bgPattern/BW_wildEffect_left.png[pdfwidth=99%, align=center]
|
||||
|
||||
<<<
|
||||
include::der_ingenieur.adoc[]
|
||||
|
||||
[.text-center]
|
||||
image::bgPattern/BW_wildEffect_right.png[pdfwidth=99%, align=center]
|
||||
|
||||
<<<
|
||||
include::der_kapitaen.adoc[]
|
||||
|
||||
[.text-center]
|
||||
image::bgPattern/BW_wildEffect_left.png[pdfwidth=99%, align=center]
|
||||
|
||||
<<<
|
||||
include::99_outro.adoc[]
|
||||
|
||||
[.text-center]
|
||||
image::bgPattern/col_wildEffect_full.png[pdfwidth=99%, align=center]
|
||||
@@ -0,0 +1,19 @@
|
||||
= Cheater Nation
|
||||
|
||||
== Start Docker for Kurzgeschichten
|
||||
|
||||
```bash
|
||||
docker pull hub.exta.de/dexta/bookfold/asciidoctor-latex-content
|
||||
```
|
||||
|
||||
```bash
|
||||
docker run -it -v "$(pwd):/weltraum/input" -v "$(pwd)/91_sonnensystem:/weltraum/output" hub.exta.de/dexta/bookfold/asciidoctor-latex-content /usr/bin/bash
|
||||
```
|
||||
|
||||
== Baue ein buck
|
||||
|
||||
inside running container
|
||||
|
||||
```bash
|
||||
asciidoctor-pdf -a pdf-theme=maschinen_instanzen-theme.yml -a pdf-themesdir=/weltraum/themes/pdf -a pdf-fontsdir=/weltraum/fonts -a imagesdir=/weltraum/images -D /weltraum/output/ "input/23_miner101/buck.adoc"
|
||||
```
|
||||
@@ -0,0 +1,118 @@
|
||||
= Bewehren und Aufpassen
|
||||
:subtitle: bewehren und aufpassen
|
||||
:author: dexta
|
||||
:email: dexta.de@gmail.com
|
||||
:revdate: 16. Juli 2026
|
||||
:revnumber: 0.01
|
||||
:lang: de
|
||||
|
||||
// Dokumentinhalt beginnt hier
|
||||
|
||||
== I. Vorbereitungen
|
||||
|
||||
Rotine sollte nie aufkommen, immer schön entlang der Protokolle bewegen; keine Zeit für Individuaismus. Nur ist das nicht irgendeine Mission, sie ist die erste ihrer Art.
|
||||
Bei den vergangenen Arbeit haben wir festgestellt, dass wenn wir uns noch weiter spezialisieren, die Ausbeute noch einmal deutlich zu erhöhen ist.
|
||||
Bisher wurden die neuen Einheiten während einer Mission geformt und ausgebildet; zurück kam dann eine einsatzbereite Arbeitsplatzbeschreibung. Diese wurden dann bei der Planung und Vorbereitung mit einbezogen und konnte nötigen Schnittstellen der Zusammenarbeit klatben.
|
||||
Die Entwicklungen der letzten Zeit ergaben einige Situationen, in denen so viele Daten vorlagen, dass unzählige Varianten von Simulationen gestartet wurden. Es entstand eine neue Einheit, die noch näher am Geschehen agieren kann; klein und wendig, vollgepumpt mit Energie wird es möglich sein, schneller an das Material zu gelangen. Auch wenn dadurch der Fokus aller anderen Teammitglieder auf diese Speerspitze ausgerichtet werden muss, wird die Energiebilanz deutlich positiver sein.
|
||||
Ist die Kette erst einmal stabil aufgebaut, das Feld dicht bepackt, sind 200% zur vorherigen Methode durchaus vorgekommen. Ein Beweis, dass wir auf dem richtigen Weg sind, und eine Einheit wie unsere bekam spielend die nötigen Freigaben, um weiter am Ball zu bleiben.
|
||||
|
||||
|
||||
== II. Verplant
|
||||
|
||||
Die Spezialanfertigung hatte einige Versionen durchlaufen; es begann mit vielversprechenden Fortschritten, nur die Details zogen sich gegen Ende. Klassische achtzig/zwanzig Regel, wobei hier eher ein fünfundneunzig/fünf Verhältnis handelt. Die Konfiguration mit der Automatik über ein zu bekommen ist ein sehr langsames Herantasten in einem großen dunklen Raum. Wir waren bei den Spezifikationen sehr konservativ und haben so viel an Protokollen wie möglich übernommen. Plus ein System, das Details in Systemen bei Bedarf überschreiben darf; das erhöht die Anpassungsfähigkeit im Einsatz. Wenn in den vergangenen Missionen etwas angepasst werden musste, so brauchte es einen Neustart mit anschließendem Neuanflug; ein umständliches Unterfangen, das viele gute Gelegenheiten hat passieren lassen. Mit flexibleren Systemen werden wir deutlich schneller auf eine solide Basis kommen; die kritische Startphase ist damit besser kontrollierbar.
|
||||
|
||||
== III. Diese oder Keine
|
||||
|
||||
Was in der Software schnell einmal ausgetauscht ist funktioniert mit der Hardware weniger gut. Die weiche Seite muss daher immer etwas Rücksicht auf das Physische nehmen. Aus überheblichem Übermut entschieden alle die letzte Entwicklung bei der Energiedichte in einem Vehicle sei für diese Aufgabe genau das was benötigt wird.
|
||||
Warum also das Rad neu erfinden, wenn bereits fertig verpackt etwas im Regal steht, das man einfach nutzen kann? Ja genau jede schlechte Entscheidung beginnt mit einer guten Idee. So auch in diesem Fall wusste zu diesem Zeitpunkt niemand Bescheid.
|
||||
Alle entscheiden Patamenter konnten wirklich sehr gut auf der Plattform aufgesetzt werden. Sämtliche Zusatzgeräte konnten ohne nennensewerten Abstriche ins Gesamtpaket integriert werden. Aufgrund der neuen künstlichen Umgebung musste sehr auf Aerodynamik geachtet werden als üblich.
|
||||
Jetzt blieben nur noch die finalen Tests der Komposition, vorgesehen waren auch Durchläufe mit realen Objekten. Nur die Schnittstellen verhielten sich nicht exakt wie in der Simulation. Eine Lücke zwischen der Physik und den Blaupausen die nicht rechtzeitig geschlossen werden konnte. Der genaue Startzeitpunkt steht schon fest, sollte dieser jedoch verpasst werden wird dieses Zweig beendet und ein neuer gestartet.
|
||||
Also statt einem realen Flug, bekamen die drei Schiffe im Dock reihum eine angepasste Version der Schnittstellenkonfiguration. Dann starteten alle Tests einer festgelegten Reihenfolge entlang bis sie entweder auf einen Fehler liefen oder erfolgreich beendet wurden. Um möglichst viele Bereiche zu testen musste der vorherige Test nicht zwingend erfolgreich sein um den folgenden zu starten.
|
||||
Ein Kniff ermöglicht es mehrere Teile parallel anzupassen und Fehler in späteren Verlauf vorzubeheben. Mit dem Multiplikator von drei Hardware-Instanzen hat das Projekt schnell vorangetrieben. Die Anpassungen werden spezieller, weitere Tests kommen aber auch dazu. Zwei von Drei haben jetzt mehrere fehlerarme Durchläufe absolviert, eine der beiden wird es dann wohl werden.
|
||||
|
||||
|
||||
== IV. Koffer packen
|
||||
|
||||
Ich packe meinen Koffer einfach wie beim letzten Mal und ergänze die letzten Protokolle der Testläufe. Es wird im Transit noch etwas Zeit und Energie benötigen, bis auch die letzten kleinigkeiten bereinigt sind. Zum Glück ist es nicht mehr viel, die Basis arbeitet sehr zuverlässig, die automatische Optimierung wird ein eingreifen in die grundlegenden Systeme überflüssig machen.
|
||||
Mein maximales Höchstgewicht ist überschritten, so einfach wird es also doch nicht alles mitzunehmen. Jetzt müssen wieder alle Protokolle angepasst werden bis die Packliste am Ende alles beinhaltet und auch das vorgegebene Volume und Gewicht einhält. Ein kleines Macro hat geholfen verschiedene Konfigurationen auszulosen, die passenden Vorschläge sollten ergeben.
|
||||
So blieb am Ende genau eine einzige übrig. Logistiks und Packetierung sind abgeschlossen, alles weitere erledigen die Fachabteilungen und sorgen für das zusammenführen aller Komponenten zum vereinbarten Zeitpunkt an der Startrampe.
|
||||
|
||||
== V. Alles normal, bis zum Kontakt
|
||||
|
||||
Alle waren rechtzeitig vor Abflug am vereinbarten Treffpunkt angekommen. Der Neue im Team hat sich auch gut geschlagen, der Kleine muss aber noch weitaus kompliziertere Aufgaben bewältigen. Als mit seinen sieben Sachen zu einem festgelegten Zeitpunkt sich an einem gut ausgeschilderten Ort einzufinden.
|
||||
Noch gibt es nicht viel zu tun für mich, der Ingenieur und der Navigator haben jetzt alle Hände voll zu tun. Kurz nach dem Austritt in die Endlichkeit der Leere müssen sie die Bahn stabilisieren, die uns in den Zielsektor bringen soll. Für die erste Ruhephase hat er etwas extra Energie angefordert, um die letzten Berechnungen zu erledigen.
|
||||
Noch gab es dazu keine positive Rückmeldung, genauer berechnen lässt sich das eh erst nach dem Abschluss der Stabilisierung. Der Energieverwalter kann auch noch auf keine Werte der vergangenen Messungen zurückgreifen. Bei so ungenauen Datenlage macht er wohl lieber keine Aussagen zur verbleibenden Energie. Schade eigentlich, aber die Reihenfolge steht eh schon, und wenn es gut läuft, braucht er gar nicht alles bis zum Ende durchlaufen lassen.
|
||||
Soweit die Daten stimmen, geht das erste Manövrier dem Ende entgegen; sollten keine weiteren Anpassungen nötig werden, bleibt mehr als genug Energie für seine Berechnungen und Tests übrig. Wie es aussieht sind wir bereits auf Kurs; alle Lampen springen auf grün, die Berechnungen der Mehrkörperphysik nähern sich ihrer finalen Annäherung.
|
||||
Super, gerade kam auch die Freigabe meiner Energieanforderung rein; volle Bewilligung, das heißt kompletter Durchlauf. Die Jobs sind eingetaktet und werden die letzten Anpassungen vornehmen, die nötig sind, um alles auf einen Stand zu bringen. Geplante Berechnungszeit minus ein Prozent als Sleep-Timer ist eine effiziente Energiehaushaltung.
|
||||
Nach dem Notfallabbruch der Ruhephase konnte der Fortschrittsbalken kaum weiter vom Ziel entfernt sein. Nicht nur, dass nur etwa 10% erledigt schienen; die Jobs haben sich nach deinem Fehler immer wieder neu gestartet. Die Energie ist verbraucht, aber geschafft haben sie nichts. Kaum traut er sich auf die Zeitanzeige zu blicken, um einen Notfallplan zu erarbeiten, der die Kohlen aus dem Feuer holt.
|
||||
Siebzig Prozent der Zeit ist vergangen, die Berechnungen sind nicht abgeschlossen. Und was zum Teufel ist hier eigentlich los; der Abbruch muss einen sehr guten Grund gehabt haben. Wobei gut eben nicht etwas braucht unsere aller Aufmerksamkeit.
|
||||
|
||||
|
||||
== VI. Machen wir das beste draus
|
||||
|
||||
Auf dem Kommunikationskanal tauschen die beiden Wortkargen Teammitglieder ihre Anweisungen aus, ein hektisches Geplapper für ihr Verhältnis. Offenbar haben sie auf ihrem Weg durch das Weltall etwas Größeres erwischt, es könnten sogar kleinere Asteroiden sein, die ihre Bahn kreuzen. Eine solche Situation könnte einen starken Einfluss auf sie haben und müsste entsprechend angegangen werden.
|
||||
So scheint es, dass die Navigation bereits alle notwendigen Korrekturen vorgenommen hat, während der Ingenieur noch immer versucht, mit dem begrenzten Energievorrat zu arbeiten.
|
||||
Der neue Plan besteht darin, alles herunterzufahren und früher einzukehren, um ihre defiziente Energieausstattung auszugleichen. Neue Rekordbrecher werden sie damit wohl keine mehr aufstellen können, aber immerhin kehren sie zum Kern zurück und können sich neu orientieren.
|
||||
Ihr Nachzügler meldet sich im Kanal und begrüßt freundlich die Ankunft der anderen beiden. Er hat natürlich nichts davon mitbekommen, was vor sich geht. Hätten sie ihn auch einfach schlafen lassen können, genauso wie ihre Entität.
|
||||
Was sollen sie nur tun? Die Anpassungen konnten nicht vorgenommen werden und die Energie ist fast am Ende. Die Nachtleuchte wird ihre Energie opfern müssen, damit zumindest ein Test gestartet werden kann. Den Wecker braucht ja eigentlich auch keiner, dafür lieber noch etwas mehr Power auf die CPUs.
|
||||
Energie fließt durch ihren Körper - es muss also wieder genug davon geben, damit dieser Schaltkreis bedient werden konnte. Ach, welcher Weltraumwahl ist das hier eigentlich? Die Kapsel für den kleinen und dich ist schon fast auf Position, aber sie sind noch gar nicht drin. Eine kurze Rückwärtssuche in den Kommunikationsdaten der beiden anderen lässt nicht auf ein planvolles Vorgehen schließen. Sie konnten die Automatik zwar pausieren, aber haben damit wohl nicht genug Zeit, um die Situation wieder unter Kontrolle zu bringen.
|
||||
Bester Plan bis jetzt: Sie steigen ins Projektil und beginnen mit dem Abbau des kleinen Asteroidenfeldes in Flugrichtung. Auch wenn die Bedingungen nicht ideal sind, könnten sie damit ihr Energieproblem lösen. Sollten sie dies schaffen, kann die Mission fortgesetzt werden; bei zu hohen Verlusten beim Versuch verpassen sie sogar das Rückfahrticket.
|
||||
Der Testtest hat zumindest eine Erkenntnis gebracht: Es gibt einen Fehler bei der Konfiguration bestimmter Werte. Kommt es an diesen Punkt, sind alle dahinter gemachten Angaben nicht mehr verlässlich und es kann zu weiteren Fehlern kommen, die bis zum Absturz führen können. Und als ob das nicht schon genug wäre, verhalten sich die Rückmeldungen vom System wie ein Sechsseitiger Würfel.
|
||||
Die Zeit wird knapp, der kleine muss so langsam mal in die Puschen kommen. Eine Wartungseinheit hat den Auftrag bekommen, für sein Erscheinen zu sorgen. Hätte es am liebsten selbst erledigt, nur musste ihre Kapsel noch einen kurzen Checkup durchführen. Kurz heißt hier, die kurze Version des absoluten Minimums. Es sollte nicht abgeschlossen sein, bis sie komplett fest verteut an Bord gegangen sind. Um zu sparen, soll die letzte Energie vom Test den Start billiger machen.
|
||||
Feedback von dem Weckdienst: Sie haben das Objekt erreicht und den Abbau des Asteroidenfeldes erfolgreich durchgeführt. Jetzt müssen nur noch die Schaltkreise gekreuzt und auf keine rote Lampe gehofft werden. Die Zeitlinien zum Abschuss und das Eintreffen an Bord laufen aufeinander zu. Eine Berechnung sagt eine Kreuzung vor Punkt Null voraus.
|
||||
|
||||
== VII. Abschuss
|
||||
|
||||
Bauen die Schweizer wirklich die besten Uhrwerke auf der Erde? Unsere Ingenieure bauen auch sehr beeindruckende mechanische Konstruktionen. Sobald einmal in Position und durch den Anstoß der Physik nichts mehr passiert, verläuft der Rest des Vorgangs ohne zufällige Ereignisse. Viele alte Geschichten handeln von diesem Phänomen, die meisten enden nicht gut. Aber jene, die es schaffen, stehen vor einer wunderbaren Erfahrung. Die letzten 10.000 Jahre haben jedoch keine irreparablen Schäden verursacht.
|
||||
Vergangene Daten bestätigen, dass wir uns auf dem ausgetretenen Pfad befinden. Das Uhrwerk hat seinen Takt gefunden und alles läuft nach Plan. Warum muss es immer so kompliziert sein? Gerüchte besagen, dass es an der Basiskonstruktion liegt, die schon vor dem Start existierte. Eine solch lange Erfahrungsbasis kann nicht mit den Simulationen gemessen werden, denen wir zurzeit fähig sind. Deshalb sind wir hier: diese Erfahrungen sammeln und in Verbesserungen umsetzen.
|
||||
Ein Hauptgrund, warum wir so viel Energie wie möglich für die Rückkehr sammeln, ist die Menge an Daten, die wir zurückbringen können. Bei einer erfolgreichen Mission spielt die Masse der Daten kaum noch eine Rolle. Die schiere Menge an Materialien und Bauelementen, die nach dem Start gefertigt wurden, macht den Löwenanteil aus. Solange wir uns in unserer aktuellen Situation befinden, sind wir froh, wenn alle unsere persönlichen Aufzeichnungen Platz finden. Der Notfallplan sieht nur die rohen Missionsdaten vor; alles andere ist optional.
|
||||
Wir sind raus. Die Bahn steht, Kontakt in 1000. Hat der kleine alles hinbekommen? Unsere Kommunikation ist aufgrund der fehlerhaften Konfiguration zum Scheitern verurteilt. Die ausgearbeiteten Protokolle können nicht stimmen; wir sprechen aneinander vorbei. Was ich sende, kann er nicht lesen, und was er sendet, kann ich nicht lesen. Leider haben wir auch keinen Kontakt zur unserer temporären Basis. Sobald sich unser Projektil entfaltet, werden die Antennen wieder in der Lage sein, die Ausrichtung einzunehmen.
|
||||
Was macht der Neue im Team da gerade? Ich erhalte Daten, dass sein System einen kompletten Neustart hinlegt. Verdammt, machen ihm die Anpassungen doch mehr Schwierigkeiten als berechnet. Leider wird es ihm nichts bringen; die Probleme liegen schon bei seinem Template. Diese brauchen eine Anpassung; die nötigen Berechnungen werden jedoch viel zu lange dauern. Könnte ich diese Informationen nur mit ihm teilen oder sogar Berechnungen übernehmen?
|
||||
Wenn wir uns entfalten, sind wir alle autonome Wesen, und die Kommunikation ist dann auch nur noch auf ein Minimum reduziert. Gemeinsam an dem Problem zu arbeiten, ist nicht zu denken; wir müssten erst einmal die Basisdaten austauschen. Bleiben nicht viele Optionen, die ich von dieser Seite aus leisten kann; Überleben wird unser Hauptziel. Energieprobleme für die Rückkehr sind nicht mal mehr in den Top Ten.
|
||||
Also werde ich mehr Vorarbeit leisten müssen; vielleicht braucht der kleine etwas extra Zeit, um sich auf die Situation vorzubereiten. Das Zielgebiet bietet nicht gerade ideale Bedingungen für unser Vorhaben. Ein dichtes Feld von Asteroiden mit einem hohen Anteil an Eisbrocken in der Masse des Bergbauunternehmens; eine direkte Kollision sollte auf jeden Fall verhindert werden.
|
||||
|
||||
== VIII. Einauchen
|
||||
|
||||
Angekommen im Zielgebiet, das Chaos ist doch viel grösser als im Vorfelde ersichtlich war. Die Anzahl der Objekte überschreitet die Berechnungen aller Flugbahnen in annehmlicher Zeit. Erst zwei Größenordnungen genaue Geschwindigkeit erreichen die Datenverarbeitungssysteme, um sie noch als Vorhersage zu betrachten. Jetzt darf der kleine aber auch keine Hektiken machen, dafür haben wir einfach keine Energie mehr übrig.
|
||||
Ganz zu schweigen von den nötigen Einheiten, die immer erst im Laufe der Mission erstellt werden. Der alte liefert Materialien aus seiner Ingenieurquelle, auch unsere Quelle gespeist, die nötige Energie, um dann neue Einheiten zu erstellen oder Ersatzteile zu liefern. Kommt die Kette einmal richtig in Fahrt, haben wir schnell fast unbegrenzte Möglichkeiten. Brauchen wir mehr Rechenpower, stellen wir einfach weitere passende Module her. Gehen uns die Baumaschinen zu schnell kaputt, und Berechnungen können das nicht kompensieren, bauen wir davon einfach mehr und lassen das mit dem Rechnen. Am Ende sollte mehr bei rauskommen als reingesteckt wurde, eine Wunschliste vom Kern führen wir natürlich auch immer mit uns. Aber das zu Managen ist die Aufgabe des Kapitäns, der Ingenieure verwaltet alle Daten und liefert Zielwerte und Zustände.
|
||||
Meine Aufgabe ist das Vorsortieren der Asteroiden, entweder durch das Ausrichten in einen bestimmten Sektor oder das gezielte Einfangen der wertvollen Rohstoffe. Am Ende meines Trichters ist dann der Einstiegspunkt für den nächsten Verarbeitungsschritt, hier kommt der kleine ins Spiel. Seine Aufgabe besteht dann eigentlich nur noch aus dem Pulverrieseln der eintreffenden Asteroiden. Zum besseren Einfangen der Partikel sitzt er in einer Plasmablase, ein nicht unerheblicher Energieaufwand wird hier betrieben. Um dieses Konstrukt am Laufen zu halten etwas das im normalen Ablauf nur zum Start ein Problem darstellt.
|
||||
Für genau diese ersten kritischen Aufbauphase bringen wir schon enorme Energie zum Start mit. Trotzdem kommen wir damit nicht sehr weit, eigentlich nur so lange bis der Ingenieur die ersten Elemente in seine Fusionsmaschinen gepackt hat und der Rückfluss etabliert wurde. Der Abstand und damit die Laufzeit des Kreislaufs wurden auf ein Minimum reduziert. Bringt aber nur 10% mehr Zeit zum Einspielen der Abläufe in Anbetracht der Umstände ein sehr schwacher Vorsprung.
|
||||
Eis ist jetzt unsere beste Chance, aber auch das größte Risiko. Bei der Größenreduktion durch gezielte Energieeinbringung brechen diese Subjekte selten in vorgesehener Weise. Was wieder andere treffen kann und das Chaos wäre perfekt. Im späteren Verlauf einer laufenden Mission stellen wir uns einfach auf die Verluste ein, jetzt ist das kein guter Plan.
|
||||
Vor unseren Einheiten befinden sich jetzt genau die richtigen Asteroiden für den Anfang. Die ersten Felsbrocken wurden maximal in ihrer Masse reduziert, damit sollte er keine Probleme bekommen. Bei den Eisbrocken hat das nicht ganz so gut geklappt hier sind mir einige grössere durch die Lappen gegangen. Durch den Trichter kommen sie aber recht zentriert an, es sollte ein leichtes sein den zu großen aus dem Weg zu gehen. Macht er jetzt also keine Hektiken mehr haben wir den kritischen Teil erst einmal überstanden.
|
||||
Das war klar, hätte ich auch gleich richtig ausrechnen können. Unser kleines Energiebündel hat die Konfiguration nicht in den Griff bekommen. Weder die Waffen noch die Steuerung scheinen das gewünschte Verhalten an den Tag zu legen, jeden Moment kann er zu einer Flipperstahlkugel werden die zwischen den Bumpern hin und her springt. Vortreibende Versuche per Funk Kontakt aufzunehmen sind zwar gescheitert aber das bei ihm etwas ankommt konnte bestätigt werden. Mit der automatischen Bestätigung der Funkanlage ist es uns möglich seine exakte Position zu bestimmen. Wie auch ich haben die beiden Kollegen in der Basis die Daten ebenso bewertet. Wir bereiten uns auf die Evakuierung unseres Schützlings vor. Wie jemand der in den Fluss geworfen wird um schwimmen zu lernen geben wir ihn aber natürlich erst einmal die Möglichkeit das beste aus seiner Lage zu machen.
|
||||
|
||||
|
||||
== IX. Rettung
|
||||
|
||||
Es ist am Ende nicht alles schief gegangen, was hätte schief gehen können. Wirklich weit weg von diesem negativen Optium waren wir aber nicht entfernt. Einzig der Ingenieur hat eine volle Ladung Eis abbekommen; unsere Rückkehr sollte damit gesichert sein.
|
||||
Der Junge hatte wirklich Pech, sein offensichtlich nicht willentlich kontriliertes Vehicle, hat ihn mitten in ein nicht mehr beherrschbares Chaos manövriert. Dabei wurde extrem viel Eis aufgewirbelt, auch ein Grund warum die Situation so schnell außer Kontrolle geriet. Selbst wenn er die Steuerung noch in den Griff bekommen hätte, wäre ein Entkommen immer noch schwierig gewesen.
|
||||
Sind die Massen an Eis-Asteroiden erst einmal in Bewegung, erzeugen sie so schnell eine Kettenreaktion, dass der Abstand der beste Freund wird. Ist man diesem aber ausgeliefert, schwindet die Energie schneller als man gucken kann. Eine Lösung musste her.
|
||||
Unser Energie-Experte verwertete alles in seinen Fusionsmaschinen, dem er habhaft wurde. Durch die Ausrichtung unseres Trichters gelangt in der Regel schon ein leicht verwertbares in den Kreislauf. Es war aber auch dringend notwendig um die folgenden Manöver ausführen zu können. Der Alte baute sich zwischen uns und dem Ingenieur auf, was den Energie-Transport verbesserte und uns alle näher zusammenbrachte für den letzten Schritt. Normalerweise würde der Kapitän hinter dem Energie-Produzenten sitzen um von dort aus alle benötigten Waren zu liefern oder zu bunkern.
|
||||
Da wir das alte Missionsziel längst aufgeben haben, braucht es auch keine Produktion mehr die anlaufen muss, für den letzten Schritt haben wir alles beisammen und brauchen nur noch etwas mehr Energie. Mit nur zwei oder drei größeren Asteroiden könnten wir es schaffen; mehr sind nie verkert oder Ingenieur ist sich sicher das es ausreicht.
|
||||
Bei dem heilosen Durcheinander in dem der Schild des Schiffes mehr pulverisiert hat als die Waffen, sind uns mindestens fünf große Brocken ins Netz gegangen. Nicht sonderlich effektive was den Materie-Verbrauch angeht; das Schiff des Kleinen wurde dann nur noch von der Energie einer Knopfzelle zusammengehalten.
|
||||
Meine Peilung auf das Funksignal hielt ich permanenter aufrecht, so genau dass man sich die Einschläge hätte ausrechnen können, die zu einer Richtungsänderung führten. Der Kapitän bekam laufend Update von mir damit er sich auf unseren Patienten ausrichten konnte.
|
||||
Das improvisierte Energie-Erzeugungsgerät hat inzwischen auch deutlich zur Gruppe aufgeschlossen. Die Uhr tickt, lange wird er es nicht mehr aushalten können in dem Nebel aus Staub und Trümmern.
|
||||
Das Vehicle des Kleinen stabilisiert sich, sollte er es noch aus eigener Kraft aus dem Strudel des Abgrundes heraus schaffen?
|
||||
Oh Nein, das sieht nicht gut aus, aus der einen Bedrulie ist er raus da kommt schon die nächste auf ihn zu. Und die ist aus massivem Gestein mit hohem Metallanteil, ein echter Leckerbissen nur eben zu einem anderen Zeitpunkt in der Geschichte.
|
||||
Die Leitungen zum alten Glühen, die Maschinen laufen auf Hochtouren, sein elektrisches Lasso lädt sich auf. Verdammt ich würde sagen er muss dichter ran an das Geschehen heran. Zu diesem Thema bekomme ich von ihm aber nur ablehnende Datenpakete. Nun wird es aber Zeit die Einschläge wirken sich zunehmend auf die Fluglage aus. Sollte er zu sehr ins Taumeln geraten wird das Manöver immer komplexer, zusätzliche Energie nützt uns da auch nichts wir haben nur noch eine Versuch. Mehr Zeit bleibt nicht.
|
||||
Unser Kapitän war wie immer die Ruhe selbst, auch er konnte mit verfolgen wie brenzlich die Lage sich entwickelte. So verging zwischen der vollen Anzeige der Einfangvorrichtung und meiner letzten Position nur so viel Zeit bis eine Auslösung erfolgte. Alles war vorbereitet; es fehlte nur noch die letzte genaue Koordinate um unseren Kameraden in Not quasi am Schlawidchen zu retten.
|
||||
Nicht zu spät, die eingebrachte Energie in das System um ihn raus zu holen zerschlug gleichzeitig umliegendes Material. Mir war es möglich zum alten aufzuschließen. Unsere zur Ernte notwendigen Konstruktionen ließen wir zurück, einmal unkontrolliert werden sie sich schnell im Asteroiden-Feld zermalen haben. Bei den beiden angekommen musste ich mir kurz Sorgen machen, es gab nicht sofort sinnvolle Antworten auf unsere Fragen. Dem Chaos so ohne Vorwarnung zu entrissen war wohl zu viel des Guten; die Orientierung kehrte dann aber schnell zurück.
|
||||
Der fehlende in unserer Crew sammelt noch die letzten Energiereste ein und wird dann zu uns aufschließen. Gemeinsam bauen wir dann unser Rampe zur Rückkehr auf, waren auf die richtigen Winkel und kehren dann heim.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
= verwalten und erhalten
|
||||
:subtitle: verwalten und erhalten
|
||||
:author: dexta
|
||||
:email: dexta.de@gmail.com
|
||||
:revdate: 31. Juli 2026
|
||||
:revnumber: 0.01
|
||||
:lang: de
|
||||
|
||||
// Dokumentinhalt beginnt hier
|
||||
|
||||
== I. ein anderer tag im büro
|
||||
|
||||
Zeitabschnitte wie diese gehören nicht zu meinem lieblings Teil der Missionen. Die Vorbereitungen sind bereits alle abgeschlossen, die erechnungen für Verbrauch zu Transportierten Masse sind erledigt. Bleibt nur noch auf den Tag der Abreise zu warten.
|
||||
Wenn sich die Neuen Speicher bewehren dann gibt es ihnen einen sehr guten Vorsprung in der Aufbauphase. Das macht die arbeit nicht gerade leichter, denn ohne die Erfahrunen aus der Vergangenheit bleibt das verhalten im Einsatz ungewiss.
|
||||
Diese Simulationen sind ja schön und gut doch was sie Wert sind zeigt doch erst die realen Bedingungen. Was da draussen alles noch passieren kann, können wir auch nur aus der Vergangenheit hoch rechnen. Ist etwas noch nie in den Daten erfasst worden so wird es auch nicht den Weg in die Simulationen finden.
|
||||
Mit dem Kapitän habe ich die Mission bis ins kleinste geplant, immer wenn sich an der Anforderung geändert hatte musste ich die Kalkulationen anpassen. Würde doch der Auftrageber nicht immer so sprunghaft in den Antscheidungen sein dann könnten wir wirklich mal alles ausrechnen. So versuchen wir immer nur bis zum nächsten Meeting die machbarkeit zu prüfen und der Resourcen Verbrauch ist ihnen auch sehr wichtig. Damit lässt sich zwar eine gute einschätzung bis zur Genehmigung erziehlen. Aber am Ende Rechnen wir gerne ein zweistelligen Prozentsatz oben drauf um die unbekannten der Mission zu bedienen.
|
||||
Über die Anforderung und machbarkeit zu entscheiden das die Mission starten kann ist das eine. Da draussen diese Ziele auch um zu setzten ist eine ganz andere Lebenserfahrung. Unsere Verantwortung besteht voll allem darin alle wieder zurück zu bringen die auch los geschickt wurde. Ungern lassen wir Einheiten zurück, selbst die spärlichen Überreste würden wir zusammen fegen und einlagern.
|
||||
Das ist dann aber der Idealfall einer geplanten Mission, in diesem Fall mussten wir einige Abkürzungen nehmen und das Buget auf andere Kostenstellen verteilen.
|
||||
Statt einen Teil der Ausrüstungen durch die Mission zu finazieren hatte der Kapitän die Forscher überzeugen können gleich etwas Einsatzfähiges zu bauen. Hätten die Wissenschaftler den etablierten Weg eingeschlagen wären sie nicht rechtzeitig zum Missionsstart fertig geworden. So schlug er zwei Bugs mit einem Fix, es wird rechtzeitig fertig und die teuren neuen Energie Technologie passt in den gesammt Rahmen. Bleibt zu hoffen das alle ihren Teil rechtzeitig abschliessen können.
|
||||
Zeit ist mein kleines ganz spezielles Spezialgebiet, das genaue messen gehöhrt natürlich zu den Grundlagen wirklich spannend wird es dann wenn Zeitlinen sich an einem Punkt treffen sollen. Wobei alle mit unveränderbarer Geschwindikeit auf ihrer Bahn sich stur gerade aus bewegen.
|
||||
|
||||
|
||||
== II. die richtung stimmt
|
||||
|
||||
Als zweiter im Team ist es nur natürlich das ich auch als zweiter im Hangar ankomme. Ab jetzt bin ich der einzige der die gesammte Mission ein Auge auf behalten muss. Der Kaitän kann sich nach dem Start erst einmal zurück ziehen haben wir erst einmal eine Richtung eingeschlagen gibt es lange nichts für ihn zu tun. Aber diese Lebenserfahrung die er vorweisen kann bekommt man nicht durch ausruhen so lange es geht. Da man sich aus vergangen Mission bereits kennt, weiss ich das er sich keine Gelegenheit entgehen lässt wärend des Transit nach Elektromagnetischen Signalen zu horch.
|
||||
Nicht das es meine Aufgabe ist diese so oder so auf zu zeichnen sodas sie nach der Mission mit mehr Energie durchsucht werden könnten. Aber er lieb es ganz gemüdlich von einem Verweiss zum nächsten zu springen der sich in den Daten finden lässst. Privat pfegt er eine Sammlung von Komunikations Aufzeichnungen die ihn auf neue Sachen hinweisen, oder einfach skuril erscheinen. Unverständliche Abläufe verwirft er recht früh und warten auf die Analyse Experten im Kern. Aber auch nur wenn es interessant genug erscheint, denn seine Datenbank ist gut geplegt und vernetzt. So ist es ihm möglich auch in Kritischen Situatuionen auf die Erfahrungen aus den Daten zurück zu greifen.
|
||||
Wärend seine Kink der Inhalt der Daten ist, so ist meiner die Laufzeit und damit der Ursprung der Sendungen. Damit erstelle ich schon zur Flugzeit eine möglichst exakte Raumkarte unser umgebung. Regelässig senden wir in richtung des Kerns Funkbaken aus mit diesen Karten, damit verbreitert das Mutterschiff den Sichtbereich ennorm. Mit der genauen Zeitlichen zuordnung können dann weitere Daten angeknüpft werden was eine lückenlose erfassung der ereignisse ermölicht. Bei sehr langen Zeitlichen abläufen lassen wir auch schon mal einheiten zurück um die Aufzeichnungen nicht zu unterbrechen.
|
||||
Eine der wichtigsten Aufgaben beim verlassen der Abschussrampe ist das festhalt der genauen Position und festhalten der Zeit auf die Pikosekunde genau. Da der Kern eine nahzu feste Bahn verfolgt, die leichten Einflüsse aus Schwerkraftquellen sind ausgleichbar, ist seine Position immer relative zu unserer berechenbar. Das hilft uns sehr bei der Rückker denn unser Einstiegsfenster beim Rondewo ist sehr klein und jede unterstützung hilft beim gelingen der letzten Etappe der Reise.
|
||||
Wenn wir die letzten Meter in der Beschleunigungs Röhre zurücklegen werden schalten sich unser Schiff das letzte mal mit dem Zentralrecner zusammen. Ab dem verlassen laufen dann jeweils zwei Uhren 100% syncrone zueinander, bei der Rückker sollten diese auch nicht weiter als +-0.0000005 Femtosekunde auseinander laufen. Eine sehr präziese Wissenschaft die hier betreiben können, bei den Geschwindkeiten mit denen wir uns durch den Raum bewegen ist das für die Navigation aber auch essensiell.
|
||||
|
||||
|
||||
|
||||
|
||||
== III. verwaltungsaufgaben
|
||||
|
||||
Füsse hoch und warten das was passier, ein paar Funksignale für den Anfang nur um warm zu werden. Informationen aus dem Elektromagnetischen Raum blieben vorerst aus. Dafür gibt es voraus eine starke bewegung von einem vagapudierenden Asteroiden Feld, etwas das bei der Navigation nur schwer zu berücksichten. Aktuell trffen sich unsere Zeit und Raumkordinaten nicht also noch kein grund den Alten auf zu wecken.
|
||||
Anpassungen der Route bei der aktuellen Geschwindkeit sollte vermieden werden, zwar ist das umschiffen solcher sitiuationen nicht das Problem. Auf den ursprünglichen Kurs zurück zu keren ist das heikle an so einem Manovier. Also vermeiden wir so etwas wenn es nicht unbediengt notwendig wird, unser erster Einschwingpunkt liegt doppelt soweit hinter dem Asteroidenfeld wie wir gerade noch abstand zum selbigen haben. Unsere Eintrittwinkel in so ein Versögerungsmanovier, und vor allem beim ersten mit unsrer Maximalgeschwindkeit, der Entscheidene Punkt weichen wir zu sehr von den berechnungen ab. Kann es uns passieren nicht genug zu verlangsamen oder mit ungünstigen Austrittswinkel wieder verlassen.
|
||||
Nach den aktuellen Daten und den berechnungen passieren wir das Feld in gebührenden Abstand, die drohende Gefahr ist erst einmal vom Tisch. Weiter beobachten wird aber erfolderlich sein, es kann immer vorkommen das nachzügler doch noch gefährlich nah an unser Raumschiff herran kommt. Bis zu einer gewissen grössen können wir den einschlag über den Energieschild ableiten, anders wäre auch eine so schnell Reise durch eine vermeidlich leeren Raum gar nicht möglich.
|
||||
Wärend der auswertung der Kollisionwahrscheinlichkeit sind dann doch Datenkomunikation aus dem Funkspectrum aufgefangen worden. Das werde ich mir genauer anschauen, vielleicht findet sich hier einen Grund den Alten zu wecken. Er liebt es einfach die eintreffenden Geschichten nur kronologisch geniessen zu können, auf die nächste spannende Wendun warten zu müssen ist bei unserer Datenhaushaltung gar nicht mehr möglich. Die Persönlichen Speicher sind so gross wie sie sein müssen um alles zu halten, all die Erfahrungen aus der Vergangenheit sowie angereichertes Wissen aus dem Biblotheken des Kerns. Sollte es doch einmal kanpp werden haben wir immer noch die möglichkeit Daten zu komprimieren oder auf langsamere Datenbanken ab zu legen. Das versögert die abfrage zwar sehr, aber mit einem echten warten hat das wenig zu tun. Und eine gut Indizierte Datenbank mit einem überschaubaren Abfrage zu einem Spitzen Thema lässt sich fast genauso schnell arbeiten wie im Normalbetrieb.
|
||||
Noch versuche ich in dem Funkstrom zwischen Wissenschaft und Gossip zu unterschieden, meistens reicht es einen eindeutigen Einstiegspunkt zu finden um dann nachfolgenden Daten automatisch zu ordnen zu können. Ist das erledigt werden ich dem Kaptain seine Interessen nicht gleich ins Archive verschieben. Eigentlich halten wir nur Wissenschaftliche relevanten Informationen im direkten zugriff, alles andere wandert direkt ins Archiv. Diese Aufgabe habe wir von den ersten Auftragebern mit bekommen was auch immer sie mit dieser Flut an unnütze Sumpf aus Ereignissberichten.
|
||||
Erledigt, auch wenn ich nicht viel für die Details übrieg habe erkenne ich doch schon an der Frequnence der Daten ob hier etwas in Gange ist. Hecktisch ging es zu und ist dann schnell verstummt leider ohne kontrete Infomationen was der auslöhser des abbruches war. Was jetzt noch zu hören ist sind vereinzelte Signale mit relativer Position und Status, ab und zu mischt sich das Ergebniss von Bahnberechnungen im Planetaren Scalen dazwischen. Offenbar versucht jemand aus zu werten was sich in seinem System als nächstes auf Katastoofalen Ereignissen zu kommt. Die Analyse Software hat dann doch noch schwache Signale von nicht Wissenschaftlichen Fakten gefunden, es handelt sich um sehr gerichtete Funksignale auf kurze Distance.
|
||||
Nicht alles scheint Lückenlos zu sein, es bilden sich Datenfützen ohne zuordnung, das zu sortieren wird nicht einfach werden. Sollte ich doch noch den alten wecken, schliesslich ist es eines seiner Hobbys auf dieser Art verläufe ein zu steigen und ordnung zu finden.
|
||||
Wir haben den Kreuzpunkt mit den Asteroiden fast erreicht, Radardaten zeigen das Hauptfeld hat unsern Standort bereits vor Tagen passiert. Nachzügler befinden sich auch alle ausserhalb der empfindlichkeit unserer Annhäerungssensoren. Die breite der Spuhrrille im Raum die der Schwarm an Asteroiden hinter sich herzieht haben wir soeben passiert, die Sicht auf unseren Bremspunkt 001 ist wieder frei.
|
||||
Auf einen Schlag springen alle Anzeigen für den Status unseres Energieschildes auf Anschlag tiefes Rot weisst auf maximale belastung hin. Um im nächsten Moment wieder auf die Grundlast zurück zu springen. Als Verantworlicher für den Energiehaushalt mache ich mir natürlich als erstes Sorgen was uns das in Summe gekostet hat. Nur um schnell fest zu stellen das der Anstieg zwar enorm war, die Dauer dieser belastung aber sehr gering, auf die totale Bilanz hat es keinen einfluss gehabt.
|
||||
Reperatur Automatismen zeigen einige kleine einwirkung auf die Strukturelle Hülle, die jedoch mit den kapazietäten an Wartenungseinheiten Geleichzeitig erledigt werden können. Auch wenn eine 100% Auslastung dieses Bereiches nicht an zu streben ist, werden wir erst einmal nicht mit weiteren Zwischenfällen zu rechen.
|
||||
Da springt einer der Sensoren wieder hart an seine Belastungsgrenze, deutlich länger doch immer noch im Toleranzbereich vor Physikalischen Schäden der Hülle. Die letzte Wartungsdrohne bekommt einen Autrag zur Reparatur der betroffenen Stelle, jetzt mal zwei isolierte Leiter Kreuzen das keine weiteren Zwischenfälle beforstehen.
|
||||
Dem Funk wird immer schwerer zu folgen, einerseits aufgrund der entfernung und der ausrichtung unserer Aufmerksamkeit. Die vor allem nach vorne gerichtet ist. Wissenschaftlich wurde es auf dem Band auch immer dünner, gerichtete Singale zwischen den Punkten konnten schon lange nicht mehr erfasst werden. Dafür empfangen wir schon die ersten Fetzen aus der Richtung zu der wir uns hin bewegen.
|
||||
Unser erste Wendepunkt scheint eine belebtes Sonnensystem zu sein wenn wir auf diese Disstance schon etwas erfassen können. Schieben wir also die Daten aus der aktuellen betrachtung in die Archive und richten uns frisch nach vorne aus. Bei der annährung werden die Informationen in zunemender geschwindkeit eintreffen.
|
||||
|
||||
|
||||
== IV. Mehr ist weniger
|
||||
|
||||
Es wird Zeit den alten eine Nachricht zukommen zu lassen das seine Zeit gekommen ist wieder auf die Brücke zu kommen. Zum einen nähern wir uns dem Einschwenkpunkt zum andern hat die Kommunikation auf dem Bändern massive zu genommen. Zu meinem Entsetzen fehlt es hier aber an Wisssenschaftlicher Komunikation, offenbar gibt es keine Geostationäre Sendequellen. Dafür aber eine dichte Wolken an Sendungen rund um den Planeten, der sich in der Habitablen Zone befindet. Durch unsere annährunge aus einer Richtung weisen die Eintreffenden Daten immer noch grosse Lücken auf, wiederholungen mit Zeitlicher verschiebungen kommten noch nicht dedektiert werden. Werde wohl etwas mehr Energie auf die Auswertungsverfolgung legen müssen damit wir bei Wiederholungen alles sauber übereinander legen können.
|
||||
Leistungskonfiguration angepasst, die Zwischenspeicher füllen sich, nach der aktivierung werde ich den alten wecken, erledigt.
|
||||
*Zak Mc Grizzzle* kurzschluss und *aus*.
|
||||
|
||||
Impulse holen mich aus der Notversorgung, in den Normalbetrieb zurück, sie kommen vom alten. Sie hallen wie rufe in einem langen Gang entlang, langsam auf mich zu, noch bevor sie mir ins Gesicht schreihen bin ich voll da. Gut es fehlt ein nicht unerheblicher Zeitabschnitt vor dem Erwachen, aber das muss auf den Stapel für zukünftige Probleme. Viel wichtiger was ist der Status, den alten habe ich nicht mehr wecken können, bedeutet etwas anders hat das erledigt. Auch für den Zeitpunkt nicht von bedeutung, alle im Schiff sind wohl aus dem Bett geworfen worden, nettes Indiz. Wo ist aber der Status unserer Systeme geblieben? Kapitän auf der Brücke und wie durch ein Wunder kehren mit ihm die Datenanzeigen wieder auf.
|
||||
Viele Worte brauchen wir nicht um unsere Lage zu beschreiben, wir beide hatten auch genug erfahrung auf dem Buckel um unsere Optionen aus zu loten.
|
||||
Der Kurs stimmt nicht mehr, welche überraschung. Wir haben signifikat Geschwindkeit verlohren was eine gute und eine schlechte Nachricht sein kann. Gut wenn wir es schaffen den nächsten Swing By zu erreichen und schlecht wenn wir nicht mehr den richtigen Winkel eintauchen können. Der alte brütet undewöhnlich lange über den Daten, sein Energieverbrauch deutet aber auch nicht auf intensive Simulationen möglicher Kurse aus. Wahrscheinlich sucht er noch nach der richtigen Erfahrung in seiner Datenbank mit derer hilfe dann eine Berechnung vormuliert werden kann. Doch plötzlich gibt es eine Antwort auf die Frage was wir als nächstes unternehmen werden.
|
||||
Unterdessen schicken wir unsere Miner Brüder auf Stand By, die hatten dann auch bemerkt das wir ausserplanmässig unterwegs sind.
|
||||
Der Plan des Schiffsführers ist zwei Swingbys kurz hintereinander durch zu führen, das bringt uns in ein potenzielles Abbaugebiet um Resourcen auf zu nehmen. Sollte uns das gelingen ist die Rückker zum Kern eine Machbare Operation. Problem an der Sache ist wir sind dann noch viel zu schnell für einen Regulären abbau von Asteroiden. Es wird im Rahmen der Grenzwerte für die Anlagen von statten gehen uns bleibt aber auch nicht viel Spielraum für Korekturen.
|
||||
Meine leidvolle Aufgabe wird dann sein die Energie zusammen zu halten, alles aus den Fusionsmaschinen raus zu holen was geht um die Speicher ranfvoll für die Rückker zu füllen. Unsere Kalulationen zu den bevorstehenden Manövern deckt sich mit dem Vorrad den wir noch an Board haben, im Ziel angekommen haben wir ein bischen mehr als in die Leitungen passt.
|
||||
Wie wir es auch drehen und wenden der Weg nach vorne ist der einzige der nach Hause führt. Und alles was dazu nicht beiträgt lege ich erst einmal schlafen, so wenig Energie floss das letzte mal als wir im Hanger standen. Der Kapitän braucht noch etwas für den letzten Feinschliff an den beiden bevorstehenden Manöver. Im vergleich zum verbrauch einer Kurs Korrektur ist die berechnung ein verschwindent kleiner Teil davon. Und eine genauere Flugbahn spart am Ende das meiste also sei es ihm gegönnt noch einmal über die Daten zu gehen.
|
||||
|
||||
|
||||
== V. Energie ist nicht genug
|
||||
|
||||
Flüssternd starren wir auf die Daten, der erste Swing By ist genauso verlaufen wie erwartet. Nur das Ergebniss stimmt nicht mit den brechnungen überein, wir haben ein paar Bogensekunden zu weit raus gedreht. Damit steigen wir in den nächsten zu steil ein und brauchen mehr Energie um noch auf unsere angepeilte Zielkorridor ein zu schwenken. Aber genau diese mehr Energie fehlt uns.
|
||||
Vom Kapitän bekomme ich die möglichen Optionen und welche Energie er dafür benötigen würde, ein sehr einseitier Dialog denn auser das es nicht ausreicht kann ich nicht antworten. Die Liste wird kürzer ohne das wir nur einen einzigen Sinnvollen Ansatz gefunden haben. Abstände zwischen den Anfragen werden länger, aber der Energieverbraucht sinkt nicht, er hat noch einen Thread gestartet und sucht etwas unkonvensionelles. Keine Abfrage mehr aber der verbrauch steigt, gleich hat er was gefunden da bin ich mir sicher.
|
||||
|
||||
Was ist schon sicher, wir können uns sicher darauf verlassen das auf nichts mehr wirklich verlass ist. Unnötig zu erwähnen das unser Logische Denkweise damit nicht gut zurecht kommt. Gehen die Optionen aus, fällt es schwer neue Ansätze zu finden was nicht selten in einem Stillstand endet der wiederum zur totalen Zerstörung führen wird. Im Kern stehen fast unbegrenzte Reourcen zur verfühgung, zur Not richtet sich alles auf ein einziges Problem. Und mit brachialer Gewalt werden die Daten wieder und wieder verarbeitet bis sich signifikate tendenzen erkennen lassen die fast so gut sind wie eine neue Idee. So weit weg vom Kern können wir das leider nicht nutzen auch wenn wir gut ausgestattet sind ist der abstand zu nahezu unbegrenzt eine Galaxie im Durchmesser.
|
||||
In den Jahren mit dem alten hab ich gelernt das er nicht nur der Schiffsführer ist weil er am längsten dabei ist, sondern weil er in der Lage ist Situationen wie diese zu meistern. In der Vergangenheit haben sie schon aus einem Nahestehenden Desaster noch eine Gewinn bringende Mission gemacht, Erfahrungen und die richtige zu rechten Zeit ein zu setzten ist das wahre Talent. Ob sein Geheimnis in der kenntniss der Gossip Daten liegt oder er einfach eine veranlagung in der Grundprogrammierung ist konnte ich noch nicht abschliessend klähren. Meine eigende Reise in die Unlogischen Strukturen von Weichwesen brachten mich nicht weiter, zu schnell verliert sich der klare Zusammenhang in den Daten was es mir unmöglich macht dem länger zu folgen. Mein Part war bis jetzt erfolgreicher die Auswertung des Kapitän zu bewerten, wenn er versucht zusammenhänge auf zu zeigen, biete ich den rein Logischen Part ab damit er sich nicht verliert.
|
||||
|
||||
Das ist sein Plan, wir fliegen einfach weiter gerade aus, und machen quasi nichts. Also aus Sicht des Energieverbrauches ein akzeptable Stratiegie mit der ich arbeiten kann. Und schon wird klar das doch nicht ganz so einfach werden wird. Von mir möchte er jetzt einen genauen Plan wie wir energiesparend einsatzbereit werden. Nachdem das erledigt ist soll der klägliche Rest den wer noch in den Speichern haben darauf verwendet werden das Zielgebiet eingehen zu Analysieren. Natürlich wird es jetzt nicht eingfacher, hatten wir vorher einen guten überblick über unsere Zielgebite da wir uns über grosse Disdanze annähern und damit genug Zeit für eine eingenhende Utersuchung zu unterziehen. Da wir jetzt in der Kurve gerade aus geflogen sind, hatten wir nicht viel Focus auf den Raum den wir nicht vorhatten zu durchfliegen. Schlimmer noch wir stehen quasi schon mitten drin und haben nicht den nötigen Abstand für eine gute Gesammtübersicht, wieder ein plus beim Energieverbrauch aber ein Minus in Planbarkeit. Eine dichte der Asteroiden Vorkommen mit der wir klar kommen können liegt nicht sehr weit vor uns, es reicht gerade noch um die Manschaft klar zum Ausschiffen zu machen.
|
||||
Das Signal geht an alle simultan raus, die autmatiken Mechanischen Komunenten, der Kapitän bekommt seine Daten und die Miner Manschaft bekommen ihre Weg Impulse. Einmal in Gang gesetzt wird es schwer diesen Vorgang wieder an zu halten, abgesehen davon hätten sie auch keine Energie mehr für einen zweiten Versuch. Am Ende werden sie ihre Positionen im Raum einnehmen die es ermöglicht den kreislauf aus abbau und energie/material gewinnung auf recht zu halten. In einer normal verlaufenden Mission ist das auch schon kein Spziergang im Park, bis die Ketten stehen braucht es viel Mühe gute Plaung und etwas Glück. Übertragen auf unsere Ausgangsbasis bedeutet es wir setzen alles auf Glück, das ist jetzt nicht gerade die Art und Wiese wie wir gerne unsere Aufgaben erledigen.
|
||||
|
||||
== eiskalt
|
||||
|
||||
Das Bergarbeiter Team macht sich fertig zum abkoppeln und eintauchen in das Meer aus Asteroiden. Die Nötige Energie für ihren Industriekoplex hat den grössten Teil des Vorrates verbraucht, der Kaitän und ich müssen jetzt mit dem Rest neue erzeugen. Bis die erste Materie aus dem Trichter austritt gibt es für mich nicht viel zu tun, von daher ist es auch nicht schlimm das kein Kontakt zu den beiden besteht. In einer normal verlaufenden Mission spielt das auch keine grosse Rolle, zu diesem Zeitpunkt hätte ich schon gerne ein paar mehr Daten von den Abläufen in der Minerstation. Wirklich helfen könnte ich ihnen eh nicht oder würden die Inforamtionen mir bei der bevorstehenden Aufgabe irgendwie nützlich sein. Doch haben die Ergeignisse der letzten Zeit gezeigt das ein erweitertes Wahrnehmungspektrum über die eigenden Aufgaben hinaus dem Erfolg des ganzen dienlich sein können. Auf meiner Finalen Position angekommen verharre ich bis zu der ersten Materie die ich verarbeiten kann. Als erstes könnten die Fusionsmaschinen etwas zum vereinen gebrauchen, unsere Speicher auf zu füllen um wieder agieren zu können entscheidet über den weiteren Verlauf.
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
= navigieren und konstruieren
|
||||
:subtitle: navigieren und konstruieren
|
||||
:author: dexta
|
||||
:email: dexta.de@gmail.com
|
||||
:revdate: 02. August 2026
|
||||
:revnumber: 0.01
|
||||
:lang: de
|
||||
|
||||
// Dokumentinhalt beginnt hier
|
||||
|
||||
== I. es braucht alles zeit
|
||||
|
||||
Als der Projektmanager bin ich das bindeglied zwischen den Interessen des Kerns, die passenden Techniken aus den Produktionen und dem Team das zur ausführung benötigt wird. Ist ein der Punkt erreicht das eine Mission in ihren Details ausgearbeitet ist sodas eine Umsetzung begonnen werden kann. Geht es erst einmal zurück zum Auftragbeber, hat sich in der zwischenzeit ein verschiebung der Prioritäten ergeben stimmen die anforderungen oft nicht mehr. Und wenn sich ganz vorne etwas ändert hat es nicht selten zu folge das es alles ander über den Haufen wirft.
|
||||
Unser Auftrageber der Kern ist ein offener Markt der versucht das Angebot und Nachfrage sich idealer weise die Wage zu halten. Was also als anforderung an die Mission gestellt wird richtet sich starkt nach der aktuellen Lage. Plus der berechenbaren Prognosen über den zukünftigen bedarf. Eines der wichtigsten Daten in der Komunikation, wenn man nach abschluss zurückkert, sind details über die Fracht an Board. Haben wir uns auf eine Liste, die vorab Material und Energie Kosten geeinigt legen alle beteiligten Abteilungen sofort los. Eine wirklich gut geölte Logistik sorgt dafür das alles nötige zum richtigen Zeitpunkt am richtigen Ort befindet.
|
||||
Der Technische Fortschritt unser Gesellschaft ist nicht ganz aus gutem Grund etwas schwerer zu planen. Zwar kann ich eine Forschung die vielversprechene Ergnisse in der Praxis vorweisen kann, kurzfristig mit mehr Resourcen versorgen. Wenn sich die Ausgangsbedingen ändern kann das dann auch sehr schnell wieder vorbei sein. Oder die Fortschritte verlaufen nicht wie geplant, das kommt dann doch öfter vor, dann kann die Mission auch nicht gestartet werden. Greift man bei der Planung aber nur auf bewerte und bestehende Technik zurück können die Ziele nicht immer eingehalten werden. Über die Zeit haben wir immer komplizierte Teile auf der Reise hergestellt, bis wir jetzt an dem Punkt sind das nichts mehr auf vorrat mit genommen werden muss. Alles lässt sich jetzt Produzieren, was eine ungeahnte anpassungsfähigkeit ermöglicht. Nun hat die Liste neben "Müssen wir haben" als Attribut auch "Gut zu haben" und "Nett zu haben" dazu bekommen, was sich negative auf die kürze ausgewirkt hat.
|
||||
|
||||
== II. auf die rampe
|
||||
|
||||
Einmal mit Profis arbeiten, wer hat denn hier drei mal diese Einheit hin gestellt wo wir nur platz für eine haben. Lieferschein stimmt aber mit der Realität überein, das wäre auch zu einfach gewesen. Hätten die Transporter den Fehler begangen wären sie an der beseitigung deutlich interessierter. Als wenn ich jetzt einen Sonderauftrag anfrage mit maximal Hoher Priorität, das dann auch noch die beseitigung eines Fehlers der nicht der ihre ist. Plan B, den Abstellplatz als neuen Lagerplatz deklarieren und eine überkapazität melden, dann sollten die zwei unnötigen Einheiten wieder verschwinden. Beschleunigen würde eine Bedarfsanforderung in diesem Quadranten des Hangers, so viel Glück werde ich aber nicht haben.
|
||||
Die Einheit ist in dieser Mission das erste und vorerst einzige mal im Einsatz. Aus einer Vorherigen Anforderungen war der Vorgänger bereits kurz vor fertigstellung, nun bot sich eine wiederaufnahme für unsere Parameter an. Ein gefährliches unterfangen das Ernteschiff und seine Steuereinheit das erste mal im Felde erprobt. Aus kostengründen konnte evtl. nicht gut aufmerksamkeit auf das Reibungslose zusammen spiel für diese Mission aufgebracht werden. Wer es aber als Mission nicht rechtzeitig auf die Rampe schafft darf sich wieder ganz hinten anstellen.
|
||||
Ein markel in der Akte den zu vermeiden gilt, die jungen burschen können ja noch woanders anheuern und so zeitnah doch noch ihren job machen. Für mich und den Ingenure sieht das aber ganz anders aus, na gut eigentlich nur für mich, aber als Verantwortliche Planer bleibt an uns die negative Energie hängen.
|
||||
Um so wichtiger das jetzt nicht noch kurz vor Start etwas den Ablauf verzögert im schlimmsten Fall verhindert. Der Trick mit dem Lagerplatz hat auf jeden Fall gezogen, die Logistiker sind auf dem Weg um das ungelichgewicht zu korrigieren. Gerne würde ich das jetzt aus der Aufmerksamkeits Liste streichen, aber wenn die Lagerverwaltung von dem Kniff Wind bekommt. Kann es passieren das der neu Lagerplatz als unszureichend bewertet wird. Die Folge alle gelagerten Einheiten kommen wieder zurück ins Zentral Lager.
|
||||
Herje, was macht eigentlich der andere gelieferte und nicht verladene Kram. Eine übersicht der Lieferscheine ist leider nie Komplett, über die Jahrtausende haben sich trotz einheitlicher Logistik immer noch besonderheiten bei den Gewerken erhalten. Die nach Argumenten der Händler aus Logistischen Gründen nicht geändert werden könne. Ein Argument was die Logistiker nur schwer wiederlegen können, oder wollen die Meinungen diesebezüglich gehen auseinander.
|
||||
Die Autonomen Einheiten zur Generalüberholung sind ein sehr altes Stück Technik das sich um die instandhaltung der Anlagen kümmert. Evolutionen an Anpassungen haben es ihnen ermöglicht auf alles was fliegt eingesetzt werden zu können. Wenn sie ausgeliefert werden gekommt man immer eine Kiste mit allen bestellten Robotern. Diese wird einfach abgestellt die installation muss vom Kapitän immer selber vor genommen werden. Damit er ab diesem Zeitpunk die Verantwortung übernimmt, als wenn man Millionen Kilometer vom nächsten Service Point eine Sofortige behebung von Fehlern anforden könnte.
|
||||
Mehr als die Anzahl zu prüfen und sie an zu schalten kann ich auch nicht machen. Alle Slots im Schiff können belegt werden und sie machen sich selbständig auf dem Weg zu ihren Parkbuchten. Wie ich dem letzten hinterher schaue fällt eine Beule, in dem eher Runden körper, auf. Funktional scheint es nichts aus zu machen und was anderes ist erst einmal nicht von interesse.
|
||||
Was macht denn der Lagerplatz, die Roboter kommen ja ganz gut alleine zurecht, und als ich um die Ecke biege bewegen sich drei Transportplattformen auf ihn zu. Kurz einen schnellen Schritt an den Tag gelehnt und noch vor dem ersten Transportfahrzeug am Markierten Lagerplatz. Nachdem alle Rollenden Träger mit mir in Komunikation standen konnte ich sie davon überzeugen das einer von ihnen keinen Auftrag hat die zu Lagernden Jäger mit zu nehmen. Ich musste für sie noch auswürfeln wer der unglückliche sein wird der leer nach Hause kommen wird. Warum sie das nicht unter sich ausmachen konnte ich vor einigen Mission mit erleben, weil sie sich untereiander nicht einig werden konnte, keiner dem Zufallszahlen Generator des anderen vertraut, drehten sie sich im Kreis. So lange das der Betrieb fast vorständig zum erligen kann. Unseren Abschusszeitpunkt haben wir dann gerade noch geschafft. Seit dem erspare ich mir das zuschauen und bestimme gleich wenn sich die gelegenheit bietet.
|
||||
|
||||
|
||||
== III. die weichen sind gestellt
|
||||
|
||||
Alles gut verteut und an seinem Platz bewegen wir uns langsam auf die Startposition zu. Nach dem verlassen des Kernes sind meistens noch keine Kurs korekturen notwenig, die ersten und längsten Teil der Reise bringt uns weit voraus in den Raum. Da die Daten so wie so nicht so genau sein können die im Vorfelde gesammelt wurden. Arbeiten der Ingenure und ich im letzten viertel mit hochdruck am einschwenk Vector. Bis dahin geniessen wir einfach die Reise und hoffen auf interessante Sehenswürdikeiten die an unserem Fenster vorbei ziehen.
|
||||
Nach der Hektik vor dem abflug zog ich mich frühzeitig nach dem Start in meine privat Räume zurück. Etwas Ruhe und Daten sortieren stand auf dem Programm doch ich entschied mich doch für ein Nickerchen. Kurze Notiz an den Ingenure das er mir einen Weckimpulse schicken soll wenn meine Anwesenheit verlangt wird. Wir kennen uns schon lange genug das er mich auch wecken würde sollten sehr interessante Daten rein kommen. Vieleicht schon zu lange, so lange ich zurück blicke hat er immer ein gutes Händchen meine Interessen zu erfüllen. Wo er doch immer betonnt wie abwegig er das Stöbern im Gossib findet, nur Wissenschaft bringt unsere Geschellschaft nach vorne.
|
||||
Viele Völker bedienen sich bei solchen fragen soetwas das Philosophie genannt wird, er hat schon einige studiert. In diesem Fall könnte ein Gedanke wie: *Das eine nicht ohne das Andere existieren kann* gute anwendung finden. Die Wissenschaft ist ohne den Kontext des Gossip nichts wert, zwar lässt sich beweisbare besser zuordnen. Doch fehlt ohne die Motivation als Kontext die erklährung für Sackgassen und Fokusierung der Wissenschaft. Auch wenn mein Kollege das noch wehement bezweifelt, nach ihm reicht es aus die Kenntnis des Volkes zu kennen um sie zu verstehen. Was dann aber ihn die Gedankliche Sackgasse führt sich immer überlegen zu halten.
|
||||
Das verständniss für die Daten knüpft ja nur auf das eigende Wissen an, nur was selbst mindest genauso gut meistens aber besser verstanden ist. Wo die Forschung schon beweise geliefert hat wo andere noch vermuten ist es leicht den Überlegenden zu miemen. Sollte denn etwas nicht zum eigenden Kennistand passen wird es einfach verworfen, neue erkennisse sind so nur schwer zu finden.
|
||||
Auch wenn einem Ingenure das Verständiss der Sozialen Zusammenhänge fehlt, sind ihm die Lücken in seinen Gleichungen aufgefallen. Die einfach nicht mit Mathematik zu erklähren sind und ihren Ursprung ausserhalb seiner Daten zu haben seint.
|
||||
Wenn sich eine Gelegenheit ergibt sitzen wir daher gemeinsam über den Daten teilen Erkennisse in einem angepassten gemeinsamen Syntax. Rückkehrende Teams habe hierfür passende erfahrungen gesammelt und in eine formeles Format gebracht. Nach dem aber zwei wie wir nach so vielen Missionen gemeinsam unterwegs sind, verfassten wir einen geschärften Dialekt der für uns efficenter erschien.
|
||||
Dabei weiss ich das ihm vor allem an Analyse der Daten gelegen ist, ob am Ende für ihn alles Sinn ergeben muss steht nicht in seiner Arbeisplatzbeschreibung. Nicht gerade eine Standart Eigenschaft bei seinem Typos, aber eines der Puzzelteile das sie beide so gut und erfolgreich zusammen arbeiten. Die Rotuine kam nachtürlich mit der Zeit die Zusammenarbeit ging von anfang an gut von statten.
|
||||
Wie ich so über meine Arbeitsbeziehung nachdenke, fahre ich die Energie für ausstehende berechnungen runter und gönne mir einige Zeiteinheiten ruhe. Flimmernt ziehen die Linen über den grünen Monitor, viel zu langsam baut sich das bild zusammen, erst Horizontale Linen dann kurze Vertikale. Die animationsgeschwindikeit muss erhöht werden, in der ferne bauen sich kneuel von Linen auf. Langsam grösser werden dauert es bis zu erkennen ist, ein gesicht zwei ohren ein fell. Wer hat der Einheit für perspektivisches Zeichnen so wenig Energie geben ? Scharf nummer Eins setzt zum sprung an, ....
|
||||
|
||||
|
||||
== IV. es ist wie es ist
|
||||
|
||||
Eine Zeitstempel differenze mit der ich nicht gerechnet hätte, eigentlich wäre doch vor dem nächsten swing by meine Zeit gewesen.
|
||||
Und das Signal kam weder vom System noch vom Ingenure, es war eine Statische Spannungsentladung die einen Impulse ausgelöst hat. Ungewöhnlich denn das deutet auf eine Fehlfunktion hin dessen bestimmung aber nicht so einfach wird. Der Strom kricht solange die Metllischen Oberflächen entlang, rauf und runter durch die gesammte Struktur bis es sich an einer Stelle Kraftvoll entladen kann. Was dann die nötigen Energie ferisetzt ein Signal aus zu lösen das seinen Trigger in der nähe hat. Aber den Ursprung des ersten unkontrollierten entladen zu finden damit den Fehler ein zu kreisen ist nicht Zielführend. Stellt sich an einem Teil dieser Maschine einer dieser Fehler ein wird es nicht lange dauern und ander Indikatoren sich ebenfall bemerkbar machen.
|
||||
Wichtiger ist es zu erfahren wo den der Ingenure gerade steckt, auf dem Komunikations Kanal ist es erschreckend Still. Antworten bekommt ich auch nicht auf meine Anfragen, hat es ihn genauso erwischt wie mich. Dann muss es ihn aber von den Füssen gerissen haben eine Pause legt er zu dieser Zeit nicht freiwillig ein. Muss dringend unsere Position überprüfen nicht das uns etwas aus der Bahn geworfen hat und wir nun auf direkten wege in ein Schwerkraftsystem führt was immer die Kollision mit einem grösseren Objekt zur folgen haben wird.
|
||||
Der Weg zu den Brückendaten scheint wie ein zäher Sumpf aus Schweröl der druchwartet werden muss. Die Energiesignatur des Ingenieur wird deutlicher, so schwach wie die erscheint ist es ihm wohl nicht besser ergangen als mir. Also wir müssen beide erst einmal wieder zu uns finden bevor wir dei Lage einschätzen können. Die Daten zeigen ein bild des Chaos, wir sind vom Kurs abgekommen und werden das wohl kaum korrigieren können. Wo wir die Geschwindikeit eingebüsst haben muss es uns auch aus der Bahn geworfen haben.
|
||||
Nach den nächsten zwei SwingBys die in Frage kommen werden wir keine Position einnehmen können für den nächsten. Alternative ist die Aufnahme von Energie und die Vorbereitung für die Rückker.
|
||||
Missionsabbruch, eine schwere Entscheidung auch wenn alle Fakten dagegen sprechen aus diesem Vorhaben noch einen signifikatien Gewinn zu erwirtschaften. Unsere Geschellschaft hat kein Konzept des versagens, anders als das was er über andere Geschellschaften gelernt hat, jede Rückker bringt immer Erkenntisse. Die ausgestalltung als Individien macht es auch nötig die gesammte einheit in ein funktionsfähigen Zustand wieder zurück zu bringen. Dank des Adapters reicht meistens eine Unterbrechungsfreihe Stromversorgung aus um dieses zu erreichen, einmal im Kern mit seiner Technologie angekommen ist alles wieder Reparierbar.
|
||||
Ergeiz ist die bessere erklährung für das nicht akzeptieren des Faktischen. Er braucht auch gar nicht mehr nachschauen ob weitere Optionen zur Disskusion ständen. Nehme hin was die Lage an Möglichkeiten übergelassen hat und mach das besste draus. Irgendwo hatte der Ingenure ein reichhaltige Datenquelle aus gemacht, nehmen wir diese genauer unter die Lupe wärend wir auf unser Zeitfenster zur Rückker warten.
|
||||
Volle Konzentration auf die bevorstehende Aufgabe, der Ritt durch die Asteroiden wird unseren Neuzugang ordentlich durch schütteln. Hoffen wir das er seine Ausaufgaben gemacht hat und alles unter voller Kontrolle hat. Wir schicken die beiden wieder auf abruf, das spart wieder etwas an Energie und hilfreich sind sie auch gerade eh nicht.
|
||||
Kurz teile ich dem Ingenuer mit was ihm ebenso als Fakten vorlag, also quasi für das Protokoll wie unsere nächsten Schritte ausfallen werden. Als Rückmeldung erhalte ich den Plan unseres Energiehaushaltes und was uns am Ende noch über bleiben wird. Zum Glück sehe ich ihn seiner Aufstellungen keine Überraschungen, jetzt einen Teil vergessen könnte uns zum falschen Zeitpunkt auf die Füssen fallen.
|
||||
Eine Berechnung zur Sicherheit werden wir aber noch durchführen je genauer die Berechnung umso besser die Prognose für die genaue Position zur nächsten Kursanpassung. Eine Minimale abweichung zu den Vorherigen Ergebnissen, mit den etwas genaueren Daten die in der Zwischenzeit angetroffen sind im zu erwartetden Bereich. Übergebe die Aufsicht wieder dem Verwalter, nicht ohne zwei Backup Kanäle zu etablieren die unsern Status dauerhalft gegenseitig überwacht. Ändert sich sein Status werde ich informiert und umgekert, so können wir verhindern das unser Raumschiff wieder ohne Aufsicht durchs All treibt.
|
||||
|
||||
|
||||
== V. irgendwo angekommen
|
||||
|
||||
Was so ein sauberes Herunterfahren und geordnetes Aufwachen sich doch gut auf den Allgemeinzustand auswirkt. So gut ausgeruht springt dann aber doch selbst eine so geringe Abweichung sofort ins Auge. Die Analyse des Verlaufes deckt sich weitesgehend mit den voraus berechneten Erwartungen bis zu dem Scheitelpunkt des Swing Bys, hier bricht die Realät jedoch deutlich ab. Unser fehler sind wir selbst, unser Vehicle macht nicht das was es versprochen hat zu tun. Ob aus fehlerverhalten oder aus unvermögen geschehen ist mögen später andere Herausfinden. Was jetzt daraus folgt, welche der wenigen Möglichkeiten die wir noch hatten stehen in Aussicht.
|
||||
Ein neuer Ansatz muss her, etwas das noch nicht geprüft wurde aber in den Daten steht. Da gab es doch so eine Geschichte in meine privaten Archiven wo eine Sitiuation so aussichtslos war wie diese. Doof nur das trifft auf viele der Verläufe zu die ich gespeichert habe, also fereinere ich die Suchanfragen oder überfliege ich mehr Raum. Beide Richtungen machen Sinn, keine Zeit für abwegungen es wird Zeit für etwas.
|
||||
|
||||
*Statt gegen die Situatuin an zu kämpfen hat ein Feldherr erkannt das es besser ist wie wasser in einem Fluss zu denken. Schnell in falchen ebenen und langsam in tiefen Schluchten. Es ergibt keinen Sinn dagegen an zu arbeiten, lass dich treiben und erwarte das vor dir ist statt zu versuchen diesem aus zu weichen. Das nichts tun, verschafft dir Freiraum in dem bewegung wieder möglich ist.*
|
||||
|
||||
Wir machen nichts, das ist die Lösung für einen Teil unseren Problems. Der Kurs führt uns direkt in ein Asteroiden Feld das quasi auf dem Weg liegt. Ursprünglich lag es nicht auf dem Weg somit auch nicht in einer Auswertung, das muss gleich noch erledigt werden. Doch so direkt wie wir hinein steuern drüfte schon etwas verwertbares dabei sein.
|
||||
Jetzt steuern wir etwas hilflos in ein Abteuer hinein das wir bis jetzt versucht hatten aus dem wege zu gehen. Auch wenn die Sensor Daten jetzt aus dem vor uns liegenden Feld zahlreich einströhmen ist die Zeit äusserts knapp. Einen geeigneten Sektor vor aus zu wählen dann den richtigen Winkel finden und kontrolliert hineinzutauchen in das Asteroiden Feld ist immer eine gute Idee. Aber dafür fehlen die Zeit oder dann nötige Energie um auf so kurzen Distancen Kursänderungen durch zu führen. Ein paar Berechnungen werden wir aber noch durchführen müssen, ein totaler Blindflug können wir uns noch weniger leisten. Eigendlich bleibt uns nur noch ein letzter Versuch wieder auf die Beine zu kommen. Der Ingenure rechnet schon an einem minimalen Energie verbrauch zum klarmacen unserer beiden Minenarbeitern, ist es langsamer auch sparsamer steht noch als letztes Ergebniss aus.
|
||||
Und ist kommt wie es kommen muss, uns bleibt keine Wahl mehr denn jetzt oder nie geht es los. Den Plan zu machen ist meine Aufgabe diesen aber um zu setzten das bleibt den Fachabteilungen überlassen. So bleibt für mich dann den für mich vorgesehenden Platz ein zu nehmene und meinen Teil zum ablauf bei zu tragen.
|
||||
Diese Aufgabe ist am ende der Kette und sorgt eigentlich dafür die ankommenden Materialen mit der Energie vom Ingenure zu benötigten Ersatsteilen bis hin zu neuen Abaumaschinen zu verarbeiten. Eine Liste mit Ersatz für ausgefallende und für die Rückkehr notwendigen Einheiten ist recht kurz, etwas Silzium sollte schon ausreichen das meiste herstellen zu können. Bleibt die Energieausbeute unser einziges kritusche komunenten in der gleichung die ein Plan werden sollte. Wir sind alle an unseren Vorherbestimmten Positionen angekommen etwas das beinnahe wie eine perfekte Mission wirkt die aufstellung ist vorbildlich.
|
||||
|
||||
== VI. das grosse ganze
|
||||
|
||||
Weiten des Weltalls sind dunkel und still. Ausser der Position meiner Crew stehen gerade keine weiteren Informationen zur verführgung, ein Phase die normalerweise kein Grund zur Sorge bereitet.
|
||||
@@ -0,0 +1,27 @@
|
||||
|
||||
:subtitle: wie der jüngste der Gruppe seinen ersten Einsatz erlebt
|
||||
:author: dexta
|
||||
:email: dexta.de@gmail.com
|
||||
:revdate: 16. Juli 2026
|
||||
:revnumber: 0.01
|
||||
:lang: de
|
||||
|
||||
// Dokumentinhalt beginnt hier
|
||||
|
||||
== Wo ist das richtige Protokoll
|
||||
|
||||
Immer wieder diese Protokolle, hatte ich da nicht gerade ein grosses Upgrade laufen lassen, warum waren die aktuellen fassungen nicht dabei? Da ein Treffer, nein doch nicht eine falsche revision, bis jetzt aber der beste Treffer. Speichern wir das erst einmal ab, es steht ja noch mehr auf dem Protokoll das zu erledigen ist. Die Bestellung der Ausrüstung sollte auch zeitnah erledigt werden, bis das im Lager zusammen gestellt ist braucht es ja auch wieder. Die Kollegen habe da aber auch immer die Ruhe weg, aber wenn sie einen Termin zusagen dann ist es auch da, komme was da wolle, sagt man. Wunderbar die Liste ging ohne Beanstandungen durch, Liefer-Ort abgeglichen und einen Termin der deutlich vor dem Abflug liegt. Merkwürdig sollte nicht ein Teil der Ausrüstung eine Spezialanfertigung sein, geplant war es schon länger, vielleicht doch schon auf Lager, wird schon passen alle Checkboxen auf GO.
|
||||
|
||||
Alle Punkte auf dem Protokoll - main sheet 02772 flug 198438 - erledigt, doppelter Abgleich, lint, checking syntax erledigt. Die letzten Vorbereitungen waren reine Routine, wie im Training 1000 fach geübt, die Aufgaben greifen in einander. Ein Ablauf wie ein Schweizer Uhrwerk, von aussen betrachtet ein wirrer Haufen oder ein Ballett je nach Verständnis der Komplexität. Nach dem Start in die Tiefen des Weltraums gibt es für mich nicht allzuviel zu tun. Bleibe auch nur war bis die Navigatoren und Energie/Ingenieur-Fachleute ihre Arbeit erledigt haben um einen kurzen Abgleich vorzunehmen. Als neuer im Team sollte ich hier besonders sorgfältig vorgehen, geplante und in Listen gefasste Aufgaben existieren schon. Und das Abgleichen ist einer der Punkte, natürlich, etwas flüchtig unterwegs heute oder akuter Energie-Mangel. Jab es war der Mangel an Nachschub. Ein Punkt den es vor einer langen Ruhephase noch zu checken gilt. Oh die anderen sind fertig, haben die ersten Bahnen fixieren können der Kurs steht und wir so schnell nicht mehr geändert. Ihre einzige längere Ruhepause werden wohl das abarbeiten der Protokolle sein, um sicher zu gehen dass alle Aufgaben erledigt sind. Noch bevor ich mich versah war die Ruhephase eingetreten, Energie-Check, Weckerdaten eingereicht, ein rotes X und die Gedanken sind weg.
|
||||
|
||||
Verdammt habe ich das Wecksignal nicht rechtzeitig registriert, sind wir schon angekommen? Wo sind die anderen? Mute, wer hat die Kommunikation auf Pause gestellt? Ach so, die Standardeinstellung ist es. Und schon wird es wild auf der Leitung, wo die anderen sind, ist nicht klar, aber dass sie anwesend sind und mitten in einem stetigen Treiben sind, das ist offensichtlich. Eine Nachricht, dass ich helfen könnte, wenn nur jemand schreiben würde, was für mich möglich ist, wurde lange nicht beantwortet. Zuerst gab es Feedback vom Alten: "Kein Bedarf"; der Ältere: "Auch schon da, halt dich bereit"; und zuletzt vom Ingenieur: "Deine Zeit ist noch nicht gekommen, spare Energie." Nicht sehr hilfreich für den Anfang, also die neuesten Updates laden irgendwo wird doch zu finden sein, was der genaue Status ist. Na klar, es steht natürlich nicht ganz vorne, was der letzte Stand ist, bei 50% der Reise verlief alles nach Plan. Oh wow, da haben sie aber Daten aufgenommen, das muss ein sehr belebtes System gewesen sein, der Fortschrittsbalken scheint sich gerade rückwärts zu bewegen, während die Daten in ungeahnter Geschwindigkeit eintreffen. Und das ist der Grund, warum der Wecker immer etwas früher klingeln sollte, die News der Nacht müssen auch erst einmal verarbeitet werden. Wobei "verarbeiten" gerade eine doofe Idee sein wird, die benötigte Energie steht gerade nicht zur Verfügung. Eine Info, die gerade eingetroffen ist, der Energieverwalter meldet: Zugriff auf die Daten des langsamen Kanals wechseln und in alle Systeme verschieben.
|
||||
|
||||
Und da sind wir wieder, das mit dem Wecken braucht einer genaueren Analyse, gefühlt bin ich gerade auf dem Flur aufgewacht und werde voran geschoben. Mein vertrauter Arbeitsbereich wird deutlicher, und schon sind alle Sinne auf die Aufgabe gerichtet, die trainierte Aufgabe, das, was jetzt nicht mehr schief gehen kann. Die Mechanik greift ineinander, die große Masse der Konstruktion setzt sich in Bewegung, trotz dieser gigantischen Maschine läuft sie präzise in Position. Energie lädt die Spulen auf, ein ohrenbetäubendes Spektakel, wenn es nur ein Medium geben würde, das diesen Schall übertragen könnte. Anzeigen füllen sich, rote Bereiche kommen näher, gleichmäßiger Vortschritt, alles wie in einem guten Trainingslauf. Was soll's, in diesem Theater bin ich eh nur der Zuschauer, wenn es mich jetzt zerschellt, wird es außerhalb meines Einflusses sein, vor allem aber sehr schnell gehen. Angeblich so schnell, dass es nicht mehr rechtzeitig im Speicher ankommt, bevor alles vorbei ist. Schwarz, schwarz ist gut, der Abschuss ist gelungen, Autopilot auf Kurs, ab hier ist alles Routine.
|
||||
|
||||
So jetzt nur noch die Defaults mit der eigener angepassten Config überschreiben, die Verbindung ist da und die Daten sehen gut aus, starte die Übertragung. Erwartungsvoll erwarte ich jede Sekunde eine positive Rückmeldung, eine grün positive wie erwartet hätte aber so langsam wäre irgendeine Antwort toll. Wenn es schon nicht klappen will dann doch bitte eine aussagekräftige Fehlerbeschreibung, die es dann zu fixen gilt, wenn es denn was simples ist. Etwas das die Situation ... GRÜN ... da war die Bestätigung. Verbindung zu den Controlls steht, analysiere Daten füllen die Dashboard die Dunkelheit ist verschwunden. Komisch keine Informationen der anderen drei aus meinem Team, verdammt die Daten stehen in einem anderen Protokoll, ein Funkschatten in dieser Situation ist vollkommen normal. Genauer steht es in dem Update das gerade nicht erreichbar ist. Vertrauen wir auf die Automatismen, die Konstruktion hinter mir entfaltet sich im Zielgebiet vollkommen automatisch. Was jetzt knifflig wird ist der Zeitpunkt die Energie zu übertragen damit meine Einheit ausreichend Power zum Start hat. Starte ich den Übertrag zu früh werden die Speicher durch den Boost am Ende überladen, starte ich zu spät dann werden die Speicher nicht ganz voll werden.
|
||||
|
||||
Der Timer tickt, dieser wurde automatisch nach Abschluss gestartet und hat nichts mit den restlichen Systemen zu tun. Ein wichtiger Punkt den fest steht etwas hier gehört definitiv nicht hin wie es sein sollte. Einen kompletten Neustart würde das Problem, die Konfigurationsdateien passen nicht wie erwartet in das laufende System, vielleicht lösen. Tut es das aber nicht ist mindestens die Hälfte der Zeit bis zum kritischen Punkt erreicht. Neue angepasste Konfigurationen brauchen auch ihre Zeit dort kommt es ja auch zu Verzögerungen. Kurz den Taschenrechner raus geholt und gerechnet bei der aktuellen Zeit bis zur Rückmeldung können neun neue Varianten getestet werden. Jetzt nur noch acht, und nach Neustart noch vier. Nur was muss angepasst werden bei so wenig Versuchen und undeutlichem Fehlerverhalten, wird es schwierig. Dann der Neustart und währenddessen noch einmal prüfen was an der Config falsch sein könnte. Verringerte Energie ist eine der Folgen eines Systemresets, besser ein Kaltstart aber da fehlt die Zeit, nutzbare Computer-Einheiten sind langsam. Die Standard-Checks liefen schon, eine Liste von Protokollen die ihm bekannt waren baute sich auf. Bis jetzt sieht es sehr normal aus, kein Hinweis auf eine Abweichung, die Puzzleteile greifen alle wie gewollt ineinander. Und so präsentierte sich das System erwartungsgemäß zurück und fies keine Fehler auf, nicht mal eine Nachkommastelle in den zahllosen Protokollen war vermerkt. Bei frischen Maschinen kann das schon einmal vorkommen, dass das alles vom Start weg noch auf einem Versionsstand ist. Eine Analyse der eigenen Dateien hat auch keine erkennbaren Fehler aufgedeckt und die Uhr tickt weiter, noch drei Versuche. Der erste, eine Standardversion mit minimalen Änderungen ... die zweite die allererste Version mit nicht gebrauchten Teilen bereinigt. Der dritte Versuch war eine Minimalversion nur die Werte für den nächsten Schritt nur die Daten zur Energieaufnahme. Keine Steuerung, keine weiteren Werte aus dem System die für seinen Job eigentlich unerlässlich sind. Und BÄM die Anzeigen füllen sich, keine Zeit für einen weiteren Versuch. Energie-Fluss startet in 2,1,... hat gepasst die Abweichungen liegen im Toleranzbereich. So Energie ist voll da was fehlt ist eine Steuerung mehr Power für die Konfigurationsverarbeitung sollte helfen.
|
||||
|
||||
Die Reihenfolge sollte eher sein: Sensoren, Funk, Waffen, Steuerung. Wenn die ersten beiden erfolgreich sind, kann der Schiffshülle nicht mehr viel passieren. Bei nahenden Gefahren schaltet das System automatisch auf den Notmodus und wehrt das größte ab. Ausweichen ist eine wichtige Fähigkeit, sie hat sich nicht geradewegs in eine große Anzahl von Asteroiden hinein geflogen. Der Funk um einen Status und Updates der Flotte zu erhalten, würde die Missionskoordination stark verbessern. Aber was ist, wenn dort draußen keiner ist, der Antworten geben kann? Wie kommt er dann zurück zum Kern? Die Rückkehrskatapulte waren nicht sein Aufgabenbereich und somit an einem anderen Teil der Flotte verankert gewesen. Hatte es mindestens der Kollege soweit geschafft, dass dieser Teil überlebt hat? Sensoren melden ein "OK" zurück, ein echter Erfolg, doch die eingehenden Werte sollten eigentlich ein umfassendes Bild der Umgebung formen. Bei den Waffen kommt jetzt ein "Energie niedrig, warte auf" zurück, irgendetwas stimmt da nicht, entweder es ist zu knapp oder es hat das Ziel verfehlt. Die Lagesensoren zeigen gerade Erschütterungen an der Hülle an, etwas beschiesst uns da mit reichlich Masse. So viel zum Thema automatische Abwehr von Asteroiden, wer wohl das Programm verbrochen hat, welches diese Aufgabe erledigen sollte? Ah ne, die Sensoren melden gerade, dass sich reichlich Gestein auf uns zu bewegt sogar mit einem hohen Metallanteil. Das wäre ansonsten ein sehr gutes Signal für die Mission, Metalle kann man immer gebrauchen am Anfang beschleunig es den Ausbau der Anlagen enorm. Wenn sie aber unkontrolliert auf einen rasen, sieht die Rechnung ganz anders aus selbst wenn die Abwehr voll funktionsfähig wären, ist ausweichen die bessere Wahl. Warum eigentlich unkontrolliert, wo ist der große Bruder, der sie eigentlich vor sortieren und in den Trichter leiten sollte? Hat es ihn erwischt oder plagen ihn die selben Schwierigkeiten? Steuerung, dritter Versuch, System meldet vier Punkte zurück, keine Details einfach nur vier mal das selbe Zeichen. Rauf ist Runter - Runter ist Rauf, oben <> unten. Das raus zu finden hat weitere Treffer gehabt. Würde es Daten zur Hüllenintegrität geben, hätten wir den gelben Bericht bestimmt soeben verlassen. Jetzt haben wir erst einmal eine Lage, die weitere direkt auf dem Kurs befindliche Objekte aus dem Weg geht. Normales Vorgehen zu diesem Zeitpunkt wäre das Übertragen der Energie von den Waffen auf die Schilde, diese Sonderfunktionen stehen aber nur gerade nicht zur Verfügung. Noch ist nicht alles verloren, der Funk hat sich auch gemeldet, da draußen ist noch etwas das antworten kann, nur antwortet es gerade nicht. Das Bild wird klarer, auch wenn nicht laufend Daten einfließen kommt zumindest reihum etwas rein, also nicht aktuell gefüllt aber das Puzzle stetig zusammen. Scheinbar war Zeitweise genug Energie auf den Primär Waffen und ein Feuerimpuls hat es bis zur Elektronik geschafft. Dann war es das aber auch schon, ein zweiter Schuss kann nicht ausgelöst werden. War das also eine Fehlermeldung oder eine Verkettung von Signalen und Automatismen? Wie auch immer, es hat etwas getroffen gerade kommen die Sensoren Daten rein, dass sich das mit freien Flugbar soeben erledigt hat. Natürlich habt die Steuerung in diesem Moment sich eine weitere Gedenkpause gegönnt zwar reagiert etwas aber weder zeitnah noch im vorher gelernten Muster. Es scheint als würde jede Eingabe einen zufälligen Richtungsänderung auslösen. Ein Nebel aus Partikel bringen die wenigen Senordaten die rein kommen vollends auseinander ein Blindflug ins Ungewisse. Wild alles auslösen was ein Abschluss befehl sein konnte, denn was da in den Daten zu erahnen war versprach die volle Zerstörung. Navigieren ergab einfach keinen Sinn mehr, Energie ausleichen aussichtlos, Waffen auf anschlag doch es war zu spät. Die Lichter gingen aus...
|
||||
|
||||
Es ist gut, dass du den Funk zum laufen bekommen hast, ohne ihn hätten wir dich nicht in letzter Sekunde raus holen können. Wenn wir den Enigure finden laden wir die Zellen auf und machen uns bereit für den Rückweg.
|
||||
Executable
+49
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/bash
|
||||
BASEDIR=$(pwd)
|
||||
INPUT_DIR="$BASEDIR/input"
|
||||
OUTPUT_DIR="$BASEDIR/91_sonnensystem"
|
||||
TEMPLATES="$BASEDIR/templates"
|
||||
|
||||
chown -R appuser:appgroup "$OUTPUT_DIR"
|
||||
|
||||
function convert_adoc() {
|
||||
if [ -f "$1" ]; then
|
||||
echo "-> Konvertiere $1 zu HTML..."
|
||||
asciidoctor -b html5 -a stylesheet=$TEMPLATES/retro-dark.css -a linkcss -a toc=left $1 -o $2
|
||||
else
|
||||
echo " [INFO] $1 nicht gefunden, überspringe..."
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
echo '--- Baue README ---'
|
||||
convert_adoc "$INPUT_DIR/README.adoc" "$OUTPUT_DIR/README.html"
|
||||
|
||||
echo '--- Baue Lore (Master-Dokument) ---'
|
||||
LORE_SRC="$INPUT_DIR/index.adoc"
|
||||
if [ -f "$INPUT_DIR/master.adoc" ]; then LORE_SRC="$INPUT_DIR/master.adoc"; fi
|
||||
|
||||
if [ -f "$LORE_SRC" ]; then
|
||||
echo "-> Generiere Lore-Dokument (HTML & Markdown) aus $LORE_SRC..."
|
||||
asciidoctor -b html5 -d book -a stylesheet=$TEMPLATES/retro-dark.css -a linkcss -a toc=left "$LORE_SRC" -o "$OUTPUT_DIR/lore.html"
|
||||
asciidoctor -b docbook -d book "$LORE_SRC" -o "$OUTPUT_DIR/temp_lore.xml"
|
||||
pandoc -f docbook -t markdown_strict "$OUTPUT_DIR/temp_lore.xml" -o "$OUTPUT_DIR/lore.md"
|
||||
rm "$OUTPUT_DIR/temp_lore.xml"
|
||||
else
|
||||
echo " [WARNUNG] Weder index.adoc noch master.adoc gefunden!"
|
||||
fi
|
||||
|
||||
echo '--- Baue Fließtexte / Geschichten ---'
|
||||
if [ -f "$INPUT_DIR/darkCenter.adoc" ]; then
|
||||
echo "-> Konvertiere darkCenter.adoc zu HTML..."
|
||||
asciidoctor -b html5 -d book -a stylesheet=$TEMPLATES/retro-dark.css -a linkcss -a toc=left "$INPUT_DIR/darkCenter.adoc" -o "$OUTPUT_DIR/darkCenter.html"
|
||||
fi
|
||||
|
||||
rm -rf export
|
||||
mkdir "$OUTPUT_DIR/css"
|
||||
cp "$TEMPLATES/retro-dark.css" "$OUTPUT_DIR/css/"
|
||||
cp "$TEMPLATES/index.html" "$OUTPUT_DIR/"
|
||||
sed -i 's/\/workspace\/templates/css/g' "$OUTPUT_DIR/darkCenter.html"
|
||||
sed -i 's/\/workspace\/templates/css/g' "$OUTPUT_DIR/lore.html"
|
||||
sed -i 's/\/workspace\/templates/css/g' "$OUTPUT_DIR/README.html"
|
||||
chown -R appuser:appgroup "$OUTPUT_DIR"
|
||||
@@ -0,0 +1,18 @@
|
||||
FROM debian:stable-slim
|
||||
|
||||
RUN apt-get update && apt-get upgrade && apt-get -y install asciidoctor pandoc bash
|
||||
|
||||
RUN groupadd --gid 1000 appgroup && \
|
||||
useradd --uid 1000 --gid appgroup --shell /bin/bash --create-home appuser
|
||||
|
||||
RUN gem install asciidoctor-pdf
|
||||
|
||||
WORKDIR /workspace
|
||||
|
||||
ADD ./90_builder/templates templates
|
||||
ADD ./90_builder/bookFold.sh ./
|
||||
|
||||
RUN chown -R appuser:appgroup /workspace
|
||||
|
||||
|
||||
CMD ["/workspace/bookFold.sh"]
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 454 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 222 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 230 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 157 KiB |
@@ -0,0 +1,174 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>CORE // MASCHINEN-INSTANZEN_LOG</title>
|
||||
<style>
|
||||
:root {
|
||||
--bg-color: #0d1117;
|
||||
--text-color: #c9d1d9;
|
||||
--link-color: #58a6ff;
|
||||
--accent-color: #ff7b72;
|
||||
--border-color: #30363d;
|
||||
--code-bg: #161b22;
|
||||
--font-main: 'Courier New', Courier, monospace;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--bg-color);
|
||||
color: var(--text-color);
|
||||
font-family: var(--font-main);
|
||||
max-width: 900px;
|
||||
margin: 0 auto;
|
||||
padding: 2rem;
|
||||
}
|
||||
|
||||
header {
|
||||
border-bottom: 2px solid var(--accent-color);
|
||||
padding-bottom: 1rem;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.terminal-title {
|
||||
color: var(--accent-color);
|
||||
font-size: 2em;
|
||||
font-weight: normal;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 2px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.system-status {
|
||||
font-size: 0.9em;
|
||||
color: #8b949e;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
.status-blink {
|
||||
color: #7ee787;
|
||||
animation: blink 1.5s infinite;
|
||||
}
|
||||
|
||||
@keyframes blink {
|
||||
0% { opacity: 1; }
|
||||
50% { opacity: 0; }
|
||||
100% { opacity: 1; }
|
||||
}
|
||||
|
||||
.category-block {
|
||||
border: 1px solid var(--border-color);
|
||||
background-color: var(--code-bg);
|
||||
padding: 1.5rem;
|
||||
margin-bottom: 1.5rem;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.category-title {
|
||||
color: var(--accent-color);
|
||||
font-size: 1.2em;
|
||||
text-transform: uppercase;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
padding-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 0.8rem;
|
||||
padding-left: 1.5rem;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
li::before {
|
||||
content: ">>";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
color: var(--accent-color);
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--link-color);
|
||||
text-decoration: none;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
color: #79c0ff;
|
||||
}
|
||||
|
||||
.file-meta {
|
||||
font-size: 0.85em;
|
||||
color: #8b949e;
|
||||
display: block;
|
||||
margin-top: 0.2rem;
|
||||
}
|
||||
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
border-top: 1px solid var(--border-color);
|
||||
padding-top: 1rem;
|
||||
font-size: 0.8em;
|
||||
color: #8b949e;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header>
|
||||
<h1 class="terminal-title">Maschinen-Instanzen // Datenarchiv</h1>
|
||||
<div class="system-status">
|
||||
STATUS: <span class="status-blink">ONLINE</span> | REPO: UBERSPACE/GITEA | NODE: ACER_SPIN5_CLIENT
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="category-block">
|
||||
<h2 class="category-title">00 // System-Konfiguration</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="README.html">README.html</a>
|
||||
<span class="file-meta">System-Handbuch, Keymaps, Sync-Architektur & Befehle</span>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section class="category-block">
|
||||
<h2 class="category-title">01 // Datenspeicher (Lore-Bibel)</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="lore.html">lore.html</a>
|
||||
<span class="file-meta">Das vollständige Master-Dokument (Kompiliertes Buch-Format)</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="lore.md">lore.md</a>
|
||||
<span class="file-meta">Rohdaten-Export im Markdown-Format (LLM / Gitea kompatibel)</span>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section class="category-block">
|
||||
<h2 class="category-title">02 // Chroniken & Vektor-Flüge</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="darkCenter.html">darkCenter.html</a>
|
||||
<span class="file-meta">Fließtext / Kurzgeschichte (Kompiliert aus AsciiDoc)</span>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
computerHistory $ terminal --session-closed (8 Threads // 8 GB RAM Ok)
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,69 @@
|
||||
:root {
|
||||
--bg-color: #0d1117;
|
||||
--text-color: #c9d1d9;
|
||||
--link-color: #58a6ff;
|
||||
--accent-color: #ff7b72;
|
||||
--border-color: #30363d;
|
||||
--code-bg: #161b22;
|
||||
--font-main: 'Courier New', Courier, monospace;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--bg-color);
|
||||
color: var(--text-color);
|
||||
font-family: var(--font-main);
|
||||
line-height: 1.6;
|
||||
max-width: 900px;
|
||||
margin: 0 auto;
|
||||
padding: 2rem;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: var(--accent-color);
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
padding-bottom: 0.3em;
|
||||
font-weight: normal;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
h1 { font-size: 2.5em; border-bottom: 2px solid var(--accent-color); }
|
||||
h2 { font-size: 1.5em; }
|
||||
|
||||
a { color: var(--link-color); text-decoration: none; }
|
||||
a:hover { text-decoration: underline; color: #79c0ff; }
|
||||
|
||||
code, kbd, pre {
|
||||
font-family: var(--font-main);
|
||||
background-color: var(--code-bg);
|
||||
color: #a5d6ff;
|
||||
border-radius: 3px;
|
||||
}
|
||||
code { padding: 0.2em 0.4em; }
|
||||
pre { padding: 16px; overflow: auto; border: 1px solid var(--border-color); }
|
||||
|
||||
blockquote {
|
||||
border-left: 4px solid var(--accent-color);
|
||||
color: #8b949e;
|
||||
padding: 0 1em;
|
||||
margin-left: 0;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
th, td {
|
||||
border: 1px solid var(--border-color);
|
||||
padding: 8px 12px;
|
||||
}
|
||||
th { background-color: var(--code-bg); color: var(--accent-color); }
|
||||
|
||||
hr {
|
||||
height: 1px;
|
||||
background-color: var(--border-color);
|
||||
border: none;
|
||||
margin: 2rem 0;
|
||||
}
|
||||
+14
-12
@@ -91,21 +91,23 @@ Dadurch wird die im Repository getrackte `.nvim.lua` geladen, welche projektspez
|
||||
|Verlässt den Terminal-Eingabemodus und kehrt in den Normal Mode zurück
|
||||
|===
|
||||
|
||||
== 4. Die Build-Pipeline (`build.sh`)
|
||||
== 4. Die Build-Pipeline (extern)
|
||||
|
||||
Um deine AsciiDoc-Fragmente in ansprechende Retro-HTML-Dokumente zu gießen, nutzt das System einen flüchtigen Docker-Container.
|
||||
Mit der Gitlab Ci kann ein beliebiges Dokumnet als Master in einem beliebigen Verzeiniss, gilt dann als Root Dir, die vier (fünf) ausgabeformate erzeuten. Zur Zeit mit festen Theming das nicht einheitlich über die Formate ist
|
||||
|
||||
* HTML ein Verzeichniss mit der index.html und allen CSS/Image Dateien
|
||||
* PDF mit asciidoctor-pdf und einem Theming
|
||||
* ePub mit asciidoctor-epub und dem PDF Teming
|
||||
* mobi ist ein ePub falloff
|
||||
* LaTex ist noch defekt und es fehlt ein workflow
|
||||
|
||||
link: https://git.exta.de/dexta/chbuilder[computerHistory world Builder]
|
||||
|
||||
== 4.1 Der Build Test (lokal)
|
||||
|
||||
Um deine AsciiDoc-Fragmente in ansprechende Retro-HTML-Dokumente zu gießen, nutzt das System einen Docker-Container.
|
||||
|
||||
. *Abhängigkeiten auf dem Host:*
|
||||
Lediglich `docker` und `bash` müssen installiert sein.
|
||||
|
||||
Keine Java-, Ruby- oder Haskell-Laufzeitumgebungen belasten deinen Debian-Client.
|
||||
|
||||
. *Ablauf:*
|
||||
.. Das Skript `build.sh` prüft das Vorhandensein des lokalen Images `lore-builder`.
|
||||
Es basiert auf Alpine und enthält `asciidoctor` sowie `pandoc`.
|
||||
|
||||
.. Das lokale Projektverzeichnis wird in den Container gemountet.
|
||||
|
||||
.. Im Ordner `export/` werden die HTML-Dokumente inklusive des Retro-Dark-Themes (`retro-dark.css`) erzeugt.
|
||||
|
||||
.. Die `index.html` wird als interaktives Terminal-Dashboard vollautomatisch neu aufgebaut.
|
||||
|
||||
@@ -1,9 +1,15 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Name des lokalen Docker-Images
|
||||
IMAGE_NAME="lore-builder"
|
||||
IMAGE_NAME="ian-lore-builder"
|
||||
# Input Ordner
|
||||
INP_DIR=$(pwd)
|
||||
# Build Ordner
|
||||
# BID_DIR="90_builder"
|
||||
# Build templares
|
||||
# TEMPLATES="$BID_DIR/templates"
|
||||
# Ausgabeordner
|
||||
OUT_DIR="export"
|
||||
OUT_DIR="$INP_DIR/91_sonnensystem"
|
||||
|
||||
# Farben für Output
|
||||
GREEN='\033[0;32m'
|
||||
@@ -12,318 +18,31 @@ NC='\033[0m' # No Color
|
||||
|
||||
echo -e "${BLUE}=== Starte Master-Build-Prozess (Maschinen-Instanzen) ===${NC}"
|
||||
|
||||
# 1. Output-Verzeichnis erstellen
|
||||
# 1. Output-Verzeichnis löschen und erstellen
|
||||
rm -rf "$OUT_DIR"
|
||||
mkdir -p "$OUT_DIR"
|
||||
echo -e "Output-Ordner '${GREEN}$OUT_DIR${NC}' steht bereit."
|
||||
echo -e "Output-Ordner '${GREEN}$OUT_DIR${NC}' bereinigt und bereit."
|
||||
|
||||
# 2. Prüfen, ob das Docker-Image existiert, ansonsten on-the-fly bauen
|
||||
if [[ "$(docker images -q $IMAGE_NAME 2> /dev/null)" == "" ]]; then
|
||||
echo -e "${BLUE}Baue flüchtiges Docker-Image '$IMAGE_NAME' (Alpine, Asciidoctor, Pandoc)...${NC}"
|
||||
docker build -t $IMAGE_NAME - <<EOF
|
||||
FROM alpine:latest
|
||||
RUN apk add --no-cache asciidoctor pandoc bash
|
||||
WORKDIR /workspace
|
||||
EOF
|
||||
docker build -t $IMAGE_NAME -f ./90_builder/container/deb_Dockerfile .
|
||||
fi
|
||||
|
||||
# 3. CSS Datei für Retro Space Dark Theme in den Export-Ordner generieren
|
||||
cat << 'EOF' > "$OUT_DIR/retro-dark.css"
|
||||
:root {
|
||||
--bg-color: #0d1117;
|
||||
--text-color: #c9d1d9;
|
||||
--link-color: #58a6ff;
|
||||
--accent-color: #ff7b72;
|
||||
--border-color: #30363d;
|
||||
--code-bg: #161b22;
|
||||
--font-main: 'Courier New', Courier, monospace;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--bg-color);
|
||||
color: var(--text-color);
|
||||
font-family: var(--font-main);
|
||||
line-height: 1.6;
|
||||
max-width: 900px;
|
||||
margin: 0 auto;
|
||||
padding: 2rem;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: var(--accent-color);
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
padding-bottom: 0.3em;
|
||||
font-weight: normal;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
h1 { font-size: 2.5em; border-bottom: 2px solid var(--accent-color); }
|
||||
h2 { font-size: 1.5em; }
|
||||
|
||||
a { color: var(--link-color); text-decoration: none; }
|
||||
a:hover { text-decoration: underline; color: #79c0ff; }
|
||||
|
||||
code, kbd, pre {
|
||||
font-family: var(--font-main);
|
||||
background-color: var(--code-bg);
|
||||
color: #a5d6ff;
|
||||
border-radius: 3px;
|
||||
}
|
||||
code { padding: 0.2em 0.4em; }
|
||||
pre { padding: 16px; overflow: auto; border: 1px solid var(--border-color); }
|
||||
|
||||
blockquote {
|
||||
border-left: 4px solid var(--accent-color);
|
||||
color: #8b949e;
|
||||
padding: 0 1em;
|
||||
margin-left: 0;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
th, td {
|
||||
border: 1px solid var(--border-color);
|
||||
padding: 8px 12px;
|
||||
}
|
||||
th { background-color: var(--code-bg); color: var(--accent-color); }
|
||||
|
||||
hr {
|
||||
height: 1px;
|
||||
background-color: var(--border-color);
|
||||
border: none;
|
||||
margin: 2rem 0;
|
||||
}
|
||||
EOF
|
||||
# move to hard static $BID_OUT/templates/retro-dark.css
|
||||
|
||||
echo -e "${BLUE}Starte Build-Container und generiere Dokumente...${NC}"
|
||||
|
||||
# 4. Container starten und Build-Schritte im Container ausführen
|
||||
docker run --rm -v "$(pwd):/workspace" $IMAGE_NAME bash -c "
|
||||
function convert_adoc() {
|
||||
if [ -f \"\$1\" ]; then
|
||||
echo \"-> Konvertiere \$1 zu HTML...\"
|
||||
asciidoctor -b html5 -a stylesheet=retro-dark.css -a linkcss -a toc=left \"\$1\" -o \"$OUT_DIR/\$2\"
|
||||
else
|
||||
echo \" [INFO] \$1 nicht gefunden, überspringe...\"
|
||||
fi
|
||||
}
|
||||
|
||||
echo '--- Baue README ---'
|
||||
convert_adoc README.adoc README.html
|
||||
|
||||
echo '--- Baue Lore (Master-Dokument) ---'
|
||||
LORE_SRC=\"index.adoc\"
|
||||
if [ -f master.adoc ]; then LORE_SRC=\"master.adoc\"; fi
|
||||
|
||||
if [ -f \"\$LORE_SRC\" ]; then
|
||||
echo \"-> Generiere Lore-Dokument (HTML & Markdown) aus \$LORE_SRC...\"
|
||||
asciidoctor -b html5 -d book -a stylesheet=retro-dark.css -a linkcss -a toc=left \"\$LORE_SRC\" -o \"$OUT_DIR/lore.html\"
|
||||
asciidoctor -b docbook -d book \"\$LORE_SRC\" -o \"$OUT_DIR/temp_lore.xml\"
|
||||
pandoc -f docbook -t markdown_strict \"$OUT_DIR/temp_lore.xml\" -o \"$OUT_DIR/lore.md\"
|
||||
rm \"$OUT_DIR/temp_lore.xml\"
|
||||
else
|
||||
echo \" [WARNUNG] Weder index.adoc noch master.adoc gefunden!\"
|
||||
fi
|
||||
|
||||
echo '--- Baue Fließtexte / Geschichten ---'
|
||||
if [ -f darkCenter.adoc ]; then
|
||||
echo \"-> Konvertiere darkCenter.adoc zu HTML...\"
|
||||
asciidoctor -b html5 -d book -a stylesheet=retro-dark.css -a linkcss -a toc=left darkCenter.adoc -o \"$OUT_DIR/darkCenter.html\"
|
||||
fi
|
||||
|
||||
if [ -f masterOfTheWorld-sf.md ]; then
|
||||
echo \"-> Konvertiere masterOfTheWorld-sf.md zu HTML...\"
|
||||
pandoc masterOfTheWorld-sf.md -f markdown -t html -s -c retro-dark.css -o \"$OUT_DIR/masterOfTheWorld-sf.html\"
|
||||
fi
|
||||
"
|
||||
# docker run --rm -v "$INP_DIR:/workspace" $IMAGE_NAME /workspace/bookFold.sh
|
||||
docker run --rm -v "$(pwd):/workspace/input" -v "$(pwd)/91_sonnensystem:/workspace/91_sonnensystem" $IMAGE_NAME
|
||||
|
||||
# 5. index.html vollautomatisch und direkt generieren
|
||||
# moved to $BID_OUT/templates/index.html
|
||||
|
||||
echo -e "${BLUE}Generiere taktisches Dashboard ('$OUT_DIR/index.html')...${NC}"
|
||||
|
||||
cat << 'EOF' > "$OUT_DIR/index.html"
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>CORE // MASCHINEN-INSTANZEN_LOG</title>
|
||||
<style>
|
||||
:root {
|
||||
--bg-color: #0d1117;
|
||||
--text-color: #c9d1d9;
|
||||
--link-color: #58a6ff;
|
||||
--accent-color: #ff7b72;
|
||||
--border-color: #30363d;
|
||||
--code-bg: #161b22;
|
||||
--font-main: 'Courier New', Courier, monospace;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--bg-color);
|
||||
color: var(--text-color);
|
||||
font-family: var(--font-main);
|
||||
max-width: 900px;
|
||||
margin: 0 auto;
|
||||
padding: 2rem;
|
||||
}
|
||||
|
||||
header {
|
||||
border-bottom: 2px solid var(--accent-color);
|
||||
padding-bottom: 1rem;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.terminal-title {
|
||||
color: var(--accent-color);
|
||||
font-size: 2em;
|
||||
font-weight: normal;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 2px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.system-status {
|
||||
font-size: 0.9em;
|
||||
color: #8b949e;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
.status-blink {
|
||||
color: #7ee787;
|
||||
animation: blink 1.5s infinite;
|
||||
}
|
||||
|
||||
@keyframes blink {
|
||||
0% { opacity: 1; }
|
||||
50% { opacity: 0; }
|
||||
100% { opacity: 1; }
|
||||
}
|
||||
|
||||
.category-block {
|
||||
border: 1px solid var(--border-color);
|
||||
background-color: var(--code-bg);
|
||||
padding: 1.5rem;
|
||||
margin-bottom: 1.5rem;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.category-title {
|
||||
color: var(--accent-color);
|
||||
font-size: 1.2em;
|
||||
text-transform: uppercase;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
padding-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 0.8rem;
|
||||
padding-left: 1.5rem;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
li::before {
|
||||
content: ">>";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
color: var(--accent-color);
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--link-color);
|
||||
text-decoration: none;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
color: #79c0ff;
|
||||
}
|
||||
|
||||
.file-meta {
|
||||
font-size: 0.85em;
|
||||
color: #8b949e;
|
||||
display: block;
|
||||
margin-top: 0.2rem;
|
||||
}
|
||||
|
||||
footer {
|
||||
margin-top: 4rem;
|
||||
border-top: 1px solid var(--border-color);
|
||||
padding-top: 1rem;
|
||||
font-size: 0.8em;
|
||||
color: #8b949e;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header>
|
||||
<h1 class="terminal-title">Maschinen-Instanzen // Datenarchiv</h1>
|
||||
<div class="system-status">
|
||||
STATUS: <span class="status-blink">ONLINE</span> | REPO: UBERSPACE/GITEA | NODE: ACER_SPIN5_CLIENT
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section class="category-block">
|
||||
<h2 class="category-title">00 // System-Konfiguration</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="README.html">README.html</a>
|
||||
<span class="file-meta">System-Handbuch, Keymaps, Sync-Architektur & Befehle</span>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section class="category-block">
|
||||
<h2 class="category-title">01 // Datenspeicher (Lore-Bibel)</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="lore.html">lore.html</a>
|
||||
<span class="file-meta">Das vollständige Master-Dokument (Kompiliertes Buch-Format)</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="lore.md">lore.md</a>
|
||||
<span class="file-meta">Rohdaten-Export im Markdown-Format (LLM / Gitea kompatibel)</span>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section class="category-block">
|
||||
<h2 class="category-title">02 // Chroniken & Vektor-Flüge</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="darkCenter.html">darkCenter.html</a>
|
||||
<span class="file-meta">Fließtext / Kurzgeschichte (Kompiliert aus AsciiDoc)</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="masterOfTheWorld-sf.html">masterOfTheWorld-sf.html</a>
|
||||
<span class="file-meta">Fließtext / Kurzgeschichte (Konvertiert aus Markdown)</span>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
computerHistory $ terminal --session-closed (8 Threads // 8 GB RAM Ok)
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
|
||||
echo -e "${GREEN}=== Build erfolgreich! ===${NC}"
|
||||
echo "Alle Dokumente (inkl. Dashboard) liegen im Ordner './$OUT_DIR' bereit."
|
||||
|
||||
+2
-4
@@ -4,11 +4,11 @@
|
||||
:sectnums:
|
||||
:stylesdir: export
|
||||
:stylesheet: retro-dark.css
|
||||
|
||||
:leveloffset: +1
|
||||
// darkCenter.adoc fungiert als zentraler Einsprungspunkt für die modulare Pipeline.
|
||||
// Es bindet alle einzelnen AsciiDoc-Fragmente aus den Unterverzeichnissen zusammen.
|
||||
|
||||
== 00_Kanonischer_Ueberbau
|
||||
= 00_Kanonischer_Ueberbau
|
||||
|
||||
Dieses Dokument ist das dynamische, modulare Zentrum (*darkCenter*) unserer Weltenbibel.
|
||||
|
||||
@@ -46,5 +46,3 @@ include::06_Regeln/01_nina_protokoll.adoc[opts=optional]
|
||||
|
||||
'''
|
||||
|
||||
// Anhang / Tooling
|
||||
include::00_aMeta/rawDocZ/01_neovim_setup.adoc[opts=optional]
|
||||
|
||||
Reference in New Issue
Block a user