diff --git a/cutscenes/fami_cutscene.gd b/cutscenes/fami_cutscene.gd index 9d0cbba..bb18e87 100644 --- a/cutscenes/fami_cutscene.gd +++ b/cutscenes/fami_cutscene.gd @@ -2,6 +2,8 @@ extends Node2D signal cutscene_finished +const DeathParticles = preload("res://objects/enemy/death_particles.tscn") + export var cutscene_skip: float = 92.0 onready var animation_player: AnimationPlayer = $AnimationPlayer @@ -26,6 +28,13 @@ func skip_cutscene() -> void: animation_player.seek(cutscene_skip) Fade.fade_in(Options.transition_speed_secs) +func kill_cop() -> void: + var splatter := DeathParticles.instance() + splatter.global_position = $Cop.global_position + splatter.emitting = true + add_child(splatter) + $Cop.queue_free() + func _notification(what: int) -> void: match what: NOTIFICATION_WM_FOCUS_OUT: diff --git a/maps/boss/boss3_arena.gd b/maps/boss/boss3_arena.gd index d8b1b35..7148877 100644 --- a/maps/boss/boss3_arena.gd +++ b/maps/boss/boss3_arena.gd @@ -25,13 +25,27 @@ func _on_Famira_health_changed(amount) -> void: func _on_cutscene_finished() -> void: $GUI.visible = true sg2083.visible = true - sg2083.state = sg2083.State.STAND famira.visible = true famira.animation_player.play("grow") + $AnimationPlayer.play("drop-stg") yield(get_tree().create_timer(0.5), "timeout") $FamiCutscene/FamiHuman.visible = false +func fade() -> void: + Fade.fade_out(0.4) + yield(Fade, "fade_finished") + Fade.fade_in(0.4) + yield(Fade, "fade_finished") + sg2083.anims.play("UnDuck") + sg2083.state = sg2083.State.STAND + famira.state_chart.send_event("transformed") + + +func start_fight() -> void: + famira.animation_player.state_chart.send_event("transformed") + + func _on_2083_energy_changed(amount) -> void: sg_energy.value = amount diff --git a/maps/boss/boss3_arena.tscn b/maps/boss/boss3_arena.tscn index 16efb4b..d1501ea 100644 --- a/maps/boss/boss3_arena.tscn +++ b/maps/boss/boss3_arena.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=10 format=2] +[gd_scene load_steps=12 format=2] [ext_resource path="res://objects/enemy/boss/sg2083.tscn" type="PackedScene" id=1] [ext_resource path="res://tilesets/t_laboratory.tres" type="TileSet" id=2] @@ -10,6 +10,157 @@ [ext_resource path="res://objects/lore/boss/fami.tscn" type="PackedScene" id=8] [ext_resource path="res://graphics/backgrounds/fami_rooftop.png" type="Texture" id=9] +[sub_resource type="Animation" id=1] +length = 0.001 +tracks/0/type = "value" +tracks/0/path = NodePath("2083:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 12 ) ] +} +tracks/1/type = "bezier" +tracks/1/path = NodePath("2083:position:x") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"points": PoolRealArray( 0, -0.25, 0, 0.25, 0 ), +"times": PoolRealArray( 0 ) +} +tracks/2/type = "bezier" +tracks/2/path = NodePath("2083:position:y") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"points": PoolRealArray( 12, -0.25, 0, 0.25, 0 ), +"times": PoolRealArray( 0 ) +} +tracks/3/type = "value" +tracks/3/path = NodePath("2083:visible") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ false ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("ParallaxBackground/ParallaxLayer/Sprite:visible") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ true ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("FamiCutscene:visible") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ true ] +} + +[sub_resource type="Animation" id=2] +resource_name = "drop-stg" +length = 4.4 +tracks/0/type = "bezier" +tracks/0/path = NodePath("2083:position:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"points": PoolRealArray( -300, -0.25, 0, 0.2, 0, 12, -0.1, -149.978, 0.25, 0 ), +"times": PoolRealArray( 3, 3.5 ) +} +tracks/1/type = "value" +tracks/1/path = NodePath("2083:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 3 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ true ] +} +tracks/2/type = "method" +tracks/2/path = NodePath("FamiCutscene") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 3.5 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ ], +"method": "kill_cop" +} ] +} +tracks/3/type = "method" +tracks/3/path = NodePath("2083") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 3.5 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ true ], +"method": "land" +} ] +} +tracks/4/type = "method" +tracks/4/path = NodePath(".") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 4 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ ], +"method": "fade" +} ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("FamiCutscene:visible") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 3, 4.4 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 1, +"values": [ true, false ] +} + [node name="Map" type="Node2D" groups=["map"]] pause_mode = 1 script = ExtResource( 3 ) @@ -19,11 +170,11 @@ lore_entries = [ ExtResource( 8 ) ] [node name="ParallaxLayer" type="ParallaxLayer" parent="ParallaxBackground"] motion_scale = Vector2( 0.5, 1 ) -motion_offset = Vector2( -256, 0 ) [node name="Sprite" type="Sprite" parent="ParallaxBackground/ParallaxLayer"] texture = ExtResource( 9 ) centered = false +offset = Vector2( -128, 0 ) [node name="GUI" type="CanvasLayer" parent="."] visible = false @@ -139,6 +290,10 @@ visible = false position = Vector2( 160, 179 ) sg2083_path = NodePath("../2083") +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/RESET = SubResource( 1 ) +anims/drop-stg = SubResource( 2 ) + [connection signal="cutscene_finished" from="FamiCutscene" to="." method="_on_cutscene_finished"] [connection signal="energy_changed" from="2083" to="." method="_on_2083_energy_changed"] [connection signal="health_changed" from="2083" to="." method="_on_2083_health_changed"] diff --git a/objects/enemy/boss/2600_small_explosion.tscn b/objects/enemy/boss/2600_small_explosion.tscn index 877a4ea..5e3af58 100644 --- a/objects/enemy/boss/2600_small_explosion.tscn +++ b/objects/enemy/boss/2600_small_explosion.tscn @@ -69,6 +69,7 @@ animations = [ { } ] [node name="2600Explosion" type="Node2D"] +z_index = 50 script = ExtResource( 1 ) [node name="AnimatedSprite" type="AnimatedSprite" parent="."] diff --git a/objects/enemy/boss/famira.tscn b/objects/enemy/boss/famira.tscn index 6be302f..a0eacbb 100644 --- a/objects/enemy/boss/famira.tscn +++ b/objects/enemy/boss/famira.tscn @@ -2739,20 +2739,6 @@ tracks/18/keys = { "update": 0, "values": [ Vector2( 1e-05, 1e-05 ), Vector2( 1, 1 ) ] } -tracks/19/type = "method" -tracks/19/path = NodePath("../StateChart") -tracks/19/interp = 1 -tracks/19/loop_wrap = true -tracks/19/imported = false -tracks/19/enabled = true -tracks/19/keys = { -"times": PoolRealArray( 2.9 ), -"transitions": PoolRealArray( 1 ), -"values": [ { -"args": [ "transformed" ], -"method": "send_event" -} ] -} [sub_resource type="Animation" id=24] resource_name = "punching" @@ -4025,7 +4011,7 @@ shape = SubResource( 14 ) [node name="LowerJaw" type="CollisionShape2D" parent="Hitbox"] position = Vector2( -21.3082, -76.1166 ) -rotation = 1.66395 +rotation = 1.66396 z_index = 100 shape = SubResource( 15 ) diff --git a/objects/enemy/boss/sg2083.gd b/objects/enemy/boss/sg2083.gd index 4e5d41f..e7106b5 100644 --- a/objects/enemy/boss/sg2083.gd +++ b/objects/enemy/boss/sg2083.gd @@ -78,6 +78,13 @@ func set_energy(value: float) -> void: emit_signal("energy_changed", energy) +func land(duck: bool) -> void: + if duck: + anims.play("Duck") + else: + anims.play("UnDuck") + + func shoot() -> void: set_energy(energy - bullet_energy) Audio.play_sound(Audio.a_bullet_barrage,Audio.ac_collectible) diff --git a/objects/enemy/boss/sg2083.tscn b/objects/enemy/boss/sg2083.tscn index 2295e94..f58bef7 100644 --- a/objects/enemy/boss/sg2083.tscn +++ b/objects/enemy/boss/sg2083.tscn @@ -241,7 +241,7 @@ tracks/3/keys = { "times": PoolRealArray( 0, 0.1, 0.2 ), "transitions": PoolRealArray( 1, 1, 1 ), "update": 0, -"values": [ -25.1199, -42.8239, -52.5731 ] +"values": [ -25.1199, -42.8239, -52.6 ] } tracks/4/type = "value" tracks/4/path = NodePath("Axle/JointFront/LegFront/ShinFront:position") @@ -265,7 +265,7 @@ tracks/5/keys = { "times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2 ), "transitions": PoolRealArray( 1, 1, 1, 1, 1 ), "update": 0, -"values": [ 51.0254, 71.6413, 96.9236, 110.502, 129.974 ] +"values": [ 51.0254, 71.6413, 96.9236, 110.502, 128.135 ] } tracks/6/type = "value" tracks/6/path = NodePath("Axle/JointFront/LegFront:position") @@ -289,7 +289,7 @@ tracks/7/keys = { "times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2 ), "transitions": PoolRealArray( 1, 1, 1, 1, 1 ), "update": 0, -"values": [ -26.8344, -38.9649, -54.4339, -63.1815, -77.3026 ] +"values": [ -26.8344, -38.9649, -54.4339, -63.1815, -75.4293 ] } tracks/8/type = "value" tracks/8/path = NodePath("Axle/JointBack/LegBack/KneeBack/ShinBack/FootBack:position") @@ -313,7 +313,7 @@ tracks/9/keys = { "times": PoolRealArray( 0, 0.1, 0.2 ), "transitions": PoolRealArray( 1, 1, 1 ), "update": 0, -"values": [ -25.1199, -42.6063, -52.1914 ] +"values": [ -25.1199, -42.6063, -52.8 ] } tracks/10/type = "value" tracks/10/path = NodePath("Axle/JointBack/LegBack/KneeBack/ShinBack:position") @@ -337,7 +337,7 @@ tracks/11/keys = { "times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2 ), "transitions": PoolRealArray( 1, 1, 1, 1, 1 ), "update": 0, -"values": [ 51.0254, -5939.68, -82.9, 2.5, 130.023 ] +"values": [ 51.0254, -5939.68, -82.9, 2.5, 128.421 ] } tracks/12/type = "value" tracks/12/path = NodePath("Axle/JointBack/LegBack/KneeBack:position") @@ -385,7 +385,7 @@ tracks/15/keys = { "times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2 ), "transitions": PoolRealArray( 1, 1, 1, 1, 1 ), "update": 0, -"values": [ -26.8344, -39.4117, -54.688, -63.5339, -77.4075 ] +"values": [ -26.8344, -39.4117, -54.688, -63.5339, -76.1645 ] } tracks/16/type = "value" tracks/16/path = NodePath(".:safe_from_breath")