diff --git a/.idea/.idea.TouhouGD.dir/.idea/libraries/GdSdk_Master.xml b/.idea/.idea.TouhouGD.dir/.idea/libraries/GdSdk_Master.xml
deleted file mode 100644
index eeb9e82..0000000
--- a/.idea/.idea.TouhouGD.dir/.idea/libraries/GdSdk_Master.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/addons/beehave/nodes/composites/sequence.gd b/addons/beehave/nodes/composites/sequence.gd
index 11b5d79..ec3ab82 100644
--- a/addons/beehave/nodes/composites/sequence.gd
+++ b/addons/beehave/nodes/composites/sequence.gd
@@ -12,65 +12,65 @@ var successful_index: int = 0
func tick(actor: Node, blackboard: Blackboard) -> int:
- for c in get_children():
-
- if c.get_index() < successful_index:
- continue
-
- if c != running_child:
- c.before_run(actor, blackboard)
-
- var response = c.tick(actor, blackboard)
- if can_send_message(blackboard):
- BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response)
-
- if c is ConditionLeaf:
- blackboard.set_value("last_condition", c, str(actor.get_instance_id()))
- blackboard.set_value("last_condition_status", response, str(actor.get_instance_id()))
-
- match response:
- SUCCESS:
- _cleanup_running_task(c, actor, blackboard)
- successful_index += 1
- c.after_run(actor, blackboard)
- FAILURE:
- _cleanup_running_task(c, actor, blackboard)
- # Interrupt any child that was RUNNING before.
- interrupt(actor, blackboard)
- c.after_run(actor, blackboard)
- return FAILURE
- RUNNING:
- if c != running_child:
- if running_child != null:
- running_child.interrupt(actor, blackboard)
- running_child = c
- if c is ActionLeaf:
- blackboard.set_value("running_action", c, str(actor.get_instance_id()))
- return RUNNING
-
- _reset()
- return SUCCESS
+ for c in get_children():
+
+ if c.get_index() < successful_index:
+ continue
+
+ if c != running_child:
+ c.before_run(actor, blackboard)
+
+ var response = c.tick(actor, blackboard)
+ if can_send_message(blackboard):
+ BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response)
+
+ if c is ConditionLeaf:
+ blackboard.set_value("last_condition", c, str(actor.get_instance_id()))
+ blackboard.set_value("last_condition_status", response, str(actor.get_instance_id()))
+
+ match response:
+ SUCCESS:
+ _cleanup_running_task(c, actor, blackboard)
+ successful_index += 1
+ c.after_run(actor, blackboard)
+ FAILURE:
+ _cleanup_running_task(c, actor, blackboard)
+ # Interrupt any child that was RUNNING before.
+ interrupt(actor, blackboard)
+ c.after_run(actor, blackboard)
+ return FAILURE
+ RUNNING:
+ if c != running_child:
+ if running_child != null:
+ running_child.interrupt(actor, blackboard)
+ running_child = c
+ if c is ActionLeaf:
+ blackboard.set_value("running_action", c, str(actor.get_instance_id()))
+ return RUNNING
+
+ _reset()
+ return SUCCESS
func interrupt(actor: Node, blackboard: Blackboard) -> void:
- _reset()
- super(actor, blackboard)
+ _reset()
+ super(actor, blackboard)
func _reset() -> void:
- successful_index = 0
+ successful_index = 0
## Changes `running_action` and `running_child` after the node finishes executing.
func _cleanup_running_task(finished_action: Node, actor: Node, blackboard: Blackboard):
- var blackboard_name = str(actor.get_instance_id())
- if finished_action == running_child:
- running_child = null
- if finished_action == blackboard.get_value("running_action", null, blackboard_name):
- blackboard.set_value("running_action", null, blackboard_name)
+ var blackboard_name = str(actor.get_instance_id())
+ if finished_action == running_child:
+ running_child = null
+ if finished_action == blackboard.get_value("running_action", null, blackboard_name):
+ blackboard.set_value("running_action", null, blackboard_name)
func get_class_name() -> Array[StringName]:
- var classes := super()
- classes.push_back(&"SequenceComposite")
- return classes
+ var classes := super()
+ classes.push_back(&"SequenceComposite")
+ return classes
diff --git a/config/attack/sharp_mid_hit.tres b/config/attack/sharp_mid_hit.tres
index 20ae1c5..7e101a1 100644
--- a/config/attack/sharp_mid_hit.tres
+++ b/config/attack/sharp_mid_hit.tres
@@ -12,6 +12,8 @@ is_floating = false
is_hit_down = false
is_rebound = false
is_stop_self = true
+is_throw_check = false
+is_throw_end = false
hit_back_speed = 3.0
hit_up_speed = 1.0
hit_back_duration = 0.05
diff --git a/config/character_mp/normal.tres b/config/character_mp/normal.tres
index adb2b8e..22db85a 100644
--- a/config/character_mp/normal.tres
+++ b/config/character_mp/normal.tres
@@ -6,7 +6,8 @@
script = ExtResource("1_sfq22")
mp_max = 5
mp_sub_max = 100.0
-recover_speed = 10.0
-recover_cd = 2.0
-add_rate_attack = 1.0
-add_rate_hit = 1.0
+recover_speed = 50.0
+recover_cd = 1.0
+add_rate_attack = 0.0
+add_rate_hit = 2.0
+charging_speed = 100.0
diff --git a/config/core/monster03_slash02.tres b/config/core/monster03_slash02.tres
new file mode 100644
index 0000000..105a7ce
--- /dev/null
+++ b/config/core/monster03_slash02.tres
@@ -0,0 +1,8 @@
+[gd_resource type="Resource" script_class="CoreCfg" load_steps=2 format=3 uid="uid://duhgn52hssk87"]
+
+[ext_resource type="Script" path="res://script/config/core_cfg.gd" id="1_e8a6y"]
+
+[resource]
+script = ExtResource("1_e8a6y")
+name = ""
+type = 2
diff --git a/config/core/monster03_slash03.tres b/config/core/monster03_slash03.tres
new file mode 100644
index 0000000..c3e0035
--- /dev/null
+++ b/config/core/monster03_slash03.tres
@@ -0,0 +1,8 @@
+[gd_resource type="Resource" script_class="CoreCfg" load_steps=2 format=3 uid="uid://b63634fi2nms7"]
+
+[ext_resource type="Script" path="res://script/config/core_cfg.gd" id="1_grj3e"]
+
+[resource]
+script = ExtResource("1_grj3e")
+name = ""
+type = 2
diff --git a/config/skill_core/monster03_slash02.tres b/config/skill_core/monster03_slash02.tres
new file mode 100644
index 0000000..c17e443
--- /dev/null
+++ b/config/skill_core/monster03_slash02.tres
@@ -0,0 +1,29 @@
+[gd_resource type="Resource" script_class="SkillCfg" load_steps=8 format=3 uid="uid://dslyyl3uqjwi1"]
+
+[ext_resource type="Resource" uid="uid://btg40rn2f36c2" path="res://config/attack/sharp_normal_hit_back.tres" id="1_sp2tj"]
+[ext_resource type="Resource" uid="uid://bv4uoey1liqoq" path="res://config/attack/sharp_heavy_hit_blow.tres" id="1_txo8b"]
+[ext_resource type="Resource" uid="uid://bnfnjdw0tms3h" path="res://config/attack_box/box_large.tres" id="2_8iiyr"]
+[ext_resource type="Resource" uid="uid://diedb7vw7eyxp" path="res://config/attack_box/box_mid.tres" id="2_tp3t7"]
+[ext_resource type="Script" path="res://script/config/skill_cfg.gd" id="3_oagn5"]
+[ext_resource type="SpriteFrames" uid="uid://bac4ype7w4wr7" path="res://resource/animation/character/monster03_skill.aseprite" id="5_jfqys"]
+[ext_resource type="Animation" uid="uid://2oxeq83bpofb" path="res://resource/skill_animation/monster03_slash02.tres" id="6_yqy3u"]
+
+[resource]
+script = ExtResource("3_oagn5")
+name = ""
+skill_animation = ExtResource("6_yqy3u")
+range = 2.0
+free_lock = false
+ignore_push = true
+attack1 = ExtResource("1_sp2tj")
+attack1_box = ExtResource("2_tp3t7")
+attack2 = ExtResource("1_txo8b")
+attack2_box = ExtResource("2_8iiyr")
+stance_from = 100
+stance_to = 0
+break_level = 3
+is_charging = false
+mp_cost = 1
+refresh_animation = false
+sprite_frames = ExtResource("5_jfqys")
+animation_name = "skill02"
diff --git a/config/skill_core/monster03_slash03.tres b/config/skill_core/monster03_slash03.tres
new file mode 100644
index 0000000..7c5f078
--- /dev/null
+++ b/config/skill_core/monster03_slash03.tres
@@ -0,0 +1,25 @@
+[gd_resource type="Resource" script_class="SkillCfg" load_steps=6 format=3 uid="uid://1hson47yrtgq"]
+
+[ext_resource type="Resource" uid="uid://qmivx7ntfrki" path="res://config/attack/sharp_mid_hit.tres" id="1_iexxu"]
+[ext_resource type="Resource" uid="uid://bnfnjdw0tms3h" path="res://config/attack_box/box_large.tres" id="2_p4b1w"]
+[ext_resource type="Script" path="res://script/config/skill_cfg.gd" id="3_n02wr"]
+[ext_resource type="Animation" uid="uid://co8bivpp1fm6g" path="res://resource/skill_animation/monster03_slash03.tres" id="4_cip05"]
+[ext_resource type="SpriteFrames" uid="uid://bac4ype7w4wr7" path="res://resource/animation/character/monster03_skill.aseprite" id="5_0ny0c"]
+
+[resource]
+script = ExtResource("3_n02wr")
+name = ""
+skill_animation = ExtResource("4_cip05")
+range = 4.0
+free_lock = false
+ignore_push = false
+attack1 = ExtResource("1_iexxu")
+attack1_box = ExtResource("2_p4b1w")
+stance_from = 100
+stance_to = 0
+break_level = 3
+is_charging = false
+mp_cost = 1
+refresh_animation = false
+sprite_frames = ExtResource("5_0ny0c")
+animation_name = "skill03"
diff --git a/resource/animation/character/monster03_skill.aseprite b/resource/animation/character/monster03_skill.aseprite
index 85fa641..6489077 100644
Binary files a/resource/animation/character/monster03_skill.aseprite and b/resource/animation/character/monster03_skill.aseprite differ
diff --git a/resource/animation/character/monster03_skill.png b/resource/animation/character/monster03_skill.png
index f4b07f5..7103e51 100644
Binary files a/resource/animation/character/monster03_skill.png and b/resource/animation/character/monster03_skill.png differ
diff --git a/resource/skill_animation/monster03_slash02.tres b/resource/skill_animation/monster03_slash02.tres
new file mode 100644
index 0000000..1351df5
--- /dev/null
+++ b/resource/skill_animation/monster03_slash02.tres
@@ -0,0 +1,149 @@
+[gd_resource type="Animation" load_steps=2 format=3 uid="uid://2oxeq83bpofb"]
+
+[ext_resource type="SpriteFrames" uid="uid://bac4ype7w4wr7" path="res://resource/animation/character/monster03_skill.aseprite" id="1_arqnp"]
+
+[resource]
+resource_name = "monster03_slash02"
+length = 2.9
+step = 0.1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("View:sprite_frames")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [ExtResource("1_arqnp")]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("View:animation")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": ["skill02"]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("Status:break_level")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0, 2.2, 2.4),
+"transitions": PackedFloat32Array(1, 1, 1),
+"update": 1,
+"values": [0, 3, 4]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("Status:speed_up_rate")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0.1, 0.8, 1.1, 1.3, 1.6, 1.8),
+"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1),
+"update": 1,
+"values": [-0.5, -1.0, -0.5, -1.0, -0.5, -1.0]
+}
+tracks/4/type = "value"
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/path = NodePath("Status:skill_move_speed")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/keys = {
+"times": PackedFloat32Array(0.7, 0.9, 1.2, 1.4, 1.7, 1.9),
+"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1),
+"update": 1,
+"values": [3.0, 0.0, 2.0, 0.0, 3.0, 0.0]
+}
+tracks/5/type = "method"
+tracks/5/imported = false
+tracks/5/enabled = true
+tracks/5/path = NodePath("Battle")
+tracks/5/interp = 1
+tracks/5/loop_wrap = true
+tracks/5/keys = {
+"times": PackedFloat32Array(0.9, 1.4, 1.9),
+"transitions": PackedFloat32Array(1, 1, 1),
+"values": [{
+"args": [],
+"method": &"attack1"
+}, {
+"args": [],
+"method": &"attack1"
+}, {
+"args": [],
+"method": &"attack2"
+}]
+}
+tracks/6/type = "method"
+tracks/6/imported = false
+tracks/6/enabled = true
+tracks/6/path = NodePath("Effect")
+tracks/6/interp = 1
+tracks/6/loop_wrap = true
+tracks/6/keys = {
+"times": PackedFloat32Array(0.8, 1.3, 1.8),
+"transitions": PackedFloat32Array(1, 1, 1),
+"values": [{
+"args": [],
+"method": &"cast_attack_particle1"
+}, {
+"args": [],
+"method": &"cast_attack_particle2"
+}, {
+"args": [],
+"method": &"cast_attack_particle3"
+}]
+}
+tracks/7/type = "value"
+tracks/7/imported = false
+tracks/7/enabled = true
+tracks/7/path = NodePath("%Status:skill_move_stop")
+tracks/7/interp = 1
+tracks/7/loop_wrap = true
+tracks/7/keys = {
+"times": PackedFloat32Array(1, 1.5),
+"transitions": PackedFloat32Array(1, 1),
+"update": 1,
+"values": [false, false]
+}
+tracks/8/type = "value"
+tracks/8/imported = false
+tracks/8/enabled = true
+tracks/8/path = NodePath("View:frame")
+tracks/8/interp = 1
+tracks/8/loop_wrap = true
+tracks/8/keys = {
+"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8),
+"transitions": PackedFloat32Array(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, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]
+}
+tracks/9/type = "method"
+tracks/9/imported = false
+tracks/9/enabled = true
+tracks/9/path = NodePath("%Battle")
+tracks/9/interp = 1
+tracks/9/loop_wrap = true
+tracks/9/keys = {
+"times": PackedFloat32Array(1, 1.5),
+"transitions": PackedFloat32Array(1, 1),
+"values": [{
+"args": [],
+"method": &"change_dir"
+}, {
+"args": [],
+"method": &"change_dir"
+}]
+}
diff --git a/resource/skill_animation/monster03_slash03.tres b/resource/skill_animation/monster03_slash03.tres
new file mode 100644
index 0000000..cf4c374
--- /dev/null
+++ b/resource/skill_animation/monster03_slash03.tres
@@ -0,0 +1,111 @@
+[gd_resource type="Animation" load_steps=2 format=3 uid="uid://co8bivpp1fm6g"]
+
+[ext_resource type="SpriteFrames" uid="uid://bac4ype7w4wr7" path="res://resource/animation/character/monster03_skill.aseprite" id="1_bo7dx"]
+
+[resource]
+resource_name = "monster03_slash03"
+length = 1.8
+step = 0.1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("View:sprite_frames")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [ExtResource("1_bo7dx")]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("View:animation")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": ["skill03"]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("Status:break_level")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0, 1.1, 1.3),
+"transitions": PackedFloat32Array(1, 1, 1),
+"update": 1,
+"values": [0, 3, 4]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("Status:speed_up_rate")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0.1, 0.7),
+"transitions": PackedFloat32Array(1, 1),
+"update": 1,
+"values": [-0.5, -1.0]
+}
+tracks/4/type = "value"
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/path = NodePath("Status:skill_move_speed")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/keys = {
+"times": PackedFloat32Array(0.6, 0.9),
+"transitions": PackedFloat32Array(1, 1),
+"update": 1,
+"values": [10.0, 0.0]
+}
+tracks/5/type = "method"
+tracks/5/imported = false
+tracks/5/enabled = true
+tracks/5/path = NodePath("Battle")
+tracks/5/interp = 1
+tracks/5/loop_wrap = true
+tracks/5/keys = {
+"times": PackedFloat32Array(0.9, 1),
+"transitions": PackedFloat32Array(1, 1),
+"values": [{
+"args": [],
+"method": &"attack1"
+}, {
+"args": [],
+"method": &"stop"
+}]
+}
+tracks/6/type = "method"
+tracks/6/imported = false
+tracks/6/enabled = true
+tracks/6/path = NodePath("Effect")
+tracks/6/interp = 1
+tracks/6/loop_wrap = true
+tracks/6/keys = {
+"times": PackedFloat32Array(0.8),
+"transitions": PackedFloat32Array(1),
+"values": [{
+"args": [],
+"method": &"cast_attack_particle1"
+}]
+}
+tracks/7/type = "value"
+tracks/7/imported = false
+tracks/7/enabled = true
+tracks/7/path = NodePath("View:frame")
+tracks/7/interp = 1
+tracks/7/loop_wrap = true
+tracks/7/keys = {
+"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7),
+"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
+"update": 1,
+"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
+}
diff --git a/resource/skill_animation_library/animation_library.tres b/resource/skill_animation_library/animation_library.tres
index fc9a546..6029745 100644
--- a/resource/skill_animation_library/animation_library.tres
+++ b/resource/skill_animation_library/animation_library.tres
@@ -1,4 +1,4 @@
-[gd_resource type="AnimationLibrary" load_steps=45 format=3 uid="uid://croik07a1qko5"]
+[gd_resource type="AnimationLibrary" load_steps=47 format=3 uid="uid://croik07a1qko5"]
[ext_resource type="Animation" uid="uid://t01a4jvp8srr" path="res://resource/skill_animation/hero01_fist_attack01.tres" id="1_4bwwm"]
[ext_resource type="Animation" uid="uid://cfapnjkj5dkws" path="res://resource/skill_animation/hero01_basic_flash.tres" id="1_46f01"]
@@ -43,7 +43,9 @@
[ext_resource type="Animation" uid="uid://bbq4e0a0eyrke" path="res://resource/skill_animation/hero01_fist_skill_charging02.tres" id="24_j0oqq"]
[ext_resource type="Animation" uid="uid://h8hm3kbecdx8" path="res://resource/skill_animation/hero01_remote01.tres" id="33_7i37k"]
[ext_resource type="Animation" uid="uid://q7qlw0a7hfjt" path="res://resource/skill_animation/hero01_slash01.tres" id="38_lyels"]
+[ext_resource type="Animation" uid="uid://2oxeq83bpofb" path="res://resource/skill_animation/monster03_slash02.tres" id="45_1vnur"]
[ext_resource type="Animation" uid="uid://dyyt3nsvoye62" path="res://resource/skill_animation/monster03_slash01.tres" id="45_s1ue4"]
+[ext_resource type="Animation" uid="uid://co8bivpp1fm6g" path="res://resource/skill_animation/monster03_slash03.tres" id="46_litb8"]
[resource]
_data = {
@@ -91,5 +93,7 @@ _data = {
"hero01_short_attack03": ExtResource("11_kejyu"),
"hero01_short_attack04": ExtResource("11_bxi8a"),
"hero01_slash01": ExtResource("38_lyels"),
-"monster03_slash01": ExtResource("45_s1ue4")
+"monster03_slash01": ExtResource("45_s1ue4"),
+"monster03_slash02": ExtResource("45_1vnur"),
+"monster03_slash03": ExtResource("46_litb8")
}
diff --git a/scene/ai/bullet01.tscn b/scene/ai/bullet01.tscn
index a72c310..ab85eee 100644
--- a/scene/ai/bullet01.tscn
+++ b/scene/ai/bullet01.tscn
@@ -14,7 +14,7 @@
[node name="BeehaveTree" type="Node" node_paths=PackedStringArray("blackboard")]
script = ExtResource("1_r673b")
-blackboard = NodePath("@Node@19131")
+blackboard = NodePath("@Node@76945")
[node name="SelectorComposite" type="Node" parent="."]
script = ExtResource("2_5ltau")
diff --git a/scene/ai/bullet02.tscn b/scene/ai/bullet02.tscn
index e1ecebf..1b4fde1 100644
--- a/scene/ai/bullet02.tscn
+++ b/scene/ai/bullet02.tscn
@@ -8,7 +8,7 @@
[node name="BeehaveTree" type="Node" node_paths=PackedStringArray("blackboard")]
script = ExtResource("1_go1b5")
-blackboard = NodePath("@Node@19481")
+blackboard = NodePath("@Node@19487")
[node name="SequenceComposite" type="Node" parent="."]
script = ExtResource("2_k8nph")
diff --git a/scene/ai/monster01.tscn b/scene/ai/monster01.tscn
index 70e4e25..7eb4c19 100644
--- a/scene/ai/monster01.tscn
+++ b/scene/ai/monster01.tscn
@@ -7,7 +7,7 @@
[node name="BeehaveTree" type="Node" node_paths=PackedStringArray("blackboard")]
script = ExtResource("1_bbyao")
-blackboard = NodePath("@Node@79226")
+blackboard = NodePath("@Node@77274")
[node name="SequenceComposite" type="Node" parent="."]
script = ExtResource("2_04nig")
diff --git a/scene/ai/monster03.tscn b/scene/ai/monster03.tscn
index 4235db8..753816a 100644
--- a/scene/ai/monster03.tscn
+++ b/scene/ai/monster03.tscn
@@ -1,13 +1,17 @@
-[gd_scene load_steps=5 format=3 uid="uid://bk74u53bkeckp"]
+[gd_scene load_steps=9 format=3 uid="uid://bk74u53bkeckp"]
[ext_resource type="Script" path="res://addons/beehave/nodes/beehave_tree.gd" id="1_tkdjh"]
[ext_resource type="Script" path="res://addons/beehave/nodes/composites/sequence.gd" id="2_mxprp"]
[ext_resource type="Script" path="res://script/ai/action/action_find_target.gd" id="3_wmb22"]
-[ext_resource type="Script" path="res://script/ai/action_with_target/action_move_to_target.gd" id="4_8dx07"]
+[ext_resource type="Script" path="res://script/ai/action_role_check/action_role_check_is.gd" id="4_4huwy"]
+[ext_resource type="Script" path="res://addons/beehave/nodes/composites/selector.gd" id="4_x2ddi"]
+[ext_resource type="Script" path="res://script/ai/action_with_target/action_move_to.gd" id="5_x5dsk"]
+[ext_resource type="Script" path="res://script/ai/action_with_target/action_cast_skill.gd" id="7_sslsg"]
+[ext_resource type="Script" path="res://script/ai/action/action_wait.gd" id="9_n5wac"]
[node name="BeehaveTree" type="Node" node_paths=PackedStringArray("blackboard")]
script = ExtResource("1_tkdjh")
-blackboard = NodePath("@Node@79226")
+blackboard = NodePath("@Node@81414")
[node name="SequenceComposite" type="Node" parent="."]
script = ExtResource("2_mxprp")
@@ -15,5 +19,48 @@ script = ExtResource("2_mxprp")
[node name="ActionFindTarget" type="Node" parent="SequenceComposite"]
script = ExtResource("3_wmb22")
-[node name="ActionMoveToTarget" type="Node" parent="SequenceComposite"]
-script = ExtResource("4_8dx07")
+[node name="SelectorComposite" type="Node" parent="SequenceComposite"]
+script = ExtResource("4_x2ddi")
+
+[node name="SequenceComposite" type="Node" parent="SequenceComposite/SelectorComposite"]
+script = ExtResource("2_mxprp")
+
+[node name="ActionRoleCheckIs" type="Node" parent="SequenceComposite/SelectorComposite/SequenceComposite"]
+script = ExtResource("4_4huwy")
+key = 1
+
+[node name="ActionMoveTo" type="Node" parent="SequenceComposite/SelectorComposite/SequenceComposite"]
+script = ExtResource("5_x5dsk")
+dist_max = 2.0
+
+[node name="ActionCastSkill" type="Node" parent="SequenceComposite/SelectorComposite/SequenceComposite"]
+script = ExtResource("7_sslsg")
+
+[node name="SequenceComposite2" type="Node" parent="SequenceComposite/SelectorComposite"]
+script = ExtResource("2_mxprp")
+
+[node name="ActionRoleCheckIs" type="Node" parent="SequenceComposite/SelectorComposite/SequenceComposite2"]
+script = ExtResource("4_4huwy")
+key = 2
+
+[node name="ActionMoveTo" type="Node" parent="SequenceComposite/SelectorComposite/SequenceComposite2"]
+script = ExtResource("5_x5dsk")
+dist_min = 3.0
+dist_max = 4.0
+
+[node name="ActionCastSkill" type="Node" parent="SequenceComposite/SelectorComposite/SequenceComposite2"]
+script = ExtResource("7_sslsg")
+
+[node name="SequenceComposite3" type="Node" parent="SequenceComposite/SelectorComposite"]
+script = ExtResource("2_mxprp")
+
+[node name="ActionRoleCheckIs" type="Node" parent="SequenceComposite/SelectorComposite/SequenceComposite3"]
+script = ExtResource("4_4huwy")
+
+[node name="ActionMoveTo" type="Node" parent="SequenceComposite/SelectorComposite/SequenceComposite3"]
+script = ExtResource("5_x5dsk")
+dist_min = 4.0
+
+[node name="ActionWait" type="Node" parent="SequenceComposite/SelectorComposite/SequenceComposite3"]
+script = ExtResource("9_n5wac")
+wait_time = 2.0
diff --git a/scene/character/monster.tscn b/scene/character/monster.tscn
index 5f0afc0..60cc998 100644
--- a/scene/character/monster.tscn
+++ b/scene/character/monster.tscn
@@ -1,9 +1,9 @@
[gd_scene load_steps=3 format=3 uid="uid://c37rf5ecfrvwn"]
[ext_resource type="PackedScene" uid="uid://8rcvw1vnjcf7" path="res://scene/character/character.tscn" id="1_eshlr"]
-[ext_resource type="Script" path="res://script/character/ai/ai.gd" id="2_7ei2q"]
+[ext_resource type="Script" path="res://script/character/ai/monster_ai.gd" id="2_e8lqw"]
[node name="Character" instance=ExtResource("1_eshlr")]
-[node name="MonsterAI" type="Node3D" parent="." index="10"]
-script = ExtResource("2_7ei2q")
+[node name="MonsterAI" type="Node3D" parent="." index="11"]
+script = ExtResource("2_e8lqw")
diff --git a/scene/effect/particle/monster03_slash02_1.tscn b/scene/effect/particle/monster03_slash02_1.tscn
new file mode 100644
index 0000000..b5183fd
--- /dev/null
+++ b/scene/effect/particle/monster03_slash02_1.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://c7s7omfjy0r8m"]
+
+[ext_resource type="PackedScene" uid="uid://b2h4pcmlii7dg" path="res://scene/effect/particle/_particle_slash1.tscn" id="1_x3fg4"]
+
+[node name="Particle" instance=ExtResource("1_x3fg4")]
+transform = Transform3D(1, 0, 0, 0, -0.707107, 0.353553, 0, -0.707107, -0.353553, 0, 0, 0)
diff --git a/scene/effect/particle/monster03_slash02_2.tscn b/scene/effect/particle/monster03_slash02_2.tscn
new file mode 100644
index 0000000..52d9818
--- /dev/null
+++ b/scene/effect/particle/monster03_slash02_2.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://h5gbbs3adi4r"]
+
+[ext_resource type="PackedScene" uid="uid://b2h4pcmlii7dg" path="res://scene/effect/particle/_particle_slash1.tscn" id="1_7tpc0"]
+
+[node name="Particle" instance=ExtResource("1_7tpc0")]
+transform = Transform3D(1, 0, 0, 0, 0.707107, -0.353553, 0, 0.707107, 0.353553, 0, 0, 0)
diff --git a/scene/effect/particle/monster03_slash02_3.tscn b/scene/effect/particle/monster03_slash02_3.tscn
new file mode 100644
index 0000000..2f9e03e
--- /dev/null
+++ b/scene/effect/particle/monster03_slash02_3.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://damjb16ouflry"]
+
+[ext_resource type="PackedScene" uid="uid://b2h4pcmlii7dg" path="res://scene/effect/particle/_particle_slash1.tscn" id="1_f5wcv"]
+
+[node name="Particle" instance=ExtResource("1_f5wcv")]
+transform = Transform3D(1.6, 0, 0, 0, 0.707107, -0.353553, 0, 0.707107, 0.353553, 0, 0, 0)
diff --git a/scene/effect/particle/monster03_slash03.tscn b/scene/effect/particle/monster03_slash03.tscn
new file mode 100644
index 0000000..e004df3
--- /dev/null
+++ b/scene/effect/particle/monster03_slash03.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://dmqr8g8x4gcny"]
+
+[ext_resource type="PackedScene" uid="uid://b2h4pcmlii7dg" path="res://scene/effect/particle/_particle_slash1.tscn" id="1_m433m"]
+
+[node name="Particle" instance=ExtResource("1_m433m")]
+transform = Transform3D(1, 0, 0, 0, -0.707107, 0.353553, 0, -0.707107, -0.353553, 0, 0, 0)
diff --git a/scene/launcher.tscn b/scene/launcher.tscn
index ef8d274..bf7fd96 100644
--- a/scene/launcher.tscn
+++ b/scene/launcher.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=32 format=3 uid="uid://eoydwrunmm5n"]
+[gd_scene load_steps=33 format=3 uid="uid://eoydwrunmm5n"]
[ext_resource type="Script" path="res://script/manager/game_manager.gd" id="1_q2t80"]
[ext_resource type="Script" path="res://script/manager/level_manager.gd" id="2_ewhkj"]
@@ -16,6 +16,7 @@
[ext_resource type="Script" path="res://script/manager/effect_manager.gd" id="8_0jv87"]
[ext_resource type="PackedScene" uid="uid://b78dbmcsioaa4" path="res://scene/ui/status_screen.tscn" id="9_bki0o"]
[ext_resource type="PackedScene" uid="uid://0uonhojhfgi" path="res://scene/ui/menu_screen.tscn" id="10_sky2n"]
+[ext_resource type="Script" path="res://script/manager/ai_manager.gd" id="11_fm4d1"]
[ext_resource type="Script" path="res://script/manager/input_manager.gd" id="12_vfqm4"]
[ext_resource type="Script" path="res://script/character/status.gd" id="18_nr8sb"]
[ext_resource type="SpriteFrames" uid="uid://bac4ype7w4wr7" path="res://resource/animation/character/monster03_skill.aseprite" id="19_6w5yx"]
@@ -112,6 +113,18 @@ tracks/5/keys = {
"update": 0,
"values": [-1.0]
}
+tracks/6/type = "value"
+tracks/6/imported = false
+tracks/6/enabled = true
+tracks/6/path = NodePath("%Status:skill_move_stop")
+tracks/6/interp = 1
+tracks/6/loop_wrap = true
+tracks/6/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [false]
+}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_avnjy"]
_data = {
@@ -163,6 +176,9 @@ script = ExtResource("4_oonkb")
[node name="EffectManager" type="Node3D" parent="GameManager/Stage/SubViewport"]
script = ExtResource("8_0jv87")
+[node name="AIManager" type="Node3D" parent="GameManager/Stage/SubViewport"]
+script = ExtResource("11_fm4d1")
+
[node name="UIManager" type="Node3D" parent="GameManager"]
process_mode = 3
script = ExtResource("7_wa6ef")
@@ -204,7 +220,8 @@ double_sided = false
alpha_cut = 2
texture_filter = 0
sprite_frames = ExtResource("19_6w5yx")
-animation = &"skill01"
+animation = &"skill02"
+frame = 28
[node name="Throw" type="AnimatedSprite3D" parent="EditorTool/Character"]
unique_name_in_owner = true
diff --git a/scene/ui/item/headbar.tscn b/scene/ui/item/headbar.tscn
index c25e76e..4b72f9c 100644
--- a/scene/ui/item/headbar.tscn
+++ b/scene/ui/item/headbar.tscn
@@ -132,3 +132,13 @@ offset_right = 80.0
offset_bottom = 6.0
theme_override_font_sizes/font_size = 10
text = "123,123"
+
+[node name="RoleLabel" type="Label" parent="."]
+unique_name_in_owner = true
+layout_mode = 0
+offset_left = 24.0
+offset_top = -20.0
+offset_right = 80.0
+offset_bottom = -6.0
+theme_override_font_sizes/font_size = 10
+text = "123,123"
diff --git a/script/_global/enum.gd b/script/_global/enum.gd
index cc0b296..74c1a1e 100644
--- a/script/_global/enum.gd
+++ b/script/_global/enum.gd
@@ -17,3 +17,4 @@ enum EStance {
enum EBreakLevel {None, Cancel, Jump, Break, Walk} #不可打断 取消技打断 跳跃打断 连招打断 行走打断
enum ECoreType {Active, Passive}
enum EGlobalEffect {CameraSize, CameraShake, ColorShift, Blur, SpeedLine}
+enum EAIRoleType {None, Saber, Assassin, Caster}
\ No newline at end of file
diff --git a/script/ai/action_blackboard.gd b/script/ai/action_blackboard.gd
index b7637b1..eb2b11a 100644
--- a/script/ai/action_blackboard.gd
+++ b/script/ai/action_blackboard.gd
@@ -1,10 +1,3 @@
@icon("res://addons/beehave/icons/blackboard.svg")
class_name ActionBlackboard
extends Action
-
-func run(character: Character, blackboard: Blackboard) -> int:
- return execute(character, blackboard)
-
-
-func execute(character: Character, blackboard: Blackboard) -> int:
- return FAILURE
diff --git a/script/ai/action_blackboard/action_blackboard_add.gd b/script/ai/action_blackboard/action_blackboard_add.gd
index b63edf3..91ec545 100644
--- a/script/ai/action_blackboard/action_blackboard_add.gd
+++ b/script/ai/action_blackboard/action_blackboard_add.gd
@@ -5,7 +5,7 @@ class_name ActionBlackboardAdd
@export var value: int
-func execute(character: Character, blackboard: Blackboard) -> int:
+func run(character: Character, blackboard: Blackboard) -> int:
var left: int = blackboard.get_value(key, 0)
blackboard.set_value(key, left+value)
return SUCCESS
diff --git a/script/ai/action_blackboard/action_blackboard_check.gd b/script/ai/action_blackboard/action_blackboard_check.gd
index d9a4b17..6924c13 100644
--- a/script/ai/action_blackboard/action_blackboard_check.gd
+++ b/script/ai/action_blackboard/action_blackboard_check.gd
@@ -15,7 +15,7 @@ enum Operators {
@export var value: int
-func execute(character: Character, blackboard: Blackboard) -> int:
+func run(character: Character, blackboard: Blackboard) -> int:
var left: Variant = blackboard.get_value(key, 0)
var result: bool = false
match operator:
diff --git a/script/ai/action_blackboard/action_blackboard_set.gd b/script/ai/action_blackboard/action_blackboard_set.gd
index e267dc5..f0a83e2 100644
--- a/script/ai/action_blackboard/action_blackboard_set.gd
+++ b/script/ai/action_blackboard/action_blackboard_set.gd
@@ -5,6 +5,6 @@ class_name ActionBlackboardSet
@export var value: int
-func execute(character: Character, blackboard: Blackboard) -> int:
+func run(character: Character, blackboard: Blackboard) -> int:
blackboard.set_value(key, value)
return SUCCESS
diff --git a/script/ai/action_role_check.gd b/script/ai/action_role_check.gd
new file mode 100644
index 0000000..39e60ee
--- /dev/null
+++ b/script/ai/action_role_check.gd
@@ -0,0 +1,3 @@
+@icon("res://addons/beehave/icons/category_leaf.svg")
+class_name ActionRoleCheck
+extends Action
diff --git a/script/ai/action_role_check/action_role_check_is.gd b/script/ai/action_role_check/action_role_check_is.gd
new file mode 100644
index 0000000..9e8fbd9
--- /dev/null
+++ b/script/ai/action_role_check/action_role_check_is.gd
@@ -0,0 +1,10 @@
+extends ActionRoleCheck
+class_name ActionRoleCheckIs
+
+@export var key: Enum.EAIRoleType = Enum.EAIRoleType.None
+
+
+func run(character: Character, blackboard: Blackboard) -> int:
+ if character.get_status("ai_role") == key:
+ return SUCCESS
+ return FAILURE
diff --git a/script/ai/action_role_check/action_role_check_is_not.gd b/script/ai/action_role_check/action_role_check_is_not.gd
new file mode 100644
index 0000000..29d17f1
--- /dev/null
+++ b/script/ai/action_role_check/action_role_check_is_not.gd
@@ -0,0 +1,10 @@
+extends ActionRoleCheck
+class_name ActionRoleCheckIsNot
+
+@export var key: Enum.EAIRoleType = Enum.EAIRoleType.None
+
+
+func run(character: Character, blackboard: Blackboard) -> int:
+ if character.get_status("ai_role") != key:
+ return SUCCESS
+ return FAILURE
diff --git a/script/ai/action_with_target/action_cast_skill.gd b/script/ai/action_with_target/action_cast_skill.gd
new file mode 100644
index 0000000..1aa8e32
--- /dev/null
+++ b/script/ai/action_with_target/action_cast_skill.gd
@@ -0,0 +1,30 @@
+extends ActionWithTarget
+class_name ActionCastSkill
+
+func execute(character: Character, target: Character, blackboard: Blackboard) -> int:
+ var skill: Skill = character.skill
+ var status: Status = character.status
+ var dir: Vector2 = target.pos2D() - character.pos2D()
+ if status.is_skill_running:
+ character.move_to(dir)
+ return RUNNING
+ var dist: float = dir.length()
+ for skill_cfg: SkillCfg in skill.skill_dict.values():
+ #检查姿态
+ var stance_from: int = skill_cfg.stance_from
+ var check_any_ground: bool = (stance_from == Enum.EStance.GroundAny) and status.is_on_floor
+ var check_any_air: bool = (stance_from == Enum.EStance.AirAny) and not status.is_on_floor
+ var check_any: bool = (stance_from == Enum.EStance.Any) or check_any_ground or check_any_air
+ if (stance_from != int(status.stance)) and not check_any:
+ continue
+ #检查距离
+ if dist > skill_cfg.range:
+ continue
+ #检查远程最小释放距离
+ if dist < skill_cfg.range - 2:
+ continue
+ #施放技能
+ var ret: bool = skill.cast_skill(skill_cfg, dir)
+ if ret:
+ return SUCCESS
+ return FAILURE
diff --git a/script/ai/action_with_target/action_move_to.gd b/script/ai/action_with_target/action_move_to.gd
new file mode 100644
index 0000000..07f27fa
--- /dev/null
+++ b/script/ai/action_with_target/action_move_to.gd
@@ -0,0 +1,16 @@
+extends ActionWithTarget
+class_name ActionMoveTo
+
+@export var dist_min: float = 0
+@export var dist_max: float = 5
+
+
+func execute(character: Character, target: Character, blackboard: Blackboard) -> int:
+ var dir: Vector2 = target.pos2D() - character.pos2D()
+ var dist: float = dir.length()
+ if (dist > dist_min ) and (dist < dist_max):
+ character.move_stop()
+ return SUCCESS
+ var is_far: bool = dist >= dist_max
+ character.move_to(dir if is_far else -dir)
+ return FAILURE
diff --git a/script/character/ai/ai.gd b/script/character/ai/ai.gd
index ae9fdee..cd8eb40 100644
--- a/script/character/ai/ai.gd
+++ b/script/character/ai/ai.gd
@@ -4,6 +4,7 @@ class_name AI
@onready var character: Character = (get_owner() as Character)
@onready var status: Status = (%Status as Status)
+var ai: BeehaveTree
var is_init: bool = false
var has_ai: bool = false
@@ -16,12 +17,17 @@ func _process(delta) -> void:
if not status.cfg:
return
is_init = true
- var ai: PackedScene = status.cfg.get_ai()
- if not ai:
+ var ai_scene: PackedScene = status.cfg.get_ai()
+ if not ai_scene:
return
- var ai_node: Node = ai.instantiate()
- add_child(ai_node)
+ ai = ai_scene.instantiate() as BeehaveTree
+ add_child(ai)
has_ai = true
+ on_init()
+
+
+func on_init() -> void:
+ pass
func on_process(delta):
diff --git a/script/character/ai/monster_ai.gd b/script/character/ai/monster_ai.gd
index 608cea2..5058f02 100644
--- a/script/character/ai/monster_ai.gd
+++ b/script/character/ai/monster_ai.gd
@@ -1,5 +1,12 @@
extends AI
class_name MonsterAI
-func on_process(delta):
- pass
+@onready var core: Core = (%Core as Core)
+
+
+func on_init()->void:
+ var core_list: Array[CoreCfg] = character.status.cfg.get_core_cfg_list()
+ var index: int = 0
+ for core_cfg in core_list:
+ core.set_active_core(index, core_cfg)
+ index += 1
\ No newline at end of file
diff --git a/script/character/battle.gd b/script/character/battle.gd
index 58ae54a..008c6c4 100644
--- a/script/character/battle.gd
+++ b/script/character/battle.gd
@@ -272,7 +272,7 @@ func add_mp_sub(value: float, from_battle: bool):
character.set_status("mp", mp+1)
character.set_status("mp_sub", 0)
else:
- character.set_status("mp_sub", mp_sub+value)
+ character.set_status("mp_sub", max(mp_sub+value, 0))
if from_battle:
character.remove_buff("mp_recover")
@@ -314,8 +314,12 @@ func cast_sub_character(): skill.on_cast_sub_character()
func hold(): skill.on_hold()
-func stop():
- move.stop()
+func stop(): move.stop()
+
+
+func change_dir():
+ status.skill_dir = status.move_dir
+ status.is_right = status.move_dir.x > 0
func on_attack_hit(hit_result: HitResult) -> void:
diff --git a/script/character/character.gd b/script/character/character.gd
index 2a7fbad..7d00c84 100644
--- a/script/character/character.gd
+++ b/script/character/character.gd
@@ -37,6 +37,7 @@ func init_after():
set_status("mp", 0)
set_status("mp_sub_max", cfg.mp.mp_sub_max)
set_status("mp_sub", 0)
+ add_mp_sub(0, true)
func set_body_scale(cfg: CharacterCfg) -> void:
diff --git a/script/character/effect.gd b/script/character/effect.gd
index 8d02a2f..6398287 100644
--- a/script/character/effect.gd
+++ b/script/character/effect.gd
@@ -92,6 +92,12 @@ func cast_attack_particle2(): _cast_attack_particle(2, true)
func cast_attack_particle2_release(): _cast_attack_particle(2, false)
+func cast_attack_particle3(): _cast_attack_particle(3, true)
+
+
+func cast_attack_particle3_release(): _cast_attack_particle(3, false)
+
+
func cast_self_particle() -> void:
if !status.cfg:
return
diff --git a/script/character/player/combo.gd b/script/character/player/combo.gd
index 0173c23..c58334f 100644
--- a/script/character/player/combo.gd
+++ b/script/character/player/combo.gd
@@ -25,6 +25,8 @@ func _ready():
core.set_active_core(0, load("res://config/core/hero01_remote01.tres") as CoreCfg)
core.set_active_core(1, load("res://config/core/monster03_slash01.tres") as CoreCfg)
+ core.set_active_core(2, load("res://config/core/monster03_slash02.tres") as CoreCfg)
+ core.set_active_core(3, load("res://config/core/monster03_slash03.tres") as CoreCfg)
func _process(delta):
diff --git a/script/character/skill.gd b/script/character/skill.gd
index 2718f25..a841376 100644
--- a/script/character/skill.gd
+++ b/script/character/skill.gd
@@ -45,7 +45,7 @@ func cast_skill_by_name(name: String, cast_dir: Vector2):
cast_skill(cfg, cast_dir)
-func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = "") -> void:
+func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = "") -> bool:
if cast_dir.length() == 0:
cast_dir = Vector2.RIGHT if status.is_right else Vector2.LEFT
if !cfg.free_lock and status.target:
@@ -56,12 +56,11 @@ func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = "") -> vo
var animation_name: String = "animation_library/%s" % cfg.get_res_name()
if not has_animation(animation_name):
print("技能animation不存在", animation_name)
- return
+ return false
if status.mp < cfg.mp_cost:
#todo mp不足
- print("mp不足")
- return
+ return false
break_skill()
character.cost_mp(cfg.mp_cost)
@@ -80,6 +79,7 @@ func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = "") -> vo
buff.add_buff("charging", -1)
if cast_dir.x != 0: status.is_right = cast_dir.x > 0
play(animation_name, -1, Setting.animation_speed_scale)
+ return true
func break_skill():
@@ -114,7 +114,6 @@ func cancel_skill():
func on_attack_miss():
# 攻击未命中时跳帧
- print("on_attack_miss")
_frame_forward()
diff --git a/script/character/status.gd b/script/character/status.gd
index afabcd1..ac01d10 100644
--- a/script/character/status.gd
+++ b/script/character/status.gd
@@ -78,6 +78,8 @@ class_name Status
@export var is_switch: bool #是否切换到核心释放模式
@export var is_charging: bool #是否蓄力
@export var charging_level: int #蓄力等级
+@export_category("ai状态")
+@export var ai_role: int #ai角色
@export_category("动画触发器")
@export var trigger_jump: bool #跳跃
@export var trigger_hit: bool #受击-地面-轻
diff --git a/script/config/character_cfg.gd b/script/config/character_cfg.gd
index 6117153..ff5107b 100644
--- a/script/config/character_cfg.gd
+++ b/script/config/character_cfg.gd
@@ -23,6 +23,8 @@ class_name CharacterCfg
@export var attack2_box: AttackBoxCfg
@export var sub_character: CharacterCfg
+var core_cfg_list: Array[CoreCfg]
+
func get_attack1()->AttackCfg: return attack1 if attack1 else ResourceManager.cfg_attack_normal
@@ -35,16 +37,35 @@ func get_attack2()->AttackCfg: return attack2 if attack2 else ResourceManager.cf
func get_attack2_box()->AttackBoxCfg: return attack2_box if attack2_box else ResourceManager.cfg_attack_box_normal
+
func get_particle()->Resource:
- var res_name: String = get_res_name()
+ var res_name: String = get_res_name()
var path_default: String = "res://scene/effect/particle/%s.tscn" % res_name
if ResourceLoader.exists(path_default):
return load(path_default)
return null
+
func get_ai()->PackedScene:
- var res_name: String = get_res_name()
+ var res_name: String = get_res_name()
var path_default: String = "res://scene/ai/%s.tscn" % res_name
if ResourceLoader.exists(path_default):
return load(path_default) as PackedScene
- return null
\ No newline at end of file
+ return null
+
+
+func get_core_cfg_list()->Array[CoreCfg]:
+ if core_cfg_list:
+ return core_cfg_list
+ core_cfg_list = []
+ var res_name: String = get_res_name()
+ var dir_path: String = "res://config/core"
+ var dir: DirAccess = DirAccess.open(dir_path)
+ for file in dir.get_files():
+ if not file.begins_with(res_name):
+ continue
+ var path: String = dir_path + "/" + file
+ var res = load(path)
+ if res is CoreCfg:
+ core_cfg_list.append(res)
+ return core_cfg_list
diff --git a/script/manager/ai_manager.gd b/script/manager/ai_manager.gd
new file mode 100644
index 0000000..086a7ec
--- /dev/null
+++ b/script/manager/ai_manager.gd
@@ -0,0 +1,41 @@
+extends Node3D
+class_name AIManager
+
+var tick_time: float = 1
+var tick_time_left: float = 1
+var role_num_1: int = 2 #近战
+var role_num_2: int = 1 #刺客
+var role_num_3: int = 2 #远程
+
+
+func _ready():
+ pass
+
+
+func _process(delta) -> void:
+ tick_time_left -= delta
+ if tick_time_left <= 0:
+ tick_time_left = tick_time
+ tick_time_left = 0
+ if tick_time_left > 0:
+ return
+ var player: Character = Global.character_mgr.get_player()
+ if not player: return
+ var enemy_list: Array[Character] = Global.character_mgr.get_enemy_list(player.id())
+ if not enemy_list: return
+ var pos_player: Vector2 = player.pos2D()
+ enemy_list.sort_custom(func(a: Character, b: Character): return a.pos2D().distance_squared_to(pos_player) < b.pos2D().distance_squared_to(pos_player))
+ var index: int = 0
+ for enemy in enemy_list:
+ if enemy.get_status("is_stagger") or enemy.get_status("is_stun"):
+ enemy.set_status("ai_role", Enum.EAIRoleType.None)
+ continue
+ if index < role_num_1:
+ enemy.set_status("ai_role", Enum.EAIRoleType.Saber)
+ elif index < role_num_1 + role_num_2:
+ enemy.set_status("ai_role", Enum.EAIRoleType.Assassin)
+ elif index < role_num_1 + role_num_2 + role_num_3:
+ enemy.set_status("ai_role", Enum.EAIRoleType.Caster)
+ else:
+ enemy.set_status("ai_role", Enum.EAIRoleType.None)
+ index += 1
\ No newline at end of file
diff --git a/script/manager/character_manager.gd b/script/manager/character_manager.gd
index 333ef41..3b60492 100644
--- a/script/manager/character_manager.gd
+++ b/script/manager/character_manager.gd
@@ -87,3 +87,4 @@ func get_enemy_list(id: int) -> Array[Character]:
if character.team() != target.team():
ret.append(character)
return ret
+
diff --git a/script/manager/input_manager.gd b/script/manager/input_manager.gd
index c1d8435..70f402b 100644
--- a/script/manager/input_manager.gd
+++ b/script/manager/input_manager.gd
@@ -1,6 +1,6 @@
extends Node3D
-func _input(event):
+func _input(event) -> void:
if !event.is_action_type():
return
for action_name in InputMap.get_actions():
@@ -8,5 +8,5 @@ func _input(event):
SignalManager.input_action_pressed.emit(action_name)
elif event.is_action_released(action_name):
SignalManager.input_action_released.emit(action_name)
- var input_dir = Input.get_vector("move_left", "move_right", "move_up", "move_down")
+ var input_dir: Vector2 = Input.get_vector("move_left", "move_right", "move_up", "move_down")
SignalManager.input_action_move.emit(input_dir)
diff --git a/script/ui/hud/boss_status_item.gd b/script/ui/hud/boss_status_item.gd
index 468719e..222013f 100644
--- a/script/ui/hud/boss_status_item.gd
+++ b/script/ui/hud/boss_status_item.gd
@@ -1,6 +1,6 @@
extends Control
-@onready var hp_bar = $HpBar as TextureProgressBar
+@onready var hp_bar: TextureProgressBar = $HpBar as TextureProgressBar
func on_hp_max_changed(value: float):
diff --git a/script/ui/hud/core_item.gd b/script/ui/hud/core_item.gd
index 329cd18..8b9a7aa 100644
--- a/script/ui/hud/core_item.gd
+++ b/script/ui/hud/core_item.gd
@@ -1,18 +1,18 @@
extends Control
-@onready var core_item_list = [
- $CoreItemFree/Up, $CoreItemFree/Left, $CoreItemFree/Down, $CoreItemFree/Right,
- $CoreItemLock/Up, $CoreItemLock/Left, $CoreItemLock/Down, $CoreItemLock/Right,
- ]
+@onready var core_item_list: Array[Variant] = [
+ $CoreItemFree/Up, $CoreItemFree/Left, $CoreItemFree/Down, $CoreItemFree/Right,
+ $CoreItemLock/Up, $CoreItemLock/Left, $CoreItemLock/Down, $CoreItemLock/Right,
+ ]
-@onready var core_item_free = $CoreItemFree
-@onready var core_item_lock = $CoreItemLock
+@onready var core_item_free: Control = $CoreItemFree
+@onready var core_item_lock: Control = $CoreItemLock
func on_core_active_list_changed(core_list):
for i in range(len(core_list)):
- var cfg = core_list[i]
- var item = core_item_list[i] as CoreItemSub
+ var cfg = core_list[i]
+ var item: CoreItemSub = core_item_list[i] as CoreItemSub
if cfg:
item.set_icon(cfg.get_icon())
else:
@@ -24,7 +24,7 @@ func on_is_switch_changed(value: bool):
func on_target_changed(value: int):
- var isLock = value != 0
+ var isLock: bool = value != 0
core_item_free.visible = !isLock
core_item_lock.visible = isLock
diff --git a/script/ui/hud/core_item_sub.gd b/script/ui/hud/core_item_sub.gd
index a296e9a..86df363 100644
--- a/script/ui/hud/core_item_sub.gd
+++ b/script/ui/hud/core_item_sub.gd
@@ -1,9 +1,9 @@
extends Control
class_name CoreItemSub
-@onready var icon = $CoreIcon as TextureRect
-@onready var slot = $CoreSlot as TextureRect
-@onready var icon_empty = load("res://resource/ui/icon/core/empty.png")
+@onready var icon: TextureRect = $CoreIcon as TextureRect
+@onready var slot: TextureRect = $CoreSlot as TextureRect
+@onready var icon_empty: Texture2D = load("res://resource/ui/icon/core/empty.png") as Texture2D
func set_icon(value: Texture2D):
diff --git a/script/ui/hud/headbar.gd b/script/ui/hud/headbar.gd
index cdd296b..ecfd8d2 100644
--- a/script/ui/hud/headbar.gd
+++ b/script/ui/hud/headbar.gd
@@ -1,13 +1,14 @@
extends Control
class_name Headbar
-@onready var hit_text_scene = preload("res://scene/ui/item/hit_text.tscn")
-@onready var hp_bar = (%HpBar as TextureProgressBar)
-@onready var shield_bar = (%ShieldBar as TextureProgressBar)
-@onready var stun_bar = (%StunBar as TextureProgressBar)
-@onready var mp_bar = (%MpBar as TextureProgressBar)
-@onready var mp_sub_bar = (%MpSubBar as TextureProgressBar)
-@onready var pos_lable = (%PosLabel as Label)
+@onready var hit_text_scene: PackedScene = preload("res://scene/ui/item/hit_text.tscn")
+@onready var hp_bar: TextureProgressBar = (%HpBar as TextureProgressBar)
+@onready var shield_bar: TextureProgressBar = (%ShieldBar as TextureProgressBar)
+@onready var stun_bar: TextureProgressBar = (%StunBar as TextureProgressBar)
+@onready var mp_bar: TextureProgressBar = (%MpBar as TextureProgressBar)
+@onready var mp_sub_bar: TextureProgressBar = (%MpSubBar as TextureProgressBar)
+@onready var pos_lable: Label = (%PosLabel as Label)
+@onready var role_lable: Label = (%RoleLabel as Label)
var hit_text_damage_cache: HitText
@@ -18,7 +19,9 @@ func on_hp_changed(value): hp_bar.value = value
func on_hp_max_changed(value): hp_bar.max_value = value
-func on_shield_changed(value): shield_bar.value = value;shield_bar.visible = value > 0
+func on_shield_changed(value):
+ shield_bar.value = value
+ shield_bar.visible = value > 0
func on_shield_max_changed(value): shield_bar.max_value = value
@@ -45,13 +48,16 @@ func on_mp_sub_max_changed(value): mp_sub_bar.max_value = value
func on_pos2d_changed(value): pos_lable.text = "(%.2f,%.2f)"%[value.x, value.y]
+func on_ai_role_changed(value): role_lable.text = str(value)
+
+
func on_hit_text(value: String):
- var hit_text = get_hit_text_object()
+ var hit_text: HitText = get_hit_text_object()
hit_text.show_hit_text(value)
func on_hit_damage(value: float):
- var hit_text = hit_text_damage_cache
+ var hit_text: HitText = hit_text_damage_cache
if not hit_text or hit_text.is_close:
hit_text_damage_cache = get_hit_text_object()
hit_text = hit_text_damage_cache
@@ -59,6 +65,6 @@ func on_hit_damage(value: float):
func get_hit_text_object()->HitText:
- var hit_text = hit_text_scene.instantiate() as HitText
+ var hit_text: HitText = hit_text_scene.instantiate() as HitText
add_child(hit_text)
return hit_text
diff --git a/script/ui/hud/headbar_page.gd b/script/ui/hud/headbar_page.gd
index 510b49f..dd31c3b 100644
--- a/script/ui/hud/headbar_page.gd
+++ b/script/ui/hud/headbar_page.gd
@@ -1,6 +1,6 @@
extends Control
-@onready var headbar_scene = preload("res://scene/ui/item/headbar.tscn")
+@onready var headbar_scene: PackedScene = preload("res://scene/ui/item/headbar.tscn")
@onready var camera: CameraManager = Global.camera_mgr
@@ -8,7 +8,7 @@ class HeadbarMeta:
var pos: Vector3
var headbar: Headbar
-var headbar_map = {}
+var headbar_map: Dictionary = {}
func _ready():
@@ -23,11 +23,11 @@ func _ready():
func _process(delta):
for k in headbar_map:
- var headbar_meta = headbar_map[k] as HeadbarMeta
+ var headbar_meta: HeadbarMeta = headbar_map[k] as HeadbarMeta
headbar_meta.headbar.position = camera.get_screen_pos(headbar_meta.pos)
-func on_character_create(id: int, type: int, pos: Vector3):
+func on_character_create(id: int, type: int, pos: Vector3) -> void:
if type != Enum.ECharacterType.Monster:
return
var new_headbar_meta = HeadbarMeta.new()
@@ -39,54 +39,54 @@ func on_character_create(id: int, type: int, pos: Vector3):
headbar_map[id] = new_headbar_meta
-func on_character_ui_pos_changed(id: int, pos: Vector3):
+func on_character_ui_pos_changed(id: int, pos: Vector3) -> void:
if not id in headbar_map:
return
- var headbar_meta = headbar_map[id]
- var headbar = headbar_meta.headbar as Headbar
+ var headbar_meta = headbar_map[id]
+ var headbar: Headbar = headbar_meta.headbar as Headbar
headbar_meta.pos = pos
headbar.position = camera.get_screen_pos(pos)
-func on_character_destroy(id: int):
+func on_character_destroy(id: int) -> void:
if not id in headbar_map:
return
- var headbar_meta = headbar_map[id]
- var headbar = headbar_meta.headbar as Headbar
+ var headbar_meta = headbar_map[id]
+ var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.queue_free()
headbar_map.erase(id)
-func on_character_status_changed(id: int, status_name: String, value):
+func on_character_status_changed(id: int, status_name: String, value) -> void:
if not id in headbar_map:
return
- var headbar_meta = headbar_map[id]
- var headbar = headbar_meta.headbar as Headbar
- var func_name = "on_%s_changed" % status_name
+ var headbar_meta = headbar_map[id]
+ var headbar: Headbar = headbar_meta.headbar as Headbar
+ var func_name: String = "on_%s_changed" % status_name
if headbar.has_method(func_name):
headbar.call(func_name, value)
-func on_character_hit_text(id: int, value: String):
+func on_character_hit_text(id: int, value: String) -> void:
if not id in headbar_map:
return
- var headbar_meta = headbar_map[id]
- var headbar = headbar_meta.headbar as Headbar
+ var headbar_meta = headbar_map[id]
+ var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.on_hit_text(value)
-func on_character_hit_damage(id: int, value: float):
+func on_character_hit_damage(id: int, value: float) -> void:
if not id in headbar_map:
return
- var headbar_meta = headbar_map[id]
- var headbar = headbar_meta.headbar as Headbar
+ var headbar_meta = headbar_map[id]
+ var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.on_hit_damage(value)
-func on_character_die(id: int):
+func on_character_die(id: int) -> void:
if not id in headbar_map:
return
- var headbar_meta = headbar_map[id]
- var headbar = headbar_meta.headbar as Headbar
+ var headbar_meta = headbar_map[id]
+ var headbar: Headbar = headbar_meta.headbar as Headbar
headbar.queue_free()
headbar_map.erase(id)
diff --git a/script/ui/hud/hit_text.gd b/script/ui/hud/hit_text.gd
index 15e56a5..e361d96 100644
--- a/script/ui/hud/hit_text.gd
+++ b/script/ui/hud/hit_text.gd
@@ -1,8 +1,8 @@
extends Control
class_name HitText
-@onready var animation = %AnimationPlayer as AnimationPlayer
-@onready var label = %Label as Label
+@onready var animation: AnimationPlayer = %AnimationPlayer as AnimationPlayer
+@onready var label: Label = %Label as Label
var damage_cache: float
var is_close: bool
@@ -29,8 +29,8 @@ func _on_animation_player_animation_finished(anim_name):
match anim_name:
"stage1":
is_close = true
- animation.play("stage2_%d"%randi_range(1, 4))
- "stage2_1","stage2_2","stage2_3","stage2_4":
+ animation.play("stage2_%d" % randi_range(1, 4))
+ "stage2_1", "stage2_2", "stage2_3", "stage2_4":
queue_free()
"stage3":
queue_free()
diff --git a/script/ui/hud/loading_page.gd b/script/ui/hud/loading_page.gd
index bfecd6d..4bf3e2a 100644
--- a/script/ui/hud/loading_page.gd
+++ b/script/ui/hud/loading_page.gd
@@ -1,6 +1,6 @@
extends Control
-@onready var animation = $AnimationPlayer as AnimationPlayer
+@onready var animation: AnimationPlayer = $AnimationPlayer as AnimationPlayer
var color_material: ShaderMaterial
diff --git a/script/ui/hud/lock_item.gd b/script/ui/hud/lock_item.gd
index ccfa2d9..dacc2fe 100644
--- a/script/ui/hud/lock_item.gd
+++ b/script/ui/hud/lock_item.gd
@@ -1,6 +1,6 @@
extends Control
-@onready var animation = $AnimationPlayer as AnimationPlayer
+@onready var animation: AnimationPlayer = $AnimationPlayer as AnimationPlayer
@onready var camera: CameraManager = Global.camera_mgr
var target: Character
diff --git a/script/ui/hud/mp_item_sub.gd b/script/ui/hud/mp_item_sub.gd
index ed298dc..71948b7 100644
--- a/script/ui/hud/mp_item_sub.gd
+++ b/script/ui/hud/mp_item_sub.gd
@@ -1,8 +1,8 @@
extends TextureRect
class_name MpItemSub
-@onready var mp_icon = preload("res://resource/ui/hud/player_status_mp.png") as Texture2D
-@onready var mp_icon_empty = preload("res://resource/ui/hud/player_status_mp_empty.png") as Texture2D
+@onready var mp_icon: Texture2D = preload("res://resource/ui/hud/player_status_mp.png") as Texture2D
+@onready var mp_icon_empty: Texture2D = preload("res://resource/ui/hud/player_status_mp_empty.png") as Texture2D
func set_active(is_active: bool):
diff --git a/script/ui/hud/player_status_item.gd b/script/ui/hud/player_status_item.gd
index 775f8cc..ad137e3 100644
--- a/script/ui/hud/player_status_item.gd
+++ b/script/ui/hud/player_status_item.gd
@@ -1,15 +1,18 @@
extends Control
-@onready var mp_scene = preload("res://scene/ui/item/mp_item.tscn")
-@onready var hp_bar = $HpBar as TextureProgressBar
-@onready var mp_sub_bar = $MpSubBar as TextureProgressBar
-@onready var mp_list = $MpList as HBoxContainer
-@onready var break_level_label = $TestBreakLevel as Label
+@onready var mp_scene: PackedScene = preload("res://scene/ui/item/mp_item.tscn")
+@onready var hp_bar: TextureProgressBar = $HpBar as TextureProgressBar
+@onready var mp_sub_bar: TextureProgressBar = $MpSubBar as TextureProgressBar
+@onready var mp_list: HBoxContainer = $MpList as HBoxContainer
+@onready var break_level_label: Label = $TestBreakLevel as Label
+
func _process(delta: float) -> void:
# test
- var player: Character = Global.character_mgr.get_player()
- break_level_label.text = str(player.get_status("break_level"))
+ var player: Character = Global.character_mgr.get_player()
+ if player:
+ break_level_label.text = str(player.get_status("break_level"))
+
func on_hp_max_changed(value: float):
hp_bar.max_value = value
@@ -31,11 +34,11 @@ func on_mp_max_changed(value: int):
for child in mp_list.get_children():
child.queue_free()
for i in range(value):
- var mp_item = mp_scene.instantiate() as MpItemSub
+ var mp_item: MpItemSub = mp_scene.instantiate() as MpItemSub
mp_list.add_child(mp_item)
func on_mp_changed(value: int):
for i in range(mp_list.get_child_count()):
- var mp_item = mp_list.get_child(i) as MpItemSub
+ var mp_item: MpItemSub = mp_list.get_child(i) as MpItemSub
mp_item.set_active(i void:
if not visible:
return
if weapon_index_dir:
@@ -37,7 +37,7 @@ func on_weapon_index_changed(index: int): weapon_index = index
func on_weapon_index_change_rate_changed(rate: float): weapon_index_rate = rate
-func on_weapon_index_change_dir_changed(dir: int):
+func on_weapon_index_change_dir_changed(dir: int) -> void:
weapon_index_dir = dir
if not weapon_index_dir:
return
@@ -70,10 +70,10 @@ func pop_back(): remove_child(weapon_item_list.pop_back())
func create_weapon_item(offset: int)->WeaponItemSub:
- var weapon_count = len(weapon_list)
- var index = ((weapon_index + offset) % weapon_count + weapon_count) % weapon_count
- var weapon_item_sub = weapon_scene.instantiate() as WeaponItemSub
- var weapon_cfg = weapon_list[index] as WeaponCfg
+ var weapon_count: int = len(weapon_list)
+ var index: int = ((weapon_index + offset) % weapon_count + weapon_count) % weapon_count
+ var weapon_item_sub: WeaponItemSub = weapon_scene.instantiate() as WeaponItemSub
+ var weapon_cfg: WeaponCfg = weapon_list[index] as WeaponCfg
add_child(weapon_item_sub)
weapon_item_sub.init(weapon_cfg.icon)
return weapon_item_sub
@@ -81,16 +81,16 @@ func create_weapon_item(offset: int)->WeaponItemSub:
func item_lerp(dir: int, rate: float):
for i in range(len(weapon_item_list)):
- var item = weapon_item_list[i] as WeaponItemSub
- var target_index = i-2
- var index = target_index+dir
- var pos_from = get_item_pos(index)
- var pos_to = get_item_pos(target_index)
- var alpha_from = 1 if abs(index)<=1 else 0
- var alpha_to = 1 if abs(target_index)<=1 else 0
+ var item: WeaponItemSub = weapon_item_list[i] as WeaponItemSub
+ var target_index = i-2
+ var index = target_index+dir
+ var pos_from: Vector2 = get_item_pos(index)
+ var pos_to: Vector2 = get_item_pos(target_index)
+ var alpha_from: int = 1 if abs(index)<=1 else 0
+ var alpha_to: int = 1 if abs(target_index)<=1 else 0
item.position = lerp(pos_from, pos_to, rate)
item.update_alpha(alpha_from, alpha_to, rate)
-func get_item_pos(offset: int):
+func get_item_pos(offset: int) -> Vector2:
return Vector2(item_layout_offset_x*offset, item_layout_offset_y if offset else 0)