first version of EU AI Act game

This commit is contained in:
Anna Hiemenz
2026-05-26 21:46:46 +02:00
commit d370249649
1735 changed files with 79828 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
root = true
[*]
charset = utf-8
+2
View File
@@ -0,0 +1,2 @@
# Normalize EOL for all files that Git considers text files.
* text=auto eol=lf
+4
View File
@@ -0,0 +1,4 @@
# Godot 4+ specific ignores
.godot/
/android/
/builds/
+3
View File
@@ -0,0 +1,3 @@
~ start
Alien001: Ich finde es schwierig künstliche Intelligenz zu definieren. Die Menschen sind sich ja nichtmal einig was Intelligenz ist.
=> END
+16
View File
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://b2h462vvv1arj"
path="res://.godot/imported/ai_v1.dialogue-4e78d4db647f84f124dfdb74ad3bd37d.tres"
[deps]
source_file="res://Interact/dialogue/ai_v1.dialogue"
dest_files=["res://.godot/imported/ai_v1.dialogue-4e78d4db647f84f124dfdb74ad3bd37d.tres"]
[params]
defaults=true
+3
View File
@@ -0,0 +1,3 @@
~ start
Alien002: Künstliche Intelligenz lernt aus großen Datenmengen. Die Ergebnisse sind nicht deterministisch, also es kommt nie genau das gleiche raus, wenn ich einen Algorithmus zweimal lernen lasse.
=> END
+16
View File
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://c4na70ggougjl"
path="res://.godot/imported/ai_v2.dialogue-69c4f034ab6c67e19e7f6a6d84f5f49a.tres"
[deps]
source_file="res://Interact/dialogue/ai_v2.dialogue"
dest_files=["res://.godot/imported/ai_v2.dialogue-69c4f034ab6c67e19e7f6a6d84f5f49a.tres"]
[params]
defaults=true
+3
View File
@@ -0,0 +1,3 @@
~ start
Alien003: Modelle Künstlicher Intelligenz können komplexe Funktionen über sehr viele Parameter abbilden. Die Parameter werden aus Daten gelernt.
=> END
+16
View File
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://cn7jvs2bu4nb"
path="res://.godot/imported/ai_v3.dialogue-0ae1002d0f08a41f8d1fc8e385eda21c.tres"
[deps]
source_file="res://Interact/dialogue/ai_v3.dialogue"
dest_files=["res://.godot/imported/ai_v3.dialogue-0ae1002d0f08a41f8d1fc8e385eda21c.tres"]
[params]
defaults=true
+4
View File
@@ -0,0 +1,4 @@
~ start
Alien004: In der Stanford Enzyklopädie für Philosophie steht: Künstliche Intelligenz (KI) ist das Gebiet, das sich mit der Erschaffung künstlicher Tiere (oder zumindest künstlicher Lebewesen, die - in geeigneten Kontexten - wie Tiere erscheinen) und für viele auch künstlicher Personen (oder zumindest künstlicher Lebewesen, die - in geeigneten Kontexten - wie Personen erscheinen) befasst.
Ich glaube das heißt KI möchte Lebewesen erschaffen, die für Menschen nicht von natürlichen Lebewesen unterscheidbar sind.
=> END
+16
View File
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://cxvsdyvmpof6l"
path="res://.godot/imported/ai_v4.dialogue-ec0cff031c5a6e1d5aa6a982be47469c.tres"
[deps]
source_file="res://Interact/dialogue/ai_v4.dialogue"
dest_files=["res://.godot/imported/ai_v4.dialogue-ec0cff031c5a6e1d5aa6a982be47469c.tres"]
[params]
defaults=true
+3
View File
@@ -0,0 +1,3 @@
~ start
Alien005: Die Stanford 100 year study of AI sagt: Künstliche Intelligenz ist die Tätigkeit, die darauf abzielt, Maschinen intelligent zu machen, und Intelligenz ist die Eigenschaft, die es einem Wesen ermöglicht, in seiner Umgebung angemessen und vorausschauend zu handeln.
=> END
+16
View File
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://dbfvvjpviigph"
path="res://.godot/imported/ai_v5.dialogue-4263e2699a3642dbb73368a75eae7f77.tres"
[deps]
source_file="res://Interact/dialogue/ai_v5.dialogue"
dest_files=["res://.godot/imported/ai_v5.dialogue-4263e2699a3642dbb73368a75eae7f77.tres"]
[params]
defaults=true
+3
View File
@@ -0,0 +1,3 @@
~ start
Albatross: Guten Tag, mein Name ist Albatross. Ich bin eine Künstliche Intelligenz, die entwickelt wurde um dieses Raumschiff zu steuern. Da KI nur verantwortungsvoll genutzt werden kann, wenn Menschen sie verstehen, habe ich den Auftrag Sie zu Ihrer KI-Schulung zu fliegen. Nach der Landung kann ich Sie erst wieder reinlassen und zurück fliegen, wenn Sie genug gelernt haben. Starten wir nun diese Reise! ([Enter/Leertaste/Klicken])
=> END
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://dymr5ml8nrwwn"
path="res://.godot/imported/albatross.dialogue-dcdf88cc436c8c820fa60696096ed671.tres"
[deps]
source_file="res://Interact/dialogue/albatross.dialogue"
dest_files=["res://.godot/imported/albatross.dialogue-dcdf88cc436c8c820fa60696096ed671.tres"]
[params]
defaults=true
+16
View File
@@ -0,0 +1,16 @@
~ start
Hallo. Ich bin Datenschutzbeauftragter. Ich würde gerne ein paar Infos geben.
~ choice1
Wozu soll ich etwas erzählen
- Verstöße melden / Whistleblowing
Wenn Sie etwas sehen /etwas melden wollen, bezogen auf folgenden [url=https://artificialintelligenceact.eu/de/recital/172/]Artikel[/url] bzw. [url=https://eur-lex.europa.eu/eli/dir/2019/1937/oj?locale=de]Richtlinie[/url]
=> choice1
- aktuelle Gerichtsverfahren
Link
=> choice1
- Kontaktinfo für weitere Fragen
Link
=> choice1
- Nichts weiter, ich hab alles schon gehört
Danke für Ihre Zeit. Viel Spaß beim weiteren Erkunden.
=> END
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://b6rryvfrnms7s"
path="res://.godot/imported/contact_info.dialogue-c325214c857c66f6efc47d0795aef430.tres"
[deps]
source_file="res://Interact/dialogue/contact_info.dialogue"
dest_files=["res://.godot/imported/contact_info.dialogue-c325214c857c66f6efc47d0795aef430.tres"]
[params]
defaults=true
@@ -0,0 +1,49 @@
~ start
#: Die EU hat eine Unterteilung der KI-Systeme in vier Risikostufen vorgenommen: Minimales, geringes, hohes und inakzeptables Risiko.
Der EU AI Act bewertet KI Systeme in vier Risikostufen, von minimalem bis zu inakzeptablem Risiko für Grundrechte und Sicherheit.
Je höher das Risiko, umso strenger die Regulierung. KI Systeme mit inakzeptablem Risiko sind verboten.
~ risklevels
if DialogueState.seen
=> risklevels1
else
set DialogueState.seen = true
=> risklevels0
~ ending
In der folgenden Aufgabe geht es darum, die eben gesammelten Batterien zu ihren passenden Generatoren zuzuordnen. Dadurch wird das Raumschiff geladen und kann wieder starten. \nDie Batterien befinden sich im Inventar, welches sich mit [c] öffnen (und auch wieder schließen) lässt.
Zum Zuordnen eine Batterie auswählen (über den Button) und anschließend zu den Generatoren transportieren und dort (mit [f]) wieder loslassen und einsetzen. \nJeder Generator steht für eine der vier Risikostufen. \nDie Batterien bilden je ein KI-System ab.
$> DialogueState.orderingGameFlag = true
=> END
~ risklevels0
Die vier Risikostufen: [speed=1]Lernen Sie nun die einzelnen Stufen genauer kennen. Eine der Stufen mit der Maus oder den Pfeiltasten auswählen und klicken/Enter/Leertaste drücken.
- Minimales Risiko
Minimales Risiko: Keine spezifischen Anforderungen. \nEin Beispiel für diese Kategorie wäre ein Schachcomputer.
=> risklevels
- Geringes Risiko
Geringes Risiko: Informationspflicht über die Benutzung der KI. \nEin Beispiel für diese Kategorie wäre ein Programmierbot.
=> risklevels
- Hohes Risiko
Hohes Risiko: Strenge Anforderungen an Transparenz, Dokumentation, Überwachung des Systems durch Menschen! \nEin Beispiel für diese Kategorie wäre ein KI-System, dass automatisch Arbeiten von Studierenden oder Schülern/Schülerinnen bewertet.
=> risklevels
- Inakzeptables Risiko
Inakzeptables Risiko: KI ist verboten! \nEin Beispiel für diese Kategorie wäre der Einsatz eines KI-Systems, dass das Risiko, dass eine Person in Zukunft eine Straftat begeht, vorhersagt.
=> risklevels
- Ich habe alles gelernt, beginne mit dem Spiel.
=> ending
~ risklevels1
Die vier Risikostufen: [speed=-1]Lernen Sie nun die einzelnen Stufen genauer kennen. Eine der Stufen mit der Maus oder den Pfeiltasten auswählen und klicken/Enter/Leertaste drücken. Wenn Sie fertig sind, können Sie durch Wählen der untersten Option das Spiel fortsetzen.
- Minimales Risiko
Minimales Risiko: Keine spezifischen Anforderungen. \nEin Beispiel für diese Kategorie wäre ein Schachcomputer.
=> risklevels
- Geringes Risiko
Geringes Risiko: Informationspflicht über die Benutzung der KI. \nEin Beispiel für diese Kategorie wäre ein Programmierbot.
=> risklevels
- Hohes Risiko
Hohes Risiko: Strenge Anforderungen an Transparenz, Dokumentation, Überwachung des Systems durch Menschen! \nEin Beispiel für diese Kategorie wäre ein KI-System, dass automatisch Arbeiten von Studierenden oder Schülern/Schülerinnen bewertet.
=> risklevels
- Inakzeptables Risiko
Inakzeptables Risiko: KI ist verboten! \nEin Beispiel für diese Kategorie wäre der Einsatz eines KI-Systems, dass das Risiko, dass eine Person in Zukunft eine Straftat begeht, vorhersagt.
=> risklevels
- Ich habe alles gelernt, beginne mit dem Spiel.
=> ending
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://spdio5o620nd"
path="res://.godot/imported/explain_ordering_game.dialogue-b81742c144ddbf5e5f5de01368b6e4ff.tres"
[deps]
source_file="res://Interact/dialogue/explain_ordering_game.dialogue"
dest_files=["res://.godot/imported/explain_ordering_game.dialogue-b81742c144ddbf5e5f5de01368b6e4ff.tres"]
[params]
defaults=true
+151
View File
@@ -0,0 +1,151 @@
~ start
- bisher gelerntes nochmal ansehen
=> recap
- Fragen zum EU AI Act stellen [if DialogueState.enableLLM]
$> openChatBot()
- Hilfe zum Spiel (Steuerung, aktuelle Aufabe, ...)
=> help
- gesamter Text des EU AI Acts (öffnet Link im Browser)
$> openAIActinBrowser()
- gesamter Text der DSGVO (öffnet Link im Browser)
$> openDSGVOinBrowser()
- Musik an/aus
$> toggle_music()
- Schließen
=> END
=> END
~ recap
- Alien-Dialoge wiederholen
=> AI
- Mögliche Anwendungen von KI [if DialogueState.batteriesFlag]
=> applications
- Risikostufen [if DialogueState.orderingGameFlag]
=> risks
- personenbezogene Daten [if DialogueState.personalDataFlag]
=> personalData
- zurück
=> start
~ AI
- Alien001 [if DialogueState.alienFlags[1]]
Alien001: Ich finde es schwierig künstliche Intelligenz zu definieren. Die Menschen sind sich ja nichtmal einig was Intelligenz ist.
=> AI
- Alien002 [if DialogueState.alienFlags[2]]
Alien002: Künstliche Intelligenz lernt aus großen Datenmengen. Die Ergebnisse sind nicht deterministisch, also es kommt nie genau das gleiche raus, wenn ich einen Algorithmus zweimal lernen lasse.
=> AI
- Alien003 [if DialogueState.alienFlags[3]]
Alien003: Modelle Künstlicher Intelligenz können komplexe Funktionen über sehr viele Parameter abbilden. Die Parameter werden aus Daten gelernt.
=> AI
- Alien004 [if DialogueState.alienFlags[4]]
Alien004: In der Stanford Enzyklopädie für Philosophie steht: Künstliche Intelligenz (KI) ist das Gebiet, das sich mit der Erschaffung künstlicher Tiere (oder zumindest künstlicher Lebewesen, die in geeigneten Kontexten wie Tiere erscheinen) und für viele auch künstlicher Personen (oder zumindest künstlicher Lebewesen, die in geeigneten Kontexten wie Personen erscheinen) befasst.
Ich glaube das heißt KI möchte Lebewesen erschaffen, die für Menschen nicht von natürlichen Lebewesen unterscheidbar sind.
=> AI
- Alien005 [if DialogueState.alienFlags[5]]
Alien005: Die Stanford 100 year study of AI sagt: Künstliche Intelligenz ist die Tätigkeit, die darauf abzielt, Maschinen intelligent zu machen, und Intelligenz ist die Eigenschaft, die es einem Wesen ermöglicht, in seiner Umgebung angemessen und vorausschauend zu handeln.
=> AI
- zurück
=> recap
~ applications
Helfer: Spamfilter, Diagnose von Krankheiten auf MRT-Bildern, Chatbots, biometrische Überwachung im öffentlichen Raum.
=> recap
~ risks
Der EU AI Act bewertet KI Systeme in vier Risikostufen, von minimalem bis zu inakzeptablem Risiko für Grundrechte und Sicherheit.
Je höher das Risiko, umso strenger die Regulierung. KI Systeme mit inakzeptablem Risiko sind verboten.
~ risklevels
if DialogueState.seen
=> risklevels1
else
set DialogueState.seen = true
=> risklevels0
~ risklevels0
Die vier Risikostufen: [speed=1]Lernen Sie nun die einzelnen Stufen genauer kennen. Eine der Stufen mit der Maus oder den Pfeiltasten auswählen und klicken/Enter/Leertaste drücken.
- Minimales Risiko
Minimales Risiko: Keine spezifischen Anforderungen. \nEin Beispiel für diese Kategorie wäre ein Schachcomputer.
=> risklevels
- Geringes Risiko
Geringes Risiko: Informationspflicht über die Benutzung der KI. \nEin Beispiel für diese Kategorie wäre ein Programmierbot.
=> risklevels
- Hohes Risiko
Hohes Risiko: Strenge Anforderungen an Transparenz, Dokumentation, Überwachung des Systems durch Menschen! \nEin Beispiel für diese Kategorie wäre ein KI-System, dass automatisch Arbeiten von Studierenden oder Schülern/Schülerinnen bewertet.
=> risklevels
- Inakzeptables Risiko
Inakzeptables Risiko: KI ist verboten! \nEin Beispiel für diese Kategorie wäre der Einsatz eines KI-Systems, dass das Risiko, dass eine Person in Zukunft eine Straftat begeht, vorhersagt.
=> risklevels
- Zurück
=> recap
~ risklevels1
Die vier Risikostufen: [speed=-1]Lernen Sie nun die einzelnen Stufen genauer kennen.
- Minimales Risiko
Minimales Risiko: Keine spezifischen Anforderungen. \nEin Beispiel für diese Kategorie wäre ein Schachcomputer.
=> risklevels
- Geringes Risiko
Geringes Risiko: Informationspflicht über die Benutzung der KI. \nEin Beispiel für diese Kategorie wäre ein Programmierbot.
=> risklevels
- Hohes Risiko
Hohes Risiko: Strenge Anforderungen an Transparenz, Dokumentation, Überwachung des Systems durch Menschen! \nEin Beispiel für diese Kategorie wäre ein KI-System, dass automatisch Arbeiten von Studierenden oder Schülern/Schülerinnen bewertet.
=> risklevels
- Inakzeptables Risiko
Inakzeptables Risiko: KI ist verboten! \nEin Beispiel für diese Kategorie wäre der Einsatz eines KI-Systems, dass das Risiko, dass eine Person in Zukunft eine Straftat begeht, vorhersagt.
=> risklevels
- Zurück
=> recap
~ personalData
: KI im Alltag: Wahrscheinlich sind die bisherigen Beispiele für Sie im Berufsalltag noch nicht relevant, sicher kennen Sie aber und vielleicht nutzen Sie auch schon sogenannte Sprachmodelle, die uns Fragen beantworten, Texte schreiben, übersetzen und vieles mehr. Beispiele hierfür sind ChatGPT oder Gemini.
: Erste wichtige Regel: Jegliche Eingabe von personenbezogenen Daten in kommerzielle Sprachmodelle ist verboten (laut Datenschutzgrundverordnung, hier ist nicht unbedingt der AI Act die Grundlage). Wollen Sie sich davor schützen, dass aus Ihren Anfragen von Firmen Rückschlüsse über Ihre eigene Person gezogen werden, nutzen sie am besten gar keine kommerziellen Modelle.
: Glücklicherweise bietet die Universität Greifswald eine Alternative. Das Rechenzentrum stellt uns eine ganze Reihe von Sprachmodellen zur Verfügung, die auf der Infrastruktur der Universität installiert sind und Daten nicht nach außen lassen. Ihre Anfragen sind damit so sicher wie Ihre Daten, die Sie in der Cloud der Universität speichern. https://open-webui.wolke.uni-greifswald.de
: Dürfen Sie hier jetzt persönliche Daten eingeben? Nein, nur mit Zustimmung der Person, von der die Daten stammen, und unter der Voraussetzung, dass die Person vollständig informiert ist und genau der Eingabe für diesen Zweck zugestimmt hat.
: Ein weiteres Problem mit Ki und Sprachmodellen ist Ihre Zuverlässigkeit. Seien Sie daher kritisch bei jeder Information, die Ihnen ein Modell liefert und prüfen Sie nach. Nutzen Sie z.B. nicht ungelesen Texte für Emails oder ungeprüfte Informationen für Vorträge.
: Was sind denn eigentlich personenbezogene Daten?
: Alle Informationen, die Sie in ein KI System eingeben, sind Daten. Personenbezogene Daten können Menschen direkt oder indirekt (durch Zusammenführung verschiedener Daten) identifizieren.
: Direkt identifizierende Daten sind z.B. Name, Adresse, Personalausweisnummer. Indirekt identifizierende Informationen sind z.B. Geburtsdatum, Geschlecht, Standortdaten, Online-Kennungen (IP-Adresse, Cookie-ID), biometrische Daten (Gesichtserkennung, Fingerabdruck), Gesundheitsdaten, finanzielle Informationen, politische Meinungen, religiöse Überzeugung.
=> recap
~ help
- Steuerung
=> controls
- aktuelle Aufgabe
=> task
- zurück
=> start
~ controls
- Bewegen
Verwenden Sie die Pfeiltasten oder w,a,s,d zum Bewegen. Mit der Leertaste können Sie springen.
=> controls
- Werfen
Mit [r] schalten Sie zwischen Kamera- und Wurfmodus um. Im Wurfmodus können Sie jederzeit Bälle werfen. Durch Bewegen der Mause können Sie zielen (Sie sollten ein Fadenkreuz sehen) und klicken zum Werfen.
=> controls
- Objekte aufheben
Um Objekte aufzuheben nutzen Sie die Taste [e]. Mit [q] können sie wieder abgelegt werden.
=> controls
- Reden
Um mit Personen zu reden, drücken Sie [Enter] oder [t]. Personen sind ansprechbar, wenn unten links eine Aufforderung zum Reden steht.
=> controls
- Kamera
Mit [r] schalten Sie zwischen Kamera- und Wurfmodus um. Im Kameramodus können Sie durch Bewegen der Maus die Kamera steueren, durch scrollen kann gezoomt werden.
=> controls
- zurück
=> help
~ task
if DialogueState.currentTask == 1
Sprechen Sie mit den Aliens, um verschiedene Definitionen von Künstlicher Intelligenz (KI) kennenzulernen.
Zur Erinnerung: Start einer Unterhaltung mit [t] oder Enter.
elif DialogueState.currentTask == 2
Laufen Sie weiter zur Wurfzone. Dort angekommen, können Sie die Ballons abwerfen, um zu entdecken, in was für Systemen KI bereits eingesetzt wird bzw. werden kann. Sammeln Sie danach die Batterien, Sie werden sie im weiteren Verlauf benötigen.
Zur Erinnerung: Werfen mit [r] und Zielen mit der Maus (Fadenkreuz).
elif DialogueState.currentTask == 3
In der folgenden Aufgabe geht es darum, die eben gesammelten Batterien zu ihren passenden Generatoren zuzuordnen. Dadurch wird das Raumschiff geladen und kann wieder starten. \nDie Batterien befinden sich im Inventar, welches sich mit [c] öffnen (und auch wieder schließen) lässt. Zum Zuordnen eine Batterie auswählen (über den Button) und anschließend zu den Generatoren transportieren und dort (mit [f]) wieder loslassen und einsetzen. \nJeder Generator steht für eine der vier Risikostufen. \nDie Batterien bilden je ein KI-System ab.
elif DialogueState.currentTask == 4
Um in das Raumschiff zu gelangen, müssen Sie gleich als Passscode einmal alle personenbezogenen Daten auf dem Keypad auswählen. Zum Starten dieses Spiels, drücken Sie [k].
elif DialogueState.currentTask == 5
Beantworten Sie die unten stehen Fragen, indem Sie sich auf das Feld stellen, dass zur richtigen Antwortmöglichkeit gehört. Bei richtiger Antwort öffnet sich die Tür und Sie glangen zur nächsten Frage.
else
Lernen Sie die Steuerung kennen.
=> help
+16
View File
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://hgucelgyfur8"
path="res://.godot/imported/helper.dialogue-975cb2132aae6dc031189c2dc64ba6f2.tres"
[deps]
source_file="res://Interact/dialogue/helper.dialogue"
dest_files=["res://.godot/imported/helper.dialogue-975cb2132aae6dc031189c2dc64ba6f2.tres"]
[params]
defaults=true
+9
View File
@@ -0,0 +1,9 @@
~ start
Helfer: Hallo! Ich bin Ihr Helfer. Ich werde Sie ab jetzt auf Ihrer Reise auf diesem Planeten begleiten, und bei Fragen zu Verfügung stehen.
Helfer: Ich kann helfen, wenn Fragen zum Spiel aufkommen, sei es zur genauen Steuerung oder was genau die aktuelle Aufgabe ist.
Ebenso habe ich den gesamten Text des EU AI Acts und der Datenschutzgrundverordnung zum Nachschlagen parat, zusätzlich können Sie eigene Fragen zu diesen Texten stellen, die ich dann versuchen werde zu beantworten.
Dazu einfach [h] drücken und die passende Option auswählen. Das geht jederzeit, solange gerade kein anderer Dialog offen ist.
Um zurück zum Raumschiff zu gelangen und dieses Starten zu können und im Anschluss zurück auf die Erde zu fliegen, müssen vier Aufgaben bewältigt werden. Jede wird vorher genau erklärt.
Oben stehen auch für die Dauer einer jeden Aufgabe nochmal Hinweise zur Steuerung bzw. was gerade gemacht werden soll.
Los geht's, laufen Sie einfach weiter und schon werden Sie zur ersten Aufgabe gelangen! Viel Erfolg und Vergnügen
=> END
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://1d2xytpsi48g"
path="res://.godot/imported/helper_intro.dialogue-98c22aaeb901141124fe1bd2e65f8a75.tres"
[deps]
source_file="res://Interact/dialogue/helper_intro.dialogue"
dest_files=["res://.godot/imported/helper_intro.dialogue-98c22aaeb901141124fe1bd2e65f8a75.tres"]
[params]
defaults=true
+12
View File
@@ -0,0 +1,12 @@
~ start
Boss: Hallo! Vielen Dank, dass du hier bist.
Boss: Deine Aufgabe ist es, den EU Ai Act besser zu verstehen.
Dafür senden wir dich auf den KI Planeten.
Boss: Dort wirst du lernen, was KI ist, in welchen Bereichen sie Anwendung findet, welche Einstufungen es gibt und vieles mehr.
Boss: Wenn du alle Aufgaben erledigt hast, kannst du zurück kommen.
- Starten der Reise
Boss: Viel Spaß auf der Reise! Wir sehen uns danach wieder.
#do start_game()
- Noch weiter hier bleiben
Nathan: Viel Spaß beim weiteren austesten der Steuerung. Wenn du bereit bist, klicke auf Button(?)/rede wieder mit mir.
=> END
+16
View File
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://ceggtwxykkruk"
path="res://.godot/imported/intro.dialogue-1940e447437ebcd241285d5c310663d8.tres"
[deps]
source_file="res://Interact/dialogue/intro.dialogue"
dest_files=["res://.godot/imported/intro.dialogue-1940e447437ebcd241285d5c310663d8.tres"]
[params]
defaults=true
+11
View File
@@ -0,0 +1,11 @@
~ start
: KI im Alltag: Wahrscheinlich sind die bisherigen Beispiele für Sie im Berufsalltag noch nicht relevant, sicher kennen Sie aber und vielleicht nutzen Sie auch schon sogenannte Sprachmodelle, die uns Fragen beantworten, Texte schreiben, übersetzen und vieles mehr. Beispiele hierfür sind ChatGPT oder Gemini.
: Erste wichtige Regel: Jegliche Eingabe von personenbezogenen Daten in kommerzielle Sprachmodelle ist verboten (laut Datenschutzgrundverordnung, hier ist nicht unbedingt der AI Act die Grundlage). Wollen Sie sich davor schützen, dass aus Ihren Anfragen von Firmen Rückschlüsse über Ihre eigene Person gezogen werden, nutzen sie am besten gar keine kommerziellen Modelle.
: Glücklicherweise bietet die Universität Greifswald eine Alternative. Das Rechenzentrum stellt uns eine ganze Reihe von Sprachmodellen zur Verfügung, die auf der Infrastruktur der Universität installiert sind und Daten nicht nach außen lassen. Ihre Anfragen sind damit so sicher wie Ihre Daten, die Sie in der Cloud der Universität speichern. https://open-webui.wolke.uni-greifswald.de
: Dürfen Sie hier jetzt persönliche Daten eingeben? Nein, nur mit Zustimmung der Person, von der die Daten stammen, und unter der Voraussetzung, dass die Person vollständig informiert ist und genau der Eingabe für diesen Zweck zugestimmt hat.
: Ein weiteres Problem mit Ki und Sprachmodellen ist Ihre Zuverlässigkeit. Seien Sie daher kritisch bei jeder Information, die Ihnen ein Modell liefert und prüfen Sie nach. Nutzen Sie z.B. nicht ungelesen Texte für Emails oder ungeprüfte Informationen für Vorträge.
: Was sind denn eigentlich personenbezogene Daten?
: Alle Informationen, die Sie in ein KI System eingeben, sind Daten. Personenbezogene Daten können Menschen direkt oder indirekt (durch Zusammenführung verschiedener Daten) identifizieren.
: Direkt identifizierende Daten sind z.B. Name, Adresse, Personalausweisnummer. Indirekt identifizierende Informationen sind z.B. Geburtsdatum, Geschlecht, Standortdaten, Online-Kennungen (IP-Adresse, Cookie-ID), biometrische Daten (Gesichtserkennung, Fingerabdruck), Gesundheitsdaten, finanzielle Informationen, politische Meinungen, religiöse Überzeugung.
: Um in das Raumschiff zu gelangen, müssen Sie gleich als Passscode einmal alle personenbezogenen Daten auf dem Keypad auswählen. Zum Starten dieses Spiels, drücken Sie [k].
=> END
+16
View File
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://422gtlkpxmtw"
path="res://.godot/imported/keypad.dialogue-c744440593d3a9d1c29c7f394118c4e8.tres"
[deps]
source_file="res://Interact/dialogue/keypad.dialogue"
dest_files=["res://.godot/imported/keypad.dialogue-c744440593d3a9d1c29c7f394118c4e8.tres"]
[params]
defaults=true
@@ -0,0 +1,4 @@
~ start
Albatross: Willkommen zurück! Ich hoffe, Sie konnten einiges lernen, sowohl über KI im allgemeinen als auch speziell den EU AI Act. Bevor ich Sie zurück zur Erde fliegen kann, muss ich dieses Wissen allerdings einmal überprüfen.
Albatross: Dazu werde ich Ihnen 3 Fragen stellen. Vor Ihnen auf dem Boden befinden sich Antwortplatten. Wählen Sie die zur Frage richtige Antwort aus, und stellen Sie sich auf die zugehörige Platform. Wurde richtig geantwortet, wird sich die Tür öffen und Sie gelangen zur nächsten Frage. Bei einer falschen Antwort denken Sie nochmal genau nach und wählen dann eine andere Antwort-Platform. Nach Abschluss des Quizzes können wir gemeinsam zur Erde zurückfliegen. Viel Erfolg!
=> END
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://dexh1me00ucuv"
path="res://.godot/imported/quiz_explainer.dialogue-934071fe1bb9e7f5a1c32122aef57883.tres"
[deps]
source_file="res://Interact/dialogue/quiz_explainer.dialogue"
dest_files=["res://.godot/imported/quiz_explainer.dialogue-934071fe1bb9e7f5a1c32122aef57883.tres"]
[params]
defaults=true
@@ -0,0 +1,11 @@
~ start
Nathan: [[Hi|Hello|Howdy]], this is some dialogue.
Nathan: Here are some choices.
- First one
Nathan: You picked the first one.
- Second one
Nathan: You picked the second one.
- Start again => start
- End the conversation => END
Nathan: For more information see the online documentation.
=> END
@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://i8r2tswoq8jr"
path="res://.godot/imported/simple_dialogue.dialogue-9d41adbbc7f018180f49d1afdc6a1bdb.tres"
[deps]
source_file="res://Interact/dialogue/simple_dialogue.dialogue"
dest_files=["res://.godot/imported/simple_dialogue.dialogue-9d41adbbc7f018180f49d1afdc6a1bdb.tres"]
[params]
defaults=true
+28
View File
@@ -0,0 +1,28 @@
extends Node
var voice_id
func _ready():
var voices = DisplayServer.tts_get_voices_for_language("de")
if voices.size() > 0:
voice_id = "German+Robosoft6"
else:
voices = DisplayServer.tts_get_voices_for_language("en")
voice_id = voices[0]
# Connect with DialogueManager
DialogueManager.got_dialogue.connect(_on_dialogue)
func _on_dialogue(line):
if voice_id == null:
return
# Stop earlier text (important!)
DisplayServer.tts_stop()
# Speak
DisplayServer.tts_speak(line.text, voice_id, 100)
func _stop_dialogue():
DisplayServer.tts_stop()
+1
View File
@@ -0,0 +1 @@
uid://d0coari0ccmvy
+95
View File
@@ -0,0 +1,95 @@
extends RigidBody3D
class_name Grabbable_Object
@export var grabbable: bool = true
var is_grabbed: bool = false
var original_parent: Node = null
@export var grab_offset: Vector3 = Vector3(0.0, 0.0, -1.0)
@export var drop_forward_offset: float = 1.0
@export var weight: float = 5.0
@export var max_linear_speed: float = 15.0
@export var max_angular_speed: float = 10.0
func _integrate_forces(state: PhysicsDirectBodyState3D) -> void:
# Limit linear speed
if state.linear_velocity.length() > max_linear_speed:
state.linear_velocity = state.linear_velocity.normalized() * max_linear_speed
# Limit speed of rotation (optional)
if state.angular_velocity.length() > max_angular_speed:
state.angular_velocity = state.angular_velocity.normalized() * max_angular_speed
func grab(player: Node3D):
if not grabbable or is_grabbed or player.grabbed_item:
return
is_grabbed = true
original_parent = get_parent()
# Disable physics
gravity_scale = 0.0
linear_velocity = Vector3.ZERO
angular_velocity = Vector3.ZERO
freeze = true
$CollisionShape3D.disabled = true
# Reparent under player
var current_transform = global_transform
get_parent().remove_child(self)
player.add_child(self)
player.grabbed_item = self
print(player.grabbed_item)
global_transform = current_transform
# Move above player's head
position = grab_offset
rotation = Vector3(0,0,0)
func can_drop(player: Node3D) -> bool:
var space_state = get_world_3d().direct_space_state
var start = player.global_position + Vector3(0, 2, 0)
var forward_dir = -player.global_transform.basis.z.normalized()
var end = start + forward_dir * drop_forward_offset
var query = PhysicsRayQueryParameters3D.create(start, end)
query.exclude = [player]
var result = space_state.intersect_ray(query)
return result.is_empty()
func release(player: Node3D, throw := false):
if not is_grabbed or not can_drop(player):
return
is_grabbed = false
# Re-enable physics
$CollisionShape3D.disabled = false
freeze = false
gravity_scale = 1.0
# Reparent back to world
var current_transform = global_transform
get_parent().remove_child(self)
original_parent.add_child(self)
global_transform = current_transform
# Place in front of player
var forward_dir = -player.global_transform.basis.z.normalized()
var player_velocity = player.velocity if player is CharacterBody3D else Vector3.ZERO
var throw_dir = Vector3(0,2.0,0) + forward_dir + (player_velocity * 0.25)
global_position = player.global_position + Vector3(0, 1.5, 0) + forward_dir * drop_forward_offset
# Give it a small push forward (optional)
if throw:
apply_impulse(throw_dir * 0.01)
else:
apply_impulse(forward_dir * 0.001)
player.grabbed_item = null
func get_weight():
return weight
+1
View File
@@ -0,0 +1 @@
uid://b8c8vph26uu41
+66
View File
@@ -0,0 +1,66 @@
extends ShapeCast3D
@export var prompt = Label
@onready var bob: CharacterBody3D = $".."
@onready var env: Node3D = $"../.."
var current_collider
signal grabbed
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
prompt = $Prompt
prompt.text = ""
DialogueManager.dialogue_ended.connect(_on_dialogue_ended)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if is_colliding():
var collider = get_collider(0)
if collider is NPC_interactable:
collider.turn_to_face_interacter(self.get_parent_node_3d())
if collider is Grabbable_Object:
if collider is Battery:
prompt.text = collider.battery_label
if collider.grabbable == true and Input.is_action_just_pressed("grab"):
grab(collider)
bob.play_sound('pickup')
elif (collider is BatteryBox2) and bob.grabbed_item is Battery and Input.is_action_just_pressed("insert"):
if collider.current_power <= 0:
bob.grabbed_item.insert_into_station(collider)
bob.grabbed_item = null # battery is now in the box
elif (collider is BatteryBox2) and bob.grabbed_item == null and collider.battery_obj != null and Input.is_action_just_pressed("grab"):
var battery_obj = collider.remove_battery()
if battery_obj:
bob.grabbed_item = battery_obj
elif collider is Interactable_Object or collider is NPC_interactable:
prompt.text = collider.prompt_message
var thisTime = Time.get_unix_time_from_system()
var deltaTime = thisTime - DialogueState.time_since_dialoge_open
if collider.talkable == true and Input.is_action_just_pressed("talk") and (deltaTime > 0.5):
current_collider = collider
if DialogueState.is_dialogue_open == false:
DialogueState.is_dialogue_open = true
DialogueManager.show_chosen_dialogue_balloon(load(collider.dialogue), collider.game_balloon, "start", [collider])
env.quiet_down_music()
prompt.hide()
elif bob.grabbed_item and bob.grabbed_item is Battery:
prompt.text = bob.grabbed_item.battery_label
else:
prompt.text = ""
func _on_dialogue_ended(_resource: DialogueResource) -> void:
prompt.show()
if current_collider and current_collider is NPC_interactable:
current_collider.dialogue_ended()
env.reset_music_volume()
func grab(collider) -> void:
collider.grab(bob)
grabbed.emit()
+1
View File
@@ -0,0 +1 @@
uid://b03ucj5svnuh8
+26
View File
@@ -0,0 +1,26 @@
[gd_scene load_steps=3 format=3 uid="uid://dy1tmm44vfmh"]
[ext_resource type="Script" uid="uid://b03ucj5svnuh8" path="res://Interact/interact_ray.gd" id="1_jmrxg"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_jmrxg"]
[node name="ShapeCast3D" type="ShapeCast3D"]
transform = Transform3D(1.17, 0, 0, 0, -5.1142322e-08, -1.17, 0, 1.17, -5.1142322e-08, 0, 0, 0)
shape = SubResource("CylinderShape3D_jmrxg")
collision_mask = 13
script = ExtResource("1_jmrxg")
[node name="Prompt" type="Label" parent="."]
offset_left = 4.0
offset_top = 999.0
offset_right = 250.0
offset_bottom = 1052.0
size_flags_horizontal = 3
theme_override_constants/outline_size = 4
theme_override_font_sizes/font_size = 32
text = "Prompt"
horizontal_alignment = 1
[node name="InteractRay" type="RayCast3D" parent="."]
target_position = Vector3(0, 0, -4)
collision_mask = 13
+5
View File
@@ -0,0 +1,5 @@
extends CollisionObject3D
class_name Interactable
@export var prompt_message = "Interact"
+1
View File
@@ -0,0 +1 @@
uid://dbofb08cmdfec
+8
View File
@@ -0,0 +1,8 @@
extends Node3D
class_name Interactable_Object
@export var prompt_message = "Interact"
@export var dialogue = ""
@export var talkable = false
@export var game_balloon = "/game_balloons/game_balloon_v_2.tscn"
+1
View File
@@ -0,0 +1 @@
uid://chgm8q8icmkn3
+33
View File
@@ -0,0 +1,33 @@
# GAIM: spielerisches EU AI Act Training
Dieses Spiel ist verfügbar unter Lizenz GNU GPLv3
Zum Installieren: Repository klonen, in Godot öffnen und abspielen
Zum Entwickeln wurde Godot v4.5.1 verwendet
Bitte schreiben Sie ihr eigenes Impressum und Datenschutzerklärung, diese sind aktuell leer.
## für das Sprachmodell
Für eine online-Variante die URL (API_URL) in der addons/godot_llama/demo/demo_wasm.gd-Datei entsprechend setzen.
Bei einer lokalen offline-Version muss das Skript addons/godot_llama/demo/demo.gd in der Chatbot Instanz im Player gesetzt werden (anstelle des demo_wasm.gd-Skripts) und ein heruntergeladenes Sprachmodell (z.B. von Huggingface) einen Ordner namens 'models' (auf gleicher Ebene wie das Spiel) gepackt werden.
Als Kontext werden dem Modell die einzelnen Kapitel des EU AI Acts als markdown-Dateien mitgegeben. Soll das Spiel exportiert werden, müssen diese in den Exporteinstellungen als Ressources ergänzt werden.
*english version:*
# GAIM: A Fun EU AI Act Training Game
This game is available under the GNU GPLv3 license
To install: Clone the repository, open it in Godot, and press play.
Godot v4.5.1 was used for development.
Please write your own legal notice and privacy policy; these are currently empty.
## For the language model
For an online version, set the URL (API_URL) accordingly in the addons/godot_llama/demo/demo_wasm.gd file.
For a local offline version, the script addons/godot_llama/demo/demo.gd must be placed in the chatbot instance in the Player (instead of the demo_wasm.gd script), and a downloaded language model (e.g., from Huggingface) must be placed in a folder named models (at the same level as the game).
For exporting the game, *.md-files need to be added as resources in the export-settings, as the chepters of the EU AI Act are given to the model in this format.
File diff suppressed because one or more lines are too long
+18
View File
@@ -0,0 +1,18 @@
[gd_scene load_steps=3 format=3 uid="uid://bpjqsditshpyd"]
[ext_resource type="ArrayMesh" uid="uid://dka5ewv6regyf" path="res://Resources/meshes/arrow.tres" id="1_vl03t"]
[sub_resource type="BoxShape3D" id="BoxShape3D_vl03t"]
size = Vector3(1.8034668, 0.13964844, 1.7332764)
[node name="Arrow" type="StaticBody3D"]
collision_layer = 4
collision_mask = 15
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(0.44, 0, 0, 0, 0.057506055, 0, 0, 0, 0.44, 0, 0, 0)
mesh = ExtResource("1_vl03t")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.42590332, 0.0043945313, 0.36663818)
shape = SubResource("BoxShape3D_vl03t")
+76
View File
@@ -0,0 +1,76 @@
extends StaticBody3D
class_name Balloon
@export var pop_up_text = ""
@export var wait_time = 4.0
@export var image_path = "res://assets/Images/spiel_ballon_text2.png"
@onready var label_3d: Label3D = $Label3D
@onready var balloon_model: MeshInstance3D = $Balloon_model
@onready var collision_shape_3d: CollisionShape3D = $CollisionShape3D
@onready var area_3d: Area3D = $Area3D
signal balloon_popped
func _ready() -> void:
for child in get_children():
if child is RigidBody3D:
child.freeze = true
child.gravity_scale = 0.0
$label.texture = load(image_path)
func _on_area_3d_body_entered(body: Node3D) -> void:
if not body.is_in_group("throwable"):
return
$AudioStreamPlayer.play()
balloon_popped.emit()
# hide balloon, animation, make label visible
balloon_model.visible = false
$AnimationPlayer.play("pop")
collision_shape_3d.call_deferred("queue_free")
area_3d.call_deferred("queue_free")
label_3d.text = pop_up_text
label_3d.visible = true
# --- let objects hanging from balloons fall ---
for child in get_children():
print(child.name)
if child is not RigidBody3D and child is not Area3D:
print(child)
continue # Label und Ballon ignorieren
var global_tf = child.global_transform
remove_child(child)
get_tree().current_scene.add_child(child) # zurück zur Welt
child.global_transform = global_tf
if child is Area3D and child.name.contains('Battery'):
print('battery falling')
print(child.position)
child.position.y = child.position.y - child.new_y_diff
print(child.position)
child.set_picture()
# if RigidBody3D: activate physics again
if child is RigidBody3D:
child.freeze = false
child.gravity_scale = 1.0
# start coroutine for delay + fade out
await fade_and_destroy()
func fade_and_destroy() -> void:
# wait 10 seconds
await get_tree().create_timer(wait_time).timeout
# create tween and play it
var tween = create_tween()
tween.tween_property($label, "modulate:a", 0.0, 0.5) # 2 Sekunden FadeOut
# wait til tween is finished
await tween.finished
# delete node
queue_free()
func _on_animation_player_animation_finished(anim_name: StringName) -> void:
if anim_name == 'pop':
$popped_balloon.visible = false
+1
View File
@@ -0,0 +1 @@
uid://dgai8blbmru22
File diff suppressed because one or more lines are too long
+16
View File
@@ -0,0 +1,16 @@
extends Node3D
@export var balloon_resource: String = "res://Resources/meshes/dog.tres"
signal balloon_chosen
func _ready() -> void:
$Balloon_model.mesh = load(balloon_resource)
func _on_area_3d_body_entered(body: Node3D) -> void:
if not body.is_in_group("throwable") and not body is Player:
return
balloon_chosen.emit(balloon_resource)
func set_mesh(mesh: String):
$Balloon_model.mesh = load(mesh)
@@ -0,0 +1 @@
uid://cffy3itwwknc7
@@ -0,0 +1,31 @@
[gd_scene load_steps=5 format=3 uid="uid://ccdju064l1xg0"]
[ext_resource type="Script" uid="uid://cffy3itwwknc7" path="res://Resources/Objects/balloon_collectable.gd" id="1_3uo3v"]
[ext_resource type="ArrayMesh" uid="uid://jlkdee0elxgj" path="res://Resources/meshes/dog.tres" id="1_lsomq"]
[ext_resource type="ArrayMesh" uid="uid://m3hcjcox5dkf" path="res://Resources/meshes/balloon_string_curved.tres" id="2_3uo3v"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_l0yg6"]
radius = 0.8
[node name="Balloon" type="Node3D"]
script = ExtResource("1_3uo3v")
[node name="Area3D" type="Area3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.32942295, 0)
collision_layer = 33
collision_mask = 33
[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"]
shape = SubResource("CapsuleShape3D_l0yg6")
[node name="Balloon_model" type="MeshInstance3D" parent="."]
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 0.28870273, 0)
mesh = ExtResource("1_lsomq")
skeleton = NodePath("")
[node name="Cylinder_049" type="MeshInstance3D" parent="Balloon_model"]
transform = Transform3D(0.40000004, 0, 0, 0, 0.40000004, 0, 0, 0, 0.40000004, 0, -0.38572907, 0)
mesh = ExtResource("2_3uo3v")
skeleton = NodePath("")
[connection signal="body_entered" from="Area3D" to="." method="_on_area_3d_body_entered"]
+51
View File
@@ -0,0 +1,51 @@
extends Grabbable_Object
class_name Battery
@export var stored_power: int = 50
@export var battery_label: String
var connected_station: Node3D = null
var original_transform: Transform3D
var grabbed_parent
var lamp_color
@onready var battery_lamp_0: CSGSphere3D = $Battery/Battery_lamp_0
@export var image_path: String = "res://assets/Images/EU_AI_Act_logo_main.png"
func _ready() -> void:
lamp_color = battery_lamp_0.material.albedo_color
$Sprite3D.texture = load(image_path)
func insert_into_station(station: Node3D):
if connected_station:
return
connected_station = station
grabbed_parent = get_parent()
original_transform = global_transform
# put battery inot box
grabbed_parent.remove_child(self)
station.add_child(self)
self.visible = false
self.freeze = true
if station.has_method("insert_battery"):
station.insert_battery(self)
func remove_from_station():
if not connected_station:
return null
var station = connected_station
connected_station = null
# get battery back out
if original_parent:
station.remove_child(self)
grabbed_parent.add_child(self)
global_transform = original_transform
self.visible = true
self.freeze = false
return self
+1
View File
@@ -0,0 +1 @@
uid://buxph0fig58vk
File diff suppressed because one or more lines are too long
+18
View File
@@ -0,0 +1,18 @@
extends Area3D
@export var new_y_diff = 0.0
@export var image_path: String = "res://assets/Images/EU_AI_Act_logo_main.png"
signal battery_collected
func set_picture() -> void:
print('setting picture: ', image_path)
$Sprite3D.texture = load(image_path)
$Sprite3D.visible = true
func _on_body_entered(body: Node) -> void:
$AudioStreamPlayer.play()
await get_tree().create_timer(0.1).timeout
Global.batteries += 1
battery_collected.emit()
queue_free()
+1
View File
@@ -0,0 +1 @@
uid://blrm6oxhr4c5l
File diff suppressed because one or more lines are too long
+150
View File
@@ -0,0 +1,150 @@
extends StaticBody3D
class_name BatteryBox2
@onready var ai_threat: Label3D = $AI_threat/AI_threat_label
@onready var box_battery = $Battery
@onready var battery_lamp_0:= $battery_lamp_0
@onready var battery_lamp_1:= $battery_lamp_1
@onready var status_lamps = [
$Status/status_0,
$Status/status_1,
$Status/status_2,
$Status/status_3,
$Status/status_4
]
@export var power_needed: int = 50
@export var max_power: int = 100
@export var display_text: String
var current_power: int = 0
var battery_obj: Battery = null
var blink_timer: Timer
var color_dict = {25: Color(0.0, 1.697, 0.0),
50: Color(1.697, 1.697, 0.0),
75: Color(1.697, 0.85, 0.0),
100: Color(1.697, 0.0, 0.0)}
signal removed_battery
signal fully_charged
func _ready() -> void:
blink_timer = Timer.new()
blink_timer.wait_time = 0.3
blink_timer.one_shot = false
blink_timer.timeout.connect(_on_blink_timeout)
add_child(blink_timer)
ai_threat.text = display_text
for lamp in status_lamps:
lamp.visible = true
if lamp.get_surface_override_material(0) == null:
var material = StandardMaterial3D.new()
lamp.set_surface_override_material(0, material)
lamp.get_surface_override_material(0).albedo_color = Color.DIM_GRAY
var material_b0 = battery_lamp_0.mesh.surface_get_material(0).duplicate()
battery_lamp_0.mesh.surface_set_material(0, material_b0)
var material_b1 = battery_lamp_1.mesh.surface_get_material(0).duplicate()
battery_lamp_1.mesh.surface_set_material(0, material_b1)
func insert_battery(battery: Battery) -> void:
battery_obj = battery
current_power = battery_obj.stored_power
var lamp_color = color_dict[current_power]
battery_lamp_0.mesh.surface_get_material(0).albedo_color = lamp_color
battery_lamp_1.mesh.surface_get_material(0).albedo_color = lamp_color
box_battery.visible = true
update_status_lamps(battery_obj)
func remove_battery() -> Battery:
$Sprite3D.visible = false
var temp_battery = battery_obj
battery_obj = null
if current_power == power_needed:
removed_battery.emit()
current_power = 0
box_battery.visible = false
blink_timer.stop()
for lamp in status_lamps:
if lamp.get_surface_override_material(0) == null:
var material = StandardMaterial3D.new()
lamp.set_surface_override_material(0, material)
lamp.get_surface_override_material(0).albedo_color = Color.DIM_GRAY
lamp.visible = true
battery_lamp_0.mesh.surface_get_material(0).albedo_color = Color.DIM_GRAY
battery_lamp_1.mesh.surface_get_material(0).albedo_color = Color.DIM_GRAY
temp_battery.remove_from_station()
return temp_battery
func update_status_lamps(battery_obj: Battery) -> void:
# ratio between current_power and power_needed
var ratio: float = 0.0
if power_needed != 0:
ratio = float(current_power) / float(power_needed)
ratio = clamp(ratio, 0.0, 1.0)
# count of lamps that should be colored (0..len)
var lamps_to_light: int = ceil(ratio * status_lamps.size())
# special cases: exactly full or overloaded
var is_full := current_power == power_needed
var is_over := current_power > power_needed
if is_full:
play_sounds('insert_correct')
fully_charged.emit()
$Sprite3D.texture = load(battery_obj.image_path)
$Sprite3D.visible = true
# update each lamp
for i in range(lamps_to_light):
var lamp = status_lamps[i]
# secure that material is there
if lamp.get_surface_override_material(0) == null:
var material = StandardMaterial3D.new()
lamp.set_surface_override_material(0, material)
lamp.get_surface_override_material(0).albedo_color = Color.GREEN
if is_over:
play_sounds('insert_false')
# too much -> all red
lamp.get_surface_override_material(0).albedo_color = Color.RED
lamp.visible = true
elif is_full:
# exaclty full -> all green
lamp.get_surface_override_material(0).albedo_color = Color.GREEN
lamp.visible = true
else:
# off / grey
play_sounds('insert_false')
lamp.get_surface_override_material(0).albedo_color = Color.YELLOW
lamp.visible = true
await get_tree().create_timer(0.3).timeout
# blink if overloaded
if is_over:
if not blink_timer.is_stopped():
# timer is running -> nothing
pass
else:
blink_timer.start()
else:
blink_timer.stop()
# make sure that all are visible (if blinking before)
for lamp in status_lamps:
lamp.visible = true
func _on_blink_timeout() -> void:
# in case of too much power: lamps blink (toggle visibility)
if current_power > power_needed:
for lamp in status_lamps:
if lamp.get_surface_override_material(0).albedo_color == Color.DIM_GRAY:
lamp.get_surface_override_material(0).albedo_color = Color.RED
else:
lamp.get_surface_override_material(0).albedo_color = Color.DIM_GRAY
func play_sounds(soundname: String) -> void:
if soundname == 'insert_correct':
$audio_right.play()
elif soundname == 'insert_false':
$audio_false.play()
+1
View File
@@ -0,0 +1 @@
uid://ctgkbxok3s47x
File diff suppressed because one or more lines are too long
+24
View File
@@ -0,0 +1,24 @@
[gd_scene load_steps=5 format=3 uid="uid://dw48drx137ih2"]
[ext_resource type="Script" uid="uid://b8c8vph26uu41" path="res://Interact/grabbable_object.gd" id="1_8qqxd"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qncar"]
albedo_color = Color(0.53, 1, 0.9451667, 1)
[sub_resource type="BoxMesh" id="BoxMesh_qncar"]
material = SubResource("StandardMaterial3D_qncar")
[sub_resource type="BoxShape3D" id="BoxShape3D_im0tn"]
[node name="Block" type="RigidBody3D"]
collision_layer = 4
collision_mask = 7
mass = 0.001
continuous_cd = true
script = ExtResource("1_8qqxd")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("BoxMesh_qncar")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("BoxShape3D_im0tn")
+19
View File
@@ -0,0 +1,19 @@
[gd_scene load_steps=3 format=3 uid="uid://cq0h8h7icvfe0"]
[ext_resource type="ArrayMesh" uid="uid://dxs6dl0kt33hf" path="res://Resources/meshes/bridge.tres" id="1_5r8xi"]
[sub_resource type="BoxShape3D" id="BoxShape3D_h7pgn"]
size = Vector3(22, 0.2, 2.5)
[node name="bridge" type="StaticBody3D"]
transform = Transform3D(0.99701, -0.0772759, 0, 0.0772759, 0.99701, 0, 0, 0, 1, 0, 0, 0)
collision_layer = 2
collision_mask = 13
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(1.2, 0, 0, 0, 1.2, 0, 0, 0, 1.2, 0, 1.194, 0)
mesh = ExtResource("1_5r8xi")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.195, 0)
shape = SubResource("BoxShape3D_h7pgn")
+18
View File
@@ -0,0 +1,18 @@
[gd_scene load_steps=3 format=3 uid="uid://cekwmmeqhnt8c"]
[ext_resource type="ArrayMesh" uid="uid://2k22inm231b5" path="res://Resources/meshes/fence.tres" id="1_cvhob"]
[sub_resource type="BoxShape3D" id="BoxShape3D_mfgll"]
size = Vector3(0.211, 10, 1.981)
[node name="Fence" type="StaticBody3D"]
collision_layer = 64
collision_mask = 9
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(-4.371139e-08, 1, 0, -1, -4.371139e-08, 0, 0, 0, 1, 0, 1.3103899, 0)
mesh = ExtResource("1_cvhob")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0075683594, 5.002912, -0.00012207031)
shape = SubResource("BoxShape3D_mfgll")
+18
View File
@@ -0,0 +1,18 @@
[gd_scene load_steps=3 format=3 uid="uid://cxdft2gl865c8"]
[ext_resource type="ArrayMesh" uid="uid://blqyd0o0ggy2t" path="res://Resources/meshes/fence_broken.tres" id="1_s6vr1"]
[sub_resource type="BoxShape3D" id="BoxShape3D_mfgll"]
size = Vector3(0.211, 0.9, 1.981)
[node name="Fence" type="StaticBody3D"]
collision_layer = 64
collision_mask = 9
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(-4.371139e-08, 1, 0, -1, -4.371139e-08, 0, 0, 0, 1, 0, 1.3234521, -0.02176714)
mesh = ExtResource("1_s6vr1")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0075683594, 0.4515351, -0.00012207031)
shape = SubResource("BoxShape3D_mfgll")
+18
View File
@@ -0,0 +1,18 @@
[gd_scene load_steps=3 format=3 uid="uid://cbiyc2os4l2le"]
[ext_resource type="ArrayMesh" uid="uid://cp8pmyubrkik5" path="res://Resources/meshes/fence_left.tres" id="1_xstg8"]
[sub_resource type="BoxShape3D" id="BoxShape3D_mfgll"]
size = Vector3(0.211, 10, 1.981)
[node name="FenceLeft" type="StaticBody3D"]
collision_layer = 64
collision_mask = 9
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(-4.371139e-08, 1, 0, -1, -4.371139e-08, 0, 0, 0, 1, 0, 1.230836, 0)
mesh = ExtResource("1_xstg8")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0075683594, 4.9100523, -0.00012207031)
shape = SubResource("BoxShape3D_mfgll")
+18
View File
@@ -0,0 +1,18 @@
[gd_scene load_steps=3 format=3 uid="uid://78ini7csghyn"]
[ext_resource type="ArrayMesh" uid="uid://3dws0pbmut6j" path="res://Resources/meshes/fence_right.tres" id="1_2kidb"]
[sub_resource type="BoxShape3D" id="BoxShape3D_mfgll"]
size = Vector3(0.211, 10, 1.981)
[node name="FenceRight" type="StaticBody3D"]
collision_layer = 64
collision_mask = 9
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(-4.371139e-08, 1, 0, -1, -4.371139e-08, 0, 0, 0, 1, 0, 1.3164206, 0)
mesh = ExtResource("1_2kidb")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0075683594, 4.9798994, -0.00012207031)
shape = SubResource("BoxShape3D_mfgll")
+53
View File
@@ -0,0 +1,53 @@
[gd_scene load_steps=5 format=4 uid="uid://sdytd17xrx81"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_xantc"]
resource_name = "black"
cull_mode = 2
albedo_color = Color(0, 0, 0, 1)
roughness = 0.5
[sub_resource type="ArrayMesh" id="ArrayMesh_2uyr3"]
_surfaces = [{
"aabb": AABB(0.609988, -7.67489e-09, -0.801522, 0.703757, 0.00369327, 1.60304),
"format": 34896613377,
"index_count": 18,
"index_data": PackedByteArray("AAABAAIAAAADAAEABAAFAAYABAAHAAUACAAJAAoACAALAAkA"),
"name": "black",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 12,
"vertex_data": PackedByteArray("2iEBAP//AAAATgAAAAAAAABOAAD//wAA2iEBAAAAAAAAAP//v90AAP///v/zywAA///+/7/dAAAAAP//88sAAAAA//9/NAAA///+/7MiAAD///7/fzQAAAAA//+zIgAA")
}]
blend_shape_mode = 0
[sub_resource type="ArrayMesh" id="ArrayMesh_duw40"]
resource_name = "assets_Plane_007"
_surfaces = [{
"aabb": AABB(0.609988, -7.67489e-09, -0.801522, 0.703757, 0.00369327, 1.60304),
"attribute_data": PackedByteArray("AAD/////AAD/////AAAAAAAA/////wAA/////wAAAAAAAP////8AAP////8AAAAA"),
"format": 34896613399,
"index_count": 18,
"index_data": PackedByteArray("AAABAAIAAAADAAEABAAFAAYABAAHAAUACAAJAAoACAALAAkA"),
"material": SubResource("StandardMaterial3D_xantc"),
"name": "black",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 12,
"vertex_data": PackedByteArray("2iEBAP///78ATgAAAAD/vwBOAAD///+/2iEBAAAA/78AAP//v93/v////v/zy/+////+/7/d/78AAP//88v/vwAA//9/NP+////+/7Mi/7////7/fzT/vwAA//+zIv+//v//f/7//3/+//9//v//f////3////9/////f////3////9/////f////3////9/")
}]
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_2uyr3")
[sub_resource type="BoxShape3D" id="BoxShape3D_t0hol"]
size = Vector3(0.3, 0.1, 1.55)
[node name="fence_small" type="StaticBody3D"]
collision_layer = 4
[node name="Schranke" type="MeshInstance3D" parent="."]
mesh = SubResource("ArrayMesh_duw40")
skeleton = NodePath("")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(0.997626, -0.0688685, 0, 0.0688685, 0.997626, 0, 0, 0, 1, 0.81965, 0.0212097, -0.00942993)
shape = SubResource("BoxShape3D_t0hol")
+53
View File
@@ -0,0 +1,53 @@
[gd_scene load_steps=7 format=3 uid="uid://1oady27a34wi"]
[ext_resource type="Script" uid="uid://bivev0gbnbo5t" path="res://npc.gd" id="1_6jshr"]
[ext_resource type="PackedScene" uid="uid://ctx8osel3k43n" path="res://check_collision_wall.tscn" id="2_nwv0p"]
[ext_resource type="PackedScene" uid="uid://bhihpqj7er21q" path="res://check_collision_npc.tscn" id="3_e80nv"]
[ext_resource type="PackedScene" uid="uid://dl4nljdcflehk" path="res://helper.tscn" id="4_nwv0p"]
[sub_resource type="BoxShape3D" id="BoxShape3D_6jshr"]
size = Vector3(0.5161743, 1.3706055, 0.501709)
[sub_resource type="BoxShape3D" id="BoxShape3D_nwv0p"]
size = Vector3(1.2747803, 1.223877, 1.4574585)
[node name="NPC" type="CharacterBody3D"]
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0, 0, 0)
collision_layer = 8
collision_mask = 7
script = ExtResource("1_6jshr")
prompt_message = "drücken Sie [t] oder [Enter]"
talkable = true
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.037261963, -0.04911697, -0.022094727)
shape = SubResource("BoxShape3D_6jshr")
[node name="RayCast3D" parent="." instance=ExtResource("2_nwv0p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.55272627, -0.076056)
[node name="InteractionChecker" type="Area3D" parent="."]
collision_layer = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="InteractionChecker"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0037231457, -0.060058594, 0.22872925)
shape = SubResource("BoxShape3D_nwv0p")
[node name="RayCast3D2" parent="." instance=ExtResource("3_e80nv")]
[node name="helper" parent="." instance=ExtResource("4_nwv0p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.3250453e-09, -0.54445666, -0.060911417)
[node name="Label3D" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.3886542, 0)
billboard = 1
text = "Rede mit mir!
(t / Enter)
|
|
\\/"
font_size = 42
outline_size = 8
[connection signal="body_entered" from="InteractionChecker" to="." method="_on_interaction_checker_body_entered"]
[connection signal="body_exited" from="InteractionChecker" to="." method="_on_interaction_checker_body_exited"]
+17
View File
@@ -0,0 +1,17 @@
[gd_scene load_steps=3 format=3 uid="uid://cbg71qd7mr1a5"]
[ext_resource type="ArrayMesh" uid="uid://cx3mytwy5a0ld" path="res://Resources/meshes/plane.tres" id="1_5clto"]
[sub_resource type="BoxShape3D" id="BoxShape3D_e4xu0"]
size = Vector3(2.2, 0.1, 2.1)
[node name="bridge2" type="StaticBody3D"]
collision_layer = 2
collision_mask = 13
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(0.103683256, 0, 0, 0, 0.71690935, 0, 0, 0, 1.082177, 0, 0, 0)
mesh = ExtResource("1_5clto")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
shape = SubResource("BoxShape3D_e4xu0")
+72
View File
@@ -0,0 +1,72 @@
extends Node3D
@export var required_weight: float = 5.0
@export var active_color: Color = Color(0, 1, 0)
@export var inactive_color: Color = Color(1, 0, 0)
@export var text_on_activation: String
@onready var area: Area3D = $Area3D
@onready var mesh: MeshInstance3D = $MeshInstance3D
@onready var static_body: StaticBody3D = $StaticBody3D
signal activated
signal deactivated
var current_weight: float = 0.0
var is_active: bool = false
func _ready():
mesh.material_override = StandardMaterial3D.new()
mesh.material_override.albedo_color = inactive_color
func _on_body_entered(body: Node3D) -> void:
print("body entered")
print(body)
var w = _get_body_weight(body)
if w > 0:
current_weight += w
_check_weight()
func _on_body_exited(body: Node3D) -> void:
var w = _get_body_weight(body)
if w > 0:
current_weight -= w
_check_weight()
func _get_body_weight(body: Node3D) -> float:
if body.has_method("get_weight"):
return body.get_weight()
elif body is RigidBody3D:
return body.mass
return 0.0
func _check_weight() -> void:
var active_now = current_weight >= required_weight
if active_now != is_active:
is_active = active_now
_update_visuals()
if is_active:
_on_activated()
else:
_on_deactivated()
func _update_visuals():
mesh.material_override.albedo_color = active_color if is_active else inactive_color
var target_pos_y = -0.05 if is_active else 0.0
var tween = get_tree().create_tween()
# Bewege sowohl das sichtbare Mesh als auch den Kollisionskörper nach unten
tween.tween_property(mesh, "position:y", target_pos_y, 0.2)\
.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
tween.tween_property(static_body, "position:y", target_pos_y, 0.2)\
.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT)
func _on_activated():
print("Pressure block activated! Total weight =", current_weight)
activated.emit()
func _on_deactivated():
print("Pressure block deactivated!")
deactivated.emit()
+1
View File
@@ -0,0 +1 @@
uid://debptt7fdw0mw
+38
View File
@@ -0,0 +1,38 @@
[gd_scene load_steps=5 format=3 uid="uid://dvjxy8tyaxcjr"]
[ext_resource type="Script" uid="uid://debptt7fdw0mw" path="res://Resources/Objects/pressure_block.gd" id="1_adrnk"]
[sub_resource type="BoxShape3D" id="BoxShape3D_mjcge"]
size = Vector3(1, 0.5, 1)
[sub_resource type="BoxMesh" id="BoxMesh_adrnk"]
size = Vector3(1, 0.1, 1)
[sub_resource type="BoxShape3D" id="BoxShape3D_adrnk"]
size = Vector3(1, 0.1, 1)
[node name="PressureBlock" type="Node3D"]
script = ExtResource("1_adrnk")
[node name="Area3D" type="Area3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.46808624, 0)
collision_layer = 4
collision_mask = 5
[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.26072478, 0)
shape = SubResource("BoxShape3D_mjcge")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("BoxMesh_adrnk")
[node name="StaticBody3D" type="StaticBody3D" parent="."]
collision_layer = 4
collision_mask = 4
[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D"]
shape = SubResource("BoxShape3D_adrnk")
disabled = true
[connection signal="body_entered" from="Area3D" to="." method="_on_body_entered"]
[connection signal="body_exited" from="Area3D" to="." method="_on_body_exited"]
+82
View File
@@ -0,0 +1,82 @@
extends Node3D
class_name QuizBox
@export var question: String
@export var correct: int
@export var answer_0: String
@export var answer_1: String
@export var answer_2: String
@export var answer_3: String
@onready var animation_player: AnimationPlayer = $AnimationPlayer
@onready var quiz_light: CSGSphere3D = $quiz_box_sb/quiz_box/quiz_light
@onready var answer_pad_0: Area3D = $answers/answer_pad_0/Area3D
@onready var answer_pad_1: Area3D = $answers/answer_pad_1/Area3D
@onready var answer_pad_2: Area3D = $answers/answer_pad_2/Area3D
@onready var answer_pad_3: Area3D = $answers/answer_pad_3/Area3D
@onready var answer_0_label: Label3D = $answers/answer_pad_0/answer_0_label
@onready var answer_1_label: Label3D = $answers/answer_pad_1/answer_1_label
@onready var answer_2_label: Label3D = $answers/answer_pad_2/answer_2_label
@onready var answer_3_label: Label3D = $answers/answer_pad_3/answer_3_label
@onready var question_label: Label3D = $StaticBody3D/Wall/question_label
var answered_correctly := false
func _ready() -> void:
# Texte setzen
question_label.text = question
answer_0_label.text = answer_0
answer_1_label.text = answer_1
answer_2_label.text = answer_2
answer_3_label.text = answer_3
# Signale verbinden
answer_pad_0.body_entered.connect(_on_answer_entered.bind(0))
answer_pad_1.body_entered.connect(_on_answer_entered.bind(1))
answer_pad_2.body_entered.connect(_on_answer_entered.bind(2))
answer_pad_3.body_entered.connect(_on_answer_entered.bind(3))
# WICHTIG: Material duplizieren, damit es nicht mit anderen Instanzen geteilt wird
if quiz_light.material != null:
# tiefe Kopie (alle Subressourcen mitduplizieren)
quiz_light.material = quiz_light.material.duplicate(true)
else:
quiz_light.material = StandardMaterial3D.new()
# Grundeinstellungen für diese Instanz
quiz_light.material.emission_enabled = true
quiz_light.material.emission_energy = 0.5
quiz_light.material.albedo_color = Color.WHITE
quiz_light.material.emission = Color.WHITE
func _on_answer_entered(body: Node3D, answer_index: int) -> void:
if not body.is_in_group("player"):
return # Nur Player soll triggern
# Wenn schon korrekt beantwortet, nichts tun
if answered_correctly:
return
# Prüfen und nur DIESE Instanzlampe setzen
if answer_index == correct:
_set_light_color(Color.GREEN)
question_label.visible = false
animation_player.play("open_door")
answered_correctly = true
else:
_set_light_color(Color.RED)
# optional: nach kurzer Zeit zurücksetzen, damit neu versucht werden kann
await get_tree().create_timer(1.0).timeout
_set_light_color(Color.WHITE)
func _set_light_color(color: Color) -> void:
# Setze nur das Material dieser Instanz
if quiz_light.material == null:
quiz_light.material = StandardMaterial3D.new()
quiz_light.material.albedo_color = color
quiz_light.material.emission = color
# erhöhe kurz die Emission für Sichtbarkeit bei Farben außer weiß
quiz_light.material.emission_energy = 1.5 if color != Color.WHITE else 0.5
+1
View File
@@ -0,0 +1 @@
uid://caan28e6gl7fk
+217
View File
@@ -0,0 +1,217 @@
[gd_scene load_steps=11 format=3 uid="uid://c45ex56io7rv7"]
[ext_resource type="Script" uid="uid://caan28e6gl7fk" path="res://Resources/Objects/quiz_object.gd" id="1_ybh4a"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ybh4a"]
[sub_resource type="BoxShape3D" id="BoxShape3D_6mevd"]
size = Vector3(1, 2, 1)
[sub_resource type="BoxShape3D" id="BoxShape3D_ybh4a"]
[sub_resource type="Animation" id="Animation_ybh4a"]
length = 0.001
tracks/0/type = "position_3d"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("StaticBody3D/Wall/left_door_sb/left_door")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, -2, 0, 0)
tracks/1/type = "position_3d"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("StaticBody3D/Wall/right_door_sb/right_door")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 2, 0, 0)
tracks/2/type = "position_3d"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("StaticBody3D/Wall/left_door_sb/left_door_cs")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = PackedFloat32Array(0, 1, -2, 0, 0)
tracks/3/type = "position_3d"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("StaticBody3D/Wall/right_door_sb/right_door_cs")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = PackedFloat32Array(0, 1, 2, 0, 0)
[sub_resource type="Animation" id="Animation_5clbn"]
resource_name = "open_door"
length = 2.0
tracks/0/type = "position_3d"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("StaticBody3D/Wall/left_door_sb/left_door")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, -2, 0, 0, 2, 1, -5, 0, 0)
tracks/1/type = "position_3d"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("StaticBody3D/Wall/right_door_sb/right_door")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 2, 0, 0, 2, 1, 5, 0, 0)
tracks/2/type = "position_3d"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("StaticBody3D/Wall/right_door_sb/right_door_cs")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = PackedFloat32Array(0, 1, 2, 0, 0, 2, 1, 5, 0, 0)
tracks/3/type = "position_3d"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("StaticBody3D/Wall/left_door_sb/left_door_cs")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = PackedFloat32Array(0, 1, -2, 0, 0, 2, 1, -5, 0, 0)
[sub_resource type="AnimationLibrary" id="AnimationLibrary_402uq"]
_data = {
&"RESET": SubResource("Animation_ybh4a"),
&"open_door": SubResource("Animation_5clbn")
}
[sub_resource type="BoxShape3D" id="BoxShape3D_402uq"]
size = Vector3(5, 6, 0.5)
[sub_resource type="BoxShape3D" id="BoxShape3D_584uj"]
size = Vector3(4, 6, 0.2)
[sub_resource type="BoxShape3D" id="BoxShape3D_resk5"]
size = Vector3(4, 6, 0.2)
[node name="quiz_object" type="Node3D"]
script = ExtResource("1_ybh4a")
[node name="quiz_box_sb" type="StaticBody3D" parent="."]
[node name="quiz_box" type="CSGBox3D" parent="quiz_box_sb"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, 0)
[node name="quiz_light" type="CSGSphere3D" parent="quiz_box_sb/quiz_box"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9793253, 0)
material = SubResource("StandardMaterial3D_ybh4a")
[node name="CollisionShape3D" type="CollisionShape3D" parent="quiz_box_sb"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0.5, 0)
shape = SubResource("BoxShape3D_6mevd")
[node name="answers" type="Node3D" parent="."]
[node name="answer_pad_0" type="CSGBox3D" parent="answers"]
size = Vector3(1, 0.1, 1)
[node name="answer_0_label" type="Label3D" parent="answers/answer_pad_0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
autowrap_mode = 2
[node name="Area3D" type="Area3D" parent="answers/answer_pad_0"]
[node name="CollisionShape3D" type="CollisionShape3D" parent="answers/answer_pad_0/Area3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.48036242, 0)
shape = SubResource("BoxShape3D_ybh4a")
[node name="answer_pad_1" type="CSGBox3D" parent="answers"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5, 0, 0)
size = Vector3(1, 0.1, 1)
[node name="answer_1_label" type="Label3D" parent="answers/answer_pad_1"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
autowrap_mode = 2
[node name="Area3D" type="Area3D" parent="answers/answer_pad_1"]
[node name="CollisionShape3D" type="CollisionShape3D" parent="answers/answer_pad_1/Area3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.48036242, 0)
shape = SubResource("BoxShape3D_ybh4a")
[node name="answer_pad_2" type="CSGBox3D" parent="answers"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, 0)
size = Vector3(1, 0.1, 1)
[node name="answer_2_label" type="Label3D" parent="answers/answer_pad_2"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
autowrap_mode = 2
[node name="Area3D" type="Area3D" parent="answers/answer_pad_2"]
[node name="CollisionShape3D" type="CollisionShape3D" parent="answers/answer_pad_2/Area3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.48036242, 0)
shape = SubResource("BoxShape3D_ybh4a")
[node name="answer_pad_3" type="CSGBox3D" parent="answers"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 0, 0)
size = Vector3(1, 0.1, 1)
[node name="answer_3_label" type="Label3D" parent="answers/answer_pad_3"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
autowrap_mode = 2
[node name="Area3D" type="Area3D" parent="answers/answer_pad_3"]
[node name="CollisionShape3D" type="CollisionShape3D" parent="answers/answer_pad_3/Area3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.48036242, 0)
shape = SubResource("BoxShape3D_ybh4a")
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
&"": SubResource("AnimationLibrary_402uq")
}
[node name="StaticBody3D" type="StaticBody3D" parent="."]
collision_layer = 7
collision_mask = 7
[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 3, -4)
shape = SubResource("BoxShape3D_402uq")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.5, 3, -4)
shape = SubResource("BoxShape3D_402uq")
[node name="Wall" type="CSGBox3D" parent="StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.25, 3, -4)
size = Vector3(16, 6, 0.5)
[node name="door_space" type="CSGSphere3D" parent="StaticBody3D/Wall"]
operation = 2
radius = 3.1
rings = 10
[node name="question_label" type="Label3D" parent="StaticBody3D/Wall"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.18187094)
font_size = 64
autowrap_mode = 2
width = 1000.0
[node name="left_door_sb" type="StaticBody3D" parent="StaticBody3D/Wall"]
collision_layer = 7
collision_mask = 7
[node name="left_door" type="CSGBox3D" parent="StaticBody3D/Wall/left_door_sb"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, 0)
size = Vector3(4, 6, 0.2)
[node name="left_door_cs" type="CollisionShape3D" parent="StaticBody3D/Wall/left_door_sb"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, 0)
shape = SubResource("BoxShape3D_584uj")
[node name="right_door_sb" type="StaticBody3D" parent="StaticBody3D/Wall"]
collision_layer = 7
collision_mask = 7
[node name="right_door" type="CSGBox3D" parent="StaticBody3D/Wall/right_door_sb"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0)
size = Vector3(4, 6, 0.2)
[node name="right_door_cs" type="CollisionShape3D" parent="StaticBody3D/Wall/right_door_sb"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0)
shape = SubResource("BoxShape3D_resk5")
+9
View File
@@ -0,0 +1,9 @@
extends RigidBody3D
func _ready():
await get_tree().create_timer(10.0).timeout
queue_free()
func _on_body_entered(body: Node) -> void:
gravity_scale = 1.0
+1
View File
@@ -0,0 +1 @@
uid://dwc5ak0wgd6aj
File diff suppressed because one or more lines are too long
@@ -0,0 +1,9 @@
extends Node3D
func _ready() -> void:
$Armature/Skeleton3D/Cube_001.mesh = load(Global.mesh_resource_player)
if Global.balloon_collected == true:
$Balloon.visible = true
$Balloon.set_mesh(Global.resource_balloon)
@@ -0,0 +1 @@
uid://dre5qo5tbisfv
@@ -0,0 +1,30 @@
[gd_scene load_steps=6 format=3 uid="uid://drtpl8y1pojrc"]
[ext_resource type="PackedScene" uid="uid://dra235mdhf5nv" path="res://assets/astronaut_gw-v2_rig.glb" id="1_qv5ss"]
[ext_resource type="Script" uid="uid://dre5qo5tbisfv" path="res://Resources/Players/astronaut_for_animation.gd" id="2_7h4jy"]
[ext_resource type="ArrayMesh" uid="uid://cnkc0coob8mu" path="res://Resources/meshes/player_uniGW2.tres" id="3_pfcjo"]
[ext_resource type="PackedScene" uid="uid://ccdju064l1xg0" path="res://Resources/Objects/balloon_collectable.tscn" id="3_t7xo6"]
[ext_resource type="PackedScene" uid="uid://dl4nljdcflehk" path="res://helper.tscn" id="4_t7xo6"]
[node name="astronaut" instance=ExtResource("1_qv5ss")]
script = ExtResource("2_7h4jy")
[node name="Skeleton3D" parent="Armature" index="0"]
bones/1/rotation = Quaternion(0, 0, -0.024488833, 0.9997001)
bones/3/rotation = Quaternion(7.424678e-08, 3.9001097e-08, -0.4683429, 0.8835468)
bones/5/rotation = Quaternion(2.4243334e-08, 6.898198e-08, 0.4388793, 0.89854604)
bones/7/rotation = Quaternion(-0.7071068, -2.6692543e-08, 2.6692543e-08, 0.7071068)
bones/10/rotation = Quaternion(-0.7071068, -1.5454312e-08, 1.5454312e-08, 0.7071068)
[node name="Cube_001" parent="Armature/Skeleton3D" index="0"]
mesh = ExtResource("3_pfcjo")
[node name="Balloon" parent="." index="2" instance=ExtResource("3_t7xo6")]
transform = Transform3D(0.49786475, -0.04615923, 0, 0.04615923, 0.49786475, 0, 0, 0, 0.5, -0.2128411, 1.5290457, -0.5337905)
visible = false
[node name="helper" type="Node3D" parent="." index="3"]
transform = Transform3D(0.4, 0, 0, 0, 0.4, 0, 0, 0, 0.4, 0.096, 1.141, 0.538)
visible = false
[node name="helper" parent="helper" index="0" instance=ExtResource("4_t7xo6")]
+283
View File
@@ -0,0 +1,283 @@
extends CharacterBody3D
class_name Player
var speed = 5.0
const JUMP_VELOCITY = 12
const throw_strength = 50
var speeds = [5.0, 2.5, 1.5, 1.0]
var animation_player_speeds = [1.5, 1.0, 0.7, 0.5]
var counter_speed := 0
enum PlayerMode {
NORMAL,
AIM
}
var mode = PlayerMode.NORMAL
var xform : Transform3D
var grabbed_item : Grabbable_Object
var dialogueActive : bool
var weight: float = 5.0
# --- Camera ---
var camera_pitch := 0.0
var zoom := 5.0
@export var min_zoom := 1
@export var max_zoom := 10.0
@export var zoom_speed := 0.5
@export var min_pitch := deg_to_rad(-80)
@export var max_pitch := deg_to_rad(0)
@export var mouse_sensitivity:float = 0.0007
@onready var camera_3d: Camera3D = $Camera_Controller/Camera_Pivot/Camera3D
@onready var crosshair: Control = $Crosshair
@onready var spring_arm: SpringArm3D = $Camera_Controller/Camera_Pivot
@onready var interact_ray: ShapeCast3D = $InteractRay
@onready var chatbot = $Chatbot
@onready var env = $".."
var rock_scene: PackedScene = preload("res://Resources/Objects/rock.tscn")
signal inventory_opened
signal inventory_closed
signal chatbot_opened
func _ready() -> void:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
$Camera_Controller.position = position
$Armature/Skeleton3D/CharacterMesh.mesh = load(Global.mesh_resource_player)
camera_pitch = $Camera_Controller/Camera_Pivot.rotation.x
zoom = spring_arm.spring_length
if DialogueState.currentTask > 1:
$AnimationPlayer.play('helper_visible')
if Global.balloon_collected == true:
print(Global.resource_balloon)
_on_balloon_balloon_chosen(Global.resource_balloon)
func _process(delta: float) -> void:
if Global.chatbot_opened:
return
if Input.is_action_just_pressed("help"):
if DialogueState.is_dialogue_open == false:
DialogueState.is_dialogue_open = true
DialogueManager.show_chosen_dialogue_balloon(load("res://Interact/dialogue/helper.dialogue"), "/game_balloons/game_balloon_v_1.tscn", "start", [self, $Player/helper])
func _input(event):
if event is InputEventMouseMotion and mode == PlayerMode.NORMAL:
$Camera_Controller.rotate_y(-event.relative.x * mouse_sensitivity)
camera_pitch -= event.relative.y * mouse_sensitivity
camera_pitch = clamp(camera_pitch, min_pitch, max_pitch)
$Camera_Controller/Camera_Pivot.rotation.x = camera_pitch
if event is InputEventMouseButton and event.pressed:
if event.button_index == MOUSE_BUTTON_WHEEL_UP:
zoom -= zoom_speed
elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
zoom += zoom_speed
zoom = clamp(zoom, min_zoom, max_zoom)
spring_arm.spring_length = zoom
print(spring_arm.spring_length)
func _physics_process(delta: float) -> void:
if Global.chatbot_opened or $Inventory.visible:
return
dialogueActive = DialogueState.is_dialogue_open
var thisTime = Time.get_unix_time_from_system()
# --- DROP / THROW ---
if Input.is_action_just_pressed("drop") and grabbed_item:
grabbed_item.release(self)
$AnimationPlayer.play_backwards("pickup")
play_sound('drop')
if Input.is_action_just_pressed("throw") and grabbed_item:
grabbed_item.release(self, true)
play_sound('drop')
elif Input.is_action_just_pressed("throw") and not grabbed_item:
if mode == PlayerMode.NORMAL:
mode = PlayerMode.AIM
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
else:
mode = PlayerMode.NORMAL
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
# --- AIM THROW ---
elif Input.is_action_just_pressed("click") and mode == PlayerMode.AIM and not dialogueActive and not $Inventory.visible:
var mouse_pos = get_viewport().get_mouse_position()
var ray_origin = camera_3d.project_ray_origin(mouse_pos)
var ray_direction = camera_3d.project_ray_normal(mouse_pos)
var ray_length = 1000
var space_state = get_world_3d().direct_space_state
var query = PhysicsRayQueryParameters3D.create(
ray_origin,
ray_origin + ray_direction * ray_length
)
query.exclude = [self]
#Exclude Boundary Layer (Layer 7)
query.collision_mask = ~(1 << 6)
var result = space_state.intersect_ray(query)
var target_position: Vector3
if result.size() > 0:
target_position = result.position
else:
target_position = ray_origin + ray_direction * ray_length
var from = global_transform.origin + Vector3(0, 1.5, 0)
var throw_direction = (target_position - from).normalized()
var rock_instance = rock_scene.instantiate()
get_tree().current_scene.add_child(rock_instance)
var forward_dir = -camera_3d.global_transform.basis.z.normalized()
rock_instance.global_transform.origin = from + forward_dir * 1.0
rock_instance.freeze = false
rock_instance.sleeping = false
rock_instance.gravity_scale = 0.0
rock_instance.linear_velocity = throw_direction * throw_strength
$AnimationPlayer.play("jump")
$audio_throw.play()
# --- GRAVITY ---
if not is_on_floor():
velocity += get_gravity() * delta
# --- JUMP ---
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
var deltaTime = thisTime - DialogueState.time_since_dialoge_open
if not dialogueActive and (deltaTime > 0.5):
$audio_jump.play()
velocity.y = JUMP_VELOCITY
$AnimationPlayer.stop()
$AnimationPlayer.play("jump")
await get_tree().create_timer(0.4).timeout
$AnimationPlayer.play_backwards("jump")
# --- MOVEMENT ---
var input_dir := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
if dialogueActive or $Inventory.visible:
input_dir = Vector2.ZERO
var direction : Vector3 = ($Camera_Controller.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
if input_dir != Vector2.ZERO:
self.rotation_degrees.y = $Camera_Controller.rotation_degrees.y - rad_to_deg(input_dir.angle()) - 90
# --- FLOOR ALIGN ---
if is_on_floor() and input_dir != Vector2.ZERO:
align_with_floor($RayCast3D.get_collision_normal())
global_transform = global_transform.interpolate_with(xform, 0.3)
elif not is_on_floor():
align_with_floor(Vector3.UP)
global_transform = global_transform.interpolate_with(xform, 0.3)
# --- VELOCITY ---
if direction:
velocity.x = direction.x * speed
velocity.z = direction.z * speed
if grabbed_item:
$AnimationPlayer.play("pickup_walk")
else:
$AnimationPlayer.play("walk")
else:
velocity.x = move_toward(velocity.x, 0, speed)
velocity.z = move_toward(velocity.z, 0, speed)
move_and_slide()
$Camera_Controller.position = lerp($Camera_Controller.position, position, 0.15)
func align_with_floor(floor_normal):
xform = global_transform
xform.basis.y = floor_normal
xform.basis.x = -xform.basis.z.cross(floor_normal)
xform.basis = xform.basis.orthonormalized()
func _on_fall_zone_body_entered(body: Node3D) -> void:
get_tree().reload_current_scene()
func openChatBot():
chatbot_opened.emit()
chatbot.visible = true
Global.chatbot_opened = true
chatbot._prompt_edit.grab_focus()
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
env.quiet_down_music()
func get_weight():
return weight
func _on_interact_ray_grabbed() -> void:
$AnimationPlayer.play("pickup")
func set_mode(mode_new: String) -> void:
if mode_new == "aim":
mode = PlayerMode.AIM
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
elif mode_new == "normal":
mode = PlayerMode.NORMAL
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
func toggle_inventory() -> void:
if $Inventory.visible:
$Inventory.visible = false
set_mode("normal")
inventory_closed.emit()
else:
$Inventory.visible = true
set_mode("aim")
inventory_opened.emit()
func _on_balloon_balloon_chosen(mesh: String) -> void:
$Balloon.visible = true
$Balloon.set_mesh(mesh)
Global.resource_balloon = mesh
Global.balloon_collected = true
func slow_down() -> void:
if counter_speed < len(speeds)-1:
counter_speed += 1
speed = speeds[counter_speed]
func reset_speed() -> void:
counter_speed = 0
speed = 5.0
func _on_animation_player_animation_started(anim_name: StringName) -> void:
if anim_name == 'walk' or anim_name == 'pickup_walk':
$AnimationPlayer.speed_scale = animation_player_speeds[counter_speed]
else:
$AnimationPlayer.speed_scale = animation_player_speeds[1]
func play_sound(sound_name: String) -> void:
if sound_name == 'pickup':
$audio_pickup.play()
elif sound_name == 'drop':
$audio_pickup.play()
func toggle_music() -> void:
env.toggle_music()
+1
View File
@@ -0,0 +1 @@
uid://wxn7lwnmu4ft
+757
View File
@@ -0,0 +1,757 @@
[gd_scene load_steps=27 format=3 uid="uid://feh8xoh78swi"]
[ext_resource type="Script" uid="uid://wxn7lwnmu4ft" path="res://Resources/Players/player.gd" id="1_dq61c"]
[ext_resource type="ArrayMesh" uid="uid://cnkc0coob8mu" path="res://Resources/meshes/player_uniGW2.tres" id="3_gyuqh"]
[ext_resource type="PackedScene" uid="uid://dy1tmm44vfmh" path="res://Interact/interact_ray.tscn" id="3_wknd5"]
[ext_resource type="Script" uid="uid://bethfppdcwvxc" path="res://crosshair.gd" id="4_gyuqh"]
[ext_resource type="PackedScene" uid="uid://dw8bb4m4ycg7a" path="res://inventory.tscn" id="5_wknd5"]
[ext_resource type="PackedScene" uid="uid://ccdju064l1xg0" path="res://Resources/Objects/balloon_collectable.tscn" id="6_rjb0o"]
[ext_resource type="PackedScene" uid="uid://dl4nljdcflehk" path="res://helper.tscn" id="7_4r34j"]
[ext_resource type="PackedScene" uid="uid://b0nf2m2olu4jf" path="res://addons/godot_llama/demo/demo.tscn" id="8_erypk"]
[ext_resource type="AudioStream" uid="uid://dwqsonsq5vyu0" path="res://assets/Sounds/collection1/Explosions/Short/sfx_exp_short_soft11.wav" id="9_qpqd5"]
[ext_resource type="AudioStream" uid="uid://c3bxwp8pfb3cn" path="res://assets/Sounds/collection1/General Sounds/Neutral Sounds/sfx_sound_neutral1.wav" id="10_41dcx"]
[ext_resource type="AudioStream" uid="uid://8pfv1mgu10pt" path="res://assets/Sounds/collection1/Movement/Jumping and Landing/sfx_movement_jump1.wav" id="11_a75tr"]
[sub_resource type="BoxShape3D" id="BoxShape3D_uk0nh"]
size = Vector3(1.25093, 1.8731, 1.20929)
[sub_resource type="Skin" id="Skin_gyuqh"]
resource_name = "Skin"
bind_count = 13
bind/0/name = &"body"
bind/0/bone = -1
bind/0/pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.3528, 0)
bind/1/name = &"head"
bind/1/bone = -1
bind/1/pose = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.958969, 0)
bind/2/name = &"shoulder.l"
bind/2/bone = -1
bind/2/pose = Transform3D(-0.185148, -0.98271, -1.14389e-07, 0.98271, -0.185149, -2.66453e-14, -2.1179e-08, -1.12412e-07, 1, 0.942389, 0.177552, 1.07799e-07)
bind/3/name = &"arm.l"
bind/3/bone = -1
bind/3/pose = Transform3D(-0.873768, -0.486343, -2.02672e-07, 0.486343, -0.873768, 0, -1.77089e-07, -9.85682e-08, 1, 0.690726, 0.651202, 1.39991e-07)
bind/4/name = &"shoulder.r"
bind/4/bone = -1
bind/4/pose = Transform3D(-0.176299, 0.984337, 1.3201e-07, -0.984337, -0.176299, -1.59872e-14, 2.32732e-08, -1.29942e-07, 1, -0.943948, 0.169065, 1.2461e-07)
bind/5/name = &"arm.r"
bind/5/bone = -1
bind/5/pose = Transform3D(-0.870257, 0.492598, -2.15315e-08, -0.492598, -0.870257, -4.44089e-15, -1.87379e-08, 1.06064e-08, 1, -0.690192, 0.653943, -1.48609e-08)
bind/6/name = &"hip.l"
bind/6/bone = -1
bind/6/pose = Transform3D(0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -0.3528)
bind/7/name = &"upper_leg.l"
bind/7/bone = -1
bind/7/pose = Transform3D(7.54979e-08, 0, 1, 0, -1, 0, 1, 0, -7.54979e-08, -1.22397e-08, 0.3528, -0.16212)
bind/8/name = &"lower_leg.l"
bind/8/bone = -1
bind/8/pose = Transform3D(7.54979e-08, 0, 1, 0, -1, 0, 1, 0, -7.54979e-08, -1.22397e-08, 0.248877, -0.16212)
bind/9/name = &"hip.r"
bind/9/bone = -1
bind/9/pose = Transform3D(0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, -0.3528)
bind/10/name = &"upper_leg.r"
bind/10/bone = -1
bind/10/pose = Transform3D(-4.37114e-08, 0, -1, 0, -1, 0, -1, 0, 4.37114e-08, -6.35966e-09, 0.3528, -0.145492)
bind/11/name = &"lower_leg.r"
bind/11/bone = -1
bind/11/pose = Transform3D(-4.37114e-08, 0, -1, 0, -1, 0, -1, 0, 4.37114e-08, -6.35966e-09, 0.24472, -0.145492)
bind/12/name = &"neutral_bone"
bind/12/bone = -1
bind/12/pose = Transform3D(1, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0)
[sub_resource type="Animation" id="Animation_3fe0i"]
resource_name = "RESET"
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("helper:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("helper:position")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.096, 1.141, 0.538)]
}
[sub_resource type="Animation" id="Animation_erypk"]
resource_name = "collect_helper_part2"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("helper:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0.0960083, 1.1406784, 0.538002), Vector3(0.0960083, -0.08320968, 0.538002)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("helper:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, true]
}
[sub_resource type="Animation" id="Animation_4r34j"]
resource_name = "helper_visible"
length = 0.01
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("helper:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.0960083, -0.08320968, 0.538002)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("helper:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [true]
}
[sub_resource type="Animation" id="Animation_kitjm"]
resource_name = "idle-loop"
length = 1.0833334
loop_mode = 1
tracks/0/type = "rotation_3d"
tracks/0/imported = true
tracks/0/enabled = true
tracks/0/path = NodePath("Armature/Skeleton3D:head")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, 0, 0, -0.024488833, 0.9997001, 0.06666667, 1, 0, 0, -0.023532195, 0.9997231, 0.1, 1, 0, 0, -0.022525162, 0.9997464, 0.13333334, 1, 0, 0, -0.021227574, 0.9997747, 0.16666667, 1, 0, 0, -0.0196859, 0.9998062, 0.2, 1, 0, 0, -0.017911708, 0.9998396, 0.3, 1, 0, 0, -0.0121470615, 0.99992627, 0.33333334, 1, 0, 0, -0.010233168, 0.9999477, 0.36666667, 1, 0, 0, -0.008458738, 0.99996424, 0.4, 1, 0, 0, -0.0068586585, 0.9999765, 0.43333334, 1, 0, 0, -0.0054794243, 0.99998504, 0.46666667, 1, 0, 0, -0.0043675266, 0.99999046, 0.53333336, 1, 0, 0, -0.0032827677, 0.99999464, 0.6333333, 1, 0, 0, -0.0048711714, 0.9999882, 0.6666667, 1, 0, 0, -0.006087676, 0.99998146, 0.7, 1, 0, 0, -0.0076296404, 0.999971, 0.73333335, 1, 0, 0, -0.009345958, 0.99995637, 0.76666665, 1, 0, 0, -0.011190119, 0.9999375, 0.8333333, 1, 0, 0, -0.015075953, 0.99988645, 0.8666667, 1, 0, 0, -0.016989721, 0.99985576, 0.9, 1, 0, 0, -0.018798813, 0.99982333, 0.93333334, 1, 0, 0, -0.020456744, 0.9997908, 0.96666664, 1, 0, 0, -0.021917041, 0.9997598, 1, 1, 0, 0, -0.023133267, 0.9997325, 1.0666667, 1, 0, 0, -0.024345534, 0.9997037, 1.0833334, 1, 0, 0, -0.024488833, 0.9997001)
tracks/1/type = "rotation_3d"
tracks/1/imported = true
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D:arm.l")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 7.424678e-08, 3.9001094e-08, -0.4683429, 0.8835468, 0.033333335, 1, 7.4302335e-08, 3.8917683e-08, -0.46721676, 0.88414294, 0.06666667, 1, 7.4431775e-08, 3.872237e-08, -0.46458033, 0.885531, 0.1, 1, 7.462511e-08, 3.84281e-08, -0.4606092, 0.887603, 0.13333334, 1, 7.4872105e-08, 3.8047695e-08, -0.45547733, 0.8902474, 0.16666667, 1, 7.51624e-08, 3.7593928e-08, -0.44935825, 0.8933517, 0.2, 1, 7.549224e-08, 3.706932e-08, -0.44228724, 0.8968735, 0.23333333, 1, 7.583646e-08, 3.651112e-08, -0.43476743, 0.90054274, 0.3, 1, 7.6531585e-08, 3.5348503e-08, -0.41911793, 0.90793186, 0.33333334, 1, 7.686551e-08, 3.4772025e-08, -0.4113643, 0.9114711, 0.36666667, 1, 7.717001e-08, 3.4235477e-08, -0.40415135, 0.91469216, 0.4, 1, 7.744037e-08, 3.3749966e-08, -0.39762765, 0.91754687, 0.43333334, 1, 7.767019e-08, 3.333025e-08, -0.39199018, 0.91996944, 0.46666667, 1, 7.785327e-08, 3.2991093e-08, -0.38743636, 0.9218965, 0.5, 1, 7.798345e-08, 3.2747245e-08, -0.3841631, 0.9232653, 0.53333336, 1, 6.41315e-08, 3.9174488e-08, -0.3829864, 0.9237541, 0.56666666, 1, 6.0626874e-08, 4.085854e-08, -0.38372338, 0.92344815, 0.6, 1, 6.052203e-08, 4.1052278e-08, -0.38631013, 0.922369, 0.6333333, 1, 6.034729e-08, 4.1372523e-08, -0.39058882, 0.9205653, 0.6666667, 1, 6.011109e-08, 4.1800266e-08, -0.39630932, 0.9181171, 0.7, 1, 5.9811555e-08, 4.2334484e-08, -0.40346235, 0.91499627, 0.73333335, 1, 5.9477394e-08, 4.2919936e-08, -0.41131318, 0.91149414, 0.76666665, 1, 5.911788e-08, 4.3537902e-08, -0.41961336, 0.9077029, 0.8333333, 1, 5.836256e-08, 4.4798206e-08, -0.43658403, 0.8996635, 0.8666667, 1, 5.7999003e-08, 4.5387402e-08, -0.4445384, 0.8957598, 0.9, 1, 5.7664e-08, 4.5920824e-08, -0.45175117, 0.89214396, 0.93333334, 1, 5.7369746e-08, 4.6382066e-08, -0.45799688, 0.8889538, 0.96666664, 1, 5.7128684e-08, 4.6754995e-08, -0.46305287, 0.88633066, 1, 1, 5.6953294e-08, 4.7023583e-08, -0.4666979, 0.8844168, 1.0333333, 1, 7.078811e-08, 4.0605606e-08, -0.46801406, 0.8837211, 1.0833334, 1, 7.424678e-08, 3.9001094e-08, -0.4683429, 0.8835468)
tracks/2/type = "rotation_3d"
tracks/2/imported = true
tracks/2/enabled = true
tracks/2/path = NodePath("Armature/Skeleton3D:arm.r")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = PackedFloat32Array(0, 1, 2.4243331e-08, 6.898198e-08, 0.43887928, 0.89854604, 0.033333335, 1, 2.4169724e-08, 6.9008046e-08, 0.43792248, 0.89901274, 0.06666667, 1, 2.3997506e-08, 6.906872e-08, 0.43568337, 0.9001, 0.1, 1, 2.3738348e-08, 6.915911e-08, 0.43231246, 0.901724, 0.13333334, 1, 2.3403869e-08, 6.927417e-08, 0.42795923, 0.90379816, 0.16666667, 1, 2.300568e-08, 6.940882e-08, 0.4227731, 0.9062357, 0.2, 1, 2.254637e-08, 6.956098e-08, 0.41678596, 0.90900475, 0.23333333, 1, 2.205883e-08, 6.9718844e-08, 0.41042495, 0.9118944, 0.3, 1, 2.1047086e-08, 7.0034545e-08, 0.3972056, 0.9177296, 0.33333334, 1, 2.0547182e-08, 7.018466e-08, 0.39066452, 0.9205331, 0.36666667, 1, 2.0082878e-08, 7.032063e-08, 0.38458377, 0.9230901, 0.4, 1, 1.9663542e-08, 7.0440585e-08, 0.37908745, 0.92536086, 0.43333334, 1, 1.9301613e-08, 7.054196e-08, 0.3743401, 0.9272915, 0.46666667, 1, 1.9009542e-08, 7.062232e-08, 0.3705068, 0.92882985, 0.5, 1, 1.8799755e-08, 7.067924e-08, 0.36775205, 0.9299239, 0.56666666, 1, 2.034004e-08, 7.140312e-08, 0.36774907, 0.929925, 0.6, 1, 2.0572921e-08, 7.134004e-08, 0.37080446, 0.92871106, 0.6333333, 1, 2.0953191e-08, 7.123523e-08, 0.3757913, 0.9267043, 0.6666667, 1, 2.1453479e-08, 7.109394e-08, 0.3823476, 0.92401856, 0.7, 1, 2.2059782e-08, 7.091751e-08, 0.39028642, 0.9206936, 0.73333335, 1, 2.2704533e-08, 7.072357e-08, 0.39872035, 0.91707265, 0.76666665, 1, 2.3360691e-08, 7.051947e-08, 0.40729463, 0.91329694, 0.8, 1, 2.400152e-08, 7.0313504e-08, 0.4156599, 0.90952015, 0.8333333, 1, 2.4600622e-08, 7.011499e-08, 0.42347273, 0.90590894, 0.8666667, 1, 2.509242e-08, 6.994767e-08, 0.42988047, 0.9028859, 0.9, 1, 2.5464708e-08, 6.981838e-08, 0.4347276, 0.900562, 0.93333334, 1, 2.5075877e-08, 6.94488e-08, 0.43768612, 0.8991279, 0.96666664, 1, 2.4243331e-08, 6.898199e-08, 0.4388793, 0.89854604, 1.0833334, 1, 2.4243331e-08, 6.898198e-08, 0.43887928, 0.89854604)
tracks/3/type = "rotation_3d"
tracks/3/imported = true
tracks/3/enabled = true
tracks/3/path = NodePath("Armature/Skeleton3D:hip.l")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = PackedFloat32Array(0, 1, -0.5, -0.5, -0.5, 0.5)
tracks/4/type = "rotation_3d"
tracks/4/imported = true
tracks/4/enabled = true
tracks/4/path = NodePath("Armature/Skeleton3D:upper_leg.l")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = PackedFloat32Array(0, 1, -0.7071068, -2.6692542e-08, 2.6692542e-08, 0.7071068)
tracks/5/type = "rotation_3d"
tracks/5/imported = true
tracks/5/enabled = true
tracks/5/path = NodePath("Armature/Skeleton3D:hip.r")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = PackedFloat32Array(0, 1, -0.5, 0.5, 0.5, 0.5)
tracks/6/type = "rotation_3d"
tracks/6/imported = true
tracks/6/enabled = true
tracks/6/path = NodePath("Armature/Skeleton3D:upper_leg.r")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = PackedFloat32Array(0, 1, -0.7071068, -1.5454312e-08, 1.5454312e-08, 0.7071068)
[sub_resource type="Animation" id="Animation_i5730"]
resource_name = "jump"
length = 0.20833333
tracks/0/type = "rotation_3d"
tracks/0/imported = true
tracks/0/enabled = true
tracks/0/path = NodePath("Armature/Skeleton3D:head")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, 0, 0, 0, 1)
tracks/1/type = "rotation_3d"
tracks/1/imported = true
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D:arm.l")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 0.036538295, -0.050690103, -0.42360502, 0.9036893, 0.033333335, 1, 0.08287326, -0.118203335, -0.41701508, 0.89736193, 0.06666667, 1, 0.19100359, -0.27582675, -0.38983727, 0.8575921, 0.1, 1, 0.3289899, -0.47714087, -0.32671192, 0.7465666, 0.13333334, 1, 0.44907475, -0.65257686, -0.23154037, 0.5646809, 0.16666667, 1, 0.5169525, -0.7519604, -0.14098726, 0.38397694, 0.20833333, 1, 0.53779584, -0.7825644, -0.09865995, 0.2977161)
tracks/2/type = "rotation_3d"
tracks/2/imported = true
tracks/2/enabled = true
tracks/2/path = NodePath("Armature/Skeleton3D:arm.r")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = PackedFloat32Array(0, 1, 2.349101e-08, 6.948292e-08, 0.42525995, 0.90507126, 0.033333335, 1, -0.018352704, -0.016519874, 0.416211, 0.9089327, 0.06666667, 1, -0.056133576, -0.05052778, 0.39663497, 0.9148643, 0.1, 1, -0.10461941, -0.09417161, 0.3696238, 0.91845775, 0.13333334, 1, -0.15477219, -0.13931593, 0.33939558, 0.9173044, 0.16666667, 1, -0.19763152, -0.17789513, 0.31164458, 0.912235, 0.20833333, 1, -0.2195022, -0.19758171, 0.2967719, 0.9081336)
tracks/3/type = "rotation_3d"
tracks/3/imported = true
tracks/3/enabled = true
tracks/3/path = NodePath("Armature/Skeleton3D:hip.l")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = PackedFloat32Array(0, 1, -0.5, -0.5, -0.5, 0.5)
tracks/4/type = "rotation_3d"
tracks/4/imported = true
tracks/4/enabled = true
tracks/4/path = NodePath("Armature/Skeleton3D:upper_leg.l")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = PackedFloat32Array(0, 1, -0.7071068, -2.6692542e-08, 2.6692542e-08, 0.7071068, 0.033333335, 1, -0.70673823, 0.022826672, 0.022826724, 0.7067383, 0.06666667, 1, -0.70362854, 0.07004856, 0.07004862, 0.7036286, 0.1, 1, -0.6949302, 0.13065991, 0.13065997, 0.6949302, 0.13333334, 1, -0.6802412, 0.19305934, 0.1930594, 0.6802412, 0.16666667, 1, -0.66300935, 0.24580197, 0.24580202, 0.66300935, 0.20833333, 1, -0.6525517, 0.27235317, 0.2723532, 0.6525517)
tracks/5/type = "rotation_3d"
tracks/5/imported = true
tracks/5/enabled = true
tracks/5/path = NodePath("Armature/Skeleton3D:hip.r")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = PackedFloat32Array(0, 1, -0.5, 0.5, 0.5, 0.5)
tracks/6/type = "rotation_3d"
tracks/6/imported = true
tracks/6/enabled = true
tracks/6/path = NodePath("Armature/Skeleton3D:upper_leg.r")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = PackedFloat32Array(0, 1, -0.7071068, -1.5454312e-08, 1.5454312e-08, 0.7071068, 0.033333335, 1, -0.706891, 0.01746796, 0.017467992, 0.70689106, 0.06666667, 1, -0.7050892, 0.053378057, 0.05337809, 0.7050892, 0.1, 1, -0.7000768, 0.09946126, 0.09946129, 0.7000767, 0.13333334, 1, -0.6916174, 0.14719175, 0.14719178, 0.69161737, 0.16666667, 1, -0.68162763, 0.18810582, 0.18810587, 0.6816276, 0.20833333, 1, -0.6754944, 0.20906316, 0.2090632, 0.6754943)
[sub_resource type="Animation" id="Animation_4m5ha"]
resource_name = "jump1-loop"
length = 0.5833333
loop_mode = 1
tracks/0/type = "rotation_3d"
tracks/0/imported = true
tracks/0/enabled = true
tracks/0/path = NodePath("Armature/Skeleton3D:head")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, 0, 0, 0, 1)
tracks/1/type = "rotation_3d"
tracks/1/imported = true
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D:arm.l")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 0.16491105, -0.19907025, -0.46216232, 0.8482815, 0.033333335, 1, 0.16292813, -0.1966766, -0.44568896, 0.8579826, 0.06666667, 1, 0.15795462, -0.19067287, -0.40574467, 0.8798099, 0.1, 1, 0.14960615, -0.18059514, -0.34231567, 0.909848, 0.13333334, 1, 0.13738729, -0.16584532, -0.25570658, 0.94246185, 0.16666667, 1, 0.12086617, -0.14590205, -0.14725594, 0.970783, 0.2, 1, 0.10003102, -0.12075119, -0.02095889, 0.9874076, 0.23333333, 1, 0.07746595, -0.09351207, 0.10570058, 0.9869559, 0.26666668, 1, 0.05509115, -0.06650261, 0.22280262, 0.9710312, 0.3, 1, 0.03475427, -0.041953206, 0.32283667, 0.9448855, 0.33333334, 1, 0.01797073, -0.021693187, 0.4011522, 0.9155782, 0.36666667, 1, 0.0073409793, -0.008861614, 0.44884396, 0.89353603, 0.4, 1, 0.001871625, -0.0022593576, 0.47281396, 0.8811574, 0.43333334, 1, -6.8684805e-08, 3.97834e-08, 0.43325853, 0.9012697, 0.46666667, 1, -4.6923528e-08, 4.2163578e-08, 0.2959903, 0.95519096, 0.5, 1, -5.022673e-09, 4.4119368e-08, 0.031682793, 0.99949807, 0.53333336, 1, 3.723895e-08, 4.2906425e-08, -0.23490036, 0.97201943, 0.56666666, 1, 5.9497896e-08, 4.091479e-08, -0.37530804, 0.9269002, 0.5833333, 1, 6.728594e-08, 3.9968324e-08, -0.4244344, 0.9054587)
tracks/2/type = "rotation_3d"
tracks/2/imported = true
tracks/2/enabled = true
tracks/2/path = NodePath("Armature/Skeleton3D:arm.r")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = PackedFloat32Array(0, 1, 0.12278029, 0.103681155, 0.47836125, 0.8633341, 0.033333335, 1, 0.12142256, 0.10253463, 0.4610096, 0.87304837, 0.06666667, 1, 0.117976256, 0.09962444, 0.4187322, 0.89488554, 0.1, 1, 0.11208792, 0.09465207, 0.3511598, 0.9247508, 0.13333334, 1, 0.10329391, 0.08722602, 0.2582469, 0.9565723, 0.16666667, 1, 0.09115662, 0.07697676, 0.14110272, 0.98277926, 0.2, 1, 0.0755583, 0.06380485, 0.0039358935, 0.9950901, 0.23333333, 1, 0.058495414, 0.049396202, -0.13330726, 0.9881131, 0.26666668, 1, 0.041513238, 0.035055704, -0.25931442, 0.9642634, 0.3, 1, 0.02609686, 0.022037433, -0.36583734, 0.9300518, 0.33333334, 1, 0.013439841, 0.011349292, -0.44816688, 0.89377695, 0.36666667, 1, 0.005481215, 0.00462867, -0.49766386, 0.8673403, 0.4, 1, 0.0013952059, 0.0011782625, -0.52240455, 0.8526958, 0.43333334, 1, -2.5545276e-08, 6.776717e-08, -0.4822765, 0.87601906, 0.46666667, 1, -1.4686288e-08, 7.412076e-08, -0.34021562, 0.94034743, 0.5, 1, 6.0131793e-09, 8.1016715e-08, -0.060081095, 0.9981935, 0.53333336, 1, 2.6220649e-08, 8.1283744e-08, 0.22496933, 0.9743659, 0.56666666, 1, 2.6558359e-08, 7.398688e-08, 0.37372044, 0.9275414, 0.5833333, 1, 2.349101e-08, 6.948292e-08, 0.42525995, 0.90507126)
tracks/3/type = "rotation_3d"
tracks/3/imported = true
tracks/3/enabled = true
tracks/3/path = NodePath("Armature/Skeleton3D:hip.l")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = PackedFloat32Array(0, 1, -0.5, -0.5, -0.5, 0.5)
tracks/4/type = "rotation_3d"
tracks/4/imported = true
tracks/4/enabled = true
tracks/4/path = NodePath("Armature/Skeleton3D:upper_leg.l")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = PackedFloat32Array(0, 1, -0.6980985, 0.1125101, 0.112510145, 0.6980985, 0.033333335, 1, -0.6953522, 0.11572834, 0.11419779, 0.7000365, 0.06666667, 1, -0.6890111, 0.123073585, 0.118044704, 0.70440197, 0.1, 1, -0.6795414, 0.133829, 0.123665184, 0.7106477, 0.13333334, 1, -0.66739976, 0.14726606, 0.13066608, 0.71820384, 0.16666667, 1, -0.65306926, 0.16264959, 0.13865215, 0.72651315, 0.23333333, 1, -0.62081605, 0.19557627, 0.15563886, 0.7430437, 0.26666668, 1, -0.60487473, 0.2110678, 0.16357923, 0.75021255, 0.3, 1, -0.59004927, 0.22505257, 0.170718, 0.7563391, 0.33333334, 1, -0.57712626, 0.23692986, 0.1767586, 0.76127917, 0.36666667, 1, -0.5683018, 0.24488069, 0.18079057, 0.76444834, 0.4, 1, -0.56363004, 0.2490393, 0.18289568, 0.76606137, 0.43333334, 1, -0.57315195, 0.23559785, 0.17271246, 0.7656114, 0.46666667, 1, -0.6011017, 0.19609173, 0.14375125, 0.76128864, 0.53333336, 1, -0.68163, 0.057088032, 0.04185022, 0.7282651, 0.56666666, 1, -0.7004931, 0.015788428, 0.01157425, 0.71339065, 0.5833333, 1, -0.7071068, -2.6692542e-08, 2.6692542e-08, 0.7071068)
tracks/5/type = "rotation_3d"
tracks/5/imported = true
tracks/5/enabled = true
tracks/5/path = NodePath("Armature/Skeleton3D:hip.r")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = PackedFloat32Array(0, 1, -0.5, 0.5, 0.5, 0.5)
tracks/6/type = "rotation_3d"
tracks/6/imported = true
tracks/6/enabled = true
tracks/6/path = NodePath("Armature/Skeleton3D:upper_leg.r")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = PackedFloat32Array(0, 1, -0.7023051, -0.08226587, -0.08226583, 0.702305, 0.033333335, 1, -0.7002828, -0.07615434, -0.07683486, 0.705621, 0.06666667, 1, -0.6954091, -0.062060937, -0.06430797, 0.7130351, 0.1, 1, -0.6876369, -0.041140474, -0.045705575, 0.7234459, 0.13333334, 1, -0.6768588, -0.014601349, -0.022094617, 0.73563635, 0.16666667, 1, -0.6630332, 0.01627228, 0.005390068, 0.7483938, 0.23333333, 1, -0.6279835, 0.083747916, 0.0655246, 0.77092785, 0.26666668, 1, -0.6090053, 0.115754455, 0.09408087, 0.77901363, 0.3, 1, -0.5905409, 0.1446456, 0.119875684, 0.78483695, 0.33333334, 1, -0.5739046, 0.1690913, 0.14171518, 0.7886435, 0.36666667, 1, -0.56231534, 0.18534684, 0.15624487, 0.79059196, 0.4, 1, -0.5561034, 0.19382134, 0.16382195, 0.7914195, 0.43333334, 1, -0.5651424, 0.18495072, 0.15646008, 0.78862387, 0.46666667, 1, -0.593492, 0.15372734, 0.13004649, 0.7792454, 0.53333336, 1, -0.67835075, 0.04472942, 0.037839115, 0.7323987, 0.56666666, 1, -0.69949377, 0.012381507, 0.010474229, 0.71445477, 0.5833333, 1, -0.7071068, -1.5454312e-08, 1.5454312e-08, 0.7071068)
[sub_resource type="Animation" id="Animation_qw38m"]
resource_name = "pickup"
length = 0.20833333
tracks/0/type = "rotation_3d"
tracks/0/imported = true
tracks/0/enabled = true
tracks/0/path = NodePath("Armature/Skeleton3D:head")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, 0, 0, 0, 1)
tracks/1/type = "rotation_3d"
tracks/1/imported = true
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D:arm.l")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 6.728594e-08, 3.9968324e-08, -0.4244344, 0.9054587, 0.033333335, 1, 0.044615045, -0.02984432, -0.4370112, 0.897853, 0.06666667, 1, 0.14010738, -0.09372214, -0.4594671, 0.8720528, 0.1, 1, 0.26287308, -0.17584398, -0.47896206, 0.8188846, 0.13333334, 1, 0.38504738, -0.25757024, -0.48653138, 0.74073166, 0.16666667, 1, 0.48032945, -0.3213074, -0.4823678, 0.65830576, 0.20833333, 1, 0.523814, -0.3503956, -0.47677234, 0.612805)
tracks/2/type = "rotation_3d"
tracks/2/imported = true
tracks/2/enabled = true
tracks/2/path = NodePath("Armature/Skeleton3D:arm.r")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = PackedFloat32Array(0, 1, 2.349101e-08, 6.948292e-08, 0.42525995, 0.90507126, 0.033333335, 1, 0.041553196, 0.033103567, 0.43505287, 0.8988362, 0.06666667, 1, 0.13026266, 0.10377432, 0.45171005, 0.8764819, 0.1, 1, 0.24429049, 0.19461507, 0.46422726, 0.82881856, 0.13333334, 1, 0.35806894, 0.28525713, 0.46552187, 0.7574328, 0.16666667, 1, 0.4473714, 0.35640028, 0.45702252, 0.68115205, 0.20833333, 1, 0.48844275, 0.38911995, 0.44961932, 0.6386328)
tracks/3/type = "rotation_3d"
tracks/3/imported = true
tracks/3/enabled = true
tracks/3/path = NodePath("Armature/Skeleton3D:hip.l")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = PackedFloat32Array(0, 1, -0.5, -0.5, -0.5, 0.5)
tracks/4/type = "rotation_3d"
tracks/4/imported = true
tracks/4/enabled = true
tracks/4/path = NodePath("Armature/Skeleton3D:upper_leg.l")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = PackedFloat32Array(0, 1, -0.7071068, -2.6692542e-08, 2.6692542e-08, 0.7071068)
tracks/5/type = "rotation_3d"
tracks/5/imported = true
tracks/5/enabled = true
tracks/5/path = NodePath("Armature/Skeleton3D:hip.r")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = PackedFloat32Array(0, 1, -0.5, 0.5, 0.5, 0.5)
tracks/6/type = "rotation_3d"
tracks/6/imported = true
tracks/6/enabled = true
tracks/6/path = NodePath("Armature/Skeleton3D:upper_leg.r")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = PackedFloat32Array(0, 1, -0.7071068, -1.5454312e-08, 1.5454312e-08, 0.7071068)
[sub_resource type="Animation" id="Animation_5eaja"]
resource_name = "pickup_walk"
length = 1.0833334
tracks/0/type = "rotation_3d"
tracks/0/imported = true
tracks/0/enabled = true
tracks/0/path = NodePath("Armature/Skeleton3D:head")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, 0, 0, 0, 1)
tracks/1/type = "rotation_3d"
tracks/1/imported = true
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D:arm.l")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 0.44240275, -0.53902584, -0.342163, 0.6298059)
tracks/2/type = "rotation_3d"
tracks/2/imported = true
tracks/2/enabled = true
tracks/2/path = NodePath("Armature/Skeleton3D:arm.r")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = PackedFloat32Array(0, 1, 0.43278182, 0.49161798, 0.3524288, 0.6684352)
tracks/3/type = "rotation_3d"
tracks/3/imported = true
tracks/3/enabled = true
tracks/3/path = NodePath("Armature/Skeleton3D:hip.l")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = PackedFloat32Array(0, 1, -0.5, -0.5, -0.5, 0.5)
tracks/4/type = "rotation_3d"
tracks/4/imported = true
tracks/4/enabled = true
tracks/4/path = NodePath("Armature/Skeleton3D:upper_leg.l")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = PackedFloat32Array(0, 1, -0.60595876, 0.3644366, 0.36443666, 0.6059587, 0.06666667, 1, -0.60595876, 0.3644366, 0.36443666, 0.6059587, 0.1, 1, -0.6032101, 0.36896825, 0.36896828, 0.6032101, 0.13333334, 1, -0.59639233, 0.37988952, 0.37988958, 0.59639245, 0.16666667, 1, -0.5855792, 0.39635456, 0.39635462, 0.5855793, 0.2, 1, -0.5795719, 0.40508807, 0.40508813, 0.57957196, 0.23333333, 1, -0.5895815, 0.39037627, 0.39037627, 0.58958155, 0.26666668, 1, -0.6165933, 0.34613982, 0.34613985, 0.6165933, 0.3, 1, -0.6541701, 0.26844278, 0.2684428, 0.6541701, 0.33333334, 1, -0.6892638, 0.15784594, 0.157846, 0.6892639, 0.36666667, 1, -0.7066153, 0.026357096, 0.026357153, 0.70661545, 0.4, 1, -0.7008727, -0.093687855, -0.0936878, 0.7008728, 0.43333334, 1, -0.6816648, -0.18797097, -0.1879709, 0.6816648, 0.46666667, 1, -0.6618372, -0.24894077, -0.24894069, 0.6618373, 0.5, 1, -0.6517511, -0.27426365, -0.27426362, 0.6517511, 0.53333336, 1, -0.6582527, -0.25827003, -0.25826997, 0.65825266, 0.56666666, 1, -0.67109025, -0.22279571, -0.22279567, 0.67109025, 0.6, 1, -0.6857183, -0.17259939, -0.17259935, 0.68571824, 0.6666667, 1, -0.70495313, -0.05514667, -0.055146623, 0.7049531, 0.7, 1, -0.70691395, -0.016512973, -0.016512923, 0.70691395, 0.73333335, 1, -0.7071068, -0.00015736022, -0.00015730923, 0.7071068, 0.76666665, 1, -0.7070719, 0.0070313667, 0.00703141, 0.70707184, 0.8, 1, -0.70687455, 0.018124059, 0.018124092, 0.70687443, 0.8333333, 1, -0.7056039, 0.046078686, 0.046078723, 0.7056038, 0.8666667, 1, -0.7008078, 0.09417304, 0.09417307, 0.70080763, 0.9, 1, -0.6911309, 0.14945938, 0.14945939, 0.6911309, 0.93333334, 1, -0.67634094, 0.206308, 0.20630804, 0.6763409, 0.96666664, 1, -0.6577143, 0.25963807, 0.2596381, 0.65771425, 1, 1, -0.6378587, 0.3051825, 0.30518252, 0.63785857, 1.0333333, 1, -0.6225582, 0.33529305, 0.33529308, 0.62255806, 1.0666667, 1, -0.61391485, 0.35086837, 0.35086843, 0.6139148, 1.0833334, 1, -0.6107917, 0.3562773, 0.35627735, 0.6107917)
tracks/5/type = "rotation_3d"
tracks/5/imported = true
tracks/5/enabled = true
tracks/5/path = NodePath("Armature/Skeleton3D:hip.r")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = PackedFloat32Array(0, 1, -0.5, 0.5, 0.5, 0.5)
tracks/6/type = "rotation_3d"
tracks/6/imported = true
tracks/6/enabled = true
tracks/6/path = NodePath("Armature/Skeleton3D:upper_leg.r")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = PackedFloat32Array(0, 1, -0.66778064, 0.2325275, 0.23252754, 0.66778064, 0.033333335, 1, -0.6728083, 0.21755226, 0.21755232, 0.6728083, 0.06666667, 1, -0.6822603, 0.18579805, 0.18579808, 0.6822603, 0.1, 1, -0.6924698, 0.14312816, 0.14312819, 0.6924698, 0.13333334, 1, -0.70056885, 0.09593359, 0.09593362, 0.7005689, 0.16666667, 1, -0.7052536, 0.051159598, 0.05115963, 0.70525366, 0.2, 1, -0.7067271, 0.023168769, 0.023168799, 0.70672715, 0.23333333, 1, -0.7070106, 0.011661734, 0.011661766, 0.7070106, 0.26666668, 1, -0.70709205, 0.004570252, 0.004570281, 0.70709205, 0.3, 1, -0.70703137, -0.010325267, -0.010325237, 0.7070314, 0.33333334, 1, -0.7056518, -0.045337453, -0.04533742, 0.7056519, 0.36666667, 1, -0.6996207, -0.102619424, -0.102619395, 0.69962084, 0.4, 1, -0.68725264, -0.16638435, -0.16638432, 0.68725276, 0.43333334, 1, -0.6688022, -0.2295728, -0.22957277, 0.6688022, 0.46666667, 1, -0.6466371, -0.28611276, -0.28611273, 0.6466371, 0.5, 1, -0.6247237, -0.33124068, -0.33124065, 0.6247236, 0.53333336, 1, -0.60671896, -0.36316958, -0.36316955, 0.606719, 0.56666666, 1, -0.5896747, -0.39023554, -0.39023548, 0.5896747, 0.6, 1, -0.573949, -0.4130166, -0.41301656, 0.5739489, 0.6333333, 1, -0.5598276, -0.43196422, -0.4319642, 0.55982757, 0.6666667, 1, -0.5475638, -0.447408, -0.44740796, 0.5475638, 0.7, 1, -0.53831047, -0.45849967, -0.45849964, 0.53831035, 0.73333335, 1, -0.53158885, -0.46627605, -0.46627602, 0.5315888, 0.76666665, 1, -0.5276454, -0.4707339, -0.4707339, 0.5276454, 0.8, 1, -0.531291, -0.46661535, -0.46661535, 0.531291, 0.8333333, 1, -0.5512564, -0.4428502, -0.4428502, 0.5512565, 0.8666667, 1, -0.6014973, -0.37175405, -0.37175405, 0.6014972, 0.9, 1, -0.6556332, -0.26484933, -0.2648493, 0.65563315, 0.93333334, 1, -0.6944868, -0.13299699, -0.13299698, 0.69448674, 0.96666664, 1, -0.7070926, 0.004495856, 0.0044958577, 0.70709246, 1, 1, -0.6961938, 0.12375077, 0.123750776, 0.6961937, 1.0333333, 1, -0.67905474, 0.19719204, 0.19719204, 0.6790547, 1.0666667, 1, -0.6672913, 0.23392808, 0.23392811, 0.6672913, 1.0833334, 1, -0.66282797, 0.24629061, 0.24629065, 0.66282797)
[sub_resource type="Animation" id="Animation_pg0cp"]
resource_name = "reset"
length = 0.001
tracks/0/type = "rotation_3d"
tracks/0/imported = true
tracks/0/enabled = true
tracks/0/path = NodePath("Armature/Skeleton3D:head")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, 0, 0, 0, 1)
tracks/1/type = "rotation_3d"
tracks/1/imported = true
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D:arm.l")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 6.728594e-08, 3.9968324e-08, -0.4244344, 0.9054587)
tracks/2/type = "rotation_3d"
tracks/2/imported = true
tracks/2/enabled = true
tracks/2/path = NodePath("Armature/Skeleton3D:arm.r")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = PackedFloat32Array(0, 1, 2.349101e-08, 6.948292e-08, 0.42525995, 0.90507126)
tracks/3/type = "rotation_3d"
tracks/3/imported = true
tracks/3/enabled = true
tracks/3/path = NodePath("Armature/Skeleton3D:hip.l")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = PackedFloat32Array(0, 1, -0.5, -0.5, -0.5, 0.5)
tracks/4/type = "rotation_3d"
tracks/4/imported = true
tracks/4/enabled = true
tracks/4/path = NodePath("Armature/Skeleton3D:upper_leg.l")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = PackedFloat32Array(0, 1, -0.7071068, -2.6692542e-08, 2.6692542e-08, 0.7071068)
tracks/5/type = "rotation_3d"
tracks/5/imported = true
tracks/5/enabled = true
tracks/5/path = NodePath("Armature/Skeleton3D:hip.r")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = PackedFloat32Array(0, 1, -0.5, 0.5, 0.5, 0.5)
tracks/6/type = "rotation_3d"
tracks/6/imported = true
tracks/6/enabled = true
tracks/6/path = NodePath("Armature/Skeleton3D:upper_leg.r")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = PackedFloat32Array(0, 1, -0.7071068, -1.5454312e-08, 1.5454312e-08, 0.7071068)
[sub_resource type="Animation" id="Animation_52h43"]
resource_name = "walk-loop"
length = 1.0833334
tracks/0/type = "rotation_3d"
tracks/0/imported = true
tracks/0/enabled = true
tracks/0/path = NodePath("Armature/Skeleton3D:head")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = PackedFloat32Array(0, 1, 0, 0, 0, 1)
tracks/1/type = "rotation_3d"
tracks/1/imported = true
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D:arm.l")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = PackedFloat32Array(0, 1, 0.274355, -0.3806173, -0.37481663, 0.79960775, 0.033333335, 1, 0.2714617, -0.37660342, -0.37592492, 0.801972, 0.06666667, 1, 0.26462373, -0.36711693, -0.3784849, 0.80743337, 0.1, 1, 0.25419867, -0.3526541, -0.3822309, 0.81542486, 0.13333334, 1, 0.24051654, -0.33367264, -0.38686773, 0.8253168, 0.16666667, 1, 0.223897, -0.31061602, -0.39208817, 0.8364536, 0.2, 1, 0.20407194, -0.28311232, -0.39774787, 0.8485275, 0.23333333, 1, 0.18218736, -0.25275153, -0.40330747, 0.86038804, 0.26666668, 1, 0.15845338, -0.21982497, -0.40855402, 0.87158084, 0.3, 1, 0.13305698, -0.1845921, -0.4133, 0.8817056, 0.33333334, 1, 0.10615978, -0.14727713, -0.41738102, 0.8904115, 0.36666667, 1, 0.07725142, -0.10717209, -0.42071414, 0.89752215, 0.4, 1, 0.04718683, -0.06546298, -0.42305017, 0.90250576, 0.46666667, 1, -0.013830324, 0.019187145, -0.42431563, 0.9052055, 0.5, 1, -0.043459024, 0.060291544, -0.42326054, 0.9029545, 0.53333336, 1, -0.07086286, 0.09830934, -0.42130613, 0.89878523, 0.56666666, 1, -0.0958137, 0.13292404, -0.41869774, 0.89322066, 0.6, 1, -0.11789824, 0.1635623, -0.41571766, 0.8868631, 0.6333333, 1, -0.13676141, 0.18973155, -0.41266248, 0.88034546, 0.6666667, 1, -0.15209931, 0.21101007, -0.4098244, 0.8742909, 0.7, 1, -0.16219473, 0.22501555, -0.4077798, 0.869929, 0.73333335, 1, -0.16787551, 0.23289663, -0.40656674, 0.86734104, 0.76666665, 1, -0.16340235, 0.22669093, -0.40752575, 0.869387, 0.8, 1, -0.14386564, 0.19958729, -0.4113879, 0.8776261, 0.8333333, 1, -0.10497887, 0.14563906, -0.4175384, 0.89074713, 0.8666667, 1, -0.045283653, 0.062822886, -0.4231598, 0.90273947, 0.9, 1, 0.02366014, -0.032823984, -0.42408693, 0.9047172, 0.93333334, 1, 0.094985865, -0.13177535, -0.41879725, 0.8934326, 0.96666664, 1, 0.16181995, -0.22449538, -0.40785837, 0.8700963, 1, 1, 0.21807429, -0.30253798, -0.39381355, 0.84013414, 1.0333333, 1, 0.25417697, -0.3526239, -0.38223866, 0.81544113, 1.0666667, 1, 0.27256402, -0.37813258, -0.3755045, 0.8010749, 1.0833334, 1, 0.27887058, -0.3868817, -0.3730568, 0.79585326)
tracks/2/type = "rotation_3d"
tracks/2/imported = true
tracks/2/enabled = true
tracks/2/path = NodePath("Armature/Skeleton3D:arm.r")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = PackedFloat32Array(0, 1, -0.15459529, -0.21817005, 0.40977544, 0.87211597, 0.033333335, 1, -0.15927261, -0.22477087, 0.40880525, 0.87005097, 0.06666667, 1, -0.16879784, -0.23821317, 0.4067322, 0.865639, 0.1, 1, -0.18100263, -0.255437, 0.40388274, 0.8595747, 0.13333334, 1, -0.19377217, -0.2734578, 0.40066472, 0.85272574, 0.16666667, 1, -0.20507099, -0.28940308, 0.3976105, 0.84622556, 0.2, 1, -0.21054503, -0.29712823, 0.3960597, 0.84292495, 0.23333333, 1, -0.19928291, -0.28123477, 0.3991996, 0.8496076, 0.26666668, 1, -0.16628906, -0.23467276, 0.40729094, 0.8668281, 0.3, 1, -0.110335134, -0.15570866, 0.4174444, 0.88843757, 0.33333334, 1, -0.035037424, -0.049446005, 0.42447835, 0.9034078, 0.36666667, 1, 0.04999893, 0.07056013, 0.42366678, 0.9016806, 0.4, 1, 0.12684685, 0.17901048, 0.4148988, 0.8830199, 0.43333334, 1, 0.18774644, 0.26495403, 0.40221378, 0.85602266, 0.46666667, 1, 0.22797991, 0.32173282, 0.39080286, 0.8317369, 0.5, 1, 0.24508724, 0.3458753, 0.38516036, 0.819728, 0.53333336, 1, 0.24129015, 0.34051675, 0.3864553, 0.822484, 0.56666666, 1, 0.23222496, 0.32772362, 0.38944834, 0.828854, 0.6, 1, 0.21821508, 0.30795246, 0.39380717, 0.8381309, 0.6333333, 1, 0.19955707, 0.28162166, 0.39912558, 0.8494498, 0.6666667, 1, 0.17654917, 0.24915215, 0.40494794, 0.8618415, 0.7, 1, 0.14872853, 0.2098907, 0.4109485, 0.87461245, 0.73333335, 1, 0.1180961, 0.1666612, 0.41629404, 0.88598907, 0.76666665, 1, 0.08543309, 0.120566085, 0.42059168, 0.89513564, 0.8333333, 1, 0.017634049, 0.024885863, 0.4250622, 0.90465015, 0.8666667, 1, -0.01467868, -0.020714985, 0.425123, 0.9047795, 0.9, 1, -0.04446189, -0.062746026, 0.42400077, 0.9023911, 0.93333334, 1, -0.07099054, -0.10018411, 0.4220422, 0.89822274, 0.96666664, 1, -0.09364835, -0.1321596, 0.41964442, 0.8931196, 1, 1, -0.111921966, -0.15794797, 0.4172158, 0.88795096, 1.0333333, 1, -0.12352726, -0.1743257, 0.41544038, 0.88417244, 1.0666667, 1, -0.12948188, -0.18272904, 0.41445833, 0.88208216, 1.0833334, 1, -0.13152054, -0.18560605, 0.4141109, 0.88134265)
tracks/3/type = "rotation_3d"
tracks/3/imported = true
tracks/3/enabled = true
tracks/3/path = NodePath("Armature/Skeleton3D:hip.l")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = PackedFloat32Array(0, 1, -0.5, -0.5, -0.5, 0.5)
tracks/4/type = "rotation_3d"
tracks/4/imported = true
tracks/4/enabled = true
tracks/4/path = NodePath("Armature/Skeleton3D:upper_leg.l")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = PackedFloat32Array(0, 1, -0.60595876, 0.3644366, 0.36443666, 0.6059587, 0.06666667, 1, -0.60595876, 0.3644366, 0.36443666, 0.6059587, 0.1, 1, -0.6032101, 0.36896825, 0.36896828, 0.6032101, 0.13333334, 1, -0.59639233, 0.37988952, 0.37988958, 0.59639245, 0.16666667, 1, -0.5855792, 0.39635456, 0.39635462, 0.5855793, 0.2, 1, -0.5795719, 0.40508807, 0.40508813, 0.57957196, 0.23333333, 1, -0.5895815, 0.39037627, 0.39037627, 0.58958155, 0.26666668, 1, -0.6165933, 0.34613982, 0.34613985, 0.6165933, 0.3, 1, -0.6541701, 0.26844278, 0.2684428, 0.6541701, 0.33333334, 1, -0.6892638, 0.15784594, 0.157846, 0.6892639, 0.36666667, 1, -0.7066153, 0.026357096, 0.026357153, 0.70661545, 0.4, 1, -0.7008727, -0.093687855, -0.0936878, 0.7008728, 0.43333334, 1, -0.6816648, -0.18797097, -0.1879709, 0.6816648, 0.46666667, 1, -0.6618372, -0.24894077, -0.24894069, 0.6618373, 0.5, 1, -0.6517511, -0.27426365, -0.27426362, 0.6517511, 0.53333336, 1, -0.6582527, -0.25827003, -0.25826997, 0.65825266, 0.56666666, 1, -0.67109025, -0.22279571, -0.22279567, 0.67109025, 0.6, 1, -0.6857183, -0.17259939, -0.17259935, 0.68571824, 0.6666667, 1, -0.70495313, -0.05514667, -0.055146623, 0.7049531, 0.7, 1, -0.70691395, -0.016512973, -0.016512923, 0.70691395, 0.73333335, 1, -0.7071068, -0.00015736022, -0.00015730923, 0.7071068, 0.76666665, 1, -0.7070719, 0.0070313667, 0.00703141, 0.70707184, 0.8, 1, -0.70687455, 0.018124059, 0.018124092, 0.70687443, 0.8333333, 1, -0.7056039, 0.046078686, 0.046078723, 0.7056038, 0.8666667, 1, -0.7008078, 0.09417304, 0.09417307, 0.70080763, 0.9, 1, -0.6911309, 0.14945938, 0.14945939, 0.6911309, 0.93333334, 1, -0.67634094, 0.206308, 0.20630804, 0.6763409, 0.96666664, 1, -0.6577143, 0.25963807, 0.2596381, 0.65771425, 1, 1, -0.6378587, 0.3051825, 0.30518252, 0.63785857, 1.0333333, 1, -0.6225582, 0.33529305, 0.33529308, 0.62255806, 1.0666667, 1, -0.61391485, 0.35086837, 0.35086843, 0.6139148, 1.0833334, 1, -0.6107917, 0.3562773, 0.35627735, 0.6107917)
tracks/5/type = "rotation_3d"
tracks/5/imported = true
tracks/5/enabled = true
tracks/5/path = NodePath("Armature/Skeleton3D:hip.r")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = PackedFloat32Array(0, 1, -0.5, 0.5, 0.5, 0.5)
tracks/6/type = "rotation_3d"
tracks/6/imported = true
tracks/6/enabled = true
tracks/6/path = NodePath("Armature/Skeleton3D:upper_leg.r")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = PackedFloat32Array(0, 1, -0.66778064, 0.2325275, 0.23252754, 0.66778064, 0.033333335, 1, -0.6728083, 0.21755226, 0.21755232, 0.6728083, 0.06666667, 1, -0.6822603, 0.18579805, 0.18579808, 0.6822603, 0.1, 1, -0.6924698, 0.14312816, 0.14312819, 0.6924698, 0.13333334, 1, -0.70056885, 0.09593359, 0.09593362, 0.7005689, 0.16666667, 1, -0.7052536, 0.051159598, 0.05115963, 0.70525366, 0.2, 1, -0.7067271, 0.023168769, 0.023168799, 0.70672715, 0.23333333, 1, -0.7070106, 0.011661734, 0.011661766, 0.7070106, 0.26666668, 1, -0.70709205, 0.004570252, 0.004570281, 0.70709205, 0.3, 1, -0.70703137, -0.010325267, -0.010325237, 0.7070314, 0.33333334, 1, -0.7056518, -0.045337453, -0.04533742, 0.7056519, 0.36666667, 1, -0.6996207, -0.102619424, -0.102619395, 0.69962084, 0.4, 1, -0.68725264, -0.16638435, -0.16638432, 0.68725276, 0.43333334, 1, -0.6688022, -0.2295728, -0.22957277, 0.6688022, 0.46666667, 1, -0.6466371, -0.28611276, -0.28611273, 0.6466371, 0.5, 1, -0.6247237, -0.33124068, -0.33124065, 0.6247236, 0.53333336, 1, -0.60671896, -0.36316958, -0.36316955, 0.606719, 0.56666666, 1, -0.5896747, -0.39023554, -0.39023548, 0.5896747, 0.6, 1, -0.573949, -0.4130166, -0.41301656, 0.5739489, 0.6333333, 1, -0.5598276, -0.43196422, -0.4319642, 0.55982757, 0.6666667, 1, -0.5475638, -0.447408, -0.44740796, 0.5475638, 0.7, 1, -0.53831047, -0.45849967, -0.45849964, 0.53831035, 0.73333335, 1, -0.53158885, -0.46627605, -0.46627602, 0.5315888, 0.76666665, 1, -0.5276454, -0.4707339, -0.4707339, 0.5276454, 0.8, 1, -0.531291, -0.46661535, -0.46661535, 0.531291, 0.8333333, 1, -0.5512564, -0.4428502, -0.4428502, 0.5512565, 0.8666667, 1, -0.6014973, -0.37175405, -0.37175405, 0.6014972, 0.9, 1, -0.6556332, -0.26484933, -0.2648493, 0.65563315, 0.93333334, 1, -0.6944868, -0.13299699, -0.13299698, 0.69448674, 0.96666664, 1, -0.7070926, 0.004495856, 0.0044958577, 0.70709246, 1, 1, -0.6961938, 0.12375077, 0.123750776, 0.6961937, 1.0333333, 1, -0.67905474, 0.19719204, 0.19719204, 0.6790547, 1.0666667, 1, -0.6672913, 0.23392808, 0.23392811, 0.6672913, 1.0833334, 1, -0.66282797, 0.24629061, 0.24629065, 0.66282797)
[sub_resource type="AnimationLibrary" id="AnimationLibrary_pj205"]
_data = {
&"RESET": SubResource("Animation_3fe0i"),
&"collect_helper_part2": SubResource("Animation_erypk"),
&"helper_visible": SubResource("Animation_4r34j"),
&"idle": SubResource("Animation_kitjm"),
&"jump": SubResource("Animation_i5730"),
&"jump1": SubResource("Animation_4m5ha"),
&"pickup": SubResource("Animation_qw38m"),
&"pickup_walk": SubResource("Animation_5eaja"),
&"reset": SubResource("Animation_pg0cp"),
&"walk": SubResource("Animation_52h43")
}
[sub_resource type="Animation" id="Animation_ijy7i"]
resource_name = "collect_helper_part2"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("helper:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0.0960083, 1.1406784, 0.538002), Vector3(0.0960083, -0.08320968, 0.538002)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("helper:visible")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, true]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_qpqd5"]
_data = {
&"collect_helper_part2": SubResource("Animation_ijy7i")
}
[node name="Player" type="CharacterBody3D"]
collision_mask = 95
script = ExtResource("1_dq61c")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00389862, -0.462623, 0.104645)
shape = SubResource("BoxShape3D_uk0nh")
[node name="Camera_Controller" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
top_level = true
[node name="Camera_Pivot" type="SpringArm3D" parent="Camera_Controller"]
transform = Transform3D(1, 0, 0, 0, 0.93358, 0.358368, 0, -0.358368, 0.93358, 0, 0, 0)
collision_mask = 2
spring_length = 5.0
[node name="Camera3D" type="Camera3D" parent="Camera_Controller/Camera_Pivot"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.375, 4.596)
current = true
fov = 70.0
[node name="RayCast3D" type="RayCast3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.38872, 0)
collision_mask = 14
[node name="InteractRay" parent="." instance=ExtResource("3_wknd5")]
transform = Transform3D(1.17, 0, 0, 0, -5.11423e-08, -1.17, 0, 1.17, -5.11423e-08, 0, -0.382462, 0)
collision_mask = 12
debug_shape_custom_color = Color(0.79, 0.00789999, 0.00789999, 1)
[node name="Armature" type="Node3D" parent="."]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, -1.41604, 0)
[node name="Skeleton3D" type="Skeleton3D" parent="Armature"]
bones/0/name = "body"
bones/0/parent = -1
bones/0/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.3528, 0)
bones/0/enabled = true
bones/0/position = Vector3(0, 0.35279977, 0)
bones/0/rotation = Quaternion(0, 0, 0, 1)
bones/0/scale = Vector3(1, 1, 1)
bones/1/name = "head"
bones/1/parent = 0
bones/1/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.606169, 0)
bones/1/enabled = true
bones/1/position = Vector3(0, 0.606169, 0)
bones/1/rotation = Quaternion(0, 0, 0, 1)
bones/1/scale = Vector3(1, 1, 1)
bones/2/name = "shoulder.l"
bones/2/parent = 0
bones/2/rest = Transform3D(-0.185149, 0.982711, -2.1179e-08, -0.982711, -0.185148, -1.12412e-07, -1.14389e-07, -1.06581e-14, 1, 0, 0.606169, 0)
bones/2/enabled = true
bones/2/position = Vector3(0, 0.606169, 0)
bones/2/rotation = Quaternion(4.4027612e-08, 3.650722e-08, -0.7697886, 0.6382989)
bones/2/scale = Vector3(1.0000005, 1.0000004, 1)
bones/3/name = "arm.l"
bones/3/parent = 2
bones/3/rest = Transform3D(0.639711, 0.768615, 1.52624e-08, -0.768616, 0.639711, -1.55777e-07, -1.29496e-07, 8.79214e-08, 1, 2.6077e-08, 0.291873, 4.88498e-15)
bones/3/enabled = true
bones/3/position = Vector3(2.6077e-08, 0.291873, 4.88498e-15)
bones/3/rotation = Quaternion(0.27435496, -0.3806172, -0.37481663, 0.79960763)
bones/3/scale = Vector3(1.0000004, 0.99999964, 1)
bones/4/name = "shoulder.r"
bones/4/parent = 0
bones/4/rest = Transform3D(-0.176299, -0.984337, 2.32732e-08, 0.984337, -0.176299, -1.29942e-07, 1.3201e-07, -1.42109e-14, 1, 0, 0.606169, 0)
bones/4/enabled = true
bones/4/position = Vector3(0, 0.606169, 0)
bones/4/rotation = Quaternion(5.0619818e-08, -4.235909e-08, 0.76690906, 0.6417558)
bones/4/scale = Vector3(1.0000002, 1.0000002, 1)
bones/5/name = "arm.r"
bones/5/parent = 4
bones/5/rest = Transform3D(0.638308, -0.769781, 1.45754e-07, 0.769781, 0.638308, 1.65745e-08, -1.05794e-07, 1.01619e-07, 1, 2.23517e-08, 0.282945, -5.32907e-15)
bones/5/enabled = true
bones/5/position = Vector3(2.23517e-08, 0.282945, -5.32907e-15)
bones/5/rotation = Quaternion(-0.15459529, -0.21817008, 0.40977547, 0.872116)
bones/5/scale = Vector3(0.99999994, 0.99999994, 1)
bones/6/name = "hip.l"
bones/6/parent = -1
bones/6/rest = Transform3D(0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0.3528, 0)
bones/6/enabled = true
bones/6/position = Vector3(0, 0.35279977, 0)
bones/6/rotation = Quaternion(0.5, 0.5, 0.5, -0.5)
bones/6/scale = Vector3(1, 1, 1)
bones/7/name = "upper_leg.l"
bones/7/parent = 6
bones/7/rest = Transform3D(1, 0, -7.54979e-08, 7.54979e-08, 0, 1, 0, -1, 0, 0, 0.16212, 0)
bones/7/enabled = true
bones/7/position = Vector3(0, 0.16212, 0)
bones/7/rotation = Quaternion(-0.6059587, 0.3644366, 0.3644366, 0.6059587)
bones/7/scale = Vector3(1, 1, 1)
bones/8/name = "lower_leg.l"
bones/8/parent = 7
bones/8/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.103923, 0)
bones/8/enabled = true
bones/8/position = Vector3(0, 0.103923, 0)
bones/8/rotation = Quaternion(0, 0, 0, 1)
bones/8/scale = Vector3(1, 1, 1)
bones/9/name = "hip.r"
bones/9/parent = -1
bones/9/rest = Transform3D(0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 0.3528, 0)
bones/9/enabled = true
bones/9/position = Vector3(0, 0.35279977, 0)
bones/9/rotation = Quaternion(0.5, -0.5, -0.5, -0.5)
bones/9/scale = Vector3(1, 1, 1)
bones/10/name = "upper_leg.r"
bones/10/parent = 9
bones/10/rest = Transform3D(1, 0, -4.37114e-08, 4.37114e-08, 0, 1, 0, -1, 0, 0, 0.145492, 0)
bones/10/enabled = true
bones/10/position = Vector3(0, 0.145492, 0)
bones/10/rotation = Quaternion(-0.66778064, 0.23252751, 0.23252754, 0.66778064)
bones/10/scale = Vector3(1, 1, 1)
bones/11/name = "lower_leg.r"
bones/11/parent = 10
bones/11/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.10808, 0)
bones/11/enabled = true
bones/11/position = Vector3(0, 0.10808, 0)
bones/11/rotation = Quaternion(0, 0, 0, 1)
bones/11/scale = Vector3(1, 1, 1)
bones/12/name = "neutral_bone"
bones/12/parent = -1
bones/12/rest = Transform3D(1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0)
bones/12/enabled = true
bones/12/position = Vector3(0, 0, 0)
bones/12/rotation = Quaternion(-0.70710677, 0, 0, 0.70710677)
bones/12/scale = Vector3(1, 1, 1)
[node name="CharacterMesh" type="MeshInstance3D" parent="Armature/Skeleton3D"]
mesh = ExtResource("3_gyuqh")
skin = SubResource("Skin_gyuqh")
[node name="Crosshair" type="Control" parent="."]
layout_mode = 3
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -20.0
offset_top = -20.0
offset_right = 20.0
offset_bottom = 20.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("4_gyuqh")
metadata/_edit_use_anchors_ = true
[node name="Horizontal" type="Line2D" parent="Crosshair"]
points = PackedVector2Array(-15, 0, 15, 0)
width = 2.0
[node name="Vertical" type="Line2D" parent="Crosshair"]
points = PackedVector2Array(0, -15, 0, 15)
width = 2.0
[node name="Inventory" parent="." instance=ExtResource("5_wknd5")]
visible = false
[node name="Balloon" parent="." instance=ExtResource("6_rjb0o")]
transform = Transform3D(0.6970959, 0.06369831, 0, -0.06369831, 0.6970959, 0, 0, 0, 0.70000005, 0.2608546, 0.32857847, 0.54166865)
visible = false
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
&"": SubResource("AnimationLibrary_pj205")
}
[node name="helper" type="Node3D" parent="."]
transform = Transform3D(0.4, 0, 0, 0, 0.4, 0, 0, 0, 0.4, 0.096, 1.141, 0.538)
visible = false
[node name="helper" parent="helper" instance=ExtResource("7_4r34j")]
[node name="Chatbot" parent="." instance=ExtResource("8_erypk")]
visible = false
[node name="audio_throw" type="AudioStreamPlayer" parent="."]
stream = ExtResource("9_qpqd5")
volume_db = -3.0
[node name="audio_pickup" type="AudioStreamPlayer" parent="."]
stream = ExtResource("10_41dcx")
volume_db = -7.0
[node name="AnimationPlayer2" type="AnimationPlayer" parent="."]
libraries = {
&"": SubResource("AnimationLibrary_qpqd5")
}
[node name="audio_jump" type="AudioStreamPlayer" parent="."]
stream = ExtResource("11_a75tr")
volume_db = -8.0
[connection signal="grabbed" from="InteractRay" to="." method="_on_interact_ray_grabbed"]
[connection signal="animation_started" from="AnimationPlayer" to="." method="_on_animation_player_animation_started"]
+5
View File
@@ -0,0 +1,5 @@
[gd_scene load_steps=2 format=3 uid="uid://b4mmlt4progvd"]
[ext_resource type="PackedScene" uid="uid://cg6wf4m1u7anr" path="res://assets/assets.glb" id="1_nyoif"]
[node name="assets" instance=ExtResource("1_nyoif")]
Binary file not shown.
+266
View File
@@ -0,0 +1,266 @@
extends Node3D
const count_battery_boxes = 4
var currently_charged_battery_boxes := 0
signal show_door
@onready var aliens = $"npcs/aliens"
@onready var batteries = $"Objects/Balloons_A2"
@onready var chatbot: Control = $npcs/helpers/Chatbot
var aliens_start_count: int
var batteries_start_count: int
var helper_collected = false
var not_congratulated_1 = true
var not_congratulated_2 = true
var release_generators = false
var popped_balloons := 0
var current_task := 0
var current_text: String
var rabbit_activated = false
var audio_playing = true
@onready var checkpoints = [$startpoint,
$Objects/pressure_blocks/PressureBlock_A1,
$Objects/pressure_blocks/PressureBlock_A2,
$Objects/pressure_blocks/PressureBlock_A3,
$Objects/pressure_blocks/PressureBlock_A3_1,
]
@onready var generators = $Objects/generators
func _ready() -> void:
aliens_start_count = aliens.get_child_count()
batteries_start_count = batteries.get_child_count()
func _process(delta: float) -> void:
if Global.chatbot_opened:
return
if Input.is_action_just_pressed("Screenshot"):
take_screenshot()
if Input.is_action_just_pressed("fast_forward"):
current_task = (current_task + 1 ) % len(checkpoints)
print(current_task, checkpoints[current_task].position)
$Player.position = checkpoints[current_task].position + Vector3(0.0, 0.5, 0.0)
if Input.is_action_just_pressed("rewind"):
current_task = (current_task - 1 ) % len(checkpoints)
$Player.position = checkpoints[current_task].position
if Input.is_action_just_pressed("inventory"):
if current_task == 3:
$Player.toggle_inventory()
if current_task == 4 and Input.is_action_just_pressed("keypad"):
reset_music_volume()
$Keypad.visible = true
$Hilfestellung/CanvasLayer.visible = false
$Player.set_mode('aim')
if not_congratulated_1 and aliens.get_child_count() <= aliens_start_count-5:
not_congratulated_1 = false
show_congratulations("Glückwunsch!
Die erste Aufgabe ist geschafft.", "Definitionen von KI")
func show_congratulations(text, text_2) -> void:
print(text)
$Player/helper/helper.celebrate()
$Hilfestellung/CanvasLayer.visible = false
$Congratulations/CanvasLayer/Panel/Label.text = text
$Congratulations/CanvasLayer.visible = true
$Congratulations/CanvasLayer/Panel/Label_repeat.text = "(Um die "+ text_2 + " noch einmal nachzulesen, sprechen Sie mit ihrem Helfer)"
await get_tree().create_timer(5.0).timeout
$Player/helper/helper.stop_anim()
$Congratulations/CanvasLayer.visible = false
func openLinkinBrowser(link):
OS.shell_open(link)
func openAIActinBrowser():
openLinkinBrowser("https://eur-lex.europa.eu/legal-content/DE/TXT/?uri=CELEX:32024R1689")
func openDSGVOinBrowser():
openLinkinBrowser("https://dsgvo-gesetz.de/")
func _on_openChatBot():
$Hilfestellung/CanvasLayer.visible = false
$HUD.visible = false
quiet_down_music()
func _on_battery_box_removed_battery() -> void:
currently_charged_battery_boxes -= 1
print(currently_charged_battery_boxes)
func _on_show_door() -> void:
print('showing door')
$Objects/spaceship/Door.visible = true
$Objects/spaceship/Door.position.y = 0.012
$Objects/spaceship/door_cover/CollisionShape3D.disabled = true
func _on_door_body_entered(body: Node3D) -> void:
if $Objects/spaceship/Door.visible:
DialogueState.currentTask = 5
Transition.change_scene("res://quiz.tscn")
func _on_pressure_block_a3_activated() -> void:
quiet_down_music()
$Objects/pressure_blocks/PressureBlock_A3.current_weight = 10.0
DialogueManager.show_chosen_dialogue_balloon(load($Objects/pressure_blocks/PressureBlock_A3.text_on_activation), "/game_balloons/game_balloon_v_2.tscn", "start")
func _on_pressure_block_a_1_activated() -> void:
current_task = 1
DialogueState.currentTask = 1
current_text = "[Enter] oder [t] drücken, um mit den Aliens zu reden"
$Hinweistexte/CanvasLayer/Panel/Label.text = "Wenn Sie weiterlaufen werden Ihnen einige Aliens begegnen. Sprechen Sie mit ihnen, um verschiedene Definitionen von Künstlicher Intelligenz (KI) kennenzulernen."
$Hinweistexte/CanvasLayer.visible = true
if $Tutorial:
$Tutorial.queue_free()
if $Objects/Bridges/walls_tutorial:
$Objects/Bridges/walls_tutorial.queue_free()
if $Objects/Chip0/block:
$Objects/Chip0/block.queue_free()
func _on_pressure_block_a_2_activated() -> void:
current_task = 2
current_text = "Zielen mit der Maus, Klicken zum Werfen, [r] zum Wechsel zwischen Wurf- und Kameramodus"
$Hinweistexte/CanvasLayer/Panel/Label.text = "Laufen Sie weiter zur Wurfzone.
Dort angekommen, können Sie die Ballons abwerfen, um zu entdecken, in was für Systemen KI bereits eingesetzt wird bzw. werden kann.
Sammeln Sie danach die Batterien, Sie werden sie im weiteren Verlauf benötigen.
Zur Erinnerung: Zielen mit der Maus (Fadenkreuz) und Werfen durch Klicken. Wenn Sie kein Fadenkreuz sehen, evtl. [r] drücken, um den Modus zu wechseln."
$Hinweistexte/CanvasLayer.visible = true
func _on_pressure_block_deactivated() -> void:
$Hinweistexte/CanvasLayer.visible = false
$Hilfestellung/CanvasLayer/Panel/Label.text = current_text
$Hilfestellung/CanvasLayer.visible = true
func _on_pressure_block_a_3_1_activated() -> void:
reset_music_volume()
current_task = 3
DialogueState.currentTask = 3
current_text = "Auswahl der Batterien im Inventar [c], Einfügen mit [f] - ([e] zum wieder rausholen, [q] ablegen)"
$Objects/pressure_blocks/PressureBlock_A3_1.current_weight = 10.0
$AnimationPlayer.play("start_ordering_game")
_on_pressure_block_deactivated()
func _on_balloon_tree_exited() -> void:
popped_balloons += 1
if popped_balloons == Global.TOTAL_BALLOONS_A2 and current_task == 2:
not_congratulated_2 = false
DialogueState.batteriesFlag = true
show_congratulations("Glückwunsch!
Die 2. Aufgabe ist geschafft.", "KI-Systeme")
$Objects/arrows/after_throw.visible = true
$Objects/Fences/no_arrows/barrier_throw.position.x = 4.0
$Hilfestellung/CanvasLayer/Panel/Label.text = "Sammeln Sie die Batterien auf (durch Vorbeilaufen) - einen Counter dazu sehen Sie oben links"
$Hilfestellung/CanvasLayer.visible = true
func _on_pressure_block_a_4_activated() -> void:
quiet_down_music()
current_task = 4
DialogueState.currentTask = 4
DialogueState.personalDataFlag = true
$Objects/spaceship/keypad.visible = true
current_text = "[k] drücken zum Starten des nächsten Minispiels"
$Hilfestellung/CanvasLayer.visible = true
$Objects/pressure_blocks/PressureBlock_A4.current_weight = 10.0
DialogueManager.show_chosen_dialogue_balloon(load($Objects/pressure_blocks/PressureBlock_A4.text_on_activation), "/game_balloons/game_balloon_v_2.tscn", "start")
_on_pressure_block_deactivated()
func _on_keypad_game_finished() -> void:
$Keypad.visible = false
$Objects/spaceship/keypad.visible = false
$Hilfestellung/CanvasLayer/Panel/Label.text = "Gehen Sie durch die Tür ins Raumschiff"
$Hilfestellung/CanvasLayer.visible = true
show_door.emit()
func _on_battery_3_battery_collected() -> void:
$Player/helper.visible = true
#TODO implement if helper should replace battery 3 (since it's also a chatbot)
func _on_animation_player_animation_finished(anim_name: StringName) -> void:
if anim_name == "collect_helper_part1":
$Player/AnimationPlayer2.play("collect_helper_part2")
if anim_name == 'follow_rabbit':
$AnimationPlayer.play('rotate_label')
if anim_name == "ordering_finished":
generators.queue_free()
show_congratulations("Glückwunsch!
Die 3. Aufgabe ist geschafft.", "Risikostufen von KI")
$Objects/pressure_blocks/PressureBlock_A4.position = Vector3(-87.26, 3.787, 209.9)
func _on_helper_corner_dialogue_finished() -> void:
if not helper_collected:
$AnimationPlayer.play("collect_helper_part1")
$npcs/helpers/helper_corner/CollisionShape3D.disabled = true
helper_collected = true
$Objects/chip1/star.queue_free()
func _on_battery_box_fully_charged() -> void:
currently_charged_battery_boxes += 1
print('currently charged boxes: ', currently_charged_battery_boxes)
if currently_charged_battery_boxes == count_battery_boxes:
print('all boxes are full')
await get_tree().create_timer(1.5).timeout
$AnimationPlayer.play("ordering_finished")
$Objects/Chip0/Arrows_A4.visible = true
func _on_player_inventory_opened() -> void:
$Hilfestellung/CanvasLayer.visible = false
$HUD.visible = false
func _on_player_inventory_closed() -> void:
$Hilfestellung/CanvasLayer.visible = true
$HUD.visible = true
func _on_balloon_popped(balloon: Balloon) -> void:
$Player/helper/helper.play_small_celebration()
func _on_chatbot_closing_chatbot() -> void:
if current_task > 0:
$HUD.visible = true
$Hilfestellung/CanvasLayer.visible = true
reset_music_volume()
func take_screenshot():
print('taking screenshot')
var image = get_viewport().get_texture().get_image()
image.save_png("user://screenshot"+Time.get_datetime_string_from_system()+".png")
func _on_start_rabbit_body_entered(body: Node3D) -> void:
if not rabbit_activated:
$AnimationPlayer.play('follow_rabbit')
rabbit_activated = true
func quiet_down_music() -> void:
$AudioStreamPlayer.volume_db = -20.0
func reset_music_volume() -> void:
$AudioStreamPlayer.volume_db = -10.0
func toggle_music() -> void:
if not audio_playing:
audio_playing = true
$AudioStreamPlayer.play()
else:
$AudioStreamPlayer.stop()
audio_playing = false
func _on_audio_stream_player_finished() -> void:
$AudioStreamPlayer.play()
@@ -0,0 +1 @@
uid://d0lyomtjfroou
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,15 @@
[gd_resource type="Terrain3DMaterial" load_steps=2 format=3 uid="uid://dtdjnbbnpdyqg"]
[ext_resource type="Shader" uid="uid://01qauauvd8aa" path="res://addons/terrain_3d/extras/shaders/minimum.gdshader" id="1_yvehn"]
[resource]
_shader_parameters = {
&"color_high": Color(0.5019608, 0.4, 0.2, 1),
&"color_low": Color(0.055, 0.216, 0.11, 1),
&"flat_terrain_normals": false,
&"height_scale": 1.0,
&"height_split": 1.0
}
shader_override_enabled = true
shader_override = ExtResource("1_yvehn")
show_region_grid = true
Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c2crd1tqwu4i"
path="res://.godot/imported/Metal049A.png-af30c4a6a788f1059dad8d458b88d8e5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Resources/Terrains/textures/Metal049A_1K-PNG/Metal049A.png"
dest_files=["res://.godot/imported/Metal049A.png-af30c4a6a788f1059dad8d458b88d8e5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
@@ -0,0 +1,58 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://k8b0a35qcriu"
valid=false
[deps]
source_file="res://Resources/Terrains/textures/Metal049A_1K-PNG/Metal049A_1K-PNG.blend"
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
blender/nodes/visible=0
blender/nodes/active_collection_only=false
blender/nodes/punctual_lights=true
blender/nodes/cameras=true
blender/nodes/custom_properties=true
blender/nodes/modifiers=1
blender/meshes/colors=false
blender/meshes/uvs=true
blender/meshes/normals=true
blender/meshes/export_geometry_nodes_instances=false
blender/meshes/tangents=true
blender/meshes/skins=2
blender/meshes/export_bones_deforming_mesh_only=false
blender/materials/unpack_enabled=true
blender/materials/export_materials=1
blender/animation/limit_playback=true
blender/animation/always_sample=true
blender/animation/group_tracks=true
gltf/naming_version=2
@@ -0,0 +1,41 @@
<?xml version="1.0"?>
<materialx version="1.39" fileprefix="./">
<open_pbr_surface type="surfaceshader" xpos="6.159420" ypos="-1.879310" name="Metal049A_1K_PNG_OpenPbrSurface">
<input type="color3" name="base_color" nodename="Metal049A_1K_PNG_Color" />
<input type="float" name="base_metalness" nodename="Metal049A_1K_PNG_Metalness" />
<input type="vector3" name="geometry_normal" nodename="NormalMap" />
<input type="float" name="specular_roughness" nodename="Metal049A_1K_PNG_Roughness" />
</open_pbr_surface>
<surfacematerial type="material" xpos="8.695652" ypos="0.000000" name="Metal049A_1K_PNG">
<input type="surfaceshader" name="surfaceshader" nodename="Metal049A_1K_PNG_OpenPbrSurface" />
<input type="displacementshader" name="displacementshader" nodename="displacement" />
</surfacematerial>
<tiledimage type="color3" xpos="3.623188" ypos="-3.103448" name="Metal049A_1K_PNG_Color">
<input type="filename" value="Metal049A_1K-PNG_Color.png" colorspace="srgb_texture" name="file" />
<input type="vector2" value="1.0, 1.0" name="uvtiling" />
</tiledimage>
<tiledimage type="float" xpos="3.623188" ypos="5.163793" name="Metal049A_1K_PNG_Displacement">
<input type="filename" value="Metal049A_1K-PNG_Displacement.png" name="file" />
<input type="vector2" value="1.0, 1.0" name="uvtiling" />
</tiledimage>
<displacement type="displacementshader" xpos="6.159420" ypos="1.879310" name="displacement">
<input type="float" name="displacement" nodename="Metal049A_1K_PNG_Displacement" />
<input type="float" value="1.0" name="scale" />
</displacement>
<tiledimage type="float" xpos="3.623188" ypos="-1.758621" name="Metal049A_1K_PNG_Metalness">
<input type="filename" value="Metal049A_1K-PNG_Metalness.png" name="file" />
<input type="vector2" value="1.0, 1.0" name="uvtiling" />
</tiledimage>
<tiledimage type="vector3" xpos="1.086957" ypos="0.879310" name="Metal049A_1K_PNG_NormalGL">
<input type="filename" value="Metal049A_1K-PNG_NormalGL.png" name="file" />
<input type="vector2" value="1.0, 1.0" name="uvtiling" />
</tiledimage>
<normalmap type="vector3" xpos="3.623188" ypos="3.586207" name="NormalMap">
<input type="vector3" name="in" nodename="Metal049A_1K_PNG_NormalGL" />
<input type="float" value="1.0" name="scale" />
</normalmap>
<tiledimage type="float" xpos="3.623188" ypos="-0.413793" name="Metal049A_1K_PNG_Roughness">
<input type="filename" value="Metal049A_1K-PNG_Roughness.png" name="file" />
<input type="vector2" value="1.0, 1.0" name="uvtiling" />
</tiledimage>
</materialx>
@@ -0,0 +1,19 @@
[gd_resource type="StandardMaterial3D" load_steps=6 format=3 uid="acg_bsi79hm4"]
[ext_resource type="Texture2D" uid="uid://acg_0b6m4z8d" id="Color" path="./Metal049A_1K-PNG_Color.png"]
[ext_resource type="Texture2D" uid="uid://acg_d70su2z9" id="Metalness" path="./Metal049A_1K-PNG_Metalness.png"]
[ext_resource type="Texture2D" uid="uid://acg_q1sedajb" id="Displacement" path="./Metal049A_1K-PNG_Displacement.png"]
[ext_resource type="Texture2D" uid="uid://acg_w7dtvmnb" id="Roughness" path="./Metal049A_1K-PNG_Roughness.png"]
[ext_resource type="Texture2D" uid="uid://acg_70ebfpqw" id="NormalGL" path="./Metal049A_1K-PNG_NormalGL.png"]
[resource]
albedo_texture = ExtResource("Color")
metallic_texture = ExtResource("Metalness")
metallic = 1.0
metallic_texture_channel = 4
roughness_texture = ExtResource("Roughness")
roughness_texture_channel = 4
normal_texture = ExtResource("NormalGL")
normal_enabled = true
heightmap_texture = ExtResource("Displacement")
heightmap_scale = 1.0
heightmap_enabled = true
Binary file not shown.

After

Width:  |  Height:  |  Size: 523 KiB

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ymsbb8ebr4be"
path.s3tc="res://.godot/imported/Metal049A_1K-PNG_Color.png-b49d04f407d2e9f51385bd00b6d2b523.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://Resources/Terrains/textures/Metal049A_1K-PNG/Metal049A_1K-PNG_Color.png"
dest_files=["res://.godot/imported/Metal049A_1K-PNG_Color.png-b49d04f407d2e9f51385bd00b6d2b523.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Some files were not shown because too many files have changed in this diff Show More