diff --git a/rund-um-die-welten/.DS_Store b/rund-um-die-welten/.DS_Store new file mode 100644 index 0000000..2f7b5c8 Binary files /dev/null and b/rund-um-die-welten/.DS_Store differ diff --git a/rund-um-die-welten/.editorconfig b/rund-um-die-welten/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/rund-um-die-welten/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/rund-um-die-welten/.gitattributes b/rund-um-die-welten/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/rund-um-die-welten/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/rund-um-die-welten/Bug_Report.txt b/rund-um-die-welten/Bug_Report.txt new file mode 100644 index 0000000..1a43fb9 --- /dev/null +++ b/rund-um-die-welten/Bug_Report.txt @@ -0,0 +1 @@ +- Collectibles werden bei Level 3 (Erde) nicht richtig angezeigt, nur eine Collectible links, auch wenn alle eingesammelt wurden diff --git a/rund-um-die-welten/Fonts/BRIGHTSTER-Bold-1.ttf b/rund-um-die-welten/Fonts/BRIGHTSTER-Bold-1.ttf new file mode 100644 index 0000000..ff53d1d Binary files /dev/null and b/rund-um-die-welten/Fonts/BRIGHTSTER-Bold-1.ttf differ diff --git a/rund-um-die-welten/LevelSelectUtility/Main_Menu.tscn b/rund-um-die-welten/LevelSelectUtility/Main_Menu.tscn new file mode 100644 index 0000000..07a605b --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/Main_Menu.tscn @@ -0,0 +1,72 @@ +[gd_scene load_steps=7 format=3 uid="uid://disuxhv301e4x"] + +[ext_resource type="Script" uid="uid://fey1vlc3fki" path="res://LevelSelectUtility/main_menu.gd" id="1_h3vtm"] +[ext_resource type="Texture2D" uid="uid://b645w4bad52ab" path="res://assets/Background.png" id="1_sg3w2"] +[ext_resource type="PackedScene" uid="uid://b81fnypg0r01i" path="res://LevelSelectUtility/world_select_star_system.tscn" id="2_d8tt0"] +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="3_d8tt0"] +[ext_resource type="Script" uid="uid://jsfpumv6bsd5" path="res://LevelSelectUtility/back_to_galaxy_button.gd" id="5_8ibvq"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ibity"] +bg_color = Color(0.688281, 0.599222, 0.142667, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0, 0, 0, 1) +corner_radius_top_left = 30 +corner_radius_top_right = 30 +corner_radius_bottom_right = 30 +corner_radius_bottom_left = 30 + +[node name="MainMenu" type="Node2D"] +texture_filter = 1 +script = ExtResource("1_h3vtm") + +[node name="Background" type="Sprite2D" parent="."] +position = Vector2(960, 540) +scale = Vector2(4, 4) +texture = ExtResource("1_sg3w2") + +[node name="World 1" parent="." instance=ExtResource("2_d8tt0")] +position = Vector2(500, 666) +world_file_name = "world 1" + +[node name="World 2" parent="." instance=ExtResource("2_d8tt0")] +position = Vector2(1067, 485) +inverted = true +world_file_name = "world 2" + +[node name="RichTextLabel" type="RichTextLabel" parent="."] +offset_left = 480.0 +offset_top = 100.0 +offset_right = 1440.0 +offset_bottom = 400.0 +theme_override_fonts/normal_font = ExtResource("3_d8tt0") +theme_override_font_sizes/normal_font_size = 100 +text = "Rund um die Welten +" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Quit_Button" type="Button" parent="."] +offset_left = 1537.0 +offset_top = 898.0 +offset_right = 1837.0 +offset_bottom = 998.0 +theme_override_fonts/font = ExtResource("3_d8tt0") +theme_override_font_sizes/font_size = 35 +theme_override_styles/normal = SubResource("StyleBoxFlat_ibity") +text = "Quit" +script = ExtResource("5_8ibvq") + +[node name="RichTextLabel2" type="RichTextLabel" parent="."] +offset_left = 460.0 +offset_top = 980.0 +offset_right = 1460.0 +offset_bottom = 1080.0 +theme_override_fonts/normal_font = ExtResource("3_d8tt0") +theme_override_font_sizes/normal_font_size = 30 +text = "made by Kurma, Phantomvines, Mr. FeatherWeather, Fydar +" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/rund-um-die-welten/LevelSelectUtility/back_to_galaxy_button.gd b/rund-um-die-welten/LevelSelectUtility/back_to_galaxy_button.gd new file mode 100644 index 0000000..98e1443 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/back_to_galaxy_button.gd @@ -0,0 +1,15 @@ +extends Button + +var rootfolder = "res://" +var subfolder = "LevelSelectUtility/" +func _ready(): + # Signal verbinden + self.pressed.connect(_on_pressed) + +func _on_pressed(): + var level_select_path = rootfolder + subfolder +"Main_Menu" + ".tscn" + if FileAccess.file_exists(level_select_path): + Audioplayer.play_sound((load("res://sfx/button_clicks.wav") as AudioStream)) + GlobalVariables.change_level(level_select_path, true) + else : + print("File not found under " + level_select_path) diff --git a/rund-um-die-welten/LevelSelectUtility/back_to_galaxy_button.gd.uid b/rund-um-die-welten/LevelSelectUtility/back_to_galaxy_button.gd.uid new file mode 100644 index 0000000..f3f754f --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/back_to_galaxy_button.gd.uid @@ -0,0 +1 @@ +uid://jsfpumv6bsd5 diff --git a/rund-um-die-welten/LevelSelectUtility/label.gd b/rund-um-die-welten/LevelSelectUtility/label.gd new file mode 100644 index 0000000..7ee7fa4 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/label.gd @@ -0,0 +1,4 @@ +extends Label + +func _physics_process(_delta: float) -> void: + text = "Death Count: " + str(GlobalVariables.death_counter) diff --git a/rund-um-die-welten/LevelSelectUtility/label.gd.uid b/rund-um-die-welten/LevelSelectUtility/label.gd.uid new file mode 100644 index 0000000..7b1896c --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/label.gd.uid @@ -0,0 +1 @@ +uid://cv3b0iuf5w5c2 diff --git a/rund-um-die-welten/LevelSelectUtility/level_planet_util.gd b/rund-um-die-welten/LevelSelectUtility/level_planet_util.gd new file mode 100644 index 0000000..3bd63e3 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/level_planet_util.gd @@ -0,0 +1,74 @@ +extends Control + + +@export var planet_type: GlobalVariables.planets: + get: + return $planet_body.planet_type + set(value): + $planet_body.planet_type = value +@export var level_id: String: + get: + return $planet_body.level_id + set(value): + $planet_body.level_id = value + $level_name_text.text = value +@export var planet_speed = 100 +@export var clockwise = true + +# for collectible rotating +var rotation_speed_in_deg = 30 +@export var collectibl_radius_margin = 40 +var collectible_radius = 100 +var collectable: PackedScene = preload("res://collectibles/collectible-icon.tscn") +var current_base_position_deg = 0 +var collectable_list = [] + +func scale_locations(planet_radius): + $level_name_text.position[1] = planet_radius + 20 + collectible_radius = planet_radius + collectibl_radius_margin + update_collectable_positions(0) + +func _ready(): + var number_collectibles = sum_array(GlobalVariables.collectibles[level_id]) + for i in range (number_collectibles): + var base_degree = 360 * float(i)/number_collectibles + spawn_collectable(base_degree) + +func sum_array(arr: Array) -> float: + var total = 0 + for value in arr: + total += value + return floor(total) + +func spawn_collectable(start_position_in_deg): + print("Spawning collectible at position " + str(start_position_in_deg) + " plus " + str(current_base_position_deg)) + + # Create instance + var collectable_instance = collectable.instantiate() + + # Create a vector pointing to the right with length equal to collectible_radius + var offset = Vector2(collectible_radius, 0) + + # Rotate it to the desired starting angle + var start_angle_rad = deg_to_rad(current_base_position_deg + start_position_in_deg) + offset = offset.rotated(start_angle_rad) + + # Set position relative to the center + collectable_instance.position = offset + + # Add to scene tree and list + add_child(collectable_instance) + collectable_list.append(collectable_instance) + + + +func _physics_process(delta: float) -> void: + update_collectable_positions(delta) + +func update_collectable_positions(delta: float): + # Convert rotation speed to radians per frame + var angular_speed_rad = deg_to_rad(rotation_speed_in_deg) * delta + current_base_position_deg += rotation_speed_in_deg * delta + + for i in collectable_list: + i.position = i.position.rotated(angular_speed_rad) diff --git a/rund-um-die-welten/LevelSelectUtility/level_planet_util.gd.uid b/rund-um-die-welten/LevelSelectUtility/level_planet_util.gd.uid new file mode 100644 index 0000000..d0ef41f --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/level_planet_util.gd.uid @@ -0,0 +1 @@ +uid://x3vheg2j1vqn diff --git a/rund-um-die-welten/LevelSelectUtility/level_select_planet.gd b/rund-um-die-welten/LevelSelectUtility/level_select_planet.gd new file mode 100644 index 0000000..4429a1b --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/level_select_planet.gd @@ -0,0 +1,142 @@ +extends Area2D + + +# for differentiating different planets +@export var planet_type: GlobalVariables.planets: + set(value): + planet_type = value + fit_planet_type(value) + +@export var level_id: String +var size_scale +var planet_base_radius = 10 +@export var grayscale = true + +func _ready() -> void: + input_pickable = true + var shape = $CollisionShape2D.shape + + # change size of collision area and animation based on which planet is chosen + fit_planet_type(planet_type) + + GlobalVariables.level_done.connect(planet_won) + + + +func fit_planet_type(new_planet_type): + # change size of collision area and animation based on which planet is chosen + match new_planet_type: + GlobalVariables.planets.DeathStar: + size_scale = 1.5 + $death_star.play("default") + $death_star.visible = true + $goal/mars_goal.visible = true + $rotation_indicator.radius = 30 + GlobalVariables.planets.Mars: + size_scale = 1.5 + $mars.play("default") + $mars.visible = true + $goal/mars_goal.visible = true + $rotation_indicator.radius = 30 + GlobalVariables.planets.Earth: + size_scale = 4.2 + $earth.play("default") + $earth.visible = true + $goal/earth_goal.visible = true + $rotation_indicator.radius = 55 + GlobalVariables.planets.Sun: + size_scale = 4.8 + $sun.play("default") + $sun.visible = true + $goal/sun_goal.visible = true + $rotation_indicator.radius = 65 + GlobalVariables.planets.Plant: + size_scale = 2.0 + $plant.play("default") + $plant.visible = true + $goal/plant_goal.visible = true + $rotation_indicator.radius = 30 + GlobalVariables.planets.Soap: + size_scale = 1.9 + $soap.play("default") + $soap.visible = true + $goal/plant_goal.visible = true + $rotation_indicator.radius = 30 + GlobalVariables.planets.Magma: + size_scale = 1.4 + $magma.play("default") + $magma.visible = true + $goal/mars_goal.visible = true + $rotation_indicator.radius = 30 + GlobalVariables.planets.Bowling: + size_scale = 1.5 + $bowling.play("default") + $bowling.visible = true + $goal/mars_goal.visible = true + $rotation_indicator.radius = 30 + + var shape = $CollisionShape2D.shape + shape.radius = planet_base_radius* size_scale + if get_parent(): + get_parent().scale_locations(planet_base_radius* size_scale * scale[0]) + + + +func planet_won(_win_message): + if GlobalVariables.selected_level == level_id: + grayscale = false + +func _input_event(_viewport, event, _shape_idx): + if event is InputEventMouseButton and event.pressed: + print("Level " + GlobalVariables.planet_names[planet_type] + " with ID " + level_id) + GlobalVariables.target_planet_position = get_parent().position + GlobalVariables.player_speed = get_parent().planet_speed + GlobalVariables.player_clockwise = get_parent().clockwise + GlobalVariables.selected_level = level_id + +func _physics_process(_delta: float) -> void: + # set target symbol to visible if current planet is targeted + if GlobalVariables.target_planet_position == global_position: + $target.visible = true + else: + $target.visible = false + + if GlobalVariables.levels[level_id] == 1: + grayscale = false + + if grayscale: + match planet_type: + GlobalVariables.planets.DeathStar: + $death_star.modulate = Color(0.3, 0.3, 0.3) + GlobalVariables.planets.Mars: + $mars.modulate = Color(0.3, 0.3, 0.3) + GlobalVariables.planets.Earth: + $earth.modulate = Color(0.3, 0.3, 0.3) + GlobalVariables.planets.Sun: + $sun.modulate = Color(0.3, 0.3, 0.3) + GlobalVariables.planets.Plant: + $plant.modulate = Color(0.3, 0.3, 0.3) + GlobalVariables.planets.Soap: + $soap.modulate = Color(0.3, 0.3, 0.3) + GlobalVariables.planets.Magma: + $magma.modulate = Color(0.3, 0.3, 0.3) + GlobalVariables.planets.Bowling: + $bowling.modulate = Color(0.3, 0.3, 0.3) + else: + match planet_type: + GlobalVariables.planets.DeathStar: + $death_star.modulate = Color(1.0, 1.0, 1.0) + GlobalVariables.planets.Mars: + $mars.modulate = Color(1.0, 1.0, 1.0) + GlobalVariables.planets.Earth: + $earth.modulate = Color(1.0, 1.0, 1.0) + GlobalVariables.planets.Sun: + $sun.modulate = Color(1.0, 1.0, 1.0) + GlobalVariables.planets.Plant: + $plant.modulate = Color(1.0, 1.0, 1.0) + GlobalVariables.planets.Soap: + $soap.modulate = Color(1.0, 1.0, 1.0) + GlobalVariables.planets.Magma: + $magma.modulate = Color(1.0, 1.0, 1.0) + GlobalVariables.planets.Bowling: + $bowling.modulate = Color(1.0, 1.0, 1.0) diff --git a/rund-um-die-welten/LevelSelectUtility/level_select_planet.gd.uid b/rund-um-die-welten/LevelSelectUtility/level_select_planet.gd.uid new file mode 100644 index 0000000..2921937 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/level_select_planet.gd.uid @@ -0,0 +1 @@ +uid://q7o5o8lnbdgx diff --git a/rund-um-die-welten/LevelSelectUtility/level_select_planet.tscn b/rund-um-die-welten/LevelSelectUtility/level_select_planet.tscn new file mode 100644 index 0000000..01e71c5 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/level_select_planet.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=5 format=3 uid="uid://c11b4i55gx3o5"] + +[ext_resource type="Script" uid="uid://x3vheg2j1vqn" path="res://LevelSelectUtility/level_planet_util.gd" id="1_d5qlm"] +[ext_resource type="Script" uid="uid://q7o5o8lnbdgx" path="res://LevelSelectUtility/level_select_planet.gd" id="1_m68cd"] +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="4_d5qlm"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="5_o652v"] + +[node name="Level-Select-Planet" type="Control"] +layout_mode = 3 +anchors_preset = 0 +script = ExtResource("1_d5qlm") + +[node name="planet_body" parent="." instance=ExtResource("5_o652v")] +script = ExtResource("1_m68cd") +level_id = "" +grayscale = true + +[node name="level_name_text" type="RichTextLabel" parent="."] +layout_mode = 0 +offset_left = -75.0 +offset_top = 50.0 +offset_right = 75.0 +offset_bottom = 70.0 +theme_override_fonts/normal_font = ExtResource("4_d5qlm") +theme_override_font_sizes/normal_font_size = 15 +text = "Level x" +scroll_active = false +horizontal_alignment = 1 diff --git a/rund-um-die-welten/LevelSelectUtility/level_select_planet.tscn1799240747.tmp b/rund-um-die-welten/LevelSelectUtility/level_select_planet.tscn1799240747.tmp new file mode 100644 index 0000000..c73c14f --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/level_select_planet.tscn1799240747.tmp @@ -0,0 +1,25 @@ +[gd_scene load_steps=4 format=3 uid="uid://c11b4i55gx3o5"] + +[ext_resource type="Script" uid="uid://q7o5o8lnbdgx" path="res://LevelSelectUtility/level_select_planet.gd" id="1_m68cd"] +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="4_d5qlm"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="5_o652v"] + +[node name="Level-Select-Planet" type="Control"] +layout_mode = 3 +anchors_preset = 0 +scale = Vector2(4, 4) + +[node name="RichTextLabel" type="RichTextLabel" parent="."] +offset_left = -75.0 +offset_top = 40.0 +offset_right = 75.0 +offset_bottom = 60.0 +theme_override_fonts/normal_font = ExtResource("4_d5qlm") +theme_override_font_sizes/normal_font_size = 15 +text = "Level x" +scroll_active = false +horizontal_alignment = 1 + +[node name="planet_v2" parent="." instance=ExtResource("5_o652v")] +script = ExtResource("1_m68cd") +level_id = "" diff --git a/rund-um-die-welten/LevelSelectUtility/level_select_planet.tscn3339783580.tmp b/rund-um-die-welten/LevelSelectUtility/level_select_planet.tscn3339783580.tmp new file mode 100644 index 0000000..e34c724 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/level_select_planet.tscn3339783580.tmp @@ -0,0 +1,44 @@ +[gd_scene load_steps=6 format=3 uid="uid://c11b4i55gx3o5"] + +[ext_resource type="Script" uid="uid://x3vheg2j1vqn" path="res://LevelSelectUtility/level_planet_util.gd" id="1_d5qlm"] +[ext_resource type="Script" uid="uid://q7o5o8lnbdgx" path="res://LevelSelectUtility/level_select_planet.gd" id="1_m68cd"] +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="4_d5qlm"] +[ext_resource type="PackedScene" uid="uid://dmfmk86fb3akt" path="res://collectibles/collectible-icon.tscn" id="5_nkaah"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="5_o652v"] + +[node name="Level-Select-Planet" type="Control"] +layout_mode = 3 +anchors_preset = 0 +script = ExtResource("1_d5qlm") + +[node name="planet_body" parent="." instance=ExtResource("5_o652v")] +script = ExtResource("1_m68cd") +level_id = "" +grayscale = true + +[node name="level_name_text" type="RichTextLabel" parent="."] +layout_mode = 0 +offset_left = -75.0 +offset_top = 50.0 +offset_right = 75.0 +offset_bottom = 70.0 +theme_override_fonts/normal_font = ExtResource("4_d5qlm") +theme_override_font_sizes/normal_font_size = 15 +text = "Level x" +scroll_active = false +horizontal_alignment = 1 + +[node name="collectible0" parent="." instance=ExtResource("5_nkaah")] +visible = false +position = Vector2(-70, 0) +scale = Vector2(2, 2) + +[node name="collectible1" parent="." instance=ExtResource("5_nkaah")] +visible = false +position = Vector2(0, -70) +scale = Vector2(2, 2) + +[node name="collectible2" parent="." instance=ExtResource("5_nkaah")] +visible = false +position = Vector2(70, 0) +scale = Vector2(2, 2) diff --git a/rund-um-die-welten/LevelSelectUtility/level_select_screen.tscn b/rund-um-die-welten/LevelSelectUtility/level_select_screen.tscn new file mode 100644 index 0000000..c5473f2 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/level_select_screen.tscn @@ -0,0 +1,195 @@ +[gd_scene load_steps=11 format=3 uid="uid://dqkhet02da1rw"] + +[ext_resource type="PackedScene" uid="uid://c11b4i55gx3o5" path="res://LevelSelectUtility/level_select_planet.tscn" id="1_offx3"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_iojkr"] +[ext_resource type="Script" uid="uid://dnqvks40xcnq8" path="res://LevelSelectUtility/selection_cofirm_button.gd" id="3_iojkr"] +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="3_m787v"] +[ext_resource type="Texture2D" uid="uid://dj3nxkkx8gvre" path="res://assets/enterprise1.png" id="5_7xgfl"] +[ext_resource type="Script" uid="uid://djyqftdc3hb27" path="res://LevelSelectUtility/unlock-button.gd" id="5_v3ic8"] +[ext_resource type="PackedScene" path="res://UI Elements/menu_background.tscn" id="7_avbc4"] +[ext_resource type="Script" uid="uid://cv3b0iuf5w5c2" path="res://LevelSelectUtility/label.gd" id="8_ygamd"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_v3ic8"] +bg_color = Color(0.688281, 0.599222, 0.142667, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0, 0, 0, 1) +corner_radius_top_left = 30 +corner_radius_top_right = 30 +corner_radius_bottom_right = 30 +corner_radius_bottom_left = 30 + +[sub_resource type="LabelSettings" id="LabelSettings_avbc4"] +font = ExtResource("3_m787v") +font_size = 32 + +[node name="Level-Select-Screen" type="Node2D"] + +[node name="menu_background" parent="." instance=ExtResource("7_avbc4")] + +[node name="Level-Select-Planet6" parent="." instance=ExtResource("1_offx3")] +offset_left = 282.0 +offset_top = 276.0 +offset_right = 282.0 +offset_bottom = 276.0 +level_id = "Level 1" + +[node name="Level-Select-Planet3" parent="." instance=ExtResource("1_offx3")] +offset_left = 545.0 +offset_top = 299.0 +offset_right = 545.0 +offset_bottom = 299.0 +level_id = "Level 2" +clockwise = false + +[node name="Level-Select-Planet" parent="." instance=ExtResource("1_offx3")] +offset_left = 1029.0 +offset_top = 324.0 +offset_right = 1029.0 +offset_bottom = 324.0 +planet_type = 2 +level_id = "Level 3" +clockwise = false + +[node name="Level-Select-Planet7" parent="." instance=ExtResource("1_offx3")] +offset_left = 1466.0 +offset_top = 238.0 +offset_right = 1466.0 +offset_bottom = 238.0 +level_id = "Level 4" + +[node name="Level-Select-Planet4" parent="." instance=ExtResource("1_offx3")] +offset_left = 1471.0 +offset_top = 484.0 +offset_right = 1471.0 +offset_bottom = 484.0 +level_id = "Level 5" + +[node name="Level-Select-Planet5" parent="." instance=ExtResource("1_offx3")] +offset_left = 1402.0 +offset_top = 670.0 +offset_right = 1402.0 +offset_bottom = 670.0 +level_id = "Level 6" + +[node name="Level-Select-Planet2" parent="." instance=ExtResource("1_offx3")] +offset_left = 1107.0 +offset_top = 726.0 +offset_right = 1107.0 +offset_bottom = 726.0 +level_id = "Level 7" +clockwise = false + +[node name="Level-Select-Planet8" parent="." instance=ExtResource("1_offx3")] +offset_left = 825.0 +offset_top = 705.0 +offset_right = 825.0 +offset_bottom = 705.0 +level_id = "Level 8" + +[node name="Level-Select-Planet9" parent="." instance=ExtResource("1_offx3")] +offset_left = 601.0 +offset_top = 609.0 +offset_right = 601.0 +offset_bottom = 609.0 +level_id = "Level 9" + +[node name="Level-Select-Planet10" parent="." instance=ExtResource("1_offx3")] +offset_left = 345.0 +offset_top = 705.0 +offset_right = 345.0 +offset_bottom = 705.0 +level_id = "Level 10" + +[node name="player" parent="." instance=ExtResource("2_iojkr")] +position = Vector2(396, 473) +dies_on_screen_leave = true +respawn_point = Vector2(250, 500) +auto_respawn = true + +[node name="SelectionCofirmButton" type="Button" parent="."] +offset_left = 251.0 +offset_top = 898.0 +offset_right = 1688.0 +offset_bottom = 1043.0 +theme_override_fonts/font = ExtResource("3_m787v") +theme_override_font_sizes/font_size = 70 +theme_override_styles/normal = SubResource("StyleBoxFlat_v3ic8") +text = "Confirm Level Selection" +script = ExtResource("3_iojkr") + +[node name="Enterpise-Button" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 32.0 +offset_right = 1763.0 +offset_bottom = 72.0 +text = "3" +icon = ExtResource("5_7xgfl") +script = ExtResource("5_v3ic8") + +[node name="Enterpise-Button2" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 192.0 +offset_right = 1763.0 +offset_bottom = 232.0 +text = "3" +icon = ExtResource("5_7xgfl") +script = ExtResource("5_v3ic8") +threshold = 6 +skin = "x-wing" + +[node name="Enterpise-Button3" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 356.0 +offset_right = 1763.0 +offset_bottom = 396.0 +text = "3" +icon = ExtResource("5_7xgfl") +script = ExtResource("5_v3ic8") +threshold = 12 +skin = "enterprise" + +[node name="Enterpise-Button4" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 512.0 +offset_right = 1763.0 +offset_bottom = 552.0 +text = "3" +icon = ExtResource("5_7xgfl") +script = ExtResource("5_v3ic8") +threshold = 18 +skin = "falcon" + +[node name="Enterpise-Button5" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 672.0 +offset_right = 1763.0 +offset_bottom = 712.0 +text = "3" +icon = ExtResource("5_7xgfl") +script = ExtResource("5_v3ic8") +threshold = 24 +skin = "battlecruiser" + +[node name="Enterpise-Button6" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 832.0 +offset_right = 1763.0 +offset_bottom = 872.0 +text = "3" +icon = ExtResource("5_7xgfl") +script = ExtResource("5_v3ic8") +threshold = 30 +skin = "enterprise" + +[node name="Label" type="Label" parent="."] +texture_filter = 1 +offset_left = 26.0 +offset_top = 20.0 +offset_right = 351.0 +offset_bottom = 51.0 +text = "Death Count: 0" +label_settings = SubResource("LabelSettings_avbc4") +script = ExtResource("8_ygamd") diff --git a/rund-um-die-welten/LevelSelectUtility/level_select_screen.tscn1782568337.tmp b/rund-um-die-welten/LevelSelectUtility/level_select_screen.tscn1782568337.tmp new file mode 100644 index 0000000..9d5cc07 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/level_select_screen.tscn1782568337.tmp @@ -0,0 +1,82 @@ +[gd_scene load_steps=6 format=3 uid="uid://c242dsi7lnqqb"] + +[ext_resource type="PackedScene" uid="uid://c11b4i55gx3o5" path="res://LevelSelectUtility/level_select_planet.tscn" id="1_offx3"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_iojkr"] +[ext_resource type="Script" uid="uid://dnqvks40xcnq8" path="res://LevelSelectUtility/selection_cofirm_button.gd" id="3_iojkr"] +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="3_m787v"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_v3ic8"] +bg_color = Color(0.688281, 0.599222, 0.142667, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0, 0, 0, 1) +corner_radius_top_left = 30 +corner_radius_top_right = 30 +corner_radius_bottom_right = 30 +corner_radius_bottom_left = 30 + +[node name="Level-Select-Screen" type="Node2D"] + +[node name="Level-Select-Planet" parent="." instance=ExtResource("1_offx3")] +offset_left = 1029.0 +offset_top = 324.0 +offset_right = 1029.0 +offset_bottom = 324.0 +level_id = "Level 3" + +[node name="Level-Select-Planet2" parent="." instance=ExtResource("1_offx3")] +offset_left = 1395.0 +offset_top = 406.0 +offset_right = 1395.0 +offset_bottom = 406.0 +planet_type = 1 +level_id = "Level 5" + +[node name="Level-Select-Planet3" parent="." instance=ExtResource("1_offx3")] +offset_left = 545.0 +offset_top = 299.0 +offset_right = 545.0 +offset_bottom = 299.0 +level_id = "Level 2" + +[node name="Level-Select-Planet4" parent="." instance=ExtResource("1_offx3")] +offset_left = 927.0 +offset_top = 612.0 +offset_right = 927.0 +offset_bottom = 612.0 +planet_type = 1 +level_id = "Level 4" + +[node name="Level-Select-Planet5" parent="." instance=ExtResource("1_offx3")] +offset_left = 1466.0 +offset_top = 672.0 +offset_right = 1466.0 +offset_bottom = 672.0 +planet_type = 1 +level_id = "Level 6" + +[node name="player" parent="." instance=ExtResource("2_iojkr")] +position = Vector2(396, 473) +dies_on_screen_leave = true +respawn_point = Vector2(250, 500) +auto_respawn = true + +[node name="Level-Select-Planet6" parent="." instance=ExtResource("1_offx3")] +offset_left = 250.0 +offset_top = 500.0 +offset_right = 250.0 +offset_bottom = 500.0 +level_id = "Level 1" + +[node name="SelectionCofirmButton" type="Button" parent="."] +offset_left = 251.0 +offset_top = 898.0 +offset_right = 1688.0 +offset_bottom = 1043.0 +theme_override_fonts/font = ExtResource("3_m787v") +theme_override_font_sizes/font_size = 70 +theme_override_styles/normal = SubResource("StyleBoxFlat_v3ic8") +text = "Confirm Level Selection" +script = ExtResource("3_iojkr") diff --git a/rund-um-die-welten/LevelSelectUtility/level_select_screen_world_2.tscn b/rund-um-die-welten/LevelSelectUtility/level_select_screen_world_2.tscn new file mode 100644 index 0000000..e39def3 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/level_select_screen_world_2.tscn @@ -0,0 +1,203 @@ +[gd_scene load_steps=11 format=3 uid="uid://ov4u4ocicilx"] + +[ext_resource type="PackedScene" path="res://UI Elements/menu_background.tscn" id="1_25d63"] +[ext_resource type="PackedScene" uid="uid://c11b4i55gx3o5" path="res://LevelSelectUtility/level_select_planet.tscn" id="2_jeu1d"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_8hmgf"] +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="4_bydni"] +[ext_resource type="Script" uid="uid://dnqvks40xcnq8" path="res://LevelSelectUtility/selection_cofirm_button.gd" id="5_galr1"] +[ext_resource type="Texture2D" uid="uid://dj3nxkkx8gvre" path="res://assets/enterprise1.png" id="6_4jafe"] +[ext_resource type="Script" uid="uid://djyqftdc3hb27" path="res://LevelSelectUtility/unlock-button.gd" id="7_iltjk"] +[ext_resource type="Script" uid="uid://cv3b0iuf5w5c2" path="res://LevelSelectUtility/label.gd" id="8_g1qv7"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_v3ic8"] +bg_color = Color(0.688281, 0.599222, 0.142667, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0, 0, 0, 1) +corner_radius_top_left = 30 +corner_radius_top_right = 30 +corner_radius_bottom_right = 30 +corner_radius_bottom_left = 30 + +[sub_resource type="LabelSettings" id="LabelSettings_avbc4"] +font = ExtResource("4_bydni") +font_size = 32 + +[node name="Level-Select-Screen" type="Node2D"] + +[node name="menu_background" parent="." instance=ExtResource("1_25d63")] + +[node name="Level-Select-Planet6" parent="." instance=ExtResource("2_jeu1d")] +offset_left = 414.0 +offset_top = 188.0 +offset_right = 414.0 +offset_bottom = 188.0 +planet_type = 4 +level_id = "Level 11" + +[node name="Level-Select-Planet3" parent="." instance=ExtResource("2_jeu1d")] +offset_left = 446.0 +offset_top = 426.0 +offset_right = 446.0 +offset_bottom = 426.0 +planet_type = 5 +level_id = "Level 12" +clockwise = false + +[node name="Level-Select-Planet" parent="." instance=ExtResource("2_jeu1d")] +offset_left = 840.0 +offset_top = 205.0 +offset_right = 840.0 +offset_bottom = 205.0 +planet_type = 1 +level_id = "Level 13" +clockwise = false + +[node name="Level-Select-Planet7" parent="." instance=ExtResource("2_jeu1d")] +offset_left = 1552.0 +offset_top = 355.0 +offset_right = 1552.0 +offset_bottom = 355.0 +planet_type = 1 +level_id = "Level 14" + +[node name="Level-Select-Planet4" parent="." instance=ExtResource("2_jeu1d")] +offset_left = 1367.0 +offset_top = 588.0 +offset_right = 1367.0 +offset_bottom = 588.0 +planet_type = 5 +level_id = "Level 15" + +[node name="Level-Select-Planet5" parent="." instance=ExtResource("2_jeu1d")] +offset_left = 1386.0 +offset_top = 787.0 +offset_right = 1386.0 +offset_bottom = 787.0 +level_id = "Level 16" + +[node name="Level-Select-Planet2" parent="." instance=ExtResource("2_jeu1d")] +offset_left = 954.0 +offset_top = 806.0 +offset_right = 954.0 +offset_bottom = 806.0 +planet_type = 7 +level_id = "Level 17" +clockwise = false + +[node name="Level-Select-Planet8" parent="." instance=ExtResource("2_jeu1d")] +offset_left = 856.0 +offset_top = 525.0 +offset_right = 856.0 +offset_bottom = 525.0 +planet_type = 3 +level_id = "Level 18" + +[node name="Level-Select-Planet9" parent="." instance=ExtResource("2_jeu1d")] +offset_left = 1151.0 +offset_top = 313.0 +offset_right = 1151.0 +offset_bottom = 313.0 +planet_type = 7 +level_id = "Level 19" + +[node name="Level-Select-Planet10" parent="." instance=ExtResource("2_jeu1d")] +offset_left = 560.0 +offset_top = 788.0 +offset_right = 560.0 +offset_bottom = 788.0 +planet_type = 6 +level_id = "Level 20" + +[node name="player" parent="." instance=ExtResource("3_8hmgf")] +position = Vector2(238, 481) +dies_on_screen_leave = true +respawn_point = Vector2(250, 500) +auto_respawn = true + +[node name="SelectionCofirmButton" type="Button" parent="."] +offset_left = 251.0 +offset_top = 898.0 +offset_right = 1688.0 +offset_bottom = 1043.0 +theme_override_fonts/font = ExtResource("4_bydni") +theme_override_font_sizes/font_size = 70 +theme_override_styles/normal = SubResource("StyleBoxFlat_v3ic8") +text = "Confirm Level Selection" +script = ExtResource("5_galr1") + +[node name="Enterpise-Button" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 32.0 +offset_right = 1763.0 +offset_bottom = 72.0 +text = "3" +icon = ExtResource("6_4jafe") +script = ExtResource("7_iltjk") + +[node name="Enterpise-Button2" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 192.0 +offset_right = 1763.0 +offset_bottom = 232.0 +text = "3" +icon = ExtResource("6_4jafe") +script = ExtResource("7_iltjk") +threshold = 6 +skin = "x-wing" + +[node name="Enterpise-Button3" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 356.0 +offset_right = 1763.0 +offset_bottom = 396.0 +text = "3" +icon = ExtResource("6_4jafe") +script = ExtResource("7_iltjk") +threshold = 12 +skin = "enterprise" + +[node name="Enterpise-Button4" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 512.0 +offset_right = 1763.0 +offset_bottom = 552.0 +text = "3" +icon = ExtResource("6_4jafe") +script = ExtResource("7_iltjk") +threshold = 18 +skin = "falcon" + +[node name="Enterpise-Button5" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 672.0 +offset_right = 1763.0 +offset_bottom = 712.0 +text = "3" +icon = ExtResource("6_4jafe") +script = ExtResource("7_iltjk") +threshold = 24 +skin = "battlecruiser" + +[node name="Enterpise-Button6" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 832.0 +offset_right = 1763.0 +offset_bottom = 872.0 +text = "3" +icon = ExtResource("6_4jafe") +script = ExtResource("7_iltjk") +threshold = 30 +skin = "enterprise" + +[node name="Label" type="Label" parent="."] +texture_filter = 1 +offset_left = 26.0 +offset_top = 20.0 +offset_right = 351.0 +offset_bottom = 51.0 +text = "Death Count: 0" +label_settings = SubResource("LabelSettings_avbc4") +script = ExtResource("8_g1qv7") diff --git a/rund-um-die-welten/LevelSelectUtility/main_menu.gd b/rund-um-die-welten/LevelSelectUtility/main_menu.gd new file mode 100644 index 0000000..315de67 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/main_menu.gd @@ -0,0 +1,12 @@ +extends Node2D + +func _ready() -> void: + GlobalVariables.play_music() + # Access the button using its name + var button = $Quit_Button + + # Connect the "pressed" signal to a function in this script + button.pressed.connect(_on_button_pressed) + +func _on_button_pressed(): + get_tree().quit() diff --git a/rund-um-die-welten/LevelSelectUtility/main_menu.gd.uid b/rund-um-die-welten/LevelSelectUtility/main_menu.gd.uid new file mode 100644 index 0000000..d175bdb --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/main_menu.gd.uid @@ -0,0 +1 @@ +uid://fey1vlc3fki diff --git a/rund-um-die-welten/LevelSelectUtility/selection_cofirm_button.gd b/rund-um-die-welten/LevelSelectUtility/selection_cofirm_button.gd new file mode 100644 index 0000000..b9b6201 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/selection_cofirm_button.gd @@ -0,0 +1,16 @@ +extends Button + +var rootfolder = "res://" +var subfolder = "Levels/" +func _ready(): + # Signal verbinden + self.pressed.connect(_on_pressed) + +func _on_pressed(): + print("Selected Level is " + GlobalVariables.selected_level) + var level_select_path = rootfolder + subfolder + GlobalVariables.selected_level + ".tscn" + if FileAccess.file_exists(level_select_path): + Audioplayer.play_sound((load("res://sfx/button_clicks.wav") as AudioStream)) + GlobalVariables.change_level(level_select_path) + else : + print("File not found under " + level_select_path) diff --git a/rund-um-die-welten/LevelSelectUtility/selection_cofirm_button.gd.uid b/rund-um-die-welten/LevelSelectUtility/selection_cofirm_button.gd.uid new file mode 100644 index 0000000..18f9508 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/selection_cofirm_button.gd.uid @@ -0,0 +1 @@ +uid://dnqvks40xcnq8 diff --git a/rund-um-die-welten/LevelSelectUtility/unlock-button.gd b/rund-um-die-welten/LevelSelectUtility/unlock-button.gd new file mode 100644 index 0000000..21e6f22 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/unlock-button.gd @@ -0,0 +1,60 @@ +extends Button + +@export var threshold = 0 +var unlocked = false +@export var skin = "default" #enterpise, x-wing + +#find number of collectables +func _ready(): + check_unlock() + update_icon() + update_text() + connect("pressed", Callable(self, "_on_pressed")) + +func check_unlock(): + var total = 0 + for level in GlobalVariables.collectibles.keys(): + for value in GlobalVariables.collectibles[level]: + total += value + + if total >= threshold: + unlocked = true + disabled = false + else: + unlocked = false + disabled = true + +func _on_pressed(): + if unlocked: + Audioplayer.play_sound((load("res://sfx/button_clicks.wav") as AudioStream)) + GlobalVariables.player_skin = skin + +func update_icon(): + match skin: + "default": + icon = load_scaled_icon("res://assets/rocket1.png") + "x-wing": + icon = load_scaled_icon("res://assets/x-wing1.png") + "enterprise": + icon = load_scaled_icon("res://assets/enterprise1.png") + "sputnik": + icon = load_scaled_icon("res://assets/sputnik.png") + "falcon": + icon = load_scaled_icon("res://assets/falcon1.png") + "battlecruiser": + icon = load_scaled_icon("res://assets/battlecruiser1.png") + _: + icon = null + +func load_scaled_icon(path: String) -> Texture2D: + var icon_scale = 4 + var img = load(path).get_image() + img.resize(img.get_width() * icon_scale, img.get_height() * icon_scale, Image.INTERPOLATE_NEAREST) + var tex = ImageTexture.create_from_image(img) + return tex + +func update_text(): + text = str(threshold) + if threshold < 9: + text = "0" + text + add_theme_font_size_override("font_size", 60) diff --git a/rund-um-die-welten/LevelSelectUtility/unlock-button.gd.uid b/rund-um-die-welten/LevelSelectUtility/unlock-button.gd.uid new file mode 100644 index 0000000..11fc91d --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/unlock-button.gd.uid @@ -0,0 +1 @@ +uid://djyqftdc3hb27 diff --git a/rund-um-die-welten/LevelSelectUtility/world 1.tscn b/rund-um-die-welten/LevelSelectUtility/world 1.tscn new file mode 100644 index 0000000..526d56d --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/world 1.tscn @@ -0,0 +1,220 @@ +[gd_scene load_steps=13 format=3 uid="uid://cmkq2o30yiefk"] + +[ext_resource type="PackedScene" path="res://UI Elements/menu_background.tscn" id="1_03edo"] +[ext_resource type="PackedScene" uid="uid://c11b4i55gx3o5" path="res://LevelSelectUtility/level_select_planet.tscn" id="2_ywexb"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_dtlly"] +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="4_ht4d8"] +[ext_resource type="Script" uid="uid://dnqvks40xcnq8" path="res://LevelSelectUtility/selection_cofirm_button.gd" id="5_1ixqv"] +[ext_resource type="Texture2D" uid="uid://dj3nxkkx8gvre" path="res://assets/enterprise1.png" id="6_yxkf4"] +[ext_resource type="Script" uid="uid://djyqftdc3hb27" path="res://LevelSelectUtility/unlock-button.gd" id="7_tnt4d"] +[ext_resource type="Script" uid="uid://cv3b0iuf5w5c2" path="res://LevelSelectUtility/label.gd" id="8_8445k"] +[ext_resource type="Script" uid="uid://jsfpumv6bsd5" path="res://LevelSelectUtility/back_to_galaxy_button.gd" id="9_yneq5"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_v3ic8"] +bg_color = Color(0.688281, 0.599222, 0.142667, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0, 0, 0, 1) +corner_radius_top_left = 30 +corner_radius_top_right = 30 +corner_radius_bottom_right = 30 +corner_radius_bottom_left = 30 + +[sub_resource type="LabelSettings" id="LabelSettings_avbc4"] +font = ExtResource("4_ht4d8") +font_size = 32 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ygamd"] +bg_color = Color(0.688281, 0.599222, 0.142667, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0, 0, 0, 1) +corner_radius_top_left = 30 +corner_radius_top_right = 30 +corner_radius_bottom_right = 30 +corner_radius_bottom_left = 30 + +[node name="Level-Select-Screen2" type="Node2D"] + +[node name="menu_background" parent="." instance=ExtResource("1_03edo")] + +[node name="Level-Select-Planet6" parent="." instance=ExtResource("2_ywexb")] +offset_left = 282.0 +offset_top = 276.0 +offset_right = 282.0 +offset_bottom = 276.0 +level_id = "Level 1" + +[node name="Level-Select-Planet3" parent="." instance=ExtResource("2_ywexb")] +offset_left = 545.0 +offset_top = 299.0 +offset_right = 545.0 +offset_bottom = 299.0 +level_id = "Level 2" +clockwise = false + +[node name="Level-Select-Planet" parent="." instance=ExtResource("2_ywexb")] +offset_left = 1029.0 +offset_top = 324.0 +offset_right = 1029.0 +offset_bottom = 324.0 +planet_type = 2 +level_id = "Level 3" +clockwise = false + +[node name="Level-Select-Planet7" parent="." instance=ExtResource("2_ywexb")] +offset_left = 1466.0 +offset_top = 238.0 +offset_right = 1466.0 +offset_bottom = 238.0 +level_id = "Level 4" + +[node name="Level-Select-Planet4" parent="." instance=ExtResource("2_ywexb")] +offset_left = 1471.0 +offset_top = 484.0 +offset_right = 1471.0 +offset_bottom = 484.0 +level_id = "Level 5" + +[node name="Level-Select-Planet5" parent="." instance=ExtResource("2_ywexb")] +offset_left = 1402.0 +offset_top = 670.0 +offset_right = 1402.0 +offset_bottom = 670.0 +level_id = "Level 6" + +[node name="Level-Select-Planet2" parent="." instance=ExtResource("2_ywexb")] +offset_left = 1107.0 +offset_top = 726.0 +offset_right = 1107.0 +offset_bottom = 726.0 +level_id = "Level 7" +clockwise = false + +[node name="Level-Select-Planet8" parent="." instance=ExtResource("2_ywexb")] +offset_left = 825.0 +offset_top = 705.0 +offset_right = 825.0 +offset_bottom = 705.0 +level_id = "Level 8" + +[node name="Level-Select-Planet9" parent="." instance=ExtResource("2_ywexb")] +offset_left = 601.0 +offset_top = 609.0 +offset_right = 601.0 +offset_bottom = 609.0 +level_id = "Level 9" + +[node name="Level-Select-Planet10" parent="." instance=ExtResource("2_ywexb")] +offset_left = 345.0 +offset_top = 705.0 +offset_right = 345.0 +offset_bottom = 705.0 +level_id = "Level 10" + +[node name="player" parent="." instance=ExtResource("3_dtlly")] +position = Vector2(396, 473) +dies_on_screen_leave = true +respawn_point = Vector2(250, 500) +auto_respawn = true + +[node name="SelectionCofirmButton" type="Button" parent="."] +offset_left = 251.0 +offset_top = 898.0 +offset_right = 1688.0 +offset_bottom = 1043.0 +theme_override_fonts/font = ExtResource("4_ht4d8") +theme_override_font_sizes/font_size = 70 +theme_override_styles/normal = SubResource("StyleBoxFlat_v3ic8") +text = "Confirm Level Selection" +script = ExtResource("5_1ixqv") + +[node name="Enterpise-Button" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 32.0 +offset_right = 1763.0 +offset_bottom = 72.0 +text = "3" +icon = ExtResource("6_yxkf4") +script = ExtResource("7_tnt4d") + +[node name="Enterpise-Button2" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 192.0 +offset_right = 1763.0 +offset_bottom = 232.0 +text = "3" +icon = ExtResource("6_yxkf4") +script = ExtResource("7_tnt4d") +threshold = 6 +skin = "x-wing" + +[node name="Enterpise-Button3" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 356.0 +offset_right = 1763.0 +offset_bottom = 396.0 +text = "3" +icon = ExtResource("6_yxkf4") +script = ExtResource("7_tnt4d") +threshold = 12 +skin = "enterprise" + +[node name="Enterpise-Button4" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 512.0 +offset_right = 1763.0 +offset_bottom = 552.0 +text = "3" +icon = ExtResource("6_yxkf4") +script = ExtResource("7_tnt4d") +threshold = 18 +skin = "falcon" + +[node name="Enterpise-Button5" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 672.0 +offset_right = 1763.0 +offset_bottom = 712.0 +text = "3" +icon = ExtResource("6_yxkf4") +script = ExtResource("7_tnt4d") +threshold = 24 +skin = "battlecruiser" + +[node name="Enterpise-Button6" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 832.0 +offset_right = 1763.0 +offset_bottom = 872.0 +text = "3" +icon = ExtResource("6_yxkf4") +script = ExtResource("7_tnt4d") +threshold = 30 +skin = "enterprise" + +[node name="Label" type="Label" parent="."] +texture_filter = 1 +offset_left = 26.0 +offset_top = 20.0 +offset_right = 351.0 +offset_bottom = 51.0 +text = "Death Count: 0" +label_settings = SubResource("LabelSettings_avbc4") +script = ExtResource("8_8445k") + +[node name="Back_to_Galaxy_Button" type="Button" parent="."] +offset_left = 25.0 +offset_top = 490.0 +offset_right = 325.0 +offset_bottom = 590.0 +theme_override_fonts/font = ExtResource("4_ht4d8") +theme_override_font_sizes/font_size = 35 +theme_override_styles/normal = SubResource("StyleBoxFlat_ygamd") +text = "Back to +the galaxy" +script = ExtResource("9_yneq5") diff --git a/rund-um-die-welten/LevelSelectUtility/world 2.tscn b/rund-um-die-welten/LevelSelectUtility/world 2.tscn new file mode 100644 index 0000000..0079b8d --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/world 2.tscn @@ -0,0 +1,216 @@ +[gd_scene load_steps=12 format=3 uid="uid://4dh5ynq05rq8"] + +[ext_resource type="PackedScene" path="res://UI Elements/menu_background.tscn" id="1_l3hcs"] +[ext_resource type="PackedScene" uid="uid://c11b4i55gx3o5" path="res://LevelSelectUtility/level_select_planet.tscn" id="2_xnhxt"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_o15yf"] +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="4_21fe5"] +[ext_resource type="Script" uid="uid://dnqvks40xcnq8" path="res://LevelSelectUtility/selection_cofirm_button.gd" id="5_ig01f"] +[ext_resource type="Script" uid="uid://jsfpumv6bsd5" path="res://LevelSelectUtility/back_to_galaxy_button.gd" id="6_evgly"] +[ext_resource type="Texture2D" uid="uid://dj3nxkkx8gvre" path="res://assets/enterprise1.png" id="7_fmbcg"] +[ext_resource type="Script" uid="uid://djyqftdc3hb27" path="res://LevelSelectUtility/unlock-button.gd" id="8_m0m58"] +[ext_resource type="Script" uid="uid://cv3b0iuf5w5c2" path="res://LevelSelectUtility/label.gd" id="9_8hib7"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_v3ic8"] +bg_color = Color(0.688281, 0.599222, 0.142667, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0, 0, 0, 1) +corner_radius_top_left = 30 +corner_radius_top_right = 30 +corner_radius_bottom_right = 30 +corner_radius_bottom_left = 30 + +[sub_resource type="LabelSettings" id="LabelSettings_avbc4"] +font = ExtResource("4_21fe5") +font_size = 32 + +[node name="Level-Select-Screen" type="Node2D"] + +[node name="menu_background" parent="." instance=ExtResource("1_l3hcs")] + +[node name="Level-Select-Planet6" parent="." instance=ExtResource("2_xnhxt")] +offset_left = 414.0 +offset_top = 188.0 +offset_right = 414.0 +offset_bottom = 188.0 +planet_type = 4 +level_id = "Level 11" + +[node name="Level-Select-Planet3" parent="." instance=ExtResource("2_xnhxt")] +offset_left = 446.0 +offset_top = 426.0 +offset_right = 446.0 +offset_bottom = 426.0 +planet_type = 5 +level_id = "Level 12" +clockwise = false + +[node name="Level-Select-Planet" parent="." instance=ExtResource("2_xnhxt")] +offset_left = 840.0 +offset_top = 205.0 +offset_right = 840.0 +offset_bottom = 205.0 +planet_type = 1 +level_id = "Level 13" +clockwise = false + +[node name="Level-Select-Planet7" parent="." instance=ExtResource("2_xnhxt")] +offset_left = 1552.0 +offset_top = 355.0 +offset_right = 1552.0 +offset_bottom = 355.0 +planet_type = 1 +level_id = "Level 14" + +[node name="Level-Select-Planet4" parent="." instance=ExtResource("2_xnhxt")] +offset_left = 1367.0 +offset_top = 588.0 +offset_right = 1367.0 +offset_bottom = 588.0 +planet_type = 5 +level_id = "Level 15" + +[node name="Level-Select-Planet5" parent="." instance=ExtResource("2_xnhxt")] +offset_left = 1386.0 +offset_top = 787.0 +offset_right = 1386.0 +offset_bottom = 787.0 +level_id = "Level 16" + +[node name="Level-Select-Planet2" parent="." instance=ExtResource("2_xnhxt")] +offset_left = 954.0 +offset_top = 806.0 +offset_right = 954.0 +offset_bottom = 806.0 +planet_type = 7 +level_id = "Level 17" +clockwise = false + +[node name="Level-Select-Planet8" parent="." instance=ExtResource("2_xnhxt")] +offset_left = 856.0 +offset_top = 525.0 +offset_right = 856.0 +offset_bottom = 525.0 +planet_type = 3 +level_id = "Level 18" + +[node name="Level-Select-Planet9" parent="." instance=ExtResource("2_xnhxt")] +offset_left = 1151.0 +offset_top = 313.0 +offset_right = 1151.0 +offset_bottom = 313.0 +planet_type = 7 +level_id = "Level 19" + +[node name="Level-Select-Planet10" parent="." instance=ExtResource("2_xnhxt")] +offset_left = 560.0 +offset_top = 788.0 +offset_right = 560.0 +offset_bottom = 788.0 +planet_type = 6 +level_id = "Level 20" + +[node name="player" parent="." instance=ExtResource("3_o15yf")] +position = Vector2(609, 444) +dies_on_screen_leave = true +respawn_point = Vector2(250, 500) +auto_respawn = true + +[node name="SelectionCofirmButton" type="Button" parent="."] +offset_left = 251.0 +offset_top = 898.0 +offset_right = 1688.0 +offset_bottom = 1043.0 +theme_override_fonts/font = ExtResource("4_21fe5") +theme_override_font_sizes/font_size = 70 +theme_override_styles/normal = SubResource("StyleBoxFlat_v3ic8") +text = "Confirm Level Selection" +script = ExtResource("5_ig01f") + +[node name="Back_to_Galaxy_Button" type="Button" parent="."] +offset_left = 25.0 +offset_top = 490.0 +offset_right = 325.0 +offset_bottom = 590.0 +theme_override_fonts/font = ExtResource("4_21fe5") +theme_override_font_sizes/font_size = 35 +theme_override_styles/normal = SubResource("StyleBoxFlat_v3ic8") +text = "Back to +the galaxy" +script = ExtResource("6_evgly") + +[node name="Enterpise-Button" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 32.0 +offset_right = 1763.0 +offset_bottom = 72.0 +text = "3" +icon = ExtResource("7_fmbcg") +script = ExtResource("8_m0m58") + +[node name="Enterpise-Button2" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 192.0 +offset_right = 1763.0 +offset_bottom = 232.0 +text = "3" +icon = ExtResource("7_fmbcg") +script = ExtResource("8_m0m58") +threshold = 6 +skin = "x-wing" + +[node name="Enterpise-Button3" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 356.0 +offset_right = 1763.0 +offset_bottom = 396.0 +text = "3" +icon = ExtResource("7_fmbcg") +script = ExtResource("8_m0m58") +threshold = 12 +skin = "enterprise" + +[node name="Enterpise-Button4" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 512.0 +offset_right = 1763.0 +offset_bottom = 552.0 +text = "3" +icon = ExtResource("7_fmbcg") +script = ExtResource("8_m0m58") +threshold = 18 +skin = "falcon" + +[node name="Enterpise-Button5" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 672.0 +offset_right = 1763.0 +offset_bottom = 712.0 +text = "3" +icon = ExtResource("7_fmbcg") +script = ExtResource("8_m0m58") +threshold = 24 +skin = "battlecruiser" + +[node name="Enterpise-Button6" type="Button" parent="."] +offset_left = 1709.0 +offset_top = 832.0 +offset_right = 1763.0 +offset_bottom = 872.0 +text = "3" +icon = ExtResource("7_fmbcg") +script = ExtResource("8_m0m58") +threshold = 30 +skin = "enterprise" + +[node name="Label" type="Label" parent="."] +texture_filter = 1 +offset_left = 26.0 +offset_top = 20.0 +offset_right = 351.0 +offset_bottom = 51.0 +text = "Death Count: 0" +label_settings = SubResource("LabelSettings_avbc4") +script = ExtResource("9_8hib7") diff --git a/rund-um-die-welten/LevelSelectUtility/world_select_star_system.gd b/rund-um-die-welten/LevelSelectUtility/world_select_star_system.gd new file mode 100644 index 0000000..7ab5de4 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/world_select_star_system.gd @@ -0,0 +1,25 @@ +extends Area2D + +@export var inverted = false + +var clickable_area_radius = 140: + set(value): + clickable_area_radius = value + $collision_shape.shape.radius = clickable_area_radius +@export var world_file_name: String: + set(value): + world_file_name = value + $world_name_text.text = world_file_name +func _ready() -> void: + if inverted: + $inverted.visible = true + else: + $normal.visible = true + $collision_shape.shape.radius = clickable_area_radius + input_pickable = true + +func _input_event(_viewport, event, _shape_idx): + if event is InputEventMouseButton and event.pressed: + Audioplayer.play_sound((load("res://sfx/button_clicks.wav") as AudioStream)) + GlobalVariables.change_level("LevelSelectUtility/" + str(world_file_name) + ".tscn", true) + GlobalVariables.current_world = world_file_name diff --git a/rund-um-die-welten/LevelSelectUtility/world_select_star_system.gd.uid b/rund-um-die-welten/LevelSelectUtility/world_select_star_system.gd.uid new file mode 100644 index 0000000..4d38c76 --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/world_select_star_system.gd.uid @@ -0,0 +1 @@ +uid://d2umg2v2kkvyf diff --git a/rund-um-die-welten/LevelSelectUtility/world_select_star_system.tscn b/rund-um-die-welten/LevelSelectUtility/world_select_star_system.tscn new file mode 100644 index 0000000..d023aac --- /dev/null +++ b/rund-um-die-welten/LevelSelectUtility/world_select_star_system.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=6 format=3 uid="uid://b81fnypg0r01i"] + +[ext_resource type="Script" uid="uid://d2umg2v2kkvyf" path="res://LevelSelectUtility/world_select_star_system.gd" id="1_t35k2"] +[ext_resource type="Texture2D" uid="uid://gmkmd4xgp2dt" path="res://assets/solar_system.png" id="2_m35r8"] +[ext_resource type="Texture2D" uid="uid://byfoytj6xrow8" path="res://assets/solar_system_2.png" id="3_7cfo7"] +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="3_uq3ng"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_m35r8"] +radius = 140.0 + +[node name="WorldSelectStarSystem" type="Area2D"] +script = ExtResource("1_t35k2") + +[node name="collision_shape" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_m35r8") + +[node name="normal" type="Sprite2D" parent="."] +visible = false +scale = Vector2(4, 4) +texture = ExtResource("2_m35r8") + +[node name="inverted" type="Sprite2D" parent="."] +visible = false +texture_filter = 1 +scale = Vector2(4, 4) +texture = ExtResource("3_7cfo7") + +[node name="world_name_text" type="RichTextLabel" parent="."] +offset_left = -125.0 +offset_top = 120.0 +offset_right = 125.0 +offset_bottom = 150.0 +theme_override_fonts/normal_font = ExtResource("3_uq3ng") +theme_override_font_sizes/normal_font_size = 30 +text = "World x" +scroll_active = false +horizontal_alignment = 1 diff --git a/rund-um-die-welten/Levels/Level 1.tscn b/rund-um-die-welten/Levels/Level 1.tscn new file mode 100644 index 0000000..437312a --- /dev/null +++ b/rund-um-die-welten/Levels/Level 1.tscn @@ -0,0 +1,82 @@ +[gd_scene load_steps=9 format=3 uid="uid://bovxwf77p74pn"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_xtg75"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_hi2wx"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="3_1xjbt"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="4_vy3yb"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="5_ui7qv"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="6_pjihm"] +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="7_oakcl"] + +[sub_resource type="LabelSettings" id="LabelSettings_qi1fe"] +font = ExtResource("7_oakcl") +font_size = 32 + +[node name="main3" type="Node2D"] +script = ExtResource("1_xtg75") +level_name = "Level 1" + +[node name="player" parent="." groups=["player"] instance=ExtResource("2_hi2wx")] +position = Vector2(611, 458) +dies_on_screen_leave = true + +[node name="planet_v2_2" parent="." instance=ExtResource("3_1xjbt")] +position = Vector2(1453, 461) +moon = true + +[node name="planet_v2_3" parent="." instance=ExtResource("3_1xjbt")] +position = Vector2(1052, 926) +win_planet = true +moon = true + +[node name="planet_v2" parent="." instance=ExtResource("3_1xjbt")] +position = Vector2(374, 301) +size_scale = 5.0 +moon = true + +[node name="comet3" parent="." instance=ExtResource("4_vy3yb")] +position = Vector2(993, 291) + +[node name="comet11" parent="." instance=ExtResource("4_vy3yb")] +position = Vector2(1006, 699) + +[node name="comet4" parent="." instance=ExtResource("4_vy3yb")] +position = Vector2(856, 889) + +[node name="comet5" parent="." instance=ExtResource("4_vy3yb")] +position = Vector2(931, 802) + +[node name="comet6" parent="." instance=ExtResource("4_vy3yb")] +position = Vector2(743, 976) + +[node name="comet10" parent="." instance=ExtResource("4_vy3yb")] +position = Vector2(1019, 440) + +[node name="comet7" parent="." instance=ExtResource("4_vy3yb")] +position = Vector2(1016, 577) + +[node name="scene_utils" parent="." instance=ExtResource("5_ui7qv")] + +[node name="collectible" parent="." instance=ExtResource("6_pjihm")] +position = Vector2(190, 296) + +[node name="collectible2" parent="." instance=ExtResource("6_pjihm")] +position = Vector2(1766, 460) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("6_pjihm")] +position = Vector2(1122, 332) + +[node name="collectible4" parent="." instance=ExtResource("6_pjihm")] +position = Vector2(1122, 332) +id = 1 + +[node name="Label" type="Label" parent="."] +offset_left = 62.0 +offset_top = 52.0 +offset_right = 838.0 +offset_bottom = 117.0 +text = "Click on Planets + +Space for charge towards center" +label_settings = SubResource("LabelSettings_qi1fe") diff --git a/rund-um-die-welten/Levels/Level 10.tscn b/rund-um-die-welten/Levels/Level 10.tscn new file mode 100644 index 0000000..561aeb4 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 10.tscn @@ -0,0 +1,84 @@ +[gd_scene load_steps=8 format=3 uid="uid://d81fowturqc2"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_u11um"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_amp3d"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="3_gcrbc"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="4_pafc6"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="5_bht0k"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="6_o6gpf"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="7_amp3d"] + +[node name="main" type="Node2D"] +script = ExtResource("1_u11um") +level_name = "Level 10" + +[node name="scene_utils" parent="." instance=ExtResource("7_amp3d")] + +[node name="player" parent="." groups=["player"] instance=ExtResource("2_amp3d")] +position = Vector2(608, 800) +spawn_rotation = 270 +dies_on_screen_leave = true + +[node name="planet_v2_4" parent="." instance=ExtResource("3_gcrbc")] +position = Vector2(512, 256) +planet_type = 2 +clockwise = false + +[node name="planet_v2" parent="." instance=ExtResource("3_gcrbc")] +position = Vector2(768, 832) +size_scale = 5.0 + +[node name="planet_v3" parent="." instance=ExtResource("3_gcrbc")] +position = Vector2(1472, 736) +size_scale = 5.0 + +[node name="planet_v4" parent="." instance=ExtResource("3_gcrbc")] +position = Vector2(1376, 320) +size_scale = 5.0 +planet_type = 1 +win_planet = true +clockwise = false + +[node name="asteroid_belt" parent="." instance=ExtResource("4_pafc6")] +position = Vector2(1024, -1216) + +[node name="collectible" parent="." instance=ExtResource("5_bht0k")] +position = Vector2(1152, 275) + +[node name="collectible2" parent="." instance=ExtResource("5_bht0k")] +position = Vector2(1632, 832) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("5_bht0k")] +position = Vector2(256, 211) +id = 1 + +[node name="comet3" parent="." instance=ExtResource("6_o6gpf")] +position = Vector2(768, 531) + +[node name="comet4" parent="." instance=ExtResource("6_o6gpf")] +position = Vector2(928, 275) + +[node name="comet5" parent="." instance=ExtResource("6_o6gpf")] +position = Vector2(927, 128) + +[node name="comet6" parent="." instance=ExtResource("6_o6gpf")] +position = Vector2(863, 403) + +[node name="comet7" parent="." instance=ExtResource("6_o6gpf")] +position = Vector2(960, 512) + +[node name="comet12" parent="." instance=ExtResource("6_o6gpf")] +position = Vector2(1088, 576) + +[node name="comet8" parent="." instance=ExtResource("6_o6gpf")] +position = Vector2(128, 384) + +[node name="comet9" parent="." instance=ExtResource("6_o6gpf")] +position = Vector2(224, 480) + +[node name="comet10" parent="." instance=ExtResource("6_o6gpf")] +position = Vector2(352, 563) + +[node name="comet11" parent="." instance=ExtResource("6_o6gpf")] +position = Vector2(512, 608) diff --git a/rund-um-die-welten/Levels/Level 11.tscn b/rund-um-die-welten/Levels/Level 11.tscn new file mode 100644 index 0000000..de2f63d --- /dev/null +++ b/rund-um-die-welten/Levels/Level 11.tscn @@ -0,0 +1,69 @@ +[gd_scene load_steps=9 format=3 uid="uid://bnld7y1nv2a6w"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_6v3dq"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="2_shews"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_olvgy"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="4_o27a1"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="5_745wd"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="6_lead3"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="8_olvgy"] +[ext_resource type="PackedScene" path="res://planet/Deathlaser.tscn" id="8_shews"] + +[node name="main" type="Node2D"] +script = ExtResource("1_6v3dq") +level_name = "Level 10" + +[node name="scene_utils" parent="." instance=ExtResource("2_shews")] +metadata/_edit_lock_ = true + +[node name="player" parent="." groups=["player"] instance=ExtResource("3_olvgy")] +position = Vector2(608, 800) +spawn_rotation = 270 +dies_on_screen_leave = true + +[node name="planet_v2" parent="." instance=ExtResource("4_o27a1")] +position = Vector2(512, 384) +size_scale = 5.0 + +[node name="planet_v4" parent="." instance=ExtResource("4_o27a1")] +position = Vector2(960, 928) +size_scale = 5.0 +planet_type = 2 + +[node name="planet_v3" parent="." instance=ExtResource("4_o27a1")] +position = Vector2(1536, 512) +size_scale = 5.0 +win_planet = true + +[node name="planet_v5" parent="." instance=ExtResource("4_o27a1")] +position = Vector2(1568, 864) +size_scale = 5.0 +clockwise = false + +[node name="asteroid_belt" parent="." instance=ExtResource("5_745wd")] +position = Vector2(1024, -1216) + +[node name="collectible" parent="." instance=ExtResource("6_lead3")] +position = Vector2(896, 576) + +[node name="collectible2" parent="." instance=ExtResource("6_lead3")] +position = Vector2(1216, 704) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("6_lead3")] +position = Vector2(256, 512) +id = 1 + +[node name="Deathlaser" parent="." instance=ExtResource("8_shews")] +position = Vector2(960, 448) +rotation_speed_in_deg_per_second = 70 +laser_color = "green" + +[node name="comet" parent="." instance=ExtResource("8_olvgy")] +position = Vector2(960, 96) + +[node name="comet3" parent="." instance=ExtResource("8_olvgy")] +position = Vector2(1088, 32) + +[node name="comet2" parent="." instance=ExtResource("8_olvgy")] +position = Vector2(834, 32) diff --git a/rund-um-die-welten/Levels/Level 12.tscn b/rund-um-die-welten/Levels/Level 12.tscn new file mode 100644 index 0000000..52ffe06 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 12.tscn @@ -0,0 +1,68 @@ +[gd_scene load_steps=8 format=3 uid="uid://iw8yexi5dokg"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_yny7g"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="2_k7c83"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_cyp82"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="4_flkki"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="5_axee5"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="6_h388b"] +[ext_resource type="PackedScene" uid="uid://dxufmneynppid" path="res://planet/Deathlaser.tscn" id="7_5eyag"] + +[node name="main" type="Node2D"] +script = ExtResource("1_yny7g") +level_name = "Level 12" + +[node name="scene_utils" parent="." instance=ExtResource("2_k7c83")] +metadata/_edit_lock_ = true + +[node name="player" parent="." groups=["player"] instance=ExtResource("3_cyp82")] +position = Vector2(264, 512) +spawn_rotation = 270 +dies_on_screen_leave = true + +[node name="planet_v2_4" parent="." instance=ExtResource("4_flkki")] +position = Vector2(254, 352) +planet_type = 4 +clockwise = false + +[node name="planet_v2_5" parent="." instance=ExtResource("4_flkki")] +position = Vector2(1568, 831) +planet_type = 4 + +[node name="planet_v3" parent="." instance=ExtResource("4_flkki")] +position = Vector2(1024, 768) +size_scale = 5.0 + +[node name="planet_v5" parent="." instance=ExtResource("4_flkki")] +position = Vector2(1728, 255) +size_scale = 5.0 +win_planet = true + +[node name="planet_v4" parent="." instance=ExtResource("4_flkki")] +position = Vector2(768, 255) +size_scale = 5.0 +planet_type = 5 +clockwise = false + +[node name="asteroid_belt" parent="." instance=ExtResource("5_axee5")] +position = Vector2(1024, -1216) + +[node name="collectible" parent="." instance=ExtResource("6_h388b")] +position = Vector2(672, 576) + +[node name="collectible2" parent="." instance=ExtResource("6_h388b")] +position = Vector2(1344, 96) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("6_h388b")] +position = Vector2(672, 937) +id = 1 + +[node name="Deathlaser" parent="." instance=ExtResource("7_5eyag")] +position = Vector2(1344, 255) +rotation = -0.00224159 +rotation_speed_in_deg_per_second = 50 + +[node name="Deathlaser2" parent="." instance=ExtResource("7_5eyag")] +position = Vector2(672, 767) +rotation_speed_in_deg_per_second = 50 diff --git a/rund-um-die-welten/Levels/Level 13.tscn b/rund-um-die-welten/Levels/Level 13.tscn new file mode 100644 index 0000000..b422829 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 13.tscn @@ -0,0 +1,76 @@ +[gd_scene load_steps=8 format=3 uid="uid://bqbm2ss3dybb5"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_2jw78"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="2_jittv"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_i40bs"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="4_imxgt"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="6_nfulu"] +[ext_resource type="PackedScene" uid="uid://dxufmneynppid" path="res://planet/Deathlaser.tscn" id="7_q6vt6"] +[ext_resource type="PackedScene" uid="uid://cx3txojpcod4x" path="res://planet/button_planet.tscn" id="8_jittv"] + +[node name="main" type="Node2D"] +script = ExtResource("1_2jw78") +level_name = "Level 13" + +[node name="scene_utils" parent="." instance=ExtResource("2_jittv")] +metadata/_edit_lock_ = true + +[node name="player" parent="." groups=["player"] instance=ExtResource("3_i40bs")] +position = Vector2(256, 928) +spawn_rotation = 270 +dies_on_screen_leave = true + +[node name="planet_v2_5" parent="." instance=ExtResource("4_imxgt")] +position = Vector2(736, 224) +planet_type = 4 +clockwise = false + +[node name="planet_v3" parent="." instance=ExtResource("4_imxgt")] +position = Vector2(1056, 544) +size_scale = 5.0 +planet_type = 3 + +[node name="planet_v5" parent="." instance=ExtResource("4_imxgt")] +position = Vector2(128, 128) +size_scale = 5.0 +win_planet = true + +[node name="planet_v4" parent="." instance=ExtResource("4_imxgt")] +position = Vector2(352, 832) +size_scale = 5.0 +planet_type = 5 +clockwise = false + +[node name="collectible" parent="." instance=ExtResource("6_nfulu")] +position = Vector2(1056, 224) + +[node name="collectible2" parent="." instance=ExtResource("6_nfulu")] +position = Vector2(416, 416) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("6_nfulu")] +position = Vector2(1056, 864) +id = 1 + +[node name="Deathlaser" parent="." instance=ExtResource("7_q6vt6")] +position = Vector2(288, 320) +rotation = -0.00224159 +rotation_speed_in_deg_per_second = 250 +laser_color = "orange" + +[node name="Deathlaser2" parent="." instance=ExtResource("7_q6vt6")] +position = Vector2(1056, 64) +rotation = -0.00224159 +rotation_speed_in_deg_per_second = 40 +clockwise = false + +[node name="Deathlaser3" parent="." instance=ExtResource("7_q6vt6")] +position = Vector2(1056, 992) +rotation = 1.57079 +rotation_speed_in_deg_per_second = 40 +clockwise = false + +[node name="button_planet" parent="." instance=ExtResource("8_jittv")] +position = Vector2(1664, 512) +max_activation_dist = 32 +button_color = "orange" diff --git a/rund-um-die-welten/Levels/Level 14.tscn b/rund-um-die-welten/Levels/Level 14.tscn new file mode 100644 index 0000000..f2237d5 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 14.tscn @@ -0,0 +1,86 @@ +[gd_scene load_steps=8 format=3 uid="uid://dh5rbf21o3qm2"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_pynbg"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="2_m3nsf"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_767u2"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="4_tgpgy"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="5_2g4tn"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="6_c2dne"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="7_4ms1j"] + +[node name="main" type="Node2D"] +script = ExtResource("1_pynbg") +level_name = "Level 13" + +[node name="scene_utils" parent="." instance=ExtResource("2_m3nsf")] +metadata/_edit_lock_ = true + +[node name="player" parent="." groups=["player"] instance=ExtResource("3_767u2")] +position = Vector2(256, 928) +spawn_rotation = 270 +dies_on_screen_leave = true + +[node name="planet_v3" parent="." instance=ExtResource("4_tgpgy")] +position = Vector2(352, 384) +size_scale = 5.0 +planet_type = 7 +moon = true +moon_radius = 250 +moon_speed = 85 + +[node name="planet_v6" parent="." instance=ExtResource("4_tgpgy")] +position = Vector2(832, 544) +size_scale = 5.0 +moon = true +moon_radius = 200 +moon_speed = 100 + +[node name="planet_v7" parent="." instance=ExtResource("4_tgpgy")] +position = Vector2(1216, 544) +size_scale = 5.0 +planet_type = 6 +moon = true +moon_radius = 200 +moon_speed = 80 + +[node name="planet_v8" parent="." instance=ExtResource("4_tgpgy")] +position = Vector2(1664, 608) +size_scale = 5.0 +planet_type = 7 +win_planet = true +moon = true +moon_radius = 200 +moon_speed = 80 + +[node name="planet_v4" parent="." instance=ExtResource("4_tgpgy")] +position = Vector2(384, 544) +size_scale = 5.0 +planet_type = 5 +clockwise = false +moon_radius = 1000 + +[node name="asteroid_belt" parent="." instance=ExtResource("5_2g4tn")] +position = Vector2(1024, -1216) + +[node name="collectible" parent="." instance=ExtResource("6_c2dne")] +position = Vector2(330, 256) + +[node name="collectible2" parent="." instance=ExtResource("6_c2dne")] +position = Vector2(1504, 864) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("6_c2dne")] +position = Vector2(1216, 128) +id = 1 + +[node name="comet3" parent="." instance=ExtResource("7_4ms1j")] +position = Vector2(832, 805) + +[node name="comet8" parent="." instance=ExtResource("7_4ms1j")] +position = Vector2(832, 256) + +[node name="comet11" parent="." instance=ExtResource("7_4ms1j")] +position = Vector2(832, 960) + +[node name="comet10" parent="." instance=ExtResource("7_4ms1j")] +position = Vector2(832, 96) diff --git a/rund-um-die-welten/Levels/Level 15.tscn b/rund-um-die-welten/Levels/Level 15.tscn new file mode 100644 index 0000000..c2e0502 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 15.tscn @@ -0,0 +1,128 @@ +[gd_scene load_steps=8 format=3 uid="uid://ct7lm067om71s"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_51fkc"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="2_kclku"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_u3e61"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="4_alaeb"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="5_fp155"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="6_4sbyj"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="7_rfeeu"] + +[node name="main" type="Node2D"] +script = ExtResource("1_51fkc") +level_name = "Level 13" + +[node name="scene_utils" parent="." instance=ExtResource("2_kclku")] +metadata/_edit_lock_ = true + +[node name="player" parent="." groups=["player"] instance=ExtResource("3_u3e61")] +position = Vector2(256, 928) +spawn_rotation = 270 +dies_on_screen_leave = true + +[node name="planet_v2_5" parent="." instance=ExtResource("4_alaeb")] +position = Vector2(768, 256) +planet_type = 4 +clockwise = false +moon = true +moon_radius = 200 +moon_speed = 90 + +[node name="planet_v3" parent="." instance=ExtResource("4_alaeb")] +position = Vector2(352, 384) +size_scale = 5.0 +planet_type = 7 +moon = true +moon_radius = 200 +moon_speed = 85 + +[node name="planet_v6" parent="." instance=ExtResource("4_alaeb")] +position = Vector2(1024, 608) +size_scale = 5.0 +moon = true +moon_radius = 200 +moon_speed = 100 + +[node name="planet_v7" parent="." instance=ExtResource("4_alaeb")] +position = Vector2(1440, 888) +size_scale = 5.0 +planet_type = 6 +moon = true +moon_radius = 200 +moon_speed = 80 + +[node name="planet_v8" parent="." instance=ExtResource("4_alaeb")] +position = Vector2(1664, 608) +size_scale = 5.0 +planet_type = 7 +moon = true +moon_radius = 200 +moon_speed = 80 + +[node name="planet_v5" parent="." instance=ExtResource("4_alaeb")] +position = Vector2(1664, 256) +size_scale = 5.0 +win_planet = true + +[node name="planet_v4" parent="." instance=ExtResource("4_alaeb")] +position = Vector2(352, 832) +size_scale = 5.0 +planet_type = 5 +clockwise = false +moon_radius = 1000 + +[node name="asteroid_belt" parent="." instance=ExtResource("5_fp155")] +position = Vector2(1024, -1216) + +[node name="collectible" parent="." instance=ExtResource("6_4sbyj")] +position = Vector2(896, 448) + +[node name="collectible2" parent="." instance=ExtResource("6_4sbyj")] +position = Vector2(1568, 160) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("6_4sbyj")] +position = Vector2(1568, 736) +id = 1 + +[node name="comet" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(608, 824) + +[node name="comet5" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(800, 864) + +[node name="comet2" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(704, 672) + +[node name="comet4" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(736, 1016) + +[node name="comet3" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(608, 480) + +[node name="comet6" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(576, 640) + +[node name="comet7" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(1152, 96) + +[node name="comet8" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(1248, 192) + +[node name="comet9" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(1312, 352) + +[node name="comet11" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(1312, 480) + +[node name="comet12" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(1376, 608) + +[node name="comet13" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(96, 96) + +[node name="comet14" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(224, 128) + +[node name="comet10" parent="." instance=ExtResource("7_rfeeu")] +position = Vector2(1152, 320) diff --git a/rund-um-die-welten/Levels/Level 16.tscn b/rund-um-die-welten/Levels/Level 16.tscn new file mode 100644 index 0000000..7b59bd5 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 16.tscn @@ -0,0 +1,107 @@ +[gd_scene load_steps=10 format=3 uid="uid://c4plydjt0lovw"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_6y5kb"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="2_grj0t"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_7o3ul"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="4_rup6d"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="5_pi486"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="6_lihu5"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="7_ss3md"] +[ext_resource type="PackedScene" uid="uid://dxufmneynppid" path="res://planet/Deathlaser.tscn" id="8_grj0t"] +[ext_resource type="PackedScene" uid="uid://cx3txojpcod4x" path="res://planet/button_planet.tscn" id="9_7o3ul"] + +[node name="main" type="Node2D"] +script = ExtResource("1_6y5kb") +level_name = "Level 13" + +[node name="scene_utils" parent="." instance=ExtResource("2_grj0t")] +metadata/_edit_lock_ = true + +[node name="player" parent="." groups=["player"] instance=ExtResource("3_7o3ul")] +position = Vector2(296, 383) +spawn_rotation = 45 +dies_on_screen_leave = true + +[node name="planet_v3" parent="." instance=ExtResource("4_rup6d")] +position = Vector2(384, 512) +size_scale = 5.0 +planet_type = 7 +moon_radius = 250 +moon_speed = 85 + +[node name="planet_v6" parent="." instance=ExtResource("4_rup6d")] +position = Vector2(928, 448) +size_scale = 5.0 +planet_type = 2 +moon_radius = 200 +moon_speed = 100 + +[node name="planet_v7" parent="." instance=ExtResource("4_rup6d")] +position = Vector2(1280, 576) +size_scale = 5.0 +planet_type = 6 +moon = true +moon_radius = 120 +moon_speed = 100 + +[node name="planet_v8" parent="." instance=ExtResource("4_rup6d")] +position = Vector2(170, 160) +size_scale = 5.0 +planet_type = 6 +moon = true +moon_radius = 120 +moon_speed = 100 + +[node name="planet_v9" parent="." instance=ExtResource("4_rup6d")] +position = Vector2(232, 864) +size_scale = 5.0 +planet_type = 6 +win_planet = true +clockwise = false +moon = true +moon_radius = 120 +moon_speed = 100 + +[node name="planet_v4" parent="." instance=ExtResource("4_rup6d")] +position = Vector2(608, 480) +size_scale = 5.0 +planet_type = 5 +moon_radius = 1000 + +[node name="asteroid_belt" parent="." instance=ExtResource("5_pi486")] +position = Vector2(1024, -1216) + +[node name="collectible" parent="." instance=ExtResource("6_lihu5")] +position = Vector2(65, 64) + +[node name="collectible2" parent="." instance=ExtResource("6_lihu5")] +position = Vector2(1504, 864) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("6_lihu5")] +position = Vector2(1152, 480) +id = 1 + +[node name="comet8" parent="." instance=ExtResource("7_ss3md")] +position = Vector2(232, 608) + +[node name="comet9" parent="." instance=ExtResource("7_ss3md")] +position = Vector2(96, 608) + +[node name="comet10" parent="." instance=ExtResource("7_ss3md")] +position = Vector2(1152, 288) + +[node name="comet12" parent="." instance=ExtResource("7_ss3md")] +position = Vector2(544, 192) + +[node name="comet11" parent="." instance=ExtResource("7_ss3md")] +position = Vector2(1312, 256) + +[node name="Deathlaser" parent="." instance=ExtResource("8_grj0t")] +position = Vector2(864, 928) +laser_color = "green" + +[node name="button_planet" parent="." instance=ExtResource("9_7o3ul")] +position = Vector2(1696, 512) +max_activation_dist = 32 +button_color = "green" diff --git a/rund-um-die-welten/Levels/Level 17.tscn b/rund-um-die-welten/Levels/Level 17.tscn new file mode 100644 index 0000000..9a72f4a --- /dev/null +++ b/rund-um-die-welten/Levels/Level 17.tscn @@ -0,0 +1,69 @@ +[gd_scene load_steps=9 format=3 uid="uid://c6tgsacf3gi1y"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_pqpkw"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="2_osvu6"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_cxbt6"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="4_03vdk"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="5_15sfc"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="6_ho1hf"] +[ext_resource type="PackedScene" uid="uid://dxufmneynppid" path="res://planet/Deathlaser.tscn" id="7_osvu6"] +[ext_resource type="PackedScene" uid="uid://cx3txojpcod4x" path="res://planet/button_planet.tscn" id="8_cxbt6"] + +[node name="main" type="Node2D"] +script = ExtResource("1_pqpkw") +level_name = "Level 13" + +[node name="scene_utils" parent="." instance=ExtResource("2_osvu6")] +metadata/_edit_lock_ = true + +[node name="player" parent="." groups=["player"] instance=ExtResource("3_cxbt6")] +position = Vector2(1496, 933) +spawn_rotation = 270 +dies_on_screen_leave = true + +[node name="asteroid_belt" parent="." instance=ExtResource("5_15sfc")] +position = Vector2(992, 529) +speed = 1000 +number_of_holes = 2 +hole_size_in_deg = 60 +circle_radius = 470 + +[node name="collectible" parent="." instance=ExtResource("6_ho1hf")] +position = Vector2(992, 288) + +[node name="collectible2" parent="." instance=ExtResource("6_ho1hf")] +position = Vector2(256, 661) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("6_ho1hf")] +position = Vector2(992, 973) +id = 1 + +[node name="planet_v2" parent="." instance=ExtResource("4_03vdk")] +position = Vector2(992, 533) +planet_type = 2 + +[node name="planet_v5" parent="." instance=ExtResource("4_03vdk")] +position = Vector2(1560, 704) +planet_type = 4 +collision_enabled = false + +[node name="planet_v6" parent="." instance=ExtResource("4_03vdk")] +position = Vector2(512, 960) +planet_type = 4 +clockwise = false +collision_enabled = false + +[node name="planet_v4" parent="." instance=ExtResource("4_03vdk")] +position = Vector2(1728, 160) +planet_type = 5 +win_planet = true + +[node name="Deathlaser" parent="." instance=ExtResource("7_osvu6")] +position = Vector2(1728, 160) +rotation_speed_in_deg_per_second = 500 + +[node name="button_planet" parent="." instance=ExtResource("8_cxbt6")] +position = Vector2(256, 512) +max_activation_dist = 32 +button_color = "pink" diff --git a/rund-um-die-welten/Levels/Level 18.tscn b/rund-um-die-welten/Levels/Level 18.tscn new file mode 100644 index 0000000..43c2b6d --- /dev/null +++ b/rund-um-die-welten/Levels/Level 18.tscn @@ -0,0 +1,59 @@ +[gd_scene load_steps=7 format=3 uid="uid://bkb470ah8d8xe"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_b35ts"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="2_nq7ae"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_x7bhy"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="4_8p51o"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="5_vxqdh"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="6_g7xf5"] + +[node name="main" type="Node2D"] +script = ExtResource("1_b35ts") +level_name = "Level 13" + +[node name="scene_utils" parent="." instance=ExtResource("2_nq7ae")] +metadata/_edit_lock_ = true + +[node name="player" parent="." groups=["player"] instance=ExtResource("3_x7bhy")] +position = Vector2(64, 511) +spawn_rotation = 270 +dies_on_screen_leave = true + +[node name="asteroid_belt" parent="." instance=ExtResource("4_8p51o")] +position = Vector2(416, 511) +speed = 1000 +number_of_holes = 4 +hole_size_in_deg = 30 +circle_radius = 470 + +[node name="collectible" parent="." instance=ExtResource("5_vxqdh")] +position = Vector2(416, 736) + +[node name="collectible2" parent="." instance=ExtResource("5_vxqdh")] +position = Vector2(1536, 96) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("5_vxqdh")] +position = Vector2(960, 255) +id = 1 + +[node name="planet_v2" parent="." instance=ExtResource("6_g7xf5")] +position = Vector2(416, 511) +planet_type = 2 +moon = true +moon_radius = 250 +moon_speed = 50 + +[node name="asteroid_belt2" parent="." instance=ExtResource("4_8p51o")] +position = Vector2(1536, 511) +speed = -1000 +number_of_holes = 4 +hole_size_in_deg = 30 +circle_radius = 470 + +[node name="planet_v3" parent="." instance=ExtResource("6_g7xf5")] +position = Vector2(1536, 511) +planet_type = 2 +win_planet = true +moon = true +moon_radius = 250 diff --git a/rund-um-die-welten/Levels/Level 19.tscn b/rund-um-die-welten/Levels/Level 19.tscn new file mode 100644 index 0000000..4d5c655 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 19.tscn @@ -0,0 +1,93 @@ +[gd_scene load_steps=7 format=3 uid="uid://cnhxiuej65oko"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_wdtn7"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="2_kev4n"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_ppv6e"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="5_tnhad"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="6_a7pqy"] +[ext_resource type="PackedScene" uid="uid://dxufmneynppid" path="res://planet/Deathlaser.tscn" id="7_kev4n"] + +[node name="main" type="Node2D"] +script = ExtResource("1_wdtn7") +level_name = "Level 13" + +[node name="scene_utils" parent="." instance=ExtResource("2_kev4n")] +metadata/_edit_lock_ = true + +[node name="player" parent="." groups=["player"] instance=ExtResource("3_ppv6e")] +position = Vector2(738, 832) +spawn_rotation = 270 +dies_on_screen_leave = true + +[node name="collectible" parent="." instance=ExtResource("5_tnhad")] +position = Vector2(322, 932) + +[node name="collectible2" parent="." instance=ExtResource("5_tnhad")] +position = Vector2(1632, 320) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("5_tnhad")] +position = Vector2(608, 127) +id = 1 + +[node name="planet_v2" parent="." instance=ExtResource("6_a7pqy")] +position = Vector2(608, 295) +planet_type = 4 +moon_radius = 100 +moon_speed = 200 + +[node name="planet_v5" parent="." instance=ExtResource("6_a7pqy")] +position = Vector2(1120, 288) +planet_type = 6 +clockwise = false +moon = true +moon_radius = 250 +moon_speed = 200 + +[node name="planet_v8" parent="." instance=ExtResource("6_a7pqy")] +position = Vector2(1792, 960) +planet_type = 6 +win_planet = true +moon_radius = 250 +moon_speed = 200 + +[node name="Deathlaser" parent="." instance=ExtResource("7_kev4n")] +position = Vector2(608, 295) +rotation_speed_in_deg_per_second = 50 + +[node name="planet_v7" parent="." instance=ExtResource("6_a7pqy")] +position = Vector2(1088, 805) +planet_type = 4 +moon_radius = 100 +moon_speed = 200 + +[node name="Deathlaser5" parent="." instance=ExtResource("7_kev4n")] +position = Vector2(1088, 805) +rotation_speed_in_deg_per_second = 50 +laser_color = "orange" + +[node name="planet_v9" parent="." instance=ExtResource("6_a7pqy")] +position = Vector2(1504, 416) +planet_type = 4 +clockwise = false +moon_radius = 100 +moon_speed = 200 + +[node name="Deathlaser6" parent="." instance=ExtResource("7_kev4n")] +position = Vector2(1504, 416) +rotation_speed_in_deg_per_second = 50 +laser_color = "green" +clockwise = false + +[node name="planet_v6" parent="." instance=ExtResource("6_a7pqy")] +position = Vector2(320, 768) +planet_type = 4 +clockwise = false +moon_radius = 100 +moon_speed = 200 + +[node name="Deathlaser4" parent="." instance=ExtResource("7_kev4n")] +position = Vector2(320, 768) +rotation_speed_in_deg_per_second = 50 +laser_color = "green" +clockwise = false diff --git a/rund-um-die-welten/Levels/Level 2.tscn b/rund-um-die-welten/Levels/Level 2.tscn new file mode 100644 index 0000000..0081d88 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 2.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=7 format=3 uid="uid://c654mqpmy055j"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_wyhqr"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_yt4wa"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="3_f7mle"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="4_xgid4"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="4_yt4wa"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="6_f7mle"] + +[node name="main5" type="Node2D"] +script = ExtResource("1_wyhqr") +level_name = "Level 2" + +[node name="player" parent="." groups=["player"] instance=ExtResource("2_yt4wa")] +position = Vector2(160, 704) +dies_on_screen_leave = true + +[node name="planet_v2_4" parent="." instance=ExtResource("3_f7mle")] +position = Vector2(1600, 704) +win_planet = true + +[node name="planet_v2_5" parent="." instance=ExtResource("3_f7mle")] +position = Vector2(1023, 256) +clockwise = false + +[node name="planet_v3" parent="." instance=ExtResource("3_f7mle")] +position = Vector2(448, 703) +size_scale = 5.0 + +[node name="collectible" parent="." instance=ExtResource("4_yt4wa")] +position = Vector2(448, 928) + +[node name="collectible2" parent="." instance=ExtResource("4_yt4wa")] +position = Vector2(1728, 836) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("4_yt4wa")] +position = Vector2(1023, 128) +id = 1 + +[node name="comet16" parent="." instance=ExtResource("4_xgid4")] +position = Vector2(1023, 736) + +[node name="comet17" parent="." instance=ExtResource("4_xgid4")] +position = Vector2(1023, 992) + +[node name="comet18" parent="." instance=ExtResource("4_xgid4")] +position = Vector2(1023, 868) + +[node name="scene_utils" parent="." instance=ExtResource("6_f7mle")] diff --git a/rund-um-die-welten/Levels/Level 20.tscn b/rund-um-die-welten/Levels/Level 20.tscn new file mode 100644 index 0000000..2025337 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 20.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=8 format=3 uid="uid://chwumgn2ncccw"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_7ewbn"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="2_2k3q2"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="3_bw07n"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="4_y21vb"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="5_5kaqa"] +[ext_resource type="PackedScene" uid="uid://dxufmneynppid" path="res://planet/Deathlaser.tscn" id="6_ohws3"] +[ext_resource type="PackedScene" uid="uid://cx3txojpcod4x" path="res://planet/button_planet.tscn" id="7_6yhfu"] + +[node name="main" type="Node2D"] +script = ExtResource("1_7ewbn") +level_name = "Level 13" + +[node name="scene_utils" parent="." instance=ExtResource("2_2k3q2")] +metadata/_edit_lock_ = true + +[node name="player" parent="." groups=["player"] instance=ExtResource("3_bw07n")] +position = Vector2(384, 544) +spawn_rotation = 270 +dies_on_screen_leave = true + +[node name="collectible" parent="." instance=ExtResource("4_y21vb")] +position = Vector2(192, 928) + +[node name="collectible2" parent="." instance=ExtResource("4_y21vb")] +position = Vector2(1854, 190) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("4_y21vb")] +position = Vector2(832, 510) +id = 1 + +[node name="planet_v2" parent="." instance=ExtResource("5_5kaqa")] +position = Vector2(704, 512) +planet_type = 7 +moon_radius = 100 +moon_speed = 200 + +[node name="planet_v4" parent="." instance=ExtResource("5_5kaqa")] +position = Vector2(960, 805) +planet_type = 4 +moon = true +moon_radius = 250 +moon_speed = 200 + +[node name="planet_v5" parent="." instance=ExtResource("5_5kaqa")] +position = Vector2(1120, 288) +planet_type = 6 +moon = true +moon_radius = 250 +moon_speed = 200 + +[node name="planet_v3" parent="." instance=ExtResource("5_5kaqa")] +position = Vector2(1792, 96) +planet_type = 6 +win_planet = true +moon = true +moon_radius = 250 + +[node name="Deathlaser" parent="." instance=ExtResource("6_ohws3")] +position = Vector2(1595, 315) +rotation = 2.0944 +rotation_speed_in_deg_per_second = 0 +laser_color = "green" + +[node name="Deathlaser2" parent="." instance=ExtResource("6_ohws3")] +position = Vector2(1595, 221) +rotation = 2.0944 +rotation_speed_in_deg_per_second = 0 +laser_color = "orange" + +[node name="Deathlaser3" parent="." instance=ExtResource("6_ohws3")] +position = Vector2(1595, 141) +rotation = 2.0944 +rotation_speed_in_deg_per_second = 0 + +[node name="button_planet" parent="." instance=ExtResource("7_6yhfu")] +position = Vector2(1664, 832) +max_activation_dist = 32 +button_color = "orange" + +[node name="button_planet2" parent="." instance=ExtResource("7_6yhfu")] +position = Vector2(256, 832) +max_activation_dist = 32 +button_color = "green" + +[node name="button_planet3" parent="." instance=ExtResource("7_6yhfu")] +position = Vector2(256, 254) +max_activation_dist = 32 +button_color = "pink" +clockwise = false diff --git a/rund-um-die-welten/Levels/Level 3.tscn b/rund-um-die-welten/Levels/Level 3.tscn new file mode 100644 index 0000000..1e8b996 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 3.tscn @@ -0,0 +1,75 @@ +[gd_scene load_steps=7 format=3 uid="uid://vupj1hmvqixs"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_k8a2c"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_3ixoe"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="3_jnn57"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="4_0gc1s"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="5_3ixoe"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="6_jnn57"] + +[node name="main3" type="Node2D"] +script = ExtResource("1_k8a2c") +level_name = "Level 3" + +[node name="player" parent="." groups=["player"] instance=ExtResource("2_3ixoe")] +position = Vector2(457, 891) +dies_on_screen_leave = true + +[node name="planet_v2_2" parent="." instance=ExtResource("3_jnn57")] +position = Vector2(1111, 848) + +[node name="planet_v2_4" parent="." instance=ExtResource("3_jnn57")] +position = Vector2(1745, 807) +win_planet = true + +[node name="planet_v2_5" parent="." instance=ExtResource("3_jnn57")] +position = Vector2(1449, 219) +clockwise = false + +[node name="planet_v2_3" parent="." instance=ExtResource("3_jnn57")] +position = Vector2(907, 471) + +[node name="planet_v2" parent="." instance=ExtResource("3_jnn57")] +position = Vector2(373, 695) +size_scale = 5.0 +clockwise = false + +[node name="comet10" parent="." instance=ExtResource("4_0gc1s")] +position = Vector2(586, 1011) + +[node name="comet16" parent="." instance=ExtResource("4_0gc1s")] +position = Vector2(682, 855) + +[node name="comet17" parent="." instance=ExtResource("4_0gc1s")] +position = Vector2(690, 691) + +[node name="comet18" parent="." instance=ExtResource("4_0gc1s")] +position = Vector2(642, 537) + +[node name="comet19" parent="." instance=ExtResource("4_0gc1s")] +position = Vector2(542, 453) + +[node name="comet20" parent="." instance=ExtResource("4_0gc1s")] +position = Vector2(1103, 91) + +[node name="comet21" parent="." instance=ExtResource("4_0gc1s")] +position = Vector2(1107, 273) + +[node name="comet22" parent="." instance=ExtResource("4_0gc1s")] +position = Vector2(1189, 457) + +[node name="comet23" parent="." instance=ExtResource("4_0gc1s")] +position = Vector2(1341, 571) + +[node name="collectible" parent="." instance=ExtResource("5_3ixoe")] +position = Vector2(520, 699) + +[node name="collectible2" parent="." instance=ExtResource("5_3ixoe")] +position = Vector2(1289, 209) +id = 1 + +[node name="collectible3" parent="." instance=ExtResource("5_3ixoe")] +position = Vector2(1564, 819) +id = 2 + +[node name="scene_utils" parent="." instance=ExtResource("6_jnn57")] diff --git a/rund-um-die-welten/Levels/Level 4.tscn b/rund-um-die-welten/Levels/Level 4.tscn new file mode 100644 index 0000000..634ba50 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 4.tscn @@ -0,0 +1,48 @@ +[gd_scene load_steps=7 format=3 uid="uid://ddpjl40d2mgvp"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_evb4r"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_expes"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="3_nq3bc"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="5_expes"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="5_nq3bc"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="6_nq3bc"] + +[node name="main4" type="Node2D"] +script = ExtResource("1_evb4r") +level_name = "Level 4" + +[node name="player" parent="." groups=["player"] instance=ExtResource("2_expes")] +position = Vector2(652, 555) +dies_on_screen_leave = true + +[node name="planet_v2_4" parent="." instance=ExtResource("3_nq3bc")] +position = Vector2(1655, 545) +win_planet = true +clockwise = false + +[node name="planet_v2_3" parent="." instance=ExtResource("3_nq3bc")] +position = Vector2(311, 259) +clockwise = false + +[node name="planet_v2" parent="." instance=ExtResource("3_nq3bc")] +position = Vector2(308, 786) +size_scale = 5.0 + +[node name="collectible" parent="." instance=ExtResource("5_expes")] +position = Vector2(1006, 748) + +[node name="collectible2" parent="." instance=ExtResource("5_expes")] +position = Vector2(1004, 293) +id = 1 + +[node name="collectible3" parent="." instance=ExtResource("5_expes")] +position = Vector2(1649, 362) +id = 2 + +[node name="asteroid_belt" parent="." instance=ExtResource("5_nq3bc")] +position = Vector2(-989, 705) +number_of_holes = 8 +hole_size_in_deg = 20 +circle_radius = 2000 + +[node name="scene_utils" parent="." instance=ExtResource("6_nq3bc")] diff --git a/rund-um-die-welten/Levels/Level 5.tscn b/rund-um-die-welten/Levels/Level 5.tscn new file mode 100644 index 0000000..09652bd --- /dev/null +++ b/rund-um-die-welten/Levels/Level 5.tscn @@ -0,0 +1,57 @@ +[gd_scene load_steps=8 format=3 uid="uid://bkvnips5nck2n"] + +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="1_75a7x"] +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_dkod1"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="2_dkod1"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="3_4ydby"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="4_u7ldv"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="6_4ydby"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="7_u7ldv"] + +[node name="main" type="Node2D"] +script = ExtResource("1_dkod1") +level_name = "Level 5" + +[node name="player" parent="." groups=["player"] instance=ExtResource("1_75a7x")] +position = Vector2(297, 1008) +dies_on_screen_leave = true + +[node name="planet_v2_4" parent="." instance=ExtResource("2_dkod1")] +position = Vector2(1615, 813) +win_planet = true + +[node name="planet_v2_3" parent="." instance=ExtResource("2_dkod1")] +position = Vector2(1024, 256) +clockwise = false + +[node name="planet_v2" parent="." instance=ExtResource("2_dkod1")] +position = Vector2(416, 748) +size_scale = 5.0 + +[node name="collectible" parent="." instance=ExtResource("4_u7ldv")] +position = Vector2(218, 357) + +[node name="collectible2" parent="." instance=ExtResource("4_u7ldv")] +position = Vector2(1619, 964) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("4_u7ldv")] +position = Vector2(1023, 89) +id = 1 + +[node name="comet" parent="." instance=ExtResource("6_4ydby")] +position = Vector2(1088, 896) + +[node name="comet2" parent="." instance=ExtResource("6_4ydby")] +position = Vector2(960, 813) + +[node name="comet3" parent="." instance=ExtResource("6_4ydby")] +position = Vector2(1023, 1024) + +[node name="asteroid_belt" parent="." instance=ExtResource("3_4ydby")] +position = Vector2(1024, -928) +number_of_holes = 8 +hole_size_in_deg = 28 +circle_radius = 1500 + +[node name="scene_utils" parent="." instance=ExtResource("7_u7ldv")] diff --git a/rund-um-die-welten/Levels/Level 6.tscn b/rund-um-die-welten/Levels/Level 6.tscn new file mode 100644 index 0000000..7552826 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 6.tscn @@ -0,0 +1,78 @@ +[gd_scene load_steps=7 format=3 uid="uid://7tlm22qsgdgo"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_g6hnr"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_5a2as"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="3_x54wu"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="5_wsy8s"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="6_flb6e"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="6_g6hnr"] + +[node name="main" type="Node2D"] +script = ExtResource("1_g6hnr") +level_name = "Level 6" + +[node name="player" parent="." groups=["player"] instance=ExtResource("2_5a2as")] +position = Vector2(1568, 802) +dies_on_screen_leave = true + +[node name="planet_v2_2" parent="." instance=ExtResource("3_x54wu")] +position = Vector2(1242, 674) + +[node name="planet_v2_4" parent="." instance=ExtResource("3_x54wu")] +position = Vector2(1696, 373) + +[node name="planet_v2_3" parent="." instance=ExtResource("3_x54wu")] +position = Vector2(1158, 200) +win_planet = true +clockwise = false + +[node name="planet_v2" parent="." instance=ExtResource("3_x54wu")] +position = Vector2(685, 629) +size_scale = 5.0 + +[node name="comet" parent="." instance=ExtResource("6_flb6e")] +position = Vector2(448, 718) + +[node name="comet2" parent="." instance=ExtResource("6_flb6e")] +position = Vector2(533, 585) + +[node name="comet3" parent="." instance=ExtResource("6_flb6e")] +position = Vector2(676, 487) + +[node name="comet4" parent="." instance=ExtResource("6_flb6e")] +position = Vector2(817, 496) + +[node name="comet5" parent="." instance=ExtResource("6_flb6e")] +position = Vector2(954, 585) + +[node name="comet11" parent="." instance=ExtResource("6_flb6e")] +position = Vector2(1344, 585) + +[node name="comet16" parent="." instance=ExtResource("6_flb6e")] +position = Vector2(1088, 649) + +[node name="comet12" parent="." instance=ExtResource("6_flb6e")] +position = Vector2(1414, 480) + +[node name="comet13" parent="." instance=ExtResource("6_flb6e")] +position = Vector2(1472, 352) + +[node name="comet14" parent="." instance=ExtResource("6_flb6e")] +position = Vector2(1535, 224) + +[node name="comet15" parent="." instance=ExtResource("6_flb6e")] +position = Vector2(1568, 72) + +[node name="collectible" parent="." instance=ExtResource("5_wsy8s")] +position = Vector2(1599, 576) + +[node name="collectible2" parent="." instance=ExtResource("5_wsy8s")] +position = Vector2(960, 416) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("5_wsy8s")] +position = Vector2(256, 256) +id = 1 + +[node name="scene_utils" parent="." instance=ExtResource("6_g6hnr")] +position = Vector2(0, 8) diff --git a/rund-um-die-welten/Levels/Level 7.tscn b/rund-um-die-welten/Levels/Level 7.tscn new file mode 100644 index 0000000..97b6f48 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 7.tscn @@ -0,0 +1,68 @@ +[gd_scene load_steps=7 format=3 uid="uid://1omhi68uayh7"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_mh67n"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_qb5be"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="3_rflju"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="5_ioa6s"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="6_furn4"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="6_mh67n"] + +[node name="main" type="Node2D"] +script = ExtResource("1_mh67n") +level_name = "Level 7" + +[node name="player" parent="." groups=["player"] instance=ExtResource("2_qb5be")] +position = Vector2(960, 96) +dies_on_screen_leave = true + +[node name="planet_v2_4" parent="." instance=ExtResource("3_rflju")] +position = Vector2(960, 960) +planet_type = 1 +win_planet = true + +[node name="planet_v2_3" parent="." instance=ExtResource("3_rflju")] +position = Vector2(960, 544) +planet_type = 3 +clockwise = false + +[node name="planet_v2" parent="." instance=ExtResource("3_rflju")] +position = Vector2(288, 621) +size_scale = 5.0 + +[node name="planet_v3" parent="." instance=ExtResource("3_rflju")] +position = Vector2(1664, 640) +size_scale = 5.0 + +[node name="collectible" parent="." instance=ExtResource("5_ioa6s")] +position = Vector2(1408, 224) + +[node name="collectible2" parent="." instance=ExtResource("5_ioa6s")] +position = Vector2(1536, 640) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("5_ioa6s")] +position = Vector2(160, 621) +id = 1 + +[node name="comet" parent="." instance=ExtResource("6_furn4")] +position = Vector2(960, 832) + +[node name="comet4" parent="." instance=ExtResource("6_furn4")] +position = Vector2(608, 576) + +[node name="comet3" parent="." instance=ExtResource("6_furn4")] +position = Vector2(641, 704) + +[node name="comet5" parent="." instance=ExtResource("6_furn4")] +position = Vector2(769, 800) + +[node name="comet9" parent="." instance=ExtResource("6_furn4")] +position = Vector2(1312, 576) + +[node name="comet7" parent="." instance=ExtResource("6_furn4")] +position = Vector2(1151, 800) + +[node name="comet8" parent="." instance=ExtResource("6_furn4")] +position = Vector2(1279, 704) + +[node name="scene_utils" parent="." instance=ExtResource("6_mh67n")] diff --git a/rund-um-die-welten/Levels/Level 8.tscn b/rund-um-die-welten/Levels/Level 8.tscn new file mode 100644 index 0000000..6080b33 --- /dev/null +++ b/rund-um-die-welten/Levels/Level 8.tscn @@ -0,0 +1,72 @@ +[gd_scene load_steps=8 format=3 uid="uid://x7ih0qxwlfh0"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_4kixr"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_fj3hk"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="3_j18h2"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="4_j24tp"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="5_6q0h5"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="6_gq8ki"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="7_fj3hk"] + +[node name="main" type="Node2D"] +script = ExtResource("1_4kixr") +level_name = "Level 8" + +[node name="player" parent="." groups=["player"] instance=ExtResource("2_fj3hk")] +position = Vector2(192, 544) +dies_on_screen_leave = true + +[node name="planet_v2_4" parent="." instance=ExtResource("3_j18h2")] +position = Vector2(1632, 576) +planet_type = 2 +win_planet = true + +[node name="planet_v2" parent="." instance=ExtResource("3_j18h2")] +position = Vector2(416, 544) +size_scale = 5.0 + +[node name="asteroid_belt" parent="." instance=ExtResource("4_j24tp")] +position = Vector2(1024, -1216) + +[node name="collectible" parent="." instance=ExtResource("5_6q0h5")] +position = Vector2(416, 928) + +[node name="collectible2" parent="." instance=ExtResource("5_6q0h5")] +position = Vector2(1632, 864) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("5_6q0h5")] +position = Vector2(1023, 89) +id = 1 + +[node name="comet3" parent="." instance=ExtResource("6_gq8ki")] +position = Vector2(480, 147) + +[node name="comet4" parent="." instance=ExtResource("6_gq8ki")] +position = Vector2(1216, 691) + +[node name="comet5" parent="." instance=ExtResource("6_gq8ki")] +position = Vector2(1088, 608) + +[node name="comet6" parent="." instance=ExtResource("6_gq8ki")] +position = Vector2(1151, 819) + +[node name="comet7" parent="." instance=ExtResource("6_gq8ki")] +position = Vector2(1087, 352) + +[node name="comet8" parent="." instance=ExtResource("6_gq8ki")] +position = Vector2(1344, 128) + +[node name="comet9" parent="." instance=ExtResource("6_gq8ki")] +position = Vector2(1087, 960) + +[node name="comet10" parent="." instance=ExtResource("6_gq8ki")] +position = Vector2(224, 992) + +[node name="comet11" parent="." instance=ExtResource("6_gq8ki")] +position = Vector2(224, 864) + +[node name="comet12" parent="." instance=ExtResource("6_gq8ki")] +position = Vector2(288, 768) + +[node name="scene_utils" parent="." instance=ExtResource("7_fj3hk")] diff --git a/rund-um-die-welten/Levels/Level 9.tscn b/rund-um-die-welten/Levels/Level 9.tscn new file mode 100644 index 0000000..f0d8bfa --- /dev/null +++ b/rund-um-die-welten/Levels/Level 9.tscn @@ -0,0 +1,112 @@ +[gd_scene load_steps=8 format=3 uid="uid://b7fle48jc3csq"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_fomsg"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_0bhtg"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="3_5i8n3"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="4_lmusb"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="5_7pmxy"] +[ext_resource type="PackedScene" uid="uid://ufu0fyp248bh" path="res://comet/comet.tscn" id="6_cxty8"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="7_0bhtg"] + +[node name="main" type="Node2D"] +script = ExtResource("1_fomsg") +level_name = "Level 9" + +[node name="player" parent="." groups=["player"] instance=ExtResource("2_0bhtg")] +position = Vector2(320, 384) +dies_on_screen_leave = true + +[node name="planet_v2" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(320, 544) +size_scale = 5.0 + +[node name="planet_v11" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(320, 224) +size_scale = 5.0 + +[node name="planet_v3" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(640, 864) +size_scale = 5.0 + +[node name="planet_v10" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(640, 544) +size_scale = 5.0 + +[node name="planet_v9" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(320, 864) +size_scale = 5.0 + +[node name="planet_v4" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(960, 544) +size_scale = 5.0 + +[node name="planet_v5" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(1280, 864) +size_scale = 5.0 + +[node name="planet_v12" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(1280, 544) +size_scale = 5.0 + +[node name="planet_v17" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(1600, 224) +size_scale = 5.0 +win_planet = true + +[node name="planet_v14" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(640, 224) +size_scale = 5.0 + +[node name="planet_v7" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(960, 224) +size_scale = 5.0 + +[node name="planet_v16" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(1280, 224) +size_scale = 5.0 + +[node name="planet_v13" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(960, 864) +size_scale = 5.0 + +[node name="planet_v6" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(1600, 544) +size_scale = 5.0 + +[node name="planet_v15" parent="." instance=ExtResource("3_5i8n3")] +position = Vector2(1600, 864) +size_scale = 5.0 + +[node name="asteroid_belt" parent="." instance=ExtResource("4_lmusb")] +position = Vector2(1024, -1216) + +[node name="collectible" parent="." instance=ExtResource("5_7pmxy")] +position = Vector2(128, 864) + +[node name="collectible2" parent="." instance=ExtResource("5_7pmxy")] +position = Vector2(1760, 864) +id = 2 + +[node name="collectible3" parent="." instance=ExtResource("5_7pmxy")] +position = Vector2(960, 384) +id = 1 + +[node name="comet11" parent="." instance=ExtResource("6_cxty8")] +position = Vector2(128, 672) + +[node name="comet12" parent="." instance=ExtResource("6_cxty8")] +position = Vector2(640, 384) + +[node name="comet13" parent="." instance=ExtResource("6_cxty8")] +position = Vector2(800, 224) + +[node name="comet14" parent="." instance=ExtResource("6_cxty8")] +position = Vector2(800, 544) + +[node name="comet15" parent="." instance=ExtResource("6_cxty8")] +position = Vector2(1440, 544) + +[node name="comet17" parent="." instance=ExtResource("6_cxty8")] +position = Vector2(1600, 704) + +[node name="scene_utils" parent="." instance=ExtResource("7_0bhtg")] diff --git a/rund-um-die-welten/Levels/main.gd b/rund-um-die-welten/Levels/main.gd new file mode 100644 index 0000000..f35c437 --- /dev/null +++ b/rund-um-die-welten/Levels/main.gd @@ -0,0 +1,12 @@ +extends Node2D + +@export var level_name = "" +var collectibles = [0,0,0] + +func _ready() -> void: + GlobalVariables.level_done.connect(save_collectibles) + + +func save_collectibles(_win_message): + for i in range(3): + GlobalVariables.collectibles[GlobalVariables.selected_level][i] += collectibles[i] diff --git a/rund-um-die-welten/Levels/main.gd.uid b/rund-um-die-welten/Levels/main.gd.uid new file mode 100644 index 0000000..082e0b1 --- /dev/null +++ b/rund-um-die-welten/Levels/main.gd.uid @@ -0,0 +1 @@ +uid://tlx7l1b53wm7 diff --git a/rund-um-die-welten/Levels/testing_level.tscn b/rund-um-die-welten/Levels/testing_level.tscn new file mode 100644 index 0000000..b47c2ba --- /dev/null +++ b/rund-um-die-welten/Levels/testing_level.tscn @@ -0,0 +1,33 @@ +[gd_scene load_steps=6 format=3 uid="uid://df8crdypicer3"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_etno1"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_h2yge"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="4_1bvp3"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="5_lquwl"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="6_jy78r"] + +[node name="main" type="Node2D"] +script = ExtResource("1_etno1") +level_name = "Level 1" + +[node name="player" parent="." groups=["player"] instance=ExtResource("2_h2yge")] +position = Vector2(1198, 419) + +[node name="planet_v2_2" parent="." instance=ExtResource("4_1bvp3")] +position = Vector2(1597, 741) +rotation = 0.0289093 +planet_type = 3 + +[node name="planet_v2" parent="." instance=ExtResource("4_1bvp3")] +position = Vector2(780, 317) +rotation = 0.0554074 +size_scale = 5.0 +planet_type = 7 +clockwise = false +moon = true + +[node name="asteroid_belt" parent="." instance=ExtResource("5_lquwl")] +position = Vector2(2695, 513) +speed = 300 + +[node name="scene_utils" parent="." instance=ExtResource("6_jy78r")] diff --git a/rund-um-die-welten/Levels/testing_level.tscn445180805.tmp b/rund-um-die-welten/Levels/testing_level.tscn445180805.tmp new file mode 100644 index 0000000..5d48b18 --- /dev/null +++ b/rund-um-die-welten/Levels/testing_level.tscn445180805.tmp @@ -0,0 +1,38 @@ +[gd_scene load_steps=7 format=3 uid="uid://df8crdypicer3"] + +[ext_resource type="Script" uid="uid://tlx7l1b53wm7" path="res://Levels/main.gd" id="1_etno1"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_h2yge"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="4_1bvp3"] +[ext_resource type="PackedScene" uid="uid://nccnr30bmrud" path="res://collectibles/collectible.tscn" id="4_5i00d"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="5_lquwl"] +[ext_resource type="PackedScene" uid="uid://c7lkpcfoqf0xu" path="res://UI Elements/boost_cooldown.tscn" id="6_jy78r"] + +[node name="main" type="Node2D"] +script = ExtResource("1_etno1") +level_name = "Level 1" + +[node name="player" parent="." groups=["player"] instance=ExtResource("2_h2yge")] +position = Vector2(1198, 419) + +[node name="planet_v2_2" parent="." instance=ExtResource("4_1bvp3")] +position = Vector2(1597, 741) +rotation = 0.0289093 +planet_type = 3 + +[node name="planet_v2" parent="." instance=ExtResource("4_1bvp3")] +position = Vector2(780, 317) +rotation = 0.0554074 +size_scale = 5.0 +planet_type = 2 +win_planet = true +clockwise = false + +[node name="asteroid_belt" parent="." instance=ExtResource("5_lquwl")] +position = Vector2(2695, 513) +speed = 300 + +[node name="collectible" parent="." instance=ExtResource("4_5i00d")] +position = Vector2(279, 580) + +[node name="boost_cooldown" parent="." instance=ExtResource("6_jy78r")] +position = Vector2(-58, 791) diff --git a/rund-um-die-welten/Levels/testtest.tscn b/rund-um-die-welten/Levels/testtest.tscn new file mode 100644 index 0000000..fa39d06 --- /dev/null +++ b/rund-um-die-welten/Levels/testtest.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=6 format=3 uid="uid://ba40rhxjx3y7f"] + +[ext_resource type="PackedScene" uid="uid://cx3txojpcod4x" path="res://planet/button_planet.tscn" id="2_r4tu6"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="3_b84rl"] +[ext_resource type="PackedScene" uid="uid://dxufmneynppid" path="res://planet/Deathlaser.tscn" id="3_mkjgl"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="4_1hlkx"] +[ext_resource type="PackedScene" uid="uid://b72obu30gqg1g" path="res://UI Elements/scene_utils.tscn" id="5_b84rl"] + +[node name="Testtest" type="Node2D"] + +[node name="button_planet" parent="." instance=ExtResource("2_r4tu6")] +position = Vector2(640, 598) +max_activation_dist = 40 +button_color = "pink" + +[node name="player" parent="." groups=["player"] instance=ExtResource("4_1hlkx")] +position = Vector2(355, 608) + +[node name="Deathlaser" parent="." instance=ExtResource("3_mkjgl")] +position = Vector2(1101, 580) +rotation_speed_in_deg_per_second = 10 + +[node name="planet_v2" parent="." instance=ExtResource("3_b84rl")] +position = Vector2(1556, 258) +clockwise = false + +[node name="planet_v3" parent="." instance=ExtResource("3_b84rl")] +position = Vector2(1603, 784) + +[node name="scene_utils" parent="." instance=ExtResource("5_b84rl")] +script = null diff --git a/rund-um-die-welten/ToDo.txt b/rund-um-die-welten/ToDo.txt new file mode 100644 index 0000000..3a53eb5 --- /dev/null +++ b/rund-um-die-welten/ToDo.txt @@ -0,0 +1,25 @@ +bowling und magma planet +pfeil abstände kleiner +raumschiff ideen hier adden + -cowboy bebop ship +music does not loop <- Felix-Done +sfx adden + - für buttons + - level cleared + - weitere? + +todeslaserdrehdings <- Felix + - Richtungen einstellen + - sollte man ihn anclicken können? +noch mehr level <- Linus +Hintergründe <- Daniel + -sprite menu + -sprite level? + + +Button Anzeige für welche Laser an sind + +galaxien + +Level mit time trouble +Podracing diff --git a/rund-um-die-welten/UI Elements/boost_cooldown.tscn b/rund-um-die-welten/UI Elements/boost_cooldown.tscn new file mode 100644 index 0000000..2c48a39 --- /dev/null +++ b/rund-um-die-welten/UI Elements/boost_cooldown.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=4 format=3 uid="uid://c7lkpcfoqf0xu"] + +[ext_resource type="Script" uid="uid://cjl13eh6mtfou" path="res://UI Elements/center_boost_cooldown.gd" id="1_e7ol8"] +[ext_resource type="Texture2D" uid="uid://pj6lwapo1im1" path="res://assets/cooldown_bar_empty.png" id="2_msrqj"] +[ext_resource type="Texture2D" uid="uid://t3obbry64ou3" path="res://assets/cooldown_bar_full.png" id="3_sg53x"] + +[node name="boost_cooldown" type="Node2D"] +texture_filter = 1 +scale = Vector2(4, 4) +script = ExtResource("1_e7ol8") + +[node name="TextureProgressBar" type="TextureProgressBar" parent="."] +offset_right = 40.0 +offset_bottom = 40.0 +step = 0.01 +fill_mode = 3 +texture_under = ExtResource("2_msrqj") +texture_progress = ExtResource("3_sg53x") diff --git a/rund-um-die-welten/UI Elements/center_boost_cooldown.gd b/rund-um-die-welten/UI Elements/center_boost_cooldown.gd new file mode 100644 index 0000000..65b2590 --- /dev/null +++ b/rund-um-die-welten/UI Elements/center_boost_cooldown.gd @@ -0,0 +1,19 @@ +extends Node2D + + +func _physics_process(_delta: float) -> void: + var timer = null + if get_parent() and get_parent().get_parent(): + timer = get_parent().get_parent().get_node_or_null("player/boost_cooldown") + + if timer: + + $TextureProgressBar.max_value = timer.wait_time + + if timer.is_stopped(): + $TextureProgressBar.value = $TextureProgressBar.max_value + else: + # Fill decreases as the timer counts down + $TextureProgressBar.value = $TextureProgressBar.max_value - timer.time_left + else: + print("No timer found!") diff --git a/rund-um-die-welten/UI Elements/center_boost_cooldown.gd.uid b/rund-um-die-welten/UI Elements/center_boost_cooldown.gd.uid new file mode 100644 index 0000000..63c7912 --- /dev/null +++ b/rund-um-die-welten/UI Elements/center_boost_cooldown.gd.uid @@ -0,0 +1 @@ +uid://cjl13eh6mtfou diff --git a/rund-um-die-welten/UI Elements/death_screen.gd b/rund-um-die-welten/UI Elements/death_screen.gd new file mode 100644 index 0000000..847e284 --- /dev/null +++ b/rund-um-die-welten/UI Elements/death_screen.gd @@ -0,0 +1,18 @@ +extends Control + +func _ready() -> void: + $"Container/HSplitContainer/MarginContainer2/Respawn Button".pressed.connect(_on_respawn_button_pressed) + $"Container/HSplitContainer/MarginContainer/Menu Button".pressed.connect(_on_menu_button_pressed) + +func _on_respawn_button_pressed(): + GlobalVariables.restart_level() + UiManager.hide_death_screen() + + +func _on_menu_button_pressed(): + GlobalVariables.goto_level_select() + UiManager.hide_death_screen() + +func change_death_message(death_message: String): + $"Container/MarginContainer/Death-message".text = death_message + diff --git a/rund-um-die-welten/UI Elements/death_screen.gd.uid b/rund-um-die-welten/UI Elements/death_screen.gd.uid new file mode 100644 index 0000000..e67444e --- /dev/null +++ b/rund-um-die-welten/UI Elements/death_screen.gd.uid @@ -0,0 +1 @@ +uid://dicxw66tytb02 diff --git a/rund-um-die-welten/UI Elements/death_screen.tscn b/rund-um-die-welten/UI Elements/death_screen.tscn new file mode 100644 index 0000000..2d8b4d5 --- /dev/null +++ b/rund-um-die-welten/UI Elements/death_screen.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=5 format=3 uid="uid://d2lnhx65toxbs"] + +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="1_aftac"] +[ext_resource type="Script" uid="uid://dicxw66tytb02" path="res://UI Elements/death_screen.gd" id="1_uhw3s"] + +[sub_resource type="Theme" id="Theme_uhw3s"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_scrbe"] +bg_color = Color(0.303939, 0.67889, 0.576316, 1) +corner_radius_top_left = 30 +corner_radius_top_right = 30 +corner_radius_bottom_right = 30 +corner_radius_bottom_left = 30 + +[node name="DeathScreen" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 +script = ExtResource("1_uhw3s") + +[node name="Background color" type="ColorRect" parent="."] +layout_mode = 0 +offset_right = 800.0 +offset_bottom = 1200.0 +theme = SubResource("Theme_uhw3s") +color = Color(0, 0, 0.282353, 0.25098) + +[node name="Container" type="VBoxContainer" parent="."] +layout_mode = 0 +offset_right = 800.0 +offset_bottom = 1200.0 + +[node name="Margin" type="MarginContainer" parent="Container"] +layout_mode = 2 +theme_override_constants/margin_top = 100 + +[node name="Game Over text" type="Label" parent="Container/Margin"] +layout_mode = 2 +theme_override_fonts/font = ExtResource("1_aftac") +theme_override_font_sizes/font_size = 80 +text = "Game Over" +horizontal_alignment = 1 +uppercase = true + +[node name="MarginContainer" type="MarginContainer" parent="Container"] +layout_mode = 2 +theme_override_constants/margin_top = 100 +theme_override_constants/margin_bottom = 100 + +[node name="Death-message" type="RichTextLabel" parent="Container/MarginContainer"] +custom_minimum_size = Vector2(0, 500) +layout_mode = 2 +theme_override_colors/default_color = Color(0.972992, 0.0050383, 0.113475, 1) +theme_override_fonts/normal_font = ExtResource("1_aftac") +theme_override_font_sizes/normal_font_size = 50 +text = "You died by leaving the mission area" +autowrap_mode = 2 +horizontal_alignment = 1 + +[node name="HSplitContainer" type="HBoxContainer" parent="Container"] +custom_minimum_size = Vector2(0, 200) +layout_mode = 2 +theme_override_constants/separation = 100 + +[node name="MarginContainer" type="MarginContainer" parent="Container/HSplitContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 50 + +[node name="Menu Button" type="Button" parent="Container/HSplitContainer/MarginContainer"] +custom_minimum_size = Vector2(300, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_fonts/font = ExtResource("1_aftac") +theme_override_font_sizes/font_size = 20 +theme_override_styles/normal = SubResource("StyleBoxFlat_scrbe") +action_mode = 0 +text = "Go to Level Select" + +[node name="MarginContainer2" type="MarginContainer" parent="Container/HSplitContainer"] +layout_mode = 2 +theme_override_constants/margin_right = 50 + +[node name="Respawn Button" type="Button" parent="Container/HSplitContainer/MarginContainer2"] +custom_minimum_size = Vector2(300, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_fonts/font = ExtResource("1_aftac") +theme_override_font_sizes/font_size = 20 +theme_override_styles/normal = SubResource("StyleBoxFlat_scrbe") +action_mode = 0 +text = "Respawn" diff --git a/rund-um-die-welten/UI Elements/menu_background.tscn b/rund-um-die-welten/UI Elements/menu_background.tscn new file mode 100644 index 0000000..f1d36ae --- /dev/null +++ b/rund-um-die-welten/UI Elements/menu_background.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=2 format=3 uid="uid://cr840jx5klwj6"] + +[ext_resource type="Texture2D" uid="uid://qfpxjy52sobd" path="res://assets/Menu.png" id="1_hluep"] + +[node name="menu_background" type="Node2D"] +texture_filter = 1 +scale = Vector2(4, 4) +metadata/_edit_vertical_guides_ = [-666.0] + +[node name="background" type="Sprite2D" parent="."] +z_index = -1 +position = Vector2(240, 135) +texture = ExtResource("1_hluep") diff --git a/rund-um-die-welten/UI Elements/scene_utils.gd b/rund-um-die-welten/UI Elements/scene_utils.gd new file mode 100644 index 0000000..d4cfeda --- /dev/null +++ b/rund-um-die-welten/UI Elements/scene_utils.gd @@ -0,0 +1,11 @@ +extends Node2D + + +@export var pink_button_state_on_start = false +@export var orange_button_state_on_start = false +@export var green_button_state_on_start = false + +func _ready() -> void: + GlobalVariables.set_button_to("pink", pink_button_state_on_start) + GlobalVariables.set_button_to("orange", orange_button_state_on_start) + GlobalVariables.set_button_to("green", green_button_state_on_start) diff --git a/rund-um-die-welten/UI Elements/scene_utils.gd.uid b/rund-um-die-welten/UI Elements/scene_utils.gd.uid new file mode 100644 index 0000000..84f2961 --- /dev/null +++ b/rund-um-die-welten/UI Elements/scene_utils.gd.uid @@ -0,0 +1 @@ +uid://ddj07i3suymq8 diff --git a/rund-um-die-welten/UI Elements/scene_utils.tscn b/rund-um-die-welten/UI Elements/scene_utils.tscn new file mode 100644 index 0000000..a6e63d7 --- /dev/null +++ b/rund-um-die-welten/UI Elements/scene_utils.tscn @@ -0,0 +1,48 @@ +[gd_scene load_steps=5 format=3 uid="uid://b72obu30gqg1g"] + +[ext_resource type="Script" path="res://UI Elements/scene_utils.gd" id="1_mcwqx"] +[ext_resource type="PackedScene" uid="uid://c7lkpcfoqf0xu" path="res://UI Elements/boost_cooldown.tscn" id="2_mcwqx"] +[ext_resource type="Texture2D" uid="uid://d2mvgcdqag2dh" path="res://assets/border.png" id="2_o0c6u"] +[ext_resource type="Texture2D" uid="uid://b645w4bad52ab" path="res://assets/Background.png" id="3_mcwqx"] + +[node name="scene_utils" type="Node2D"] +texture_filter = 1 +scale = Vector2(4, 4) +script = ExtResource("1_mcwqx") +metadata/_edit_vertical_guides_ = [-666.0] + +[node name="border" type="Node2D" parent="."] +top_level = true +scale = Vector2(4, 4) + +[node name="Sprite2D2" type="Sprite2D" parent="border"] +position = Vector2(252.5, 5) +scale = Vector2(2.02734, 1) +texture = ExtResource("2_o0c6u") + +[node name="Sprite2D3" type="Sprite2D" parent="border"] +position = Vector2(5, 137.475) +rotation = -1.5708 +scale = Vector2(1.14824, 1) +texture = ExtResource("2_o0c6u") + +[node name="Sprite2D4" type="Sprite2D" parent="border"] +position = Vector2(475, 136.739) +rotation = 1.5708 +scale = Vector2(1.13711, 1) +texture = ExtResource("2_o0c6u") + +[node name="Sprite2D" type="Sprite2D" parent="border"] +position = Vector2(242.417, 265) +rotation = 3.14159 +scale = Vector2(1.94271, 1) +texture = ExtResource("2_o0c6u") + +[node name="boost_cooldown" parent="." instance=ExtResource("2_mcwqx")] +top_level = true +position = Vector2(-66, 805) + +[node name="background" type="Sprite2D" parent="."] +z_index = -1 +position = Vector2(240, 135) +texture = ExtResource("3_mcwqx") diff --git a/rund-um-die-welten/UI Elements/ui_manager.gd b/rund-um-die-welten/UI Elements/ui_manager.gd new file mode 100644 index 0000000..15420df --- /dev/null +++ b/rund-um-die-welten/UI Elements/ui_manager.gd @@ -0,0 +1,44 @@ +extends CanvasLayer + +@onready var death_screen = $DeathScreen +@onready var pause_menu = $PauseMenu +@onready var win_screen = $WinScreen + +func _ready(): + death_screen.visible = false + pause_menu.visible = false + win_screen.visible = false + GlobalVariables.game_over.connect(show_death_screen) + GlobalVariables.level_done.connect(show_win_screen) + +# === Death Screen === +func show_death_screen(game_over_message): + death_screen.change_death_message(game_over_message) + death_screen.visible = true + get_tree().paused = true # Pause the game + # Optional: Play sound or animation + +func hide_death_screen(): + death_screen.visible = false + get_tree().paused = false + + +# === Win Screen === +func show_win_screen(win_message): + win_screen.change_win_message(win_message) + win_screen.visible = true + get_tree().paused = true # Pause the game + # Optional: Play sound or animation + +func hide_win_screen(): + win_screen.visible = false + get_tree().paused = false + + +# === Pause Menu === +func toggle_pause(): + var is_paused = get_tree().paused + get_tree().paused = !is_paused + pause_menu.visible = !is_paused + + diff --git a/rund-um-die-welten/UI Elements/ui_manager.gd.uid b/rund-um-die-welten/UI Elements/ui_manager.gd.uid new file mode 100644 index 0000000..a44d2c3 --- /dev/null +++ b/rund-um-die-welten/UI Elements/ui_manager.gd.uid @@ -0,0 +1 @@ +uid://2g7tin6vwfnh diff --git a/rund-um-die-welten/UI Elements/ui_manager.tscn b/rund-um-die-welten/UI Elements/ui_manager.tscn new file mode 100644 index 0000000..7ddac69 --- /dev/null +++ b/rund-um-die-welten/UI Elements/ui_manager.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=4 format=3 uid="uid://cgpe6gqsmywoy"] + +[ext_resource type="Script" uid="uid://2g7tin6vwfnh" path="res://UI Elements/ui_manager.gd" id="1_6b5j3"] +[ext_resource type="PackedScene" uid="uid://d2lnhx65toxbs" path="res://UI Elements/death_screen.tscn" id="2_74anh"] +[ext_resource type="PackedScene" path="res://UI Elements/win_screen.tscn" id="3_74anh"] + +[node name="UI manager" type="CanvasLayer"] +process_mode = 3 +layer = 10 +script = ExtResource("1_6b5j3") + +[node name="PauseMenu" type="Control" parent="."] +visible = false +layout_mode = 3 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="DeathScreen" parent="." instance=ExtResource("2_74anh")] +offset_right = 0.0 +offset_bottom = 0.0 + +[node name="WinScreen" parent="." instance=ExtResource("3_74anh")] diff --git a/rund-um-die-welten/UI Elements/win_screen.gd b/rund-um-die-welten/UI Elements/win_screen.gd new file mode 100644 index 0000000..61a8f28 --- /dev/null +++ b/rund-um-die-welten/UI Elements/win_screen.gd @@ -0,0 +1,18 @@ +extends Control + +func _ready() -> void: + $"Container/HSplitContainer/MarginContainer2/Respawn Button".pressed.connect(_on_respawn_button_pressed) + $"Container/HSplitContainer/MarginContainer/Menu Button".pressed.connect(_on_menu_button_pressed) + +func _on_respawn_button_pressed(): + GlobalVariables.restart_level() + UiManager.hide_win_screen() + + +func _on_menu_button_pressed(): + GlobalVariables.goto_level_select() + UiManager.hide_win_screen() + +func change_win_message(win_message: String): + $"Container/MarginContainer/Death-message".text = win_message + diff --git a/rund-um-die-welten/UI Elements/win_screen.gd.uid b/rund-um-die-welten/UI Elements/win_screen.gd.uid new file mode 100644 index 0000000..2ed2a97 --- /dev/null +++ b/rund-um-die-welten/UI Elements/win_screen.gd.uid @@ -0,0 +1 @@ +uid://dhppy0k265ets diff --git a/rund-um-die-welten/UI Elements/win_screen.tscn b/rund-um-die-welten/UI Elements/win_screen.tscn new file mode 100644 index 0000000..a54ad1f --- /dev/null +++ b/rund-um-die-welten/UI Elements/win_screen.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=5 format=3 uid="uid://dfhxvtjqrh5wo"] + +[ext_resource type="Script" uid="uid://dhppy0k265ets" path="res://UI Elements/win_screen.gd" id="1_ar7cn"] +[ext_resource type="FontFile" uid="uid://d2ucaasj8wmwj" path="res://Fonts/BRIGHTSTER-Bold-1.ttf" id="2_r12a3"] + +[sub_resource type="Theme" id="Theme_uhw3s"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_scrbe"] +bg_color = Color(0.303939, 0.67889, 0.576316, 1) +corner_radius_top_left = 30 +corner_radius_top_right = 30 +corner_radius_bottom_right = 30 +corner_radius_bottom_left = 30 + +[node name="WinScreen" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 +script = ExtResource("1_ar7cn") + +[node name="Background color" type="ColorRect" parent="."] +layout_mode = 0 +offset_right = 800.0 +offset_bottom = 1200.0 +theme = SubResource("Theme_uhw3s") +color = Color(0, 0, 0.282353, 0.25098) + +[node name="Container" type="VBoxContainer" parent="."] +layout_mode = 0 +offset_right = 800.0 +offset_bottom = 1200.0 + +[node name="Margin" type="MarginContainer" parent="Container"] +layout_mode = 2 +theme_override_constants/margin_top = 100 + +[node name="Game Over text" type="Label" parent="Container/Margin"] +layout_mode = 2 +theme_override_fonts/font = ExtResource("2_r12a3") +theme_override_font_sizes/font_size = 80 +text = "Level Done" +horizontal_alignment = 1 +uppercase = true + +[node name="MarginContainer" type="MarginContainer" parent="Container"] +layout_mode = 2 +theme_override_constants/margin_top = 100 +theme_override_constants/margin_bottom = 100 + +[node name="Death-message" type="RichTextLabel" parent="Container/MarginContainer"] +custom_minimum_size = Vector2(0, 500) +layout_mode = 2 +theme_override_colors/default_color = Color(0.972992, 0.0050383, 0.113475, 1) +theme_override_fonts/normal_font = ExtResource("2_r12a3") +theme_override_font_sizes/normal_font_size = 50 +text = "You completed your objective by crashing into the sun" +autowrap_mode = 2 +horizontal_alignment = 1 + +[node name="HSplitContainer" type="HBoxContainer" parent="Container"] +custom_minimum_size = Vector2(0, 200) +layout_mode = 2 +theme_override_constants/separation = 100 + +[node name="MarginContainer" type="MarginContainer" parent="Container/HSplitContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 50 + +[node name="Menu Button" type="Button" parent="Container/HSplitContainer/MarginContainer"] +custom_minimum_size = Vector2(300, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_fonts/font = ExtResource("2_r12a3") +theme_override_font_sizes/font_size = 20 +theme_override_styles/normal = SubResource("StyleBoxFlat_scrbe") +action_mode = 0 +text = "Go to Level Select" + +[node name="MarginContainer2" type="MarginContainer" parent="Container/HSplitContainer"] +layout_mode = 2 +theme_override_constants/margin_right = 50 + +[node name="Respawn Button" type="Button" parent="Container/HSplitContainer/MarginContainer2"] +custom_minimum_size = Vector2(300, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_fonts/font = ExtResource("2_r12a3") +theme_override_font_sizes/font_size = 20 +theme_override_styles/normal = SubResource("StyleBoxFlat_scrbe") +action_mode = 0 +text = "Respawn" diff --git a/rund-um-die-welten/assets/.DS_Store b/rund-um-die-welten/assets/.DS_Store new file mode 100644 index 0000000..c3517a0 Binary files /dev/null and b/rund-um-die-welten/assets/.DS_Store differ diff --git a/rund-um-die-welten/assets/Background.png b/rund-um-die-welten/assets/Background.png new file mode 100644 index 0000000..1edeb61 Binary files /dev/null and b/rund-um-die-welten/assets/Background.png differ diff --git a/rund-um-die-welten/assets/ButtonRessources/button-area-green.png b/rund-um-die-welten/assets/ButtonRessources/button-area-green.png new file mode 100644 index 0000000..7e8e2ac Binary files /dev/null and b/rund-um-die-welten/assets/ButtonRessources/button-area-green.png differ diff --git a/rund-um-die-welten/assets/ButtonRessources/button-area-orange.png b/rund-um-die-welten/assets/ButtonRessources/button-area-orange.png new file mode 100644 index 0000000..1202028 Binary files /dev/null and b/rund-um-die-welten/assets/ButtonRessources/button-area-orange.png differ diff --git a/rund-um-die-welten/assets/ButtonRessources/button-area-pink.png b/rund-um-die-welten/assets/ButtonRessources/button-area-pink.png new file mode 100644 index 0000000..007408c Binary files /dev/null and b/rund-um-die-welten/assets/ButtonRessources/button-area-pink.png differ diff --git a/rund-um-die-welten/assets/ButtonRessources/button-area.png b/rund-um-die-welten/assets/ButtonRessources/button-area.png new file mode 100644 index 0000000..eb83eba Binary files /dev/null and b/rund-um-die-welten/assets/ButtonRessources/button-area.png differ diff --git a/rund-um-die-welten/assets/DeathLaserRessources/laser-green-Sheet.png b/rund-um-die-welten/assets/DeathLaserRessources/laser-green-Sheet.png new file mode 100644 index 0000000..8a0a7b4 Binary files /dev/null and b/rund-um-die-welten/assets/DeathLaserRessources/laser-green-Sheet.png differ diff --git a/rund-um-die-welten/assets/DeathLaserRessources/laser-orange-Sheet.png b/rund-um-die-welten/assets/DeathLaserRessources/laser-orange-Sheet.png new file mode 100644 index 0000000..71933a8 Binary files /dev/null and b/rund-um-die-welten/assets/DeathLaserRessources/laser-orange-Sheet.png differ diff --git a/rund-um-die-welten/assets/DeathLaserRessources/laser-pink-Sheet.png b/rund-um-die-welten/assets/DeathLaserRessources/laser-pink-Sheet.png new file mode 100644 index 0000000..6226ab7 Binary files /dev/null and b/rund-um-die-welten/assets/DeathLaserRessources/laser-pink-Sheet.png differ diff --git a/rund-um-die-welten/assets/DeathLaserRessources/space-station-green-export.png b/rund-um-die-welten/assets/DeathLaserRessources/space-station-green-export.png new file mode 100644 index 0000000..93c6bfc Binary files /dev/null and b/rund-um-die-welten/assets/DeathLaserRessources/space-station-green-export.png differ diff --git a/rund-um-die-welten/assets/DeathLaserRessources/space-station-orangeexport.png b/rund-um-die-welten/assets/DeathLaserRessources/space-station-orangeexport.png new file mode 100644 index 0000000..3fb8f6a Binary files /dev/null and b/rund-um-die-welten/assets/DeathLaserRessources/space-station-orangeexport.png differ diff --git a/rund-um-die-welten/assets/DeathLaserRessources/space-station.png b/rund-um-die-welten/assets/DeathLaserRessources/space-station.png new file mode 100644 index 0000000..9b9fe9b Binary files /dev/null and b/rund-um-die-welten/assets/DeathLaserRessources/space-station.png differ diff --git a/rund-um-die-welten/assets/Menu.png b/rund-um-die-welten/assets/Menu.png new file mode 100644 index 0000000..d2f6ea5 Binary files /dev/null and b/rund-um-die-welten/assets/Menu.png differ diff --git a/rund-um-die-welten/assets/battlecruiser-Sheet.png b/rund-um-die-welten/assets/battlecruiser-Sheet.png new file mode 100644 index 0000000..541a4b2 Binary files /dev/null and b/rund-um-die-welten/assets/battlecruiser-Sheet.png differ diff --git a/rund-um-die-welten/assets/battlecruiser1.png b/rund-um-die-welten/assets/battlecruiser1.png new file mode 100644 index 0000000..73fe776 Binary files /dev/null and b/rund-um-die-welten/assets/battlecruiser1.png differ diff --git a/rund-um-die-welten/assets/border-Sheet.png b/rund-um-die-welten/assets/border-Sheet.png new file mode 100644 index 0000000..6533b0f Binary files /dev/null and b/rund-um-die-welten/assets/border-Sheet.png differ diff --git a/rund-um-die-welten/assets/border.png b/rund-um-die-welten/assets/border.png new file mode 100644 index 0000000..c7ec9bf Binary files /dev/null and b/rund-um-die-welten/assets/border.png differ diff --git a/rund-um-die-welten/assets/bowling-planet-Sheet.png b/rund-um-die-welten/assets/bowling-planet-Sheet.png new file mode 100644 index 0000000..a11d95f Binary files /dev/null and b/rund-um-die-welten/assets/bowling-planet-Sheet.png differ diff --git a/rund-um-die-welten/assets/button-planet-Sheet.png b/rund-um-die-welten/assets/button-planet-Sheet.png new file mode 100644 index 0000000..d97c8bb Binary files /dev/null and b/rund-um-die-welten/assets/button-planet-Sheet.png differ diff --git a/rund-um-die-welten/assets/collectable.png b/rund-um-die-welten/assets/collectable.png new file mode 100644 index 0000000..d0d39f1 Binary files /dev/null and b/rund-um-die-welten/assets/collectable.png differ diff --git a/rund-um-die-welten/assets/collectable_grayscale.png b/rund-um-die-welten/assets/collectable_grayscale.png new file mode 100644 index 0000000..9b50e61 Binary files /dev/null and b/rund-um-die-welten/assets/collectable_grayscale.png differ diff --git a/rund-um-die-welten/assets/comet-Sheet.png b/rund-um-die-welten/assets/comet-Sheet.png new file mode 100644 index 0000000..30ba088 Binary files /dev/null and b/rund-um-die-welten/assets/comet-Sheet.png differ diff --git a/rund-um-die-welten/assets/cooldown_bar_empty.png b/rund-um-die-welten/assets/cooldown_bar_empty.png new file mode 100644 index 0000000..214e71a Binary files /dev/null and b/rund-um-die-welten/assets/cooldown_bar_empty.png differ diff --git a/rund-um-die-welten/assets/cooldown_bar_full.png b/rund-um-die-welten/assets/cooldown_bar_full.png new file mode 100644 index 0000000..9e2651f Binary files /dev/null and b/rund-um-die-welten/assets/cooldown_bar_full.png differ diff --git a/rund-um-die-welten/assets/death_star_goal.png b/rund-um-die-welten/assets/death_star_goal.png new file mode 100644 index 0000000..02a0eb8 Binary files /dev/null and b/rund-um-die-welten/assets/death_star_goal.png differ diff --git a/rund-um-die-welten/assets/deathstar-Sheet.png b/rund-um-die-welten/assets/deathstar-Sheet.png new file mode 100644 index 0000000..54dc1a3 Binary files /dev/null and b/rund-um-die-welten/assets/deathstar-Sheet.png differ diff --git a/rund-um-die-welten/assets/earth-Sheet.png b/rund-um-die-welten/assets/earth-Sheet.png new file mode 100644 index 0000000..f1d5fcd Binary files /dev/null and b/rund-um-die-welten/assets/earth-Sheet.png differ diff --git a/rund-um-die-welten/assets/earth_goal.png b/rund-um-die-welten/assets/earth_goal.png new file mode 100644 index 0000000..82ba3f5 Binary files /dev/null and b/rund-um-die-welten/assets/earth_goal.png differ diff --git a/rund-um-die-welten/assets/enterprise-Sheet.png b/rund-um-die-welten/assets/enterprise-Sheet.png new file mode 100644 index 0000000..3686425 Binary files /dev/null and b/rund-um-die-welten/assets/enterprise-Sheet.png differ diff --git a/rund-um-die-welten/assets/enterprise1.png b/rund-um-die-welten/assets/enterprise1.png new file mode 100644 index 0000000..c58a223 Binary files /dev/null and b/rund-um-die-welten/assets/enterprise1.png differ diff --git a/rund-um-die-welten/assets/falcon-Sheet.png b/rund-um-die-welten/assets/falcon-Sheet.png new file mode 100644 index 0000000..98d422a Binary files /dev/null and b/rund-um-die-welten/assets/falcon-Sheet.png differ diff --git a/rund-um-die-welten/assets/falcon1.png b/rund-um-die-welten/assets/falcon1.png new file mode 100644 index 0000000..86964df Binary files /dev/null and b/rund-um-die-welten/assets/falcon1.png differ diff --git a/rund-um-die-welten/assets/goal.png b/rund-um-die-welten/assets/goal.png new file mode 100644 index 0000000..d9cdf6b Binary files /dev/null and b/rund-um-die-welten/assets/goal.png differ diff --git a/rund-um-die-welten/assets/left-arrow.png b/rund-um-die-welten/assets/left-arrow.png new file mode 100644 index 0000000..61d5f1f Binary files /dev/null and b/rund-um-die-welten/assets/left-arrow.png differ diff --git a/rund-um-die-welten/assets/light-texture.png b/rund-um-die-welten/assets/light-texture.png new file mode 100644 index 0000000..60591c5 Binary files /dev/null and b/rund-um-die-welten/assets/light-texture.png differ diff --git a/rund-um-die-welten/assets/light-texture.png~ b/rund-um-die-welten/assets/light-texture.png~ new file mode 100644 index 0000000..18d5d79 Binary files /dev/null and b/rund-um-die-welten/assets/light-texture.png~ differ diff --git a/rund-um-die-welten/assets/magma-planet-Sheet.png b/rund-um-die-welten/assets/magma-planet-Sheet.png new file mode 100644 index 0000000..24e15b2 Binary files /dev/null and b/rund-um-die-welten/assets/magma-planet-Sheet.png differ diff --git a/rund-um-die-welten/assets/mars-Sheet.png b/rund-um-die-welten/assets/mars-Sheet.png new file mode 100644 index 0000000..496acdf Binary files /dev/null and b/rund-um-die-welten/assets/mars-Sheet.png differ diff --git a/rund-um-die-welten/assets/moon-Sheet.png b/rund-um-die-welten/assets/moon-Sheet.png new file mode 100644 index 0000000..eafe250 Binary files /dev/null and b/rund-um-die-welten/assets/moon-Sheet.png differ diff --git a/rund-um-die-welten/assets/obstacle-Sheet.png b/rund-um-die-welten/assets/obstacle-Sheet.png new file mode 100644 index 0000000..fda3d63 Binary files /dev/null and b/rund-um-die-welten/assets/obstacle-Sheet.png differ diff --git a/rund-um-die-welten/assets/particle.png b/rund-um-die-welten/assets/particle.png new file mode 100644 index 0000000..5559899 Binary files /dev/null and b/rund-um-die-welten/assets/particle.png differ diff --git a/rund-um-die-welten/assets/plant-planet-Sheet.png b/rund-um-die-welten/assets/plant-planet-Sheet.png new file mode 100644 index 0000000..8364d45 Binary files /dev/null and b/rund-um-die-welten/assets/plant-planet-Sheet.png differ diff --git a/rund-um-die-welten/assets/plant_goal.png b/rund-um-die-welten/assets/plant_goal.png new file mode 100644 index 0000000..8727c1a Binary files /dev/null and b/rund-um-die-welten/assets/plant_goal.png differ diff --git a/rund-um-die-welten/assets/right-arrow.png b/rund-um-die-welten/assets/right-arrow.png new file mode 100644 index 0000000..5c6fb47 Binary files /dev/null and b/rund-um-die-welten/assets/right-arrow.png differ diff --git a/rund-um-die-welten/assets/rocket-Sheet.png b/rund-um-die-welten/assets/rocket-Sheet.png new file mode 100644 index 0000000..e687a12 Binary files /dev/null and b/rund-um-die-welten/assets/rocket-Sheet.png differ diff --git a/rund-um-die-welten/assets/rocket.png b/rund-um-die-welten/assets/rocket.png new file mode 100644 index 0000000..b8a015a Binary files /dev/null and b/rund-um-die-welten/assets/rocket.png differ diff --git a/rund-um-die-welten/assets/rocket1.png b/rund-um-die-welten/assets/rocket1.png new file mode 100644 index 0000000..b563945 Binary files /dev/null and b/rund-um-die-welten/assets/rocket1.png differ diff --git a/rund-um-die-welten/assets/ship-destroyed-Sheet.png b/rund-um-die-welten/assets/ship-destroyed-Sheet.png new file mode 100644 index 0000000..972d99a Binary files /dev/null and b/rund-um-die-welten/assets/ship-destroyed-Sheet.png differ diff --git a/rund-um-die-welten/assets/soap-planet-Sheet.png b/rund-um-die-welten/assets/soap-planet-Sheet.png new file mode 100644 index 0000000..b31339e Binary files /dev/null and b/rund-um-die-welten/assets/soap-planet-Sheet.png differ diff --git a/rund-um-die-welten/assets/solar_system.png b/rund-um-die-welten/assets/solar_system.png new file mode 100644 index 0000000..c76995d Binary files /dev/null and b/rund-um-die-welten/assets/solar_system.png differ diff --git a/rund-um-die-welten/assets/solar_system_2.png b/rund-um-die-welten/assets/solar_system_2.png new file mode 100644 index 0000000..793f335 Binary files /dev/null and b/rund-um-die-welten/assets/solar_system_2.png differ diff --git a/rund-um-die-welten/assets/sparkle.png b/rund-um-die-welten/assets/sparkle.png new file mode 100644 index 0000000..bf1271f Binary files /dev/null and b/rund-um-die-welten/assets/sparkle.png differ diff --git a/rund-um-die-welten/assets/sputnik.png b/rund-um-die-welten/assets/sputnik.png new file mode 100644 index 0000000..94ea8f3 Binary files /dev/null and b/rund-um-die-welten/assets/sputnik.png differ diff --git a/rund-um-die-welten/assets/sun-Sheet.png b/rund-um-die-welten/assets/sun-Sheet.png new file mode 100644 index 0000000..b8f23bf Binary files /dev/null and b/rund-um-die-welten/assets/sun-Sheet.png differ diff --git a/rund-um-die-welten/assets/sun_goal.png b/rund-um-die-welten/assets/sun_goal.png new file mode 100644 index 0000000..6837951 Binary files /dev/null and b/rund-um-die-welten/assets/sun_goal.png differ diff --git a/rund-um-die-welten/assets/target-lock.png b/rund-um-die-welten/assets/target-lock.png new file mode 100644 index 0000000..8582a3c Binary files /dev/null and b/rund-um-die-welten/assets/target-lock.png differ diff --git a/rund-um-die-welten/assets/target.png b/rund-um-die-welten/assets/target.png new file mode 100644 index 0000000..75bb752 Binary files /dev/null and b/rund-um-die-welten/assets/target.png differ diff --git a/rund-um-die-welten/assets/x-wing-Sheet.png b/rund-um-die-welten/assets/x-wing-Sheet.png new file mode 100644 index 0000000..f8e4d70 Binary files /dev/null and b/rund-um-die-welten/assets/x-wing-Sheet.png differ diff --git a/rund-um-die-welten/assets/x-wing1.png b/rund-um-die-welten/assets/x-wing1.png new file mode 100644 index 0000000..66dba82 Binary files /dev/null and b/rund-um-die-welten/assets/x-wing1.png differ diff --git a/rund-um-die-welten/asteroid_belt/asteroid_belt.gd b/rund-um-die-welten/asteroid_belt/asteroid_belt.gd new file mode 100644 index 0000000..76eade1 --- /dev/null +++ b/rund-um-die-welten/asteroid_belt/asteroid_belt.gd @@ -0,0 +1,68 @@ +extends Node2D + +@export var comet: PackedScene = preload("res://comet/comet.tscn") + +#@export var min_rad = 1300 +#@export var max_rad = 1520 + +@export var speed = 500 +@export var asteroid_density = 100 + +@export var number_of_holes: int +@export var hole_size_in_deg: int +@export var start_rotation_in_deg = 0 +var comet_radius = 40 +@export var circle_radius = 400 + +@export var comet_margin = 10 +func _ready() -> void: + + #var num_asteroids = 0 + #for chunk in chunks: + # num_asteroids += chunk[1]-chunk[0] + # + #num_asteroids *= max_rad-min_rad + # + #num_asteroids /= 700 + spawn_comets() + +func spawn_comets(): + assert (number_of_holes * hole_size_in_deg <= 360) + var comet_radius_in_deg = rad_to_deg(comet_radius/float(circle_radius)) + var comet_margin_in_deg = rad_to_deg(comet_margin/float(circle_radius)) + var hole_positions + if(number_of_holes > 0): + hole_positions = calc_hole_positions() + + else: + number_of_holes = 1 + hole_positions = [0, 0] + for i in range(number_of_holes): + var hole_end_deg = hole_positions[2*i+1] + var next_hole_start = hole_positions[(2*i+2)%(number_of_holes*2)] + var last_comet_end_deg = hole_end_deg + var end_nh_left_of_th = (hole_end_deg>=next_hole_start) + if end_nh_left_of_th: + next_hole_start+=360 + while(last_comet_end_deg<360): + var left_of_next_hole = last_comet_end_deg+2*comet_radius_in_deg void: + var rad = deg_to_rad(deg) + var comet_instance = comet.instantiate() + var pos = Vector2(cos(rad), sin(rad)) * circle_radius + comet_instance.position = pos + comet_instance.speed = speed + + add_child(comet_instance) diff --git a/rund-um-die-welten/asteroid_belt/asteroid_belt.gd.uid b/rund-um-die-welten/asteroid_belt/asteroid_belt.gd.uid new file mode 100644 index 0000000..5dc704d --- /dev/null +++ b/rund-um-die-welten/asteroid_belt/asteroid_belt.gd.uid @@ -0,0 +1 @@ +uid://dt2mu7g6vej1 diff --git a/rund-um-die-welten/asteroid_belt/asteroid_belt.tscn b/rund-um-die-welten/asteroid_belt/asteroid_belt.tscn new file mode 100644 index 0000000..3540122 --- /dev/null +++ b/rund-um-die-welten/asteroid_belt/asteroid_belt.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://4s3rjs7m32hk"] + +[ext_resource type="Script" uid="uid://dt2mu7g6vej1" path="res://asteroid_belt/asteroid_belt.gd" id="1_ktmjn"] + +[node name="asteroid_belt" type="Node2D"] +script = ExtResource("1_ktmjn") diff --git a/rund-um-die-welten/asteroid_belt/asteroid_belt.tscn163990100637.tmp b/rund-um-die-welten/asteroid_belt/asteroid_belt.tscn163990100637.tmp new file mode 100644 index 0000000..3540122 --- /dev/null +++ b/rund-um-die-welten/asteroid_belt/asteroid_belt.tscn163990100637.tmp @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://4s3rjs7m32hk"] + +[ext_resource type="Script" uid="uid://dt2mu7g6vej1" path="res://asteroid_belt/asteroid_belt.gd" id="1_ktmjn"] + +[node name="asteroid_belt" type="Node2D"] +script = ExtResource("1_ktmjn") diff --git a/rund-um-die-welten/collectibles/collectible-icon.tscn b/rund-um-die-welten/collectibles/collectible-icon.tscn new file mode 100644 index 0000000..560b35f --- /dev/null +++ b/rund-um-die-welten/collectibles/collectible-icon.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=5 format=3 uid="uid://dmfmk86fb3akt"] + +[ext_resource type="Texture2D" uid="uid://cflf7xj1mpj3s" path="res://assets/sparkle.png" id="2_lodkm"] +[ext_resource type="Texture2D" uid="uid://doc1xr8oi36nd" path="res://assets/collectable.png" id="3_e3quf"] +[ext_resource type="Texture2D" uid="uid://dkv5rmn2o2k5v" path="res://assets/collectable_grayscale.png" id="4_ygsaa"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_m0tds"] +size = Vector2(27, 28) + +[node name="collectible" type="Area2D"] +scale = Vector2(2, 2) + +[node name="CPUParticles2D" type="CPUParticles2D" parent="."] +texture_filter = 1 +texture = ExtResource("2_lodkm") +lifetime = 0.5 +emission_shape = 1 +emission_sphere_radius = 24.27 +direction = Vector2(1, 1) +spread = 180.0 +gravity = Vector2(0, 0) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_m0tds") + +[node name="colour" type="Sprite2D" parent="."] +texture_filter = 1 +rotation = 0.000899174 +texture = ExtResource("3_e3quf") + +[node name="grayscale" type="Sprite2D" parent="."] +visible = false +texture_filter = 1 +texture = ExtResource("4_ygsaa") + +[connection signal="area_entered" from="." to="." method="_on_area_entered"] diff --git a/rund-um-die-welten/collectibles/collectible.gd b/rund-um-die-welten/collectibles/collectible.gd new file mode 100644 index 0000000..e5991e1 --- /dev/null +++ b/rund-um-die-welten/collectibles/collectible.gd @@ -0,0 +1,22 @@ +extends Area2D + +@export var id = 0 + +var level + +func _ready() -> void: + level = get_parent().level_name + if GlobalVariables.collectibles[GlobalVariables.selected_level][id] == 1: + $grayscale.visible = true + $colour.visible = false + $CPUParticles2D.emitting = false + + + +func _on_area_entered(area: Area2D) -> void: + if area.is_in_group("player"): + var parent = get_parent() + if GlobalVariables.collectibles[level][id] != 1: + parent.collectibles[id] = 1 + Audioplayer.play_sound(preload("res://sfx/collectable.wav")) + queue_free() diff --git a/rund-um-die-welten/collectibles/collectible.gd.uid b/rund-um-die-welten/collectibles/collectible.gd.uid new file mode 100644 index 0000000..d85a06c --- /dev/null +++ b/rund-um-die-welten/collectibles/collectible.gd.uid @@ -0,0 +1 @@ +uid://cwdmu7oq6mcup diff --git a/rund-um-die-welten/collectibles/collectible.tscn b/rund-um-die-welten/collectibles/collectible.tscn new file mode 100644 index 0000000..a1ae2a9 --- /dev/null +++ b/rund-um-die-welten/collectibles/collectible.tscn @@ -0,0 +1,45 @@ +[gd_scene load_steps=7 format=3 uid="uid://nccnr30bmrud"] + +[ext_resource type="Script" uid="uid://cwdmu7oq6mcup" path="res://collectibles/collectible.gd" id="1_m0tds"] +[ext_resource type="Texture2D" uid="uid://doc1xr8oi36nd" path="res://assets/collectable.png" id="2_m0tds"] +[ext_resource type="Texture2D" uid="uid://cflf7xj1mpj3s" path="res://assets/sparkle.png" id="2_pjpvi"] +[ext_resource type="Texture2D" uid="uid://dkv5rmn2o2k5v" path="res://assets/collectable_grayscale.png" id="3_k5esu"] +[ext_resource type="Texture2D" uid="uid://vn8hx6amejdh" path="res://assets/light-texture.png" id="5_aa1be"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_m0tds"] +size = Vector2(27, 28) + +[node name="collectible" type="Area2D"] +scale = Vector2(4, 4) +script = ExtResource("1_m0tds") + +[node name="PointLight2D" type="PointLight2D" parent="."] +z_index = -1000 +color = Color(1, 0.975059, 0.239402, 1) +energy = 1.63 +texture = ExtResource("5_aa1be") + +[node name="CPUParticles2D" type="CPUParticles2D" parent="."] +texture_filter = 1 +texture = ExtResource("2_pjpvi") +lifetime = 0.5 +emission_shape = 1 +emission_sphere_radius = 24.27 +direction = Vector2(1, 1) +spread = 180.0 +gravity = Vector2(0, 0) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_m0tds") + +[node name="colour" type="Sprite2D" parent="."] +texture_filter = 1 +rotation = 0.000899174 +texture = ExtResource("2_m0tds") + +[node name="grayscale" type="Sprite2D" parent="."] +visible = false +texture_filter = 1 +texture = ExtResource("3_k5esu") + +[connection signal="area_entered" from="." to="." method="_on_area_entered"] diff --git a/rund-um-die-welten/comet/comet.gd b/rund-um-die-welten/comet/comet.gd new file mode 100644 index 0000000..b68e13a --- /dev/null +++ b/rund-um-die-welten/comet/comet.gd @@ -0,0 +1,29 @@ +extends Area2D + +var speed = 0 +var direction = Vector2(1,0) + +var target_planet_position = Vector2.ZERO +var clockwise = true + +func _physics_process(delta: float) -> void: + var radius = position.distance_to(target_planet_position) + var angle = (position-target_planet_position).angle() + + var angular_speed = speed * 0.0002 + + if clockwise: + angle += angular_speed*delta + else: + angle -= angular_speed*delta + + position = target_planet_position+Vector2(cos(angle), sin(angle))*radius + +func _ready() -> void: + $AnimatedSprite2D.play() + +func _on_area_entered(area: Area2D) -> void: + # if area in player group entered, kill player + if area.is_in_group("player"): + #Comet = Meteroid with dust trail + GlobalVariables.emit_player_died("You missed your target and crashed into a moon") diff --git a/rund-um-die-welten/comet/comet.gd.uid b/rund-um-die-welten/comet/comet.gd.uid new file mode 100644 index 0000000..48fccca --- /dev/null +++ b/rund-um-die-welten/comet/comet.gd.uid @@ -0,0 +1 @@ +uid://cpxx4ekyjncfp diff --git a/rund-um-die-welten/comet/comet.tscn b/rund-um-die-welten/comet/comet.tscn new file mode 100644 index 0000000..19e708e --- /dev/null +++ b/rund-um-die-welten/comet/comet.tscn @@ -0,0 +1,54 @@ +[gd_scene load_steps=9 format=3 uid="uid://ufu0fyp248bh"] + +[ext_resource type="Script" uid="uid://cpxx4ekyjncfp" path="res://comet/comet.gd" id="1_hmwee"] +[ext_resource type="Texture2D" uid="uid://g7rcca0n4xpv" path="res://assets/obstacle-Sheet.png" id="3_o6e77"] +[ext_resource type="Texture2D" uid="uid://vn8hx6amejdh" path="res://assets/light-texture.png" id="3_t8vxv"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_1lw4w"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_o6e77"] +atlas = ExtResource("3_o6e77") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_t8vxv"] +atlas = ExtResource("3_o6e77") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vml31"] +atlas = ExtResource("3_o6e77") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="SpriteFrames" id="SpriteFrames_wuyh1"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_o6e77") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_t8vxv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vml31") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[node name="comet" type="Area2D"] +texture_filter = 1 +scale = Vector2(4, 4) +script = ExtResource("1_hmwee") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_1lw4w") + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] +sprite_frames = SubResource("SpriteFrames_wuyh1") + +[node name="PointLight2D" type="PointLight2D" parent="."] +color = Color(0.999993, 0.272993, 0.222369, 1) +energy = 1.62 +texture = ExtResource("3_t8vxv") + +[connection signal="area_entered" from="." to="." method="_on_area_entered"] diff --git a/rund-um-die-welten/export_presets.cfg b/rund-um-die-welten/export_presets.cfg new file mode 100644 index 0000000..5586f4b --- /dev/null +++ b/rund-um-die-welten/export_presets.cfg @@ -0,0 +1,156 @@ +[preset.0] + +name="Windows Desktop" +platform="Windows Desktop" +runnable=true +advanced_options=false +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="./rund-um-die-welten.exe" +patches=PackedStringArray() +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +debug/export_console_wrapper=0 +binary_format/embed_pck=false +texture_format/s3tc_bptc=true +texture_format/etc2_astc=false +shader_baker/enabled=false +binary_format/architecture="x86_64" +codesign/enable=false +codesign/timestamp=true +codesign/timestamp_server_url="" +codesign/digest_algorithm=1 +codesign/description="" +codesign/custom_options=PackedStringArray() +application/modify_resources=true +application/icon="" +application/console_wrapper_icon="" +application/icon_interpolation=4 +application/file_version="" +application/product_version="" +application/company_name="" +application/product_name="" +application/file_description="" +application/copyright="" +application/trademarks="" +application/export_angle=0 +application/export_d3d12=0 +application/d3d12_agility_sdk_multiarch=true +ssh_remote_deploy/enabled=false +ssh_remote_deploy/host="user@host_ip" +ssh_remote_deploy/port="22" +ssh_remote_deploy/extra_args_ssh="" +ssh_remote_deploy/extra_args_scp="" +ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}' +$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}' +$trigger = New-ScheduledTaskTrigger -Once -At 00:00 +$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries +$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings +Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true +Start-ScheduledTask -TaskName godot_remote_debug +while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 } +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue" +ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue +Remove-Item -Recurse -Force '{temp_dir}'" + +[preset.1] + +name="Linux" +platform="Linux" +runnable=true +advanced_options=false +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="./rund-um-die-welten.x86_64" +patches=PackedStringArray() +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.1.options] + +custom_template/debug="" +custom_template/release="" +debug/export_console_wrapper=1 +binary_format/embed_pck=false +texture_format/s3tc_bptc=true +texture_format/etc2_astc=false +shader_baker/enabled=false +binary_format/architecture="x86_64" +ssh_remote_deploy/enabled=false +ssh_remote_deploy/host="user@host_ip" +ssh_remote_deploy/port="22" +ssh_remote_deploy/extra_args_ssh="" +ssh_remote_deploy/extra_args_scp="" +ssh_remote_deploy/run_script="#!/usr/bin/env bash +export DISPLAY=:0 +unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\" +\"{temp_dir}/{exe_name}\" {cmd_args}" +ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash +kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\") +rm -rf \"{temp_dir}\"" + +[preset.2] + +name="Web" +platform="Web" +runnable=true +advanced_options=false +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="./rund-um-die-welten.html" +patches=PackedStringArray() +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.2.options] + +custom_template/debug="" +custom_template/release="" +variant/extensions_support=false +variant/thread_support=false +vram_texture_compression/for_desktop=true +vram_texture_compression/for_mobile=false +html/export_icon=true +html/custom_html_shell="" +html/head_include="" +html/canvas_resize_policy=2 +html/focus_canvas_on_start=true +html/experimental_virtual_keyboard=false +progressive_web_app/enabled=false +progressive_web_app/ensure_cross_origin_isolation_headers=true +progressive_web_app/offline_page="" +progressive_web_app/display=1 +progressive_web_app/orientation=0 +progressive_web_app/icon_144x144="" +progressive_web_app/icon_180x180="" +progressive_web_app/icon_512x512="" +progressive_web_app/background_color=Color(0, 0, 0, 1) +threads/emscripten_pool_size=8 +threads/godot_pool_size=4 diff --git a/rund-um-die-welten/global/global_variables.gd b/rund-um-die-welten/global/global_variables.gd new file mode 100644 index 0000000..0613f47 --- /dev/null +++ b/rund-um-die-welten/global/global_variables.gd @@ -0,0 +1,87 @@ +extends Node + +# Player vars +var target_planet_position +var player_speed +var player_clockwise +var player_skin = "default" + +# Planet vars +enum planets {DeathStar, Mars, Earth, Sun, Soap, Plant, Magma, Bowling} +var planet_names = {planets.DeathStar: "Death Star", planets.Mars: "Mars", planets.Earth: "Earth", planets.Sun: "Sun", planets.Soap: "Soap", planets.Plant: "Plant", planets.Magma: "Magma", planets.Bowling: "Bowling"} +var selected_level = "Level 1" +var current_world = "" +var in_main_menu = true + + +#Doesnt work yet +var global_RNG := RandomNumberGenerator.new() + +# Level vars +var collectibles = {"Level 1": [0,0,0], "Level 2": [0,0,0], "Level 3": [0,0,0], "Level 4": [0,0,0], "Level 5": [0,0,0], "Level 6": [0,0,0], "Level 7": [0,0,0], "Level 8": [0,0,0], "Level 9": [0,0,0], "Level 10": [0,0,0], "Level 11": [0,0,0], "Level 12": [0,0,0], "Level 13": [0,0,0], "Level 14": [0,0,0], "Level 15": [0,0,0], "Level 16": [0,0,0], "Level 17": [0,0,0], "Level 18": [0,0,0], "Level 19": [0,0,0], "Level 20": [0,0,0]} +var active_buttons = {"pink": false, "green": false, "orange": false} + + +var levels = {"Level 1": 0, "Level 2": 0, "Level 3": 0, "Level 4": 0, "Level 5": 0, "Level 6": 0, "Level 7": 0, "Level 8": 0, "Level 9": 0, "Level 10": 0, "Level 11": 0, "Level 12": 0, "Level 13": 0, "Level 14": 0, "Level 15": 0, "Level 16": 0, "Level 17": 0, "Level 18": 0, "Level 19": 0, "Level 20": 0}; + +var death_counter = 0 + +# Signals +# Game-State-Signals +signal player_died(death_message: String) +signal game_over(game_over_message: String) +signal level_done(win_message: String) + +# Other Signals +signal button_changed_stage() + +func _ready() -> void: + pass + +func emit_player_died(death_message: String): + if death_message != "You left the mission area": + Audioplayer.play_sound(preload("res://sfx/death.wav")) + player_died.emit(death_message) + +func emit_game_over(game_over_message: String): + game_over.emit(game_over_message) + +func emit_level_done(win_message: String): + level_done.emit(win_message) + + +func goto_level_select(): + change_level("res://LevelSelectUtility/" + current_world + ".tscn", true) + +func restart_level(): + target_planet_position = null + if get_tree().current_scene: + get_tree().reload_current_scene() + +func play_music(): + if in_main_menu: + Audioplayer.play_music("res://sfx/menu-theme.mp3") + else: + Audioplayer.play_music("res://sfx/Soundtrack.mp3") + +func change_level(level_select_path, new_level_is_main_menu = false): + get_tree().change_scene_to_file(level_select_path) + in_main_menu = new_level_is_main_menu + restart_level() + reset_all_buttons() + play_music() + + +# Button utils +func reset_all_buttons(): + for i in active_buttons: + active_buttons[i] = false + button_changed_stage.emit() + +func set_button_to(button_name: String, value): + active_buttons[button_name] = value + button_changed_stage.emit() + +func toggle_button(button_name: String): + active_buttons[button_name] = !active_buttons[button_name] + button_changed_stage.emit() diff --git a/rund-um-die-welten/global/global_variables.gd.uid b/rund-um-die-welten/global/global_variables.gd.uid new file mode 100644 index 0000000..64528fb --- /dev/null +++ b/rund-um-die-welten/global/global_variables.gd.uid @@ -0,0 +1 @@ +uid://21sbbyv4hama diff --git a/rund-um-die-welten/icon.svg b/rund-um-die-welten/icon.svg new file mode 100644 index 0000000..9d8b7fa --- /dev/null +++ b/rund-um-die-welten/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/rund-um-die-welten/main.gd b/rund-um-die-welten/main.gd new file mode 100644 index 0000000..d7431fa --- /dev/null +++ b/rund-um-die-welten/main.gd @@ -0,0 +1,6 @@ +extends Node2D + + +func _physics_process(delta: float) -> void: + #print($"/root/GlobalVariables".target_planet_position) + pass diff --git a/rund-um-die-welten/main.gd.uid b/rund-um-die-welten/main.gd.uid new file mode 100644 index 0000000..0d74c25 --- /dev/null +++ b/rund-um-die-welten/main.gd.uid @@ -0,0 +1 @@ +uid://chmhsfek0wtta diff --git a/rund-um-die-welten/main.tscn b/rund-um-die-welten/main.tscn new file mode 100644 index 0000000..cf9ef03 --- /dev/null +++ b/rund-um-die-welten/main.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=4 format=3 uid="uid://bmvpm0vjd6dfj"] + +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_h2yge"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="4_1bvp3"] +[ext_resource type="PackedScene" uid="uid://4s3rjs7m32hk" path="res://asteroid_belt/asteroid_belt.tscn" id="5_lquwl"] + +[node name="main2" type="Node2D"] + +[node name="player" parent="." groups=["player"] instance=ExtResource("2_h2yge")] +position = Vector2(1198, 419) + +[node name="planet_v2_2" parent="." instance=ExtResource("4_1bvp3")] +position = Vector2(1597, 741) +rotation = 0.0289093 +planet_type = 3 + +[node name="planet_v2" parent="." instance=ExtResource("4_1bvp3")] +position = Vector2(780, 317) +rotation = 0.0554074 +size_scale = 5.0 +planet_type = 1 +clockwise = false + +[node name="asteroid_belt" parent="." instance=ExtResource("5_lquwl")] +position = Vector2(2695, 513) +speed = 300 diff --git a/rund-um-die-welten/main.tscn1225917104.tmp b/rund-um-die-welten/main.tscn1225917104.tmp new file mode 100644 index 0000000..4642cee --- /dev/null +++ b/rund-um-die-welten/main.tscn1225917104.tmp @@ -0,0 +1,29 @@ +[gd_scene load_steps=5 format=3 uid="uid://bmvpm0vjd6dfj"] + +[ext_resource type="Script" path="res://main.gd" id="1_0xm2m"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_h2yge"] +[ext_resource type="PackedScene" uid="uid://c7itpd2v7654w" path="res://planet/planet.tscn" id="3_h2yge"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="4_1bvp3"] + +[node name="main" type="Node2D"] +script = ExtResource("1_0xm2m") + +[node name="player" parent="." instance=ExtResource("2_h2yge")] +position = Vector2(376, 161) + +[node name="planet_1" parent="." instance=ExtResource("3_h2yge")] + +[node name="planet_2" parent="." instance=ExtResource("3_h2yge")] +offset_left = 63.0 +offset_top = 117.0 +offset_right = 145.0 +offset_bottom = 195.0 + +[node name="planet_3" parent="." instance=ExtResource("3_h2yge")] +offset_left = 188.0 +offset_top = 137.0 +offset_right = 224.0 +offset_bottom = 171.0 + +[node name="planet_v2" parent="." instance=ExtResource("4_1bvp3")] +position = Vector2(109, 61) diff --git a/rund-um-die-welten/main.tscn1374196928.tmp b/rund-um-die-welten/main.tscn1374196928.tmp new file mode 100644 index 0000000..0766a77 --- /dev/null +++ b/rund-um-die-welten/main.tscn1374196928.tmp @@ -0,0 +1,12 @@ +[gd_scene load_steps=4 format=3 uid="uid://bmvpm0vjd6dfj"] + +[ext_resource type="Script" uid="uid://b78yuun70mgb3" path="res://main.gd" id="1_0xm2m"] +[ext_resource type="PackedScene" uid="uid://d0h7r8gitcntt" path="res://player/player.tscn" id="2_h2yge"] +[ext_resource type="PackedScene" uid="uid://c7itpd2v7654w" path="res://planet/planet.tscn" id="3_h2yge"] + +[node name="main" type="Node2D"] +script = ExtResource("1_0xm2m") + +[node name="player" parent="." instance=ExtResource("2_h2yge")] + +[node name="planet" parent="." instance=ExtResource("3_h2yge")] diff --git a/rund-um-die-welten/planet/Deathlaser.tscn b/rund-um-die-welten/planet/Deathlaser.tscn new file mode 100644 index 0000000..65dc188 --- /dev/null +++ b/rund-um-die-welten/planet/Deathlaser.tscn @@ -0,0 +1,323 @@ +[gd_scene load_steps=38 format=3 uid="uid://dxufmneynppid"] + +[ext_resource type="Script" uid="uid://cmuivlhmvghtc" path="res://planet/deathlaser.gd" id="1_sv28e"] +[ext_resource type="Texture2D" uid="uid://cb8mmj8ebnaxj" path="res://assets/DeathLaserRessources/space-station-orangeexport.png" id="2_1jp7v"] +[ext_resource type="Texture2D" uid="uid://bl60tpxrep6jt" path="res://assets/DeathLaserRessources/laser-green-Sheet.png" id="2_603sl"] +[ext_resource type="Texture2D" uid="uid://dh614y12otcbc" path="res://assets/DeathLaserRessources/laser-orange-Sheet.png" id="3_lvrca"] +[ext_resource type="Texture2D" uid="uid://rubo33mvvvc6" path="res://assets/DeathLaserRessources/laser-pink-Sheet.png" id="4_wcyej"] +[ext_resource type="Texture2D" uid="uid://csagma0te5qqs" path="res://assets/DeathLaserRessources/space-station-green-export.png" id="5_d5abl"] +[ext_resource type="Texture2D" uid="uid://blc3doqw1mg1r" path="res://assets/DeathLaserRessources/space-station.png" id="7_mex5s"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_603sl"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("2_1jp7v") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_603sl"] +atlas = ExtResource("3_lvrca") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wcyej"] +atlas = ExtResource("3_lvrca") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_d5abl"] +atlas = ExtResource("3_lvrca") +region = Rect2(128, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_mex5s"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_603sl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wcyej") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_d5abl") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_eytq6"] +atlas = ExtResource("3_lvrca") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_sah14"] +atlas = ExtResource("3_lvrca") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jkk2u"] +atlas = ExtResource("3_lvrca") +region = Rect2(128, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_pputu"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_eytq6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_sah14") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jkk2u") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="SpriteFrames" id="SpriteFrames_wcyej"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("5_d5abl") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_mex5s"] +atlas = ExtResource("2_603sl") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pputu"] +atlas = ExtResource("2_603sl") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1701t"] +atlas = ExtResource("2_603sl") +region = Rect2(128, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_rfpfj"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_mex5s") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pputu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1701t") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_6la5m"] +atlas = ExtResource("2_603sl") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8eicq"] +atlas = ExtResource("2_603sl") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_d7gtx"] +atlas = ExtResource("2_603sl") +region = Rect2(128, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_8wmf2"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_6la5m") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8eicq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_d7gtx") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="SpriteFrames" id="SpriteFrames_q43et"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("7_mex5s") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_npn4k"] +atlas = ExtResource("4_wcyej") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cifo1"] +atlas = ExtResource("4_wcyej") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_u5uhj"] +atlas = ExtResource("4_wcyej") +region = Rect2(128, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_xs1w0"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_npn4k") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cifo1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_u5uhj") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_xs1w0"] +atlas = ExtResource("4_wcyej") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cdecj"] +atlas = ExtResource("4_wcyej") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_e668c"] +atlas = ExtResource("4_wcyej") +region = Rect2(128, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_eytq6"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_xs1w0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cdecj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_e668c") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_603sl"] +size = Vector2(36, 224) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_wcyej"] +size = Vector2(36, 224) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_d5abl"] +size = Vector2(68, 104) + +[node name="Deathlaser" type="Node2D"] +script = ExtResource("1_sv28e") + +[node name="StateOrange" type="Control" parent="."] +visible = false +layout_mode = 3 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="StationSprite" type="AnimatedSprite2D" parent="StateOrange"] +texture_filter = 1 +position = Vector2(-2, 0) +scale = Vector2(4, 4) +sprite_frames = SubResource("SpriteFrames_603sl") + +[node name="LaserSprite2" type="AnimatedSprite2D" parent="StateOrange"] +texture_filter = 1 +position = Vector2(2, -160) +scale = Vector2(4, 4) +sprite_frames = SubResource("SpriteFrames_mex5s") + +[node name="LaserSprite1" type="AnimatedSprite2D" parent="StateOrange"] +texture_filter = 1 +position = Vector2(-2, 160) +rotation = 3.14159 +scale = Vector2(4, 4) +sprite_frames = SubResource("SpriteFrames_pputu") + +[node name="StateGreen" type="Control" parent="."] +visible = false +layout_mode = 3 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="StationSprite" type="AnimatedSprite2D" parent="StateGreen"] +texture_filter = 1 +position = Vector2(-2, 0) +scale = Vector2(4, 4) +sprite_frames = SubResource("SpriteFrames_wcyej") + +[node name="LaserSprite2" type="AnimatedSprite2D" parent="StateGreen"] +texture_filter = 1 +position = Vector2(2, -160) +scale = Vector2(4, 4) +sprite_frames = SubResource("SpriteFrames_rfpfj") + +[node name="LaserSprite1" type="AnimatedSprite2D" parent="StateGreen"] +texture_filter = 1 +position = Vector2(-2, 160) +rotation = 3.14159 +scale = Vector2(4, 4) +sprite_frames = SubResource("SpriteFrames_8wmf2") + +[node name="StatePink" type="Control" parent="."] +visible = false +layout_mode = 3 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="StationSprite" type="AnimatedSprite2D" parent="StatePink"] +texture_filter = 1 +position = Vector2(-2, 0) +scale = Vector2(4, 4) +sprite_frames = SubResource("SpriteFrames_q43et") + +[node name="LaserSprite2" type="AnimatedSprite2D" parent="StatePink"] +texture_filter = 1 +position = Vector2(2, -160) +scale = Vector2(4, 4) +sprite_frames = SubResource("SpriteFrames_xs1w0") + +[node name="LaserSprite1" type="AnimatedSprite2D" parent="StatePink"] +texture_filter = 1 +position = Vector2(-2, 160) +rotation = 3.14159 +scale = Vector2(4, 4) +sprite_frames = SubResource("SpriteFrames_eytq6") + +[node name="HitboxLaser1" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="HitboxLaser1"] +position = Vector2(0, 164) +shape = SubResource("RectangleShape2D_603sl") + +[node name="HitboxLaser2" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="HitboxLaser2"] +position = Vector2(0, -164) +shape = SubResource("RectangleShape2D_wcyej") + +[node name="HitboxStation" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="HitboxStation"] +shape = SubResource("RectangleShape2D_d5abl") diff --git a/rund-um-die-welten/planet/button_planet.gd b/rund-um-die-welten/planet/button_planet.gd new file mode 100644 index 0000000..9079a9d --- /dev/null +++ b/rund-um-die-welten/planet/button_planet.gd @@ -0,0 +1,103 @@ +extends Node2D + +@export var max_activation_dist = 20: + set(value): + max_activation_dist = value + $activation_area/shape.shape.radius = $planet_v2.planet_radius + max_activation_dist +var block_trigger = false +@export var button_color: String: + set(value): + button_color = value + for i in ["Orange", "Green", "Pink"]: + get_node("Color/"+str(i)).visible = false + + get_node("Color/"+str(value).capitalize()).visible = true + +@export var size_scale := 1.0: + set(value): + size_scale = value + $planet_v2.size_scale = value + +@export var planet_type: GlobalVariables.planets: + set(value): + planet_type = value + $planet_v2.planet_type = value + +@export var win_planet := false: + set(value): + win_planet = value + $planet_v2.win_planet = value + +@export var win_message := "You reached the goal": + set(value): + win_message = value + $planet_v2.win_message = value + +@export var death_message_overwrite: String: + set(value): + death_message_overwrite = value + $planet_v2.death_message_overwrite = value + +@export var speed := 300: + set(value): + speed = value + $planet_v2.speed = value + +@export var clockwise := true: + set(value): + clockwise = value + $planet_v2.clockwise = value + +@export var collision_enabled := true: + set(value): + collision_enabled = value + $planet_v2.collision_enabled = value + + +func _ready() -> void: + + $planet_v2.size_scale = size_scale + + # for differentiating different planets + $planet_v2.planet_type = planet_type + + $planet_v2.win_planet = win_planet + + $planet_v2.win_message = win_message + + $planet_v2.death_message_overwrite = death_message_overwrite + + $planet_v2.speed = speed + + $planet_v2.clockwise = clockwise + + $planet_v2.collision_enabled = collision_enabled + + # Base radius of everything: 192 + # Wanted radius: (Planet_radius + max_activation_dist)*4 + + var base_radius = 192 + var wanted_radius = ($planet_v2.planet_radius + max_activation_dist)*4 + var scale_factor = wanted_radius/float(base_radius) + + #Scale Sprite + $Color.scale = Vector2(scale_factor, scale_factor) + #Scale Hitbox + $activation_area/shape.scale = Vector2(scale_factor, scale_factor) + $activation_area/shape.shape.radius = base_radius + + +func _physics_process(_delta: float) -> void: + #Check if player is orbiting this planet on low orbit + if is_player_in_area(): + if !block_trigger: + GlobalVariables.toggle_button(button_color) + block_trigger = true + else: + block_trigger = false + +func is_player_in_area() -> bool: + for body in $activation_area.get_overlapping_areas(): + if body.is_in_group("player"): + return true + return false diff --git a/rund-um-die-welten/planet/button_planet.gd.uid b/rund-um-die-welten/planet/button_planet.gd.uid new file mode 100644 index 0000000..f43f32e --- /dev/null +++ b/rund-um-die-welten/planet/button_planet.gd.uid @@ -0,0 +1 @@ +uid://b4jfjnwxnqfyl diff --git a/rund-um-die-welten/planet/button_planet.tscn b/rund-um-die-welten/planet/button_planet.tscn new file mode 100644 index 0000000..0250cbf --- /dev/null +++ b/rund-um-die-welten/planet/button_planet.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=7 format=3 uid="uid://cx3txojpcod4x"] + +[ext_resource type="Script" uid="uid://b4jfjnwxnqfyl" path="res://planet/button_planet.gd" id="1_a80ru"] +[ext_resource type="PackedScene" uid="uid://bmlfyt1ykh3aq" path="res://planet/planet_v_2.tscn" id="2_eooxo"] +[ext_resource type="Texture2D" uid="uid://comkfxlkepovl" path="res://assets/ButtonRessources/button-area-orange.png" id="3_eooxo"] +[ext_resource type="Texture2D" uid="uid://c4gc8beikvo0m" path="res://assets/ButtonRessources/button-area-pink.png" id="4_a73fu"] +[ext_resource type="Texture2D" uid="uid://dqn57b1rfvctf" path="res://assets/ButtonRessources/button-area-green.png" id="5_fbxey"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_a80ru"] +resource_local_to_scene = true +radius = 192.0 + +[node name="button_planet" type="Node2D"] +script = ExtResource("1_a80ru") + +[node name="planet_v2" parent="." instance=ExtResource("2_eooxo")] + +[node name="activation_area" type="Area2D" parent="."] +input_pickable = false + +[node name="shape" type="CollisionShape2D" parent="activation_area"] +shape = SubResource("CircleShape2D_a80ru") + +[node name="Color" type="Node2D" parent="."] + +[node name="Orange" type="Sprite2D" parent="Color"] +visible = false +scale = Vector2(4, 4) +texture = ExtResource("3_eooxo") + +[node name="Pink" type="Sprite2D" parent="Color"] +visible = false +scale = Vector2(4, 4) +texture = ExtResource("4_a73fu") + +[node name="Green" type="Sprite2D" parent="Color"] +visible = false +scale = Vector2(4, 4) +texture = ExtResource("5_fbxey") diff --git a/rund-um-die-welten/planet/deathlaser.gd b/rund-um-die-welten/planet/deathlaser.gd new file mode 100644 index 0000000..5d1d2ec --- /dev/null +++ b/rund-um-die-welten/planet/deathlaser.gd @@ -0,0 +1,72 @@ +extends Node2D + +@export var rotation_speed_in_deg_per_second = 100 +@export var laser_color = "pink": + set(value): + laser_color = value + station_name = "State"+str(value).capitalize() +@export var death_message_overwrite: String +@export var clockwise = true +var active +var station_name: + set(value): + station_name = value + for i in ["StateOrange", "StatePink", "StateGreen"]: + get_node(i).visible = false + get_node(station_name).visible = true + +func _ready() -> void: + $"HitboxStation".area_entered.connect(_on_station_area_entered) + $"HitboxLaser1".area_entered.connect(_on_laser_area_entered) + $"HitboxLaser2".area_entered.connect(_on_laser_area_entered) + GlobalVariables.button_changed_stage.connect(check_state) + station_name = "State"+str(laser_color).capitalize() + check_state() + +func check_state(): + change_laser_state_to(!GlobalVariables.active_buttons[laser_color]) + +func change_laser_state_to(state:bool): + active = state + for i in ["StateOrange", "StatePink", "StateGreen"]: + get_node(i + "/LaserSprite1").visible = false + get_node(i + "/LaserSprite1").visible = false + get_node(i + "/StationSprite").visible = false + get_node(station_name + "/StationSprite").visible = true + get_node(station_name + "/LaserSprite1").visible = active + get_node(station_name + "/LaserSprite2").visible = active + + + +func toggle_laser(): + active = !active + for i in ["StateOrange", "StatePink", "StateGreen"]: + get_node(i + "/LaserSprite1").visible = false + get_node(i + "/LaserSprite1").visible = false + get_node(station_name + "/LaserSprite1").visible = true + +func _physics_process(delta: float) -> void: + if clockwise: + rotate(deg_to_rad(rotation_speed_in_deg_per_second * delta)) + else: + rotate(deg_to_rad(rotation_speed_in_deg_per_second * -delta)) + + +func _on_laser_area_entered(area: Area2D) -> void: + if active: + # if area in player group entered, kill player + if area.is_in_group("player"): + if death_message_overwrite: + GlobalVariables.emit_player_died(death_message_overwrite) + else: + GlobalVariables.emit_player_died("You crashed into an active " + str(laser_color) + " Laser") + print(area.position) + +func _on_station_area_entered(area: Area2D) -> void: + # if area in player group entered, kill player + if area.is_in_group("player"): + if death_message_overwrite: + GlobalVariables.emit_player_died(death_message_overwrite) + else: + GlobalVariables.emit_player_died("You crashed into the " + str(laser_color) + " Station") + print(area.position) diff --git a/rund-um-die-welten/planet/deathlaser.gd.uid b/rund-um-die-welten/planet/deathlaser.gd.uid new file mode 100644 index 0000000..6e63f35 --- /dev/null +++ b/rund-um-die-welten/planet/deathlaser.gd.uid @@ -0,0 +1 @@ +uid://cmuivlhmvghtc diff --git a/rund-um-die-welten/planet/moon.gd b/rund-um-die-welten/planet/moon.gd new file mode 100644 index 0000000..9355312 --- /dev/null +++ b/rund-um-die-welten/planet/moon.gd @@ -0,0 +1,33 @@ +extends Area2D + +var direction = Vector2(1,0) + +var target_planet_position +var clockwise = true + +var vis = false + +@export var circle_radius = 150 +@export var circle_speed = 50 + +func _physics_process(delta: float) -> void: + var angle = (position-target_planet_position).angle() + + var angular_speed = circle_speed * delta + + if clockwise: + angle += angular_speed*delta + else: + angle -= angular_speed*delta + + position = target_planet_position+Vector2(cos(angle), sin(angle))*circle_radius + +func _ready() -> void: + target_planet_position = get_parent().global_position + $AnimatedSprite2D.play() + +func _on_area_entered(area: Area2D) -> void: + # if area in player group entered, kill player + if area.is_in_group("player") and vis: + #Comet = Meteroid with dust trail + GlobalVariables.emit_player_died("You missed your target and crashed into a moon") diff --git a/rund-um-die-welten/planet/moon.gd.uid b/rund-um-die-welten/planet/moon.gd.uid new file mode 100644 index 0000000..c024c3f --- /dev/null +++ b/rund-um-die-welten/planet/moon.gd.uid @@ -0,0 +1 @@ +uid://0fd2s1p88bty diff --git a/rund-um-die-welten/planet/moon.tscn b/rund-um-die-welten/planet/moon.tscn new file mode 100644 index 0000000..9997945 --- /dev/null +++ b/rund-um-die-welten/planet/moon.tscn @@ -0,0 +1,55 @@ +[gd_scene load_steps=9 format=3 uid="uid://cgeeatxwjsuf8"] + +[ext_resource type="Script" uid="uid://0fd2s1p88bty" path="res://planet/moon.gd" id="1_7vi6w"] +[ext_resource type="Texture2D" uid="uid://dsrfhl3ite17a" path="res://assets/moon-Sheet.png" id="2_me4u8"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_7tpi7"] +atlas = ExtResource("2_me4u8") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gx5av"] +atlas = ExtResource("2_me4u8") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_i1mwm"] +atlas = ExtResource("2_me4u8") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7m2jd"] +atlas = ExtResource("2_me4u8") +region = Rect2(96, 0, 32, 32) + +[sub_resource type="SpriteFrames" id="SpriteFrames_ux8so"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_7tpi7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gx5av") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_i1mwm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7m2jd") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="CircleShape2D" id="CircleShape2D_7vi6w"] + +[node name="moon" type="Area2D"] +texture_filter = 1 +scale = Vector2(4, 4) +script = ExtResource("1_7vi6w") + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] +sprite_frames = SubResource("SpriteFrames_ux8so") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_7vi6w") + +[connection signal="area_entered" from="." to="." method="_on_area_entered"] diff --git a/rund-um-die-welten/planet/planet_v_2.gd b/rund-um-die-welten/planet/planet_v_2.gd new file mode 100644 index 0000000..975a40f --- /dev/null +++ b/rund-um-die-welten/planet/planet_v_2.gd @@ -0,0 +1,150 @@ +extends Area2D + +@export var size_scale := 1.0 # Standardgröße (1 = 100%) + +# for differentiating different planets +@export var planet_type: GlobalVariables.planets: + set(value): + planet_type = value + fit_planet_type(value) + +@export var win_planet = false: + set(value): + win_planet = value + if value: + $goal.visible = true + else: + $goal.visible = false + +@export var win_message = "You reached the goal" + +@export var death_message_overwrite: String + +@export var speed = 300 + +@export var clockwise = true: + set (value): + clockwise = value + $rotation_indicator.clockwise = clockwise + $rotation_indicator.set_info() + + +@export var collision_enabled = true + +@export var moon = true +@export var moon_radius = 150 +@export var moon_speed = 150 + +var planet_radius = 40 +func _ready(): + + # Collision anpassen (wenn z. B. CircleShape2D) + # Reaktion auf Klick + input_pickable = true + + # set rotation direction of rotation indicator + $rotation_indicator.clockwise = clockwise + + fit_planet_type(planet_type) + + # if planet is target, display goal texture + if win_planet: + $goal.visible = true + + # set info of direction indicator, for updating + $rotation_indicator.set_info() + + $moon.vis = moon + $moon.circle_radius = moon_radius + $moon.circle_speed = moon_speed + if moon: + print("show moon") + $moon.visible = true + + + +func fit_planet_type(new_planet_type): + var shape = $CollisionShape2D.shape + # change size of collision area and animation based on which planet is chosen + match new_planet_type: + GlobalVariables.planets.DeathStar: + size_scale = 1.5 + $death_star.play("default") + $death_star.visible = true + $goal/mars_goal.visible = true + $rotation_indicator.radius = 23 + GlobalVariables.planets.Mars: + size_scale = 1.5 + $mars.play("default") + $mars.visible = true + $goal/mars_goal.visible = true + $rotation_indicator.radius = 23 + GlobalVariables.planets.Earth: + size_scale = 4.2 + $earth.play("default") + $earth.visible = true + $goal/earth_goal.visible = true + $rotation_indicator.radius = 50 + GlobalVariables.planets.Sun: + size_scale = 4.8 + $sun.play("default") + $sun.visible = true + $goal/sun_goal.visible = true + $rotation_indicator.radius = 60 + GlobalVariables.planets.Plant: + size_scale = 2.0 + $plant.play("default") + $plant.visible = true + $goal/plant_goal.visible = true + $rotation_indicator.radius = 25 + GlobalVariables.planets.Soap: + size_scale = 1.9 + $soap.play("default") + $soap.visible = true + $goal/plant_goal.visible = true + $rotation_indicator.radius = 23 + GlobalVariables.planets.Magma: + size_scale = 1.4 + $magma.play("default") + $magma.visible = true + $goal/mars_goal.visible = true + $rotation_indicator.radius = 20 + GlobalVariables.planets.Bowling: + size_scale = 1.5 + $bowling.play("default") + $bowling.visible = true + $goal/mars_goal.visible = true + $rotation_indicator.radius = 22 + + shape.radius = 10 * size_scale + planet_radius = 10 * size_scale + $rotation_indicator.set_info() + +func _input_event(_viewport, event, _shape_idx): + if event is InputEventMouseButton and event.pressed: + GlobalVariables.target_planet_position = global_position + GlobalVariables.player_speed = speed + GlobalVariables.player_clockwise = clockwise + + +func _on_area_entered(area: Area2D) -> void: + if collision_enabled: + # if area in player group entered, kill player + if area.is_in_group("player"): + if win_planet: + GlobalVariables.levels[GlobalVariables.selected_level] = 1 + GlobalVariables.emit_level_done(win_message) + else: + if death_message_overwrite: + GlobalVariables.emit_player_died(death_message_overwrite) + else: + GlobalVariables.emit_player_died("You crashed into the " + GlobalVariables.planet_names[planet_type]) + print(area.position) + + +func _physics_process(_delta: float) -> void: + # set target symbol to visible if current planet is targeted + if GlobalVariables.target_planet_position == global_position: + $target.visible = true + else: + $target.visible = false diff --git a/rund-um-die-welten/planet/planet_v_2.gd.uid b/rund-um-die-welten/planet/planet_v_2.gd.uid new file mode 100644 index 0000000..2950a68 --- /dev/null +++ b/rund-um-die-welten/planet/planet_v_2.gd.uid @@ -0,0 +1 @@ +uid://dmq2ifxkvb5ci diff --git a/rund-um-die-welten/planet/planet_v_2.tscn b/rund-um-die-welten/planet/planet_v_2.tscn new file mode 100644 index 0000000..e79e9da --- /dev/null +++ b/rund-um-die-welten/planet/planet_v_2.tscn @@ -0,0 +1,554 @@ +[gd_scene load_steps=80 format=3 uid="uid://bmlfyt1ykh3aq"] + +[ext_resource type="Script" uid="uid://dmq2ifxkvb5ci" path="res://planet/planet_v_2.gd" id="1_ouy4y"] +[ext_resource type="Texture2D" uid="uid://dneiw5b2ikvx1" path="res://assets/deathstar-Sheet.png" id="2_b8nw5"] +[ext_resource type="Texture2D" uid="uid://beinvbs42eerv" path="res://assets/mars-Sheet.png" id="3_bbsm5"] +[ext_resource type="Texture2D" uid="uid://tc7fdj1vhi77" path="res://assets/earth-Sheet.png" id="4_s1de2"] +[ext_resource type="Texture2D" uid="uid://dwexh018a47or" path="res://assets/sun-Sheet.png" id="5_olrr2"] +[ext_resource type="Texture2D" uid="uid://7g0xuyyepl4o" path="res://assets/soap-planet-Sheet.png" id="6_nr5bh"] +[ext_resource type="Texture2D" uid="uid://bk4idfu5vf2g7" path="res://assets/death_star_goal.png" id="6_olrr2"] +[ext_resource type="Texture2D" uid="uid://dr2h23pobgxwt" path="res://assets/earth_goal.png" id="6_yv8ck"] +[ext_resource type="Texture2D" uid="uid://nowsaqepmaof" path="res://assets/plant-planet-Sheet.png" id="7_nb57l"] +[ext_resource type="Texture2D" uid="uid://c6yo05aibftjg" path="res://assets/sun_goal.png" id="8_itp2c"] +[ext_resource type="Texture2D" uid="uid://nrs8ax6wrs40" path="res://assets/magma-planet-Sheet.png" id="8_slxe4"] +[ext_resource type="Texture2D" uid="uid://cl756ckjgfbqr" path="res://assets/target.png" id="9_itp2c"] +[ext_resource type="Texture2D" uid="uid://cq0057ksvwtxh" path="res://assets/bowling-planet-Sheet.png" id="9_tqh4j"] +[ext_resource type="PackedScene" uid="uid://boss86i1awyuk" path="res://planet/rotation_indicator.tscn" id="10_3lv2v"] +[ext_resource type="Texture2D" uid="uid://bnfn04p5ojv1h" path="res://assets/plant_goal.png" id="11_nb57l"] +[ext_resource type="PackedScene" uid="uid://cgeeatxwjsuf8" path="res://planet/moon.tscn" id="14_p2y8r"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_bbsm5"] +atlas = ExtResource("2_b8nw5") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ui15a"] +atlas = ExtResource("2_b8nw5") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_s1de2"] +atlas = ExtResource("2_b8nw5") +region = Rect2(128, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_olrr2"] +atlas = ExtResource("2_b8nw5") +region = Rect2(192, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_04t3g"] +atlas = ExtResource("2_b8nw5") +region = Rect2(256, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yv8ck"] +atlas = ExtResource("2_b8nw5") +region = Rect2(320, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_itp2c"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_bbsm5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ui15a") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_s1de2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_olrr2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_04t3g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yv8ck") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yv8ck") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yv8ck") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_itp2c"] +atlas = ExtResource("3_bbsm5") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3lv2v"] +atlas = ExtResource("3_bbsm5") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gtho3"] +atlas = ExtResource("3_bbsm5") +region = Rect2(128, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_nr5bh"] +atlas = ExtResource("3_bbsm5") +region = Rect2(192, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_nb57l"] +atlas = ExtResource("3_bbsm5") +region = Rect2(256, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_p2y8r"] +atlas = ExtResource("3_bbsm5") +region = Rect2(320, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_slxe4"] +atlas = ExtResource("3_bbsm5") +region = Rect2(384, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_tqh4j"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_itp2c") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3lv2v") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gtho3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nr5bh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nb57l") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_p2y8r") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_slxe4") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_tqh4j"] +atlas = ExtResource("4_s1de2") +region = Rect2(0, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kf5cc"] +atlas = ExtResource("4_s1de2") +region = Rect2(128, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_p1joq"] +atlas = ExtResource("4_s1de2") +region = Rect2(256, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_shlva"] +atlas = ExtResource("4_s1de2") +region = Rect2(384, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0ux4r"] +atlas = ExtResource("4_s1de2") +region = Rect2(512, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gn3vu"] +atlas = ExtResource("4_s1de2") +region = Rect2(640, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4tqgq"] +atlas = ExtResource("4_s1de2") +region = Rect2(768, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mnabc"] +atlas = ExtResource("4_s1de2") +region = Rect2(896, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qfl2n"] +atlas = ExtResource("4_s1de2") +region = Rect2(1024, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ldh80"] +atlas = ExtResource("4_s1de2") +region = Rect2(1152, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ak7c4"] +atlas = ExtResource("4_s1de2") +region = Rect2(1280, 0, 128, 128) + +[sub_resource type="SpriteFrames" id="SpriteFrames_nvr4p"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_tqh4j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kf5cc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_p1joq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_shlva") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0ux4r") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gn3vu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4tqgq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mnabc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qfl2n") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ldh80") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ak7c4") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_smsyj"] +atlas = ExtResource("5_olrr2") +region = Rect2(0, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cwr30"] +atlas = ExtResource("5_olrr2") +region = Rect2(128, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_crxfw"] +atlas = ExtResource("5_olrr2") +region = Rect2(256, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mtx4k"] +atlas = ExtResource("5_olrr2") +region = Rect2(384, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_n5nit"] +atlas = ExtResource("5_olrr2") +region = Rect2(512, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kh5hc"] +atlas = ExtResource("5_olrr2") +region = Rect2(640, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_sw4ah"] +atlas = ExtResource("5_olrr2") +region = Rect2(768, 0, 128, 128) + +[sub_resource type="AtlasTexture" id="AtlasTexture_57ffn"] +atlas = ExtResource("5_olrr2") +region = Rect2(896, 0, 128, 128) + +[sub_resource type="SpriteFrames" id="SpriteFrames_15lue"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_smsyj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cwr30") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_crxfw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mtx4k") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_n5nit") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kh5hc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_sw4ah") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_57ffn") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_nvr4p"] +atlas = ExtResource("6_nr5bh") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_15lue"] +atlas = ExtResource("6_nr5bh") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ghe7c"] +atlas = ExtResource("6_nr5bh") +region = Rect2(128, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hwtqk"] +atlas = ExtResource("6_nr5bh") +region = Rect2(192, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0wsyh"] +atlas = ExtResource("6_nr5bh") +region = Rect2(256, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_q2w4b"] +atlas = ExtResource("6_nr5bh") +region = Rect2(320, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_wda2a"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_nvr4p") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_15lue") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ghe7c") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hwtqk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0wsyh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_q2w4b") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_xy5x4"] +atlas = ExtResource("7_nb57l") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qd002"] +atlas = ExtResource("7_nb57l") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_e6ydo"] +atlas = ExtResource("7_nb57l") +region = Rect2(128, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bhc3j"] +atlas = ExtResource("7_nb57l") +region = Rect2(192, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_75iaq"] +atlas = ExtResource("7_nb57l") +region = Rect2(256, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_q52nj"] +atlas = ExtResource("7_nb57l") +region = Rect2(320, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_qf3pl"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_xy5x4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qd002") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_e6ydo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bhc3j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_75iaq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_q52nj") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_wda2a"] +atlas = ExtResource("8_slxe4") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qf3pl"] +atlas = ExtResource("8_slxe4") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tsk8r"] +atlas = ExtResource("8_slxe4") +region = Rect2(128, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mq67j"] +atlas = ExtResource("8_slxe4") +region = Rect2(192, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_r4pmd"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_wda2a") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qf3pl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tsk8r") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mq67j") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_r4pmd"] +atlas = ExtResource("9_tqh4j") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6kcnr"] +atlas = ExtResource("9_tqh4j") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_uo6au"] +atlas = ExtResource("9_tqh4j") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lb6ps"] +atlas = ExtResource("9_tqh4j") +region = Rect2(96, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_250er"] +atlas = ExtResource("9_tqh4j") +region = Rect2(128, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_d6yx8"] +atlas = ExtResource("9_tqh4j") +region = Rect2(160, 0, 32, 32) + +[sub_resource type="SpriteFrames" id="SpriteFrames_87xh3"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_r4pmd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6kcnr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_uo6au") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lb6ps") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_250er") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_d6yx8") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] + +[sub_resource type="CircleShape2D" id="CircleShape2D_s1de2"] +resource_local_to_scene = true + +[node name="planet_v2" type="Area2D"] +texture_filter = 1 +scale = Vector2(4, 4) +script = ExtResource("1_ouy4y") +moon = false + +[node name="death_star" type="AnimatedSprite2D" parent="."] +visible = false +texture_filter = 1 +sprite_frames = SubResource("SpriteFrames_itp2c") + +[node name="death_star2" type="AnimatedSprite2D" parent="."] +visible = false +texture_filter = 1 +sprite_frames = SubResource("SpriteFrames_itp2c") + +[node name="mars" type="AnimatedSprite2D" parent="."] +visible = false +texture_filter = 1 +sprite_frames = SubResource("SpriteFrames_tqh4j") + +[node name="earth" type="AnimatedSprite2D" parent="."] +visible = false +texture_filter = 1 +sprite_frames = SubResource("SpriteFrames_nvr4p") + +[node name="sun" type="AnimatedSprite2D" parent="."] +visible = false +texture_filter = 1 +sprite_frames = SubResource("SpriteFrames_15lue") + +[node name="soap" type="AnimatedSprite2D" parent="."] +visible = false +sprite_frames = SubResource("SpriteFrames_wda2a") + +[node name="plant" type="AnimatedSprite2D" parent="."] +visible = false +sprite_frames = SubResource("SpriteFrames_qf3pl") + +[node name="magma" type="AnimatedSprite2D" parent="."] +visible = false +sprite_frames = SubResource("SpriteFrames_r4pmd") + +[node name="bowling" type="AnimatedSprite2D" parent="."] +visible = false +sprite_frames = SubResource("SpriteFrames_87xh3") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_s1de2") + +[node name="goal" type="Node2D" parent="."] +visible = false +texture_filter = 1 + +[node name="earth_goal" type="Sprite2D" parent="goal"] +visible = false +texture = ExtResource("6_yv8ck") + +[node name="mars_goal" type="Sprite2D" parent="goal"] +visible = false +texture_filter = 1 +texture = ExtResource("6_olrr2") + +[node name="sun_goal" type="Sprite2D" parent="goal"] +visible = false +texture = ExtResource("8_itp2c") + +[node name="plant_goal" type="Sprite2D" parent="goal"] +visible = false +texture = ExtResource("11_nb57l") + +[node name="target" type="Sprite2D" parent="."] +visible = false +texture_filter = 1 +texture = ExtResource("9_itp2c") + +[node name="rotation_indicator" parent="." instance=ExtResource("10_3lv2v")] +scale = Vector2(1, 1) + +[node name="moon" parent="." instance=ExtResource("14_p2y8r")] +visible = false +top_level = true + +[connection signal="area_entered" from="." to="." method="_on_area_entered"] diff --git a/rund-um-die-welten/planet/rotation_indicator.gd b/rund-um-die-welten/planet/rotation_indicator.gd new file mode 100644 index 0000000..c3be7be --- /dev/null +++ b/rund-um-die-welten/planet/rotation_indicator.gd @@ -0,0 +1,31 @@ +extends Node2D + +var clockwise = false +var angular_speed = 100 +var radius = 100 + + +func set_info() -> void: + # set which sprites to use + if not clockwise: + $left_1.visible = true + $left_2.visible = true + $right_1.visible = false + $right_1.visible = false + else: + $right_1.visible = true + $right_2.visible = true + $left_1.visible = false + $left_2.visible = false + + $left_1.position.x = radius + $left_2.position.x = radius * -1 + $right_1.position.x = radius + $right_2.position.x = radius * -1 + +func _physics_process(delta: float) -> void: + # rotate in direction + if clockwise: + rotation += deg_to_rad(angular_speed)*delta + else: + rotation -= deg_to_rad(angular_speed)*delta diff --git a/rund-um-die-welten/planet/rotation_indicator.gd.uid b/rund-um-die-welten/planet/rotation_indicator.gd.uid new file mode 100644 index 0000000..59066f3 --- /dev/null +++ b/rund-um-die-welten/planet/rotation_indicator.gd.uid @@ -0,0 +1 @@ +uid://r3hli2epberv diff --git a/rund-um-die-welten/planet/rotation_indicator.tscn b/rund-um-die-welten/planet/rotation_indicator.tscn new file mode 100644 index 0000000..d7dfd2c --- /dev/null +++ b/rund-um-die-welten/planet/rotation_indicator.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=4 format=3 uid="uid://boss86i1awyuk"] + +[ext_resource type="Script" uid="uid://r3hli2epberv" path="res://planet/rotation_indicator.gd" id="1_tuu6l"] +[ext_resource type="Texture2D" uid="uid://cbbdbeppwu6e2" path="res://assets/right-arrow.png" id="2_qlssn"] +[ext_resource type="Texture2D" uid="uid://cuk7k70x2b2kw" path="res://assets/left-arrow.png" id="3_qlssn"] + +[node name="rotation_indicator" type="Node2D"] +texture_filter = 1 +scale = Vector2(4, 4) +script = ExtResource("1_tuu6l") + +[node name="right_1" type="Sprite2D" parent="."] +visible = false +rotation = 3.14159 +texture = ExtResource("2_qlssn") + +[node name="right_2" type="Sprite2D" parent="."] +visible = false +texture = ExtResource("2_qlssn") + +[node name="left_1" type="Sprite2D" parent="."] +visible = false +rotation = 3.14159 +texture = ExtResource("3_qlssn") + +[node name="left_2" type="Sprite2D" parent="."] +visible = false +texture = ExtResource("3_qlssn") diff --git a/rund-um-die-welten/player/death_animation.gd b/rund-um-die-welten/player/death_animation.gd new file mode 100644 index 0000000..00a130f --- /dev/null +++ b/rund-um-die-welten/player/death_animation.gd @@ -0,0 +1,8 @@ +extends Node2D + +func _ready() -> void: + $AnimatedSprite2D.play() + + +func _on_animated_sprite_2d_animation_looped() -> void: + $AnimatedSprite2D.visible = false diff --git a/rund-um-die-welten/player/death_animation.gd.uid b/rund-um-die-welten/player/death_animation.gd.uid new file mode 100644 index 0000000..b9dc927 --- /dev/null +++ b/rund-um-die-welten/player/death_animation.gd.uid @@ -0,0 +1 @@ +uid://iprsjefi33q0 diff --git a/rund-um-die-welten/player/death_animation.tscn b/rund-um-die-welten/player/death_animation.tscn new file mode 100644 index 0000000..7f0b8f8 --- /dev/null +++ b/rund-um-die-welten/player/death_animation.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=11 format=3 uid="uid://cfpgrukw6wm54"] + +[ext_resource type="Script" uid="uid://iprsjefi33q0" path="res://player/death_animation.gd" id="1_g67hj"] +[ext_resource type="Texture2D" uid="uid://be8rbanobce5e" path="res://assets/ship-destroyed-Sheet.png" id="1_ynxyy"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_ynxyy"] +atlas = ExtResource("1_ynxyy") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_g67hj"] +atlas = ExtResource("1_ynxyy") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3gi3u"] +atlas = ExtResource("1_ynxyy") +region = Rect2(128, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5mer2"] +atlas = ExtResource("1_ynxyy") +region = Rect2(192, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_m1sk3"] +atlas = ExtResource("1_ynxyy") +region = Rect2(256, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jd1k0"] +atlas = ExtResource("1_ynxyy") +region = Rect2(320, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cg0m8"] +atlas = ExtResource("1_ynxyy") +region = Rect2(384, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_1jhdg"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_ynxyy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_g67hj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3gi3u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5mer2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_m1sk3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jd1k0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cg0m8") +}], +"loop": true, +"name": &"default", +"speed": 10.0 +}] + +[node name="death_animation" type="Node2D"] +process_mode = 3 +texture_filter = 1 +script = ExtResource("1_g67hj") + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] +sprite_frames = SubResource("SpriteFrames_1jhdg") +frame = 1 +frame_progress = 0.444371 + +[connection signal="animation_looped" from="AnimatedSprite2D" to="." method="_on_animated_sprite_2d_animation_looped"] diff --git a/rund-um-die-welten/player/player.gd b/rund-um-die-welten/player/player.gd new file mode 100644 index 0000000..61f190c --- /dev/null +++ b/rund-um-die-welten/player/player.gd @@ -0,0 +1,103 @@ +extends Area2D + +# angle +@export var spawn_rotation = 0 +@export var dies_on_screen_leave = false +@export var respawn_point: Vector2 +@export var auto_respawn = false + +@export var center_boost_cooldown = 10 +@export var center_boost_force = 200 +@export var center_boost_duration = 1 +# can player boost? +var boostable = true +var boosting = false +@export var center_boost_disable = false + +func _ready() -> void: + $AnimatedSprite2D.play(GlobalVariables.player_skin) + + $VisibleOnScreenNotifier2D.screen_exited.connect(_on_screen_exited) + $VisibleOnScreenNotifier2D.screen_entered.connect(_on_screen_entered) + GlobalVariables.player_died.connect(player_dies) + rotation = spawn_rotation + + # set boost cooldown + $boost_cooldown.wait_time = center_boost_cooldown + $boost_duration.wait_time = center_boost_duration + +func _physics_process(delta: float) -> void: + $AnimatedSprite2D.play(GlobalVariables.player_skin) + + if(Input.is_action_just_pressed("escape") and not GlobalVariables.in_main_menu): + player_dies("You chose the easy way out") + + if(GlobalVariables.target_planet_position): + # calculate movement + var radius = position.distance_to(GlobalVariables.target_planet_position) + var angle = (position-GlobalVariables.target_planet_position).angle() + + var angular_speed = GlobalVariables.player_speed/radius + + if GlobalVariables.player_clockwise: + angle += angular_speed*delta + else: + angle -= angular_speed*delta + + if Input.is_action_just_pressed("center_boost") and boostable and not center_boost_disable: + boostable = false + boosting = true + $boost_duration.start() + $boost_cooldown.start() + + if boosting: + radius -= delta*center_boost_force + + position = GlobalVariables.target_planet_position+Vector2(cos(angle), sin(angle))*radius + + + #print(angle) + rotation = angle + deg_to_rad(180) + + if boosting: + rotation *= 1.5 + + if GlobalVariables.player_clockwise: + rotation = angle + deg_to_rad(180) + if boosting: + rotation += 1 + else: + rotation = angle + if boosting: + rotation -= 1 + + +#Dummy function for player death: +func player_dies(death_message: String) -> void: + print(death_message) + if auto_respawn: + position = respawn_point + elif(GlobalVariables.target_planet_position or death_message == "You chose the easy way out"): + add_child(load("res://player/death_animation.tscn").instantiate()) + $AnimatedSprite2D.visible = false + $CPUParticles2D.emitting = false + if(death_message != "You chose the easy way out"): + GlobalVariables.death_counter += 1 + GlobalVariables.emit_game_over(death_message) + + + +func _on_screen_exited(): + if dies_on_screen_leave: + GlobalVariables.emit_player_died("You left the mission area") + +func _on_screen_entered(): + pass + + +func _on_boost_cooldown_timeout() -> void: + boostable = true + + +func _on_boost_duration_timeout() -> void: + boosting = false diff --git a/rund-um-die-welten/player/player.gd.uid b/rund-um-die-welten/player/player.gd.uid new file mode 100644 index 0000000..b1e6086 --- /dev/null +++ b/rund-um-die-welten/player/player.gd.uid @@ -0,0 +1 @@ +uid://dw7a4ejn3gkop diff --git a/rund-um-die-welten/player/player.tscn b/rund-um-die-welten/player/player.tscn new file mode 100644 index 0000000..baa2fab --- /dev/null +++ b/rund-um-die-welten/player/player.tscn @@ -0,0 +1,177 @@ +[gd_scene load_steps=25 format=3 uid="uid://d0h7r8gitcntt"] + +[ext_resource type="Script" uid="uid://dw7a4ejn3gkop" path="res://player/player.gd" id="1_oul6g"] +[ext_resource type="Texture2D" uid="uid://bsplo07cfs8of" path="res://assets/battlecruiser-Sheet.png" id="3_boad6"] +[ext_resource type="Texture2D" uid="uid://ws2nc8w43ys0" path="res://assets/rocket-Sheet.png" id="3_g1dw6"] +[ext_resource type="Texture2D" uid="uid://b8y87eesj4hgj" path="res://assets/particle.png" id="3_yw30f"] +[ext_resource type="Texture2D" uid="uid://dfdiudiwcupuo" path="res://assets/enterprise-Sheet.png" id="4_qjkh3"] +[ext_resource type="Texture2D" uid="uid://bbbbqfabbltie" path="res://assets/falcon-Sheet.png" id="5_boad6"] +[ext_resource type="Texture2D" uid="uid://deenw7xttt8ub" path="res://assets/x-wing-Sheet.png" id="5_g6k8r"] +[ext_resource type="Texture2D" uid="uid://vn8hx6amejdh" path="res://assets/light-texture.png" id="7_boad6"] +[ext_resource type="Texture2D" uid="uid://bed36v3mjpg4o" path="res://assets/sputnik.png" id="7_hg6s5"] + +[sub_resource type="Gradient" id="Gradient_g1dw6"] +offsets = PackedFloat32Array(0, 0.12, 0.286667, 0.46, 0.726667, 0.993333) +colors = PackedColorArray(0.984314, 0.435294, 0, 1, 1, 0.729412, 0.305882, 1, 0.93, 0.7595, 0, 0.796078, 1, 1, 1, 0.756863, 1, 1, 1, 0.552941, 1, 1, 1, 0) + +[sub_resource type="Curve" id="Curve_g1dw6"] +_limits = [-1.0, 1.0, 0.0, 1.0] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="AtlasTexture" id="AtlasTexture_yllr7"] +atlas = ExtResource("3_boad6") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kb6p2"] +atlas = ExtResource("3_boad6") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rkbax"] +atlas = ExtResource("3_g1dw6") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_g1dw6"] +atlas = ExtResource("3_g1dw6") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_boad6"] +atlas = ExtResource("4_qjkh3") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rgyib"] +atlas = ExtResource("4_qjkh3") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2ieo8"] +atlas = ExtResource("5_boad6") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ebec5"] +atlas = ExtResource("5_boad6") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wodsf"] +atlas = ExtResource("7_hg6s5") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hg6s5"] +atlas = ExtResource("5_g6k8r") +region = Rect2(0, 0, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8t03j"] +atlas = ExtResource("5_g6k8r") +region = Rect2(64, 0, 64, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_g6k8r"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_yllr7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kb6p2") +}], +"loop": true, +"name": &"battlecruiser", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_rkbax") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_g1dw6") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_boad6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rgyib") +}], +"loop": true, +"name": &"enterprise", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_2ieo8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ebec5") +}], +"loop": true, +"name": &"falcon", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_wodsf") +}], +"loop": true, +"name": &"sputnik", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_hg6s5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8t03j") +}], +"loop": true, +"name": &"x-wing", +"speed": 5.0 +}] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_g1dw6"] +size = Vector2(14.5, 18.5) + +[node name="player" type="Area2D"] +scale = Vector2(4, 4) +script = ExtResource("1_oul6g") + +[node name="CPUParticles2D" type="CPUParticles2D" parent="."] +process_mode = 3 +texture_filter = 1 +position = Vector2(0.25, 11.75) +amount = 50 +texture = ExtResource("3_yw30f") +lifetime = 2.0 +emission_shape = 1 +emission_sphere_radius = 5.0 +gravity = Vector2(0, 0) +color_ramp = SubResource("Gradient_g1dw6") +hue_variation_curve = SubResource("Curve_g1dw6") + +[node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="."] + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] +texture_filter = 1 +sprite_frames = SubResource("SpriteFrames_g6k8r") +animation = &"sputnik" + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(0.25, -0.25) +shape = SubResource("RectangleShape2D_g1dw6") + +[node name="boost_cooldown" type="Timer" parent="."] +one_shot = true + +[node name="boost_duration" type="Timer" parent="."] +one_shot = true + +[node name="PointLight2D" type="PointLight2D" parent="."] +position = Vector2(1, 11.75) +color = Color(0.997545, 0.937135, 0.53078, 1) +energy = 2.27 +texture = ExtResource("7_boad6") +texture_scale = 0.55 + +[connection signal="timeout" from="boost_cooldown" to="." method="_on_boost_cooldown_timeout"] +[connection signal="timeout" from="boost_duration" to="." method="_on_boost_duration_timeout"] diff --git a/rund-um-die-welten/player_temp.aseprite b/rund-um-die-welten/player_temp.aseprite new file mode 100644 index 0000000..42e6dcf Binary files /dev/null and b/rund-um-die-welten/player_temp.aseprite differ diff --git a/rund-um-die-welten/player_temp.png b/rund-um-die-welten/player_temp.png new file mode 100644 index 0000000..a44454f Binary files /dev/null and b/rund-um-die-welten/player_temp.png differ diff --git a/rund-um-die-welten/rund-um-die-welten.exe b/rund-um-die-welten/rund-um-die-welten.exe new file mode 100644 index 0000000..8abc06b Binary files /dev/null and b/rund-um-die-welten/rund-um-die-welten.exe differ diff --git a/rund-um-die-welten/rund-um-die-welten.x86_64 b/rund-um-die-welten/rund-um-die-welten.x86_64 new file mode 100644 index 0000000..e36c13e Binary files /dev/null and b/rund-um-die-welten/rund-um-die-welten.x86_64 differ diff --git a/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.apple-touch-icon.png b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.apple-touch-icon.png new file mode 100644 index 0000000..4299b3e Binary files /dev/null and b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.apple-touch-icon.png differ diff --git a/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.audio.position.worklet.js b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.audio.position.worklet.js new file mode 100644 index 0000000..4e512c1 --- /dev/null +++ b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.audio.position.worklet.js @@ -0,0 +1,66 @@ +/**************************************************************************/ +/* godot.audio.position.worklet.js */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +class GodotPositionReportingProcessor extends AudioWorkletProcessor { + static get parameterDescriptors() { + return [ + { + name: 'reset', + defaultValue: 0, + minValue: 0, + maxValue: 1, + automationRate: 'k-rate', + }, + ]; + } + + constructor(...args) { + super(...args); + this.position = 0; + } + + process(inputs, _outputs, parameters) { + if (parameters['reset'][0] > 0) { + this.position = 0; + } + + if (inputs.length > 0) { + const input = inputs[0]; + if (input.length > 0) { + this.position += input[0].length; + this.port.postMessage({ type: 'position', data: this.position }); + } + } + + return true; + } +} + +registerProcessor('godot-position-reporting-processor', GodotPositionReportingProcessor); diff --git a/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.audio.worklet.js b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.audio.worklet.js new file mode 100644 index 0000000..3b94cab --- /dev/null +++ b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.audio.worklet.js @@ -0,0 +1,213 @@ +/**************************************************************************/ +/* audio.worklet.js */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +class RingBuffer { + constructor(p_buffer, p_state, p_threads) { + this.buffer = p_buffer; + this.avail = p_state; + this.threads = p_threads; + this.rpos = 0; + this.wpos = 0; + } + + data_left() { + return this.threads ? Atomics.load(this.avail, 0) : this.avail; + } + + space_left() { + return this.buffer.length - this.data_left(); + } + + read(output) { + const size = this.buffer.length; + let from = 0; + let to_write = output.length; + if (this.rpos + to_write > size) { + const high = size - this.rpos; + output.set(this.buffer.subarray(this.rpos, size)); + from = high; + to_write -= high; + this.rpos = 0; + } + if (to_write) { + output.set(this.buffer.subarray(this.rpos, this.rpos + to_write), from); + } + this.rpos += to_write; + if (this.threads) { + Atomics.add(this.avail, 0, -output.length); + Atomics.notify(this.avail, 0); + } else { + this.avail -= output.length; + } + } + + write(p_buffer) { + const to_write = p_buffer.length; + const mw = this.buffer.length - this.wpos; + if (mw >= to_write) { + this.buffer.set(p_buffer, this.wpos); + this.wpos += to_write; + if (mw === to_write) { + this.wpos = 0; + } + } else { + const high = p_buffer.subarray(0, mw); + const low = p_buffer.subarray(mw); + this.buffer.set(high, this.wpos); + this.buffer.set(low); + this.wpos = low.length; + } + if (this.threads) { + Atomics.add(this.avail, 0, to_write); + Atomics.notify(this.avail, 0); + } else { + this.avail += to_write; + } + } +} + +class GodotProcessor extends AudioWorkletProcessor { + constructor() { + super(); + this.threads = false; + this.running = true; + this.lock = null; + this.notifier = null; + this.output = null; + this.output_buffer = new Float32Array(); + this.input = null; + this.input_buffer = new Float32Array(); + this.port.onmessage = (event) => { + const cmd = event.data['cmd']; + const data = event.data['data']; + this.parse_message(cmd, data); + }; + } + + process_notify() { + if (this.notifier) { + Atomics.add(this.notifier, 0, 1); + Atomics.notify(this.notifier, 0); + } + } + + parse_message(p_cmd, p_data) { + if (p_cmd === 'start' && p_data) { + const state = p_data[0]; + let idx = 0; + this.threads = true; + this.lock = state.subarray(idx, ++idx); + this.notifier = state.subarray(idx, ++idx); + const avail_in = state.subarray(idx, ++idx); + const avail_out = state.subarray(idx, ++idx); + this.input = new RingBuffer(p_data[1], avail_in, true); + this.output = new RingBuffer(p_data[2], avail_out, true); + } else if (p_cmd === 'stop') { + this.running = false; + this.output = null; + this.input = null; + this.lock = null; + this.notifier = null; + } else if (p_cmd === 'start_nothreads') { + this.output = new RingBuffer(p_data[0], p_data[0].length, false); + } else if (p_cmd === 'chunk') { + this.output.write(p_data); + } + } + + static array_has_data(arr) { + return arr.length && arr[0].length && arr[0][0].length; + } + + process(inputs, outputs, parameters) { + if (!this.running) { + return false; // Stop processing. + } + if (this.output === null) { + return true; // Not ready yet, keep processing. + } + const process_input = GodotProcessor.array_has_data(inputs); + if (process_input) { + const input = inputs[0]; + const chunk = input[0].length * input.length; + if (this.input_buffer.length !== chunk) { + this.input_buffer = new Float32Array(chunk); + } + if (!this.threads) { + GodotProcessor.write_input(this.input_buffer, input); + this.port.postMessage({ 'cmd': 'input', 'data': this.input_buffer }); + } else if (this.input.space_left() >= chunk) { + GodotProcessor.write_input(this.input_buffer, input); + this.input.write(this.input_buffer); + } else { + // this.port.postMessage('Input buffer is full! Skipping input frame.'); // Uncomment this line to debug input buffer. + } + } + const process_output = GodotProcessor.array_has_data(outputs); + if (process_output) { + const output = outputs[0]; + const chunk = output[0].length * output.length; + if (this.output_buffer.length !== chunk) { + this.output_buffer = new Float32Array(chunk); + } + if (this.output.data_left() >= chunk) { + this.output.read(this.output_buffer); + GodotProcessor.write_output(output, this.output_buffer); + if (!this.threads) { + this.port.postMessage({ 'cmd': 'read', 'data': chunk }); + } + } else { + // this.port.postMessage('Output buffer has not enough frames! Skipping output frame.'); // Uncomment this line to debug output buffer. + } + } + this.process_notify(); + return true; + } + + static write_output(dest, source) { + const channels = dest.length; + for (let ch = 0; ch < channels; ch++) { + for (let sample = 0; sample < dest[ch].length; sample++) { + dest[ch][sample] = source[sample * channels + ch]; + } + } + } + + static write_input(dest, source) { + const channels = source.length; + for (let ch = 0; ch < channels; ch++) { + for (let sample = 0; sample < source[ch].length; sample++) { + dest[sample * channels + ch] = source[ch][sample]; + } + } + } +} + +registerProcessor('godot-processor', GodotProcessor); diff --git a/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.html b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.html new file mode 100644 index 0000000..447a205 --- /dev/null +++ b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.html @@ -0,0 +1,220 @@ + + + + + + Rund um die Welten + + + + + + + + Your browser does not support the canvas tag. + + + + +
+ + +
+
+ + + + + + diff --git a/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.icon.png b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.icon.png new file mode 100644 index 0000000..51cbc06 Binary files /dev/null and b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.icon.png differ diff --git a/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.js b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.js new file mode 100644 index 0000000..38130ab --- /dev/null +++ b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.js @@ -0,0 +1,927 @@ +var Godot = (() => { + var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; + return ( +async function(moduleArg = {}) { + var moduleRtn; + +var Module=moduleArg;var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof WorkerGlobalScope!="undefined";var ENVIRONMENT_IS_NODE=typeof process=="object"&&process.versions?.node&&process.type!="renderer";var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var readyPromiseResolve,readyPromiseReject;var wasmMemory;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;var runtimeExited=false;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["pf"]();FS.ignorePermissions=false}function preMain(){}function exitRuntime(){___funcs_on_exit();FS.quit();TTY.shutdown();IDBFS.quit();runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject?.(e);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("godot.web.template_debug.wasm32.nothreads.wasm")}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["of"];updateMemoryViews();wasmTable=wasmExports["xf"];assignWasmExports(wasmExports);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(mod,inst)=>{resolve(receiveInstance(mod,inst))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr];case"i8":return HEAP8[ptr];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP64[ptr>>3];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}var noExitRuntime=false;function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr]=value;break;case"i8":HEAP8[ptr]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":HEAP64[ptr>>3]=BigInt(value);break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}}var wasmTable;var getWasmTableEntry=funcPtr=>wasmTable.get(funcPtr);var ___call_sighandler=(fp,sig)=>getWasmTableEntry(fp)(sig);var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>view=>crypto.getRandomValues(view);var randomFill=view=>{(randomFill=initRandomFill())(view)};var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(...args)=>FS.createDataFile(...args);var getUniqueRunDependency=id=>id;var preloadPlugins=[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url).then(processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var IDBFS={dbs:{},indexedDB:()=>{if(typeof indexedDB!="undefined")return indexedDB;var ret=null;if(typeof window=="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;return ret},DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",queuePersist:mount=>{function onPersistComplete(){if(mount.idbPersistState==="again")startPersist();else mount.idbPersistState=0}function startPersist(){mount.idbPersistState="idb";IDBFS.syncfs(mount,false,onPersistComplete)}if(!mount.idbPersistState){mount.idbPersistState=setTimeout(startPersist,0)}else if(mount.idbPersistState==="idb"){mount.idbPersistState="again"}},mount:mount=>{var mnt=MEMFS.mount(mount);if(mount?.opts?.autoPersist){mnt.idbPersistState=0;var memfs_node_ops=mnt.node_ops;mnt.node_ops={...mnt.node_ops};mnt.node_ops.mknod=(parent,name,mode,dev)=>{var node=memfs_node_ops.mknod(parent,name,mode,dev);node.node_ops=mnt.node_ops;node.idbfs_mount=mnt.mount;node.memfs_stream_ops=node.stream_ops;node.stream_ops={...node.stream_ops};node.stream_ops.write=(stream,buffer,offset,length,position,canOwn)=>{stream.node.isModified=true;return node.memfs_stream_ops.write(stream,buffer,offset,length,position,canOwn)};node.stream_ops.close=stream=>{var n=stream.node;if(n.isModified){IDBFS.queuePersist(n.idbfs_mount);n.isModified=false}if(n.memfs_stream_ops.close)return n.memfs_stream_ops.close(stream)};return node};mnt.node_ops.mkdir=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.mkdir(...args));mnt.node_ops.rmdir=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.rmdir(...args));mnt.node_ops.symlink=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.symlink(...args));mnt.node_ops.unlink=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.unlink(...args));mnt.node_ops.rename=(...args)=>(IDBFS.queuePersist(mnt.mount),memfs_node_ops.rename(...args))}return mnt},syncfs:(mount,populate,callback)=>{IDBFS.getLocalSet(mount,(err,local)=>{if(err)return callback(err);IDBFS.getRemoteSet(mount,(err,remote)=>{if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)})})},quit:()=>{Object.values(IDBFS.dbs).forEach(value=>value.close());IDBFS.dbs={}},getDB:(name,callback)=>{var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback("Unable to connect to IndexedDB")}req.onupgradeneeded=e=>{var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}};req.onsuccess=()=>{db=req.result;IDBFS.dbs[name]=db;callback(null,db)};req.onerror=e=>{callback(e.target.error);e.preventDefault()}},getLocalSet:(mount,callback)=>{var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return p=>PATH.join2(root,p)}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push(...FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={timestamp:stat.mtime}}return callback(null,{type:"local",entries})},getRemoteSet:(mount,callback)=>{var entries={};IDBFS.getDB(mount.mountpoint,(err,db)=>{if(err)return callback(err);try{var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=e=>{callback(e.target.error);e.preventDefault()};var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=event=>{var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db,entries})}entries[cursor.primaryKey]={timestamp:cursor.key};cursor.continue()}}catch(e){return callback(e)}})},loadLocalEntry:(path,callback)=>{var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{timestamp:stat.mtime,mode:stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{timestamp:stat.mtime,mode:stat.mode,contents:node.contents})}else{return callback(new Error("node type not supported"))}},storeLocalEntry:(path,entry,callback)=>{try{if(FS.isDir(entry["mode"])){FS.mkdirTree(path,entry["mode"])}else if(FS.isFile(entry["mode"])){FS.writeFile(path,entry["contents"],{canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry["mode"]);FS.utime(path,entry["timestamp"],entry["timestamp"])}catch(e){return callback(e)}callback(null)},removeLocalEntry:(path,callback)=>{try{var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)},loadRemoteEntry:(store,path,callback)=>{var req=store.get(path);req.onsuccess=event=>callback(null,event.target.result);req.onerror=e=>{callback(e.target.error);e.preventDefault()}},storeRemoteEntry:(store,path,entry,callback)=>{try{var req=store.put(entry,path)}catch(e){callback(e);return}req.onsuccess=event=>callback();req.onerror=e=>{callback(e.target.error);e.preventDefault()}},removeRemoteEntry:(store,path,callback)=>{var req=store.delete(path);req.onsuccess=event=>callback();req.onerror=e=>{callback(e.target.error);e.preventDefault()}},reconcile:(src,dst,callback)=>{var total=0;var create=[];Object.keys(src.entries).forEach(key=>{var e=src.entries[key];var e2=dst.entries[key];if(!e2||e["timestamp"].getTime()!=e2["timestamp"].getTime()){create.push(key);total++}});var remove=[];Object.keys(dst.entries).forEach(key=>{if(!src.entries[key]){remove.push(key);total++}});if(!total){return callback(null)}var errored=false;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err&&!errored){errored=true;return callback(err)}}transaction.onerror=transaction.onabort=e=>{done(e.target.error);e.preventDefault()};transaction.oncomplete=e=>{if(!errored){callback(null)}};create.sort().forEach(path=>{if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(err,entry)=>{if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)})}else{IDBFS.loadLocalEntry(path,(err,entry)=>{if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)})}});remove.sort().reverse().forEach(path=>{if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}})}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,readFiles:{},ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);setattr(arg,attr)},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var setattr=FS.checkOpExists(node.node_ops.setattr,63);setattr(node,{atime,mtime})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}if(Module["logReadFiles"]&&!(flags&1)){if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){buf=UTF8ArrayToString(buf)}FS.close(stream);return buf},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){data=new Uint8Array(intArrayFromString(data,true))}if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS,IDBFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;_fflush(0);for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){HEAP32[buf+4>>2]=stats.bsize;HEAP32[buf+40>>2]=stats.bsize;HEAP32[buf+8>>2]=stats.blocks;HEAP32[buf+12>>2]=stats.bfree;HEAP32[buf+16>>2]=stats.bavail;HEAP32[buf+20>>2]=stats.files;HEAP32[buf+24>>2]=stats.ffree;HEAP32[buf+28>>2]=stats.fsid;HEAP32[buf+44>>2]=stats.flags;HEAP32[buf+36>>2]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_chdir(path){try{path=SYSCALLS.getStr(path);FS.chdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fchmod(fd,mode){try{FS.fchmod(fd,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();stream.flags|=arg;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){try{return SYSCALLS.writeStat(buf,FS.fstat(fd))}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function ___syscall_ftruncate64(fd,length){length=bigintToI53Checked(length);try{if(isNaN(length))return-61;FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>3]=BigInt(id);HEAP64[dirp+pos+8>>3]=BigInt((idx+1)*struct_size);HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.writeStat(buf,FS.lstat(path))}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_mknodat(dirfd,path,mode,dev){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~6400;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.writeStat(buf,nofollow?FS.lstat(path):FS.stat(path))}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.writeStat(buf,FS.stat(path))}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_statfs64(path,size,buf){try{SYSCALLS.writeStatFs(buf,FS.statfs(SYSCALLS.getStr(path)));return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_symlinkat(target,dirfd,linkpath){try{target=SYSCALLS.getStr(target);linkpath=SYSCALLS.getStr(linkpath);linkpath=SYSCALLS.calculateAt(dirfd,linkpath);FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(!flags){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{return-28}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};function __gmtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday}var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;if(!keepRuntimeAlive()){exitRuntime()}_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(runtimeExited){return}if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(runtimeExited||ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffsetDate.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP64[ptime>>3]=BigInt(nsec);return 0}var runtimeKeepalivePush=()=>{runtimeKeepaliveCounter+=1};var _emscripten_set_main_loop_timing=(mode,value)=>{MainLoop.timingMode=mode;MainLoop.timingValue=value;if(!MainLoop.func){return 1}if(!MainLoop.running){runtimeKeepalivePush();MainLoop.running=true}if(mode==0){MainLoop.scheduler=function MainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,MainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(MainLoop.runner,timeUntilNextTick)};MainLoop.method="timeout"}else if(mode==1){MainLoop.scheduler=function MainLoop_scheduler_rAF(){MainLoop.requestAnimationFrame(MainLoop.runner)};MainLoop.method="rAF"}else if(mode==2){if(typeof MainLoop.setImmediate=="undefined"){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var MainLoop_setImmediate_messageHandler=event=>{if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",MainLoop_setImmediate_messageHandler,true);MainLoop.setImmediate=func=>{setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){Module["setImmediates"]??=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}else{MainLoop.setImmediate=setImmediate}}MainLoop.scheduler=function MainLoop_scheduler_setImmediate(){MainLoop.setImmediate(MainLoop.runner)};MainLoop.method="immediate"}return 0};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var setMainLoop=(iterFunc,fps,simulateInfiniteLoop,arg,noSetTiming)=>{MainLoop.func=iterFunc;MainLoop.arg=arg;var thisMainLoopId=MainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=MainLoop.queue.shift();blocker.func(blocker.arg);if(MainLoop.remainingBlockers){var remaining=MainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){MainLoop.remainingBlockers=next}else{next=next+.5;MainLoop.remainingBlockers=(8*remaining+next)/9}}MainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(MainLoop.runner,0);return}if(!checkIsRunning())return;MainLoop.currentFrameNumber=MainLoop.currentFrameNumber+1|0;if(MainLoop.timingMode==1&&MainLoop.timingValue>1&&MainLoop.currentFrameNumber%MainLoop.timingValue!=0){MainLoop.scheduler();return}else if(MainLoop.timingMode==0){MainLoop.tickStartTime=_emscripten_get_now()}MainLoop.runIter(iterFunc);if(!checkIsRunning())return;MainLoop.scheduler()};if(!noSetTiming){if(fps>0){_emscripten_set_main_loop_timing(0,1e3/fps)}else{_emscripten_set_main_loop_timing(1,1)}MainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}};var MainLoop={running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],preMainLoop:[],postMainLoop:[],pause(){MainLoop.scheduler=null;MainLoop.currentlyRunningMainloop++},resume(){MainLoop.currentlyRunningMainloop++;var timingMode=MainLoop.timingMode;var timingValue=MainLoop.timingValue;var func=MainLoop.func;MainLoop.func=null;setMainLoop(func,0,false,MainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);MainLoop.scheduler()},updateStatus(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=MainLoop.remainingBlockers??0;var expected=MainLoop.expectedBlockers??0;if(remaining){if(remaining=MainLoop.nextRAF){MainLoop.nextRAF+=1e3/60}}var delay=Math.max(MainLoop.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame(func){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(func);return}var RAF=MainLoop.fakeRequestAnimationFrame;RAF(func)}};var _emscripten_cancel_main_loop=()=>{MainLoop.pause();MainLoop.func=null};var _emscripten_force_exit=status=>{__emscripten_runtime_keepalive_clear();_exit(status)};var getHeapMax=()=>2147483648;var _emscripten_get_heap_max=()=>getHeapMax();var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var maybeCStringToJsString=cString=>cString>2?UTF8ToString(cString):cString;var specialHTMLTargets=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];var findEventTarget=target=>{target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!="undefined"?document.querySelector(target):null);return domElement};var findCanvasEventTarget=findEventTarget;var _emscripten_set_canvas_element_size=(target,width,height)=>{var canvas=findCanvasEventTarget(target);if(!canvas)return-4;canvas.width=width;canvas.height=height;if(canvas.GLctxObject)GL.resizeOffscreenFramebuffer(canvas.GLctxObject);return 0};var _emscripten_set_main_loop=(func,fps,simulateInfiniteLoop)=>{var iterFunc=getWasmTableEntry(func);setMainLoop(iterFunc,fps,simulateInfiniteLoop)};var GLctx;var webgl_enable_ANGLE_instanced_arrays=ctx=>{var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=(index,divisor)=>ext["vertexAttribDivisorANGLE"](index,divisor);ctx["drawArraysInstanced"]=(mode,first,count,primcount)=>ext["drawArraysInstancedANGLE"](mode,first,count,primcount);ctx["drawElementsInstanced"]=(mode,count,type,indices,primcount)=>ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount);return 1}};var webgl_enable_OES_vertex_array_object=ctx=>{var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=()=>ext["createVertexArrayOES"]();ctx["deleteVertexArray"]=vao=>ext["deleteVertexArrayOES"](vao);ctx["bindVertexArray"]=vao=>ext["bindVertexArrayOES"](vao);ctx["isVertexArray"]=vao=>ext["isVertexArrayOES"](vao);return 1}};var webgl_enable_WEBGL_draw_buffers=ctx=>{var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=(n,bufs)=>ext["drawBuffersWEBGL"](n,bufs);return 1}};var webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance=ctx=>!!(ctx.dibvbi=ctx.getExtension("WEBGL_draw_instanced_base_vertex_base_instance"));var webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance=ctx=>!!(ctx.mdibvbi=ctx.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance"));var webgl_enable_EXT_polygon_offset_clamp=ctx=>!!(ctx.extPolygonOffsetClamp=ctx.getExtension("EXT_polygon_offset_clamp"));var webgl_enable_EXT_clip_control=ctx=>!!(ctx.extClipControl=ctx.getExtension("EXT_clip_control"));var webgl_enable_WEBGL_polygon_mode=ctx=>!!(ctx.webglPolygonMode=ctx.getExtension("WEBGL_polygon_mode"));var webgl_enable_WEBGL_multi_draw=ctx=>!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"));var getEmscriptenSupportedExtensions=ctx=>{var supportedExtensions=["ANGLE_instanced_arrays","EXT_blend_minmax","EXT_disjoint_timer_query","EXT_frag_depth","EXT_shader_texture_lod","EXT_sRGB","OES_element_index_uint","OES_fbo_render_mipmap","OES_standard_derivatives","OES_texture_float","OES_texture_half_float","OES_texture_half_float_linear","OES_vertex_array_object","WEBGL_color_buffer_float","WEBGL_depth_texture","WEBGL_draw_buffers","EXT_color_buffer_float","EXT_conservative_depth","EXT_disjoint_timer_query_webgl2","EXT_texture_norm16","NV_shader_noperspective_interpolation","WEBGL_clip_cull_distance","EXT_clip_control","EXT_color_buffer_half_float","EXT_depth_clamp","EXT_float_blend","EXT_polygon_offset_clamp","EXT_texture_compression_bptc","EXT_texture_compression_rgtc","EXT_texture_filter_anisotropic","KHR_parallel_shader_compile","OES_texture_float_linear","WEBGL_blend_func_extended","WEBGL_compressed_texture_astc","WEBGL_compressed_texture_etc","WEBGL_compressed_texture_etc1","WEBGL_compressed_texture_s3tc","WEBGL_compressed_texture_s3tc_srgb","WEBGL_debug_renderer_info","WEBGL_debug_shaders","WEBGL_lose_context","WEBGL_multi_draw","WEBGL_polygon_mode"];return(ctx.getSupportedExtensions()||[]).filter(ext=>supportedExtensions.includes(ext))};var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],samplers:[],transformFeedbacks:[],syncs:[],stringCache:{},stringiCache:{},unpackAlignment:4,unpackRowLength:0,recordError:errorCode=>{if(!GL.lastError){GL.lastError=errorCode}},getNewId:table=>{var ret=GL.counter++;for(var i=table.length;i{for(var i=0;i>2]=id}},getSource:(shader,count,string,length)=>{var source="";for(var i=0;i>2]:undefined;source+=UTF8ToString(HEAPU32[string+i*4>>2],len)}return source},createContext:(canvas,webGLContextAttributes)=>{if(webGLContextAttributes.renderViaOffscreenBackBuffer)webGLContextAttributes["preserveDrawingBuffer"]=true;var ctx=webGLContextAttributes.majorVersion>1?canvas.getContext("webgl2",webGLContextAttributes):canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},enableOffscreenFramebufferAttributes:webGLContextAttributes=>{webGLContextAttributes.renderViaOffscreenBackBuffer=true;webGLContextAttributes.preserveDrawingBuffer=true},createOffscreenFramebuffer:context=>{var gl=context.GLctx;var fbo=gl.createFramebuffer();gl.bindFramebuffer(36160,fbo);context.defaultFbo=fbo;context.defaultFboForbidBlitFramebuffer=false;if(gl.getContextAttributes().antialias){context.defaultFboForbidBlitFramebuffer=true}context.defaultColorTarget=gl.createTexture();context.defaultDepthTarget=gl.createRenderbuffer();GL.resizeOffscreenFramebuffer(context);gl.bindTexture(3553,context.defaultColorTarget);gl.texParameteri(3553,10241,9728);gl.texParameteri(3553,10240,9728);gl.texParameteri(3553,10242,33071);gl.texParameteri(3553,10243,33071);gl.texImage2D(3553,0,6408,gl.canvas.width,gl.canvas.height,0,6408,5121,null);gl.framebufferTexture2D(36160,36064,3553,context.defaultColorTarget,0);gl.bindTexture(3553,null);var depthTarget=gl.createRenderbuffer();gl.bindRenderbuffer(36161,context.defaultDepthTarget);gl.renderbufferStorage(36161,33189,gl.canvas.width,gl.canvas.height);gl.framebufferRenderbuffer(36160,36096,36161,context.defaultDepthTarget);gl.bindRenderbuffer(36161,null);var vertices=[-1,-1,-1,1,1,-1,1,1];var vb=gl.createBuffer();gl.bindBuffer(34962,vb);gl.bufferData(34962,new Float32Array(vertices),35044);gl.bindBuffer(34962,null);context.blitVB=vb;var vsCode="attribute vec2 pos;"+"varying lowp vec2 tex;"+"void main() { tex = pos * 0.5 + vec2(0.5,0.5); gl_Position = vec4(pos, 0.0, 1.0); }";var vs=gl.createShader(35633);gl.shaderSource(vs,vsCode);gl.compileShader(vs);var fsCode="varying lowp vec2 tex;"+"uniform sampler2D sampler;"+"void main() { gl_FragColor = texture2D(sampler, tex); }";var fs=gl.createShader(35632);gl.shaderSource(fs,fsCode);gl.compileShader(fs);var blitProgram=gl.createProgram();gl.attachShader(blitProgram,vs);gl.attachShader(blitProgram,fs);gl.linkProgram(blitProgram);context.blitProgram=blitProgram;context.blitPosLoc=gl.getAttribLocation(blitProgram,"pos");gl.useProgram(blitProgram);gl.uniform1i(gl.getUniformLocation(blitProgram,"sampler"),0);gl.useProgram(null);if(gl.createVertexArray){context.defaultVao=gl.createVertexArray();gl.bindVertexArray(context.defaultVao);gl.enableVertexAttribArray(context.blitPosLoc);gl.bindVertexArray(null)}},resizeOffscreenFramebuffer:context=>{var gl=context.GLctx;if(context.defaultColorTarget){var prevTextureBinding=gl.getParameter(32873);gl.bindTexture(3553,context.defaultColorTarget);gl.texImage2D(3553,0,6408,gl.drawingBufferWidth,gl.drawingBufferHeight,0,6408,5121,null);gl.bindTexture(3553,prevTextureBinding)}if(context.defaultDepthTarget){var prevRenderBufferBinding=gl.getParameter(36007);gl.bindRenderbuffer(36161,context.defaultDepthTarget);gl.renderbufferStorage(36161,33189,gl.drawingBufferWidth,gl.drawingBufferHeight);gl.bindRenderbuffer(36161,prevRenderBufferBinding)}},blitOffscreenFramebuffer:context=>{var gl=context.GLctx;var prevScissorTest=gl.getParameter(3089);if(prevScissorTest)gl.disable(3089);var prevFbo=gl.getParameter(36006);if(gl.blitFramebuffer&&!context.defaultFboForbidBlitFramebuffer){gl.bindFramebuffer(36008,context.defaultFbo);gl.bindFramebuffer(36009,null);gl.blitFramebuffer(0,0,gl.canvas.width,gl.canvas.height,0,0,gl.canvas.width,gl.canvas.height,16384,9728)}else{gl.bindFramebuffer(36160,null);var prevProgram=gl.getParameter(35725);gl.useProgram(context.blitProgram);if(!gl.isProgram(prevProgram))prevProgram=null;var prevVB=gl.getParameter(34964);gl.bindBuffer(34962,context.blitVB);var prevActiveTexture=gl.getParameter(34016);gl.activeTexture(33984);var prevTextureBinding=gl.getParameter(32873);gl.bindTexture(3553,context.defaultColorTarget);var prevBlend=gl.getParameter(3042);if(prevBlend)gl.disable(3042);var prevCullFace=gl.getParameter(2884);if(prevCullFace)gl.disable(2884);var prevDepthTest=gl.getParameter(2929);if(prevDepthTest)gl.disable(2929);var prevStencilTest=gl.getParameter(2960);if(prevStencilTest)gl.disable(2960);function draw(){gl.vertexAttribPointer(context.blitPosLoc,2,5126,false,0,0);gl.drawArrays(5,0,4)}if(context.defaultVao){var prevVAO=gl.getParameter(34229);gl.bindVertexArray(context.defaultVao);draw();gl.bindVertexArray(prevVAO)}else{var prevVertexAttribPointer={buffer:gl.getVertexAttrib(context.blitPosLoc,34975),size:gl.getVertexAttrib(context.blitPosLoc,34339),stride:gl.getVertexAttrib(context.blitPosLoc,34340),type:gl.getVertexAttrib(context.blitPosLoc,34341),normalized:gl.getVertexAttrib(context.blitPosLoc,34922),pointer:gl.getVertexAttribOffset(context.blitPosLoc,34373)};var maxVertexAttribs=gl.getParameter(34921);var prevVertexAttribEnables=[];for(var i=0;i{var handle=GL.getNewId(GL.contexts);var context={handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault=="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}if(webGLContextAttributes.renderViaOffscreenBackBuffer)GL.createOffscreenFramebuffer(context);return handle},makeContextCurrent:contextHandle=>{GL.currentContext=GL.contexts[contextHandle];Module["ctx"]=GLctx=GL.currentContext?.GLctx;return!(contextHandle&&!GLctx)},getContext:contextHandle=>GL.contexts[contextHandle],deleteContext:contextHandle=>{if(GL.currentContext===GL.contexts[contextHandle]){GL.currentContext=null}if(typeof JSEvents=="object"){JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas)}if(GL.contexts[contextHandle]?.GLctx.canvas){GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined}GL.contexts[contextHandle]=null},initExtensions:context=>{context||=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;webgl_enable_WEBGL_multi_draw(GLctx);webgl_enable_EXT_polygon_offset_clamp(GLctx);webgl_enable_EXT_clip_control(GLctx);webgl_enable_WEBGL_polygon_mode(GLctx);webgl_enable_ANGLE_instanced_arrays(GLctx);webgl_enable_OES_vertex_array_object(GLctx);webgl_enable_WEBGL_draw_buffers(GLctx);webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx);webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx);if(context.version>=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}getEmscriptenSupportedExtensions(GLctx).forEach(ext=>{if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var _emscripten_webgl_do_commit_frame=()=>{if(!GL.currentContext||!GL.currentContext.GLctx){return-3}if(GL.currentContext.defaultFbo){GL.blitOffscreenFramebuffer(GL.currentContext);return 0}if(!GL.currentContext.attributes.explicitSwapControl){return-3}return 0};var _emscripten_webgl_commit_frame=_emscripten_webgl_do_commit_frame;var webglPowerPreferences=["default","low-power","high-performance"];var _emscripten_webgl_do_create_context=(target,attributes)=>{var attr32=attributes>>2;var powerPreference=HEAP32[attr32+(8>>2)];var contextAttributes={alpha:!!HEAP8[attributes+0],depth:!!HEAP8[attributes+1],stencil:!!HEAP8[attributes+2],antialias:!!HEAP8[attributes+3],premultipliedAlpha:!!HEAP8[attributes+4],preserveDrawingBuffer:!!HEAP8[attributes+5],powerPreference:webglPowerPreferences[powerPreference],failIfMajorPerformanceCaveat:!!HEAP8[attributes+12],majorVersion:HEAP32[attr32+(16>>2)],minorVersion:HEAP32[attr32+(20>>2)],enableExtensionsByDefault:HEAP8[attributes+24],explicitSwapControl:HEAP8[attributes+25],proxyContextToMainThread:HEAP32[attr32+(28>>2)],renderViaOffscreenBackBuffer:HEAP8[attributes+32]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl&&!contextAttributes.renderViaOffscreenBackBuffer){contextAttributes.renderViaOffscreenBackBuffer=true}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle};var _emscripten_webgl_create_context=_emscripten_webgl_do_create_context;var _emscripten_webgl_destroy_context=contextHandle=>{if(GL.currentContext==contextHandle)GL.currentContext=0;GL.deleteContext(contextHandle)};var _emscripten_webgl_enable_extension=(contextHandle,extension)=>{var context=GL.getContext(contextHandle);var extString=UTF8ToString(extension);if(extString.startsWith("GL_"))extString=extString.slice(3);if(extString=="ANGLE_instanced_arrays")webgl_enable_ANGLE_instanced_arrays(GLctx);if(extString=="OES_vertex_array_object")webgl_enable_OES_vertex_array_object(GLctx);if(extString=="WEBGL_draw_buffers")webgl_enable_WEBGL_draw_buffers(GLctx);if(extString=="WEBGL_draw_instanced_base_vertex_base_instance")webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx);if(extString=="WEBGL_multi_draw_instanced_base_vertex_base_instance")webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx);if(extString=="WEBGL_multi_draw")webgl_enable_WEBGL_multi_draw(GLctx);if(extString=="EXT_polygon_offset_clamp")webgl_enable_EXT_polygon_offset_clamp(GLctx);if(extString=="EXT_clip_control")webgl_enable_EXT_clip_control(GLctx);if(extString=="WEBGL_polygon_mode")webgl_enable_WEBGL_polygon_mode(GLctx);var ext=context.GLctx.getExtension(extString);return!!ext};var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var _emscripten_webgl_get_supported_extensions=()=>stringToNewUTF8(GLctx.getSupportedExtensions().join(" "));var _emscripten_webgl_make_context_current=contextHandle=>{var success=GL.makeContextCurrent(contextHandle);return success?0:-5};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.language||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var rightsBase=0;var rightsInheriting=0;var flags=0;{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4}HEAP8[pbuf]=type;HEAP16[pbuf+2>>1]=flags;HEAP64[pbuf+8>>3]=BigInt(rightsBase);HEAP64[pbuf+16>>3]=BigInt(rightsInheriting);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var _glActiveTexture=x0=>GLctx.activeTexture(x0);var _glAttachShader=(program,shader)=>{GLctx.attachShader(GL.programs[program],GL.shaders[shader])};var _glBeginTransformFeedback=x0=>GLctx.beginTransformFeedback(x0);var _glBindBuffer=(target,buffer)=>{if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])};var _glBindBufferBase=(target,index,buffer)=>{GLctx.bindBufferBase(target,index,GL.buffers[buffer])};var _glBindBufferRange=(target,index,buffer,offset,ptrsize)=>{GLctx.bindBufferRange(target,index,GL.buffers[buffer],offset,ptrsize)};var _glBindFramebuffer=(target,framebuffer)=>{GLctx.bindFramebuffer(target,framebuffer?GL.framebuffers[framebuffer]:GL.currentContext.defaultFbo)};var _glBindRenderbuffer=(target,renderbuffer)=>{GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])};var _glBindTexture=(target,texture)=>{GLctx.bindTexture(target,GL.textures[texture])};var _glBindVertexArray=vao=>{GLctx.bindVertexArray(GL.vaos[vao])};var _glBlendColor=(x0,x1,x2,x3)=>GLctx.blendColor(x0,x1,x2,x3);var _glBlendEquation=x0=>GLctx.blendEquation(x0);var _glBlendFunc=(x0,x1)=>GLctx.blendFunc(x0,x1);var _glBlendFuncSeparate=(x0,x1,x2,x3)=>GLctx.blendFuncSeparate(x0,x1,x2,x3);var _glBlitFramebuffer=(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)=>GLctx.blitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9);var _glBufferData=(target,size,data,usage)=>{if(GL.currentContext.version>=2){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}return}GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)};var _glBufferSubData=(target,offset,size,data)=>{if(GL.currentContext.version>=2){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))};var _glCheckFramebufferStatus=x0=>GLctx.checkFramebufferStatus(x0);var _glClear=x0=>GLctx.clear(x0);var _glClearBufferfv=(buffer,drawbuffer,value)=>{GLctx.clearBufferfv(buffer,drawbuffer,HEAPF32,value>>2)};var _glClearColor=(x0,x1,x2,x3)=>GLctx.clearColor(x0,x1,x2,x3);var _glClearDepthf=x0=>GLctx.clearDepth(x0);var _glClearStencil=x0=>GLctx.clearStencil(x0);var _glColorMask=(red,green,blue,alpha)=>{GLctx.colorMask(!!red,!!green,!!blue,!!alpha)};var _glCompileShader=shader=>{GLctx.compileShader(GL.shaders[shader])};var _glCompressedTexImage2D=(target,level,internalFormat,width,height,border,imageSize,data)=>{if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data);return}GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,HEAPU8,data,imageSize);return}GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,HEAPU8.subarray(data,data+imageSize))};var _glCompressedTexImage3D=(target,level,internalFormat,width,height,depth,border,imageSize,data)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.compressedTexImage3D(target,level,internalFormat,width,height,depth,border,imageSize,data)}else{GLctx.compressedTexImage3D(target,level,internalFormat,width,height,depth,border,HEAPU8,data,imageSize)}};var _glCompressedTexSubImage3D=(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.compressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx.compressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}};var _glCopyBufferSubData=(x0,x1,x2,x3,x4)=>GLctx.copyBufferSubData(x0,x1,x2,x3,x4);var _glCreateProgram=()=>{var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id};var _glCreateShader=shaderType=>{var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id};var _glCullFace=x0=>GLctx.cullFace(x0);var _glDeleteBuffers=(n,buffers)=>{for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}};var _glDeleteFramebuffers=(n,framebuffers)=>{for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}};var _glDeleteProgram=id=>{if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null};var _glDeleteQueries=(n,ids)=>{for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx.deleteQuery(query);GL.queries[id]=null}};var _glDeleteRenderbuffers=(n,renderbuffers)=>{for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}};var _glDeleteShader=id=>{if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null};var _glDeleteSync=id=>{if(!id)return;var sync=GL.syncs[id];if(!sync){GL.recordError(1281);return}GLctx.deleteSync(sync);sync.name=0;GL.syncs[id]=null};var _glDeleteTextures=(n,textures)=>{for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}};var _glDeleteVertexArrays=(n,vaos)=>{for(var i=0;i>2];GLctx.deleteVertexArray(GL.vaos[id]);GL.vaos[id]=null}};var _glDepthFunc=x0=>GLctx.depthFunc(x0);var _glDepthMask=flag=>{GLctx.depthMask(!!flag)};var _glDisable=x0=>GLctx.disable(x0);var _glDisableVertexAttribArray=index=>{GLctx.disableVertexAttribArray(index)};var _glDrawArrays=(mode,first,count)=>{GLctx.drawArrays(mode,first,count)};var _glDrawArraysInstanced=(mode,first,count,primcount)=>{GLctx.drawArraysInstanced(mode,first,count,primcount)};var tempFixedLengthArray=[];var _glDrawBuffers=(n,bufs)=>{var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx.drawBuffers(bufArray)};var _glDrawElements=(mode,count,type,indices)=>{GLctx.drawElements(mode,count,type,indices)};var _glDrawElementsInstanced=(mode,count,type,indices,primcount)=>{GLctx.drawElementsInstanced(mode,count,type,indices,primcount)};var _glEnable=x0=>GLctx.enable(x0);var _glEnableVertexAttribArray=index=>{GLctx.enableVertexAttribArray(index)};var _glEndTransformFeedback=()=>GLctx.endTransformFeedback();var _glFenceSync=(condition,flags)=>{var sync=GLctx.fenceSync(condition,flags);if(sync){var id=GL.getNewId(GL.syncs);sync.name=id;GL.syncs[id]=sync;return id}return 0};var _glFinish=()=>GLctx.finish();var _glFramebufferRenderbuffer=(target,attachment,renderbuffertarget,renderbuffer)=>{GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])};var _glFramebufferTexture2D=(target,attachment,textarget,texture,level)=>{GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)};var _glFramebufferTextureLayer=(target,attachment,texture,level,layer)=>{GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)};var _glFrontFace=x0=>GLctx.frontFace(x0);var _glGenBuffers=(n,buffers)=>{GL.genObject(n,buffers,"createBuffer",GL.buffers)};var _glGenFramebuffers=(n,ids)=>{GL.genObject(n,ids,"createFramebuffer",GL.framebuffers)};var _glGenQueries=(n,ids)=>{GL.genObject(n,ids,"createQuery",GL.queries)};var _glGenRenderbuffers=(n,renderbuffers)=>{GL.genObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)};var _glGenTextures=(n,textures)=>{GL.genObject(n,textures,"createTexture",GL.textures)};var _glGenVertexArrays=(n,arrays)=>{GL.genObject(n,arrays,"createVertexArray",GL.vaos)};var _glGenerateMipmap=x0=>GLctx.generateMipmap(x0);var writeI53ToI64=(ptr,num)=>{HEAPU32[ptr>>2]=num;var lower=HEAPU32[ptr>>2];HEAPU32[ptr+4>>2]=(num-lower)/4294967296};var webglGetExtensions=()=>{var exts=getEmscriptenSupportedExtensions(GLctx);exts=exts.concat(exts.map(e=>"GL_"+e));return exts};var emscriptenWebGLGet=(name_,p,type)=>{if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}ret=webglGetExtensions().length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err(`GL_INVALID_ENUM in glGet${type}v: Unknown object returned from WebGL getParameter(${name_})! (error: ${e})`);return}}break;default:GL.recordError(1280);err(`GL_INVALID_ENUM in glGet${type}v: Native code calling glGet${type}v(${name_}) and it returns ${result} of type ${typeof result}!`);return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p]=ret?1:0;break}};var _glGetFloatv=(name_,p)=>emscriptenWebGLGet(name_,p,2);var _glGetInteger64v=(name_,p)=>{emscriptenWebGLGet(name_,p,1)};var _glGetIntegerv=(name_,p)=>emscriptenWebGLGet(name_,p,0);var _glGetProgramInfoLog=(program,maxLength,length,infoLog)=>{var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _glGetProgramiv=(program,pname,p)=>{if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){var numActiveUniforms=GLctx.getProgramParameter(program,35718);for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){var numActiveAttributes=GLctx.getProgramParameter(program,35721);for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){var numActiveUniformBlocks=GLctx.getProgramParameter(program,35382);for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}};var _glGetShaderInfoLog=(shader,maxLength,length,infoLog)=>{var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _glGetShaderiv=(shader,pname,p)=>{if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}};var _glGetString=name_=>{var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:ret=stringToNewUTF8(webglGetExtensions().join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s?stringToNewUTF8(s):0;break;case 7938:var webGLVersion=GLctx.getParameter(7938);var glVersion=`OpenGL ES 2.0 (${webGLVersion})`;if(GL.currentContext.version>=2)glVersion=`OpenGL ES 3.0 (${webGLVersion})`;ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion=`OpenGL ES GLSL ES ${ver_num[1]} (${glslVersion})`}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret};var _glGetSynciv=(sync,pname,bufSize,length,values)=>{if(bufSize<0){GL.recordError(1281);return}if(!values){GL.recordError(1281);return}var ret=GLctx.getSyncParameter(GL.syncs[sync],pname);if(ret!==null){HEAP32[values>>2]=ret;if(length)HEAP32[length>>2]=1}};var _glGetUniformBlockIndex=(program,uniformBlockName)=>GLctx.getUniformBlockIndex(GL.programs[program],UTF8ToString(uniformBlockName));var jstoi_q=str=>parseInt(str);var webglGetLeftBracePos=name=>name.slice(-1)=="]"&&name.lastIndexOf("[");var webglPrepareUniformLocationsBeforeFirstUse=program=>{var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};var numActiveUniforms=GLctx.getProgramParameter(program,35718);for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j{name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex{program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}};var _glPixelStorei=(pname,param)=>{if(pname==3317){GL.unpackAlignment=param}else if(pname==3314){GL.unpackRowLength=param}GLctx.pixelStorei(pname,param)};var _glReadBuffer=x0=>GLctx.readBuffer(x0);var computeUnpackAlignedImageSize=(width,height,sizePerPixel)=>{function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=(GL.unpackRowLength||width)*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,GL.unpackAlignment);return height*alignedRowSize};var colorChannelsInGlTextureFormat=format=>{var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1};var heapObjectForWebGLType=type=>{type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16};var toTypedArrayIndex=(pointer,heap)=>pointer>>>31-Math.clz32(heap.BYTES_PER_ELEMENT);var emscriptenWebGLGetTexPixelData=(type,format,width,height,pixels,internalFormat)=>{var heap=heapObjectForWebGLType(type);var sizePerPixel=colorChannelsInGlTextureFormat(format)*heap.BYTES_PER_ELEMENT;var bytes=computeUnpackAlignedImageSize(width,height,sizePerPixel);return heap.subarray(toTypedArrayIndex(pixels,heap),toTypedArrayIndex(pixels+bytes,heap))};var _glReadPixels=(x,y,width,height,format,type,pixels)=>{if(GL.currentContext.version>=2){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels);return}var heap=heapObjectForWebGLType(type);var target=toTypedArrayIndex(pixels,heap);GLctx.readPixels(x,y,width,height,format,type,heap,target);return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)};var _glRenderbufferStorage=(x0,x1,x2,x3)=>GLctx.renderbufferStorage(x0,x1,x2,x3);var _glRenderbufferStorageMultisample=(x0,x1,x2,x3,x4)=>GLctx.renderbufferStorageMultisample(x0,x1,x2,x3,x4);var _glScissor=(x0,x1,x2,x3)=>GLctx.scissor(x0,x1,x2,x3);var _glShaderSource=(shader,count,string,length)=>{var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)};var _glStencilFunc=(x0,x1,x2)=>GLctx.stencilFunc(x0,x1,x2);var _glStencilMask=x0=>GLctx.stencilMask(x0);var _glStencilOp=(x0,x1,x2)=>GLctx.stencilOp(x0,x1,x2);var _glTexImage2D=(target,level,internalFormat,width,height,border,format,type,pixels)=>{if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels);return}if(pixels){var heap=heapObjectForWebGLType(type);var index=toTypedArrayIndex(pixels,heap);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,index);return}}var pixelData=pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null;GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixelData)};var _glTexImage3D=(target,level,internalFormat,width,height,depth,border,format,type,pixels)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage3D(target,level,internalFormat,width,height,depth,border,format,type,heap,toTypedArrayIndex(pixels,heap))}else{GLctx.texImage3D(target,level,internalFormat,width,height,depth,border,format,type,null)}};var _glTexParameterf=(x0,x1,x2)=>GLctx.texParameterf(x0,x1,x2);var _glTexParameteri=(x0,x1,x2)=>GLctx.texParameteri(x0,x1,x2);var _glTexStorage2D=(x0,x1,x2,x3,x4)=>GLctx.texStorage2D(x0,x1,x2,x3,x4);var _glTexSubImage3D=(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,toTypedArrayIndex(pixels,heap))}else{GLctx.texSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}};var _glTransformFeedbackVaryings=(program,count,varyings,bufferMode)=>{program=GL.programs[program];var vars=[];for(var i=0;i>2]));GLctx.transformFeedbackVaryings(program,vars,bufferMode)};var webglGetUniformLocation=location=>{var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?`[${webglLoc}]`:""))}return webglLoc}else{GL.recordError(1282)}};var _glUniform1f=(location,v0)=>{GLctx.uniform1f(webglGetUniformLocation(location),v0)};var _glUniform1i=(location,v0)=>{GLctx.uniform1i(webglGetUniformLocation(location),v0)};var miniTempWebGLIntBuffers=[];var _glUniform1iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count);return}if(count<=288){var view=miniTempWebGLIntBuffers[count];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)};var _glUniform1ui=(location,v0)=>{GLctx.uniform1ui(webglGetUniformLocation(location),v0)};var _glUniform1uiv=(location,count,value)=>{count&&GLctx.uniform1uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count)};var _glUniform2f=(location,v0,v1)=>{GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)};var miniTempWebGLFloatBuffers=[];var _glUniform2fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2);return}if(count<=144){count*=2;var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)};var _glUniform2iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2);return}if(count<=144){count*=2;var view=miniTempWebGLIntBuffers[count];for(var i=0;i>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)};var _glUniform3fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3);return}if(count<=96){count*=3;var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)};var _glUniform4f=(location,v0,v1,v2,v3)=>{GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)};var _glUniform4fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count];var heap=HEAPF32;value=value>>2;count*=4;for(var i=0;i>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)};var _glUniformBlockBinding=(program,uniformBlockIndex,uniformBlockBinding)=>{program=GL.programs[program];GLctx.uniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding)};var _glUniformMatrix3fv=(location,count,transpose,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*9);return}if(count<=32){count*=9;var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)};var _glUniformMatrix4fv=(location,count,transpose,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16);return}if(count<=18){var view=miniTempWebGLFloatBuffers[16*count];var heap=HEAPF32;value=value>>2;count*=16;for(var i=0;i>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)};var _glUseProgram=program=>{program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program};var _glVertexAttrib4f=(x0,x1,x2,x3,x4)=>GLctx.vertexAttrib4f(x0,x1,x2,x3,x4);var _glVertexAttribDivisor=(index,divisor)=>{GLctx.vertexAttribDivisor(index,divisor)};var _glVertexAttribI4ui=(x0,x1,x2,x3,x4)=>GLctx.vertexAttribI4ui(x0,x1,x2,x3,x4);var _glVertexAttribIPointer=(index,size,type,stride,ptr)=>{GLctx.vertexAttribIPointer(index,size,type,stride,ptr)};var _glVertexAttribPointer=(index,size,type,normalized,stride,ptr)=>{GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)};var _glViewport=(x0,x1,x2,x3)=>GLctx.viewport(x0,x1,x2,x3);var GodotRuntime={get_func:function(ptr){return wasmTable.get(ptr)},error:function(){err.apply(null,Array.from(arguments))},print:function(){out.apply(null,Array.from(arguments))},malloc:function(p_size){return _malloc(p_size)},free:function(p_ptr){_free(p_ptr)},getHeapValue:function(p_ptr,p_type){return getValue(p_ptr,p_type)},setHeapValue:function(p_ptr,p_value,p_type){setValue(p_ptr,p_value,p_type)},heapSub:function(p_heap,p_ptr,p_len){const bytes=p_heap.BYTES_PER_ELEMENT;return p_heap.subarray(p_ptr/bytes,p_ptr/bytes+p_len)},heapSlice:function(p_heap,p_ptr,p_len){const bytes=p_heap.BYTES_PER_ELEMENT;return p_heap.slice(p_ptr/bytes,p_ptr/bytes+p_len)},heapCopy:function(p_dst,p_src,p_ptr){const bytes=p_src.BYTES_PER_ELEMENT;return p_dst.set(p_src,p_ptr/bytes)},parseString:function(p_ptr){return UTF8ToString(p_ptr)},parseStringArray:function(p_ptr,p_size){const strings=[];const ptrs=GodotRuntime.heapSub(HEAP32,p_ptr,p_size);ptrs.forEach(function(ptr){strings.push(GodotRuntime.parseString(ptr))});return strings},strlen:function(p_str){return lengthBytesUTF8(p_str)},allocString:function(p_str){const length=GodotRuntime.strlen(p_str)+1;const c_str=GodotRuntime.malloc(length);stringToUTF8(p_str,c_str,length);return c_str},allocStringArray:function(p_strings){const size=p_strings.length;const c_ptr=GodotRuntime.malloc(size*4);for(let i=0;i>2)+i]=GodotRuntime.allocString(p_strings[i])}return c_ptr},freeStringArray:function(p_ptr,p_len){for(let i=0;i>2)+i])}GodotRuntime.free(p_ptr)},stringToHeap:function(p_str,p_ptr,p_len){return stringToUTF8Array(p_str,HEAP8,p_ptr,p_len)}};var GodotConfig={canvas:null,locale:"en",canvas_resize_policy:2,virtual_keyboard:false,persistent_drops:false,godot_pool_size:4,on_execute:null,on_exit:null,init_config:function(p_opts){GodotConfig.canvas_resize_policy=p_opts["canvasResizePolicy"];GodotConfig.canvas=p_opts["canvas"];GodotConfig.locale=p_opts["locale"]||GodotConfig.locale;GodotConfig.virtual_keyboard=p_opts["virtualKeyboard"];GodotConfig.persistent_drops=!!p_opts["persistentDrops"];GodotConfig.godot_pool_size=p_opts["godotPoolSize"];GodotConfig.on_execute=p_opts["onExecute"];GodotConfig.on_exit=p_opts["onExit"];if(p_opts["focusCanvas"]){GodotConfig.canvas.focus()}},locate_file:function(file){return Module["locateFile"](file)},clear:function(){GodotConfig.canvas=null;GodotConfig.locale="en";GodotConfig.canvas_resize_policy=2;GodotConfig.virtual_keyboard=false;GodotConfig.persistent_drops=false;GodotConfig.on_execute=null;GodotConfig.on_exit=null}};var GodotFS={ENOENT:44,_idbfs:false,_syncing:false,_mount_points:[],is_persistent:function(){return GodotFS._idbfs?1:0},init:function(persistentPaths){GodotFS._idbfs=false;if(!Array.isArray(persistentPaths)){return Promise.reject(new Error("Persistent paths must be an array"))}if(!persistentPaths.length){return Promise.resolve()}GodotFS._mount_points=persistentPaths.slice();function createRecursive(dir){try{FS.stat(dir)}catch(e){if(e.errno!==GodotFS.ENOENT){GodotRuntime.error(e)}FS.mkdirTree(dir)}}GodotFS._mount_points.forEach(function(path){createRecursive(path);FS.mount(IDBFS,{},path)});return new Promise(function(resolve,reject){FS.syncfs(true,function(err){if(err){GodotFS._mount_points=[];GodotFS._idbfs=false;GodotRuntime.print(`IndexedDB not available: ${err.message}`)}else{GodotFS._idbfs=true}resolve(err)})})},deinit:function(){GodotFS._mount_points.forEach(function(path){try{FS.unmount(path)}catch(e){GodotRuntime.print("Already unmounted",e)}if(GodotFS._idbfs&&IDBFS.dbs[path]){IDBFS.dbs[path].close();delete IDBFS.dbs[path]}});GodotFS._mount_points=[];GodotFS._idbfs=false;GodotFS._syncing=false},sync:function(){if(GodotFS._syncing){GodotRuntime.error("Already syncing!");return Promise.resolve()}GodotFS._syncing=true;return new Promise(function(resolve,reject){FS.syncfs(false,function(error){if(error){GodotRuntime.error(`Failed to save IDB file system: ${error.message}`)}GodotFS._syncing=false;resolve(error)})})},copy_to_fs:function(path,buffer){const idx=path.lastIndexOf("/");let dir="/";if(idx>0){dir=path.slice(0,idx)}try{FS.stat(dir)}catch(e){if(e.errno!==GodotFS.ENOENT){GodotRuntime.error(e)}FS.mkdirTree(dir)}FS.writeFile(path,new Uint8Array(buffer))}};var GodotOS={request_quit:function(){},_async_cbs:[],_fs_sync_promise:null,atexit:function(p_promise_cb){GodotOS._async_cbs.push(p_promise_cb)},cleanup:function(exit_code){const cb=GodotConfig.on_exit;GodotFS.deinit();GodotConfig.clear();if(cb){cb(exit_code)}},finish_async:function(callback){GodotOS._fs_sync_promise.then(function(err){const promises=[];GodotOS._async_cbs.forEach(function(cb){promises.push(new Promise(cb))});return Promise.all(promises)}).then(function(){return GodotFS.sync()}).then(function(err){setTimeout(function(){callback()},0)})}};var GodotAudio={MAX_VOLUME_CHANNELS:8,GodotChannel:{CHANNEL_L:0,CHANNEL_R:1,CHANNEL_C:3,CHANNEL_LFE:4,CHANNEL_RL:5,CHANNEL_RR:6,CHANNEL_SL:7,CHANNEL_SR:8},WebChannel:{CHANNEL_L:0,CHANNEL_R:1,CHANNEL_SL:2,CHANNEL_SR:3,CHANNEL_C:4,CHANNEL_LFE:5},samples:null,Sample:class Sample{static getSample(id){if(!GodotAudio.samples.has(id)){throw new ReferenceError(`Could not find sample "${id}"`)}return GodotAudio.samples.get(id)}static getSampleOrNull(id){return GodotAudio.samples.get(id)??null}static create(params,options={}){const sample=new GodotAudio.Sample(params,options);GodotAudio.samples.set(params.id,sample);return sample}static delete(id){GodotAudio.samples.delete(id)}constructor(params,options={}){this.id=params.id;this._audioBuffer=null;this.numberOfChannels=options.numberOfChannels??2;this.sampleRate=options.sampleRate??44100;this.loopMode=options.loopMode??"disabled";this.loopBegin=options.loopBegin??0;this.loopEnd=options.loopEnd??0;this.setAudioBuffer(params.audioBuffer)}getAudioBuffer(){return this._duplicateAudioBuffer()}setAudioBuffer(val){this._audioBuffer=val}clear(){this.setAudioBuffer(null);GodotAudio.Sample.delete(this.id)}_duplicateAudioBuffer(){if(this._audioBuffer==null){throw new Error("couldn't duplicate a null audioBuffer")}const channels=new Array(this._audioBuffer.numberOfChannels);for(let i=0;i{const newErr=new Error("Failed to create PositionWorklet.");newErr.cause=err;GodotRuntime.error(newErr)})}getPlaybackRate(){return this._playbackRate}getPlaybackPosition(){return this._playbackPosition}setPlaybackRate(val){this._playbackRate=val;this._syncPlaybackRate()}getPitchScale(){return this._pitchScale}setPitchScale(val){this._pitchScale=val;this._syncPlaybackRate()}getSample(){return GodotAudio.Sample.getSample(this.streamObjectId)}getOutputNode(){return this._source}start(){if(this.isStarted){return}this._resetSourceStartTime();this._source.start(this.startTime,this.offset);this.isStarted=true}stop(){this.clear()}restart(){this.isPaused=false;this.pauseTime=0;this._resetSourceStartTime();this._restart()}pause(enable=true){if(enable){this._pause();return}this._unpause()}connect(node){return this.getOutputNode().connect(node)}setVolumes(buses,volumes){for(let busIdx=0;busIdx0){this._positionWorklet=GodotAudio.audioPositionWorkletNodes.pop()}else{this._positionWorklet=new AudioWorkletNode(GodotAudio.ctx,"godot-position-reporting-processor")}this._playbackPosition=this.offset;this._positionWorklet.port.onmessage=event=>{switch(event.data["type"]){case"position":this._playbackPosition=parseInt(event.data.data,10)/this.getSample().sampleRate+this.offset;break;default:}};const resetParameter=this._positionWorklet.parameters.get("reset");resetParameter.setValueAtTime(1,GodotAudio.ctx.currentTime);resetParameter.setValueAtTime(0,GodotAudio.ctx.currentTime+1);return this._positionWorklet}clear(){this.isCanceled=true;this.isPaused=false;this.pauseTime=0;if(this._source!=null){this._source.removeEventListener("ended",this._onended);this._onended=null;if(this.isStarted){this._source.stop()}this._source.disconnect();this._source=null}for(const sampleNodeBus of this._sampleNodeBuses.values()){sampleNodeBus.clear()}this._sampleNodeBuses.clear();if(this._positionWorklet){this._positionWorklet.disconnect();this._positionWorklet.port.onmessage=null;GodotAudio.audioPositionWorkletNodes.push(this._positionWorklet);this._positionWorklet=null}GodotAudio.SampleNode.delete(this.id)}_resetSourceStartTime(){this._sourceStartTime=GodotAudio.ctx.currentTime}_syncPlaybackRate(){this._source.playbackRate.value=this.getPlaybackRate()*this.getPitchScale()}_restart(){if(this._source!=null){this._source.disconnect()}this._source=GodotAudio.ctx.createBufferSource();this._source.buffer=this.getSample().getAudioBuffer();for(const sampleNodeBus of this._sampleNodeBuses.values()){this.connect(sampleNodeBus.getInputNode())}this._addEndedListener();const pauseTime=this.isPaused?this.pauseTime:0;if(this._positionWorklet!=null){this._positionWorklet.port.postMessage({type:"clear"});this._source.connect(this._positionWorklet)}this._source.start(this.startTime,this.offset+pauseTime);this.isStarted=true}_pause(){if(!this.isStarted){return}this.isPaused=true;this.pauseTime=(GodotAudio.ctx.currentTime-this._sourceStartTime)/this.getPlaybackRate();this._source.stop()}_unpause(){this._restart();this.isPaused=false;this.pauseTime=0}_addEndedListener(){if(this._onended!=null){this._source.removeEventListener("ended",this._onended)}const self=this;this._onended=_=>{if(self.isPaused){return}switch(self.getSample().loopMode){case"disabled":self.stop();break;case"forward":case"backward":self.restart();break;default:}};this._source.addEventListener("ended",this._onended)}},deleteSampleNode:pSampleNodeId=>{GodotAudio.sampleNodes.delete(pSampleNodeId);if(GodotAudio.sampleFinishedCallback==null){return}const sampleNodeIdPtr=GodotRuntime.allocString(pSampleNodeId);GodotAudio.sampleFinishedCallback(sampleNodeIdPtr);GodotRuntime.free(sampleNodeIdPtr)},buses:null,busSolo:null,Bus:class Bus{static getCount(){return GodotAudio.buses.length}static setCount(val){const buses=GodotAudio.buses;if(val===buses.length){return}if(val=GodotAudio.buses.length){throw new ReferenceError(`invalid bus index "${index}"`)}return GodotAudio.buses[index]}static getBusOrNull(index){if(index<0||index>=GodotAudio.buses.length){return null}return GodotAudio.buses[index]}static move(fromIndex,toIndex){const movedBus=GodotAudio.Bus.getBusOrNull(fromIndex);if(movedBus==null){return}const buses=GodotAudio.buses.filter((_,i)=>i!==fromIndex);buses.splice(toIndex-1,0,movedBus);GodotAudio.buses=buses}static addAt(index){const newBus=GodotAudio.Bus.create();if(index!==newBus.getId()){GodotAudio.Bus.move(newBus.getId(),index)}}static create(){const newBus=new GodotAudio.Bus;const isFirstBus=GodotAudio.buses.length===0;GodotAudio.buses.push(newBus);if(isFirstBus){newBus.setSend(null)}else{newBus.setSend(GodotAudio.Bus.getBus(0))}return newBus}constructor(){this._sampleNodes=new Set;this.isSolo=false;this._send=null;this._gainNode=GodotAudio.ctx.createGain();this._soloNode=GodotAudio.ctx.createGain();this._muteNode=GodotAudio.ctx.createGain();this._gainNode.connect(this._soloNode).connect(this._muteNode)}getId(){return GodotAudio.buses.indexOf(this)}getVolumeDb(){return GodotAudio.linear_to_db(this._gainNode.gain.value)}setVolumeDb(val){const linear=GodotAudio.db_to_linear(val);if(isFinite(linear)){this._gainNode.gain.value=linear}}getSend(){return this._send}setSend(val){this._send=val;if(val==null){if(this.getId()==0){this.getOutputNode().connect(GodotAudio.ctx.destination);return}throw new Error(`Cannot send to "${val}" without the bus being at index 0 (current index: ${this.getId()})`)}this.connect(val)}getInputNode(){return this._gainNode}getOutputNode(){return this._muteNode}mute(enable){this._muteNode.gain.value=enable?0:1}solo(enable){if(this.isSolo===enable){return}if(enable){if(GodotAudio.busSolo!=null&&GodotAudio.busSolo!==this){GodotAudio.busSolo._disableSolo()}this._enableSolo();return}this._disableSolo()}addSampleNode(sampleNode){this._sampleNodes.add(sampleNode);sampleNode.getOutputNode().connect(this.getInputNode())}removeSampleNode(sampleNode){this._sampleNodes.delete(sampleNode);sampleNode.getOutputNode().disconnect()}connect(bus){if(bus==null){throw new Error("cannot connect to null bus")}this.getOutputNode().disconnect();this.getOutputNode().connect(bus.getInputNode());return bus}clear(){GodotAudio.buses=GodotAudio.buses.filter(v=>v!==this)}_syncSampleNodes(){const sampleNodes=Array.from(this._sampleNodes);for(let i=0;iotherBus!==this);for(let i=0;iotherBus!==this);for(let i=0;iGodotAudio.Bus.getBus(busIndex));sampleNode.setVolumes(buses,volumes)},set_sample_bus_count:function(count){GodotAudio.Bus.setCount(count)},remove_sample_bus:function(index){const bus=GodotAudio.Bus.getBusOrNull(index);if(bus==null){return}bus.clear()},add_sample_bus:function(atPos){GodotAudio.Bus.addAt(atPos)},move_sample_bus:function(busIndex,toPos){GodotAudio.Bus.move(busIndex,toPos)},set_sample_bus_send:function(busIndex,sendIndex){const bus=GodotAudio.Bus.getBusOrNull(busIndex);if(bus==null){return}let targetBus=GodotAudio.Bus.getBusOrNull(sendIndex);if(targetBus==null){targetBus=GodotAudio.Bus.getBus(0)}bus.setSend(targetBus)},set_sample_bus_volume_db:function(busIndex,volumeDb){const bus=GodotAudio.Bus.getBusOrNull(busIndex);if(bus==null){return}bus.setVolumeDb(volumeDb)},set_sample_bus_solo:function(busIndex,enable){const bus=GodotAudio.Bus.getBusOrNull(busIndex);if(bus==null){return}bus.solo(enable)},set_sample_bus_mute:function(busIndex,enable){const bus=GodotAudio.Bus.getBusOrNull(busIndex);if(bus==null){return}bus.mute(enable)}};function _godot_audio_get_sample_playback_position(playbackObjectIdStrPtr){const playbackObjectId=GodotRuntime.parseString(playbackObjectIdStrPtr);const sampleNode=GodotAudio.SampleNode.getSampleNodeOrNull(playbackObjectId);if(sampleNode==null){return 0}return sampleNode.getPlaybackPosition()}function _godot_audio_has_script_processor(){return GodotAudio.ctx&&GodotAudio.ctx.createScriptProcessor?1:0}function _godot_audio_has_worklet(){return GodotAudio.ctx&&GodotAudio.ctx.audioWorklet?1:0}function _godot_audio_init(p_mix_rate,p_latency,p_state_change,p_latency_update){const statechange=GodotRuntime.get_func(p_state_change);const latencyupdate=GodotRuntime.get_func(p_latency_update);const mix_rate=GodotRuntime.getHeapValue(p_mix_rate,"i32");const channels=GodotAudio.init(mix_rate,p_latency,statechange,latencyupdate);GodotRuntime.setHeapValue(p_mix_rate,GodotAudio.ctx.sampleRate,"i32");return channels}function _godot_audio_input_start(){return GodotAudio.create_input(function(input){input.connect(GodotAudio.driver.get_node())})}function _godot_audio_input_stop(){if(GodotAudio.input){const tracks=GodotAudio.input["mediaStream"]["getTracks"]();for(let i=0;i=size){const high=size-wpos;wbuf.set(buffer.subarray(wpos,size));pending_samples-=high;wpos=0}if(pending_samples>0){wbuf.set(buffer.subarray(wpos,wpos+pending_samples),tot_sent-pending_samples)}port.postMessage({cmd:"chunk",data:wbuf.subarray(0,tot_sent)});wpos+=pending_samples;pending_samples=0}this.receive=function(recv_buf){const buffer=GodotRuntime.heapSub(HEAPF32,p_in_buf,p_in_size);const from=rpos;let to_write=recv_buf.length;let high=0;if(rpos+to_write>=p_in_size){high=p_in_size-rpos;buffer.set(recv_buf.subarray(0,high),rpos);to_write-=high;rpos=0}if(to_write){buffer.set(recv_buf.subarray(high,to_write),rpos)}in_callback(from,recv_buf.length);rpos+=to_write};this.consumed=function(size,port){pending_samples+=size;send(port)}}GodotAudioWorklet.ring_buffer=new RingBuffer;GodotAudioWorklet.promise.then(function(){const node=GodotAudioWorklet.worklet;const buffer=GodotRuntime.heapSlice(HEAPF32,p_out_buf,p_out_size);node.connect(GodotAudio.ctx.destination);node.port.postMessage({cmd:"start_nothreads",data:[buffer,p_in_size]});node.port.onmessage=function(event){if(!GodotAudioWorklet.worklet){return}if(event.data["cmd"]==="read"){const read=event.data["data"];GodotAudioWorklet.ring_buffer.consumed(read,GodotAudioWorklet.worklet.port)}else if(event.data["cmd"]==="input"){const buf=event.data["data"];if(buf.length>p_in_size){GodotRuntime.error("Input chunk is too big");return}GodotAudioWorklet.ring_buffer.receive(buf)}else{GodotRuntime.error(event.data)}}})},get_node:function(){return GodotAudioWorklet.worklet},close:function(){return new Promise(function(resolve,reject){if(GodotAudioWorklet.promise===null){return}const p=GodotAudioWorklet.promise;p.then(function(){GodotAudioWorklet.worklet.port.postMessage({cmd:"stop",data:null});GodotAudioWorklet.worklet.disconnect();GodotAudioWorklet.worklet.port.onmessage=null;GodotAudioWorklet.worklet=null;GodotAudioWorklet.promise=null;resolve()}).catch(function(err){GodotRuntime.error(err)})})}};function _godot_audio_worklet_create(channels){try{GodotAudioWorklet.create(channels)}catch(e){GodotRuntime.error("Error starting AudioDriverWorklet",e);return 1}return 0}function _godot_audio_worklet_start_no_threads(p_out_buf,p_out_size,p_out_callback,p_in_buf,p_in_size,p_in_callback){const out_callback=GodotRuntime.get_func(p_out_callback);const in_callback=GodotRuntime.get_func(p_in_callback);GodotAudioWorklet.start_no_threads(p_out_buf,p_out_size,out_callback,p_in_buf,p_in_size,in_callback)}function _godot_js_config_canvas_id_get(p_ptr,p_ptr_max){GodotRuntime.stringToHeap(`#${GodotConfig.canvas.id}`,p_ptr,p_ptr_max)}function _godot_js_config_locale_get(p_ptr,p_ptr_max){GodotRuntime.stringToHeap(GodotConfig.locale,p_ptr,p_ptr_max)}var GodotDisplayCursor={shape:"default",visible:true,cursors:{},set_style:function(style){GodotConfig.canvas.style.cursor=style},set_shape:function(shape){GodotDisplayCursor.shape=shape;let css=shape;if(shape in GodotDisplayCursor.cursors){const c=GodotDisplayCursor.cursors[shape];css=`url("${c.url}") ${c.x} ${c.y}, default`}if(GodotDisplayCursor.visible){GodotDisplayCursor.set_style(css)}},clear:function(){GodotDisplayCursor.set_style("");GodotDisplayCursor.shape="default";GodotDisplayCursor.visible=true;Object.keys(GodotDisplayCursor.cursors).forEach(function(key){URL.revokeObjectURL(GodotDisplayCursor.cursors[key]);delete GodotDisplayCursor.cursors[key]})},lockPointer:function(){const canvas=GodotConfig.canvas;if(canvas.requestPointerLock){canvas.requestPointerLock()}},releasePointer:function(){if(document.exitPointerLock){document.exitPointerLock()}},isPointerLocked:function(){return document.pointerLockElement===GodotConfig.canvas}};var GodotEventListeners={handlers:[],has:function(target,event,method,capture){return GodotEventListeners.handlers.findIndex(function(e){return e.target===target&&e.event===event&&e.method===method&&e.capture===capture})!==-1},add:function(target,event,method,capture){if(GodotEventListeners.has(target,event,method,capture)){return}function Handler(p_target,p_event,p_method,p_capture){this.target=p_target;this.event=p_event;this.method=p_method;this.capture=p_capture}GodotEventListeners.handlers.push(new Handler(target,event,method,capture));target.addEventListener(event,method,capture)},clear:function(){GodotEventListeners.handlers.forEach(function(h){h.target.removeEventListener(h.event,h.method,h.capture)});GodotEventListeners.handlers.length=0}};var _emscripten_webgl_do_get_current_context=()=>GL.currentContext?GL.currentContext.handle:0;var _emscripten_webgl_get_current_context=_emscripten_webgl_do_get_current_context;var GodotDisplayScreen={desired_size:[0,0],hidpi:true,getPixelRatio:function(){return GodotDisplayScreen.hidpi?window.devicePixelRatio||1:1},isFullscreen:function(){const elem=document.fullscreenElement||document.mozFullscreenElement||document.webkitFullscreenElement||document.msFullscreenElement;if(elem){return elem===GodotConfig.canvas}return document.fullscreen||document.mozFullScreen||document.webkitIsFullscreen},hasFullscreen:function(){return document.fullscreenEnabled||document.mozFullScreenEnabled||document.webkitFullscreenEnabled},requestFullscreen:function(){if(!GodotDisplayScreen.hasFullscreen()){return 1}const canvas=GodotConfig.canvas;try{const promise=(canvas.requestFullscreen||canvas.msRequestFullscreen||canvas.mozRequestFullScreen||canvas.mozRequestFullscreen||canvas.webkitRequestFullscreen).call(canvas);if(promise){promise.catch(function(){})}}catch(e){return 1}return 0},exitFullscreen:function(){if(!GodotDisplayScreen.isFullscreen()){return 0}try{const promise=document.exitFullscreen();if(promise){promise.catch(function(){})}}catch(e){return 1}return 0},_updateGL:function(){const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle);if(gl){GL.resizeOffscreenFramebuffer(gl)}},updateSize:function(){const isFullscreen=GodotDisplayScreen.isFullscreen();const wantsFullWindow=GodotConfig.canvas_resize_policy===2;const noResize=GodotConfig.canvas_resize_policy===0;const dWidth=GodotDisplayScreen.desired_size[0];const dHeight=GodotDisplayScreen.desired_size[1];const canvas=GodotConfig.canvas;let width=dWidth;let height=dHeight;if(noResize){if(canvas.width!==width||canvas.height!==height){GodotDisplayScreen.desired_size=[canvas.width,canvas.height];GodotDisplayScreen._updateGL();return 1}return 0}const scale=GodotDisplayScreen.getPixelRatio();if(isFullscreen||wantsFullWindow){width=Math.floor(window.innerWidth*scale);height=Math.floor(window.innerHeight*scale)}const csw=`${Math.floor(width/scale)}px`;const csh=`${Math.floor(height/scale)}px`;if(canvas.style.width!==csw||canvas.style.height!==csh||canvas.width!==width||canvas.height!==height){canvas.width=width;canvas.height=height;canvas.style.width=csw;canvas.style.height=csh;GodotDisplayScreen._updateGL();return 1}return 0}};var GodotDisplayVK={textinput:null,textarea:null,available:function(){return GodotConfig.virtual_keyboard&&"ontouchstart"in window},init:function(input_cb){function create(what){const elem=document.createElement(what);elem.style.display="none";elem.style.position="absolute";elem.style.zIndex="-1";elem.style.background="transparent";elem.style.padding="0px";elem.style.margin="0px";elem.style.overflow="hidden";elem.style.width="0px";elem.style.height="0px";elem.style.border="0px";elem.style.outline="none";elem.readonly=true;elem.disabled=true;GodotEventListeners.add(elem,"input",function(evt){const c_str=GodotRuntime.allocString(elem.value);input_cb(c_str,elem.selectionEnd);GodotRuntime.free(c_str)},false);GodotEventListeners.add(elem,"blur",function(evt){elem.style.display="none";elem.readonly=true;elem.disabled=true},false);GodotConfig.canvas.insertAdjacentElement("beforebegin",elem);return elem}GodotDisplayVK.textinput=create("input");GodotDisplayVK.textarea=create("textarea");GodotDisplayVK.updateSize()},show:function(text,type,start,end){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}if(GodotDisplayVK.textinput.style.display!==""||GodotDisplayVK.textarea.style.display!==""){GodotDisplayVK.hide()}GodotDisplayVK.updateSize();let elem=GodotDisplayVK.textinput;switch(type){case 0:elem.type="text";elem.inputmode="";break;case 1:elem=GodotDisplayVK.textarea;break;case 2:elem.type="text";elem.inputmode="numeric";break;case 3:elem.type="text";elem.inputmode="decimal";break;case 4:elem.type="tel";elem.inputmode="";break;case 5:elem.type="email";elem.inputmode="";break;case 6:elem.type="password";elem.inputmode="";break;case 7:elem.type="url";elem.inputmode="";break;default:elem.type="text";elem.inputmode="";break}elem.readonly=false;elem.disabled=false;elem.value=text;elem.style.display="block";elem.focus();elem.setSelectionRange(start,end)},hide:function(){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}[GodotDisplayVK.textinput,GodotDisplayVK.textarea].forEach(function(elem){elem.blur();elem.style.display="none";elem.value=""})},updateSize:function(){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}const rect=GodotConfig.canvas.getBoundingClientRect();function update(elem){elem.style.left=`${rect.left}px`;elem.style.top=`${rect.top}px`;elem.style.width=`${rect.width}px`;elem.style.height=`${rect.height}px`}update(GodotDisplayVK.textinput);update(GodotDisplayVK.textarea)},clear:function(){if(GodotDisplayVK.textinput){GodotDisplayVK.textinput.remove();GodotDisplayVK.textinput=null}if(GodotDisplayVK.textarea){GodotDisplayVK.textarea.remove();GodotDisplayVK.textarea=null}}};var GodotDisplay={window_icon:"",getDPI:function(){const dpi=Math.round(window.devicePixelRatio*96);return dpi>=96?dpi:96}};function _godot_js_display_alert(p_text){window.alert(GodotRuntime.parseString(p_text))}function _godot_js_display_canvas_focus(){GodotConfig.canvas.focus()}function _godot_js_display_canvas_is_focused(){return document.activeElement===GodotConfig.canvas}function _godot_js_display_clipboard_get(callback){const func=GodotRuntime.get_func(callback);try{navigator.clipboard.readText().then(function(result){const ptr=GodotRuntime.allocString(result);func(ptr);GodotRuntime.free(ptr)}).catch(function(e){})}catch(e){}}function _godot_js_display_clipboard_set(p_text){const text=GodotRuntime.parseString(p_text);if(!navigator.clipboard||!navigator.clipboard.writeText){return 1}navigator.clipboard.writeText(text).catch(function(e){GodotRuntime.error("Setting OS clipboard is only possible from an input callback for the Web platform. Exception:",e)});return 0}function _godot_js_display_cursor_is_hidden(){return!GodotDisplayCursor.visible}function _godot_js_display_cursor_is_locked(){return GodotDisplayCursor.isPointerLocked()?1:0}function _godot_js_display_cursor_lock_set(p_lock){if(p_lock){GodotDisplayCursor.lockPointer()}else{GodotDisplayCursor.releasePointer()}}function _godot_js_display_cursor_set_custom_shape(p_shape,p_ptr,p_len,p_hotspot_x,p_hotspot_y){const shape=GodotRuntime.parseString(p_shape);const old_shape=GodotDisplayCursor.cursors[shape];if(p_len>0){const png=new Blob([GodotRuntime.heapSlice(HEAPU8,p_ptr,p_len)],{type:"image/png"});const url=URL.createObjectURL(png);GodotDisplayCursor.cursors[shape]={url,x:p_hotspot_x,y:p_hotspot_y}}else{delete GodotDisplayCursor.cursors[shape]}if(shape===GodotDisplayCursor.shape){GodotDisplayCursor.set_shape(GodotDisplayCursor.shape)}if(old_shape){URL.revokeObjectURL(old_shape.url)}}function _godot_js_display_cursor_set_shape(p_string){GodotDisplayCursor.set_shape(GodotRuntime.parseString(p_string))}function _godot_js_display_cursor_set_visible(p_visible){const visible=p_visible!==0;if(visible===GodotDisplayCursor.visible){return}GodotDisplayCursor.visible=visible;if(visible){GodotDisplayCursor.set_shape(GodotDisplayCursor.shape)}else{GodotDisplayCursor.set_style("none")}}function _godot_js_display_desired_size_set(width,height){GodotDisplayScreen.desired_size=[width,height];GodotDisplayScreen.updateSize()}function _godot_js_display_fullscreen_cb(callback){const canvas=GodotConfig.canvas;const func=GodotRuntime.get_func(callback);function change_cb(evt){if(evt.target===canvas){func(GodotDisplayScreen.isFullscreen())}}GodotEventListeners.add(document,"fullscreenchange",change_cb,false);GodotEventListeners.add(document,"mozfullscreenchange",change_cb,false);GodotEventListeners.add(document,"webkitfullscreenchange",change_cb,false)}function _godot_js_display_fullscreen_exit(){return GodotDisplayScreen.exitFullscreen()}function _godot_js_display_fullscreen_request(){return GodotDisplayScreen.requestFullscreen()}function _godot_js_display_has_webgl(p_version){if(p_version!==1&&p_version!==2){return false}try{return!!document.createElement("canvas").getContext(p_version===2?"webgl2":"webgl")}catch(e){}return false}function _godot_js_display_is_swap_ok_cancel(){const win=["Windows","Win64","Win32","WinCE"];const plat=navigator.platform||"";if(win.indexOf(plat)!==-1){return 1}return 0}function _godot_js_display_notification_cb(callback,p_enter,p_exit,p_in,p_out){const canvas=GodotConfig.canvas;const func=GodotRuntime.get_func(callback);const notif=[p_enter,p_exit,p_in,p_out];["mouseover","mouseleave","focus","blur"].forEach(function(evt_name,idx){GodotEventListeners.add(canvas,evt_name,function(){func(notif[idx])},true)})}function _godot_js_display_pixel_ratio_get(){return GodotDisplayScreen.getPixelRatio()}function _godot_js_display_screen_dpi_get(){return GodotDisplay.getDPI()}function _godot_js_display_screen_size_get(width,height){const scale=GodotDisplayScreen.getPixelRatio();GodotRuntime.setHeapValue(width,window.screen.width*scale,"i32");GodotRuntime.setHeapValue(height,window.screen.height*scale,"i32")}function _godot_js_display_setup_canvas(p_width,p_height,p_fullscreen,p_hidpi){const canvas=GodotConfig.canvas;GodotEventListeners.add(canvas,"contextmenu",function(ev){ev.preventDefault()},false);GodotEventListeners.add(canvas,"webglcontextlost",function(ev){alert("WebGL context lost, please reload the page");ev.preventDefault()},false);GodotDisplayScreen.hidpi=!!p_hidpi;switch(GodotConfig.canvas_resize_policy){case 0:GodotDisplayScreen.desired_size=[canvas.width,canvas.height];break;case 1:GodotDisplayScreen.desired_size=[p_width,p_height];break;default:canvas.style.position="absolute";canvas.style.top=0;canvas.style.left=0;break}GodotDisplayScreen.updateSize();if(p_fullscreen){GodotDisplayScreen.requestFullscreen()}}function _godot_js_display_size_update(){const updated=GodotDisplayScreen.updateSize();if(updated){GodotDisplayVK.updateSize()}return updated}function _godot_js_display_touchscreen_is_available(){return"ontouchstart"in window}function _godot_js_display_tts_available(){return"speechSynthesis"in window}function _godot_js_display_vk_available(){return GodotDisplayVK.available()}function _godot_js_display_vk_cb(p_input_cb){const input_cb=GodotRuntime.get_func(p_input_cb);if(GodotDisplayVK.available()){GodotDisplayVK.init(input_cb)}}function _godot_js_display_vk_hide(){GodotDisplayVK.hide()}function _godot_js_display_vk_show(p_text,p_type,p_start,p_end){const text=GodotRuntime.parseString(p_text);const start=p_start>0?p_start:0;const end=p_end>0?p_end:start;GodotDisplayVK.show(text,p_type,start,end)}function _godot_js_display_window_blur_cb(callback){const func=GodotRuntime.get_func(callback);GodotEventListeners.add(window,"blur",function(){func()},false)}function _godot_js_display_window_icon_set(p_ptr,p_len){let link=document.getElementById("-gd-engine-icon");const old_icon=GodotDisplay.window_icon;if(p_ptr){if(link===null){link=document.createElement("link");link.rel="icon";link.id="-gd-engine-icon";document.head.appendChild(link)}const png=new Blob([GodotRuntime.heapSlice(HEAPU8,p_ptr,p_len)],{type:"image/png"});GodotDisplay.window_icon=URL.createObjectURL(png);link.href=GodotDisplay.window_icon}else{if(link){link.remove()}GodotDisplay.window_icon=null}if(old_icon){URL.revokeObjectURL(old_icon)}}function _godot_js_display_window_size_get(p_width,p_height){GodotRuntime.setHeapValue(p_width,GodotConfig.canvas.width,"i32");GodotRuntime.setHeapValue(p_height,GodotConfig.canvas.height,"i32")}function _godot_js_display_window_title_set(p_data){document.title=GodotRuntime.parseString(p_data)}function _godot_js_emscripten_get_version(){const emscriptenVersionPtr=GodotRuntime.allocString("4.0.10");return emscriptenVersionPtr}function _godot_js_eval(p_js,p_use_global_ctx,p_union_ptr,p_byte_arr,p_byte_arr_write,p_callback){const js_code=GodotRuntime.parseString(p_js);let eval_ret=null;try{if(p_use_global_ctx){const global_eval=eval;eval_ret=global_eval(js_code)}else{eval_ret=eval(js_code)}}catch(e){GodotRuntime.error(e)}switch(typeof eval_ret){case"boolean":GodotRuntime.setHeapValue(p_union_ptr,eval_ret,"i32");return 1;case"number":GodotRuntime.setHeapValue(p_union_ptr,eval_ret,"double");return 3;case"string":GodotRuntime.setHeapValue(p_union_ptr,GodotRuntime.allocString(eval_ret),"*");return 4;case"object":if(eval_ret===null){break}if(ArrayBuffer.isView(eval_ret)&&!(eval_ret instanceof Uint8Array)){eval_ret=new Uint8Array(eval_ret.buffer)}else if(eval_ret instanceof ArrayBuffer){eval_ret=new Uint8Array(eval_ret)}if(eval_ret instanceof Uint8Array){const func=GodotRuntime.get_func(p_callback);const bytes_ptr=func(p_byte_arr,p_byte_arr_write,eval_ret.length);HEAPU8.set(eval_ret,bytes_ptr);return 29}break}return 0}var IDHandler={_last_id:0,_references:{},get:function(p_id){return IDHandler._references[p_id]},add:function(p_data){const id=++IDHandler._last_id;IDHandler._references[id]=p_data;return id},remove:function(p_id){delete IDHandler._references[p_id]}};var GodotFetch={onread:function(id,result){const obj=IDHandler.get(id);if(!obj){return}if(result.value){obj.chunks.push(result.value)}obj.reading=false;obj.done=result.done},onresponse:function(id,response){const obj=IDHandler.get(id);if(!obj){return}let chunked=false;response.headers.forEach(function(value,header){const v=value.toLowerCase().trim();const h=header.toLowerCase().trim();if(h==="transfer-encoding"&&v==="chunked"){chunked=true}});obj.status=response.status;obj.response=response;obj.reader=response.body?.getReader();obj.chunked=chunked},onerror:function(id,err){GodotRuntime.error(err);const obj=IDHandler.get(id);if(!obj){return}obj.error=err},create:function(method,url,headers,body){const obj={request:null,response:null,reader:null,error:null,done:false,reading:false,status:0,chunks:[]};const id=IDHandler.add(obj);const init={method,headers,body};obj.request=fetch(url,init);obj.request.then(GodotFetch.onresponse.bind(null,id)).catch(GodotFetch.onerror.bind(null,id));return id},free:function(id){const obj=IDHandler.get(id);if(!obj){return}IDHandler.remove(id);if(!obj.request){return}obj.request.then(function(response){response.abort()}).catch(function(e){})},read:function(id){const obj=IDHandler.get(id);if(!obj){return}if(obj.reader&&!obj.reading){if(obj.done){obj.reader=null;return}obj.reading=true;obj.reader.read().then(GodotFetch.onread.bind(null,id)).catch(GodotFetch.onerror.bind(null,id))}else if(obj.reader==null&&obj.response.body==null){obj.reading=true;GodotFetch.onread(id,{value:undefined,done:true})}}};function _godot_js_fetch_create(p_method,p_url,p_headers,p_headers_size,p_body,p_body_size){const method=GodotRuntime.parseString(p_method);const url=GodotRuntime.parseString(p_url);const headers=GodotRuntime.parseStringArray(p_headers,p_headers_size);const body=p_body_size?GodotRuntime.heapSlice(HEAP8,p_body,p_body_size):null;return GodotFetch.create(method,url,headers.map(function(hv){const idx=hv.indexOf(":");if(idx<=0){return[]}return[hv.slice(0,idx).trim(),hv.slice(idx+1).trim()]}).filter(function(v){return v.length===2}),body)}function _godot_js_fetch_free(id){GodotFetch.free(id)}function _godot_js_fetch_http_status_get(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 0}return obj.status}function _godot_js_fetch_is_chunked(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return-1}return obj.chunked?1:0}function _godot_js_fetch_read_chunk(p_id,p_buf,p_buf_size){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 0}let to_read=p_buf_size;const chunks=obj.chunks;while(to_read&&chunks.length){const chunk=obj.chunks[0];if(chunk.length>to_read){GodotRuntime.heapCopy(HEAP8,chunk.slice(0,to_read),p_buf);chunks[0]=chunk.slice(to_read);to_read=0}else{GodotRuntime.heapCopy(HEAP8,chunk,p_buf);to_read-=chunk.length;chunks.pop()}}if(!chunks.length){GodotFetch.read(p_id)}return p_buf_size-to_read}function _godot_js_fetch_read_headers(p_id,p_parse_cb,p_ref){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 1}const cb=GodotRuntime.get_func(p_parse_cb);const arr=[];obj.response.headers.forEach(function(v,h){arr.push(`${h}:${v}`)});const c_ptr=GodotRuntime.allocStringArray(arr);cb(arr.length,c_ptr,p_ref);GodotRuntime.freeStringArray(c_ptr,arr.length);return 0}function _godot_js_fetch_state_get(p_id){const obj=IDHandler.get(p_id);if(!obj){return-1}if(obj.error){return-1}if(!obj.response){return 0}if(obj.reader||obj.response.body==null&&!obj.done){return 1}if(obj.done){return 2}return-1}var GodotInputGamepads={samples:[],get_pads:function(){try{const pads=navigator.getGamepads();if(pads){return pads}return[]}catch(e){return[]}},get_samples:function(){return GodotInputGamepads.samples},get_sample:function(index){const samples=GodotInputGamepads.samples;return index=0){os="Android"}else if(ua.indexOf("Linux")>=0){os="Linux"}else if(ua.indexOf("iPhone")>=0){os="iOS"}else if(ua.indexOf("Macintosh")>=0){os="MacOSX"}else if(ua.indexOf("Windows")>=0){os="Windows"}const id=pad.id;const exp1=/vendor: ([0-9a-f]{4}) product: ([0-9a-f]{4})/i;const exp2=/^([0-9a-f]+)-([0-9a-f]+)-/i;let vendor="";let product="";if(exp1.test(id)){const match=exp1.exec(id);vendor=match[1].padStart(4,"0");product=match[2].padStart(4,"0")}else if(exp2.test(id)){const match=exp2.exec(id);vendor=match[1].padStart(4,"0");product=match[2].padStart(4,"0")}if(!vendor||!product){return`${os}Unknown`}return os+vendor+product}};var GodotInputDragDrop={promises:[],pending_files:[],add_entry:function(entry){if(entry.isDirectory){GodotInputDragDrop.add_dir(entry)}else if(entry.isFile){GodotInputDragDrop.add_file(entry)}else{GodotRuntime.error("Unrecognized entry...",entry)}},add_dir:function(entry){GodotInputDragDrop.promises.push(new Promise(function(resolve,reject){const reader=entry.createReader();reader.readEntries(function(entries){for(let i=0;i{const path=elem["path"];GodotFS.copy_to_fs(DROP+path,elem["data"]);let idx=path.indexOf("/");if(idx===-1){drops.push(DROP+path)}else{const sub=path.substr(0,idx);idx=sub.indexOf("/");if(idx<0&&drops.indexOf(DROP+sub)===-1){drops.push(DROP+sub)}}files.push(DROP+path)});GodotInputDragDrop.promises=[];GodotInputDragDrop.pending_files=[];callback(drops);if(GodotConfig.persistent_drops){GodotOS.atexit(function(resolve,reject){GodotInputDragDrop.remove_drop(files,DROP);resolve()})}else{GodotInputDragDrop.remove_drop(files,DROP)}})},remove_drop:function(files,drop_path){const dirs=[drop_path.substr(0,drop_path.length-1)];files.forEach(function(file){FS.unlink(file);let dir=file.replace(drop_path,"");let idx=dir.lastIndexOf("/");while(idx>0){dir=dir.substr(0,idx);if(dirs.indexOf(drop_path+dir)===-1){dirs.push(drop_path+dir)}idx=dir.lastIndexOf("/")}});dirs.sort(function(a,b){const al=(a.match(/\//g)||[]).length;const bl=(b.match(/\//g)||[]).length;if(al>bl){return-1}else if(al-1){clearFocusTimerInterval()}if(GodotIME.ime==null){return}GodotIME.active=active;if(active){GodotIME.ime.style.display="block";GodotIME.focusTimerIntervalId=setInterval(focusTimer,100)}else{GodotIME.ime.style.display="none";GodotConfig.canvas.focus()}},ime_position:function(x,y){if(GodotIME.ime==null){return}const canvas=GodotConfig.canvas;const rect=canvas.getBoundingClientRect();const rw=canvas.width/rect.width;const rh=canvas.height/rect.height;const clx=x/rw+rect.x;const cly=y/rh+rect.y;GodotIME.ime.style.left=`${clx}px`;GodotIME.ime.style.top=`${cly}px`},init:function(ime_cb,key_cb,code,key){function key_event_cb(pressed,evt){const modifiers=GodotIME.getModifiers(evt);GodotRuntime.stringToHeap(evt.code,code,32);GodotRuntime.stringToHeap(evt.key,key,32);key_cb(pressed,evt.repeat,modifiers);evt.preventDefault()}function ime_event_cb(event){if(GodotIME.ime==null){return}switch(event.type){case"compositionstart":ime_cb(0,null);GodotIME.ime.innerHTML="";break;case"compositionupdate":{const ptr=GodotRuntime.allocString(event.data);ime_cb(1,ptr);GodotRuntime.free(ptr)}break;case"compositionend":{const ptr=GodotRuntime.allocString(event.data);ime_cb(2,ptr);GodotRuntime.free(ptr);GodotIME.ime.innerHTML=""}break;default:}}const ime=document.createElement("div");ime.className="ime";ime.style.background="none";ime.style.opacity=0;ime.style.position="fixed";ime.style.textAlign="left";ime.style.fontSize="1px";ime.style.left="0px";ime.style.top="0px";ime.style.width="100%";ime.style.height="40px";ime.style.pointerEvents="none";ime.style.display="none";ime.contentEditable="true";GodotEventListeners.add(ime,"compositionstart",ime_event_cb,false);GodotEventListeners.add(ime,"compositionupdate",ime_event_cb,false);GodotEventListeners.add(ime,"compositionend",ime_event_cb,false);GodotEventListeners.add(ime,"keydown",key_event_cb.bind(null,1),false);GodotEventListeners.add(ime,"keyup",key_event_cb.bind(null,0),false);ime.onblur=function(){this.style.display="none";GodotConfig.canvas.focus();GodotIME.active=false};GodotConfig.canvas.parentElement.appendChild(ime);GodotIME.ime=ime},clear:function(){if(GodotIME.ime==null){return}if(GodotIME.focusTimerIntervalId>-1){clearInterval(GodotIME.focusTimerIntervalId);GodotIME.focusTimerIntervalId=-1}GodotIME.ime.remove();GodotIME.ime=null}};var GodotInput={getModifiers:function(evt){return evt.shiftKey+0+(evt.altKey+0<<1)+(evt.ctrlKey+0<<2)+(evt.metaKey+0<<3)},computePosition:function(evt,rect){const canvas=GodotConfig.canvas;const rw=canvas.width/rect.width;const rh=canvas.height/rect.height;const x=(evt.clientX-rect.x)*rw;const y=(evt.clientY-rect.y)*rh;return[x,y]}};function _godot_js_input_drop_files_cb(callback){const func=GodotRuntime.get_func(callback);const dropFiles=function(files){const args=files||[];if(!args.length){return}const argc=args.length;const argv=GodotRuntime.allocStringArray(args);func(argv,argc);GodotRuntime.freeStringArray(argv,argc)};const canvas=GodotConfig.canvas;GodotEventListeners.add(canvas,"dragover",function(ev){ev.preventDefault()},false);GodotEventListeners.add(canvas,"drop",GodotInputDragDrop.handler(dropFiles))}function _godot_js_input_gamepad_cb(change_cb){const onchange=GodotRuntime.get_func(change_cb);GodotInputGamepads.init(onchange)}function _godot_js_input_gamepad_sample(){GodotInputGamepads.sample();return 0}function _godot_js_input_gamepad_sample_count(){return GodotInputGamepads.get_samples().length}function _godot_js_input_gamepad_sample_get(p_index,r_btns,r_btns_num,r_axes,r_axes_num,r_standard){const sample=GodotInputGamepads.get_sample(p_index);if(!sample||!sample.connected){return 1}const btns=sample.buttons;const btns_len=btns.length<16?btns.length:16;for(let i=0;i{const inputs=[...midi.inputs.values()];const inputNames=inputs.map(input=>input.name);const c_ptr=GodotRuntime.allocStringArray(inputNames);setInputNamesCb(inputNames.length,c_ptr);GodotRuntime.freeStringArray(c_ptr,inputNames.length);inputs.forEach((input,i)=>{const abortController=new AbortController;GodotWebMidi.abortControllers.push(abortController);input.addEventListener("midimessage",event=>{const status=event.data[0];const data=event.data.slice(1);const size=data.length;if(size>dataBufferLen){throw new Error(`data too big ${size} > ${dataBufferLen}`)}HEAPU8.set(data,pDataBuffer);onMidiMessageCb(i,status,pDataBuffer,data.length)},{signal:abortController.signal})})});return 0}var GodotWebSocket={_onopen:function(p_id,callback,event){const ref=IDHandler.get(p_id);if(!ref){return}const c_str=GodotRuntime.allocString(ref.protocol);callback(c_str);GodotRuntime.free(c_str)},_onmessage:function(p_id,callback,event){const ref=IDHandler.get(p_id);if(!ref){return}let buffer;let is_string=0;if(event.data instanceof ArrayBuffer){buffer=new Uint8Array(event.data)}else if(event.data instanceof Blob){GodotRuntime.error("Blob type not supported");return}else if(typeof event.data==="string"){is_string=1;buffer=new TextEncoder("utf-8").encode(event.data)}else{GodotRuntime.error("Unknown message type");return}const len=buffer.length*buffer.BYTES_PER_ELEMENT;const out=GodotRuntime.malloc(len);HEAPU8.set(buffer,out);callback(out,len,is_string);GodotRuntime.free(out)},_onerror:function(p_id,callback,event){const ref=IDHandler.get(p_id);if(!ref){return}callback()},_onclose:function(p_id,callback,event){const ref=IDHandler.get(p_id);if(!ref){return}const c_str=GodotRuntime.allocString(event.reason);callback(event.code,c_str,event.wasClean?1:0);GodotRuntime.free(c_str)},send:function(p_id,p_data){const ref=IDHandler.get(p_id);if(!ref||ref.readyState!==ref.OPEN){return 1}ref.send(p_data);return 0},bufferedAmount:function(p_id){const ref=IDHandler.get(p_id);if(!ref){return 0}return ref.bufferedAmount},create:function(socket,p_on_open,p_on_message,p_on_error,p_on_close){const id=IDHandler.add(socket);socket.onopen=GodotWebSocket._onopen.bind(null,id,p_on_open);socket.onmessage=GodotWebSocket._onmessage.bind(null,id,p_on_message);socket.onerror=GodotWebSocket._onerror.bind(null,id,p_on_error);socket.onclose=GodotWebSocket._onclose.bind(null,id,p_on_close);return id},close:function(p_id,p_code,p_reason){const ref=IDHandler.get(p_id);if(ref&&ref.readyState=Number.MIN_SAFE_INTEGER&&heap_value<=Number.MAX_SAFE_INTEGER?Number(heap_value):heap_value}case 3:return Number(GodotRuntime.getHeapValue(val,"double"));case 4:return GodotRuntime.parseString(GodotRuntime.getHeapValue(val,"*"));case 24:return GodotJSWrapper.get_proxied_value(GodotRuntime.getHeapValue(val,"i64"));default:return undefined}},js2variant:function(p_val,p_exchange){if(p_val===undefined||p_val===null){return 0}const type=typeof p_val;if(type==="boolean"){GodotRuntime.setHeapValue(p_exchange,p_val,"i64");return 1}else if(type==="number"){if(Number.isInteger(p_val)){GodotRuntime.setHeapValue(p_exchange,p_val,"i64");return 2}GodotRuntime.setHeapValue(p_exchange,p_val,"double");return 3}else if(type==="bigint"){GodotRuntime.setHeapValue(p_exchange,p_val,"i64");return 2}else if(type==="string"){const c_str=GodotRuntime.allocString(p_val);GodotRuntime.setHeapValue(p_exchange,c_str,"*");return 4}const id=GodotJSWrapper.get_proxied(p_val);GodotRuntime.setHeapValue(p_exchange,id,"i64");return 24},isBuffer:function(obj){return obj instanceof ArrayBuffer||ArrayBuffer.isView(obj)}};function _godot_js_wrapper_create_cb(p_ref,p_func){const func=GodotRuntime.get_func(p_func);let id=0;const cb=function(){if(!GodotJSWrapper.get_proxied_value(id)){return undefined}GodotJSWrapper.cb_ret=null;const args=Array.from(arguments);const argsProxy=new GodotJSWrapper.MyProxy(args);func(p_ref,argsProxy.get_id(),args.length);argsProxy.unref();const ret=GodotJSWrapper.cb_ret;GodotJSWrapper.cb_ret=null;return ret};id=GodotJSWrapper.get_proxied(cb);return id}function _godot_js_wrapper_create_object(p_object,p_args,p_argc,p_convert_callback,p_exchange,p_lock,p_free_lock_callback){const name=GodotRuntime.parseString(p_object);if(typeof window[name]==="undefined"){return-1}const convert=GodotRuntime.get_func(p_convert_callback);const freeLock=GodotRuntime.get_func(p_free_lock_callback);const args=new Array(p_argc);for(let i=0;i{if(GodotWebXR.session&&GodotWebXR.space){const onFrame=function(time,frame){GodotWebXR.frame=frame;GodotWebXR.pose=frame.getViewerPose(GodotWebXR.space);callback(time);GodotWebXR.frame=null;GodotWebXR.pose=null};GodotWebXR.session.requestAnimationFrame(onFrame)}else{GodotWebXR.orig_requestAnimationFrame(callback)}},monkeyPatchRequestAnimationFrame:enable=>{if(GodotWebXR.orig_requestAnimationFrame===null){GodotWebXR.orig_requestAnimationFrame=MainLoop.requestAnimationFrame}MainLoop.requestAnimationFrame=enable?GodotWebXR.requestAnimationFrame:GodotWebXR.orig_requestAnimationFrame},pauseResumeMainLoop:()=>{MainLoop.pause();runtimeKeepalivePush();window.setTimeout(function(){runtimeKeepalivePop();MainLoop.resume()},0)},getLayer:()=>{const new_view_count=GodotWebXR.pose?GodotWebXR.pose.views.length:1;let layer=GodotWebXR.layer;if(layer&&GodotWebXR.view_count===new_view_count){return layer}if(!GodotWebXR.session||!GodotWebXR.gl_binding||!GodotWebXR.gl_binding.createProjectionLayer){return null}const gl=GodotWebXR.gl;layer=GodotWebXR.gl_binding.createProjectionLayer({textureType:new_view_count>1?"texture-array":"texture",colorFormat:gl.RGBA8,depthFormat:gl.DEPTH_COMPONENT24});GodotWebXR.session.updateRenderState({layers:[layer]});GodotWebXR.layer=layer;GodotWebXR.view_count=new_view_count;return layer},getSubImage:()=>{if(!GodotWebXR.pose){return null}const layer=GodotWebXR.getLayer();if(layer===null){return null}return GodotWebXR.gl_binding.getViewSubImage(layer,GodotWebXR.pose.views[0])},getTextureId:texture=>{if(texture.name!==undefined){return texture.name}const id=GL.getNewId(GL.textures);texture.name=id;GL.textures[id]=texture;return id},addInputSource:input_source=>{let name=-1;if(input_source.targetRayMode==="tracked-pointer"&&input_source.handedness==="left"){name=0}else if(input_source.targetRayMode==="tracked-pointer"&&input_source.handedness==="right"){name=1}else{for(let i=2;i<16;i++){if(!GodotWebXR.input_sources[i]){name=i;break}}}if(name>=0){GodotWebXR.input_sources[name]=input_source;input_source.name=name;if(input_source.targetRayMode==="screen"){let touch_index=-1;for(let i=0;i<5;i++){if(!GodotWebXR.touches[i]){touch_index=i;break}}if(touch_index>=0){GodotWebXR.touches[touch_index]=input_source;input_source.touch_index=touch_index}}}return name},removeInputSource:input_source=>{if(input_source.name!==undefined){const name=input_source.name;if(name>=0&&name<16){GodotWebXR.input_sources[name]=null}if(input_source.touch_index!==undefined){const touch_index=input_source.touch_index;if(touch_index>=0&&touch_index<5){GodotWebXR.touches[touch_index]=null}}return name}return-1},getInputSourceId:input_source=>{if(input_source!==undefined){return input_source.name}return-1},getTouchIndex:input_source=>{if(input_source.touch_index!==undefined){return input_source.touch_index}return-1}};function _godot_webxr_get_bounds_geometry(r_points){if(!GodotWebXR.space||!GodotWebXR.space.boundsGeometry){return 0}const point_count=GodotWebXR.space.boundsGeometry.length;if(point_count===0){return 0}const buf=GodotRuntime.malloc(point_count*3*4);for(let i=0;i=0){matrix=views[p_view].transform.matrix}else{matrix=GodotWebXR.pose.transform.matrix}for(let i=0;i<16;i++){GodotRuntime.setHeapValue(r_transform+i*4,matrix[i],"float")}return true}function _godot_webxr_get_velocity_texture(){const subimage=GodotWebXR.getSubImage();if(subimage===null){return 0}if(!subimage.motionVectorTexture){return 0}return GodotWebXR.getTextureId(subimage.motionVectorTexture)}function _godot_webxr_get_view_count(){if(!GodotWebXR.session||!GodotWebXR.pose){return 1}const view_count=GodotWebXR.pose.views.length;return view_count>0?view_count:1}function _godot_webxr_get_visibility_state(){if(!GodotWebXR.session||!GodotWebXR.session.visibilityState){return 0}return GodotRuntime.allocString(GodotWebXR.session.visibilityState)}var _godot_webxr_initialize=function(p_session_mode,p_required_features,p_optional_features,p_requested_reference_spaces,p_on_session_started,p_on_session_ended,p_on_session_failed,p_on_input_event,p_on_simple_event){GodotWebXR.monkeyPatchRequestAnimationFrame(true);const session_mode=GodotRuntime.parseString(p_session_mode);const required_features=GodotRuntime.parseString(p_required_features).split(",").map(s=>s.trim()).filter(s=>s!=="");const optional_features=GodotRuntime.parseString(p_optional_features).split(",").map(s=>s.trim()).filter(s=>s!=="");const requested_reference_space_types=GodotRuntime.parseString(p_requested_reference_spaces).split(",").map(s=>s.trim());const onstarted=GodotRuntime.get_func(p_on_session_started);const onended=GodotRuntime.get_func(p_on_session_ended);const onfailed=GodotRuntime.get_func(p_on_session_failed);const oninputevent=GodotRuntime.get_func(p_on_input_event);const onsimpleevent=GodotRuntime.get_func(p_on_simple_event);const session_init={};if(required_features.length>0){session_init["requiredFeatures"]=required_features}if(optional_features.length>0){session_init["optionalFeatures"]=optional_features}navigator.xr.requestSession(session_mode,session_init).then(function(session){GodotWebXR.session=session;session.addEventListener("end",function(evt){onended()});session.addEventListener("inputsourceschange",function(evt){evt.added.forEach(GodotWebXR.addInputSource);evt.removed.forEach(GodotWebXR.removeInputSource)});["selectstart","selectend","squeezestart","squeezeend"].forEach((input_event,index)=>{session.addEventListener(input_event,function(evt){GodotWebXR.frame=evt.frame;oninputevent(index,GodotWebXR.getInputSourceId(evt.inputSource));GodotWebXR.frame=null})});session.addEventListener("visibilitychange",function(evt){const c_str=GodotRuntime.allocString("visibility_state_changed");onsimpleevent(c_str);GodotRuntime.free(c_str)});GodotWebXR.onsimpleevent=onsimpleevent;const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle).GLctx;GodotWebXR.gl=gl;gl.makeXRCompatible().then(function(){const throwNoWebXRLayersError=()=>{throw new Error("This browser doesn't support WebXR Layers (which Godot requires) nor is the polyfill in use. If you are the developer of this application, please consider including the polyfill.")};try{GodotWebXR.gl_binding=new XRWebGLBinding(session,gl)}catch(error){throwNoWebXRLayersError()}if(!GodotWebXR.gl_binding.createProjectionLayer){throwNoWebXRLayersError()}const layer=GodotWebXR.getLayer();if(!layer){throw new Error("Unable to create WebXR Layer.")}function onReferenceSpaceSuccess(reference_space,reference_space_type){GodotWebXR.space=reference_space;reference_space.onreset=function(evt){const c_str=GodotRuntime.allocString("reference_space_reset");onsimpleevent(c_str);GodotRuntime.free(c_str)};GodotWebXR.pauseResumeMainLoop();window.setTimeout(function(){const reference_space_c_str=GodotRuntime.allocString(reference_space_type);const enabled_features="enabledFeatures"in session?Array.from(session.enabledFeatures):[];const enabled_features_c_str=GodotRuntime.allocString(enabled_features.join(","));const environment_blend_mode="environmentBlendMode"in session?session.environmentBlendMode:"";const environment_blend_mode_c_str=GodotRuntime.allocString(environment_blend_mode);onstarted(reference_space_c_str,enabled_features_c_str,environment_blend_mode_c_str);GodotRuntime.free(reference_space_c_str);GodotRuntime.free(enabled_features_c_str);GodotRuntime.free(environment_blend_mode_c_str)},0)}function requestReferenceSpace(){const reference_space_type=requested_reference_space_types.shift();session.requestReferenceSpace(reference_space_type).then(refSpace=>{onReferenceSpaceSuccess(refSpace,reference_space_type)}).catch(()=>{if(requested_reference_space_types.length===0){const c_str=GodotRuntime.allocString("Unable to get any of the requested reference space types");onfailed(c_str);GodotRuntime.free(c_str)}else{requestReferenceSpace()}})}requestReferenceSpace()}).catch(function(error){const c_str=GodotRuntime.allocString(`Unable to make WebGL context compatible with WebXR: ${error}`);onfailed(c_str);GodotRuntime.free(c_str)})}).catch(function(error){const c_str=GodotRuntime.allocString(`Unable to start session: ${error}`);onfailed(c_str);GodotRuntime.free(c_str)})};function _godot_webxr_is_session_supported(p_session_mode,p_callback){const session_mode=GodotRuntime.parseString(p_session_mode);const cb=GodotRuntime.get_func(p_callback);if(navigator.xr){navigator.xr.isSessionSupported(session_mode).then(function(supported){const c_str=GodotRuntime.allocString(session_mode);cb(c_str,supported?1:0);GodotRuntime.free(c_str)})}else{const c_str=GodotRuntime.allocString(session_mode);cb(c_str,0);GodotRuntime.free(c_str)}}function _godot_webxr_is_supported(){return!!navigator.xr}var _godot_webxr_uninitialize=function(){if(GodotWebXR.session){GodotWebXR.session.end().catch(e=>{})}GodotWebXR.session=null;GodotWebXR.gl_binding=null;GodotWebXR.layer=null;GodotWebXR.space=null;GodotWebXR.frame=null;GodotWebXR.pose=null;GodotWebXR.view_count=1;GodotWebXR.input_sources=new Array(16);GodotWebXR.touches=new Array(5);GodotWebXR.onsimpleevent=null;GodotWebXR.monkeyPatchRequestAnimationFrame(false);GodotWebXR.pauseResumeMainLoop()};function _godot_webxr_update_input_source(p_input_source_id,r_target_pose,r_target_ray_mode,r_touch_index,r_has_grip_pose,r_grip_pose,r_has_standard_mapping,r_button_count,r_buttons,r_axes_count,r_axes,r_has_hand_data,r_hand_joints,r_hand_radii){if(!GodotWebXR.session||!GodotWebXR.frame){return 0}if(p_input_source_id<0||p_input_source_id>=GodotWebXR.input_sources.length||!GodotWebXR.input_sources[p_input_source_id]){return false}const input_source=GodotWebXR.input_sources[p_input_source_id];const frame=GodotWebXR.frame;const space=GodotWebXR.space;const target_pose=frame.getPose(input_source.targetRaySpace,space);if(!target_pose){return false}const target_pose_matrix=target_pose.transform.matrix;for(let i=0;i<16;i++){GodotRuntime.setHeapValue(r_target_pose+i*4,target_pose_matrix[i],"float")}let target_ray_mode=0;switch(input_source.targetRayMode){case"gaze":target_ray_mode=1;break;case"tracked-pointer":target_ray_mode=2;break;case"screen":target_ray_mode=3;break;default:}GodotRuntime.setHeapValue(r_target_ray_mode,target_ray_mode,"i32");GodotRuntime.setHeapValue(r_touch_index,GodotWebXR.getTouchIndex(input_source),"i32");let has_grip_pose=false;if(input_source.gripSpace){const grip_pose=frame.getPose(input_source.gripSpace,space);if(grip_pose){const grip_pose_matrix=grip_pose.transform.matrix;for(let i=0;i<16;i++){GodotRuntime.setHeapValue(r_grip_pose+i*4,grip_pose_matrix[i],"float")}has_grip_pose=true}}GodotRuntime.setHeapValue(r_has_grip_pose,has_grip_pose?1:0,"i32");let has_standard_mapping=false;let button_count=0;let axes_count=0;if(input_source.gamepad){if(input_source.gamepad.mapping==="xr-standard"){has_standard_mapping=true}button_count=Math.min(input_source.gamepad.buttons.length,10);for(let i=0;i{const c_str=GodotRuntime.allocString("display_refresh_rate_changed");GodotWebXR.onsimpleevent(c_str);GodotRuntime.free(c_str)})}var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var stackSave=()=>_emscripten_stack_get_current();var stackRestore=val=>__emscripten_stack_restore(val);var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack="";Module["requestAnimationFrame"]=MainLoop.requestAnimationFrame;Module["pauseMainLoop"]=MainLoop.pause;Module["resumeMainLoop"]=MainLoop.resume;MainLoop.init();for(let i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<=288;++i){miniTempWebGLIntBuffers[i]=miniTempWebGLIntBuffersStorage.subarray(0,i)}var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<=288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i)}Module["request_quit"]=function(){GodotOS.request_quit()};Module["onExit"]=GodotOS.cleanup;GodotOS._fs_sync_promise=Promise.resolve();Module["initConfig"]=GodotConfig.init_config;Module["initFS"]=GodotFS.init;Module["copyToFS"]=GodotFS.copy_to_fs;GodotOS.atexit(function(resolve,reject){GodotDisplayCursor.clear();resolve()});GodotOS.atexit(function(resolve,reject){GodotEventListeners.clear();resolve()});GodotOS.atexit(function(resolve,reject){GodotDisplayVK.clear();resolve()});GodotOS.atexit(function(resolve,reject){GodotIME.clear();resolve()});GodotJSWrapper.proxies=new Map;{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["preloadPlugins"])preloadPlugins=Module["preloadPlugins"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"]}Module["callMain"]=callMain;Module["cwrap"]=cwrap;var _free,__Z14godot_web_mainiPPc,_main,_malloc,_fflush,__emwebxr_on_input_event,__emwebxr_on_simple_event,___funcs_on_exit,__emscripten_timeout,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current;function assignWasmExports(wasmExports){Module["_free"]=_free=wasmExports["qf"];Module["__Z14godot_web_mainiPPc"]=__Z14godot_web_mainiPPc=wasmExports["rf"];Module["_main"]=_main=wasmExports["sf"];Module["_malloc"]=_malloc=wasmExports["tf"];_fflush=wasmExports["uf"];Module["__emwebxr_on_input_event"]=__emwebxr_on_input_event=wasmExports["vf"];Module["__emwebxr_on_simple_event"]=__emwebxr_on_simple_event=wasmExports["wf"];___funcs_on_exit=wasmExports["yf"];__emscripten_timeout=wasmExports["zf"];__emscripten_stack_restore=wasmExports["Af"];__emscripten_stack_alloc=wasmExports["Bf"];_emscripten_stack_get_current=wasmExports["Cf"]}var wasmImports={Oc:___call_sighandler,fd:___syscall_chdir,_a:___syscall_chmod,gd:___syscall_faccessat,dd:___syscall_fchmod,V:___syscall_fcntl64,cd:___syscall_fstat64,_c:___syscall_ftruncate64,Zc:___syscall_getcwd,Nc:___syscall_getdents64,Ba:___syscall_ioctl,ad:___syscall_lstat64,Uc:___syscall_mkdirat,Tc:___syscall_mknodat,$c:___syscall_newfstatat,Ya:___syscall_openat,Mc:___syscall_readlinkat,Kc:___syscall_renameat,Ua:___syscall_rmdir,bd:___syscall_stat64,Jc:___syscall_statfs64,Ic:___syscall_symlinkat,Va:___syscall_unlinkat,hd:__abort_js,Qc:__emscripten_runtime_keepalive_clear,Rc:__gmtime_js,Sc:__localtime_js,Fc:__setitimer_js,id:__tzset_js,ed:_clock_time_get,Ve:_emscripten_cancel_main_loop,Za:_emscripten_date_now,We:_emscripten_force_exit,Hc:_emscripten_get_heap_max,ja:_emscripten_get_now,Gc:_emscripten_resize_heap,Lc:_emscripten_set_canvas_element_size,Ma:_emscripten_set_main_loop,Qa:_emscripten_webgl_commit_frame,bc:_emscripten_webgl_create_context,Lb:_emscripten_webgl_destroy_context,$b:_emscripten_webgl_enable_extension,vd:_emscripten_webgl_get_supported_extensions,ac:_emscripten_webgl_make_context_current,Xc:_environ_get,Yc:_environ_sizes_get,La:_exit,oa:_fd_close,Wa:_fd_fdstat_get,$a:_fd_read,Wc:_fd_seek,Aa:_fd_write,h:_glActiveTexture,eb:_glAttachShader,ea:_glBeginTransformFeedback,b:_glBindBuffer,y:_glBindBufferBase,Ea:_glBindBufferRange,d:_glBindFramebuffer,ua:_glBindRenderbuffer,c:_glBindTexture,f:_glBindVertexArray,Qd:_glBlendColor,K:_glBlendEquation,ia:_glBlendFunc,D:_glBlendFuncSeparate,la:_glBlitFramebuffer,i:_glBufferData,Q:_glBufferSubData,R:_glCheckFramebufferStatus,G:_glClear,Ga:_glClearBufferfv,S:_glClearColor,ba:_glClearDepthf,mb:_glClearStencil,Y:_glColorMask,gb:_glCompileShader,od:_glCompressedTexImage2D,qd:_glCompressedTexImage3D,pd:_glCompressedTexSubImage3D,rd:_glCopyBufferSubData,Bd:_glCreateProgram,ib:_glCreateShader,na:_glCullFace,o:_glDeleteBuffers,w:_glDeleteFramebuffers,ga:_glDeleteProgram,ld:_glDeleteQueries,pa:_glDeleteRenderbuffers,X:_glDeleteShader,ob:_glDeleteSync,l:_glDeleteTextures,N:_glDeleteVertexArrays,H:_glDepthFunc,x:_glDepthMask,e:_glDisable,p:_glDisableVertexAttribArray,F:_glDrawArrays,Z:_glDrawArraysInstanced,ma:_glDrawBuffers,O:_glDrawElements,P:_glDrawElementsInstanced,s:_glEnable,g:_glEnableVertexAttribArray,da:_glEndTransformFeedback,nb:_glFenceSync,Jd:_glFinish,Ja:_glFramebufferRenderbuffer,u:_glFramebufferTexture2D,aa:_glFramebufferTextureLayer,lb:_glFrontFace,m:_glGenBuffers,C:_glGenFramebuffers,md:_glGenQueries,Ka:_glGenRenderbuffers,r:_glGenTextures,M:_glGenVertexArrays,kd:_glGenerateMipmap,td:_glGetFloatv,ud:_glGetInteger64v,fa:_glGetIntegerv,wd:_glGetProgramInfoLog,db:_glGetProgramiv,fb:_glGetShaderInfoLog,sa:_glGetShaderiv,_:_glGetString,Td:_glGetSynciv,Ed:_glGetUniformBlockIndex,Fa:_glGetUniformLocation,yd:_glLinkProgram,Ca:_glPixelStorei,Hd:_glReadBuffer,Da:_glReadPixels,Md:_glRenderbufferStorage,bb:_glRenderbufferStorageMultisample,wa:_glScissor,hb:_glShaderSource,kb:_glStencilFunc,ha:_glStencilMask,Fd:_glStencilOp,q:_glTexImage2D,U:_glTexImage3D,Ia:_glTexParameterf,a:_glTexParameteri,Ha:_glTexStorage2D,ab:_glTexSubImage3D,zd:_glTransformFeedbackVaryings,j:_glUniform1f,E:_glUniform1i,Cd:_glUniform1iv,v:_glUniform1ui,ta:_glUniform1uiv,$:_glUniform2f,I:_glUniform2fv,ka:_glUniform2iv,t:_glUniform3fv,L:_glUniform4f,B:_glUniform4fv,Dd:_glUniformBlockBinding,jb:_glUniformMatrix3fv,J:_glUniformMatrix4fv,n:_glUseProgram,va:_glVertexAttrib4f,z:_glVertexAttribDivisor,ca:_glVertexAttribI4ui,T:_glVertexAttribIPointer,k:_glVertexAttribPointer,A:_glViewport,Ie:_godot_audio_get_sample_playback_position,xd:_godot_audio_has_script_processor,Id:_godot_audio_has_worklet,mf:_godot_audio_init,yc:_godot_audio_input_start,rc:_godot_audio_input_stop,nf:_godot_audio_is_available,qa:_godot_audio_resume,Sd:_godot_audio_sample_bus_add,Rd:_godot_audio_sample_bus_move,Zd:_godot_audio_sample_bus_remove,ge:_godot_audio_sample_bus_set_count,Kd:_godot_audio_sample_bus_set_mute,Od:_godot_audio_sample_bus_set_send,Ld:_godot_audio_sample_bus_set_solo,Nd:_godot_audio_sample_bus_set_volume_db,Te:_godot_audio_sample_is_active,Yb:_godot_audio_sample_register_stream,Pd:_godot_audio_sample_set_finished_callback,af:_godot_audio_sample_set_pause,pe:_godot_audio_sample_set_volumes_linear,Fb:_godot_audio_sample_start,lf:_godot_audio_sample_stop,hc:_godot_audio_sample_stream_is_registered,Nb:_godot_audio_sample_unregister_stream,ze:_godot_audio_sample_update_pitch_scale,sd:_godot_audio_script_create,nd:_godot_audio_script_start,Gd:_godot_audio_worklet_create,Ad:_godot_audio_worklet_start_no_threads,gc:_godot_js_config_canvas_id_get,Ke:_godot_js_config_locale_get,Se:_godot_js_display_alert,sc:_godot_js_display_canvas_focus,tc:_godot_js_display_canvas_is_focused,ic:_godot_js_display_clipboard_get,jc:_godot_js_display_clipboard_set,vc:_godot_js_display_cursor_is_hidden,uc:_godot_js_display_cursor_is_locked,ya:_godot_js_display_cursor_lock_set,Ta:_godot_js_display_cursor_set_custom_shape,wc:_godot_js_display_cursor_set_shape,za:_godot_js_display_cursor_set_visible,Eb:_godot_js_display_desired_size_set,Qb:_godot_js_display_fullscreen_cb,Db:_godot_js_display_fullscreen_exit,Cb:_godot_js_display_fullscreen_request,cc:_godot_js_display_has_webgl,ec:_godot_js_display_is_swap_ok_cancel,Ob:_godot_js_display_notification_cb,Hb:_godot_js_display_pixel_ratio_get,Ib:_godot_js_display_screen_dpi_get,Jb:_godot_js_display_screen_size_get,fc:_godot_js_display_setup_canvas,Vc:_godot_js_display_size_update,qc:_godot_js_display_touchscreen_is_available,Kb:_godot_js_display_tts_available,Pa:_godot_js_display_vk_available,Mb:_godot_js_display_vk_cb,oc:_godot_js_display_vk_hide,pc:_godot_js_display_vk_show,Pb:_godot_js_display_window_blur_cb,Ra:_godot_js_display_window_icon_set,Oa:_godot_js_display_window_size_get,Gb:_godot_js_display_window_title_set,Ue:_godot_js_emscripten_get_version,$e:_godot_js_eval,Ab:_godot_js_fetch_create,Na:_godot_js_fetch_free,xb:_godot_js_fetch_http_status_get,zb:_godot_js_fetch_is_chunked,yb:_godot_js_fetch_read_chunk,kf:_godot_js_fetch_read_headers,xa:_godot_js_fetch_state_get,Tb:_godot_js_input_drop_files_cb,Sb:_godot_js_input_gamepad_cb,Bb:_godot_js_input_gamepad_sample,lc:_godot_js_input_gamepad_sample_count,kc:_godot_js_input_gamepad_sample_get,Vb:_godot_js_input_key_cb,_b:_godot_js_input_mouse_button_cb,Zb:_godot_js_input_mouse_move_cb,Xb:_godot_js_input_mouse_wheel_cb,Ub:_godot_js_input_paste_cb,Wb:_godot_js_input_touch_cb,Me:_godot_js_input_vibrate_handheld,Sa:_godot_js_is_ime_focused,Ye:_godot_js_os_download_buffer,Qe:_godot_js_os_execute,vb:_godot_js_os_finish_async,He:_godot_js_os_fs_is_persistent,Re:_godot_js_os_fs_sync,Oe:_godot_js_os_has_feature,Pe:_godot_js_os_hw_concurrency_get,dc:_godot_js_os_request_quit_cb,Ne:_godot_js_os_shell_open,Je:_godot_js_pwa_cb,Le:_godot_js_pwa_update,ub:_godot_js_rtc_datachannel_close,xe:_godot_js_rtc_datachannel_connect,ue:_godot_js_rtc_datachannel_destroy,ye:_godot_js_rtc_datachannel_get_buffered_amount,De:_godot_js_rtc_datachannel_id_get,Ae:_godot_js_rtc_datachannel_is_negotiated,Ee:_godot_js_rtc_datachannel_is_ordered,we:_godot_js_rtc_datachannel_label_get,Ce:_godot_js_rtc_datachannel_max_packet_lifetime_get,Be:_godot_js_rtc_datachannel_max_retransmits_get,ve:_godot_js_rtc_datachannel_protocol_get,Ge:_godot_js_rtc_datachannel_ready_state_get,Fe:_godot_js_rtc_datachannel_send,tb:_godot_js_rtc_pc_close,oe:_godot_js_rtc_pc_create,ne:_godot_js_rtc_pc_datachannel_create,sb:_godot_js_rtc_pc_destroy,qe:_godot_js_rtc_pc_ice_candidate_add,se:_godot_js_rtc_pc_local_description_set,te:_godot_js_rtc_pc_offer_create,re:_godot_js_rtc_pc_remote_description_set,nc:_godot_js_set_ime_active,Rb:_godot_js_set_ime_cb,mc:_godot_js_set_ime_position,Cc:_godot_js_tts_get_voices,Dc:_godot_js_tts_is_paused,Ec:_godot_js_tts_is_speaking,Ac:_godot_js_tts_pause,zc:_godot_js_tts_resume,Bc:_godot_js_tts_speak,xc:_godot_js_tts_stop,Xa:_godot_js_webmidi_close_midi_inputs,jd:_godot_js_webmidi_open_midi_inputs,ke:_godot_js_websocket_buffered_amount,je:_godot_js_websocket_close,me:_godot_js_websocket_create,rb:_godot_js_websocket_destroy,le:_godot_js_websocket_send,df:_godot_js_wrapper_create_cb,bf:_godot_js_wrapper_create_object,cf:_godot_js_wrapper_interface_get,ff:_godot_js_wrapper_object_call,hf:_godot_js_wrapper_object_get,wb:_godot_js_wrapper_object_getvar,_e:_godot_js_wrapper_object_is_buffer,jf:_godot_js_wrapper_object_set,ef:_godot_js_wrapper_object_set_cb_ret,gf:_godot_js_wrapper_object_setvar,Ze:_godot_js_wrapper_object_transfer_buffer,Xe:_godot_js_wrapper_object_unref,cb:_godot_webgl2_glFramebufferTextureMultisampleMultiviewOVR,W:_godot_webgl2_glFramebufferTextureMultiviewOVR,ra:_godot_webgl2_glGetBufferSubData,fe:_godot_webxr_get_bounds_geometry,Xd:_godot_webxr_get_color_texture,Wd:_godot_webxr_get_depth_texture,ee:_godot_webxr_get_frame_rate,Yd:_godot_webxr_get_projection_for_view,_d:_godot_webxr_get_render_target_size,ce:_godot_webxr_get_supported_frame_rates,pb:_godot_webxr_get_transform_for_view,Vd:_godot_webxr_get_velocity_texture,qb:_godot_webxr_get_view_count,he:_godot_webxr_get_visibility_state,ae:_godot_webxr_initialize,ie:_godot_webxr_is_session_supported,be:_godot_webxr_is_supported,$d:_godot_webxr_uninitialize,Ud:_godot_webxr_update_input_source,de:_godot_webxr_update_target_frame_rate,Pc:_proc_exit};var wasmExports=await createWasm();function callMain(args=[]){var entryFunction=_main;args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv;args.forEach(arg=>{HEAPU32[argv_ptr>>2]=stringToUTF8OnStack(arg);argv_ptr+=4});HEAPU32[argv_ptr>>2]=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(args=arguments_){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();var noInitialRun=Module["noInitialRun"]||true;if(!noInitialRun)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}function preInit(){if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}preInit();run();addOnPostRun(function(){GL.getSource=(shader,count,string,length)=>{let source="";for(let i=0;i>2];const len=length?HEAPU32[length+i*4>>2]:undefined;if(len){const endPtr=ptr+len;const slice=HEAPU8.buffer instanceof ArrayBuffer?HEAPU8.subarray(ptr,endPtr):HEAPU8.slice(ptr,endPtr);source+=UTF8Decoder.decode(slice)}else{source+=UTF8ToString(ptr,len)}}return source}});if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} + + + return moduleRtn; +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') { + module.exports = Godot; + // This default export looks redundant, but it allows TS to import this + // commonjs style module. + module.exports.default = Godot; +} else if (typeof define === 'function' && define['amd']) + define([], () => Godot); + +const Features = { + /** + * Check whether WebGL is available. Optionally, specify a particular version of WebGL to check for. + * + * @param {number=} [majorVersion=1] The major WebGL version to check for. + * @returns {boolean} If the given major version of WebGL is available. + * @function Engine.isWebGLAvailable + */ + isWebGLAvailable: function (majorVersion = 1) { + try { + return !!document.createElement('canvas').getContext(['webgl', 'webgl2'][majorVersion - 1]); + } catch (e) { /* Not available */ } + return false; + }, + + /** + * Check whether the Fetch API available and supports streaming responses. + * + * @returns {boolean} If the Fetch API is available and supports streaming responses. + * @function Engine.isFetchAvailable + */ + isFetchAvailable: function () { + return 'fetch' in window && 'Response' in window && 'body' in window.Response.prototype; + }, + + /** + * Check whether the engine is running in a Secure Context. + * + * @returns {boolean} If the engine is running in a Secure Context. + * @function Engine.isSecureContext + */ + isSecureContext: function () { + return window['isSecureContext'] === true; + }, + + /** + * Check whether the engine is cross origin isolated. + * This value is dependent on Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy headers sent by the server. + * + * @returns {boolean} If the engine is running in a Secure Context. + * @function Engine.isSecureContext + */ + isCrossOriginIsolated: function () { + return window['crossOriginIsolated'] === true; + }, + + /** + * Check whether SharedBufferArray is available. + * + * Most browsers require the page to be running in a secure context, and the + * the server to provide specific CORS headers for SharedArrayBuffer to be available. + * + * @returns {boolean} If SharedArrayBuffer is available. + * @function Engine.isSharedArrayBufferAvailable + */ + isSharedArrayBufferAvailable: function () { + return 'SharedArrayBuffer' in window; + }, + + /** + * Check whether the AudioContext supports AudioWorkletNodes. + * + * @returns {boolean} If AudioWorkletNode is available. + * @function Engine.isAudioWorkletAvailable + */ + isAudioWorkletAvailable: function () { + return 'AudioContext' in window && 'audioWorklet' in AudioContext.prototype; + }, + + /** + * Return an array of missing required features (as string). + * + * @returns {Array} A list of human-readable missing features. + * @function Engine.getMissingFeatures + * @param {{threads: (boolean|undefined)}} supportedFeatures + */ + getMissingFeatures: function (supportedFeatures = {}) { + const { + // Quotes are needed for the Closure compiler. + 'threads': supportsThreads = true, + } = supportedFeatures; + + const missing = []; + if (!Features.isWebGLAvailable(2)) { + missing.push('WebGL2 - Check web browser configuration and hardware support'); + } + if (!Features.isFetchAvailable()) { + missing.push('Fetch - Check web browser version'); + } + if (!Features.isSecureContext()) { + missing.push('Secure Context - Check web server configuration (use HTTPS)'); + } + + if (supportsThreads) { + if (!Features.isCrossOriginIsolated()) { + missing.push('Cross-Origin Isolation - Check that the web server configuration sends the correct headers.'); + } + if (!Features.isSharedArrayBufferAvailable()) { + missing.push('SharedArrayBuffer - Check that the web server configuration sends the correct headers.'); + } + } + + // Audio is normally optional since we have a dummy fallback. + return missing; + }, +}; + +const Preloader = /** @constructor */ function () { // eslint-disable-line no-unused-vars + function getTrackedResponse(response, load_status) { + function onloadprogress(reader, controller) { + return reader.read().then(function (result) { + if (load_status.done) { + return Promise.resolve(); + } + if (result.value) { + controller.enqueue(result.value); + load_status.loaded += result.value.length; + } + if (!result.done) { + return onloadprogress(reader, controller); + } + load_status.done = true; + return Promise.resolve(); + }); + } + const reader = response.body.getReader(); + return new Response(new ReadableStream({ + start: function (controller) { + onloadprogress(reader, controller).then(function () { + controller.close(); + }); + }, + }), { headers: response.headers }); + } + + function loadFetch(file, tracker, fileSize, raw) { + tracker[file] = { + total: fileSize || 0, + loaded: 0, + done: false, + }; + return fetch(file).then(function (response) { + if (!response.ok) { + return Promise.reject(new Error(`Failed loading file '${file}'`)); + } + const tr = getTrackedResponse(response, tracker[file]); + if (raw) { + return Promise.resolve(tr); + } + return tr.arrayBuffer(); + }); + } + + function retry(func, attempts = 1) { + function onerror(err) { + if (attempts <= 1) { + return Promise.reject(err); + } + return new Promise(function (resolve, reject) { + setTimeout(function () { + retry(func, attempts - 1).then(resolve).catch(reject); + }, 1000); + }); + } + return func().catch(onerror); + } + + const DOWNLOAD_ATTEMPTS_MAX = 4; + const loadingFiles = {}; + const lastProgress = { loaded: 0, total: 0 }; + let progressFunc = null; + + const animateProgress = function () { + let loaded = 0; + let total = 0; + let totalIsValid = true; + let progressIsFinal = true; + + Object.keys(loadingFiles).forEach(function (file) { + const stat = loadingFiles[file]; + if (!stat.done) { + progressIsFinal = false; + } + if (!totalIsValid || stat.total === 0) { + totalIsValid = false; + total = 0; + } else { + total += stat.total; + } + loaded += stat.loaded; + }); + if (loaded !== lastProgress.loaded || total !== lastProgress.total) { + lastProgress.loaded = loaded; + lastProgress.total = total; + if (typeof progressFunc === 'function') { + progressFunc(loaded, total); + } + } + if (!progressIsFinal) { + requestAnimationFrame(animateProgress); + } + }; + + this.animateProgress = animateProgress; + + this.setProgressFunc = function (callback) { + progressFunc = callback; + }; + + this.loadPromise = function (file, fileSize, raw = false) { + return retry(loadFetch.bind(null, file, loadingFiles, fileSize, raw), DOWNLOAD_ATTEMPTS_MAX); + }; + + this.preloadedFiles = []; + this.preload = function (pathOrBuffer, destPath, fileSize) { + let buffer = null; + if (typeof pathOrBuffer === 'string') { + const me = this; + return this.loadPromise(pathOrBuffer, fileSize).then(function (buf) { + me.preloadedFiles.push({ + path: destPath || pathOrBuffer, + buffer: buf, + }); + return Promise.resolve(); + }); + } else if (pathOrBuffer instanceof ArrayBuffer) { + buffer = new Uint8Array(pathOrBuffer); + } else if (ArrayBuffer.isView(pathOrBuffer)) { + buffer = new Uint8Array(pathOrBuffer.buffer); + } + if (buffer) { + this.preloadedFiles.push({ + path: destPath, + buffer: pathOrBuffer, + }); + return Promise.resolve(); + } + return Promise.reject(new Error('Invalid object for preloading')); + }; +}; + +/** + * An object used to configure the Engine instance based on godot export options, and to override those in custom HTML + * templates if needed. + * + * @header Engine configuration + * @summary The Engine configuration object. This is just a typedef, create it like a regular object, e.g.: + * + * ``const MyConfig = { executable: 'godot', unloadAfterInit: false }`` + * + * @typedef {Object} EngineConfig + */ +const EngineConfig = {}; // eslint-disable-line no-unused-vars + +/** + * @struct + * @constructor + * @ignore + */ +const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-vars + const cfg = /** @lends {InternalConfig.prototype} */ { + /** + * Whether to unload the engine automatically after the instance is initialized. + * + * @memberof EngineConfig + * @default + * @type {boolean} + */ + unloadAfterInit: true, + /** + * The HTML DOM Canvas object to use. + * + * By default, the first canvas element in the document will be used is none is specified. + * + * @memberof EngineConfig + * @default + * @type {?HTMLCanvasElement} + */ + canvas: null, + /** + * The name of the WASM file without the extension. (Set by Godot Editor export process). + * + * @memberof EngineConfig + * @default + * @type {string} + */ + executable: '', + /** + * An alternative name for the game pck to load. The executable name is used otherwise. + * + * @memberof EngineConfig + * @default + * @type {?string} + */ + mainPack: null, + /** + * Specify a language code to select the proper localization for the game. + * + * The browser locale will be used if none is specified. See complete list of + * :ref:`supported locales `. + * + * @memberof EngineConfig + * @type {?string} + * @default + */ + locale: null, + /** + * The canvas resize policy determines how the canvas should be resized by Godot. + * + * ``0`` means Godot won't do any resizing. This is useful if you want to control the canvas size from + * javascript code in your template. + * + * ``1`` means Godot will resize the canvas on start, and when changing window size via engine functions. + * + * ``2`` means Godot will adapt the canvas size to match the whole browser window. + * + * @memberof EngineConfig + * @type {number} + * @default + */ + canvasResizePolicy: 2, + /** + * The arguments to be passed as command line arguments on startup. + * + * See :ref:`command line tutorial `. + * + * **Note**: :js:meth:`startGame ` will always add the ``--main-pack`` argument. + * + * @memberof EngineConfig + * @type {Array} + * @default + */ + args: [], + /** + * When enabled, the game canvas will automatically grab the focus when the engine starts. + * + * @memberof EngineConfig + * @type {boolean} + * @default + */ + focusCanvas: true, + /** + * When enabled, this will turn on experimental virtual keyboard support on mobile. + * + * @memberof EngineConfig + * @type {boolean} + * @default + */ + experimentalVK: false, + /** + * The progressive web app service worker to install. + * @memberof EngineConfig + * @default + * @type {string} + */ + serviceWorker: '', + /** + * @ignore + * @type {Array.} + */ + persistentPaths: ['/userfs'], + /** + * @ignore + * @type {boolean} + */ + persistentDrops: false, + /** + * @ignore + * @type {Array.} + */ + gdextensionLibs: [], + /** + * @ignore + * @type {Array.} + */ + fileSizes: [], + /** + * @ignore + * @type {number} + */ + emscriptenPoolSize: 8, + /** + * @ignore + * @type {number} + */ + godotPoolSize: 4, + /** + * A callback function for handling Godot's ``OS.execute`` calls. + * + * This is for example used in the Web Editor template to switch between project manager and editor, and for running the game. + * + * @callback EngineConfig.onExecute + * @param {string} path The path that Godot's wants executed. + * @param {Array.} args The arguments of the "command" to execute. + */ + /** + * @ignore + * @type {?function(string, Array.)} + */ + onExecute: null, + /** + * A callback function for being notified when the Godot instance quits. + * + * **Note**: This function will not be called if the engine crashes or become unresponsive. + * + * @callback EngineConfig.onExit + * @param {number} status_code The status code returned by Godot on exit. + */ + /** + * @ignore + * @type {?function(number)} + */ + onExit: null, + /** + * A callback function for displaying download progress. + * + * The function is called once per frame while downloading files, so the usage of ``requestAnimationFrame()`` + * is not necessary. + * + * If the callback function receives a total amount of bytes as 0, this means that it is impossible to calculate. + * Possible reasons include: + * + * - Files are delivered with server-side chunked compression + * - Files are delivered with server-side compression on Chromium + * - Not all file downloads have started yet (usually on servers without multi-threading) + * + * @callback EngineConfig.onProgress + * @param {number} current The current amount of downloaded bytes so far. + * @param {number} total The total amount of bytes to be downloaded. + */ + /** + * @ignore + * @type {?function(number, number)} + */ + onProgress: null, + /** + * A callback function for handling the standard output stream. This method should usually only be used in debug pages. + * + * By default, ``console.log()`` is used. + * + * @callback EngineConfig.onPrint + * @param {...*} [var_args] A variadic number of arguments to be printed. + */ + /** + * @ignore + * @type {?function(...*)} + */ + onPrint: function () { + console.log.apply(console, Array.from(arguments)); // eslint-disable-line no-console + }, + /** + * A callback function for handling the standard error stream. This method should usually only be used in debug pages. + * + * By default, ``console.error()`` is used. + * + * @callback EngineConfig.onPrintError + * @param {...*} [var_args] A variadic number of arguments to be printed as errors. + */ + /** + * @ignore + * @type {?function(...*)} + */ + onPrintError: function (var_args) { + console.error.apply(console, Array.from(arguments)); // eslint-disable-line no-console + }, + }; + + /** + * @ignore + * @struct + * @constructor + * @param {EngineConfig} opts + */ + function Config(opts) { + this.update(opts); + } + + Config.prototype = cfg; + + /** + * @ignore + * @param {EngineConfig} opts + */ + Config.prototype.update = function (opts) { + const config = opts || {}; + // NOTE: We must explicitly pass the default, accessing it via + // the key will fail due to closure compiler renames. + function parse(key, def) { + if (typeof (config[key]) === 'undefined') { + return def; + } + return config[key]; + } + // Module config + this.unloadAfterInit = parse('unloadAfterInit', this.unloadAfterInit); + this.onPrintError = parse('onPrintError', this.onPrintError); + this.onPrint = parse('onPrint', this.onPrint); + this.onProgress = parse('onProgress', this.onProgress); + + // Godot config + this.canvas = parse('canvas', this.canvas); + this.executable = parse('executable', this.executable); + this.mainPack = parse('mainPack', this.mainPack); + this.locale = parse('locale', this.locale); + this.canvasResizePolicy = parse('canvasResizePolicy', this.canvasResizePolicy); + this.persistentPaths = parse('persistentPaths', this.persistentPaths); + this.persistentDrops = parse('persistentDrops', this.persistentDrops); + this.experimentalVK = parse('experimentalVK', this.experimentalVK); + this.focusCanvas = parse('focusCanvas', this.focusCanvas); + this.serviceWorker = parse('serviceWorker', this.serviceWorker); + this.gdextensionLibs = parse('gdextensionLibs', this.gdextensionLibs); + this.fileSizes = parse('fileSizes', this.fileSizes); + this.emscriptenPoolSize = parse('emscriptenPoolSize', this.emscriptenPoolSize); + this.godotPoolSize = parse('godotPoolSize', this.godotPoolSize); + this.args = parse('args', this.args); + this.onExecute = parse('onExecute', this.onExecute); + this.onExit = parse('onExit', this.onExit); + }; + + /** + * @ignore + * @param {string} loadPath + * @param {Response} response + */ + Config.prototype.getModuleConfig = function (loadPath, response) { + let r = response; + const gdext = this.gdextensionLibs; + return { + 'print': this.onPrint, + 'printErr': this.onPrintError, + 'thisProgram': this.executable, + 'noExitRuntime': false, + 'dynamicLibraries': [`${loadPath}.side.wasm`].concat(this.gdextensionLibs), + 'emscriptenPoolSize': this.emscriptenPoolSize, + 'instantiateWasm': function (imports, onSuccess) { + function done(result) { + onSuccess(result['instance'], result['module']); + } + if (typeof (WebAssembly.instantiateStreaming) !== 'undefined') { + WebAssembly.instantiateStreaming(Promise.resolve(r), imports).then(done); + } else { + r.arrayBuffer().then(function (buffer) { + WebAssembly.instantiate(buffer, imports).then(done); + }); + } + r = null; + return {}; + }, + 'locateFile': function (path) { + if (!path.startsWith('godot.')) { + return path; + } else if (path.endsWith('.audio.worklet.js')) { + return `${loadPath}.audio.worklet.js`; + } else if (path.endsWith('.audio.position.worklet.js')) { + return `${loadPath}.audio.position.worklet.js`; + } else if (path.endsWith('.js')) { + return `${loadPath}.js`; + } else if (path in gdext) { + return path; + } else if (path.endsWith('.side.wasm')) { + return `${loadPath}.side.wasm`; + } else if (path.endsWith('.wasm')) { + return `${loadPath}.wasm`; + } + return path; + }, + }; + }; + + /** + * @ignore + * @param {function()} cleanup + */ + Config.prototype.getGodotConfig = function (cleanup) { + // Try to find a canvas + if (!(this.canvas instanceof HTMLCanvasElement)) { + const nodes = document.getElementsByTagName('canvas'); + if (nodes.length && nodes[0] instanceof HTMLCanvasElement) { + const first = nodes[0]; + this.canvas = /** @type {!HTMLCanvasElement} */ (first); + } + if (!this.canvas) { + throw new Error('No canvas found in page'); + } + } + // Canvas can grab focus on click, or key events won't work. + if (this.canvas.tabIndex < 0) { + this.canvas.tabIndex = 0; + } + + // Browser locale, or custom one if defined. + let locale = this.locale; + if (!locale) { + locale = navigator.languages ? navigator.languages[0] : navigator.language; + locale = locale.split('.')[0]; + } + locale = locale.replace('-', '_'); + const onExit = this.onExit; + + // Godot configuration. + return { + 'canvas': this.canvas, + 'canvasResizePolicy': this.canvasResizePolicy, + 'locale': locale, + 'persistentDrops': this.persistentDrops, + 'virtualKeyboard': this.experimentalVK, + 'godotPoolSize': this.godotPoolSize, + 'focusCanvas': this.focusCanvas, + 'onExecute': this.onExecute, + 'onExit': function (p_code) { + cleanup(); // We always need to call the cleanup callback to free memory. + if (typeof (onExit) === 'function') { + onExit(p_code); + } + }, + }; + }; + return new Config(initConfig); +}; + +/** + * Projects exported for the Web expose the :js:class:`Engine` class to the JavaScript environment, that allows + * fine control over the engine's start-up process. + * + * This API is built in an asynchronous manner and requires basic understanding + * of `Promises `__. + * + * @module Engine + * @header Web export JavaScript reference + */ +const Engine = (function () { + const preloader = new Preloader(); + + let loadPromise = null; + let loadPath = ''; + let initPromise = null; + + /** + * @classdesc The ``Engine`` class provides methods for loading and starting exported projects on the Web. For default export + * settings, this is already part of the exported HTML page. To understand practical use of the ``Engine`` class, + * see :ref:`Custom HTML page for Web export `. + * + * @description Create a new Engine instance with the given configuration. + * + * @global + * @constructor + * @param {EngineConfig} initConfig The initial config for this instance. + */ + function Engine(initConfig) { // eslint-disable-line no-shadow + this.config = new InternalConfig(initConfig); + this.rtenv = null; + } + + /** + * Load the engine from the specified base path. + * + * @param {string} basePath Base path of the engine to load. + * @param {number=} [size=0] The file size if known. + * @returns {Promise} A Promise that resolves once the engine is loaded. + * + * @function Engine.load + */ + Engine.load = function (basePath, size) { + if (loadPromise == null) { + loadPath = basePath; + loadPromise = preloader.loadPromise(`${loadPath}.wasm`, size, true); + requestAnimationFrame(preloader.animateProgress); + } + return loadPromise; + }; + + /** + * Unload the engine to free memory. + * + * This method will be called automatically depending on the configuration. See :js:attr:`unloadAfterInit`. + * + * @function Engine.unload + */ + Engine.unload = function () { + loadPromise = null; + }; + + /** + * Safe Engine constructor, creates a new prototype for every new instance to avoid prototype pollution. + * @ignore + * @constructor + */ + function SafeEngine(initConfig) { + const proto = /** @lends Engine.prototype */ { + /** + * Initialize the engine instance. Optionally, pass the base path to the engine to load it, + * if it hasn't been loaded yet. See :js:meth:`Engine.load`. + * + * @param {string=} basePath Base path of the engine to load. + * @return {Promise} A ``Promise`` that resolves once the engine is loaded and initialized. + */ + init: function (basePath) { + if (initPromise) { + return initPromise; + } + if (loadPromise == null) { + if (!basePath) { + initPromise = Promise.reject(new Error('A base path must be provided when calling `init` and the engine is not loaded.')); + return initPromise; + } + Engine.load(basePath, this.config.fileSizes[`${basePath}.wasm`]); + } + const me = this; + function doInit(promise) { + // Care! Promise chaining is bogus with old emscripten versions. + // This caused a regression with the Mono build (which uses an older emscripten version). + // Make sure to test that when refactoring. + return new Promise(function (resolve, reject) { + promise.then(function (response) { + const cloned = new Response(response.clone().body, { 'headers': [['content-type', 'application/wasm']] }); + Godot(me.config.getModuleConfig(loadPath, cloned)).then(function (module) { + const paths = me.config.persistentPaths; + module['initFS'](paths).then(function (err) { + me.rtenv = module; + if (me.config.unloadAfterInit) { + Engine.unload(); + } + resolve(); + }); + }); + }); + }); + } + preloader.setProgressFunc(this.config.onProgress); + initPromise = doInit(loadPromise); + return initPromise; + }, + + /** + * Load a file so it is available in the instance's file system once it runs. Must be called **before** starting the + * instance. + * + * If not provided, the ``path`` is derived from the URL of the loaded file. + * + * @param {string|ArrayBuffer} file The file to preload. + * + * If a ``string`` the file will be loaded from that path. + * + * If an ``ArrayBuffer`` or a view on one, the buffer will used as the content of the file. + * + * @param {string=} path Path by which the file will be accessible. Required, if ``file`` is not a string. + * + * @returns {Promise} A Promise that resolves once the file is loaded. + */ + preloadFile: function (file, path) { + return preloader.preload(file, path, this.config.fileSizes[file]); + }, + + /** + * Start the engine instance using the given override configuration (if any). + * :js:meth:`startGame ` can be used in typical cases instead. + * + * This will initialize the instance if it is not initialized. For manual initialization, see :js:meth:`init `. + * The engine must be loaded beforehand. + * + * Fails if a canvas cannot be found on the page, or not specified in the configuration. + * + * @param {EngineConfig} override An optional configuration override. + * @return {Promise} Promise that resolves once the engine started. + */ + start: function (override) { + this.config.update(override); + const me = this; + return me.init().then(function () { + if (!me.rtenv) { + return Promise.reject(new Error('The engine must be initialized before it can be started')); + } + + let config = {}; + try { + config = me.config.getGodotConfig(function () { + me.rtenv = null; + }); + } catch (e) { + return Promise.reject(e); + } + // Godot configuration. + me.rtenv['initConfig'](config); + + // Preload GDExtension libraries. + if (me.config.gdextensionLibs.length > 0 && !me.rtenv['loadDynamicLibrary']) { + return Promise.reject(new Error('GDExtension libraries are not supported by this engine version. ' + + 'Enable "Extensions Support" for your export preset and/or build your custom template with "dlink_enabled=yes".')); + } + return new Promise(function (resolve, reject) { + for (const file of preloader.preloadedFiles) { + me.rtenv['copyToFS'](file.path, file.buffer); + } + preloader.preloadedFiles.length = 0; // Clear memory + me.rtenv['callMain'](me.config.args); + initPromise = null; + me.installServiceWorker(); + resolve(); + }); + }); + }, + + /** + * Start the game instance using the given configuration override (if any). + * + * This will initialize the instance if it is not initialized. For manual initialization, see :js:meth:`init `. + * + * This will load the engine if it is not loaded, and preload the main pck. + * + * This method expects the initial config (or the override) to have both the :js:attr:`executable` and :js:attr:`mainPack` + * properties set (normally done by the editor during export). + * + * @param {EngineConfig} override An optional configuration override. + * @return {Promise} Promise that resolves once the game started. + */ + startGame: function (override) { + this.config.update(override); + // Add main-pack argument. + const exe = this.config.executable; + const pack = this.config.mainPack || `${exe}.pck`; + this.config.args = ['--main-pack', pack].concat(this.config.args); + // Start and init with execName as loadPath if not inited. + const me = this; + return Promise.all([ + this.init(exe), + this.preloadFile(pack, pack), + ]).then(function () { + return me.start.apply(me); + }); + }, + + /** + * Create a file at the specified ``path`` with the passed as ``buffer`` in the instance's file system. + * + * @param {string} path The location where the file will be created. + * @param {ArrayBuffer} buffer The content of the file. + */ + copyToFS: function (path, buffer) { + if (this.rtenv == null) { + throw new Error('Engine must be inited before copying files'); + } + this.rtenv['copyToFS'](path, buffer); + }, + + /** + * Request that the current instance quit. + * + * This is akin the user pressing the close button in the window manager, and will + * have no effect if the engine has crashed, or is stuck in a loop. + * + */ + requestQuit: function () { + if (this.rtenv) { + this.rtenv['request_quit'](); + } + }, + + /** + * Install the progressive-web app service worker. + * @returns {Promise} The service worker registration promise. + */ + installServiceWorker: function () { + if (this.config.serviceWorker && 'serviceWorker' in navigator) { + try { + return navigator.serviceWorker.register(this.config.serviceWorker); + } catch (e) { + return Promise.reject(e); + } + } + return Promise.resolve(); + }, + }; + + Engine.prototype = proto; + // Closure compiler exported instance methods. + Engine.prototype['init'] = Engine.prototype.init; + Engine.prototype['preloadFile'] = Engine.prototype.preloadFile; + Engine.prototype['start'] = Engine.prototype.start; + Engine.prototype['startGame'] = Engine.prototype.startGame; + Engine.prototype['copyToFS'] = Engine.prototype.copyToFS; + Engine.prototype['requestQuit'] = Engine.prototype.requestQuit; + Engine.prototype['installServiceWorker'] = Engine.prototype.installServiceWorker; + // Also expose static methods as instance methods + Engine.prototype['load'] = Engine.load; + Engine.prototype['unload'] = Engine.unload; + return new Engine(initConfig); + } + + // Closure compiler exported static methods. + SafeEngine['load'] = Engine.load; + SafeEngine['unload'] = Engine.unload; + + // Feature-detection utilities. + SafeEngine['isWebGLAvailable'] = Features.isWebGLAvailable; + SafeEngine['isFetchAvailable'] = Features.isFetchAvailable; + SafeEngine['isSecureContext'] = Features.isSecureContext; + SafeEngine['isCrossOriginIsolated'] = Features.isCrossOriginIsolated; + SafeEngine['isSharedArrayBufferAvailable'] = Features.isSharedArrayBufferAvailable; + SafeEngine['isAudioWorkletAvailable'] = Features.isAudioWorkletAvailable; + SafeEngine['getMissingFeatures'] = Features.getMissingFeatures; + + return SafeEngine; +}()); +if (typeof window !== 'undefined') { + window['Engine'] = Engine; +} diff --git a/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.pck b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.pck new file mode 100644 index 0000000..62df656 Binary files /dev/null and b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.pck differ diff --git a/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.png b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.png new file mode 100644 index 0000000..766b0b6 Binary files /dev/null and b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.png differ diff --git a/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.sh b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.sh new file mode 100644 index 0000000..91162b3 --- /dev/null +++ b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.sh @@ -0,0 +1,4 @@ +#!/bin/sh +printf '\033c\033]0;%s\a' Rund um die Welten +base_path="$(dirname "$(realpath "$0")")" +"$base_path/rund-um-die-welten.x86_64" "$@" diff --git a/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.wasm b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.wasm new file mode 100644 index 0000000..cb4ece2 Binary files /dev/null and b/rund-um-die-welten/rund-um-die-welten/rund-um-die-welten.wasm differ diff --git a/rund-um-die-welten/sfx/.DS_Store b/rund-um-die-welten/sfx/.DS_Store new file mode 100644 index 0000000..da9fb83 Binary files /dev/null and b/rund-um-die-welten/sfx/.DS_Store differ diff --git a/rund-um-die-welten/sfx/Soundtrack.mp3 b/rund-um-die-welten/sfx/Soundtrack.mp3 new file mode 100644 index 0000000..39f3aae Binary files /dev/null and b/rund-um-die-welten/sfx/Soundtrack.mp3 differ diff --git a/rund-um-die-welten/sfx/arrive_in_level.wav b/rund-um-die-welten/sfx/arrive_in_level.wav new file mode 100644 index 0000000..a9eded0 Binary files /dev/null and b/rund-um-die-welten/sfx/arrive_in_level.wav differ diff --git a/rund-um-die-welten/sfx/arrive_in_level_2.wav b/rund-um-die-welten/sfx/arrive_in_level_2.wav new file mode 100644 index 0000000..3d4592d Binary files /dev/null and b/rund-um-die-welten/sfx/arrive_in_level_2.wav differ diff --git a/rund-um-die-welten/sfx/audioplayer.gd b/rund-um-die-welten/sfx/audioplayer.gd new file mode 100644 index 0000000..71712b4 --- /dev/null +++ b/rund-um-die-welten/sfx/audioplayer.gd @@ -0,0 +1,61 @@ +extends Node + +# For sound effects +var active_players: Array = [] + +# For music +var music_player: AudioStreamPlayer = null + + +func play_sound(stream: AudioStream): + var player = AudioStreamPlayer.new() + player.stream = stream + player.process_mode = Node.PROCESS_MODE_ALWAYS # Plays even if paused + add_child(player) + player.play() + + active_players.append(player) + + player.finished.connect(func(): + active_players.erase(player) + player.queue_free() + ) + + +func stop_all(): + for player in active_players: + if player.playing: + player.stop() + player.queue_free() + active_players.clear() + + +func play_music(path: String): + var stream = load(path) as AudioStream + if not stream: + push_error("Invalid music path: " + path) + return + + # Stop existing music + if music_player and music_player.playing: + music_player.stop() + music_player.queue_free() + music_player = null + + # Create new music player + music_player = AudioStreamPlayer.new() + music_player.stream = stream + music_player.bus = "Music" # Optional: use a dedicated bus + music_player.process_mode = Node.PROCESS_MODE_ALWAYS + music_player.volume_db = 0 # Adjust volume if needed + add_child(music_player) + music_player.stream.set_loop(true); +# music_player.stream.loop_offset = 0.05 + music_player.play() + + +func stop_music(): + if music_player: + music_player.stop() + music_player.queue_free() + music_player = null diff --git a/rund-um-die-welten/sfx/audioplayer.gd.uid b/rund-um-die-welten/sfx/audioplayer.gd.uid new file mode 100644 index 0000000..91020a7 --- /dev/null +++ b/rund-um-die-welten/sfx/audioplayer.gd.uid @@ -0,0 +1 @@ +uid://j01ghw1gfrv7 diff --git a/rund-um-die-welten/sfx/button_clicks.wav b/rund-um-die-welten/sfx/button_clicks.wav new file mode 100644 index 0000000..c96efde Binary files /dev/null and b/rund-um-die-welten/sfx/button_clicks.wav differ diff --git a/rund-um-die-welten/sfx/center_charge.wav b/rund-um-die-welten/sfx/center_charge.wav new file mode 100644 index 0000000..4a8cf07 Binary files /dev/null and b/rund-um-die-welten/sfx/center_charge.wav differ diff --git a/rund-um-die-welten/sfx/center_select.wav b/rund-um-die-welten/sfx/center_select.wav new file mode 100644 index 0000000..409d28d Binary files /dev/null and b/rund-um-die-welten/sfx/center_select.wav differ diff --git a/rund-um-die-welten/sfx/collectable.wav b/rund-um-die-welten/sfx/collectable.wav new file mode 100644 index 0000000..88db88e Binary files /dev/null and b/rund-um-die-welten/sfx/collectable.wav differ diff --git a/rund-um-die-welten/sfx/death.wav b/rund-um-die-welten/sfx/death.wav new file mode 100644 index 0000000..f1181d0 Binary files /dev/null and b/rund-um-die-welten/sfx/death.wav differ diff --git a/rund-um-die-welten/sfx/death2.wav b/rund-um-die-welten/sfx/death2.wav new file mode 100644 index 0000000..eba9e77 Binary files /dev/null and b/rund-um-die-welten/sfx/death2.wav differ diff --git a/rund-um-die-welten/sfx/death3.wav b/rund-um-die-welten/sfx/death3.wav new file mode 100644 index 0000000..3668695 Binary files /dev/null and b/rund-um-die-welten/sfx/death3.wav differ diff --git a/rund-um-die-welten/sfx/menu-theme.mp3 b/rund-um-die-welten/sfx/menu-theme.mp3 new file mode 100644 index 0000000..bc5e469 Binary files /dev/null and b/rund-um-die-welten/sfx/menu-theme.mp3 differ diff --git a/rund-um-die-welten/sfx/rocket_sound.wav b/rund-um-die-welten/sfx/rocket_sound.wav new file mode 100644 index 0000000..8b1bbea Binary files /dev/null and b/rund-um-die-welten/sfx/rocket_sound.wav differ diff --git a/rund-um-die-welten/sfx/select_level.wav b/rund-um-die-welten/sfx/select_level.wav new file mode 100644 index 0000000..88db88e Binary files /dev/null and b/rund-um-die-welten/sfx/select_level.wav differ diff --git a/rund-um-die-welten/sfx/win.wav b/rund-um-die-welten/sfx/win.wav new file mode 100644 index 0000000..3820d8e Binary files /dev/null and b/rund-um-die-welten/sfx/win.wav differ