diff --git a/backgounds/disclaimer.gd b/backgounds/disclaimer.gd new file mode 100644 index 0000000..9db6fb1 --- /dev/null +++ b/backgounds/disclaimer.gd @@ -0,0 +1,32 @@ +extends Node2D + +var rmusic := AudioStreamPlayer.new() +var wait +# Called when the node enters the scene tree for the first time. +func _ready(): + Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) + add_child(rmusic) + var titlemusic = load("res://music/Jellies.wav") + rmusic.stream = titlemusic + rmusic.play(0) + wait = Time.get_ticks_msec() + #pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + pass + +func _input(event): + # Mouse in viewport coordinates. + if (Time.get_ticks_msec() - wait) >= 1000 && (event is InputEventMouseButton || Input.is_joy_button_pressed(0,JOY_BUTTON_B) || Input.is_key_pressed(KEY_X) || Input.is_key_pressed(KEY_ENTER)): + #print("Mouse Click/Unclick at: ", event.position) + _title() + +func _title(): + # This is like autoloading the scene, only + # it happens after already loading the main scene. + get_tree().change_scene_to_file("res://levels/credits.tscn") + #get_tree().root.add_child(title) + #get_tree().root.remove_child(boot) + #boot.queue_free() diff --git a/backgounds/disclaimer.tscn b/backgounds/disclaimer.tscn new file mode 100644 index 0000000..64d8443 --- /dev/null +++ b/backgounds/disclaimer.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=4 format=3 uid="uid://bbvpwonm30j2j"] + +[ext_resource type="Script" path="res://backgounds/disclaimer.gd" id="1_wnnd2"] +[ext_resource type="Texture2D" uid="uid://becayb0ro0bd4" path="res://backgounds/midoriasgardius.jpg" id="2_gghyy"] +[ext_resource type="PackedScene" uid="uid://wovn8m050haq" path="res://levels/bottomhud.tscn" id="3_sdx6y"] + +[node name="Disclaimer" type="Node2D"] +script = ExtResource("1_wnnd2") + +[node name="TextureRect" type="TextureRect" parent="."] +offset_right = 40.0 +offset_bottom = 40.0 +texture = ExtResource("2_gghyy") + +[node name="Label" type="Label" parent="."] +modulate = Color(0, 0, 0, 1) +self_modulate = Color(0, 0, 0, 1) +offset_left = 503.0 +offset_top = 172.0 +offset_right = 997.0 +offset_bottom = 221.0 +scale = Vector2(1.20077, 1.41766) +text = "Playing with fireworks inside a videogame can give hours of fun, +but in real life is dangerous" + +[node name="Label2" type="Label" parent="."] +modulate = Color(0, 0, 0, 1) +self_modulate = Color(0, 0, 0, 1) +offset_left = 346.0 +offset_top = 361.0 +offset_right = 602.0 +offset_bottom = 387.0 +scale = Vector2(2.92998, 7.01768) +text = "Press Enter or B to start playing" + +[node name="Bottomhud" parent="." instance=ExtResource("3_sdx6y")] diff --git a/backgounds/midoriasgardius.jpg b/backgounds/midoriasgardius.jpg new file mode 100644 index 0000000..577ff29 Binary files /dev/null and b/backgounds/midoriasgardius.jpg differ diff --git a/backgounds/midoriasgardius.jpg.import b/backgounds/midoriasgardius.jpg.import new file mode 100644 index 0000000..54b0d6c --- /dev/null +++ b/backgounds/midoriasgardius.jpg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://becayb0ro0bd4" +path="res://.godot/imported/midoriasgardius.jpg-ac70f89f9a49b315f9c5228571a31d2e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://backgounds/midoriasgardius.jpg" +dest_files=["res://.godot/imported/midoriasgardius.jpg-ac70f89f9a49b315f9c5228571a31d2e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/backgounds/result.gd b/backgounds/result.gd index e38fa16..60943fa 100644 --- a/backgounds/result.gd +++ b/backgounds/result.gd @@ -19,14 +19,14 @@ func _process(delta): func _input(event): # Mouse in viewport coordinates. - if (Time.get_ticks_msec() - wait) >= 1000 && (event is InputEventMouseButton || Input.is_joy_button_pressed(0,JOY_BUTTON_A) || Input.is_key_pressed(KEY_ENTER)): + if (Time.get_ticks_msec() - wait) >= 1000 && (event is InputEventMouseButton || Input.is_joy_button_pressed(0,JOY_BUTTON_B) || Input.is_key_pressed(KEY_X) || Input.is_key_pressed(KEY_ENTER)): #print("Mouse Click/Unclick at: ", event.position) _title() func _title(): # This is like autoloading the scene, only # it happens after already loading the main scene. - get_tree().change_scene_to_file("res://title.tscn") + get_tree().change_scene_to_file("res://backgounds/wip.tscn") #get_tree().root.add_child(title) #get_tree().root.remove_child(boot) #boot.queue_free() diff --git a/backgounds/result.tscn b/backgounds/result.tscn index d9569ef..07f16ca 100644 --- a/backgounds/result.tscn +++ b/backgounds/result.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=4 format=3 uid="uid://dq8vnuy2g3ewv"] -[ext_resource type="Texture2D" uid="uid://b1p80uik4t12b" path="res://backgounds/kimberlyarch.jpg" id="1_6w0sp"] [ext_resource type="Script" path="res://backgounds/result.gd" id="1_ejbiw"] -[ext_resource type="Script" path="res://fps.gd" id="2_r4na5"] +[ext_resource type="Texture2D" uid="uid://becayb0ro0bd4" path="res://backgounds/midoriasgardius.jpg" id="2_gghyy"] +[ext_resource type="PackedScene" uid="uid://wovn8m050haq" path="res://levels/bottomhud.tscn" id="3_sdx6y"] [node name="Result" type="Node2D"] script = ExtResource("1_ejbiw") @@ -10,28 +10,30 @@ script = ExtResource("1_ejbiw") [node name="TextureRect" type="TextureRect" parent="."] offset_right = 40.0 offset_bottom = 40.0 -texture = ExtResource("1_6w0sp") - -[node name="fps" type="Label" parent="."] -offset_right = 40.0 -offset_bottom = 23.0 -script = ExtResource("2_r4na5") +texture = ExtResource("2_gghyy") [node name="Label" type="Label" parent="."] modulate = Color(0, 0, 0, 1) self_modulate = Color(0, 0, 0, 1) -offset_left = 484.0 -offset_top = 260.0 -offset_right = 851.0 -offset_bottom = 283.0 -text = "This is a placeholder for Dungeon Result Screen" +offset_left = 559.0 +offset_top = 68.0 +offset_right = 785.0 +offset_bottom = 195.0 +scale = Vector2(1.71496, 1.67053) +text = "Defeated enemies: 0 +Clear time: 0 +Charged skill uses: 0 +Damage received: 0 +Earned experience: 0" [node name="Label2" type="Label" parent="."] modulate = Color(0, 0, 0, 1) self_modulate = Color(0, 0, 0, 1) offset_left = 346.0 offset_top = 361.0 -offset_right = 602.0 +offset_right = 565.0 offset_bottom = 387.0 scale = Vector2(2.92998, 7.01768) -text = "Press Enter or A to return to title" +text = "Press Enter or B to continue" + +[node name="Bottomhud" parent="." instance=ExtResource("3_sdx6y")] diff --git a/backgounds/wip.gd b/backgounds/wip.gd new file mode 100644 index 0000000..fe45c11 --- /dev/null +++ b/backgounds/wip.gd @@ -0,0 +1,32 @@ +extends Node2D + +var rmusic := AudioStreamPlayer.new() +var wait +# Called when the node enters the scene tree for the first time. +func _ready(): + Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) + add_child(rmusic) + var titlemusic = load("res://music/Jellies.wav") + rmusic.stream = titlemusic + rmusic.play(0) + wait = Time.get_ticks_msec() + #pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + pass + +func _input(event): + # Mouse in viewport coordinates. + if (Time.get_ticks_msec() - wait) >= 1000 && (event is InputEventMouseButton || Input.is_joy_button_pressed(0,JOY_BUTTON_B) || Input.is_key_pressed(KEY_X) || Input.is_key_pressed(KEY_ENTER)): + #print("Mouse Click/Unclick at: ", event.position) + _title() + +func _title(): + # This is like autoloading the scene, only + # it happens after already loading the main scene. + get_tree().change_scene_to_file("res://title.tscn") + #get_tree().root.add_child(title) + #get_tree().root.remove_child(boot) + #boot.queue_free() diff --git a/backgounds/wip.tscn b/backgounds/wip.tscn new file mode 100644 index 0000000..de141db --- /dev/null +++ b/backgounds/wip.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=4 format=3 uid="uid://ctp1qc3xlecob"] + +[ext_resource type="Script" path="res://backgounds/wip.gd" id="1_1qonj"] +[ext_resource type="Texture2D" uid="uid://becayb0ro0bd4" path="res://backgounds/midoriasgardius.jpg" id="2_gghyy"] +[ext_resource type="PackedScene" uid="uid://wovn8m050haq" path="res://levels/bottomhud.tscn" id="3_sdx6y"] + +[node name="WIP" type="Node2D"] +script = ExtResource("1_1qonj") + +[node name="TextureRect" type="TextureRect" parent="."] +offset_right = 40.0 +offset_bottom = 40.0 +texture = ExtResource("2_gghyy") + +[node name="Label" type="Label" parent="."] +modulate = Color(0, 0, 0, 1) +self_modulate = Color(0, 0, 0, 1) +offset_left = 503.0 +offset_top = 172.0 +offset_right = 997.0 +offset_bottom = 221.0 +scale = Vector2(1.20077, 1.41766) +text = "This game is under developmnt +More content will be added in following releases" + +[node name="Label2" type="Label" parent="."] +modulate = Color(0, 0, 0, 1) +self_modulate = Color(0, 0, 0, 1) +offset_left = 346.0 +offset_top = 361.0 +offset_right = 602.0 +offset_bottom = 387.0 +scale = Vector2(2.92998, 7.01768) +text = "Press Enter or B to return to title" + +[node name="Bottomhud" parent="." instance=ExtResource("3_sdx6y")] diff --git a/bootclick.gd b/bootclick.gd index 00e2669..6191954 100644 --- a/bootclick.gd +++ b/bootclick.gd @@ -24,7 +24,7 @@ func _process(delta): func _input(event): # Mouse in viewport coordinates. - if !Global.sk && (event is InputEventMouseButton || Input.is_key_pressed(KEY_ENTER) || Input.is_joy_button_pressed(0,JOY_BUTTON_X) || Input.is_joy_button_pressed(0,JOY_BUTTON_Y) || Input.is_joy_button_pressed(0,JOY_BUTTON_A) || Input.is_joy_button_pressed(0,JOY_BUTTON_B) || Input.is_joy_button_pressed(0,JOY_BUTTON_BACK) || Input.is_joy_button_pressed(0,JOY_BUTTON_START) || Input.is_joy_button_pressed(0,JOY_BUTTON_RIGHT_SHOULDER) || Input.is_joy_button_pressed(0,JOY_BUTTON_LEFT_SHOULDER)): + if !Global.sk && (event is InputEventMouseButton || Input.is_key_pressed(KEY_ENTER) || Input.is_key_pressed(KEY_X) || Input.is_joy_button_pressed(0,JOY_BUTTON_X) || Input.is_joy_button_pressed(0,JOY_BUTTON_Y) || Input.is_joy_button_pressed(0,JOY_BUTTON_A) || Input.is_joy_button_pressed(0,JOY_BUTTON_B) || Input.is_joy_button_pressed(0,JOY_BUTTON_BACK) || Input.is_joy_button_pressed(0,JOY_BUTTON_START) || Input.is_joy_button_pressed(0,JOY_BUTTON_RIGHT_SHOULDER) || Input.is_joy_button_pressed(0,JOY_BUTTON_LEFT_SHOULDER)): #print("Mouse Click/Unclick at: ", event.position) _title() diff --git a/bootclick.tscn b/bootclick.tscn index 734984e..b4a9475 100644 --- a/bootclick.tscn +++ b/bootclick.tscn @@ -1,8 +1,8 @@ -[gd_scene load_steps=4 format=3 uid="uid://u3n465dkpmeg"] +[gd_scene load_steps=4 format=3 uid="uid://cku7wlo5egfnw"] [ext_resource type="Script" path="res://bootclick.gd" id="1_52bti"] -[ext_resource type="Script" path="res://fps.gd" id="2_gnh1w"] [ext_resource type="PackedScene" path="res://selftest.tscn" id="3_jtnh5"] +[ext_resource type="PackedScene" uid="uid://wovn8m050haq" path="res://levels/bottomhud.tscn" id="3_wfymi"] [node name="bootclick" type="Control"] layout_mode = 3 @@ -22,15 +22,12 @@ text = "Press enter or a gamepad button to continue" horizontal_alignment = 1 vertical_alignment = 1 -[node name="fps" type="Label" parent="."] -layout_mode = 0 -offset_right = 40.0 -offset_bottom = 23.0 -script = ExtResource("2_gnh1w") - [node name="Selftest" parent="." instance=ExtResource("3_jtnh5")] layout_mode = 0 offset_left = 57.0 offset_top = 112.0 offset_right = 97.0 offset_bottom = 135.0 + +[node name="Bottomhud" parent="." instance=ExtResource("3_wfymi")] +layout_mode = 1 diff --git a/icon.png b/icon.png index c60cde5..34635be 100644 Binary files a/icon.png and b/icon.png differ diff --git a/levels/bottomhud.tscn b/levels/bottomhud.tscn new file mode 100644 index 0000000..df9af23 --- /dev/null +++ b/levels/bottomhud.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=2 format=3 uid="uid://wovn8m050haq"] + +[ext_resource type="Script" path="res://fps.gd" id="1_15gcj"] + +[node name="Bottomhud" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="fps" type="Label" parent="."] +layout_mode = 0 +offset_left = 5.0 +offset_top = 697.0 +offset_right = 45.0 +offset_bottom = 720.0 +script = ExtResource("1_15gcj") + +[node name="Label" type="Label" parent="."] +layout_mode = 0 +offset_left = 1191.0 +offset_top = 691.0 +offset_right = 1271.0 +offset_bottom = 714.0 +text = "R0.0.0-dev" diff --git a/levels/credits.gd b/levels/credits.gd index 4fe5dd0..501bcd1 100644 --- a/levels/credits.gd +++ b/levels/credits.gd @@ -37,7 +37,7 @@ func _process(delta): bgsound.play(0) else: _complete() - elif bgsound.has_stream_playback(): + elif bgsound.get_playback_position() > 10: playstart = true #pass @@ -51,6 +51,6 @@ func _complete(): func _input(event): # Mouse in viewport coordinates. - if event is InputEventMouseButton || Input.is_joy_button_pressed(0,JOY_BUTTON_A) || Input.is_key_pressed(KEY_ENTER): + if bgsound.get_playback_position() > 1 && event is InputEventMouseButton || Input.is_joy_button_pressed(0,JOY_BUTTON_B) || Input.is_key_pressed(KEY_X) || Input.is_key_pressed(KEY_ENTER): #print("Mouse Click/Unclick at: ", event.position) _complete() diff --git a/levels/credits.tscn b/levels/credits.tscn index d6ed5ab..aa52880 100644 --- a/levels/credits.tscn +++ b/levels/credits.tscn @@ -3,8 +3,8 @@ [ext_resource type="Script" path="res://levels/credits.gd" id="1_y6orl"] [ext_resource type="VideoStream" path="res://backgounds/nebula_-_6044 (720p).ogv" id="2_0cref"] [ext_resource type="Script" path="res://nebula.gd" id="3_ffw0g"] +[ext_resource type="PackedScene" uid="uid://wovn8m050haq" path="res://levels/bottomhud.tscn" id="5_yvope"] [ext_resource type="Script" path="res://levels/roll.gd" id="6_3q8sp"] -[ext_resource type="Script" path="res://fps.gd" id="7_jok2t"] [node name="credits" type="Node2D"] script = ExtResource("1_y6orl") @@ -56,6 +56,14 @@ Title screen RELOADED Theme RELOADED +Settings and Stores +Jellies in the Sea +vince kaichan + +Testrooms +Get A Brain Morans +Fearofdark + Friendly challenge Oskars Skarmslackare MrGamer @@ -397,12 +405,23 @@ Source code hosted at https://git.asgardius.company/asgardius/midori-school You can listen my radio station at https://asteroid.asgardius.company/public/r3 -Special Thanks for Unity Technologies for make me choosing Godot +Special thanks +Unity Technologies +For make me choosing Godot Godot does what Unitydnt -I'm looking for developers, artists and japanese voice actors who want to help on this videogame -from Asgardius Virtualx series and the next Genshin Killer +CAPCOM +For making great games in the past + +ZUN +For let me know that a single person can create a great game + +Hoyoverse +For let me know that fireworks can make a fun game + +SNK +For let me know that a Heavy Machine Gun can be turned into a good stage boss Contact info @@ -424,9 +443,6 @@ You can reuse assets for non-commercial purposes only" horizontal_alignment = 1 script = ExtResource("6_3q8sp") -[node name="fps" type="Label" parent="."] -offset_right = 40.0 -offset_bottom = 23.0 -script = ExtResource("7_jok2t") +[node name="Bottomhud" parent="." instance=ExtResource("5_yvope")] [connection signal="finished" from="nebula" to="nebula" method="_on_finished"] diff --git a/music/Jellies.wav b/music/Jellies.wav new file mode 100644 index 0000000..0bb8cd2 Binary files /dev/null and b/music/Jellies.wav differ diff --git a/music/Jellies.wav.import b/music/Jellies.wav.import new file mode 100644 index 0000000..8c55978 --- /dev/null +++ b/music/Jellies.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dg5grwi51twra" +path="res://.godot/imported/Jellies.wav-825adaa527da1d30cfbd19c8334b0e65.sample" + +[deps] + +source_file="res://music/Jellies.wav" +dest_files=["res://.godot/imported/Jellies.wav-825adaa527da1d30cfbd19c8334b0e65.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/music/getabrain.wav.import b/music/getabrain.wav.import new file mode 100644 index 0000000..e36ed7c --- /dev/null +++ b/music/getabrain.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://heuh4letqmua" +path="res://.godot/imported/getabrain.wav-48a7c05bde226ca20466ac99d77553bd.sample" + +[deps] + +source_file="res://music/getabrain.wav" +dest_files=["res://.godot/imported/getabrain.wav-48a7c05bde226ca20466ac99d77553bd.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/title.gd b/title.gd index d67f4cf..6c16fc2 100644 --- a/title.gd +++ b/title.gd @@ -26,17 +26,17 @@ func _process(delta): func _input(event): # Mouse in viewport coordinates. - if (Time.get_ticks_msec() - wait) >= 1000 && (event is InputEventMouseButton || Input.is_key_pressed(KEY_ENTER) || Input.is_joy_button_pressed(0,JOY_BUTTON_A)): + if (Time.get_ticks_msec() - wait) >= 1000 && (event is InputEventMouseButton || Input.is_key_pressed(KEY_ENTER) || Input.is_key_pressed(KEY_X) || Input.is_joy_button_pressed(0,JOY_BUTTON_B)): #print("Mouse Click/Unclick at: ", event.position) _level() #print("There are not game levels at the moment") - elif (Time.get_ticks_msec() - wait) >= 1000 && (Input.is_key_pressed(KEY_ESCAPE) || Input.is_joy_button_pressed(0,JOY_BUTTON_B)): + elif (Time.get_ticks_msec() - wait) >= 1000 && (Input.is_key_pressed(KEY_ESCAPE) || Input.is_key_pressed(KEY_Z) || Input.is_joy_button_pressed(0,JOY_BUTTON_A)): get_tree().quit() func _level(): # This is like autoloading the scene, only # it happens after already loading the main scene. - get_tree().change_scene_to_file("res://levels/credits.tscn") + get_tree().change_scene_to_file("res://backgounds/disclaimer.tscn") #Global.live = 1 #Global.gamelevel = randi() % 3 #if Global.gamelevel == 0: diff --git a/title.tscn b/title.tscn index 1298c25..e2b2f74 100644 --- a/title.tscn +++ b/title.tscn @@ -4,9 +4,9 @@ [ext_resource type="Script" path="res://Game name.gd" id="2_bbb0f"] [ext_resource type="VideoStream" path="res://backgounds/nebula_-_6044 (720p).ogv" id="2_dxhuu"] [ext_resource type="Script" path="res://nebula.gd" id="3_bn1r3"] -[ext_resource type="Script" path="res://fps.gd" id="3_tsoef"] [ext_resource type="Script" path="res://start.gd" id="4_cc41w"] [ext_resource type="Script" path="res://exit.gd" id="5_scoec"] +[ext_resource type="PackedScene" uid="uid://wovn8m050haq" path="res://levels/bottomhud.tscn" id="7_yq7ke"] [node name="title" type="Control"] layout_mode = 3 @@ -26,12 +26,6 @@ stream = ExtResource("2_dxhuu") autoplay = true script = ExtResource("3_bn1r3") -[node name="fps" type="Label" parent="."] -layout_mode = 0 -offset_right = 40.0 -offset_bottom = 23.0 -script = ExtResource("3_tsoef") - [node name="Game name" type="Label" parent="."] layout_mode = 0 offset_left = 31.0 @@ -49,7 +43,7 @@ offset_top = 92.0 offset_right = 610.0 offset_bottom = 118.0 scale = Vector2(2.61468, 1.57466) -text = "Press A or Enter start" +text = "Press B or Enter start" script = ExtResource("4_cc41w") [node name="exit" type="Label" parent="."] @@ -59,16 +53,19 @@ offset_top = 602.0 offset_right = 568.0 offset_bottom = 628.0 scale = Vector2(2.61468, 1.57466) -text = "Press escape or B to exit" +text = "Press escape or A to exit" script = ExtResource("5_scoec") [node name="Label" type="Label" parent="."] layout_mode = 0 -offset_left = 36.0 -offset_top = 653.0 -offset_right = 76.0 -offset_bottom = 676.0 -text = "R0.0.0-dev 2023 Page Asgardius GNU General Public License 3 -2016-2023 Asgardius Virtualx Project" +offset_left = 398.0 +offset_top = 660.0 +offset_right = 871.0 +offset_bottom = 709.0 +text = "2023-2024 Page Asgardius GNU General Public License 3 +2016-2024 Asgardius Virtualx Project" + +[node name="Bottomhud" parent="." instance=ExtResource("7_yq7ke")] +layout_mode = 1 [connection signal="finished" from="nebula" to="nebula" method="_on_finished"]