diff --git a/objects/enemy/boss/famira.gd b/objects/enemy/boss/famira.gd index 51afa78..ec52308 100644 --- a/objects/enemy/boss/famira.gd +++ b/objects/enemy/boss/famira.gd @@ -8,6 +8,8 @@ export var breath_knockback: float = 16.0 export var punch_damage: float = 10.0 export var punch_knockback: float = 8.0 export var hurting: bool = false +export var hp: float = 100.0 +export var sg2083_beam_dps: float = 10.0 export var sg2083_path: NodePath @@ -39,6 +41,12 @@ func stop_push() -> void: state_chart.send_event("stop_push") +func hurt(amount: float) -> void: + hp -= amount + if hp <= 0.0: + state_chart.send_event("die") + + func _attack() -> void: var sg2083 := get_node(sg2083_path) if sg2083.has_method("hurt"): @@ -48,6 +56,9 @@ func _attack() -> void: func _on_Roar_state_entered() -> void: animation_player.play("roar", 0.25) + + +func _roar() -> void: Audio.play_sound(Audio.a_famira, Audio.ac_boss) @@ -72,11 +83,8 @@ func _on_PushedBack_state_entered() -> void: func _on_Dying_state_entered() -> void: - queue_free() - - -func _on_PushedBack_event_received(event) -> void: - print(event) + animation_player.play("die", 0.25) + _roar() func _on_Chasing_state_physics_processing(delta) -> void: @@ -84,6 +92,7 @@ func _on_Chasing_state_physics_processing(delta) -> void: func _on_PushedBack_state_physics_processing(delta) -> void: + hurt(sg2083_beam_dps * delta) position.x += push_speed * delta @@ -94,4 +103,4 @@ func _on_Shooting_state_physics_processing(delta) -> void: var distance := shoot_range_cast.to_local(shoot_range_cast.get_collision_point()).x var weight := inverse_lerp(shoot_range_cast.cast_to.x, 0.0, distance) sg2083.hurt(breath_dps * weight * delta, true) - sg2083.knock_back(breath_knockback * weight * delta) + sg2083.knock_back(breath_knockback * weight * delta, true) diff --git a/objects/enemy/boss/famira.tscn b/objects/enemy/boss/famira.tscn index c5657e5..4b7bcb0 100644 --- a/objects/enemy/boss/famira.tscn +++ b/objects/enemy/boss/famira.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=28 format=2] +[gd_scene load_steps=29 format=2] [ext_resource path="res://objects/enemy/boss/famira.gd" type="Script" id=1] [ext_resource path="res://shaders/scale3x.gdshader" type="Shader" id=2] @@ -380,6 +380,167 @@ tracks/12/keys = { "values": [ false ] } +[sub_resource type="Animation" id=12] +resource_name = "die" +length = 0.2 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Hip/Body:rotation_degrees") +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": [ 89.3425 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Hip/Body/BackArm/HandBack:position") +tracks/1/interp = 2 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -41.0008, -18.9997 ) ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Hip/Body/FrontArm/HandFront:position") +tracks/2/interp = 2 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 37.9987, -18.9981 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/Body/Neck:rotation_degrees") +tracks/3/interp = 2 +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": [ -109.576 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Hip/Body/Neck/Headlower:rotation_degrees") +tracks/4/interp = 2 +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": [ 28.215 ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Hip/Body/Neck/Headupper:rotation_degrees") +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": [ 45.9167 ] +} +tracks/6/type = "value" +tracks/6/path = NodePath("Hip/LegFront:rotation_degrees") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ -0.657538 ] +} +tracks/7/type = "value" +tracks/7/path = NodePath("Hip/LegBack:rotation_degrees") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ -0.657538 ] +} +tracks/8/type = "value" +tracks/8/path = NodePath("Hip/Body/Neck:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -25.5991, -9.59989 ) ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("Hip/Body/BackArm/HandBack:rotation_degrees") +tracks/9/interp = 2 +tracks/9/loop_wrap = true +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ -23.1788 ] +} +tracks/10/type = "value" +tracks/10/path = NodePath("Hip/Body/FrontArm/HandFront:rotation_degrees") +tracks/10/interp = 2 +tracks/10/loop_wrap = true +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 38.5195 ] +} +tracks/11/type = "value" +tracks/11/path = NodePath("Hip:position") +tracks/11/interp = 2 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0, 0.1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( 4, -57 ), Vector2( 12, -57 ) ] +} +tracks/12/type = "value" +tracks/12/path = NodePath("Hip/Body/Neck/BreathParticles:emitting") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} + [sub_resource type="Animation" id=5] resource_name = "punching" loop = true @@ -904,6 +1065,20 @@ tracks/13/keys = { "update": 1, "values": [ false ] } +tracks/14/type = "method" +tracks/14/path = NodePath("..") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ ], +"method": "_roar" +} ] +} [sub_resource type="Animation" id=7] resource_name = "shooting" @@ -1124,6 +1299,7 @@ material = SubResource( 1 ) unique_name_in_owner = true anims/RESET = SubResource( 2 ) anims/chasing = SubResource( 4 ) +anims/die = SubResource( 12 ) anims/punching = SubResource( 5 ) anims/pushed = SubResource( 6 ) anims/roar = SubResource( 3 ) @@ -1295,6 +1471,11 @@ script = ExtResource( 6 ) to = NodePath("../Roar") event = "player_dead" +[node name="On Die" type="Node" parent="StateChart/Root"] +script = ExtResource( 6 ) +to = NodePath("../Dying") +event = "die" + [node name="Roar" type="Node" parent="StateChart/Root"] script = ExtResource( 5 ) @@ -1383,7 +1564,6 @@ collide_with_bodies = false [connection signal="state_entered" from="StateChart/Root/PunchCooldown" to="." method="_on_PunchCooldown_state_entered"] [connection signal="state_entered" from="StateChart/Root/Shooting" to="." method="_on_Shooting_state_entered"] [connection signal="state_physics_processing" from="StateChart/Root/Shooting" to="." method="_on_Shooting_state_physics_processing"] -[connection signal="event_received" from="StateChart/Root/PushedBack" to="." method="_on_PushedBack_event_received"] [connection signal="state_entered" from="StateChart/Root/PushedBack" to="." method="_on_PushedBack_state_entered"] [connection signal="state_physics_processing" from="StateChart/Root/PushedBack" to="." method="_on_PushedBack_state_physics_processing"] [connection signal="state_entered" from="StateChart/Root/Dying" to="." method="_on_Dying_state_entered"] diff --git a/objects/enemy/boss/sg2083.gd b/objects/enemy/boss/sg2083.gd index cb7385b..842ce23 100644 --- a/objects/enemy/boss/sg2083.gd +++ b/objects/enemy/boss/sg2083.gd @@ -83,7 +83,9 @@ func hurt(amount: float, can_duck: bool = false) -> void: anims.play("die") -func knock_back(amount: float) -> void: +func knock_back(amount: float, can_duck: bool = false) -> void: + if can_duck and state == State.DUCK: + return knockback += amount