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 zcmW+*Wn7bQ7akxCL59>2>CvsAbhFVRlA}{VKx)8fK_@XO0TE%8bWB2Ogn$x)fOJSn zNR5zg-u>SXPkeZO=f0m4*SW59$3D^5prW`>0RRA~v^1el0RSRd!h1Y98R5=%Ue7~# z5cxgTPz7KISvCLw<{T}kiZL>48)NIrqLJP6wUSCT05$ASLPcVqWCv;OX&}5C!hy>Cm&vxyFHk=Dcj9!&IhV z8;_i5fzSwkzLU2{$D}zg>X^q9pH16qq-ExW-Q8*3CHmu|Z~_8KDP81xV`8(@YZQgr zlp0?Rw$b0}kW!|i1dvo7-?T-h(2d_Sq<7oY4#oLPvACuk$o#wNP$Voz{fn)uJNP$M z6TBZ0p5}7ZKU96ax>j%SP1>|59)%gq61Dj#7^Yg|k!8M^APL2XOdsz`tMVi8nt#pmUQVNiy#wrxgRjgM zY{@^jedP$f`C0p!{6_sam`0#^>g?JMl-%BWwR8t`eSo&^dA6aG3})ReE^#0k5`Fuo zxac$KVeR&TPg>3YR}|HpMMhe}Z7Al$eaHZNJ43c3=a_0Ev+zgdwA>yQ?f)G3YFElM zO}=Bxu2g^oU;g<#Z#{c7)3^WB+jTo``2W611v#b9MjqFMWTejqsVrB@o@2bSymrD$ z4r({|PwNuHxN#T@yy(}d-Y>%?unET%RT;2i|7b`bWF^DgeHG(B^k`Z-{aa%X*FA&@3>R3F!h)=&9K*){{lpj|MQBIvV|0gpB0J{#x>=s zD1I;`fTsjEifJb@h1kic5L&YIHn3 zH4I^xWI$Fjuc_{ElK3iqEXR=dCM!np6mMQO#Xds80{4rLf3`LyjHaz=E5Lt3e=5`2 zahhwL&Z-R)9DGWe!)jo1PGZe|w$KYKhWOqR@_m^RX^VzwByHFf4rkgGS8G)^2PP;? z9^GF!byhBRHhVoA;k-kQCniaT&XQ+DBrKXaEGNYlnC6iLWNs^;-ItCdWW=7TWAnj9 z;iLh1V)J2l&*^CNn)eFcEw4A0AHBCh+YBLRebRQFtFss*ok#NWY~I4j_Wa+OM926E zV<*4PljdJE9wbWP-hn@LGfJrwUjwS@gTp3|_Nh4c^{V!$mEo^JzqkT^H<+r~@rfjA zx7DK1B{=FY3p+eaA%VSN5bEfxe;m_rDH zna83vI;E5QiG_TfnxA12-lwfApZL~mPJ zxLy>wPQI(|B4_ebd-bR5{M!0+q0i45>`+oeZ*`WX#dqcME9JgxV8Bfl>9L=#{3-r% zj{+sVuHejG*xzZhy`MwbyXVZu{)}6GF(V8-S9bz93`WF)cUVE1i{xhC^~QQm3+}&^ zCj#n-8kvDH*SwZTOi(mP3k-28iJ2voA)ekN_B`h*sG>nEchc!5Kfzv!Z|iZKIiZ@T zHnL)O_j)tqmlB6}9a=-X34 zP{i+tHi)a5kS7zf5uqV9VO)a`VsLzdV9`Hi?LVF{NO#8lB5LnC4`;DxCgxBq`pGlJ z{F4m0^%18Y%aZiM!iZZFFFJAJxU;1917B0k_zmn!>7gVhEP-75|1brHHS zgBr&Z9ozh>E3;^{&>!>3x+~kcN~6o|TesZcnWfE>3%gx&>D)61|C*ONX>cTM_NNPr z2V-COQi~bFRx+#LIgvw(KYKP~*yNR{#uH2Gm1(UGhj=2x2B9aMqAEN?m?P%FIlAF5 zkISiNXB?m`gvxhuHg(q41Z^}rzJp|9_d$lkhYl}X9~?RqrxU86y?RYN);ih#0u__* z(vWR^kIKEr>yv*CJ3zv{uhDL!0;Vy=((z8zzV>un{GgzE$Ewz*MtR75TG*<7;m53+ z)=2|+R4XC7F@I1a)79{yMPm_fWlv3@@RQl%FxzlC~HDIqss zZ;$@K6omB!p%c0e$$38(ZPH46jc2@S9ZD@omc5zTJj&G-y@dm3unTQOVceJ4UF-^u zP>lNPe?xv}?mIDQEGIp#(5Fn`f69RvwwJpmzzpI!a@|#fF$OI}#}mxJTKqA25?sck zkwRf(|2ly|W@*pLVCno$ez)G!Arl6#fmO67`OH~=oLGPsEWu7_tcm}*yw*jY$GPC9 z*Wktax&tzqWJbzyA##JGjMywS@y!CgN4^>|xgXe8`?=DFdTDbP2g=!c0yUoMD&25L zeFYjmdElQ{jMZZPptq3!{Cy^^jFR&}PRSQ|5m18e$p@6{OW?}TR|?U25>`+8$7o;i z1knM0b(I!DDx2=%fm)KA&??h-egUr59ya$(qtQtmnB`f$#Yl&Qpi<`6y7WS$iFvWG zY+8JaAkBymwTJ?qm+ghuz_f~KSUg{uQ4_?sLMixJIf{U!ZkO?p8Vf%`hJ!2`TzZrut+7W{tV z$8|6K_LY@!N59SrAUYHQ-#3_k?uuDmmERD+^%BilVhB+Nj1EkFl~|2>sFw`^N<$F; zq0Z%`QmtYv_&jf9N-~$5*n>x$Nw5bw(m|c1cD$FFz`EHw>eN zmx(gTu2c_yu7o256>r14*e97s9D&1QX#-Z68z$JN zi>x?)-ynNWm)E^~c_W%yORMs$Z&XE>Lj7PgO~Ml_PjpE*KKs=>3^Ppg<(0Q&730=F z=rj5Rd}HPddJpNH%kN)Gu{+rr-jy91Fk&egrFSb#t31lZX&6Ci2njJHW02#91zQh? z(VCQgSQ$nqkOK4XK+;!dmF95FpfB$jEr$m3g)$8~)6;7;l4a$Ttjo)KH#jPLiDcji zocbd(s6KRLNgf-m&=|MV*)1D0^A8fDKZ<|nvz;-NA`AhVo4@5xu_d(kc80dj80#^ZMge7Pi*(5Z0_ZyG4-x38T(1pw8G9d`)>FNTV z#(aifdU$jR8pi93A)9{)`X2pB_WtXR9vo|pr>*C|6wPo&#Io2aub;9~JJZQPDyLfg z@J-l|r7M5AB!SZMN}rt<3i9UGOW7)^IIi}G!t&qO&Cb5;LVfFqY+D?yZ0207lmmZdeIix_ z1?{O8e@AsozQpLQ;N5Zc956k-9zI?SP5OX^B_426A(wO1)cAp3CKupu?fH$Yw82lhR4yAy7hi)z>e_Orm;~ zCS|7=XdWx3Xs5l7j|K}$x{t$4rULC`li-el6JF43E?2o+bm_bv4WDn(9vA~S?r_K8 z6BXL}AU&$@S(7JKN#SPsq(o`R`U)^~hQXY+uZGuuQAE}xS;Bt!Oj;IXvjT;f9(4hk z=)*fHY#4~&YE{*|&Pvt7Lr)^1FaDgdTiz}>R_*!kU!$}%l_7j|l3qVz|Bwzjy{y*x z=iw8@_Zy@M_vqse5WX?GNl4oeL^H~gNp5LxIVn9G-X#?!acq^d>_I^KpMT?3Eqpsv zwz2JB5&q8h1ZaR+Zwc5qqGPpXiM@AWom!=mT7wQ#+G<)Q726k$VOb1AuW_kRRM z>QHy-5={%s&Ex*22DmK6gnj?eaEPg5c6 z&X<=rSDRdb0Fu&HSTr*EfVen%z#=3PGGJ^vF7}+ORYA-f>iCK25lGkNIyCb(Yt5;7 zqQ3s0xtyagZbtlMLm!4S5f~eM-9_}=Sw>9kk>D^CXP$6;eesO{}bqv}b zEd&ju;RMsNar+QHO7i1%6sDWlw_l$pUY3=sA6TL~sznBO-|m?^d*`-(BA(jd*9!PZ;G?P^#dqW$uvT?N??)-w!q2hds-EgM zMp}T$<2}=2*u7JSNAn+RNzS$j%-8Kq{`n+90z~t7{J*0ol$5JY5GXBW{I>Ra09*$& z0}6Wtq&UZ`sdkruNcF!K zPfE+*rKwU_n;1Pa`-3}ctWk3}^R8~Qg`YaTN-x#_9D^~bqZa$uND3$8Mt+Iob7*UrNaK2<&IaiL_x~*&!RPtce68(YCv=QU&5`!#_~hKYz6e?bKgSi$y~QWhkmSL*BQ(sA-v=JSa+11>&LRnSB?#f+n~Z^FOxZ+Ib2E zA$%4-*}Ikg*9{xrDx8q9#rLWpQq2zp4j@XFV?z87A@%j46k0MhLk$ z;&r)SfLd44|p|Lv4^t=IJe1e%a)}($iwCT3DrU)uau5G6@AQ zBKtXHMqZ3^`9ZuptF%F!@E$4yhf5WgGbjt5yX7z1hA$ZKD;0Nx>VuWi*C;&fm)1`~ zVr8fF(Xl@Zi%K{B`=KbP=#YN?J5g;iW~dcPTDE?#S*IFR_yJeOeNdaWH^gm%+nM?I z8%5V7NXKaTp<$iz*=FCe_TQ0~(oX+_rA~bly}-Ns9jw_~rJ?q|DJ!g&u5-q|a{AB9)*aVFo&^^@p0w$_)Wf`S2 z8P+F8v9GrW{;~jk%Jyok8t#~Scx;RQN_$u&=&&YuatHLGwAC$+kYo~tZULwQA*7e& zn)o=3pIGn@rL)Ms6~c;Ip$VvI(`?A+LmEtI7;52<63b(DWCbCC&(AH|*%_VZ7%+_q zonYjkCElD;kH=BhW^I)M79%38i@eSGv6Dq6!~*HTmZ7u!grV+H4kulUj#ubgr7)yu zJ+elKyP9l&5X8#kVMzb*vFZI0toGVm0*X$S&E}KY_E%V6by>J--7<*&43=zpO;GQFp2vz&82)pkX>@^$YQxv4EBSi; z$lgAG>lI_EH)d%D4LfhDYWqdrL%P9Wn{{OGM>+Y)R|H*MMIN7YOR-$U@+{69zH%z5 z^;=QY)^VC&&BOjrG4?foW!;vLieWFNuV8Y+a6$QpYEq4axFDSClrVp$m zzO`i^otHK?lpC3`t~8YxQ=s+hH`RpFVGJ$*Vt-VXpPN7@KwhhH3~&9eP4{BqHF?eR1y83N5t zXEGD-o}!iGSWp@K9!PMPad9QKo!4;caz^@qcug@?Ig+8JWLei<4d17nhe}{1hQFa? zH06R3YlOUo<#E?iezM;_-Nu$aw~1m~O)|UvnO_|1()Z6Hon`B6eWbHzV4MJ$eO7%g z59;8`jZM?x9Fg_yo)a_Ff|;5sPQ#dwZQw8Z$0V-6=QDz2Mkd+e_~<|7Vp$Dg_n#8T z2(d-{_|>#z*KO zYD^4js3(iaS;V0GtO`;(EfCxQAETxgn0{9j`dh$zYj8lBy1v8oVQN^bhr`(>oFG16ta6#H3y4(kQD zW}Y7rh8W1L6XwYE8!PmOA*hyM1#=Tr?N}*gx)LKEgZZJ7@O|e;`rm)YXbJVNwce^O zA+}{NB1vl2PDVrmu+e58q8k2cuHIV+vf4dM`sA4asUAJUplD??iN5gO0%?l* zR+zZN)zCxwI+q6eJH}om)>-ppnVgKze+6*V|BY#>l;y~rn!dMUUQNP55Frcj4_z^Y zs!F1&d!iEkU>|+wWj2gVGK@YsJ?&$``<*tDQ6e6R%KK<3vA{YYJV-p5F7{*ZuFJ;? zO8Ox9%BAkg>_~p{uFrgaEe~0du(a~cJ=-Ftw-<48g)MB{0erBr8uxyiQwD3S_5*p+Q3|VfS1H!zRwchR)gl zZLZpqIkDEfw|%OF*}3%d$&n&ZmU{i;KQIKe>g(A$oyWw> z(y&BCo0LwW96`_GIOfKijlH@Tl|v3C6#Q!hd|!tC)^q7+xw~|_L*agD^PAuxSC%TP zXL=I&1mZuu2-DM0TD+h$07*DYT5`&8Qc5^S=qR4Sd zYtWNqwsV<&my9xRQCX#VYQn6;&p|3qV9Jf3gHdLwGF=Hz&eriJWiMxqxMB)()}WD= zt?}INI;i*j&i({<=Id8|WJy!b7`LE2i8~6KxX=XNic)EsqAa8{xT)sbpzvVZ0e=GP znZkUCr&u@NF~wEgEivCO-nlv}&>-I3} zrhkI-QzWx!6wj*Id1p*_9rsLhJh=C8n4%c+bQXe$W@4 zF2(Iz(fH3TbMs`Eri~1`n->3SA=;w`OYG&-HSYU>W!zUOwULKifzNWwal%jIs9CNjzniCSqJc~K@m zPN!!s%@|Rgm?fM9*y*eoCs9=pI1FlVSxb3d>yh44=P}fp#64^3Y>(Ce$R0e>3P^q} z47ST|S5U~!S(Dc_mvF;3Kjr#j8v!7eQp!zgRurhyy+Ve6`YM4E8_ z7c$-VG;NCV5ZynU$LK2*3W@we!-AGYrpI>QH zdxJeVuoR0Z5lPU0Pi4ViU3%f4bkg1zhoQcQCC819O%hsNoQ;@c`vaAUk0p=~>(XhC z<(d~d&0RLKntc1#j4sx{SQ>)^B@2K 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)