From 75a5130121c65e298f76d822a7600f1a32cc7581 Mon Sep 17 00:00:00 2001 From: Paul Norberger Date: Mon, 20 Apr 2020 17:52:21 +0200 Subject: [PATCH] Progress on the boss --- src/Boss/SlimeBoss/SlimeBoss.tscn | 546 +++++++++++++++--- src/Boss/SlimeBoss/SlimeBossStateMachine.gd | 73 ++- src/Boss/SlimeBoss/States/BossState.gd | 50 +- src/Boss/SlimeBoss/States/Charge/Prepare.gd | 17 +- src/Boss/SlimeBoss/States/Charge/Sprint.gd | 14 +- src/Boss/SlimeBoss/States/FightStart.gd | 2 - src/Boss/SlimeBoss/States/ReturnToCenter.gd | 21 + .../States/Roam/MoveToRandomPosition.gd | 17 +- src/Boss/SlimeBoss/States/Stomp.gd | 18 + src/Boss/SlimeBoss/States/{Roam => }/Wait.gd | 2 - src/Effects/Charge/ChargeEffect.tscn | 20 + src/Effects/Charge/charge.png | Bin 0 -> 143 bytes src/Effects/Charge/charge.png.import | 34 ++ src/Overlap/Stats/Stats.gd | 3 + src/World.tscn | 6 +- 15 files changed, 671 insertions(+), 152 deletions(-) create mode 100644 src/Boss/SlimeBoss/States/ReturnToCenter.gd create mode 100644 src/Boss/SlimeBoss/States/Stomp.gd rename src/Boss/SlimeBoss/States/{Roam => }/Wait.gd (66%) create mode 100644 src/Effects/Charge/ChargeEffect.tscn create mode 100644 src/Effects/Charge/charge.png create mode 100644 src/Effects/Charge/charge.png.import diff --git a/src/Boss/SlimeBoss/SlimeBoss.tscn b/src/Boss/SlimeBoss/SlimeBoss.tscn index 6084cb4..585d874 100644 --- a/src/Boss/SlimeBoss/SlimeBoss.tscn +++ b/src/Boss/SlimeBoss/SlimeBoss.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=31 format=2] +[gd_scene load_steps=36 format=2] [ext_resource path="res://Overlap/HurtHit_Box/Hurtbox.tscn" type="PackedScene" id=1] [ext_resource path="res://Overlap/HurtHit_Box/Hitbox.tscn" type="PackedScene" id=2] @@ -7,13 +7,22 @@ [ext_resource path="res://Boss/SlimeBoss/Animations/move_down.png" type="Texture" id=5] [ext_resource path="res://Boss/SlimeBoss/Animations/move_right.png" type="Texture" id=6] [ext_resource path="res://Boss/SlimeBoss/States/Roam/RoamSequence.gd" type="Script" id=7] -[ext_resource path="res://Boss/SlimeBoss/States/Roam/Wait.gd" type="Script" id=8] +[ext_resource path="res://Boss/SlimeBoss/States/Wait.gd" type="Script" id=8] [ext_resource path="res://Boss/SlimeBoss/States/FightStart.gd" type="Script" id=9] [ext_resource path="res://Boss/SlimeBoss/Animations/move_down_angry.png" type="Texture" id=10] [ext_resource path="res://Boss/SlimeBoss/Animations/move_up.png" type="Texture" id=11] [ext_resource path="res://Boss/SlimeBoss/States/Roam/MoveToRandomPosition.gd" type="Script" id=12] [ext_resource path="res://Overlap/Kind.tscn" type="PackedScene" id=13] [ext_resource path="res://Boss/SlimeBoss/HeroCloseZone.gd" type="Script" id=14] +[ext_resource path="res://Overlap/StateMachine/SequenceState.gd" type="Script" id=15] +[ext_resource path="res://Boss/SlimeBoss/States/Charge/Prepare.gd" type="Script" id=16] +[ext_resource path="res://Boss/SlimeBoss/States/Charge/Sprint.gd" type="Script" id=17] +[ext_resource path="res://Effects/Charge/ChargeEffect.tscn" type="PackedScene" id=18] +[ext_resource path="res://Boss/SlimeBoss/States/ReturnToCenter.gd" type="Script" id=19] +[ext_resource path="res://Boss/SlimeBoss/States/Stomp.gd" type="Script" id=20] + +[sub_resource type="CircleShape2D" id=15] +radius = 60.0 [sub_resource type="CapsuleShape2D" id=1] radius = 18.0 @@ -31,7 +40,391 @@ radius = 8.0 height = 32.0 [sub_resource type="Animation" id=5] -resource_name = "FightStart" +resource_name = "ChargeDown" +length = 0.45 +step = 0.025 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.45 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ ExtResource( 5 ), ExtResource( 5 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:vframes") +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": 1, +"values": [ 10 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Sprite:hframes") +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": 1, +"values": [ 24 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Sprite:position") +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": 1, +"values": [ Vector2( 0, -28 ) ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Sprite:flip_h") +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": 1, +"values": [ false ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Sprite:frame") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25, 0.275, 0.3, 0.325, 0.35, 0.375, 0.4, 0.425 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 0, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1 ] +} + +[sub_resource type="Animation" id=6] +resource_name = "ChargeLeft" +length = 0.45 +step = 0.025 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.45 ), +"transitions": PoolRealArray( 2, 2 ), +"update": 0, +"values": [ ExtResource( 6 ), ExtResource( 6 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:vframes") +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": 1, +"values": [ 7 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Sprite:hframes") +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": 1, +"values": [ 11 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Sprite:position") +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": 1, +"values": [ Vector2( 5, -28 ) ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Sprite:flip_h") +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": 1, +"values": [ true ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Sprite:frame") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25, 0.275, 0.3, 0.325, 0.35, 0.375, 0.4, 0.425 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 0, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1 ] +} + +[sub_resource type="Animation" id=7] +resource_name = "ChargeRight" +length = 0.45 +step = 0.025 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.45 ), +"transitions": PoolRealArray( 2, 2 ), +"update": 0, +"values": [ ExtResource( 6 ), ExtResource( 6 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:vframes") +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": 1, +"values": [ 7 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Sprite:hframes") +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": 1, +"values": [ 11 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Sprite:position") +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": 1, +"values": [ Vector2( -5, -28 ) ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Sprite:flip_h") +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": 1, +"values": [ false ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Sprite:frame") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25, 0.275, 0.3, 0.325, 0.35, 0.375, 0.4, 0.425 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 0, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1 ] +} + +[sub_resource type="Animation" id=8] +resource_name = "ChargeUp" +length = 0.45 +step = 0.025 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.45 ), +"transitions": PoolRealArray( 36.7583, 36.7583 ), +"update": 0, +"values": [ ExtResource( 11 ), ExtResource( 11 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:vframes") +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": 1, +"values": [ 7 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Sprite:hframes") +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": 1, +"values": [ 11 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Sprite:position") +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": 1, +"values": [ Vector2( 0, -28 ) ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Sprite:flip_h") +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": 1, +"values": [ false ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Sprite:frame") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25, 0.275, 0.3, 0.325, 0.35, 0.375, 0.4, 0.425 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 0, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1 ] +} + +[sub_resource type="Animation" id=9] +resource_name = "Charging" +length = 1.9 +step = 0.025 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.175, 0.3, 0.65, 0.775, 1.05, 1.9 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ ExtResource( 5 ), ExtResource( 10 ), ExtResource( 5 ), ExtResource( 10 ), ExtResource( 5 ), ExtResource( 10 ), ExtResource( 5 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Sprite:vframes") +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": 1, +"values": [ 10 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Sprite:hframes") +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": 1, +"values": [ 24 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Sprite:position") +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": 1, +"values": [ Vector2( 0, -28 ) ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Sprite:flip_h") +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": 1, +"values": [ false ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Sprite:frame") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25, 0.275, 0.3, 0.325, 0.35, 0.375, 0.4, 0.425, 0.45, 0.475, 0.5, 0.525, 0.55, 0.575, 0.6, 0.625, 0.65, 0.675, 0.7, 0.725, 0.75, 0.775, 0.8, 0.825, 0.85, 0.875, 0.9, 0.925, 0.95, 0.975, 1, 1.025, 1.05, 1.075, 1.1, 1.125, 1.15, 1.175, 1.2, 1.225, 1.25, 1.275, 1.3, 1.325, 1.35, 1.375, 1.4, 1.425, 1.45, 1.475, 1.5, 1.525, 1.55, 1.575, 1.6, 1.625, 1.65, 1.675, 1.7, 1.725, 1.75, 1.775, 1.8, 1.825, 1.85, 1.875 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 0, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ] +} + +[sub_resource type="Animation" id=10] length = 1.9 step = 0.025 tracks/0/type = "value" @@ -107,9 +500,8 @@ tracks/5/keys = { "values": [ 0, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ] } -[sub_resource type="Animation" id=6] +[sub_resource type="Animation" id=11] length = 2.66666 -loop = true step = 0.0111111 tracks/0/type = "value" tracks/0/path = NodePath("Sprite:frame") @@ -130,10 +522,10 @@ tracks/1/loop_wrap = true tracks/1/imported = false tracks/1/enabled = true tracks/1/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ ExtResource( 5 ) ] +"times": PoolRealArray( 0, 2.66666 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ ExtResource( 5 ), ExtResource( 5 ) ] } tracks/2/type = "value" tracks/2/path = NodePath("Sprite:vframes") @@ -184,9 +576,8 @@ tracks/5/keys = { "values": [ false ] } -[sub_resource type="Animation" id=7] +[sub_resource type="Animation" id=12] length = 1.28333 -loop = true step = 0.0166667 tracks/0/type = "value" tracks/0/path = NodePath("Sprite:frame") @@ -207,10 +598,10 @@ tracks/1/loop_wrap = true tracks/1/imported = false tracks/1/enabled = true tracks/1/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ ExtResource( 6 ) ] +"times": PoolRealArray( 0, 1.28333 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ ExtResource( 6 ), ExtResource( 6 ) ] } tracks/2/type = "value" tracks/2/path = NodePath("Sprite:vframes") @@ -261,9 +652,8 @@ tracks/5/keys = { "values": [ true ] } -[sub_resource type="Animation" id=8] +[sub_resource type="Animation" id=13] length = 1.28333 -loop = true step = 0.0166667 tracks/0/type = "value" tracks/0/path = NodePath("Sprite:frame") @@ -284,10 +674,10 @@ tracks/1/loop_wrap = true tracks/1/imported = false tracks/1/enabled = true tracks/1/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ ExtResource( 6 ) ] +"times": PoolRealArray( 0, 1.28334 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ ExtResource( 6 ), ExtResource( 6 ) ] } tracks/2/type = "value" tracks/2/path = NodePath("Sprite:vframes") @@ -338,9 +728,8 @@ tracks/5/keys = { "values": [ false ] } -[sub_resource type="Animation" id=9] +[sub_resource type="Animation" id=14] length = 1.28333 -loop = true step = 0.0166667 tracks/0/type = "value" tracks/0/path = NodePath("Sprite:texture") @@ -349,10 +738,10 @@ tracks/0/loop_wrap = true tracks/0/imported = false tracks/0/enabled = true tracks/0/keys = { -"times": PoolRealArray( 0 ), -"transitions": PoolRealArray( 1 ), -"update": 1, -"values": [ ExtResource( 11 ) ] +"times": PoolRealArray( 0, 1.28334 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ ExtResource( 11 ), ExtResource( 11 ) ] } tracks/1/type = "value" tracks/1/path = NodePath("Sprite:vframes") @@ -415,37 +804,6 @@ tracks/5/keys = { "values": [ Vector2( 0, -28 ) ] } -[sub_resource type="AnimationNodeAnimation" id=10] -animation = "MoveRight" - -[sub_resource type="AnimationNodeAnimation" id=11] -animation = "MoveUp" - -[sub_resource type="AnimationNodeAnimation" id=12] -animation = "MoveDown" - -[sub_resource type="AnimationNodeAnimation" id=13] -animation = "MoveLeft" - -[sub_resource type="AnimationNodeBlendSpace2D" id=14] -blend_point_0/node = SubResource( 10 ) -blend_point_0/pos = Vector2( 1, 0 ) -blend_point_1/node = SubResource( 11 ) -blend_point_1/pos = Vector2( 0, -1.1 ) -blend_point_2/node = SubResource( 12 ) -blend_point_2/pos = Vector2( 0, 1.1 ) -blend_point_3/node = SubResource( 13 ) -blend_point_3/pos = Vector2( -1, 0 ) -min_space = Vector2( -1, -1.1 ) -max_space = Vector2( 1, 1.1 ) -blend_mode = 1 - -[sub_resource type="AnimationNodeStateMachine" id=15] -states/move/node = SubResource( 14 ) -states/move/position = Vector2( 143, 70 ) - -[sub_resource type="AnimationNodeStateMachinePlayback" id=16] - [node name="SlimeBoss" type="KinematicBody2D"] collision_layer = 4 collision_mask = 3 @@ -456,6 +814,12 @@ __meta__ = { [node name="Kind" parent="." instance=ExtResource( 13 )] +[node name="Effects" type="Node2D" parent="."] + +[node name="ChargeEffect" parent="Effects" instance=ExtResource( 18 )] +position = Vector2( 0, -8 ) +emitting = false + [node name="Stats" parent="." instance=ExtResource( 3 )] max_health = 3 @@ -476,15 +840,49 @@ one_shot = true [node name="MoveToRandomPosition" type="Node" parent="States/RoamSequence"] script = ExtResource( 12 ) +[node name="Timer" type="Timer" parent="States/RoamSequence/MoveToRandomPosition"] +one_shot = true + +[node name="ChargeSequence" type="Node" parent="States"] +script = ExtResource( 15 ) + +[node name="Charge" type="Node" parent="States/ChargeSequence"] +script = ExtResource( 16 ) + +[node name="Timer" type="Timer" parent="States/ChargeSequence/Charge"] +wait_time = 0.8 +one_shot = true + +[node name="Sprint" type="Node" parent="States/ChargeSequence"] +script = ExtResource( 17 ) + +[node name="Wait" type="Node" parent="States/ChargeSequence"] +script = ExtResource( 8 ) + +[node name="Timer" type="Timer" parent="States/ChargeSequence/Wait"] +wait_time = 0.25 +one_shot = true + +[node name="ReturnToCenter" type="Node" parent="States"] +script = ExtResource( 19 ) + +[node name="Stomp" type="Node" parent="States"] +script = ExtResource( 20 ) + [node name="Sprite" type="Sprite" parent="."] -position = Vector2( -5, -28 ) +position = Vector2( 5, -28 ) texture = ExtResource( 6 ) +flip_h = true vframes = 7 hframes = 11 -frame = 50 + +[node name="StompHitbox" parent="." instance=ExtResource( 2 )] + +[node name="CollisionShape2D" parent="StompHitbox" index="0"] +shape = SubResource( 15 ) +disabled = true [node name="Hitbox" parent="." instance=ExtResource( 2 )] -visible = false collision_layer = 4 [node name="CollisionShape2D" parent="Hitbox" index="0"] @@ -512,6 +910,7 @@ rotation = 1.5708 shape = SubResource( 4 ) [node name="DebugLabel" type="Label" parent="."] +visible = false margin_left = -42.2456 margin_top = -65.04 margin_right = 42.7544 @@ -523,22 +922,23 @@ __meta__ = { [node name="AnimationPlayer" type="AnimationPlayer" parent="."] autoplay = "MoveRight" -anims/FightStart = SubResource( 5 ) -anims/MoveDown = SubResource( 6 ) -anims/MoveLeft = SubResource( 7 ) -anims/MoveRight = SubResource( 8 ) -anims/MoveUp = SubResource( 9 ) - -[node name="AnimationTree" type="AnimationTree" parent="."] -tree_root = SubResource( 15 ) -anim_player = NodePath("../AnimationPlayer") -active = true -parameters/playback = SubResource( 16 ) -parameters/move/blend_position = Vector2( 0.210872, 0.275 ) +anims/ChargeDown = SubResource( 5 ) +anims/ChargeLeft = SubResource( 6 ) +anims/ChargeRight = SubResource( 7 ) +anims/ChargeUp = SubResource( 8 ) +anims/Charging = SubResource( 9 ) +anims/FightStart = SubResource( 10 ) +anims/MoveDown = SubResource( 11 ) +anims/MoveLeft = SubResource( 12 ) +anims/MoveRight = SubResource( 13 ) +anims/MoveUp = SubResource( 14 ) +[connection signal="health_changed" from="Stats" to="." method="_on_Stats_health_changed"] [connection signal="no_health" from="Stats" to="." method="_on_Stats_no_health"] [connection signal="area_entered" from="Hurtbox" to="." method="_on_Hurtbox_area_entered"] [connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_animation_finished"] +[editable path="StompHitbox"] + [editable path="Hitbox"] [editable path="Hurtbox"] diff --git a/src/Boss/SlimeBoss/SlimeBossStateMachine.gd b/src/Boss/SlimeBoss/SlimeBossStateMachine.gd index 8339fd4..51479b2 100644 --- a/src/Boss/SlimeBoss/SlimeBossStateMachine.gd +++ b/src/Boss/SlimeBoss/SlimeBossStateMachine.gd @@ -1,6 +1,5 @@ extends KinematicBody2D -onready var animation_playback = $AnimationTree.get("parameters/playback") signal target_position_changed signal state_changed(new_state_name) signal phase_changed(new_phase_name) @@ -8,7 +7,7 @@ signal phase_changed(new_phase_name) export(float) var MASS = 8.0 onready var start_global_position = global_position -var target_position = Vector2() +var last_look = Vector2() var state_active = null var sequence_cycles = 0 @@ -26,7 +25,7 @@ func _ready(): if get_parent().has_node('Player'): var player_node = get_parent().get_node('Player') player_node.connect('position_changed', self, '_on_target_position_changed') - target_position = player_node.global_position + # target_position = player_node.global_position for state_node in $States.get_children(): state_node.connect('finished', self, '_on_active_state_finished') @@ -51,6 +50,15 @@ func _on_Stats_no_health(): set_invincible(true) go_to_next_state($States/Die) +func _on_Stats_health_changed(new_health): + assert(new_health > -1) + assert(new_health < $Stats.max_health) + + if _phase == PHASES.PHASE_ONE and new_health == 2: + _change_phase(PHASES.PHASE_TWO) + if _phase == PHASES.PHASE_TWO and new_health == 1: + _change_phase(PHASES.PHASE_THREE) + func go_to_next_state(state_override=null): if state_active: @@ -63,18 +71,6 @@ func go_to_next_state(state_override=null): emit_signal("state_changed", state_active.name) state_active.enter() - -func _on_Health_health_changed(new_health): - $Tween.interpolate_property($Pivot, 'scale', Vector2(0.92, 1.12), Vector2(1.0, 1.0), 0.3, Tween.TRANS_ELASTIC, Tween.EASE_IN_OUT) - $Tween.interpolate_property($Pivot/Body, 'modulate', Color('#ff48de'), Color('#ffffff'), 0.2, Tween.TRANS_QUINT, Tween.EASE_IN) - $Tween.start() - - if _phase == PHASES.PHASE_ONE and new_health < 100: - _change_phase(PHASES.PHASE_TWO) - if _phase == PHASES.PHASE_TWO and new_health < 50: - _change_phase(PHASES.PHASE_THREE) - - func _change_phase(new_phase): var phase_name = "" match new_phase: @@ -92,20 +88,35 @@ func _change_phase(new_phase): _phase = new_phase -# The AI's brain. This function defines the flow of states -# That's a big advantage of the state pattern -# If it grows too big you can swap it with a node -# Or move the flow of states to a data file, like JSON or a text file +var angry_phases_done = 0 + func _decide_on_next_state(): # Battle start if state_active == null: set_invincible(true) return $States/FightStart if state_active == $States/FightStart: - set_invincible(false) - return $States/RoamSequence - if state_active == $States/RoamSequence: - return $States/FightStart + # set_invincible(false) + return $States/ChargeSequence + + if _phase == PHASES.PHASE_ONE: + if angry_phases_done < 1: + set_invincible(true) + sequence_cycles += 1 + if sequence_cycles < 4: + return $States/ChargeSequence + else: + angry_phases_done = 1 + sequence_cycles = 0 + return $States/ReturnToCenter + else: + if state_active == $States/ReturnToCenter: + return $States/Stomp # TODO: Maybe Stomp. + if state_active == $States/Stomp: + set_invincible(false) + return $States/RoamSequence + if state_active == $States/RoamSequence: + return $States/RoamSequence # # Death # if state_active == $States/Die: @@ -159,23 +170,11 @@ func _decide_on_next_state(): # return $States/Stomp -# Using a public method makes it so we can change the entire particle setup anytime -func set_particles_active(value): - $DustPuffsLarge.emitting = value - - -# Same thing here, we will likely need more collision shapes in the final version -# So using a function we can group these disabled toggles together func set_invincible(value): - $CollisionShape2D.disabled = value - $Hitbox/CollisionShape2D.disabled = value + # $CollisionShape2D.disabled = value + # $Hitbox/CollisionShape2D.disabled = value $Hurtbox/CollisionShape2D.disabled = value - -func _on_target_position_changed(new_position): - target_position = new_position - - func _on_Hurtbox_area_entered(area): $Stats.health -= area.damage diff --git a/src/Boss/SlimeBoss/States/BossState.gd b/src/Boss/SlimeBoss/States/BossState.gd index 2a6120a..4486d0d 100644 --- a/src/Boss/SlimeBoss/States/BossState.gd +++ b/src/Boss/SlimeBoss/States/BossState.gd @@ -1,20 +1,42 @@ extends "res://Overlap/StateMachine/State.gd" onready var animation_player = owner.get_node("AnimationPlayer") -onready var animation_tree = owner.get_node("AnimationTree") -onready var animation_playback = animation_tree.get("parameters/playback") -var _animation_type = ANIMATION_TYPE.TREE - -enum ANIMATION_TYPE { - PLAYER, - TREE -} - -func set_animation_type(val): - print("wow") - _animation_type = val - animation_player.playback_active = _animation_type == ANIMATION_TYPE.PLAYER - animation_tree.active = _animation_type == ANIMATION_TYPE.TREE +func play_directional_animation(name, vec): + var anim_name = name + get_nearest_diretion(vec) + if animation_player.current_animation != anim_name: + animation_player.play(anim_name) +func get_base_anim_name(name): + var base_name = name[0] + for i in range(1, len(name)): + if name[i] == name[i].to_upper(): + return base_name + + base_name += name[i] + +func get_nearest_diretion(vec): + var directions = { + "Up": Vector2(0, -1.1), + "Down": Vector2(0, 1.1), + "Left": Vector2(-1.0, 0), + "Right": Vector2(1.0, 0) + } + + var nearest_direction = "Left" + var smallest_distance = 999999999 + + for direction in directions.keys(): + var vector = directions.get(direction) + var distance = vec.distance_to(vector) + + if distance < smallest_distance: + nearest_direction = direction + smallest_distance = distance + + return nearest_direction + + + + diff --git a/src/Boss/SlimeBoss/States/Charge/Prepare.gd b/src/Boss/SlimeBoss/States/Charge/Prepare.gd index d616208..ba0fe4e 100644 --- a/src/Boss/SlimeBoss/States/Charge/Prepare.gd +++ b/src/Boss/SlimeBoss/States/Charge/Prepare.gd @@ -1,7 +1,16 @@ -extends "res://Overlap/StateMachine/State.gd" +extends "res://Boss/SlimeBoss/States/BossState.gd" + +onready var charge_effect = owner.get_node("Effects/ChargeEffect") func enter(): - owner.get_node('AnimationPlayer').play('prepare') + charge_effect.emitting = true + animation_player.play('Charging') + $Timer.start() -func _on_animation_finished(anim_name): - emit_signal('finished') +func exit(): + charge_effect.emitting = false + $Timer.stop() + +func update(delta): + if $Timer.time_left <= 0.0: + emit_signal('finished') diff --git a/src/Boss/SlimeBoss/States/Charge/Sprint.gd b/src/Boss/SlimeBoss/States/Charge/Sprint.gd index 01f58fb..bd81bfd 100644 --- a/src/Boss/SlimeBoss/States/Charge/Sprint.gd +++ b/src/Boss/SlimeBoss/States/Charge/Sprint.gd @@ -1,23 +1,19 @@ extends "res://Boss/SlimeBoss/States/BossState.gd" -export(float) var SPEED = 1000.0 +export(float) var SPEED = 800.0 -var player_pos = owner.get_parent().get_node("Player").global_position var direction = Vector2() func enter(): - # Set animation - set_animation_type(ANIMATION_TYPE.TREE) - animation_playback.play("move") - + var player_pos = owner.get_parent().get_node("Player").global_position direction = (player_pos - owner.global_position).normalized() - owner.set_particles_active(true) func exit(): - owner.set_particles_active(false) + owner.last_look = direction func update(delta): - owner.move_and_slide(SPEED * direction) + var last_vel = owner.move_and_slide(SPEED * direction) + play_directional_animation("Move", last_vel) if owner.get_slide_count() > 0 or owner.position.x > 1800: emit_signal('finished') diff --git a/src/Boss/SlimeBoss/States/FightStart.gd b/src/Boss/SlimeBoss/States/FightStart.gd index a9fe892..a456fd1 100644 --- a/src/Boss/SlimeBoss/States/FightStart.gd +++ b/src/Boss/SlimeBoss/States/FightStart.gd @@ -1,8 +1,6 @@ extends "BossState.gd" func enter(): - animation_tree.active = false - animation_player.playback_active = true animation_player.play('FightStart') func _on_animation_finished(anim_name): diff --git a/src/Boss/SlimeBoss/States/ReturnToCenter.gd b/src/Boss/SlimeBoss/States/ReturnToCenter.gd new file mode 100644 index 0000000..2bdd65d --- /dev/null +++ b/src/Boss/SlimeBoss/States/ReturnToCenter.gd @@ -0,0 +1,21 @@ +extends "res://Boss/SlimeBoss/States/BossState.gd" + +export(float) var MASS = 4.0 +export(float) var SLOW_RADIUS = 200.0 +export(float) var MAX_SPEED = 300.0 +export(float) var ARRIVE_DISTANCE = 6.0 + +var velocity = Vector2.ZERO +var center = Vector2.ZERO + +func update(delta): + velocity = Steering.arrive_to(velocity, + owner.global_position, + owner.start_global_position, + MASS, + SLOW_RADIUS, + MAX_SPEED) + play_directional_animation("Move", velocity) + owner.move_and_slide(velocity) + if owner.global_position.distance_to(owner.start_global_position) < ARRIVE_DISTANCE: + emit_signal('finished') diff --git a/src/Boss/SlimeBoss/States/Roam/MoveToRandomPosition.gd b/src/Boss/SlimeBoss/States/Roam/MoveToRandomPosition.gd index 9f3870b..9e0db85 100644 --- a/src/Boss/SlimeBoss/States/Roam/MoveToRandomPosition.gd +++ b/src/Boss/SlimeBoss/States/Roam/MoveToRandomPosition.gd @@ -14,22 +14,23 @@ var velocity = Vector2() var last_vel = Vector2() func enter(): - # Set animation - set_animation_type(ANIMATION_TYPE.TREE) - animation_playback.start("move") - - time_since_start = 0 start_position = get_parent().start_position target_position = calculate_new_target_position() + $Timer.start() + +func exit(): + owner.last_look = last_vel + $Timer.stop() func update(delta): + # Set animation velocity = Steering.arrive_to(velocity, owner.global_position, target_position, MASS, SLOW_RADIUS, MAX_SPEED) - time_since_start += delta last_vel = owner.move_and_slide(velocity) - animation_tree.set("parameters/move/blend_position", last_vel) - if owner.global_position.distance_to(target_position) < ARRIVE_DISTANCE or time_since_start > 2.0: + play_directional_animation("Move", last_vel) + + if owner.global_position.distance_to(target_position) < ARRIVE_DISTANCE or $Timer.time_left <= 0.0: emit_signal('finished') diff --git a/src/Boss/SlimeBoss/States/Stomp.gd b/src/Boss/SlimeBoss/States/Stomp.gd new file mode 100644 index 0000000..963acc6 --- /dev/null +++ b/src/Boss/SlimeBoss/States/Stomp.gd @@ -0,0 +1,18 @@ +extends "res://Boss/SlimeBoss/States/BossState.gd" + +onready var stomp_hitbox = owner.get_node("StompHitbox/CollisionShape2D") + +func enter(): + stomp_hitbox.disabled = false + +func exit(): + stomp_hitbox.disabled = true + +func update(delta): + play_directional_animation("Charge", owner.last_look) + +func _on_animation_finished(anim_name): + anim_name = get_base_anim_name(anim_name) + assert(anim_name == "Charge") + + emit_signal("finished") diff --git a/src/Boss/SlimeBoss/States/Roam/Wait.gd b/src/Boss/SlimeBoss/States/Wait.gd similarity index 66% rename from src/Boss/SlimeBoss/States/Roam/Wait.gd rename to src/Boss/SlimeBoss/States/Wait.gd index 0bb9a9c..06f57bf 100644 --- a/src/Boss/SlimeBoss/States/Roam/Wait.gd +++ b/src/Boss/SlimeBoss/States/Wait.gd @@ -1,8 +1,6 @@ extends "res://Boss/SlimeBoss/States/BossState.gd" func enter(): - set_animation_type(ANIMATION_TYPE.PLAYER) - # owner.get_node('AnimationPlayer').play('idle') $Timer.start() func update(delta): diff --git a/src/Effects/Charge/ChargeEffect.tscn b/src/Effects/Charge/ChargeEffect.tscn new file mode 100644 index 0000000..7ceec79 --- /dev/null +++ b/src/Effects/Charge/ChargeEffect.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://Effects/Charge/charge.png" type="Texture" id=1] + +[sub_resource type="ParticlesMaterial" id=1] +emission_shape = 2 +emission_box_extents = Vector3( 50, 20, 1 ) +flag_disable_z = true +gravity = Vector3( 0, -40, 0 ) +orbit_velocity = 0.0 +orbit_velocity_random = 0.0 +tangential_accel = 80.0 +scale = 0.1 +scale_random = 1.0 + +[node name="ChargeEffect" type="Particles2D"] +amount = 20 +lifetime = 0.8 +process_material = SubResource( 1 ) +texture = ExtResource( 1 ) diff --git a/src/Effects/Charge/charge.png b/src/Effects/Charge/charge.png new file mode 100644 index 0000000000000000000000000000000000000000..5621cd59b77cdd0feaff9471ffe0d98b4a5f473c GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|JUv|;LnNm5 z_B(Pl7zi+{?>jF4<-v8`8{#+qAL-`KUU+GzA4g}!#$2IEEDI*AEn_&fvEF%G?cD9@ q8EfQj{(BOoa4juq!=^cRYZxjlOcp;eJ0K1;l)=;0&t;ucLK6Vy$};5u literal 0 HcmV?d00001 diff --git a/src/Effects/Charge/charge.png.import b/src/Effects/Charge/charge.png.import new file mode 100644 index 0000000..4d791f9 --- /dev/null +++ b/src/Effects/Charge/charge.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/charge.png-ac36c6bab3ea421fea437d8d775673a9.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Effects/Charge/charge.png" +dest_files=[ "res://.import/charge.png-ac36c6bab3ea421fea437d8d775673a9.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/src/Overlap/Stats/Stats.gd b/src/Overlap/Stats/Stats.gd index c651303..3501e89 100644 --- a/src/Overlap/Stats/Stats.gd +++ b/src/Overlap/Stats/Stats.gd @@ -7,6 +7,7 @@ export(float) var max_speed := 125.0 onready var speed := max_speed setget set_speed signal no_health +signal health_changed func set_health(value): if value > max_health: @@ -15,6 +16,8 @@ func set_health(value): health = value if health < 1: emit_signal("no_health") + + emit_signal("health_changed", health) func set_speed(value): if value > max_speed: diff --git a/src/World.tscn b/src/World.tscn index 9c0a259..56ca9d2 100644 --- a/src/World.tscn +++ b/src/World.tscn @@ -23,7 +23,7 @@ region_enabled = true region_rect = Rect2( 0, 0, 1280, 720 ) [node name="Background" parent="." instance=ExtResource( 7 )] -frame = 50 +frame = 5 [node name="FloorTileMap" type="TileMap" parent="."] visible = false @@ -45,14 +45,14 @@ __meta__ = { position = Vector2( 265.543, -16 ) [node name="Player" parent="YSort" instance=ExtResource( 1 )] -position = Vector2( 344, 125.768 ) +position = Vector2( 432, 168 ) scale = Vector2( 2, 2 ) debug = true ROLL_SPEED = 140 FRICTION = 200 [node name="SlimeBoss" parent="YSort" instance=ExtResource( 8 )] -position = Vector2( 104, 80 ) +position = Vector2( 240, 120 ) [node name="Grid" parent="." instance=ExtResource( 18 )]