diff --git a/graphics/enemy/antlion_body.png b/graphics/enemy/antlion_body.png index 92614e0..370dd7e 100644 Binary files a/graphics/enemy/antlion_body.png and b/graphics/enemy/antlion_body.png differ diff --git a/objects/enemy/boss/famira.gd b/objects/enemy/boss/famira.gd index ee91f1f..51afa78 100644 --- a/objects/enemy/boss/famira.gd +++ b/objects/enemy/boss/famira.gd @@ -4,19 +4,27 @@ extends Node2D export var push_speed: float = 60.0 export var chase_speed: float = 40.0 export var breath_dps: float = 50.0 +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 sg2083_path: NodePath onready var animation_player: AnimationPlayer = $"%AnimationPlayer" -onready var state_chart: Node = $StateChart +onready var state_chart: StateChart = $StateChart onready var in_range_cast: RayCast2D = $InRangeCast onready var out_range_cast: RayCast2D = $OutRangeCast onready var shoot_range_cast: RayCast2D = $ShootRangeCast func _physics_process(delta: float) -> void: + var sg2083 := get_node(sg2083_path) + if sg2083 and sg2083.state == 0: + state_chart.set_guard_property("player_dead", true) + state_chart.send_event("player_dead") + else: + state_chart.set_guard_property("player_dead", false) if not out_range_cast.is_colliding(): state_chart.send_event("out_of_range") elif in_range_cast.is_colliding(): @@ -35,6 +43,7 @@ func _attack() -> void: var sg2083 := get_node(sg2083_path) if sg2083.has_method("hurt"): sg2083.hurt(punch_damage) + sg2083.knock_back(punch_knockback) func _on_Roar_state_entered() -> void: @@ -85,3 +94,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) diff --git a/objects/enemy/boss/famira.tscn b/objects/enemy/boss/famira.tscn index 6ae3741..c5657e5 100644 --- a/objects/enemy/boss/famira.tscn +++ b/objects/enemy/boss/famira.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=25 format=2] +[gd_scene load_steps=28 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] @@ -15,6 +15,10 @@ [ext_resource path="res://graphics/enemy/antlion_body.png" type="Texture" id=13] [ext_resource path="res://graphics/enemy/tentacle.png" type="Texture" id=14] [ext_resource path="res://graphics/particles/dust.png" type="Texture" id=15] +[ext_resource path="res://shaders/1px_border.gdshader" type="Shader" id=16] + +[sub_resource type="RectangleShape2D" id=11] +extents = Vector2( 28, 64 ) [sub_resource type="ShaderMaterial" id=1] shader = ExtResource( 2 ) @@ -729,6 +733,7 @@ tracks/13/keys = { [sub_resource type="Animation" id=3] resource_name = "roar" length = 1.5 +loop = true tracks/0/type = "value" tracks/0/path = NodePath("Hip/Body:rotation_degrees") tracks/0/interp = 1 @@ -1086,6 +1091,11 @@ tracks/14/keys = { "values": [ false, true, false ] } +[sub_resource type="ShaderMaterial" id=10] +shader = ExtResource( 16 ) +shader_param/border_color = Color( 0, 0, 0, 1 ) +shader_param/border_corners = false + [sub_resource type="Curve" id=8] _data = [ Vector2( 0, 0.5 ), 0.0, 0.890696, 0, 0, Vector2( 0.814474, 1 ), 0.0, 0.0, 0, 0, Vector2( 1, 0 ), -13.2988, 0.0, 0, 0 ] @@ -1099,6 +1109,14 @@ __meta__ = { "_edit_vertical_guides_": [ ] } +[node name="Hitbox" type="KinematicBody2D" parent="."] +collision_layer = 4 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] +position = Vector2( 12, -64 ) +shape = SubResource( 11 ) + [node name="ChickenMan" type="Node2D" parent="."] material = SubResource( 1 ) @@ -1151,6 +1169,14 @@ offset = Vector2( 0, -6 ) region_enabled = true region_rect = Rect2( 0, 0, 16, 12 ) +[node name="BackArmBorder" type="Node2D" parent="ChickenMan/Hip/Body/BackArm"] +show_behind_parent = true +material = SubResource( 10 ) +script = ExtResource( 12 ) +texture = ExtResource( 13 ) +segments = 4 +target = NodePath("../HandBack") + [node name="FrontArm" type="Node2D" parent="ChickenMan/Hip/Body"] use_parent_material = true position = Vector2( -15.3626, -6.5891 ) @@ -1171,6 +1197,14 @@ offset = Vector2( 0, -6 ) region_enabled = true region_rect = Rect2( 0, 0, 16, 12 ) +[node name="FrontArmBorder" type="Node2D" parent="ChickenMan/Hip/Body/FrontArm"] +show_behind_parent = true +material = SubResource( 10 ) +script = ExtResource( 12 ) +texture = ExtResource( 13 ) +segments = 4 +target = NodePath("../HandFront") + [node name="Neck" type="Sprite" parent="ChickenMan/Hip/Body"] show_behind_parent = true use_parent_material = true @@ -1256,6 +1290,11 @@ script = ExtResource( 6 ) to = NodePath("../PushedBack") event = "start_push" +[node name="On PlayerDead" type="Node" parent="StateChart/Root"] +script = ExtResource( 6 ) +to = NodePath("../Roar") +event = "player_dead" + [node name="Roar" type="Node" parent="StateChart/Root"] script = ExtResource( 5 ) @@ -1263,6 +1302,7 @@ script = ExtResource( 5 ) script = ExtResource( 6 ) to = NodePath("../../Chasing") event = "roar_done" +guard_expression = "not player_dead" [node name="Chasing" type="Node" parent="StateChart/Root"] script = ExtResource( 5 ) @@ -1282,7 +1322,7 @@ script = ExtResource( 5 ) [node name="On OutOfRange" type="Node" parent="StateChart/Root/Punching"] script = ExtResource( 6 ) -to = NodePath("../../PunchCooldown") +to = NodePath("../../Roar") event = "out_of_range" [node name="PunchCooldown" type="Node" parent="StateChart/Root"] @@ -1290,6 +1330,7 @@ script = ExtResource( 5 ) [node name="On Cooldown" type="Node" parent="StateChart/Root/PunchCooldown"] script = ExtResource( 6 ) +to = NodePath("../../Roar") delay = 0.5 [node name="Shooting" type="Node" parent="StateChart/Root"] diff --git a/objects/enemy/boss/sg2083.gd b/objects/enemy/boss/sg2083.gd index ae170fa..cb7385b 100644 --- a/objects/enemy/boss/sg2083.gd +++ b/objects/enemy/boss/sg2083.gd @@ -1,7 +1,7 @@ -extends Node2D +extends KinematicBody2D -enum State {STAND, FORWARD, BACK, DUCK, BEAM, DEAD} +enum State {DEAD, STAND, FORWARD, BACK, DUCK, BEAM} const Bullet = preload("res://objects/enemy/2600_bullet.tscn") const SmallExplosion = preload("res://objects/enemy/boss/2600_small_explosion.tscn") @@ -17,6 +17,7 @@ export var famira_path: NodePath var state: int = State.STAND +var knockback: float = 0.0 onready var bullet_positions = $"%BulletPositions" @@ -42,9 +43,11 @@ func _physics_process(delta: float) -> void: if not Input.is_action_pressed("move_down") and anims.current_animation.empty(): anims.play("UnDuck") State.FORWARD: - position.x += move_speed * delta + move_and_slide(Vector2(move_speed, 0.0)) State.BACK: - position.x -= move_speed * delta + move_and_slide(Vector2(-move_speed, 0.0)) + move_and_slide(Vector2(-knockback, 0.0)) + knockback *= pow(0.1, delta) func _input(event: InputEvent) -> void: @@ -80,6 +83,10 @@ func hurt(amount: float, can_duck: bool = false) -> void: anims.play("die") +func knock_back(amount: float) -> void: + knockback += amount + + func _play_laser_sound(play: bool): var famira = get_node(famira_path) if play: diff --git a/objects/enemy/boss/sg2083.tscn b/objects/enemy/boss/sg2083.tscn index 38311dc..7855ed4 100644 --- a/objects/enemy/boss/sg2083.tscn +++ b/objects/enemy/boss/sg2083.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=38 format=2] +[gd_scene load_steps=39 format=2] [ext_resource path="res://shaders/color_noise.gdshader" type="Shader" id=1] [ext_resource path="res://graphics/enemy/boss/stg_2600/tailpipes.png" type="Texture" id=2] @@ -20,6 +20,9 @@ [ext_resource path="res://graphics/fade_patterns/stg_explosion.png" type="Texture" id=18] [ext_resource path="res://objects/enemy/boss/sg2083.gd" type="Script" id=19] +[sub_resource type="RectangleShape2D" id=27] +extents = Vector2( 44, 76 ) + [sub_resource type="Animation" id=4] resource_name = "Beam" length = 4.0 @@ -30,7 +33,7 @@ tracks/0/loop_wrap = true tracks/0/imported = false tracks/0/enabled = true tracks/0/keys = { -"times": PoolRealArray( 0, 1.6, 3.4 ), +"times": PoolRealArray( 0, 1, 3.4 ), "transitions": PoolRealArray( 1, 1, 1 ), "values": [ { "args": [ true ], @@ -50,7 +53,7 @@ tracks/1/loop_wrap = true tracks/1/imported = false tracks/1/enabled = true tracks/1/keys = { -"times": PoolRealArray( 0, 1.5, 1.6, 3.3, 3.4 ), +"times": PoolRealArray( 0, 0.9, 1, 3.3, 3.4 ), "transitions": PoolRealArray( 1, 1, 1, 1, 1 ), "update": 0, "values": [ Vector2( 1, 1e-05 ), Vector2( 1, 1e-05 ), Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 1, 1e-05 ) ] @@ -62,10 +65,10 @@ tracks/2/loop_wrap = true tracks/2/imported = false tracks/2/enabled = true tracks/2/keys = { -"times": PoolRealArray( 0, 1.3, 1.5, 3.3, 3.4 ), -"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"times": PoolRealArray( 0, 0.7, 3.3, 3.4 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), "update": 0, -"values": [ Vector2( 1e-05, 1 ), Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 1, 1e-05 ) ] +"values": [ Vector2( 1e-05, 1 ), Vector2( 1, 1 ), Vector2( 1, 1 ), Vector2( 1, 1e-05 ) ] } tracks/3/type = "value" tracks/3/path = NodePath("Axle/Head/Beam/Hitbox/BeamShape:disabled") @@ -74,7 +77,7 @@ tracks/3/loop_wrap = true tracks/3/imported = false tracks/3/enabled = true tracks/3/keys = { -"times": PoolRealArray( 0, 1.6, 3.4 ), +"times": PoolRealArray( 0, 1, 3.4 ), "transitions": PoolRealArray( 1, 1, 1 ), "update": 1, "values": [ true, false, true ] @@ -86,7 +89,7 @@ tracks/4/loop_wrap = true tracks/4/imported = false tracks/4/enabled = true tracks/4/keys = { -"times": PoolRealArray( 0, 1.1 ), +"times": PoolRealArray( 0, 0.5 ), "transitions": PoolRealArray( 1, 1 ), "update": 1, "values": [ true, false ] @@ -182,7 +185,7 @@ tracks/12/loop_wrap = true tracks/12/imported = false tracks/12/enabled = true tracks/12/keys = { -"times": PoolRealArray( 0, 1.5, 3.4 ), +"times": PoolRealArray( 0, 0.9, 3.4 ), "transitions": PoolRealArray( 1, 1, 1 ), "update": 1, "values": [ false, true, false ] @@ -1291,18 +1294,19 @@ tracks/1/keys = { "values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0.833333 ), Color( 1, 1, 1, 0.666667 ), Color( 1, 1, 1, 0.5 ), Color( 1, 1, 1, 0.333333 ), Color( 1, 1, 1, 0.166667 ), Color( 1, 1, 1, 0 ) ] } -[sub_resource type="RectangleShape2D" id=26] -extents = Vector2( 42, 76 ) +[sub_resource type="SegmentShape2D" id=26] +a = Vector2( 4, -76 ) +b = Vector2( 4, 76 ) -[node name="2083" type="Node2D"] -z_index = 5 +[node name="2083" type="KinematicBody2D"] +collision_mask = 5 script = ExtResource( 19 ) -__meta__ = { -"_edit_horizontal_guides_": [ 168.0, 128.0, 157.0 ], -"_edit_vertical_guides_": [ 88.0, 67.0, 21.0, 42.0, 79.0 ] -} explosion_rect = Rect2( 24, 16, 88, 64 ) +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 60, 92 ) +shape = SubResource( 27 ) + [node name="AnimationPlayer" type="AnimationPlayer" parent="."] unique_name_in_owner = true anims/Beam = SubResource( 4 ) @@ -1644,8 +1648,7 @@ collision_mask = 0 monitoring = false [node name="CollisionShape2D" type="CollisionShape2D" parent="DetectionBox"] -position = Vector2( 62, 92 ) +position = Vector2( 100, 92 ) shape = SubResource( 26 ) [connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_animation_finished"] -[connection signal="area_entered" from="Axle/Head/Beam/Hitbox" to="." method="_on_Hitbox_area_entered"]