Add retry level

This commit is contained in:
Mario Martínez 2025-03-07 14:23:11 +01:00
parent f6e08e3103
commit 360ea6b1ce
12 changed files with 299 additions and 78 deletions

View file

@ -484,6 +484,12 @@ script = ExtResource("8_pqyhf")
[node name="Victory" type="Node" parent="StateMachine/Root"]
script = ExtResource("8_pqyhf")
[node name="ToThink" type="Node" parent="StateMachine/Root/Victory"]
script = ExtResource("9_la16b")
to = NodePath("../../Think")
event = &"will_reset"
delay_in_seconds = "0.0"
[connection signal="animation_finished" from="AnimationTree" to="." method="_on_animation_tree_animation_finished"]
[connection signal="area_entered" from="Attackbox" to="." method="_on_attackbox_area_entered"]
[connection signal="body_entered" from="Meleebox" to="." method="_on_meleebox_body_entered"]

BIN
Hiro/hiro_game_over_screen_1.png (Stored with Git LFS) Normal file

Binary file not shown.

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b46ekrvgw3amj"
path="res://.godot/imported/hiro_game_over_screen_1.png-a50954187c5b2e16875476dfc995782e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Hiro/hiro_game_over_screen_1.png"
dest_files=["res://.godot/imported/hiro_game_over_screen_1.png-a50954187c5b2e16875476dfc995782e.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

BIN
Hiro/hiro_game_over_screen_nsfw.png (Stored with Git LFS)

Binary file not shown.

BIN
Hiro/hiro_game_over_screen_sfw.png (Stored with Git LFS)

Binary file not shown.

View file

@ -606,6 +606,12 @@ script = ExtResource("7_jc1pg")
[node name="Victory" type="Node" parent="StateMachine/Root"]
script = ExtResource("7_jc1pg")
[node name="ToThink" type="Node" parent="StateMachine/Root/Victory"]
script = ExtResource("8_713tw")
to = NodePath("../../Think")
event = &"will_reset"
delay_in_seconds = "0.0"
[node name="RangeSpawners" type="Node2D" parent="."]
[node name="East" type="Marker2D" parent="RangeSpawners"]

View file

@ -40,3 +40,6 @@ func _on_humanoid_character_attacked():
func _on_reed_ai_range_attack_initiated(by):
play_sound("energy_blast")
func _on_game_requested_retry():
play_sound("unpause")

View file

@ -8,14 +8,17 @@ extends Node2D
@onready var reed_ai : AICharacter = $ReedAI
@onready var nem_npc = $NemNPC
@onready var cutscene_manager = $CutsceneManager
@onready var bgm_manager = $MusicManager
@onready var sound_manager = $SoundManager
@onready var fader_animation = $Fades/Control/FaderRect/AnimationPlayer
@onready var barrier = $BattleBarriers
@onready var credits = $Fades/Control/Credits
@onready var reward_nsfw = $Fades/Control/NSFWReward
@onready var reward_sfw = $Fades/Control/SFWReward
@onready var gameover_screen = $Fades/Control/GameOverScreen
@onready var gameover_screen_player = $Fades/Control/GameOverScreen/AnimationPlayer
@onready var gameover_image = $Fades/Control/GameOverScreen/GameOverImage
@onready var gameover_button = $Fades/Control/GameOverScreen/Button
@export var stage = 1
@export var losing_cutscenes: Array[StringName] = [
@ -73,9 +76,14 @@ func _on_cutscene_finished(cutscene_name: String):
if losing_cutscenes.find(cutscene_name) >= 0:
if cutscene_name.begins_with("reed") and Globals.nsfw:
gameover_image.texture = load("res://Hiro/hiro_game_over_screen_nsfw.png")
gameover_screen.visible = true
gameover_screen_player.play("fade_in")
player.in_cutscene = true
game_state.can_pause = false
await get_tree().create_timer(1.0).timeout
gameover_button.disabled = false
gameover_button.grab_focus()
gameover_button.grab_click_focus()
elif cutscene_name == "talking_to_nem":
nem_npc.interaction_cutscene = null
hiro_ai.set_ai_enabled(true)
@ -95,6 +103,78 @@ func _on_credits_requested_reward():
reward_nsfw.visible = Globals.nsfw
reward_sfw.visible = not Globals.nsfw
fader_animation.play("fade_in_black")
func _on_retry():
gameover_button.disabled = true
print("Going to retry stage " + str(stage))
fader_animation.play("fade_out_black")
# TODO: Handle this when the animation ends instead.
await get_tree().create_timer(2.0).timeout
if stage == 1:
# Set everything back to Hiro clone's fight.
player.health = player.max_health
hiro_ai.health = hiro_ai.max_health
battle_ui.initialize(player, hiro_ai)
battle_ui.set_enemy_health_visible(true)
# Disable AI (will be reset later)
hiro_ai.set_ai_enabled(false)
# Teleport characters
hiro_ai.global_position = $PositionMarkers/Marker3.global_position
player.global_position = $PositionMarkers/Marker2.global_position
# Reset animation state
player.has_nsfw_animations = false
player.set_animation_direction(Vector2.RIGHT)
player.anim_playback.travel("idle")
hiro_ai.set_animation_direction(Vector2.LEFT)
hiro_ai.anim_playback.travel("idle")
# Ensure collider is enabled
hiro_ai.get_node("MovementCollider").disabled = false
# All set, fade back in!
gameover_screen.modulate.a = 0.0
fader_animation.play("fade_in_black")
bgm_manager.play_music(load("res://Audio/BGM/olympus_combat.mp3"), false)
await get_tree().create_timer(1.5).timeout
gameover_screen.visible = false
player.can_move = true
player.in_cutscene = false
hiro_ai.set_melee_box_enabled(true)
hiro_ai.reset_state()
barrier.process_mode = Node.PROCESS_MODE_INHERIT
return
if stage == 2:
# Reheal characters
player.health = player.max_health
reed_ai.health = reed_ai.max_health
battle_ui.initialize(player, reed_ai)
battle_ui.set_enemy_health_visible(true)
# Disable AI (will be reset later)
reed_ai.set_ai_enabled(false)
# Teleport characters
reed_ai.global_position = $PositionMarkers/Marker3.global_position
player.global_position = $PositionMarkers/Marker2.global_position
# Reset animation state
player.has_nsfw_animations = Globals.nsfw
player.set_animation_direction(Vector2.RIGHT)
player.anim_playback.travel("idle")
reed_ai.set_animation_direction(Vector2.LEFT)
reed_ai.anim_playback.travel("idle")
# Ensure collider is enabled
reed_ai.get_node("MovementCollider").disabled = false
# All set, fade back in!
gameover_screen.modulate.a = 0.0
fader_animation.play("fade_in_black")
bgm_manager.play_music(load("res://Audio/BGM/flying_in_the_sky.mp3"), false)
await get_tree().create_timer(1.5).timeout
player.can_move = true
player.in_cutscene = false
reed_ai.set_melee_box_enabled(true)
reed_ai.reset_state()
barrier.process_mode = Node.PROCESS_MODE_INHERIT
return
func _on_cutscene_manager_issued_command(command: CutsceneCommand, manager: CutsceneManager):
if command is TurnCharacterCommand or command is LookAtTargetCommand:
@ -152,6 +232,7 @@ func _on_cutscene_manager_issued_command(command: CutsceneCommand, manager: Cuts
player.has_nsfw_animations = Globals.nsfw
reed_ai.set_animation_direction(Vector2.LEFT)
$NPCs.visible = true
reed_ai.state_machine.send_event("will_reset")
reed_ai.set_melee_box_enabled(true)
reed_ai.get_node("MovementCollider").disabled = false
manager.step()

View file

@ -116,6 +116,10 @@ func set_ai_process_mode(mode: ProcessMode):
func set_ai_enabled(enabled: bool):
set_ai_process_mode(Node.PROCESS_MODE_INHERIT if enabled else Node.PROCESS_MODE_DISABLED)
func reset_state():
set_ai_enabled(true)
state_machine.send_event("will_reset")
func set_melee_box_enabled(enabled: bool):
melee_hitbox_collider.set_deferred("disabled", !enabled)

View file

@ -52,6 +52,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
alignment = 1
[node name="Label" type="Label" parent="VBoxContainer"]
@ -62,6 +63,7 @@ horizontal_alignment = 1
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"]
layout_mode = 2
mouse_filter = 2
theme_override_constants/margin_bottom = 16
[node name="Label" type="Label" parent="VBoxContainer/MarginContainer"]
@ -72,21 +74,25 @@ horizontal_alignment = 1
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
layout_mode = 2
mouse_filter = 2
alignment = 1
[node name="Raxki" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 6
mouse_filter = 2
alignment = 2
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/HBoxContainer/Raxki"]
layout_mode = 2
mouse_filter = 2
theme_override_constants/margin_bottom = 8
[node name="Sprite" type="TextureRect" parent="VBoxContainer/HBoxContainer/Raxki/MarginContainer"]
texture_filter = 1
custom_minimum_size = Vector2(0, 56)
layout_mode = 2
mouse_filter = 2
texture = ExtResource("3_dpsa0")
expand_mode = 1
stretch_mode = 5
@ -106,16 +112,19 @@ horizontal_alignment = 1
[node name="Yonic" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 6
mouse_filter = 2
alignment = 2
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/HBoxContainer/Yonic"]
layout_mode = 2
mouse_filter = 2
theme_override_constants/margin_bottom = 8
[node name="Sprite" type="TextureRect" parent="VBoxContainer/HBoxContainer/Yonic/MarginContainer"]
texture_filter = 1
custom_minimum_size = Vector2(0, 58)
layout_mode = 2
mouse_filter = 2
texture = ExtResource("4_yqlxt")
stretch_mode = 5
@ -134,9 +143,11 @@ horizontal_alignment = 1
[node name="Credits3" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 6
mouse_filter = 2
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/HBoxContainer/Credits3"]
layout_mode = 2
mouse_filter = 2
theme_override_constants/margin_bottom = 16
[node name="Title" type="Label" parent="VBoxContainer/HBoxContainer/Credits3"]
@ -158,14 +169,17 @@ horizontal_alignment = 1
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"]
layout_mode = 2
mouse_filter = 2
alignment = 1
[node name="Credits1" type="VBoxContainer" parent="VBoxContainer/HBoxContainer2"]
layout_mode = 2
size_flags_horizontal = 6
mouse_filter = 2
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/HBoxContainer2/Credits1"]
layout_mode = 2
mouse_filter = 2
theme_override_constants/margin_bottom = 16
[node name="Title" type="Label" parent="VBoxContainer/HBoxContainer2/Credits1"]
@ -183,9 +197,11 @@ horizontal_alignment = 1
[node name="Credits2" type="VBoxContainer" parent="VBoxContainer/HBoxContainer2"]
layout_mode = 2
size_flags_horizontal = 6
mouse_filter = 2
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/HBoxContainer2/Credits2"]
layout_mode = 2
mouse_filter = 2
theme_override_constants/margin_bottom = 16
[node name="Title" type="Label" parent="VBoxContainer/HBoxContainer2/Credits2"]
@ -205,9 +221,11 @@ horizontal_alignment = 1
[node name="Credits3" type="VBoxContainer" parent="VBoxContainer/HBoxContainer2"]
layout_mode = 2
size_flags_horizontal = 6
mouse_filter = 2
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/HBoxContainer2/Credits3"]
layout_mode = 2
mouse_filter = 2
theme_override_constants/margin_bottom = 16
[node name="Title" type="Label" parent="VBoxContainer/HBoxContainer2/Credits3"]
@ -226,6 +244,7 @@ horizontal_alignment = 1
[node name="MarginContainer2" type="MarginContainer" parent="VBoxContainer"]
layout_mode = 2
mouse_filter = 2
theme_override_constants/margin_top = 8
theme_override_constants/margin_bottom = 8
@ -238,6 +257,7 @@ horizontal_alignment = 1
[node name="RewardHint" type="MarginContainer" parent="VBoxContainer"]
layout_mode = 2
mouse_filter = 2
theme_override_constants/margin_left = 8
theme_override_constants/margin_top = 8
theme_override_constants/margin_right = 8

View file

@ -121,6 +121,7 @@ layout_mode = 3
anchors_preset = 0
offset_left = -720.0
offset_bottom = 480.0
mouse_filter = 2
[node name="ChatboxContainer" type="Control" parent="LeftTextbox"]
layout_mode = 1
@ -205,6 +206,7 @@ offset_left = 720.0
offset_right = 1440.0
offset_bottom = 480.0
grow_horizontal = 0
mouse_filter = 2
[node name="ChatboxContainer" type="Control" parent="RightTextbox"]
layout_mode = 1

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=83 format=3 uid="uid://bxuxjqxxqy7ce"]
[gd_scene load_steps=86 format=3 uid="uid://bxuxjqxxqy7ce"]
[ext_resource type="PackedScene" uid="uid://di21xheryhp0k" path="res://Hiro/hiro_player.tscn" id="1_c1gpq"]
[ext_resource type="PackedScene" uid="uid://b8sfype1vx5ad" path="res://Nem/nem_npc.tscn" id="1_sqt7d"]
@ -66,6 +66,71 @@ shader_parameter/line_opacity = 0.1
shader_parameter/spacing = 3
shader_parameter/scale = 1.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0bu2i"]
bg_color = Color(1, 1, 1, 1)
[sub_resource type="Animation" id="Animation_i1rco"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 0)]
}
[sub_resource type="Animation" id="Animation_nt1vk"]
resource_name = "fade_in"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_xe0ly"]
_data = {
"RESET": SubResource("Animation_i1rco"),
"fade_in": SubResource("Animation_nt1vk")
}
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_vk0sh"]
bg_color = Color(0, 0, 0.133333, 0.662745)
corner_radius_top_left = 999
corner_radius_top_right = 999
corner_radius_bottom_right = 999
corner_radius_bottom_left = 999
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dubbv"]
bg_color = Color(0.129412, 0, 0, 0.662745)
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
border_color = Color(0.8, 0, 0, 1)
corner_radius_top_left = 999
corner_radius_top_right = 999
corner_radius_bottom_right = 999
corner_radius_bottom_left = 999
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_m6ugn"]
bg_color = Color(0, 0, 0, 0.478431)
corner_radius_top_left = 999
corner_radius_top_right = 999
corner_radius_bottom_right = 999
corner_radius_bottom_left = 999
[sub_resource type="Animation" id="Animation_lyxis"]
length = 0.001
tracks/0/type = "value"
@ -135,45 +200,6 @@ _data = {
"fade_out_black": SubResource("Animation_b6gpx")
}
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0bu2i"]
bg_color = Color(1, 1, 1, 1)
[sub_resource type="Animation" id="Animation_i1rco"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(1, 1, 1, 0)]
}
[sub_resource type="Animation" id="Animation_nt1vk"]
resource_name = "fade_in"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".:modulate")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_xe0ly"]
_data = {
"RESET": SubResource("Animation_i1rco"),
"fade_in": SubResource("Animation_nt1vk")
}
[sub_resource type="ShaderMaterial" id="ShaderMaterial_b1hkp"]
shader = ExtResource("19_5m168")
shader_parameter/darken_screen = 0.0
@ -855,6 +881,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 1
[node name="Label" type="Label" parent="PauseMenu/Control"]
layout_mode = 1
@ -892,7 +919,6 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="ScanLines" type="ColorRect" parent="Fades/Control"]
visible = false
@ -904,6 +930,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
color = Color(0.247059, 0.247059, 0.247059, 1)
[node name="LCDDisplay" type="ColorRect" parent="Fades/Control"]
@ -915,6 +942,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
color = Color(0.180392, 0.180392, 0.180392, 1)
[node name="NSFWReward" type="TextureRect" parent="Fades/Control"]
@ -925,6 +953,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
texture = ExtResource("10_qggmb")
expand_mode = 3
@ -936,9 +965,65 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
texture = ExtResource("11_ni26m")
expand_mode = 3
[node name="GameOverScreen" type="Panel" parent="Fades/Control"]
visible = false
modulate = Color(1, 1, 1, 0)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_0bu2i")
[node name="GameOverImage" type="TextureRect" parent="Fades/Control/GameOverScreen"]
texture_filter = 2
texture_repeat = 1
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 150.0
offset_top = 156.0
offset_right = -165.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
texture = ExtResource("24_etubl")
expand_mode = 1
stretch_mode = 5
[node name="AnimationPlayer" type="AnimationPlayer" parent="Fades/Control/GameOverScreen"]
libraries = {
"": SubResource("AnimationLibrary_xe0ly")
}
[node name="Button" type="Button" parent="Fades/Control/GameOverScreen"]
layout_mode = 1
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -92.0
offset_top = 115.0
offset_right = 95.0
offset_bottom = 146.0
grow_horizontal = 2
mouse_default_cursor_shape = 2
theme_override_colors/font_color = Color(1, 1, 1, 1)
theme_override_colors/font_disabled_color = Color(0.917647, 0.917647, 0.917647, 1)
theme_override_fonts/font = ExtResource("2_64thh")
theme_override_styles/normal = SubResource("StyleBoxFlat_vk0sh")
theme_override_styles/hover = SubResource("StyleBoxFlat_dubbv")
theme_override_styles/pressed = SubResource("StyleBoxFlat_dubbv")
theme_override_styles/disabled = SubResource("StyleBoxFlat_m6ugn")
theme_override_styles/focus = SubResource("StyleBoxFlat_vk0sh")
disabled = true
text = "Try again"
[node name="FaderRect" type="ColorRect" parent="Fades/Control"]
layout_mode = 1
anchors_preset = 15
@ -955,50 +1040,24 @@ libraries = {
}
[node name="Credits" parent="Fades/Control" instance=ExtResource("11_2tmmx")]
visible = false
layout_mode = 1
[node name="GameOverScreen" type="Panel" parent="Fades/Control"]
modulate = Color(1, 1, 1, 0)
top_level = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_0bu2i")
[node name="GameOverImage" type="TextureRect" parent="Fades/Control/GameOverScreen"]
texture_filter = 2
texture_repeat = 1
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
texture = ExtResource("24_etubl")
expand_mode = 1
stretch_mode = 5
[node name="AnimationPlayer" type="AnimationPlayer" parent="Fades/Control/GameOverScreen"]
libraries = {
"": SubResource("AnimationLibrary_xe0ly")
}
[node name="CanvasLayer" type="CanvasLayer" parent="."]
[node name="BattleUI" parent="CanvasLayer" instance=ExtResource("10_hxn8m")]
mouse_filter = 2
metadata/_edit_lock_ = true
[node name="Debug" type="Control" parent="CanvasLayer"]
visible = false
layout_mode = 3
anchor_left = 0.667
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 0
grow_vertical = 2
mouse_filter = 2
[node name="StateChartDebugger" parent="CanvasLayer/Debug" instance=ExtResource("2_o5str")]
layout_mode = 1
@ -1021,6 +1080,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="MapElements" type="Node2D" parent="."]
y_sort_enabled = true
@ -1268,13 +1328,15 @@ shape = SubResource("RectangleShape2D_hkvwf")
[connection signal="dialogue_completed" from="TextboxUI" to="CutsceneManager" method="_on_ui_dialogue_completed"]
[connection signal="dialogue_continued" from="TextboxUI" to="SoundManager" method="_on_ui_dialogue_continued"]
[connection signal="dialogue_opened" from="TextboxUI" to="SoundManager" method="_on_ui_dialogue_opened"]
[connection signal="pressed" from="Fades/Control/GameOverScreen/Button" to="." method="_on_retry"]
[connection signal="pressed" from="Fades/Control/GameOverScreen/Button" to="SoundManager" method="_on_game_requested_retry"]
[connection signal="given_way" from="Fades/Control/Credits" to="Fades/Control/Credits" method="_on_given_way" flags=6]
[connection signal="given_way" from="Fades/Control/Credits" to="SoundManager" method="_on_game_pause_toggled" flags=6 binds= [false]]
[connection signal="reward_requested" from="Fades/Control/Credits" to="." method="_on_credits_requested_reward" flags=6]
[connection signal="attack_did_hit" from="HiroPlayer" to="ShadowClone" method="_on_enemy_attack_did_hit"]
[connection signal="attack_did_hit" from="HiroPlayer" to="ReedAI" method="_on_enemy_attack_did_hit"]
[connection signal="attacked" from="HiroPlayer" to="SoundManager" method="_on_humanoid_character_attacked"]
[connection signal="defeated" from="HiroPlayer" to="." method="_on_player_defeated" flags=6]
[connection signal="defeated" from="HiroPlayer" to="." method="_on_player_defeated"]
[connection signal="defeated" from="HiroPlayer" to="ShadowClone" method="_on_player_been_defeated"]
[connection signal="defeated" from="HiroPlayer" to="ReedAI" method="_on_player_been_defeated"]
[connection signal="got_hurt" from="HiroPlayer" to="SoundManager" method="_on_character_got_hurt"]
@ -1287,7 +1349,7 @@ shape = SubResource("RectangleShape2D_hkvwf")
[connection signal="got_hurt" from="ShadowClone" to="CanvasLayer/BattleUI" method="_on_enemy_got_hurt"]
[connection signal="attack_did_hit" from="ReedAI" to="HiroPlayer" method="_on_enemy_attack_did_hit"]
[connection signal="attacked" from="ReedAI" to="SoundManager" method="_on_humanoid_character_attacked"]
[connection signal="defeated" from="ReedAI" to="." method="_on_reed_ai_defeated" flags=7]
[connection signal="defeated" from="ReedAI" to="." method="_on_reed_ai_defeated" flags=3]
[connection signal="got_hurt" from="ReedAI" to="SoundManager" method="_on_character_got_hurt"]
[connection signal="got_hurt" from="ReedAI" to="CanvasLayer/BattleUI" method="_on_enemy_got_hurt"]
[connection signal="range_attack_initiated" from="ReedAI" to="SoundManager" method="_on_reed_ai_range_attack_initiated"]