diff --git a/autoloads/audio.gd b/autoloads/audio.gd index c639de8..1d2964a 100644 --- a/autoloads/audio.gd +++ b/autoloads/audio.gd @@ -46,6 +46,7 @@ const a_land = preload("res://audio/sounds/land.ogg") const a_teleport = preload("res://audio/sounds/teleport.ogg") const a_mkey = preload("res://audio/sounds/mkey.ogg") const a_msx_die = preload("res://audio/sounds/msx_die.ogg") +const a_famira = preload("res://audio/sounds/famira.ogg") var loop_section = null var has_looped = false diff --git a/graphics/enemy/antlion_body.png b/graphics/enemy/antlion_body.png index 19860c8..92614e0 100644 Binary files a/graphics/enemy/antlion_body.png and b/graphics/enemy/antlion_body.png differ diff --git a/maps/boss/boss3_arena.tscn b/maps/boss/boss3_arena.tscn index 78ac9b5..d215570 100644 --- a/maps/boss/boss3_arena.tscn +++ b/maps/boss/boss3_arena.tscn @@ -17,6 +17,7 @@ tile_data = PoolIntArray( 1507297, 0, 1, 1507298, 0, 2, 1507299, 0, 2, 1507300, [node name="2083" parent="." instance=ExtResource( 1 )] position = Vector2( 0, 8 ) +famira_path = NodePath("../Famira") [node name="Camera2D" type="Camera2D" parent="2083"] offset = Vector2( 0, -8 ) @@ -24,4 +25,5 @@ anchor_mode = 0 current = true [node name="Famira" parent="." instance=ExtResource( 4 )] -position = Vector2( 278, 176 ) +position = Vector2( 185, 176 ) +sg2083_path = NodePath("../2083") diff --git a/objects/enemy/boss/famira.gd b/objects/enemy/boss/famira.gd index 878b816..ee91f1f 100644 --- a/objects/enemy/boss/famira.gd +++ b/objects/enemy/boss/famira.gd @@ -1,84 +1,87 @@ extends Node2D -export var decisions: Dictionary = { - "wait": 2, - "chase": 3, - "punch": 3, - "beam": 1, -} -export var wait_time: float = 1.0 -export var chase_speed: float = 50.0 +export var push_speed: float = 60.0 +export var chase_speed: float = 40.0 +export var breath_dps: float = 50.0 +export var punch_damage: float = 10.0 +export var hurting: bool = false +export var sg2083_path: NodePath -var rng := RandomNumberGenerator.new() -var current_action: String = "wait" - - -onready var punch_cast: RayCast2D = $PunchCast -onready var chase_cast: RayCast2D = $ChaseCast - - -func _ready() -> void: - rng.seed = "HEROMARK2".hash() - _decide_action() +onready var animation_player: AnimationPlayer = $"%AnimationPlayer" +onready var state_chart: Node = $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: - match current_action: - "chase": - if chase_cast.is_colliding(): - print("huh") - _decide_action() - else: - print("hehe") - position.x -= chase_speed * delta + if not out_range_cast.is_colliding(): + state_chart.send_event("out_of_range") + elif in_range_cast.is_colliding(): + state_chart.send_event("in_range") -func _decide_action() -> void: - # fill array based on weights - var weighted_decisions := [] - for k in decisions.keys(): - for i in decisions[k]: - weighted_decisions.append(k) - # choose an action - current_action = weighted_decisions[rng.randi() % weighted_decisions.size()] - # act based on new action - match current_action: - "wait": - wait() - "chase": - chase() - "punch": - if punch_cast.is_colliding(): - punch() - else: - current_action = "chase" - chase() - "beam": - beam() +func start_push() -> void: + state_chart.send_event("start_push") -func wait() -> void: - print("waiting") - yield(get_tree().create_timer(wait_time, false), "timeout") - _decide_action() +func stop_push() -> void: + state_chart.send_event("stop_push") -func chase() -> void: - # TODO: play animation - print("chasing") +func _attack() -> void: + var sg2083 := get_node(sg2083_path) + if sg2083.has_method("hurt"): + sg2083.hurt(punch_damage) -func punch() -> void: - # TODO: play animation - print("PUNCH") - yield(get_tree().create_timer(wait_time, false), "timeout") - _decide_action() +func _on_Roar_state_entered() -> void: + animation_player.play("roar", 0.25) + Audio.play_sound(Audio.a_famira, Audio.ac_boss) -func beam() -> void: - # TODO: play animation and stuff - print("BEAM") - yield(get_tree().create_timer(wait_time, false), "timeout") - _decide_action() +func _on_Chasing_state_entered() -> void: + animation_player.play("chasing", 0.25) + + +func _on_Punching_state_entered() -> void: + animation_player.play("punching", 0.25) + + +func _on_PunchCooldown_state_entered() -> void: + animation_player.play("RESET", 0.5) + + +func _on_Shooting_state_entered() -> void: + animation_player.play("shooting") + + +func _on_PushedBack_state_entered() -> void: + animation_player.play("pushed", 0.25) + + +func _on_Dying_state_entered() -> void: + queue_free() + + +func _on_PushedBack_event_received(event) -> void: + print(event) + + +func _on_Chasing_state_physics_processing(delta) -> void: + position.x -= chase_speed * delta + + +func _on_PushedBack_state_physics_processing(delta) -> void: + position.x += push_speed * delta + + +func _on_Shooting_state_physics_processing(delta) -> void: + if hurting and shoot_range_cast.is_colliding(): + var sg2083 := get_node(sg2083_path) + if sg2083.has_method("hurt"): + 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) diff --git a/objects/enemy/boss/famira.tscn b/objects/enemy/boss/famira.tscn index 11e1147..6ae3741 100644 --- a/objects/enemy/boss/famira.tscn +++ b/objects/enemy/boss/famira.tscn @@ -1,36 +1,1348 @@ -[gd_scene load_steps=6 format=2] +[gd_scene load_steps=25 format=2] [ext_resource path="res://objects/enemy/boss/famira.gd" type="Script" id=1] -[ext_resource path="res://graphics/enemy/boss/famira-wip.png" type="Texture" id=2] -[ext_resource path="res://shaders/beam_cycle.gdshader" type="Shader" id=3] -[ext_resource path="res://graphics/enemy/boss/stg_2600/beam_gradient.png" type="Texture" id=4] +[ext_resource path="res://shaders/scale3x.gdshader" type="Shader" id=2] +[ext_resource path="res://addons/godot_state_charts/state_chart.gd" type="Script" id=3] +[ext_resource path="res://addons/godot_state_charts/compound_state.gd" type="Script" id=4] +[ext_resource path="res://addons/godot_state_charts/atomic_state.gd" type="Script" id=5] +[ext_resource path="res://addons/godot_state_charts/transition.gd" type="Script" id=6] +[ext_resource path="res://graphics/enemy/boss/scrump_gore/eye.png" type="Texture" id=7] +[ext_resource path="res://graphics/enemy/boss/scrump_gore/headlower.png" type="Texture" id=8] +[ext_resource path="res://graphics/enemy/boss/scrump_gore/headupper.png" type="Texture" id=9] +[ext_resource path="res://graphics/enemy/boss/scrump_gore/brain2.png" type="Texture" id=10] +[ext_resource path="res://graphics/enemy/boss/scrump_gore/tentacle4.png" type="Texture" id=11] +[ext_resource path="res://scripts/ball_snake.gd" type="Script" id=12] +[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] -[sub_resource type="ShaderMaterial" id=10] -shader = ExtResource( 3 ) -shader_param/cycle_speed = 1.0 -shader_param/gradient = ExtResource( 4 ) +[sub_resource type="ShaderMaterial" id=1] +shader = ExtResource( 2 ) +shader_param/pixel_scale = 1.0 + +[sub_resource type="Animation" id=2] +length = 0.001 +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 = 1 +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( -34, 6 ) ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Hip/Body/FrontArm/HandFront:position") +tracks/2/interp = 1 +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( -31.9996, 22.0018 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/Body/Neck:rotation_degrees") +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": [ -137.823 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Hip/Body/Neck/Headlower:rotation_degrees") +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": [ 55.2621 ] +} +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.8929, -8.09683 ) ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("Hip/Body/BackArm/HandBack:rotation_degrees") +tracks/9/interp = 1 +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": [ -102.737 ] +} +tracks/10/type = "value" +tracks/10/path = NodePath("Hip/Body/FrontArm/HandFront:rotation_degrees") +tracks/10/interp = 1 +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": [ -119.87 ] +} +tracks/11/type = "value" +tracks/11/path = NodePath("Hip:position") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 8, -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 ] +} +tracks/13/type = "value" +tracks/13/path = NodePath("Hip/Body/Neck/BreathParticles:initial_velocity") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 230.0 ] +} +tracks/14/type = "value" +tracks/14/path = NodePath("Hip/Body/Neck/BreathParticles:lifetime") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 2.0 ] +} +tracks/15/type = "value" +tracks/15/path = NodePath("..:hurting") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ false ] +} + +[sub_resource type="Animation" id=4] +resource_name = "chasing" +length = 0.4 +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, 0.2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( -34, 6 ), Vector2( -26.9991, 26.9994 ) ] +} +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, 0.2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( -31.9996, 22.0018 ), Vector2( -35.9992, -7.99675 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/Body/Neck:rotation_degrees") +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": [ -137.823 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Hip/Body/Neck/Headlower:rotation_degrees") +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": [ 55.2621 ] +} +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 = 2 +tracks/6/loop_wrap = true +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/keys = { +"times": PoolRealArray( 0, 0.1, 0.2, 0.3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -0.657538, 20.1267, -0.657538, -31.2638 ] +} +tracks/7/type = "value" +tracks/7/path = NodePath("Hip/LegBack:rotation_degrees") +tracks/7/interp = 2 +tracks/7/loop_wrap = true +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/keys = { +"times": PoolRealArray( 0, 0.1, 0.2, 0.3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -0.657538, -17.623, -0.657538, 23.7159 ] +} +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.8929, -8.09683 ) ] +} +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": [ -102.737 ] +} +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, 0.2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ -119.87, -80.0395 ] +} +tracks/11/type = "value" +tracks/11/path = NodePath("Hip:position") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 8, -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.4 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} + +[sub_resource type="Animation" id=5] +resource_name = "punching" +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, 0.2, 0.3, 0.5 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -34, 6 ), Vector2( -12.999, -17.0009 ), Vector2( -65.0015, -0.996742 ), Vector2( -34, 6 ) ] +} +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, 0.5, 0.7, 0.8, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -31.9996, 22.0018 ), Vector2( -31.9996, 22.0018 ), Vector2( -14.9986, -8.9978 ), Vector2( -72.9994, 19.0063 ), Vector2( -31.9996, 22.0018 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/Body/Neck:rotation_degrees") +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": [ -137.823 ] +} +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, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ 55.2621, 47.7735, 55.2621, 47.7735, 55.2621, 47.7735, 55.2621, 47.7735, 55.2621, 47.7735, 55.2621 ] +} +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.8929, -8.09683 ) ] +} +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, 0.2, 0.3, 0.5 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -102.737, -102.737, -102.737, -102.737 ] +} +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, 0.5, 0.7, 0.8, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ -119.87, -119.87, -73.1186, -96.9535, -119.87 ] +} +tracks/11/type = "method" +tracks/11/path = NodePath("..") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0.3, 0.8 ), +"transitions": PoolRealArray( 1, 1 ), +"values": [ { +"args": [ ], +"method": "_attack" +}, { +"args": [ ], +"method": "_attack" +} ] +} +tracks/12/type = "value" +tracks/12/path = NodePath("Hip:position") +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": 0, +"values": [ Vector2( 8, -57 ) ] +} +tracks/13/type = "value" +tracks/13/path = NodePath("Hip/Body/Neck/BreathParticles:emitting") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 0.6 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} + +[sub_resource type="Animation" id=6] +resource_name = "pushed" +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 = 1 +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( -11.0004, -12 ) ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Hip/Body/FrontArm/HandFront:position") +tracks/2/interp = 1 +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( -16.001, -9.99852 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/Body/Neck:rotation_degrees") +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": [ -104.392 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Hip/Body/Neck/Headlower:rotation_degrees") +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": [ 55.2621 ] +} +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": [ -37.6956 ] +} +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": [ 32.9738 ] +} +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( -21.0393, -8.75184 ) ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("Hip/Body/BackArm/HandBack:rotation_degrees") +tracks/9/interp = 1 +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": [ -49.0541 ] +} +tracks/10/type = "value" +tracks/10/path = NodePath("Hip/Body/FrontArm/HandFront:rotation_degrees") +tracks/10/interp = 1 +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": [ -49.6616 ] +} +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( 12, -43 ), Vector2( 4, -43 ) ] +} +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.2 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/13/type = "value" +tracks/13/path = NodePath("..:hurting") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} + +[sub_resource type="Animation" id=3] +resource_name = "roar" +length = 1.5 +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, 0.1, 1.1, 1.3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -34, 6 ), Vector2( -41.0008, -18.9997 ), Vector2( -41.0008, -18.9997 ), Vector2( -34, 6 ) ] +} +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, 0.1, 1.1, 1.3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -31.9996, 22.0018 ), Vector2( 37.9987, -18.9981 ), Vector2( 37.9987, -18.9981 ), Vector2( -31.9996, 22.0018 ) ] +} +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, 0.1, 1.1, 1.5 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -137.823, -109.576, -109.576, -137.823 ] +} +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, 0.1, 1.1, 1.5 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 55.2621, 28.215, 28.215, 55.2621 ] +} +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, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.5 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -25.8929, -8.09683 ), Vector2( -25.5991, -9.59989 ), Vector2( -26.129, -5.68796 ), Vector2( -25.5991, -9.59989 ), Vector2( -26.129, -5.68796 ), Vector2( -25.5991, -9.59989 ), Vector2( -26.129, -5.68796 ), Vector2( -25.5991, -9.59989 ), Vector2( -26.129, -5.68796 ), Vector2( -25.5991, -9.59989 ), Vector2( -26.129, -5.68796 ), Vector2( -25.8929, -8.09683 ), Vector2( -25.8929, -8.09683 ) ] +} +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, 0.1, 1.1, 1.3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -102.737, -23.1788, -23.1788, -102.737 ] +} +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, 0.1, 1.1, 1.3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -122.256, 38.5195, 38.5195, -122.256 ] +} +tracks/11/type = "method" +tracks/11/path = NodePath("../StateChart") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 1.5 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ "roar_done" ], +"method": "send_event" +} ] +} +tracks/12/type = "value" +tracks/12/path = NodePath("Hip:position") +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": 0, +"values": [ Vector2( 8, -57 ) ] +} +tracks/13/type = "value" +tracks/13/path = NodePath("Hip/Body/Neck/BreathParticles:emitting") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 0.6 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} + +[sub_resource type="Animation" id=7] +resource_name = "shooting" +length = 3.0 +tracks/0/type = "value" +tracks/0/path = NodePath("Hip/Body:rotation_degrees") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.4, 2.7, 3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 89.3425, 112.803, 112.803, 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, 0.4, 2.7, 3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -34, 6 ), Vector2( -51.8512, 24.5478 ), Vector2( -51.8512, 24.5478 ), Vector2( -34, 6 ) ] +} +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, 0.4, 2.7, 3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -31.9996, 22.0018 ), Vector2( -11.3985, 19.1772 ), Vector2( -11.3985, 19.1772 ), Vector2( -31.9996, 22.0018 ) ] +} +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, 0.4, 2.7, 3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -137.823, -139.456, -139.456, -137.823 ] +} +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, 0.4, 2.7, 3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 55.2621, 22.2965, 22.2965, 55.2621 ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Hip/Body/Neck/Headupper:rotation_degrees") +tracks/5/interp = 2 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 0.4, 2.7, 3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 45.9167, 45.9167, 45.9167, 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 = 2 +tracks/8/loop_wrap = true +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/keys = { +"times": PoolRealArray( 0, 0.4, 2.7, 3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -25.8929, -8.09683 ), Vector2( -25.8929, -8.09683 ), Vector2( -25.8929, -8.09683 ), Vector2( -25.8929, -8.09683 ) ] +} +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, 0.4, 2.7, 3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -102.737, -109.655, -109.655, -102.737 ] +} +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, 0.4, 2.7, 3 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -119.87, -131.542, -131.542, -119.87 ] +} +tracks/11/type = "value" +tracks/11/path = NodePath("Hip:position") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 8, -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, 0.4, 2.7 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 1, +"values": [ false, true, false ] +} +tracks/13/type = "method" +tracks/13/path = NodePath("../StateChart") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 3 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ "shoot_done" ], +"method": "send_event" +} ] +} +tracks/14/type = "value" +tracks/14/path = NodePath("..:hurting") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/keys = { +"times": PoolRealArray( 0, 0.6, 2.8 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 1, +"values": [ false, true, 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 ] + +[sub_resource type="Gradient" id=9] +offsets = PoolRealArray( 0, 0.163743, 0.432749, 0.596491, 0.853801, 1 ) +colors = PoolColorArray( 0.859375, 1, 0.974457, 1, 0.425781, 0.650085, 1, 1, 0.858946, 0.258824, 0.909804, 1, 0.925781, 0, 0.520752, 1, 0, 0, 0, 1, 0, 0, 0, 1 ) [node name="Famira" type="Node2D"] script = ExtResource( 1 ) +__meta__ = { +"_edit_vertical_guides_": [ ] +} -[node name="Sprite" type="Sprite" parent="."] -material = SubResource( 10 ) -position = Vector2( 23, -83 ) -texture = ExtResource( 2 ) -flip_h = true +[node name="ChickenMan" type="Node2D" parent="."] +material = SubResource( 1 ) -[node name="PunchCast" type="RayCast2D" parent="."] -position = Vector2( 0, -32 ) +[node name="AnimationPlayer" type="AnimationPlayer" parent="ChickenMan"] +unique_name_in_owner = true +anims/RESET = SubResource( 2 ) +anims/chasing = SubResource( 4 ) +anims/punching = SubResource( 5 ) +anims/pushed = SubResource( 6 ) +anims/roar = SubResource( 3 ) +anims/shooting = SubResource( 7 ) + +[node name="Hip" type="Node2D" parent="ChickenMan"] +position = Vector2( 8, -57 ) + +[node name="LegBack" type="Sprite" parent="ChickenMan/Hip"] +use_parent_material = true +position = Vector2( -9.49483, 5.9499 ) +rotation = -0.0114762 +scale = Vector2( 2.33905, 2.82204 ) +texture = ExtResource( 11 ) +offset = Vector2( -7.02542, -13.2616 ) + +[node name="Body" type="Sprite" parent="ChickenMan/Hip"] +use_parent_material = true +position = Vector2( -1, 1 ) +rotation = 1.55932 +scale = Vector2( 2.33213, 2.33905 ) +texture = ExtResource( 9 ) +offset = Vector2( -14.8861, -10.6454 ) +flip_v = true + +[node name="BackArm" type="Node2D" parent="ChickenMan/Hip/Body"] +use_parent_material = true +position = Vector2( -15.0905, 7.09585 ) +rotation = -1.55929 +scale = Vector2( 0.427524, 0.428792 ) +z_index = -2 +script = ExtResource( 12 ) +texture = ExtResource( 13 ) +segments = 4 +target = NodePath("HandBack") + +[node name="HandBack" type="Sprite" parent="ChickenMan/Hip/Body/BackArm"] +use_parent_material = true +position = Vector2( -34, 6 ) +rotation = -1.7931 +texture = ExtResource( 14 ) +offset = Vector2( 0, -6 ) +region_enabled = true +region_rect = Rect2( 0, 0, 16, 12 ) + +[node name="FrontArm" type="Node2D" parent="ChickenMan/Hip/Body"] +use_parent_material = true +position = Vector2( -15.3626, -6.5891 ) +rotation = -1.55929 +scale = Vector2( 0.427524, 0.428792 ) +z_index = 2 +script = ExtResource( 12 ) +texture = ExtResource( 13 ) +segments = 4 +target = NodePath("HandFront") + +[node name="HandFront" type="Sprite" parent="ChickenMan/Hip/Body/FrontArm"] +use_parent_material = true +position = Vector2( -31.9996, 22.0018 ) +rotation = -2.09213 +texture = ExtResource( 14 ) +offset = Vector2( 0, -6 ) +region_enabled = true +region_rect = Rect2( 0, 0, 16, 12 ) + +[node name="Neck" type="Sprite" parent="ChickenMan/Hip/Body"] +show_behind_parent = true +use_parent_material = true +position = Vector2( -25.8929, -8.09683 ) +rotation = -2.40547 +scale = Vector2( 1.3366, 1.4288 ) +z_index = 1 +texture = ExtResource( 10 ) +offset = Vector2( -12.5338, -3.19571 ) + +[node name="BreathParticles" type="CPUParticles2D" parent="ChickenMan/Hip/Body/Neck"] +position = Vector2( 2.97876, -8.17331 ) +rotation = 0.437951 +scale = Vector2( 0.724233, 0.497597 ) +z_index = -1 +emitting = false +amount = 80 +lifetime = 2.0 +lifetime_randomness = 0.5 +local_coords = false +draw_order = 1 +texture = ExtResource( 15 ) +emission_shape = 2 +emission_rect_extents = Vector2( 0, 0 ) +direction = Vector2( -1, 0 ) +spread = 5.0 +gravity = Vector2( 0, 0 ) +initial_velocity = 230.0 +initial_velocity_random = 0.25 +angular_velocity = 360.0 +angular_velocity_random = 1.0 +tangential_accel = 100.0 +tangential_accel_random = 1.0 +damping = 350.0 +angle = 720.0 +angle_random = 1.0 +scale_amount = 4.0 +scale_amount_random = 0.5 +scale_amount_curve = SubResource( 8 ) +color_ramp = SubResource( 9 ) + +[node name="Headlower" type="Sprite" parent="ChickenMan/Hip/Body/Neck"] +use_parent_material = true +position = Vector2( 6.09458, -5.24508 ) +rotation = 0.964506 +scale = Vector2( 0.72205, 0.726798 ) +z_index = 1 +texture = ExtResource( 8 ) +offset = Vector2( -23.6288, 1.97347 ) + +[node name="Headupper" type="Sprite" parent="ChickenMan/Hip/Body/Neck"] +use_parent_material = true +position = Vector2( 6.70938, -6.04151 ) +rotation = 0.801398 +scale = Vector2( 0.72205, 0.49751 ) +z_index = 1 +texture = ExtResource( 9 ) +offset = Vector2( -21.4816, 1.20875 ) + +[node name="Eye" type="Sprite" parent="ChickenMan/Hip/Body/Neck/Headupper"] +use_parent_material = true +position = Vector2( -22.5774, -9.61752 ) +texture = ExtResource( 7 ) +offset = Vector2( 20.9715, 12.1291 ) + +[node name="LegFront" type="Sprite" parent="ChickenMan/Hip"] +use_parent_material = true +position = Vector2( 12.9916, 6.2433 ) +rotation = -0.0114762 +scale = Vector2( 2.33905, 2.82204 ) +texture = ExtResource( 11 ) +offset = Vector2( -6.66188, -13.4386 ) + +[node name="StateChart" type="Node" parent="."] +script = ExtResource( 3 ) + +[node name="Root" type="Node" parent="StateChart"] +script = ExtResource( 4 ) +initial_state = NodePath("Roar") + +[node name="On StartPush" type="Node" parent="StateChart/Root"] +script = ExtResource( 6 ) +to = NodePath("../PushedBack") +event = "start_push" + +[node name="Roar" type="Node" parent="StateChart/Root"] +script = ExtResource( 5 ) + +[node name="On RoarDone" type="Node" parent="StateChart/Root/Roar"] +script = ExtResource( 6 ) +to = NodePath("../../Chasing") +event = "roar_done" + +[node name="Chasing" type="Node" parent="StateChart/Root"] +script = ExtResource( 5 ) + +[node name="On Cooldown" type="Node" parent="StateChart/Root/Chasing"] +script = ExtResource( 6 ) +to = NodePath("../../Shooting") +delay = 2.0 + +[node name="On InRange" type="Node" parent="StateChart/Root/Chasing"] +script = ExtResource( 6 ) +to = NodePath("../../Punching") +event = "in_range" + +[node name="Punching" type="Node" parent="StateChart/Root"] +script = ExtResource( 5 ) + +[node name="On OutOfRange" type="Node" parent="StateChart/Root/Punching"] +script = ExtResource( 6 ) +to = NodePath("../../PunchCooldown") +event = "out_of_range" + +[node name="PunchCooldown" type="Node" parent="StateChart/Root"] +script = ExtResource( 5 ) + +[node name="On Cooldown" type="Node" parent="StateChart/Root/PunchCooldown"] +script = ExtResource( 6 ) +delay = 0.5 + +[node name="Shooting" type="Node" parent="StateChart/Root"] +script = ExtResource( 5 ) + +[node name="On ShootDone" type="Node" parent="StateChart/Root/Shooting"] +script = ExtResource( 6 ) +to = NodePath("../../Chasing") +event = "shoot_done" + +[node name="PushedBack" type="Node" parent="StateChart/Root"] +script = ExtResource( 5 ) + +[node name="On StopPush" type="Node" parent="StateChart/Root/PushedBack"] +script = ExtResource( 6 ) +to = NodePath("../../Roar") +event = "stop_push" + +[node name="Dying" type="Node" parent="StateChart/Root"] +script = ExtResource( 5 ) + +[node name="InRangeCast" type="RayCast2D" parent="."] +position = Vector2( 0, -64 ) enabled = true -cast_to = Vector2( -120, 0 ) +cast_to = Vector2( -48, 0 ) collision_mask = 4 collide_with_areas = true collide_with_bodies = false -[node name="ChaseCast" type="RayCast2D" parent="."] -position = Vector2( 0, -16 ) +[node name="OutRangeCast" type="RayCast2D" parent="."] +position = Vector2( 0, -72 ) enabled = true -cast_to = Vector2( -80, 0 ) +cast_to = Vector2( -64, 0 ) collision_mask = 4 collide_with_areas = true collide_with_bodies = false + +[node name="ShootRangeCast" type="RayCast2D" parent="."] +position = Vector2( 0, -80 ) +enabled = true +cast_to = Vector2( -192, 0 ) +collision_mask = 4 +collide_with_areas = true +collide_with_bodies = false + +[connection signal="state_entered" from="StateChart/Root/Roar" to="." method="_on_Roar_state_entered" flags=3] +[connection signal="state_entered" from="StateChart/Root/Chasing" to="." method="_on_Chasing_state_entered"] +[connection signal="state_physics_processing" from="StateChart/Root/Chasing" to="." method="_on_Chasing_state_physics_processing"] +[connection signal="state_entered" from="StateChart/Root/Punching" to="." method="_on_Punching_state_entered"] +[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 afac272..ae170fa 100644 --- a/objects/enemy/boss/sg2083.gd +++ b/objects/enemy/boss/sg2083.gd @@ -1,17 +1,19 @@ extends Node2D -enum State {STAND, FORWARD, BACK, DUCK, BEAM} +enum State {STAND, FORWARD, BACK, DUCK, BEAM, DEAD} const Bullet = preload("res://objects/enemy/2600_bullet.tscn") const SmallExplosion = preload("res://objects/enemy/boss/2600_small_explosion.tscn") +export var hp: float = 100.0 export var shot_speed: float = 50.0 export var move_speed: float = 30.0 export var safe_from_breath: bool = false export var make_explosions: bool = false export var explosion_rect: Rect2 +export var famira_path: NodePath var state: int = State.STAND @@ -24,6 +26,8 @@ onready var head_sprite = $"%Head" func _physics_process(delta: float) -> void: match state: + State.DEAD: + return State.STAND: if Input.is_action_pressed("move_down"): state = State.DUCK @@ -44,17 +48,16 @@ func _physics_process(delta: float) -> void: func _input(event: InputEvent) -> void: - + if state == State.DEAD: + return if event.is_action_pressed("shoot") and (state == State.STAND or state == State.FORWARD or state == State.BACK): shoot() if event.is_action_pressed("jump") and state == State.STAND: beam() - if event.is_action_pressed("move_up"): - anims.play("die") func shoot() -> void: - Audio.play_sound(Audio.a_bullet_barrage,Audio.ac_boss) + Audio.play_sound(Audio.a_bullet_barrage,Audio.ac_collectible) for pos in bullet_positions.get_children(): var bullet = Bullet.instance() bullet.global_position = pos.global_position @@ -68,18 +71,32 @@ func beam() -> void: anims.play("Beam") +func hurt(amount: float, can_duck: bool = false) -> void: + if can_duck and state == State.DUCK: + return + hp -= amount + if state != State.DEAD and hp <= 0.0: + state = State.DEAD + anims.play("die") + + func _play_laser_sound(play: bool): + var famira = get_node(famira_path) if play: - Audio.play_sound(Audio.a_rainbow_laser,Audio.ac_boss) + if famira.has_method("start_push"): + famira.start_push() + Audio.play_sound(Audio.a_rainbow_laser,Audio.ac_collectible) else: - Audio.ac_boss.playing = false + if famira.has_method("stop_push"): + famira.stop_push() + Audio.ac_collectible.playing = false func _play_charge_sound(play: bool): if play: - Audio.play_sound(Audio.a_2600_charge,Audio.ac_boss) + Audio.play_sound(Audio.a_2600_charge,Audio.ac_collectible) else: - Audio.ac_boss.playing = false + Audio.ac_collectible.playing = false func _spawn_explosions() -> void: @@ -106,3 +123,5 @@ func _on_animation_finished(anim_name: String) -> void: state = State.STAND "Beam": state = State.STAND + "die": + pass diff --git a/objects/enemy/boss/sg2083.tscn b/objects/enemy/boss/sg2083.tscn index 1a4955c..38311dc 100644 --- a/objects/enemy/boss/sg2083.tscn +++ b/objects/enemy/boss/sg2083.tscn @@ -1292,7 +1292,7 @@ tracks/1/keys = { } [sub_resource type="RectangleShape2D" id=26] -extents = Vector2( 33.5, 76 ) +extents = Vector2( 42, 76 ) [node name="2083" type="Node2D"] z_index = 5 @@ -1644,7 +1644,7 @@ collision_mask = 0 monitoring = false [node name="CollisionShape2D" type="CollisionShape2D" parent="DetectionBox"] -position = Vector2( 53.5, 92 ) +position = Vector2( 62, 92 ) shape = SubResource( 26 ) [connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_animation_finished"] diff --git a/project.godot b/project.godot index 1fdae6a..b78cbab 100644 --- a/project.godot +++ b/project.godot @@ -14,6 +14,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://addons/godot_state_charts/atomic_state.gd" }, { +"base": "Node2D", +"class": "BallSnake", +"language": "GDScript", +"path": "res://scripts/ball_snake.gd" +}, { "base": "State", "class": "CompoundState", "language": "GDScript", @@ -56,6 +61,7 @@ _global_script_classes=[ { } ] _global_script_class_icons={ "AtomicState": "res://addons/godot_state_charts/atomic_state.svg", +"BallSnake": "", "CompoundState": "res://addons/godot_state_charts/compound_state.svg", "LevelEntry": "", "ParallelState": "res://addons/godot_state_charts/parallel_state.svg", diff --git a/scripts/ball_snake.gd b/scripts/ball_snake.gd new file mode 100644 index 0000000..caba971 --- /dev/null +++ b/scripts/ball_snake.gd @@ -0,0 +1,29 @@ +tool +class_name BallSnake +extends Node2D + + +export var texture: Texture +export var segments: int = 1 +export var target: NodePath +export var end_pieces: bool = true + + +func _process(delta: float) -> void: + update() + + +func _draw() -> void: + var node := get_node(target) as Node2D + if node: + if end_pieces: + draw_texture(texture, texture.get_size() * -0.5) + var end_pos := to_local(node.global_position) + for i in segments: + var weight := 1.0 / float(segments + 1) * float(i + 1) + draw_texture( + texture, + lerp(Vector2.ZERO, end_pos, weight) + texture.get_size() * -0.5 + ) + if end_pieces: + draw_texture(texture, end_pos + texture.get_size() * -0.5)