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
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