From c4a721dfa0914edc92e7862d7260c94628ba5bab Mon Sep 17 00:00:00 2001
From: chendian <->
Date: Sun, 8 Sep 2024 16:39:20 +0800
Subject: [PATCH] =?UTF-8?q?monster=2003=20ai=E5=88=9D=E7=89=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../.idea/libraries/GdSdk_Master.xml | 10 --
addons/beehave/nodes/composites/sequence.gd | 98 ++++++------
config/attack/sharp_mid_hit.tres | 2 +
config/character_mp/normal.tres | 9 +-
config/core/monster03_slash02.tres | 8 +
config/core/monster03_slash03.tres | 8 +
config/skill_core/monster03_slash02.tres | 29 ++++
config/skill_core/monster03_slash03.tres | 25 +++
.../character/monster03_skill.aseprite | Bin 9568 -> 30191 bytes
.../animation/character/monster03_skill.png | Bin 2753 -> 7141 bytes
.../skill_animation/monster03_slash02.tres | 149 ++++++++++++++++++
.../skill_animation/monster03_slash03.tres | 111 +++++++++++++
.../animation_library.tres | 8 +-
scene/ai/bullet01.tscn | 2 +-
scene/ai/bullet02.tscn | 2 +-
scene/ai/monster01.tscn | 2 +-
scene/ai/monster03.tscn | 57 ++++++-
scene/character/monster.tscn | 6 +-
.../effect/particle/monster03_slash02_1.tscn | 6 +
.../effect/particle/monster03_slash02_2.tscn | 6 +
.../effect/particle/monster03_slash02_3.tscn | 6 +
scene/effect/particle/monster03_slash03.tscn | 6 +
scene/launcher.tscn | 21 ++-
scene/ui/item/headbar.tscn | 10 ++
script/_global/enum.gd | 1 +
script/ai/action_blackboard.gd | 7 -
.../action_blackboard_add.gd | 2 +-
.../action_blackboard_check.gd | 2 +-
.../action_blackboard_set.gd | 2 +-
script/ai/action_role_check.gd | 3 +
.../action_role_check/action_role_check_is.gd | 10 ++
.../action_role_check_is_not.gd | 10 ++
.../action_with_target/action_cast_skill.gd | 30 ++++
.../ai/action_with_target/action_move_to.gd | 16 ++
script/character/ai/ai.gd | 14 +-
script/character/ai/monster_ai.gd | 11 +-
script/character/battle.gd | 10 +-
script/character/character.gd | 1 +
script/character/effect.gd | 6 +
script/character/player/combo.gd | 2 +
script/character/skill.gd | 9 +-
script/character/status.gd | 2 +
script/config/character_cfg.gd | 27 +++-
script/manager/ai_manager.gd | 41 +++++
script/manager/character_manager.gd | 1 +
script/manager/input_manager.gd | 4 +-
script/ui/hud/boss_status_item.gd | 2 +-
script/ui/hud/core_item.gd | 18 +--
script/ui/hud/core_item_sub.gd | 6 +-
script/ui/hud/headbar.gd | 28 ++--
script/ui/hud/headbar_page.gd | 46 +++---
script/ui/hud/hit_text.gd | 8 +-
script/ui/hud/loading_page.gd | 2 +-
script/ui/hud/lock_item.gd | 2 +-
script/ui/hud/mp_item_sub.gd | 4 +-
script/ui/hud/player_status_item.gd | 21 +--
script/ui/hud/weapon_item.gd | 36 ++---
57 files changed, 776 insertions(+), 189 deletions(-)
delete mode 100644 .idea/.idea.TouhouGD.dir/.idea/libraries/GdSdk_Master.xml
create mode 100644 config/core/monster03_slash02.tres
create mode 100644 config/core/monster03_slash03.tres
create mode 100644 config/skill_core/monster03_slash02.tres
create mode 100644 config/skill_core/monster03_slash03.tres
create mode 100644 resource/skill_animation/monster03_slash02.tres
create mode 100644 resource/skill_animation/monster03_slash03.tres
create mode 100644 scene/effect/particle/monster03_slash02_1.tscn
create mode 100644 scene/effect/particle/monster03_slash02_2.tscn
create mode 100644 scene/effect/particle/monster03_slash02_3.tscn
create mode 100644 scene/effect/particle/monster03_slash03.tscn
create mode 100644 script/ai/action_role_check.gd
create mode 100644 script/ai/action_role_check/action_role_check_is.gd
create mode 100644 script/ai/action_role_check/action_role_check_is_not.gd
create mode 100644 script/ai/action_with_target/action_cast_skill.gd
create mode 100644 script/ai/action_with_target/action_move_to.gd
create mode 100644 script/manager/ai_manager.gd
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 85fa641af8e9ec317fe96b73bc1d1332276a9dff..648907720619b8e1feff7489b9b184b1df35bf72 100644
GIT binary patch
literal 30191
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
BLuvp3
delta 241
zcmaF=n(=`bdx9zh!-J)A6WJ?yKe90}{Q4-$kix*gAiA+vnVH=M$dXWCn!KG^l~H!`
iU1ssgd@M4XEm#i7^J)O4etl#FD`uShQ9*j}ivR$2t~>_-
diff --git a/resource/animation/character/monster03_skill.png b/resource/animation/character/monster03_skill.png
index f4b07f5d26d2e63fa6b786c2910d0b23dbc52490..7103e51df7123537b82f3dcfb54366de9e946281 100644
GIT binary patch
literal 7141
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
literal 2753
zcmV;y3O@CTP)r003eL1^@s6kC01?00001b5ch_0Itp)
z=>Px@`lLMsw86V(?SN4r
zN^RafF%Xb?M%m2Jz4~c^p$inu@f`MKcG
z;;l^DJy40v@`B*43Vr4){M7KTqHWn&p6C9T|H1RW9rw}MpJ_B#qc&|;fTN>hSeT!S
z+NZu_C_M7^P{VXNJxLSY5K
z3q({_ROYAU?>f}&g^)~~KnM~^eaDdSCUw#7u@)ssAZ!_#W%+6OI{=;LFs@v$q9PCx
zwTF%12+-B`w%c9FM^S~u^5#&@_#D0FpO^}StV!)*BPyH5sZDBktC3l8Sy*eGLSR!Xa0f6er&JX|=AAHkM5x#Pw{+5Mrlrjm$wm@{C_6LB8wN`X9
znzWy@hk|S+lPJ@LS0zt@h@jDtX#KtVl!;$MS?9#Q^%F7+dhxTt^_Xc$hVz@RhSA5}6p-5cci0_FYVWS@`dC
z%CKc+-xWz9rqI+8S%e+1)b(U75|&GIm$9|gzDTmaK<9QE;?7wVafq%5{{RKV>{Q5w`MF^4fzj~L
z;w`BI`^v#F<)^4Dbdl4R0g7WqRMD{_EU7FC`=e}d%~sb_-!Wu7oa<#=3@EHQvxn<_
zm{@DsIvs%G4~2_}PW(y--Px&yiC?b(m-uoeaZ9Ih~wKGdzG;2L5
zl3J#S>Sn-Iw*zQ8vnInTFP3aLF}*9Sy!QiIXMPEw+rp=9du5@R4yyn!maJf}k<1k^
zZGR;nC5=dUROV55++o`OQj22J&BWoYid&LyW|2U2u7l8-wP`_kyhz+5x?a@otYDHR
zjInfC6rJ~ZRPoltExOlC*8Rj?o5-TLv?3}M@nnZ6l#ztcnYAer9rNbVCv6X)Dw=+u
zzM{O?xOQ3=g;k=rCgsHBy6L>#;PiD38~DV=V$%AQy05_aWPc?jYmop2p5eyg6B}=k
zhe&`D2*oEhc7v|pSa=_WwGgUlrhv9}aZ;fi$s*Pz!}};DA@4AT7fMOV(wYDT7K%@7
zya8`b@|bp7SfO}2VJ%1=0n9=Q#dU&RlhIM0BPtTf&9HftfJ
z!94!AKMTvU`+XK|yA(c-!ecAJZkdC4dDOiWLb07-x6DDjyy{*!p=6cVn8cyiWN#+XuAljliglh4Y#(`(|!>}sC(ff
zvp{G5S`rBWWsxMI5|=6JqEuPcJ@?@;i^>vcY2TqG%Dg&R9(6C2P=K~r4lUm5+!>P_
zE{!EA^Xg<-*S!!v3ZGN9ODG&^#Nl$4tRzf*6e7>M=jx+~^4T9+yoFDzFGioI2HL5i
zYY!U%{WJZ&WBXqX&%ZxodU)>SIqc8eqNwDyCv4_RJ+}YVuHQX&`ZcX{xUwioz8U|0
zb!2BKTd+w++PY`zqfpxLR}PLv`(zE|GI1S2)CP|q
zur4boJ^qiz?fJsMmLLJA{`~=aBL!p3At1sf*zkeO=XVb|8h%$z=
z0Z7~PYMuBfrfc~E8;e#RuJ?gNV_PVTk5{5?kyuD5tVmc)#bP?@VY5Pz#pTnrwjkBU
zICtq@$7h*Hh>K^hM}i^Ph%A4;EQuTCh;rTAq#tlA5Wrr3eZPcDJTBX(pPW>}l|TS{
z-HeWDojm;(0AOZzD$$zgo-Yfi4YQ1yi0Gr|4z>biGSZ49O&09ucK=4{m^i8(
zy)T+`V&lB7=oz8J;c6ai926Is9JhDA8r%ilO7W6qK%|d00000NkvXX
Hu0mjfJQ+uX
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)