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