Demo: Implement rounds, gameplay, and balance agents

This commit is contained in:
Serhii Snitsaruk 2024-02-04 22:39:37 +01:00
parent adc9490672
commit 22eea7be0e
29 changed files with 934 additions and 374 deletions

View File

@ -31,6 +31,13 @@ texture = ExtResource("2_bvbes")
[node name="HandR" parent="Root/Rig/Body" index="2"]
texture = ExtResource("2_bvbes")
[node name="WeaponNinjaStar" parent="Root" index="1"]
position = Vector2(-55, -76)
rotation = 0.0
[node name="Health" parent="." index="3"]
max_health = 3.0
[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
behavior_tree = ExtResource("3_tb7cx")
blackboard_plan = SubResource("BlackboardPlan_s08ac")

View File

@ -36,6 +36,12 @@ texture = ExtResource("2_y7pic")
[node name="HandR" parent="Root/Rig/Body" index="2"]
texture = ExtResource("2_y7pic")
[node name="Hitbox" parent="Root" index="2"]
damage = 2.0
[node name="Health" parent="." index="3"]
max_health = 8.0
[node name="BTPlayer" type="BTPlayer" parent="." index="4"]
behavior_tree = ExtResource("3_nacc3")
blackboard_plan = SubResource("BlackboardPlan_pmyhf")

View File

@ -31,8 +31,12 @@ texture = ExtResource("2_xd5s8")
[node name="HandR" parent="Root/Rig/Body" index="2"]
texture = ExtResource("2_xd5s8")
[node name="WeaponNinjaStar" parent="Root" index="1"]
position = Vector2(-55, -76)
rotation = 0.0
[node name="Health" parent="." index="3"]
max_health = 5.0
max_health = 4.0
[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
behavior_tree = ExtResource("3_furh3")

View File

@ -41,6 +41,13 @@ texture = ExtResource("2_w8tqw")
[node name="HandR" parent="Root/Rig/Body" index="2"]
texture = ExtResource("2_w8tqw")
[node name="WeaponNinjaStar" parent="Root" index="1"]
position = Vector2(-55, -76)
rotation = 0.0
[node name="Health" parent="." index="3"]
max_health = 7.0
[node name="BTPlayer" type="BTPlayer" parent="." index="4"]
behavior_tree = ExtResource("3_bhfkv")
blackboard_plan = SubResource("BlackboardPlan_vjbry")

View File

@ -31,6 +31,13 @@ texture = ExtResource("2_37lvn")
[node name="HandR" parent="Root/Rig/Body" index="2"]
texture = ExtResource("2_37lvn")
[node name="WeaponNinjaStar" parent="Root" index="1"]
position = Vector2(-55, -76)
rotation = 0.0
[node name="Health" parent="." index="3"]
max_health = 6.0
[node name="BTPlayer" type="BTPlayer" parent="." index="4"]
behavior_tree = ExtResource("3_f7r5w")
blackboard_plan = SubResource("BlackboardPlan_2kwy7")

View File

@ -37,8 +37,13 @@ texture = ExtResource("2_4rqld")
texture = ExtResource("2_4rqld")
[node name="WeaponNinjaStar" parent="Root" index="1"]
position = Vector2(-55, -76)
rotation = 0.0
scale = Vector2(0.999983, 0.999976)
[node name="Health" parent="." index="3"]
max_health = 6.0
[node name="BTPlayer" type="BTPlayer" parent="." index="4"]
behavior_tree = ExtResource("3_l805q")
blackboard_plan = SubResource("BlackboardPlan_67ric")

View File

@ -36,6 +36,13 @@ texture = ExtResource("2_e51r0")
[node name="HandR" parent="Root/Rig/Body" index="2"]
texture = ExtResource("2_e51r0")
[node name="WeaponNinjaStar" parent="Root" index="1"]
position = Vector2(-55, -76)
rotation = 0.0
[node name="Health" parent="." index="3"]
max_health = 6.0
[node name="BTPlayer" type="BTPlayer" parent="." index="4"]
behavior_tree = ExtResource("3_b8kcf")
blackboard_plan = SubResource("BlackboardPlan_tnf02")

View File

@ -31,6 +31,13 @@ texture = ExtResource("2_cb5f2")
[node name="HandR" parent="Root/Rig/Body" index="2"]
texture = ExtResource("2_cb5f2")
[node name="WeaponNinjaStar" parent="Root" index="1"]
position = Vector2(-55, -76)
rotation = 0.0
[node name="Health" parent="." index="3"]
max_health = 8.0
[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
behavior_tree = ExtResource("3_ebd57")
blackboard_plan = SubResource("BlackboardPlan_5sr4g")

View File

@ -10,6 +10,11 @@ var/speed/type = 3
var/speed/value = 300.0
var/speed/hint = 1
var/speed/hint_string = "10,1000,10"
var/summon_cooldown/name = "summon_cooldown"
var/summon_cooldown/type = 1
var/summon_cooldown/value = false
var/summon_cooldown/hint = 0
var/summon_cooldown/hint_string = ""
[node name="AgentSummoner" instance=ExtResource("1_neifu")]
@ -31,6 +36,13 @@ texture = ExtResource("2_fcti4")
[node name="HandR" parent="Root/Rig/Body" index="2"]
texture = ExtResource("2_fcti4")
[node name="WeaponNinjaStar" parent="Root" index="1"]
position = Vector2(-55, -76)
rotation = 0.0
[node name="Health" parent="." index="3"]
max_health = 8.0
[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
behavior_tree = ExtResource("3_bunpq")
blackboard_plan = SubResource("BlackboardPlan_bqv3d")

View File

@ -306,7 +306,7 @@ tracks/18/keys = {
tracks/19/type = "value"
tracks/19/imported = false
tracks/19/enabled = true
tracks/19/path = NodePath("Root/Hitbox/CollisionShape2D:disabled")
tracks/19/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled")
tracks/19/interp = 1
tracks/19/loop_wrap = true
tracks/19/keys = {
@ -659,7 +659,7 @@ tracks/20/keys = {
tracks/21/type = "value"
tracks/21/imported = false
tracks/21/enabled = true
tracks/21/path = NodePath("Root/Hitbox/CollisionShape2D:disabled")
tracks/21/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled")
tracks/21/interp = 1
tracks/21/loop_wrap = true
tracks/21/keys = {
@ -928,7 +928,7 @@ tracks/20/keys = {
tracks/21/type = "value"
tracks/21/imported = false
tracks/21/enabled = true
tracks/21/path = NodePath("Root/Hitbox/CollisionShape2D:disabled")
tracks/21/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled")
tracks/21/interp = 1
tracks/21/loop_wrap = true
tracks/21/keys = {
@ -1173,7 +1173,7 @@ tracks/18/keys = {
tracks/19/type = "value"
tracks/19/imported = false
tracks/19/enabled = true
tracks/19/path = NodePath("Root/Hitbox/CollisionShape2D:disabled")
tracks/19/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled")
tracks/19/interp = 1
tracks/19/loop_wrap = true
tracks/19/keys = {
@ -1455,7 +1455,7 @@ tracks/20/keys = {
tracks/21/type = "value"
tracks/21/imported = false
tracks/21/enabled = true
tracks/21/path = NodePath("Root/Hitbox/CollisionShape2D:disabled")
tracks/21/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled")
tracks/21/interp = 1
tracks/21/loop_wrap = true
tracks/21/keys = {
@ -1990,6 +1990,274 @@ tracks/20/keys = {
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
}
[sub_resource type="Animation" id="Animation_msfb2"]
resource_name = "dash"
length = 0.4
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Root/Rig:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.4),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector2(0, -76), Vector2(0, -38), Vector2(0, -76)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Root/Rig:rotation")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 2,
"values": [0.0, 2.35619, 6.28319, 12.5664]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Root/Rig:scale")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 0.5), Vector2(1, 0.5), Vector2(1, 0.5), Vector2(1, 1)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Root/Rig/LegL:position")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(-29, 65), Vector2(-24.8287, 40.1066), Vector2(-24.8287, 40.1066), Vector2(-29, 65)]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Root/Rig/LegL:rotation")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 0.0, 0.0, 0.0]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Root/Rig/LegL:scale")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Root/Rig/LegR:position")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(31, 65), Vector2(26.1794, 41.8884), Vector2(26.1794, 41.8884), Vector2(31, 65)]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Root/Rig/LegR:rotation")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 0.0, 0.0, 0.0]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Root/Rig/LegR:scale")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("Root/Rig/Body:position")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(5, 53), Vector2(5, 53), Vector2(5, 53), Vector2(5, 53)]
}
tracks/10/type = "value"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("Root/Rig/Body:rotation")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 0.0, 0.0, 0.0]
}
tracks/11/type = "value"
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/path = NodePath("Root/Rig/Body:scale")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
}
tracks/12/type = "value"
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/path = NodePath("Root/Rig/Body/Hat:position")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(2, -91), Vector2(2, -91), Vector2(2, -91), Vector2(2, -91)]
}
tracks/13/type = "value"
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/path = NodePath("Root/Rig/Body/Hat:rotation")
tracks/13/interp = 1
tracks/13/loop_wrap = true
tracks/13/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 0.0, 0.0, 0.0]
}
tracks/14/type = "value"
tracks/14/imported = false
tracks/14/enabled = true
tracks/14/path = NodePath("Root/Rig/Body/Hat:scale")
tracks/14/interp = 1
tracks/14/loop_wrap = true
tracks/14/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
}
tracks/15/type = "value"
tracks/15/imported = false
tracks/15/enabled = true
tracks/15/path = NodePath("Root/Rig/Body/HandL:position")
tracks/15/interp = 1
tracks/15/loop_wrap = true
tracks/15/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(-60, -53), Vector2(-19.9999, -52.9358), Vector2(-19.9999, -52.9358), Vector2(-60, -53)]
}
tracks/16/type = "value"
tracks/16/imported = false
tracks/16/enabled = true
tracks/16/path = NodePath("Root/Rig/Body/HandL:rotation")
tracks/16/interp = 1
tracks/16/loop_wrap = true
tracks/16/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 0.0, 0.0, 0.0]
}
tracks/17/type = "value"
tracks/17/imported = false
tracks/17/enabled = true
tracks/17/path = NodePath("Root/Rig/Body/HandL:scale")
tracks/17/interp = 1
tracks/17/loop_wrap = true
tracks/17/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
}
tracks/18/type = "value"
tracks/18/imported = false
tracks/18/enabled = true
tracks/18/path = NodePath("Root/Rig/Body/HandR:position")
tracks/18/interp = 1
tracks/18/loop_wrap = true
tracks/18/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(51, -51), Vector2(21.9955, -54.1155), Vector2(21.9955, -54.1155), Vector2(51, -51)]
}
tracks/19/type = "value"
tracks/19/imported = false
tracks/19/enabled = true
tracks/19/path = NodePath("Root/Rig/Body/HandR:rotation")
tracks/19/interp = 1
tracks/19/loop_wrap = true
tracks/19/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 0.0, 0.0, 0.0]
}
tracks/20/type = "value"
tracks/20/imported = false
tracks/20/enabled = true
tracks/20/path = NodePath("Root/Rig/Body/HandR:scale")
tracks/20/interp = 1
tracks/20/loop_wrap = true
tracks/20/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
}
tracks/21/type = "value"
tracks/21/imported = false
tracks/21/enabled = true
tracks/21/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled")
tracks/21/interp = 1
tracks/21/loop_wrap = true
tracks/21/keys = {
"times": PackedFloat32Array(0, 0.4),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, true]
}
[sub_resource type="Animation" id="Animation_wei72"]
resource_name = "death"
length = 0.5
@ -2282,6 +2550,18 @@ tracks/23/keys = {
"update": 1,
"values": [false, true, false]
}
tracks/24/type = "value"
tracks/24/imported = false
tracks/24/enabled = true
tracks/24/path = NodePath("Root/WeaponNinjaStar:visible")
tracks/24/interp = 1
tracks/24/loop_wrap = true
tracks/24/keys = {
"times": PackedFloat32Array(0, 0.5),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [false, false]
}
[sub_resource type="Animation" id="Animation_gowr5"]
resource_name = "hurt"
@ -2518,7 +2798,7 @@ tracks/18/keys = {
tracks/19/type = "value"
tracks/19/imported = false
tracks/19/enabled = true
tracks/19/path = NodePath("Root/Hitbox/CollisionShape2D:disabled")
tracks/19/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled")
tracks/19/interp = 1
tracks/19/loop_wrap = true
tracks/19/keys = {
@ -2796,261 +3076,17 @@ tracks/18/keys = {
"update": 1,
"values": [false]
}
[sub_resource type="Animation" id="Animation_msfb2"]
resource_name = "roll"
length = 0.4
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Root/Rig:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.4),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector2(0, -76), Vector2(0, -38), Vector2(0, -76)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Root/Rig:rotation")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 2,
"values": [0.0, 2.35619, 6.28319, 12.5664]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Root/Rig:scale")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 0.5), Vector2(1, 0.5), Vector2(1, 0.5), Vector2(1, 1)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Root/Rig/LegL:position")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(-29, 65), Vector2(-24.8287, 40.1066), Vector2(-24.8287, 40.1066), Vector2(-29, 65)]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Root/Rig/LegL:rotation")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 0.0, 0.0, 0.0]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Root/Rig/LegL:scale")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Root/Rig/LegR:position")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(31, 65), Vector2(26.1794, 41.8884), Vector2(26.1794, 41.8884), Vector2(31, 65)]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Root/Rig/LegR:rotation")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 0.0, 0.0, 0.0]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Root/Rig/LegR:scale")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("Root/Rig/Body:position")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(5, 53), Vector2(5, 53), Vector2(5, 53), Vector2(5, 53)]
}
tracks/10/type = "value"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("Root/Rig/Body:rotation")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 0.0, 0.0, 0.0]
}
tracks/11/type = "value"
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/path = NodePath("Root/Rig/Body:scale")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
}
tracks/12/type = "value"
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/path = NodePath("Root/Rig/Body/Hat:position")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(2, -91), Vector2(2, -91), Vector2(2, -91), Vector2(2, -91)]
}
tracks/13/type = "value"
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/path = NodePath("Root/Rig/Body/Hat:rotation")
tracks/13/interp = 1
tracks/13/loop_wrap = true
tracks/13/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 0.0, 0.0, 0.0]
}
tracks/14/type = "value"
tracks/14/imported = false
tracks/14/enabled = true
tracks/14/path = NodePath("Root/Rig/Body/Hat:scale")
tracks/14/interp = 1
tracks/14/loop_wrap = true
tracks/14/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
}
tracks/15/type = "value"
tracks/15/imported = false
tracks/15/enabled = true
tracks/15/path = NodePath("Root/Rig/Body/HandL:position")
tracks/15/interp = 1
tracks/15/loop_wrap = true
tracks/15/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(-60, -53), Vector2(-19.9999, -52.9358), Vector2(-19.9999, -52.9358), Vector2(-60, -53)]
}
tracks/16/type = "value"
tracks/16/imported = false
tracks/16/enabled = true
tracks/16/path = NodePath("Root/Rig/Body/HandL:rotation")
tracks/16/interp = 1
tracks/16/loop_wrap = true
tracks/16/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 0.0, 0.0, 0.0]
}
tracks/17/type = "value"
tracks/17/imported = false
tracks/17/enabled = true
tracks/17/path = NodePath("Root/Rig/Body/HandL:scale")
tracks/17/interp = 1
tracks/17/loop_wrap = true
tracks/17/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
}
tracks/18/type = "value"
tracks/18/imported = false
tracks/18/enabled = true
tracks/18/path = NodePath("Root/Rig/Body/HandR:position")
tracks/18/interp = 1
tracks/18/loop_wrap = true
tracks/18/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(51, -51), Vector2(21.9955, -54.1155), Vector2(21.9955, -54.1155), Vector2(51, -51)]
}
tracks/19/type = "value"
tracks/19/imported = false
tracks/19/enabled = true
tracks/19/path = NodePath("Root/Rig/Body/HandR:rotation")
tracks/19/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled")
tracks/19/interp = 1
tracks/19/loop_wrap = true
tracks/19/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [0.0, 0.0, 0.0, 0.0]
}
tracks/20/type = "value"
tracks/20/imported = false
tracks/20/enabled = true
tracks/20/path = NodePath("Root/Rig/Body/HandR:scale")
tracks/20/interp = 1
tracks/20/loop_wrap = true
tracks/20/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.4),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)]
"times": PackedFloat32Array(0, 0.4),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, true]
}
[sub_resource type="Animation" id="Animation_uow76"]
@ -4263,6 +4299,18 @@ tracks/18/keys = {
"update": 1,
"values": [false]
}
tracks/19/type = "value"
tracks/19/imported = false
tracks/19/enabled = true
tracks/19/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled")
tracks/19/interp = 1
tracks/19/loop_wrap = true
tracks/19/keys = {
"times": PackedFloat32Array(0, 0.6),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [true, true]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_ws2ti"]
_data = {
@ -4273,10 +4321,10 @@ _data = {
"charge": SubResource("Animation_jcwlt"),
"charge_prepare": SubResource("Animation_sva81"),
"dance": SubResource("Animation_5k1rd"),
"dash": SubResource("Animation_msfb2"),
"death": SubResource("Animation_wei72"),
"hurt": SubResource("Animation_gowr5"),
"idle": SubResource("Animation_gnqgt"),
"roll": SubResource("Animation_msfb2"),
"spit": SubResource("Animation_uow76"),
"summon": SubResource("Animation_5mxvi"),
"throw": SubResource("Animation_yn0t6"),
@ -4348,7 +4396,8 @@ region_rect = Rect2(111, 34, 26.9272, 26.6298)
[node name="WeaponNinjaStar" type="Sprite2D" parent="Root"]
visible = false
position = Vector2(-55, -76)
position = Vector2(20.8026, -11.5702)
rotation = -1.60228
scale = Vector2(0.999985, 0.999984)
texture = ExtResource("4_1c5xq")
@ -4357,10 +4406,9 @@ position = Vector2(50, 0)
collision_layer = 0
collision_mask = 4
script = ExtResource("5_taq6b")
damage = null
knockback_strength = 1000.0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Root/Hitbox"]
[node name="HitboxCollisionShape2D" type="CollisionShape2D" parent="Root/Hitbox"]
shape = SubResource("RectangleShape2D_2k81i")
disabled = true
debug_color = Color(0.933131, 0.0801983, 0.605982, 0.42)
@ -4372,7 +4420,7 @@ collision_mask = 0
script = ExtResource("6_jnvxm")
health = NodePath("../../Health")
[node name="CollisionShape2D" type="CollisionShape2D" parent="Root/Hurtbox"]
[node name="HurtboxCollisionShape2D" type="CollisionShape2D" parent="Root/Hurtbox"]
shape = SubResource("RectangleShape2D_26abe")
debug_color = Color(0.466325, 0.590206, 0.107862, 0.42)
metadata/_edit_lock_ = true

View File

@ -0,0 +1,39 @@
extends LimboState
## Idle state.
@export var animation_player: AnimationPlayer
@export var animation: StringName
@export var duration: float = 0.4
@export var dash_speed: float = 1000.0
@export var hurtbox_collision: CollisionShape2D
var move_dir: Vector2
var elapsed_time: float
func _enter() -> void:
elapsed_time = 0.0
hurtbox_collision.disabled = true
var horizontal_move: float = Input.get_axis(&"move_left", &"move_right")
if is_zero_approx(horizontal_move):
move_dir = Vector2.RIGHT * agent.get_facing()
else:
move_dir = Vector2.RIGHT * signf(horizontal_move)
agent.face_dir(move_dir.x)
animation_player.play(animation, 0.1)
func _exit() -> void:
hurtbox_collision.disabled = false
func _update(p_delta: float) -> void:
elapsed_time += p_delta
var desired_velocity: Vector2 = move_dir * dash_speed
agent.velocity = lerp(agent.velocity, desired_velocity, 0.2)
agent.move_and_slide()
if elapsed_time > duration:
get_root().dispatch(EVENT_FINISHED)

View File

@ -12,20 +12,31 @@ extends "res://demo/agents/scripts/agent_base.gd"
## Player.
@export var dash_cooldown: float = 0.4
@onready var hsm: LimboHSM = $LimboHSM
@onready var idle_state: LimboState = $LimboHSM/IdleState
@onready var move_state: LimboState = $LimboHSM/MoveState
@onready var attack_state: LimboState = $LimboHSM/AttackState
@onready var dash_state: LimboState = $LimboHSM/DashState
var can_dash: bool = true
func _ready() -> void:
super._ready()
can_dash = true
_init_state_machine()
death.connect(func(): remove_from_group(&"player"))
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("attack") and event.is_echo() == false:
if event.is_echo():
return
if event.is_action_pressed("attack"):
hsm.dispatch("attack!")
if event.is_action_pressed("dash"):
hsm.dispatch("dash!")
func _init_state_machine() -> void:
@ -34,5 +45,21 @@ func _init_state_machine() -> void:
hsm.add_transition(idle_state, attack_state, "attack!")
hsm.add_transition(move_state, attack_state, "attack!")
hsm.add_transition(attack_state, move_state, attack_state.EVENT_FINISHED)
hsm.add_transition(hsm.ANYSTATE, dash_state, "dash!")
hsm.add_transition(dash_state, move_state, dash_state.EVENT_FINISHED)
dash_state.set_guard(_can_dash)
hsm.initialize(self)
hsm.set_active(true)
hsm.set_guard(_can_dash)
func set_victorious() -> void:
idle_state.idle_animation = &"dance"
func _can_dash() -> bool:
if can_dash:
can_dash = false
get_tree().create_timer(dash_cooldown).timeout.connect(func(): can_dash = true)
return true
return false

View File

@ -1,38 +1,58 @@
[gd_scene load_steps=6 format=3 uid="uid://d07ag5dcje13i"]
[gd_scene load_steps=8 format=3 uid="uid://d07ag5dcje13i"]
[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_mswd4"]
[ext_resource type="Script" path="res://demo/agents/player/player.gd" id="2_24nyi"]
[ext_resource type="Script" path="res://demo/agents/player/states/idle_state.gd" id="3_ekb12"]
[ext_resource type="Script" path="res://demo/agents/player/states/move_state.gd" id="4_paikn"]
[ext_resource type="Script" path="res://demo/agents/player/states/attack_state.gd" id="5_mpgu6"]
[ext_resource type="Script" path="res://demo/agents/player/DashState.gd" id="6_hdeid"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_8pofm"]
size = Vector2(130, 45)
[node name="Player" groups=["player"] instance=ExtResource("1_mswd4")]
collision_layer = 0
collision_mask = 1
script = ExtResource("2_24nyi")
dash_cooldown = 0.4
[node name="WeaponNinjaStar" parent="Root" index="2"]
[node name="WeaponNinjaStar" parent="Root" index="1"]
position = Vector2(-55, -76)
rotation = 0.0
scale = Vector2(0.999983, 0.999976)
[node name="Hitbox" parent="Root" index="3"]
[node name="Hitbox" parent="Root" index="2"]
collision_mask = 8
[node name="Hurtbox" parent="Root" index="4"]
[node name="HitboxCollisionShape2D" parent="Root/Hitbox" index="0"]
shape = SubResource("RectangleShape2D_8pofm")
[node name="Hurtbox" parent="Root" index="3"]
collision_layer = 4
[node name="Health" parent="." index="3"]
max_health = 30.0
[node name="LimboHSM" type="LimboHSM" parent="." index="4"]
[node name="IdleState" type="LimboState" parent="LimboHSM" index="0" node_paths=PackedStringArray("animation_player")]
script = ExtResource("3_ekb12")
animation_player = NodePath("../../AnimationPlayer")
animation = &"idle"
idle_animation = &"idle"
[node name="MoveState" type="LimboState" parent="LimboHSM" index="1" node_paths=PackedStringArray("animation_player")]
script = ExtResource("4_paikn")
animation_player = NodePath("../../AnimationPlayer")
animation = &"walk"
[node name="AttackState" type="LimboState" parent="LimboHSM" index="2" node_paths=PackedStringArray("animation_player")]
[node name="AttackState" type="LimboState" parent="LimboHSM" index="2" node_paths=PackedStringArray("animation_player", "hitbox")]
script = ExtResource("5_mpgu6")
animation_player = NodePath("../../AnimationPlayer")
animations = Array[StringName]([&"attack_1", &"attack_2", &"attack_3"])
hitbox = NodePath("../../Root/Hitbox")
[node name="DashState" type="LimboState" parent="LimboHSM" index="3" node_paths=PackedStringArray("animation_player", "hurtbox_collision")]
script = ExtResource("6_hdeid")
animation_player = NodePath("../../AnimationPlayer")
animation = &"dash"
hurtbox_collision = NodePath("../../Root/Hurtbox/HurtboxCollisionShape2D")

View File

@ -14,6 +14,7 @@ extends LimboState
@export var animation_player: AnimationPlayer
@export var animations: Array[StringName]
@export var hitbox: Hitbox
var attack_pressed: int
@ -27,7 +28,9 @@ func _unhandled_input(event: InputEvent) -> void:
func _enter() -> void:
attack_pressed = 0
hitbox.damage = 1
for idx in animations.size():
hitbox.damage = 2 if idx == 2 else 1 # deal 2 damage on third attack
animation_player.play(animations[idx])
await animation_player.animation_finished
if attack_pressed <= 0 or not is_active():
@ -37,3 +40,7 @@ func _enter() -> void:
attack_pressed -= 1
if is_active():
get_root().dispatch(EVENT_FINISHED)
func _exit() -> void:
hitbox.damage = 1

View File

@ -13,11 +13,11 @@ extends LimboState
@export var animation_player: AnimationPlayer
@export var animation: StringName
@export var idle_animation: StringName
func _enter() -> void:
animation_player.play(animation, 0.1)
animation_player.play(idle_animation, 0.1)
func _update(_delta: float) -> void:

View File

@ -9,9 +9,10 @@
#* =============================================================================
#*
extends CharacterBody2D
## Base agent script that is shared by all agents.
signal death
# Resource file to use in summon_minion() method.
const MINION_RESOURCE := "res://demo/agents/03_agent_imp.tscn"
@ -19,15 +20,15 @@ const MINION_RESOURCE := "res://demo/agents/03_agent_imp.tscn"
const NinjaStar := preload("res://demo/agents/ninja_star/ninja_star.tscn")
const Fireball := preload("res://demo/agents/fireball/fireball.tscn")
var _frames_since_facing_update: int = 0
var _is_dead: bool = false
@onready var animation_player: AnimationPlayer = $AnimationPlayer
@onready var health: Health = $Health
@onready var root: Node2D = $Root
@onready var collision_shape_2d: CollisionShape2D = $CollisionShape2D
@onready var summoning_effect: GPUParticles2D = $FX/Summoned
var _frames_since_facing_update: int = 0
var _is_dead: bool = false
func _ready() -> void:
health.damaged.connect(_damaged)
@ -120,6 +121,7 @@ func apply_knockback(knockback: Vector2, frames: int = 10) -> void:
func die() -> void:
if _is_dead:
return
death.emit()
_is_dead = true
root.process_mode = Node.PROCESS_MODE_DISABLED
animation_player.play(&"death")
@ -129,5 +131,10 @@ func die() -> void:
if child is BTPlayer or child is LimboHSM:
child.set_active(false)
await get_tree().create_timer(10.0).timeout
queue_free()
if get_tree():
await get_tree().create_timer(10.0).timeout
queue_free()
func get_health() -> Health:
return health

View File

@ -1,4 +1,4 @@
[gd_resource type="BehaviorTree" load_steps=27 format=3 uid="uid://ylife72ym5et"]
[gd_resource type="BehaviorTree" load_steps=28 format=3 uid="uid://ylife72ym5et"]
[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_657p6"]
[ext_resource type="Script" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_t3udh"]
@ -28,8 +28,7 @@ animation_name = &"idle"
blend = 0.1
[sub_resource type="BTRandomWait" id="BTRandomWait_cedqr"]
min_duration = 2.0
max_duration = 5.0
max_duration = 3.0
[sub_resource type="BTSequence" id="BTSequence_l3v31"]
custom_name = "Short break"
@ -63,9 +62,13 @@ target_position_var = "flank_pos"
speed_var = "speed"
tolerance = 50.0
[sub_resource type="BTTimeLimit" id="BTTimeLimit_is5ag"]
time_limit = 3.0
children = [SubResource("BTAction_87mi0")]
[sub_resource type="BTSequence" id="BTSequence_p6pgg"]
custom_name = "Flank target"
children = [SubResource("BTAction_pp23y"), SubResource("BTAction_pmvd0"), SubResource("BTPlayAnimation_h0poo"), SubResource("BTAction_87mi0")]
children = [SubResource("BTAction_pp23y"), SubResource("BTAction_pmvd0"), SubResource("BTPlayAnimation_h0poo"), SubResource("BTTimeLimit_is5ag")]
[sub_resource type="BTAction" id="BTAction_q5g4a"]
script = ExtResource("4_xwjl7")

View File

@ -1,4 +1,4 @@
[gd_resource type="BehaviorTree" load_steps=30 format=3 uid="uid://c2bxoo68ywb27"]
[gd_resource type="BehaviorTree" load_steps=35 format=3 uid="uid://c2bxoo68ywb27"]
[ext_resource type="Script" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="1_cdtqu"]
[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="2_31fsn"]
@ -13,6 +13,24 @@ var/speed/value = 400.0
var/speed/hint = 1
var/speed/hint_string = "10,1000,10"
[sub_resource type="BBNode" id="BBNode_6xa35"]
saved_value = NodePath("AnimationPlayer")
resource_name = "AnimationPlayer"
[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_4q5m7"]
animation_player = SubResource("BBNode_6xa35")
animation_name = &"idle"
blend = 0.1
[sub_resource type="BTRandomWait" id="BTRandomWait_025eh"]
[sub_resource type="BTSequence" id="BTSequence_ds6uq"]
custom_name = "Idle"
children = [SubResource("BTPlayAnimation_4q5m7"), SubResource("BTRandomWait_025eh")]
[sub_resource type="BTCooldown" id="BTCooldown_u2lrv"]
children = [SubResource("BTSequence_ds6uq")]
[sub_resource type="BBNode" id="BBNode_3y70b"]
saved_value = NodePath("AnimationPlayer")
resource_name = "AnimationPlayer"
@ -52,7 +70,7 @@ animation_name = &"idle"
blend = 0.1
[sub_resource type="BTRandomWait" id="BTRandomWait_xlud8"]
min_duration = 0.7
min_duration = 0.5
max_duration = 1.5
[sub_resource type="BTSequence" id="BTSequence_yhjh1"]
@ -112,7 +130,7 @@ custom_name = "Engage player"
children = [SubResource("BTSequence_yhjh1"), SubResource("BTSequence_1xfnq"), SubResource("BTSequence_ww5v2")]
[sub_resource type="BTSelector" id="BTSelector_y3llm"]
children = [SubResource("BTProbability_ifsry"), SubResource("BTSequence_pxl2k")]
children = [SubResource("BTCooldown_u2lrv"), SubResource("BTProbability_ifsry"), SubResource("BTSequence_pxl2k")]
[resource]
blackboard_plan = SubResource("BlackboardPlan_46tbn")

View File

@ -1,4 +1,4 @@
[gd_resource type="BehaviorTree" load_steps=36 format=3 uid="uid://qqmjvbeibatn"]
[gd_resource type="BehaviorTree" load_steps=39 format=3 uid="uid://qqmjvbeibatn"]
[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_2883n"]
[ext_resource type="Script" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_cjso2"]
@ -34,60 +34,25 @@ animation_name = &"idle"
blend = 0.1
[sub_resource type="BTRandomWait" id="BTRandomWait_xlud8"]
min_duration = 1.5
max_duration = 3.0
[sub_resource type="BTAction" id="BTAction_ulbrf"]
script = ExtResource("1_2883n")
group = &"player"
output_var = "target"
[sub_resource type="BTSequence" id="BTSequence_yhjh1"]
custom_name = "Pause before action"
children = [SubResource("BTPlayAnimation_qiw21"), SubResource("BTRandomWait_xlud8"), SubResource("BTAction_ulbrf")]
custom_name = "Summoning sickness"
children = [SubResource("BTPlayAnimation_qiw21"), SubResource("BTRandomWait_xlud8")]
[sub_resource type="BBNode" id="BBNode_wpj6d"]
saved_value = NodePath("AnimationPlayer")
resource_name = "AnimationPlayer"
[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_olf37"]
animation_player = SubResource("BBNode_wpj6d")
animation_name = &"walk"
blend = 0.1
speed = 1.2
[sub_resource type="BTAction" id="BTAction_g5ayy"]
script = ExtResource("2_cjso2")
target_var = "target"
closest_side = false
flank_side = 2
range_min = 100
range_max = 100
position_var = "flank_pos"
[sub_resource type="BTAction" id="BTAction_tv4lt"]
script = ExtResource("3_treio")
target_position_var = "flank_pos"
speed_var = "fast_speed"
tolerance = 50.0
[sub_resource type="BTSequence" id="BTSequence_rgwic"]
children = [SubResource("BTAction_g5ayy"), SubResource("BTAction_tv4lt")]
[sub_resource type="BTTimeLimit" id="BTTimeLimit_xek5v"]
time_limit = 4.0
children = [SubResource("BTSequence_rgwic")]
[sub_resource type="BTAction" id="BTAction_kidxn"]
script = ExtResource("4_57x51")
target_var = "target"
[sub_resource type="BTRunLimit" id="BTRunLimit_tq3e1"]
children = [SubResource("BTSequence_yhjh1")]
[sub_resource type="BTCondition" id="BTCondition_uk4dg"]
script = ExtResource("5_p5dih")
distance_min = 50.0
distance_min = 0.0
distance_max = 170.0
target_var = "target"
[sub_resource type="BTAction" id="BTAction_kidxn"]
script = ExtResource("4_57x51")
target_var = "target"
[sub_resource type="BTWait" id="BTWait_tadkc"]
duration = 0.1
@ -102,24 +67,17 @@ animation_name = &"attack_3"
[sub_resource type="BTSequence" id="BTSequence_ww5v2"]
custom_name = "Melee attack"
children = [SubResource("BTCondition_uk4dg"), SubResource("BTWait_tadkc"), SubResource("BTPlayAnimation_ppmxd")]
children = [SubResource("BTCondition_uk4dg"), SubResource("BTAction_kidxn"), SubResource("BTWait_tadkc"), SubResource("BTPlayAnimation_ppmxd")]
[sub_resource type="BBNode" id="BBNode_wtnf2"]
saved_value = NodePath("AnimationPlayer")
resource_name = "AnimationPlayer"
[sub_resource type="BTCooldown" id="BTCooldown_ksvfy"]
duration = 2.0
children = [SubResource("BTSequence_ww5v2")]
[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_k86qc"]
animation_player = SubResource("BBNode_wtnf2")
animation_name = &"idle"
blend = 0.1
[sub_resource type="BTRandomWait" id="BTRandomWait_m447o"]
min_duration = 0.3
max_duration = 0.6
[sub_resource type="BTSequence" id="BTSequence_b00uw"]
custom_name = "Short break"
children = [SubResource("BTPlayAnimation_k86qc"), SubResource("BTRandomWait_m447o")]
[sub_resource type="BTCondition" id="BTCondition_fpufi"]
script = ExtResource("5_p5dih")
distance_min = 0.0
distance_max = 250.0
target_var = "target"
[sub_resource type="BBNode" id="BBNode_3iqcf"]
saved_value = NodePath("AnimationPlayer")
@ -140,17 +98,68 @@ max_angle_deviation = 0.7
time_limit = 1.5
children = [SubResource("BTAction_4ye2y")]
[sub_resource type="BTAlwaysSucceed" id="BTAlwaysSucceed_nw4ep"]
children = [SubResource("BTTimeLimit_cns1i")]
[sub_resource type="BBNode" id="BBNode_81x7t"]
saved_value = NodePath("AnimationPlayer")
resource_name = "AnimationPlayer"
[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_e61er"]
animation_player = SubResource("BBNode_81x7t")
animation_name = &"idle"
blend = 0.1
[sub_resource type="BTRandomWait" id="BTRandomWait_jw0cm"]
[sub_resource type="BTSequence" id="BTSequence_bhacl"]
custom_name = "Chill"
children = [SubResource("BTPlayAnimation_e61er"), SubResource("BTRandomWait_jw0cm")]
[sub_resource type="BTSequence" id="BTSequence_y12eg"]
custom_name = "Back away"
children = [SubResource("BTPlayAnimation_ee0ff"), SubResource("BTTimeLimit_cns1i")]
children = [SubResource("BTCondition_fpufi"), SubResource("BTPlayAnimation_ee0ff"), SubResource("BTAlwaysSucceed_nw4ep"), SubResource("BTSequence_bhacl")]
[sub_resource type="BTSequence" id="BTSequence_1xfnq"]
[sub_resource type="BBNode" id="BBNode_wpj6d"]
saved_value = NodePath("AnimationPlayer")
resource_name = "AnimationPlayer"
[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_olf37"]
animation_player = SubResource("BBNode_wpj6d")
animation_name = &"walk"
blend = 0.1
speed = 1.2
[sub_resource type="BTAction" id="BTAction_ulbrf"]
script = ExtResource("1_2883n")
group = &"player"
output_var = "target"
[sub_resource type="BTAction" id="BTAction_g5ayy"]
script = ExtResource("2_cjso2")
target_var = "target"
flank_side = 2
range_min = 100
range_max = 100
position_var = "flank_pos"
[sub_resource type="BTAction" id="BTAction_tv4lt"]
script = ExtResource("3_treio")
target_position_var = "flank_pos"
speed_var = "fast_speed"
tolerance = 50.0
[sub_resource type="BTTimeLimit" id="BTTimeLimit_xek5v"]
time_limit = 4.0
children = [SubResource("BTAction_tv4lt")]
[sub_resource type="BTSequence" id="BTSequence_rgwic"]
custom_name = "Skirmish"
children = [SubResource("BTPlayAnimation_olf37"), SubResource("BTTimeLimit_xek5v"), SubResource("BTAction_kidxn"), SubResource("BTSequence_ww5v2"), SubResource("BTSequence_b00uw"), SubResource("BTSequence_y12eg")]
children = [SubResource("BTPlayAnimation_olf37"), SubResource("BTAction_ulbrf"), SubResource("BTAction_g5ayy"), SubResource("BTTimeLimit_xek5v")]
[sub_resource type="BTSequence" id="BTSequence_pxl2k"]
children = [SubResource("BTSequence_yhjh1"), SubResource("BTSequence_1xfnq")]
[sub_resource type="BTSelector" id="BTSelector_2jnau"]
children = [SubResource("BTRunLimit_tq3e1"), SubResource("BTCooldown_ksvfy"), SubResource("BTSequence_y12eg"), SubResource("BTSequence_rgwic")]
[resource]
blackboard_plan = SubResource("BlackboardPlan_46tbn")
root_task = SubResource("BTSequence_pxl2k")
root_task = SubResource("BTSelector_2jnau")

View File

@ -74,7 +74,6 @@ children = [SubResource("BTSequence_0gdqn")]
[sub_resource type="BTAction" id="BTAction_kuuw2"]
script = ExtResource("4_53hao")
target_var = "target"
closest_side = true
flank_side = 0
range_min = 400
range_max = 1000

View File

@ -1,4 +1,4 @@
[gd_resource type="BehaviorTree" load_steps=45 format=3 uid="uid://c2u6sljqkim0n"]
[gd_resource type="BehaviorTree" load_steps=46 format=3 uid="uid://c2u6sljqkim0n"]
[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_08fik"]
[ext_resource type="Script" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_te3yo"]
@ -28,7 +28,6 @@ animation_name = &"idle"
blend = 0.1
[sub_resource type="BTRandomWait" id="BTRandomWait_xlud8"]
max_duration = 3.0
[sub_resource type="BTAction" id="BTAction_c4cxo"]
script = ExtResource("1_08fik")
@ -52,7 +51,6 @@ speed = 1.5
[sub_resource type="BTAction" id="BTAction_6e48s"]
script = ExtResource("2_te3yo")
target_var = "target"
closest_side = false
flank_side = 1
range_min = 400
range_max = 600
@ -124,7 +122,6 @@ metadata/_weight_ = 4.0
[sub_resource type="BTAction" id="BTAction_mf87t"]
script = ExtResource("2_te3yo")
target_var = "target"
closest_side = false
flank_side = 0
range_min = 350
range_max = 600
@ -145,6 +142,10 @@ target_position_var = "pos"
speed_var = "speed"
tolerance = 50.0
[sub_resource type="BTTimeLimit" id="BTTimeLimit_tidwl"]
time_limit = 3.0
children = [SubResource("BTAction_6nx58")]
[sub_resource type="BTAction" id="BTAction_8q20y"]
script = ExtResource("4_mvsyw")
target_var = "target"
@ -160,7 +161,6 @@ blend = 0.1
speed = 0.7
[sub_resource type="BTWait" id="BTWait_gbcyb"]
duration = 1.3
[sub_resource type="BBNode" id="BBNode_qkfqt"]
saved_value = NodePath("AnimationPlayer")
@ -181,11 +181,11 @@ node = SubResource("BBNode_1yxc5")
method = &"throw_ninja_star"
[sub_resource type="BTRandomWait" id="BTRandomWait_2pmoe"]
min_duration = 1.5
max_duration = 1.5
[sub_resource type="BTSequence" id="BTSequence_rgbq3"]
custom_name = "Throw ninja star"
children = [SubResource("BTAction_mf87t"), SubResource("BTPlayAnimation_mfbeu"), SubResource("BTAction_6nx58"), SubResource("BTAction_8q20y"), SubResource("BTPlayAnimation_qa8jy"), SubResource("BTWait_gbcyb"), SubResource("BTPlayAnimation_0ktds"), SubResource("BTCallMethod_yx4fk"), SubResource("BTRandomWait_2pmoe")]
children = [SubResource("BTAction_mf87t"), SubResource("BTPlayAnimation_mfbeu"), SubResource("BTTimeLimit_tidwl"), SubResource("BTAction_8q20y"), SubResource("BTPlayAnimation_qa8jy"), SubResource("BTWait_gbcyb"), SubResource("BTPlayAnimation_0ktds"), SubResource("BTCallMethod_yx4fk"), SubResource("BTRandomWait_2pmoe")]
metadata/_weight_ = 2.0
[sub_resource type="BTProbabilitySelector" id="BTProbabilitySelector_rjsiq"]

View File

@ -41,7 +41,7 @@ output_var = "target"
[sub_resource type="BTCondition" id="BTCondition_7a5nv"]
script = ExtResource("2_atyuj")
distance_min = 50.0
distance_min = 0.0
distance_max = 150.0
target_var = "target"
@ -115,7 +115,6 @@ blend = 0.1
[sub_resource type="BTAction" id="BTAction_4mmh0"]
script = ExtResource("5_dho0d")
target_var = "target"
closest_side = false
flank_side = 0
range_min = 300
range_max = 700

View File

@ -1,4 +1,4 @@
[gd_resource type="BehaviorTree" load_steps=28 format=3 uid="uid://cpxk7jnqpwwlc"]
[gd_resource type="BehaviorTree" load_steps=33 format=3 uid="uid://cpxk7jnqpwwlc"]
[ext_resource type="Script" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="1_sgn0p"]
[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="2_pshl2"]
@ -15,6 +15,24 @@ var/summon_cooldown/value = false
var/summon_cooldown/hint = 0
var/summon_cooldown/hint_string = ""
[sub_resource type="BBNode" id="BBNode_b7euf"]
saved_value = NodePath("AnimationPlayer")
resource_name = "AnimationPlayer"
[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_sot6a"]
animation_player = SubResource("BBNode_b7euf")
animation_name = &"idle"
blend = 0.1
[sub_resource type="BTRandomWait" id="BTRandomWait_0wc6p"]
[sub_resource type="BTSequence" id="BTSequence_kwkxc"]
custom_name = "Summoning sickness"
children = [SubResource("BTPlayAnimation_sot6a"), SubResource("BTRandomWait_0wc6p")]
[sub_resource type="BTRunLimit" id="BTRunLimit_x2jr4"]
children = [SubResource("BTSequence_kwkxc")]
[sub_resource type="BTComment" id="BTComment_ef6y0"]
custom_name = "Variable $summon_cooldown is updated by the Cooldown task below"
@ -62,6 +80,7 @@ method = &"summon_minion"
args = Array[BBVariant]([SubResource("BBVariant_wfjwy")])
[sub_resource type="BTCooldown" id="BTCooldown_25f70"]
duration = 6.0
cooldown_state_var = "summon_cooldown"
children = [SubResource("BTCallMethod_4ath5")]
@ -117,7 +136,7 @@ custom_name = "Reposition"
children = [SubResource("BTAction_33wje"), SubResource("BTPlayAnimation_qbxm8"), SubResource("BTTimeLimit_i05cm"), SubResource("BTSequence_ks71q")]
[sub_resource type="BTSelector" id="BTSelector_gp6q5"]
children = [SubResource("BTSequence_2n742"), SubResource("BTSequence_dss4d")]
children = [SubResource("BTRunLimit_x2jr4"), SubResource("BTSequence_2n742"), SubResource("BTSequence_dss4d")]
[resource]
blackboard_plan = SubResource("BlackboardPlan_58oq1")

Binary file not shown.

15
demo/demo/props/gong.gd Normal file
View File

@ -0,0 +1,15 @@
extends StaticBody2D
signal gong_struck
var enabled: bool = true
@onready var animation_player: AnimationPlayer = $AnimationPlayer
func _on_health_damaged(_amount: float, _knockback: Vector2) -> void:
if not enabled:
return
animation_player.play(&"struck")
gong_struck.emit()
enabled = false

View File

@ -1,15 +1,18 @@
[gd_scene load_steps=8 format=3 uid="uid://bpd1wmw2f7bvg"]
[gd_scene load_steps=12 format=3 uid="uid://bpd1wmw2f7bvg"]
[ext_resource type="Script" path="res://demo/props/gong.gd" id="1_77c1i"]
[ext_resource type="Texture2D" uid="uid://i476iia1ua8q" path="res://demo/assets/env_gong.png" id="1_kbnv6"]
[ext_resource type="Texture2D" uid="uid://dwhhxj5557qrb" path="res://demo/assets/shadow.png" id="1_vl1mv"]
[ext_resource type="Texture2D" uid="uid://dj4oayt5ttvh8" path="res://demo/assets/fx.png" id="2_dib3m"]
[ext_resource type="Script" path="res://demo/agents/scripts/hurtbox.gd" id="5_xeb5y"]
[ext_resource type="Script" path="res://demo/agents/scripts/health.gd" id="6_6a3q1"]
[sub_resource type="Animation" id="Animation_i5ovs"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Gong:position")
tracks/0/path = NodePath("Root/Gong:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
@ -21,7 +24,7 @@ tracks/0/keys = {
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Gong:rotation")
tracks/1/path = NodePath("Root/Gong:rotation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
@ -33,7 +36,7 @@ tracks/1/keys = {
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Gong:scale")
tracks/2/path = NodePath("Root/Gong:scale")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
@ -408,7 +411,7 @@ resource_name = "struck"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Gong:position")
tracks/0/path = NodePath("Root/Gong:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
@ -420,7 +423,7 @@ tracks/0/keys = {
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Gong:rotation")
tracks/1/path = NodePath("Root/Gong:rotation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
@ -432,7 +435,7 @@ tracks/1/keys = {
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Gong:scale")
tracks/2/path = NodePath("Root/Gong:scale")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
@ -812,20 +815,29 @@ _data = {
radius = 20.91
height = 186.37
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_ru7jf"]
radius = 39.2
height = 253.42
[node name="Gong" type="StaticBody2D"]
script = ExtResource("1_77c1i")
metadata/_edit_horizontal_guides_ = [111.0]
[node name="Shadow" type="Sprite2D" parent="."]
[node name="Root" type="Node2D" parent="."]
metadata/_edit_lock_ = true
[node name="Shadow" type="Sprite2D" parent="Root"]
modulate = Color(1, 1, 1, 0.329412)
position = Vector2(0, -8)
scale = Vector2(2.31, 1.7)
texture = ExtResource("1_vl1mv")
[node name="Gong" type="Sprite2D" parent="."]
[node name="Gong" type="Sprite2D" parent="Root"]
texture = ExtResource("1_kbnv6")
offset = Vector2(0, -110)
[node name="FX" type="Node2D" parent="."]
metadata/_edit_lock_ = true
[node name="WaveL1" type="Sprite2D" parent="FX"]
visible = false
@ -898,3 +910,21 @@ libraries = {
position = Vector2(0, -14.395)
rotation = 1.5708
shape = SubResource("CapsuleShape2D_nixvt")
[node name="Hurtbox" type="Area2D" parent="." node_paths=PackedStringArray("health")]
collision_layer = 8
collision_mask = 0
script = ExtResource("5_xeb5y")
health = NodePath("../Health")
[node name="CollisionShape2D2" type="CollisionShape2D" parent="Hurtbox"]
position = Vector2(0, -14.395)
rotation = 1.5708
shape = SubResource("CapsuleShape2D_ru7jf")
debug_color = Color(0.886275, 0.109804, 0.756863, 0.419608)
[node name="Health" type="Node" parent="."]
script = ExtResource("6_6a3q1")
max_health = 1e+11
[connection signal="damaged" from="Health" to="." method="_on_health_damaged"]

83
demo/demo/scenes/demo.gd Normal file
View File

@ -0,0 +1,83 @@
extends Node2D
const Simple := preload("res://demo/agents/01_agent_melee_simple.tscn")
const Charger := preload("res://demo/agents/02_agent_charger.tscn")
const Imp := preload("res://demo/agents/03_agent_imp.tscn")
const Skirmisher := preload("res://demo/agents/04_agent_skirmisher.tscn")
const Ranged := preload("res://demo/agents/05_agent_ranged.tscn")
const Combo := preload("res://demo/agents/06_agent_melee_combo.tscn")
const Nuanced := preload("res://demo/agents/07_agent_melee_nuanced.tscn")
const Demon := preload("res://demo/agents/08_agent_demon.tscn")
const Summoner := preload("res://demo/agents/09_agent_summoner.tscn")
const WAVES: Array = [
[Simple, Simple, Nuanced],
[Simple, Nuanced, Charger],
[Simple, Simple, Ranged, Nuanced],
[Simple, Simple, Summoner],
[Ranged, Skirmisher, Nuanced, Simple],
[Nuanced, Nuanced, Combo, Ranged],
[Demon, Charger, Simple, Simple, Skirmisher],
[Demon, Nuanced, Combo, Demon],
[Summoner, Ranged, Nuanced, Nuanced, Ranged, Skirmisher],
[Demon, Demon, Summoner, Skirmisher, Nuanced, Nuanced, Combo],
]
@export var wave_index: int = -1
@export var agents_alive: int = 0
@onready var gong: StaticBody2D = $Gong
@onready var player: CharacterBody2D = $Player
@onready var spawn_points: Node2D = $SpawnPoints
@onready var hp_bar: TextureProgressBar = %HPBar
@onready var round_counter: Label = %RoundCounter
func _ready() -> void:
hp_bar.max_value = player.get_health().max_health
player.get_health().damaged.connect(func(_a,_b): hp_bar.value = player.get_health().get_current())
player.death.connect(_on_player_death)
round_counter.hide()
func _update_round_counter() -> void:
round_counter.show()
round_counter.text = "Round %s/%s" % [wave_index + 1, WAVES.size()]
func _on_gong_gong_struck() -> void:
_start_round()
func _start_round() -> void:
wave_index += 1
if wave_index >= WAVES.size():
player.set_victorious()
round_counter.text = "Victorious!"
return
await get_tree().create_timer(3.0).timeout
_update_round_counter()
var spawns: Array = spawn_points.get_children()
spawns.shuffle()
for i in WAVES[wave_index].size():
var agent_resource: PackedScene = WAVES[wave_index][i]
var agent: CharacterBody2D = agent_resource.instantiate()
add_child(agent)
agent.global_position = spawns[i].global_position
agent.death.connect(_on_agent_death)
agent.play_summoning_effect()
agents_alive += 1
func _on_agent_death() -> void:
agents_alive -= 1
if agents_alive == 0:
_start_round()
func _on_player_death() -> void:
await get_tree().create_timer(3.0).timeout
get_tree().reload_current_scene()

View File

@ -1,13 +1,148 @@
[gd_scene load_steps=3 format=3 uid="uid://clyhgbpfpmtw7"]
[gd_scene load_steps=15 format=3 uid="uid://clyhgbpfpmtw7"]
[ext_resource type="Script" path="res://demo/scenes/demo.gd" id="1_foif6"]
[ext_resource type="PackedScene" uid="uid://bsig1usigbbuy" path="res://demo/scenes/arena.tscn" id="1_rab6h"]
[ext_resource type="Theme" uid="uid://boqtjf88xcpu4" path="res://demo/assets/ui.theme" id="2_e6mlj"]
[ext_resource type="PackedScene" uid="uid://bpd1wmw2f7bvg" path="res://demo/props/gong.tscn" id="3_nbeay"]
[ext_resource type="Texture2D" uid="uid://tyu0ua1ju38l" path="res://demo/assets/logo.png" id="3_t7by8"]
[ext_resource type="FontFile" uid="uid://d25vkmce7mhlt" path="res://demo/assets/fonts/knewave_regular.ttf" id="4_xx6j3"]
[ext_resource type="Script" path="res://demo/scenes/toggle_fullscreen.gd" id="5_2oy30"]
[ext_resource type="PackedScene" uid="uid://d07ag5dcje13i" path="res://demo/agents/player/player.tscn" id="5_cmgoj"]
[ext_resource type="Texture2D" uid="uid://dlw15foygohrk" path="res://demo/assets/hp_under.png" id="6_3dtym"]
[ext_resource type="Texture2D" uid="uid://cls8jtnu413o8" path="res://demo/assets/hp_over.png" id="7_3xolo"]
[ext_resource type="Texture2D" uid="uid://hnwi23oef752" path="res://demo/assets/hp_bar.png" id="8_ee1p0"]
[sub_resource type="LabelSettings" id="LabelSettings_628x3"]
font = ExtResource("4_xx6j3")
font_size = 36
font_color = Color(1, 1, 0.239216, 1)
outline_size = 20
outline_color = Color(0.211521, 0.23888, 0.290166, 1)
[sub_resource type="LabelSettings" id="LabelSettings_0r6iv"]
font = ExtResource("4_xx6j3")
font_size = 37
outline_size = 15
outline_color = Color(0.211521, 0.23888, 0.290166, 1)
[sub_resource type="LabelSettings" id="LabelSettings_qvxvp"]
font = ExtResource("4_xx6j3")
font_size = 33
outline_size = 11
outline_color = Color(0.258915, 0.234974, 0.191974, 1)
[node name="Demo" type="Node2D"]
y_sort_enabled = true
script = ExtResource("1_foif6")
[node name="UI Layer" type="CanvasLayer" parent="."]
[node name="Control" type="Control" parent="UI Layer"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme = ExtResource("2_e6mlj")
[node name="Logo" type="TextureRect" parent="UI Layer/Control"]
layout_mode = 1
anchors_preset = 3
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -1899.0
offset_top = -130.0
offset_right = -1643.0
offset_bottom = -45.0
grow_horizontal = 0
grow_vertical = 0
texture = ExtResource("3_t7by8")
[node name="Demo project" type="Label" parent="UI Layer/Control/Logo"]
layout_mode = 1
anchors_preset = 3
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -316.0
offset_top = -72.0
offset_right = 13.0
offset_bottom = 74.0
grow_horizontal = 0
grow_vertical = 0
text = "demo project"
label_settings = SubResource("LabelSettings_628x3")
horizontal_alignment = 2
vertical_alignment = 1
[node name="ToggleFullscreen" type="Button" parent="UI Layer/Control"]
layout_mode = 1
anchors_preset = 1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -214.0
offset_top = 30.0
offset_right = -31.0
offset_bottom = 75.0
grow_horizontal = 0
focus_mode = 0
theme_override_fonts/font = ExtResource("4_xx6j3")
theme_override_font_sizes/font_size = 22
text = "Toggle Fullscreen"
script = ExtResource("5_2oy30")
[node name="VBoxContainer" type="VBoxContainer" parent="UI Layer/Control"]
layout_mode = 1
anchors_preset = 3
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -394.0
offset_top = -231.0
offset_right = 99.0
offset_bottom = 39.0
grow_horizontal = 0
grow_vertical = 0
[node name="Label" type="Label" parent="UI Layer/Control/VBoxContainer"]
layout_mode = 2
text = "Move WASD
Attack ENTER or F
Dash SPACE"
label_settings = SubResource("LabelSettings_0r6iv")
[node name="HPBar" type="TextureProgressBar" parent="UI Layer/Control"]
unique_name_in_owner = true
layout_mode = 0
offset_left = 25.0
offset_top = 24.0
offset_right = 405.0
offset_bottom = 84.0
value = 100.0
texture_under = ExtResource("6_3dtym")
texture_over = ExtResource("7_3xolo")
texture_progress = ExtResource("8_ee1p0")
[node name="RoundCounter" type="Label" parent="UI Layer/Control"]
unique_name_in_owner = true
layout_mode = 1
offset_left = 441.0
offset_top = 29.0
offset_right = 610.0
offset_bottom = 81.0
text = "Round: 0/1"
label_settings = SubResource("LabelSettings_qvxvp")
[node name="Arena" parent="." instance=ExtResource("1_rab6h")]
[node name="Gong" parent="." instance=ExtResource("3_nbeay")]
position = Vector2(923, -21)
[node name="Player" parent="." instance=ExtResource("5_cmgoj")]
position = Vector2(843, 455)
@ -19,3 +154,37 @@ drag_horizontal_enabled = true
drag_vertical_enabled = true
drag_top_margin = 0.1
drag_bottom_margin = 0.1
[node name="SpawnPoints" type="Node2D" parent="."]
[node name="SpawnPosition1" type="Marker2D" parent="SpawnPoints"]
position = Vector2(512, -180)
[node name="SpawnPosition2" type="Marker2D" parent="SpawnPoints"]
position = Vector2(1421, -150)
[node name="SpawnPosition3" type="Marker2D" parent="SpawnPoints"]
position = Vector2(1512, 300)
[node name="SpawnPosition4" type="Marker2D" parent="SpawnPoints"]
position = Vector2(2264, 345)
[node name="SpawnPosition5" type="Marker2D" parent="SpawnPoints"]
position = Vector2(1655, 789)
[node name="SpawnPosition6" type="Marker2D" parent="SpawnPoints"]
position = Vector2(823, 826)
[node name="SpawnPosition7" type="Marker2D" parent="SpawnPoints"]
position = Vector2(67, 648)
[node name="SpawnPosition8" type="Marker2D" parent="SpawnPoints"]
position = Vector2(-399, 434)
[node name="SpawnPosition9" type="Marker2D" parent="SpawnPoints"]
position = Vector2(629, 417)
[node name="SpawnPosition10" type="Marker2D" parent="SpawnPoints"]
position = Vector2(1859, 3)
[connection signal="gong_struck" from="Gong" to="." method="_on_gong_gong_struck"]

View File

@ -11,7 +11,7 @@ config_version=5
[application]
config/name="LimboAI Demo"
run/main_scene="res://demo/scenes/arena.tscn"
run/main_scene="res://demo/scenes/demo.tscn"
config/features=PackedStringArray("4.2", "Forward Plus")
config/icon="res://demo/icon.svg"
@ -48,7 +48,13 @@ move_down={
attack={
"deadzone": 0.5,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194309,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"echo":false,"script":null)
]
}
dash={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"echo":false,"script":null)
]
}