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