Signal-System mit Inky und KV-Store

This commit is contained in:
2026-06-12 22:36:43 +02:00
parent ff80b3cc0f
commit 97eff4f9eb
16 changed files with 1432 additions and 1 deletions
+8
View File
@@ -0,0 +1,8 @@
VAR cube_clicks = 0
Du hast den Würfel {cube_clicks} mal berührt.
{ cube_clicks >= 3:
Er fühlt sich langsam abgenutzt an.
}
-> END
+1
View File
@@ -0,0 +1 @@
{"inkVersion":21,"root":[["^Du hast den Würfel ","ev",{"VAR?":"cube_clicks"},"out","/ev","^ mal berührt.","\n","ev",{"VAR?":"cube_clicks"},3,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^Er fühlt sich langsam abgenutzt an.","\n",{"->":"0.13"},null]}],"nop","\n","end",["done",{"#n":"g-0"}],null],"done",{"global decl":["ev",0,{"VAR=":"cube_clicks"},"/ev","end",null]}],"listDefs":{}}
+46
View File
@@ -0,0 +1,46 @@
VAR mushrooms_collected = 0
VAR quest_mushroom_active = false
VAR quest_mushroom_done = false
{
- quest_mushroom_done:
# color whisper
Danke nochmal für die Pilze. Das Rezept ist fast fertig.
-> ende
- quest_mushroom_active && mushrooms_collected >= 10:
# color whisper
Du hast {mushrooms_collected} Pilze dabei — mehr als genug!
* [Hier, nimm sie.]
~ quest_mushroom_done = true
# color whisper
Wunderbar, vielen Dank! Das wird ein gutes Süppchen.
-> ende
* [Lass mich noch ein paar behalten.]
# color whisper
Wie du willst. Komm wieder, wenn du sie loswerden möchtest.
-> ende
- quest_mushroom_active:
# color whisper
Du hast schon {mushrooms_collected} von 10 Pilzen. Mach ruhig weiter.
-> ende
- else:
# color whisper
Hallo! Ich bräuchte 10 Pilze für ein Rezept. Hättest du Lust, welche zu sammeln?
* [Klar, ich helfe.]
~ quest_mushroom_active = true
# color whisper
Danke! Ich warte hier.
-> ende
* [Vielleicht später.]
# color whisper
Schade. Komm gerne nochmal vorbei.
-> ende
}
= ende
* [Bis dann]
# person_farewell
-> END
+1
View File
@@ -0,0 +1 @@
{"inkVersion":21,"root":[[["ev",{"VAR?":"quest_mushroom_done"},"/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Danke nochmal für die Pilze. Das Rezept ist fast fertig.","\n",{"->":"ende"},{"->":"0.4"},null]}],["ev",{"VAR?":"quest_mushroom_active"},{"VAR?":"mushrooms_collected"},10,">=","&&","/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Du hast ","ev",{"VAR?":"mushrooms_collected"},"out","/ev","^ Pilze dabei — mehr als genug!","\n","ev","str","^Hier, nimm sie.","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Lass mich noch ein paar behalten.","/str","/ev",{"*":".^.c-1","flg":20},{"->":"0.4"},{"c-0":["\n","ev",true,"/ev",{"VAR=":"quest_mushroom_done","re":true},"#","^color whisper","/#","^Wunderbar, vielen Dank! Das wird ein gutes Süppchen.","\n",{"->":"ende"},{"#f":5}],"c-1":["\n","#","^color whisper","/#","^Wie du willst. Komm wieder, wenn du sie loswerden möchtest.","\n",{"->":"ende"},{"#f":5}]}]}],["ev",{"VAR?":"quest_mushroom_active"},"/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Du hast schon ","ev",{"VAR?":"mushrooms_collected"},"out","/ev","^ von 10 Pilzen. Mach ruhig weiter.","\n",{"->":"ende"},{"->":"0.4"},null]}],[{"->":".^.b"},{"b":["\n","#","^color whisper","/#","^Hallo! Ich bräuchte 10 Pilze für ein Rezept. Hättest du Lust, welche zu sammeln?","\n","ev","str","^Klar, ich helfe.","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Vielleicht später.","/str","/ev",{"*":".^.c-1","flg":20},{"->":"0.4"},{"c-0":["\n","ev",true,"/ev",{"VAR=":"quest_mushroom_active","re":true},"#","^color whisper","/#","^Danke! Ich warte hier.","\n",{"->":"ende"},{"#f":5}],"c-1":["\n","#","^color whisper","/#","^Schade. Komm gerne nochmal vorbei.","\n",{"->":"ende"},{"#f":5}]}]}],"nop","\n",["done",{"#n":"g-0"}],null],"done",{"ende":[["ev","str","^Bis dann","/str","/ev",{"*":".^.c-0","flg":20},{"c-0":["\n","#","^person_farewell","/#","end",{"#f":5}]}],null],"global decl":["ev",0,{"VAR=":"mushrooms_collected"},false,{"VAR=":"quest_mushroom_active"},false,{"VAR=":"quest_mushroom_done"},"/ev","end",null]}],"listDefs":{}}
+83
View File
@@ -0,0 +1,83 @@
# color suzanne
Hallo! Ich bin Suzanne, der Affe von Blender.
Möchtest du wissen, wie diese Engine funktioniert?
* [Klar, leg los]
-> menu
* [Nein, danke.]
-> ende
=== menu ===
# color suzanne
Worüber soll ich plaudern?
* [Ink by Inkle] -> story
* [Renderer & Pixel] -> render
* [Welt & Physik] -> welt
* [Interaktion & Picking] -> interakt
* [Audio] -> audio
* [Warum so wenig Pixel?] -> pixel
* [Nichts weiter, danke] -> ende
=== render ===
# color suzanne
Alles, was du siehst, wird als ein Pixelbuffer von der CPU gerendert. Der Pixelbuffer ist einfach eine Liste von Bytes, die einen Frame beschreibt. Jedes Pixel hat dabei genau einen Byte, also 8 Bit speicherplatz. Deshalb haben wir auch nur 256 unterschiedliche Farbwerte pro Frame.
Texturen sind 8-bit indexed TGAs, die durch eine 256-Farben-Palette laufen. Das ist ein simples Dateiformat, das viele Grafikprogramme unterstützen und das sehr einfach zu verarbeiten ist.
Farb-Paletten sind auch TGA-Dateien, mit 16x16 Pixeln im normalen 24 Bit RGB-Raum. Diese werden von der Engine gelesen und als Farbpalette festgelegt.
Schalte Mal den Wireframe-Modus ist im ESC-Menü ein!
* [Zurück zum Menü] -> menu
=== welt ===
# color suzanne
Geometrie kommt aus OBJ-Dateien, die z.B. in Blender bearbeitet werden. Dabei gibt es Konventionen:
Mesh-Namen mit Prefix steuern die Rolle: VIS_ ist nur sichtbar, COL_ ist nur
Kollision, INT_ ist nur Trigger (weder sichtbar, noch kollision). Alle anderen Meshes sind sichtbar und kollidieren.
Materialien werden in assets/materials/materials.toml definiert. Dort liegen auch die Texturen.
* [Zurück zum Menü] -> menu
=== interakt ===
# color suzanne
Diese Engine nutzt ein Signal-System mit Triggern und Actions.
In signals.toml werden Trigger definiert und Actions zugewiesen. Schau dir gern die Datei Mal an.
Jedes Objekt kann einen eigenen Trigger bei Spieler-Interaktion haben. Dieser Trigger heißt einfach wie das Objekt. VIS_mushroom hat also den Trigger [VIS_mushroom], der Actions auslöst.
* [Zurück zum Menü] -> menu
=== story ===
# color suzanne
Dialoge und Interaktionen werden in Inkscript geschrieben. Die Engine liest kompilierte .ink.json-Dateien.
Im backend läuft bladeink als Interpreter. Dadurch ist der komplette Inky-Standard unterstützt. Color-Tags ändern die Textfarbe. Alle anderen Tags werden als Signals in der Engine dispatched.
Die Engine hat einen Variablen-Speicher, der mit dem Variablenspeicher vor und nach jedem Dialog synchronisiert wird. Variablen im Inkscript sind also global verfügbar und können durch Signals gesteuert werden.
* [Zurück zum Menü] -> menu
=== audio ===
# color suzanne
Die Sound-Engine ist noch sehr rudimentär. WAV-Dateien werden durch die Engine geladen. Die Sounds können durch Signals gesteuert werden. Es gibt noch keine 3D-Effekte.
* [Zurück zum Menü] -> menu
=== pixel ===
# color suzanne
Diese Engine unterstützt beliebige Auflösung. Aktuell sind es 320x240px also qVGA. Ich find das schick!
Aber 640x480px haben auch noch einen guten Retro-Look. Bei 1920p brauchen wir dann schon bessere Assets, sonst wirds hässlich.
Starte die Engine im Terminal mit ./irl3d --resolution VGA
* [Zurück zum Menü] -> menu
=== ende ===
# color suzanne
Schön, dass du dich hier umschaust. Viel Spaß noch!
* [Bis dann]
# suzanne_farewell
-> END
File diff suppressed because one or more lines are too long