monster 03 ai初版

master
chendian 1 year ago
parent b63fa26966
commit c4a721dfa0

@ -1,10 +0,0 @@
<component name="libraryTable">
<library name="GdSdk Master" type="GdScript">
<properties path="C:\Users\Administrator\AppData\Local\JetBrains\Rider2023.3\projects\.idea.touhougd.dir.ab68368\sdk\GdSdk Master" version="Master" date="2024-06-01T15:14:16.000+02:00" />
<CLASSES />
<JAVADOC />
<SOURCES>
<root url="file://$USER_HOME$/AppData/Local/JetBrains/Rider2023.3/projects/.idea.touhougd.dir.ab68368/sdk/GdSdk Master" />
</SOURCES>
</library>
</component>

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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"

@ -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"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

@ -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"
}]
}

@ -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]
}

@ -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")
}

@ -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")

@ -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")

@ -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")

@ -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

@ -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")

@ -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)

@ -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)

@ -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)

@ -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)

@ -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

@ -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"

@ -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}

@ -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

@ -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

@ -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:

@ -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

@ -0,0 +1,3 @@
@icon("res://addons/beehave/icons/category_leaf.svg")
class_name ActionRoleCheck
extends Action

@ -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

@ -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

@ -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

@ -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

@ -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):

@ -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

@ -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:

@ -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:

@ -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

@ -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):

@ -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()

@ -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 #受击-地面-轻

@ -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
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

@ -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

@ -87,3 +87,4 @@ func get_enemy_list(id: int) -> Array[Character]:
if character.team() != target.team():
ret.append(character)
return ret

@ -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)

@ -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):

@ -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

@ -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):

@ -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

@ -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)

@ -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()

@ -1,6 +1,6 @@
extends Control
@onready var animation = $AnimationPlayer as AnimationPlayer
@onready var animation: AnimationPlayer = $AnimationPlayer as AnimationPlayer
var color_material: ShaderMaterial

@ -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

@ -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):

@ -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<value)

@ -1,10 +1,10 @@
extends Control
@onready var weapon_scene = preload("res://scene/ui/item/weapon_item.tscn")
@onready var weapon_scene: PackedScene = preload("res://scene/ui/item/weapon_item.tscn")
var item_layout_offset_x: int = 32
var item_layout_offset_y: int = 16
var weapon_item_list = []
var item_layout_offset_x: int = 32
var item_layout_offset_y: int = 16
var weapon_item_list: Array[Variant] = []
var weapon_list: Array
var weapon_index: int
var weapon_index_dir: int
@ -12,7 +12,7 @@ var weapon_index_rate: float
var hide_duration: float
func _process(delta):
func _process(delta) -> 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)

Loading…
Cancel
Save